@willbooster/wb 13.4.2 → 13.4.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 +3 -3
  2. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import s,{execFileSync as o,spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import d from"chalk";import{globby as l}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f from"kill-port";import{PromisePool as h}from"minimal-promise-pool";import m from"node:fs/promises";import g,{constants as b}from"node:os";import{createServer as v}from"node:net";const w=new Map;function y(e){const n=w.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{}}).parsed??{};return w.set(e,r),r}function k(e){return e instanceof Error&&"code"in e}function E(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{$("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(P(e))return;throw e}}(e);const n=function(e){const{stdout:t}=$("ps",["-Ao","pid=,ppid="],{maxBuffer:1048576,timeout:2e3}),n=function(e){const t=new Map;for(const n of e.split("\n")){const e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;const r=Number(e[1]),s=Number(e[2]),o=t.get(s);o?o.push(r):t.set(s,[r])}return t}(t);return function(e,t){const n=[],r=[...t.get(e)??[]];let s=0;for(;s<r.length;){const e=r[s];s+=1,n.push(e),r.push(...t.get(e)??[])}return n}(e,n)}(e),r=function(e,t){const n=t.toReversed();return n.push(e),n}(e,n);for(const e of r)A(e,t)}function A(e,t){try{process.kill(e,t)}catch(e){if(P(e))return;throw e}}function $(e,t,n){try{return{stdout:o(e,[...t],{encoding:"utf8",maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:["ignore","pipe","pipe"]}),stderr:""}}catch(n){const r=function(e){if("object"!=typeof e||null===e||!("stderr"in e))return"";const t=e.stderr;if("string"==typeof t)return t;if(Buffer.isBuffer(t))return t.toString("utf8");return""}(n);throw new S(e,t,r,function(e){if(k(e))return e.code;if("object"==typeof e&&null!==e&&"status"in e){const t=e.status;if("number"==typeof t)return t}return}(n))}}function P(e){return!(!k(e)||"ESRCH"!==e.code)||e instanceof S&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class S extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function R(e,t,n){return new Promise((r,s)=>{try{const o=i(e,t??[],n??{});o.stdout?.setEncoding?.("utf8"),o.stderr?.setEncoding?.("utf8");let a="",c="";o.stdout?.on("data",e=>{a+=e,n?.printingStdout&&process.stdout.write(e)}),o.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&process.stderr.write(e)});let d=!1;const l=()=>{if(!d&&o.pid){d=!0,n?.verbose&&console.info(`treeKill(${o.pid})`);try{E(o.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${o.pid})`,e)}}},u="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],p=new Map,f=()=>{process.removeListener("beforeExit",l);for(const[e,t]of p)process.removeListener(e,t);p.clear()};if(n?.killOnExit){process.on("beforeExit",l);for(const e of u){const t=()=>{l(),f(),0===process.listenerCount(e)&&process.kill(process.pid,e)};p.set(e,t),process.on(e,t)}}o.on("error",e=>{f(),o.removeAllListeners("close"),s(e)}),o.on("close",(e,t)=>{f(),void 0===o.pid?s(new Error("Process has no pid.")):r({pid:o.pid,stdout:a,stderr:c,status:e,signal:t})}),n?.input&&(o.stdin?.write(n.input),o.stdin?.end())}catch(e){s(e)}})}function x(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function j(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function N(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
1
+ import e from"node:fs";import t from"node:path";import n from"yargs";import{hideBin as r}from"yargs/helpers";import o,{execFileSync as s,spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import l from"chalk";import{globby as d}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f,{constants as h}from"node:os";import{PromisePool as m}from"minimal-promise-pool";import g from"kill-port";import b from"node:fs/promises";import{createServer as v}from"node:net";const y={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"}};const w=new Map;function k(e){const n=w.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{}}).parsed??{};return w.set(e,r),r}function E(e){return e instanceof Error&&"code"in e}function A(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{$("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(P(e))return;throw e}}(e);const n=function(e){const{stdout:t}=$("ps",["-Ao","pid=,ppid="],{maxBuffer:1048576,timeout:2e3}),n=function(e){const t=new Map;for(const n of e.split("\n")){const e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;const r=Number(e[1]),o=Number(e[2]),s=t.get(o);s?s.push(r):t.set(o,[r])}return t}(t);return function(e,t){const n=[],r=[...t.get(e)??[]];let o=0;for(;o<r.length;){const e=r[o];o+=1,n.push(e),r.push(...t.get(e)??[])}return n}(e,n)}(e),r=function(e,t){const n=t.toReversed();return n.push(e),n}(e,n);for(const e of r)S(e,t)}function S(e,t){try{process.kill(e,t)}catch(e){if(P(e))return;throw e}}function $(e,t,n){try{return{stdout:s(e,[...t],{encoding:"utf8",maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:["ignore","pipe","pipe"]}),stderr:""}}catch(n){const r=function(e){if("object"!=typeof e||null===e||!("stderr"in e))return"";const t=e.stderr;if("string"==typeof t)return t;if(Buffer.isBuffer(t))return t.toString("utf8");return""}(n);throw new R(e,t,r,function(e){if(E(e))return e.code;if("object"==typeof e&&null!==e&&"status"in e){const t=e.status;if("number"==typeof t)return t}return}(n))}}function P(e){return!(!E(e)||"ESRCH"!==e.code)||e instanceof R&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class R extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function x(e,t,n){return new Promise((r,o)=>{try{const s=i(e,t??[],n??{});s.stdout?.setEncoding?.("utf8"),s.stderr?.setEncoding?.("utf8");let a="",c="";s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&process.stdout.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&process.stderr.write(e)});let l=!1;const d=()=>{if(!l&&s.pid){l=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{A(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},u="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],p=new Map,f=()=>{process.removeListener("beforeExit",d);for(const[e,t]of p)process.removeListener(e,t);p.clear()};if(n?.killOnExit){process.on("beforeExit",d);for(const e of u){const t=()=>{d(),f(),0===process.listenerCount(e)&&process.kill(process.pid,e)};p.set(e,t),process.on(e,t)}}s.on("error",e=>{f(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{f(),void 0===s.pid?o(new Error("Process has no pid.")):r({pid:s.pid,stdout:a,stderr:c,status:e,signal:t})}),n?.input&&(s.stdin?.write(n.input),s.stdin?.end())}catch(e){o(e)}})}function N(e){if(Object(e)!==e)throw TypeError("right-hand side of 'in' should be an object, got "+(null!==e?typeof e:"null"));return e}function j(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}function D(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}
2
2
  /**
3
3
  * [js-sha3]{@link https://github.com/emn178/js-sha3}
4
4
  *
@@ -6,5 +6,5 @@ import e from"node:fs";import t from"node:path";import n from"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 D=[..."0123456789abcdef"],T=[6,1536,393216,100663296],_=[0,8,16,24],I=[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 O=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class C{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<<_[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<_[3&i++],t[i>>2]|=(128|63&a)<<_[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<_[3&i++],t[i>>2]|=(128|a>>6&63)<<_[3&i++],t[i>>2]|=(128|63&a)<<_[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<_[3&i++],t[i>>2]|=(128|a>>12&63)<<_[3&i++],t[i>>2]|=(128|a>>6&63)<<_[3&i++],t[i>>2]|=(128|63&a)<<_[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[s],i=0;i<s;++i)o[i]^=t[i];B(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];B(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+=D[s>>4&15]+D[15&s]+D[s>>12&15]+D[s>>8&15]+D[s>>20&15]+D[s>>16&15]+D[s>>28&15]+D[s>>24&15];i%e===0&&(t=O(t),B(t),o=0)}return r&&(s=t[o],a+=D[s>>4&15]+D[15&s],r>1&&(a+=D[s>>12&15]+D[s>>8&15]),r>2&&(a+=D[s>>20&15]+D[s>>16&15])),a}}const B=function(e){let t,n,r,s,o,i,a,c,d,l,u,p,f,h,m,g,b,v,w,y,k,E,A,$,P,S,R,x,j,N,D,T,_,O,C,B,L,F,J,W,U,z,M,Y,V,K,q,G,H,Q,X,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],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=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|f>>>31),n=d^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(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,h=e[0],m=e[1],K=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,x=e[20]<<3|e[21]>>>29,j=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,z=e[40]<<18|e[41]>>>14,M=e[41]<<18|e[40]>>>14,O=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,G=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,N=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,B=e[14]<<6|e[15]>>>26,L=e[15]<<6|e[14]>>>26,v=e[25]<<11|e[24]>>>21,w=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,T=e[45]<<29|e[44]>>>3,_=e[44]<<29|e[45]>>>3,$=e[6]<<28|e[7]>>>4,P=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,se=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,y=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,S=e[18]<<20|e[19]>>>12,R=e[19]<<20|e[18]>>>12,oe=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,W=e[38]<<8|e[39]>>>24,U=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,A=e[49]<<14|e[48]>>>18,e[0]=h^~g&v,e[1]=m^~b&w,e[10]=$^~S&x,e[11]=P^~R&j,e[20]=O^~B&F,e[21]=C^~L&J,e[30]=Y^~K&G,e[31]=V^~q&H,e[40]=te^~re&oe,e[41]=ne^~se&ie,e[2]=g^~v&y,e[3]=b^~w&k,e[12]=S^~x&N,e[13]=R^~j&D,e[22]=B^~F&W,e[23]=L^~J&U,e[32]=K^~G&Q,e[33]=q^~H&X,e[42]=re^~oe&ae,e[43]=se^~ie&ce,e[4]=v^~y&E,e[5]=w^~k&A,e[14]=x^~N&T,e[15]=j^~D&_,e[24]=F^~W&z,e[25]=J^~U&M,e[34]=G^~Q&Z,e[35]=H^~X&ee,e[44]=oe^~ae&de,e[45]=ie^~ce&le,e[6]=y^~E&h,e[7]=k^~A&m,e[16]=N^~T&$,e[17]=D^~_&P,e[26]=W^~z&O,e[27]=U^~M&C,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=E^~h&g,e[9]=A^~m&b,e[18]=T^~$&S,e[19]=_^~P&R,e[28]=z^~O&B,e[29]=M^~C&L,e[38]=Z^~Y&K,e[39]=ee^~V&q,e[48]=de^~te&re,e[49]=le^~ne&se,e[0]^=I[r],e[1]^=I[r+1]},L=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(J.decode(e))],create:([e])=>F.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]))}(),F=new TextEncoder,J=new TextDecoder("utf-8");function W(e=void 0,t=L){return JSON.stringify(M(e,t))}function U(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 z=[];function M(e,t=L){const n=U(e);if(null!==n)return n;const r=[],s=new Map;return function e(n){const o=U(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(z.length<e){const t=z.length;z.length=e,z.fill(-2,t,e)}return z.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 Y(e,t){return function(e){return new C(512,T,512).update(e).hex()}(W([e,t]))}const V=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=Y}={}){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:Y});function K(e){return!!e&&"0"!==e&&"false"!==e}let q;class G{static{[q]=function(e,t,n,r,s){var o,i,a,c,d,l,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function b(t,n,r){return function(s,o){n&&(o=s,s=e);for(var i=0;i<t.length;i++)o=t[i].apply(s,r?[o]:[]);return r?o:s}}function v(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function w(e,t,n,r,s,a,c,d,l,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),w=t[3],y=!c,k=1===s,E=3===s,A=4===s,$=2===s;function P(t,n,r){return function(s,o){return n&&(o=s,s=e),r&&r(s),S[t].call(s,o)}}if(!y){var S={},R=[],x=E?"get":A||k?"set":"value";if(l?(u||k?S={get:j(function(){return w(this)},r,"get"),set:function(e){t[4](this,e)}}:S[x]=w,u||j(S[x],r,$?"":x)):u||(S=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=m[+d][r])&&7!==(i^s))throw Error("Decorating two elements with the same name ("+S[x].name+") is not supported yet");m[+d][r]=s<3?1:s}}for(var N=e,D=g.length-1;D>=0;D-=n?2:1){var T=v(g[D],"A decorator","be",!0),_=n?g[D-1]:void 0,I={},O={kind:["field","accessor","method","getter","setter","class"][s],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");v(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(y)i=T.call(_,N,O),I.v=1,v(i,"class decorators","return")&&(N=i);else if(O.static=d,O.private=l,i=O.access={has:l?p.bind():function(e){return r in e}},A||(i.get=l?$?function(e){return h(e),S.value}:P("get",0,h):function(e){return e[r]}),$||E||(i.set=l?P("set",0,h):function(e,t){e[r]=t}),N=T.call(_,k?{get:S.get,set:S.set}:S[x],O),I.v=1,k){if("object"==typeof N&&N)(i=v(N.get,"accessor.get"))&&(S.get=i),(i=v(N.set,"accessor.set"))&&(S.set=i),(i=v(N.init,"accessor.init"))&&R.unshift(i);else if(void 0!==N)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else v(N,(u?"field":"method")+" decorators","return")&&(u?R.unshift(N):S[x]=N)}return s<2&&c.push(b(R,d,1),b(a,d,0)),u||y||(l?k?c.splice(-1,0,P("get",d),P("set",d)):c.push($?S[x]:v.call.bind(S[x])):f(e,r,S)),N}function y(e){return f(e,p,{configurable:!0,enumerable:!0,value:o})}return o=h(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],f=!!i[3],h=16&l;w(t?e:e.prototype,i,h,f?"#"+p:N(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return x(t)===e}:s)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||y(e),{e:i,get c(){var n=[];return g&&[y(e=w(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[V,3,"isBunAvailable"],[V,3,"buildCommand"],[V,3,"rootDirPath"],[V,3,"dockerfile"],[V,3,"hasDockerfile"],[V,3,"hasSourceCode"],[V,3,"name"],[V,3,"dockerImageName"],[V,3,"env"],[V,3,"packageJson"],[V,3,"packageJsonPath"],[V,3,"hasPrisma"],[V,3,"hasVitest"],[V,3,"hasBiome"],[V,3,"hasEslint"],[V,3,"preferredLinter"],[V,3,"hasPlaywrightConfig"],[V,3,"skipLaunchingServerForPlaywright"],[V,3,"dockerPackageJson"],[V,3,"binExists"],[V,3,"rootPackageJson"]]).e}argv=void q(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){const s=[];for(const[n,o]of Object.entries(y(t.join(r,e))))n in a||n in process.env||(a[n]=o,s.push(n));i.push([e,s]),n.verbose&&s.length>0&&console.info(`Read ${s.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(y(t.join(r,n.checkEnv))).filter(e=>!(e in a)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}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 hasBiome(){return this.hasDependency("@biomejs/biome")||this.hasDependency("biome")}get hasEslint(){return this.hasDependency("eslint")}get preferredLinter(){return this.hasBiome?"biome":this.hasEslint?"eslint":void 0}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(K(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const s=t.join(r,"node_modules",".bin");if(e.existsSync(s)&&(this.env.PATH=`${s}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const o=t.dirname(r);if(r===o)break;r=o}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){const t=t=>!(!t||!(t.dependencies?.[e]||t.devDependencies?.[e]||t.optionalDependencies?.[e]||t.peerDependencies?.[e]));return t(this.packageJson)||t(this.rootPackageJson)}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function H(n,r=!0,s){if(s??=process.cwd(),e.existsSync(t.join(s,"package.json")))return new G(s,n,r)}async function Q(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 G(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 G(o,n,r))}return{root:i,self:o}}(n,r,s);if(o)return{...o,descendants:o.root===o.self?await X(n,o.root,r):[o.self]}}async function X(n,r,s){const o=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return o;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&o.push(new G(r,n,s));return o}const Z=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),ee=Z?"bun --bun run":"node",te=Z?"bun":"yarn",ne=Z?"bun --bun run":"yarn",re={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=H(n,!0,r);if(!o)return console.error(d.red("No project found.")),!0;if(n={...n,command:n.command??(Z?"bun run build":"yarn build")},!e.existsSync(t.join(o.rootDirPath,".git")))return se(o,n),!0;const[i,a,l]=await async function(n,r){const o=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(o,"last-build");await e.promises.mkdir(o,{recursive:!0});const a=c("sha256"),d=s.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!oe.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const o=s.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(ie.some(t=>e.includes(t))||ae.some(t=>e.endsWith(t)))&&!ce.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${o.join(", ")}`);const i=s.spawn("git",["diff","--",...o],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(o,n);if(i)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!se(o,n))return;n.dryRun||await e.promises.writeFile(a,l,"utf8");return!0}(n)}};function se(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=s.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const oe=new Set(["CI","PWDEBUG","TMPDIR"]);const ie=["src/","public/"],ae=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],ce=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const de={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=H(e);t||(console.error(d.red("No project found.")),process.exit(1));if(K(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(d.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await f(r)}catch{}}(e)}};const le=new h,ue={exitIfFailed:!0};async function pe(e,t,n,r=ue){const s=he(e,t);if(me(s.printable,t),n.verbose&&me(s.runnable,t,"Start (raw)",!0),n.dryRun)return ge(s.printable,0,r),0;const o=await R(s.runnable,void 0,{cwd:t.dirPath,env:be(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(o.signal),ge(s.printable,o.status,r),o.status??1}function fe(e,t,n,r=ue){return le.runAndWaitForReturnValue(async()=>{const s=he(e,t);if(me(s.printable,t,"Start (parallel)",!0),n.dryRun)return me(s.printable,t,"Started (log)"),n.verbose&&me(s.runnable,t,"Started (raw)",!0),ge(s.printable,0,r),0;const o=await R(s.runnable,void 0,{cwd:t.dirPath,env:be(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(o.signal),me(s.printable,t,"Started (log)"),n.verbose&&me(s.runnable,t,"Started (raw)",!0);const i=o.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),ge(s.printable,o.status,r),o.status??1})}function he(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",Z?"bun --bun run ":"yarn run ");Z&&(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=ve(n.replaceAll("YARN ",`${ne} `)),s=ve(n.replaceAll("YARN playwright ",`${ne} playwright `).replaceAll("YARN ",!Z&&t.binExists?"":`${ne} `)),o=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${ne} dotenv${o} -- ${r}`,runnable:s}}function me(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function ge(e,t,n){0===t?console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function be(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function ve(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const we=new Set(["astro","cjs","css","cts","gql","htm","html","js","json","json5","jsonc","jsx","mjs","mts","svelte","ts","tsx","vue","yaml","yml"]),ye=new Set(["cjs","cts","js","jsx","mjs","mts","ts","tsx"]),ke=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Ee=new Set([...ke].filter(e=>!we.has(e))),Ae={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(e){"win32"===process.platform&&(console.error(d.red("This command is not supported on Windows.")),process.exit(1));const n=await Q(e,!1);n||(console.error(d.red("No project found.")),process.exit(1));const r=e.files??[],s=new Map,o=[],i=[];let a,c,l=!1;if(r.length>0){for(const e of r){const r=t.resolve(String(e));if(r.endsWith("/test/fixtures")||r.includes("/test/fixtures/")||r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const a=t.extname(r).slice(1);if(r.endsWith("/package.json")){i.push(r);continue}const c=Pe(n.descendants,r);if(c)if(Re(c,a)){const e=s.get(c)??[];e.push(r),s.set(c,e),xe(c)&&o.push(r)}else ke.has(a)?o.push(r):Se(a)&&!c.preferredLinter&&(console.error(d.red(`No linter found for ${c.name}. Install ESLint or Biome.`)),l=!0)}a=o,c=i}else a=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Ee].join(",")}}`,"!**/test{-,/}fixtures/**"]);for(const s of n){if(!xe(s))continue;const n=t.join(s.dirPath,"**/{.*/,}*.{"+[...ke].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),c=n.descendants.map(e=>e.packageJsonPath);const u=[],p={exitIfFailed:!1,forceColor:!0};if(r.length>0)for(const[t,n]of s){const r=$e(t,e,n);r&&u.push(fe(r,t,e,p))}else for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=$e(t,e);n&&u.push(fe(n,t,e,p))}const f=await Promise.all(u);(l||f.some(e=>0!==e))&&process.exit(1),e.format&&(a.length>0&&await fe(je(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...a]),n.self,e,{forceColor:!0}),c.length>0&&await fe(je(["YARN","sort-package-json","--",...c]),n.self,e,{forceColor:!0}))}};function $e(e,t,n){if("biome"===e.preferredLinter){let e;return e=t.fix&&t.format?["check","--fix"]:t.fix?["lint","--fix"]:t.format?["format","--fix"]:["lint"],je(["BUN","biome",...e,"--colors=force","--no-errors-on-unmatched","--files-ignore-unknown=true",...n?.length?["--"]:[],...n??[]])}if("eslint"===e.preferredLinter)return je(["YARN","eslint","--color",...t.fix||t.format?["--fix"]:[],"--",...n??["."]])}function Pe(e,t){let n;for(const r of e)t!==r.dirPath&&!t.startsWith(`${r.dirPath}/`)||n&&!(r.dirPath.length>n.dirPath.length)||(n=r);return n}function Se(e){return we.has(e)||ye.has(e)}function Re(e,t){return"biome"===e.preferredLinter?we.has(t):"eslint"===e.preferredLinter&&ye.has(t)}function xe(e){return"eslint"===e.preferredLinter}function je(e){return e.map(e=>function(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}(e)).join(" ")}function*Ne(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const De={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 Q(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const s of Ne("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(Te(n,r),_e(r),Ie(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(te,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function Te(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],s=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],s.push(e));console.info("Removed devDependencies:",s.join(", ")||"none")}function _e(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},s=[];for(const[e,o]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete r[e],s.push(e));console.info("Removed scripts:",s.join(", ")||"none")}function Ie(e){delete e.private,delete e.publishConfig,delete e.prettier}const Oe="file:",Ce=[{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"}];function Be(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function Le(n){return Ce.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const Fe=new class{cleanUpLitestream(e){const t=Be(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${Oe}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=Be(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${Be(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],s=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(Oe))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const s=Le(e),o=t.isAbsolute(r)?r:t.resolve(e.dirPath,s??".",r);return`rm -f "${o}" "${o}-wal" "${o}-shm"`}(e);s&&r.push(s);const o=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(o),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${Be(e)}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let s="";if(n)try{new URL(n),s=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);s=`DATABASE_URL=${Oe}${e} `}else if(e.env.DATABASE_URL?.startsWith(Oe)){const n=Le(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));s=`DATABASE_URL=${Oe}${r} `}}return`${s}PRISMA studio ${r}`}},Je={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"]}},We={},Ue={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(ze).command(Me).command(Ye).command(Ve).command(Ke).command(qe).command(Ge).command(He).command(Qe).command(Xe).command(Ze).command(et).demandCommand().strict(!1),handler(){}},ze={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:We,async handler(e){const t=await nt(e);for(const n of Ne("prisma cleanup-litestream",t))await pe(Fe.cleanUpLitestream(n),n,e)}},Me={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:We,async handler(e){const t=await nt(e);for(const e of Ne("prisma create-litestream-config",t))tt(e)}},Ye={command:"deploy",describe:"Apply migration to DB without initializing it",builder:We,async handler(e){const t=await nt(e),n=rt(e);for(const r of Ne("prisma deploy",t))await pe(Fe.deploy(r,n),r,e)}},Ve={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:We,async handler(e){const t=await nt(e);for(const n of Ne("prisma deploy-force",t))await pe(Fe.deployForce(n),n,e)}},Ke={command:"list-backups",describe:"List Litestream backups",builder:We,async handler(e){const t=await nt(e);for(const n of Ne("prisma list-backups",t))await pe(Fe.listBackups(n),n,e)}},qe={command:"migrate",describe:"Apply migration to DB with initializing it",builder:We,async handler(e){const t=await nt(e),n=rt(e);for(const r of Ne("prisma migrate",t))await pe(Fe.migrate(r,n),r,e)}},Ge={command:"migrate-dev",describe:"Create a migration file",builder:We,async handler(e){const t=await nt(e),n=rt(e);for(const r of Ne("prisma migrate-dev",t))await pe(Fe.migrateDev(r,n),r,e)}},He={command:"reset",describe:"Reset DB",builder:We,async handler(e){const t=await nt(e),n=rt(e);for(const r of Ne("prisma reset",t))await pe(Fe.reset(r,n),r,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const t of Ne("WB_ENV=test prisma reset",await nt(e)))await pe(Fe.reset(t,n),t,e)}}},Qe={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...We,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await nt(e);for(const n of Ne("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await pe(Fe.restore(n,t),n,e)}}},Xe={command:"seed",describe:"Populate DB with seed data",builder:{...We,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await nt(e);for(const n of Ne("prisma seed",t))await pe(Fe.seed(n,e.file),n,e)}},Ze={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...We,"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 nt(e),n=rt(e,["db-url-or-path","restored"]);for(const r of Ne("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await pe(Fe.studio(r,t,n),r,e)}}},et={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await nt(e),n=[(e.args?.join(" ")??"").trimEnd(),rt(e,["args"])].filter(Boolean).join(" ");for(const r of Ne(`prisma ${n}`,t))await pe(`PRISMA ${n}`,r,e)}};function tt(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},s=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(s.length>0)throw new Error(`Missing environment variables for Litestream: ${s.join(", ")}`);const o="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${o}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`)}}async function nt(e){const t=await Q(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.filter(e=>e.packageJson.dependencies?.prisma??e.packageJson.devDependencies?.prisma);return 0===n.length&&(console.error(d.red("No prisma project found.")),process.exit(1)),n}function rt(e,t=[]){const n=[],r=Object.keys(Je),s=Object.values(Je).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 st={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=H(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let s=0;s<e.retry;s++)if(s>0&&console.info(`\n${d.yellow(`#${s} Retrying: ${n.join(" ")}`)}`),r=await pe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},ot={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await Q(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of Ne("setup",n.descendants)){const r=await m.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===g.platform()){const n=["pstree"];await fe(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await pe("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await fe("poetry config virtualenvs.in-project true",t,e);const[,n]=s.execSync("asdf current python").toString().trim().split(/\s+/);await fe(`poetry env use ${n}`,t,e),await le.promiseAll(),await pe("poetry run pip install --upgrade pip",t,e),await pe("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await pe(`${ne} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await pe(`${ne} playwright install --with-deps`,r,e)}(e)}};function it(e){return e.silent?" > /dev/null":""}const at=new Set;async function ct(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await ut(t,e))return!1}return!0}(e);n||await dt(e,t);const r=async()=>{at.has(e)||(at.add(e),await dt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function dt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await R("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await R("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await f(e)}catch{}}async function lt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await ct(n,t),n}async function ut(e,t){return new Promise(n=>{const r=v();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const pt=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(at.has(e))return;at.add(e),me(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ge(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class ft{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return pt.buildImage(e,t)}async startDev(e,t){return await lt(e.env.PORT,e),this.shouldWaitAndOpenApp?`YARN concurrently --raw --kill-others-on-fail\n "${this.startDevProtected(e,t)}"\n "${this.waitAndOpenApp(e)}"`:this.startDevProtected(e,t)}async startProduction(e,t){return await lt(e.env.PORT,e),this.shouldWaitAndOpenApp?`YARN concurrently --raw --kill-others-on-fail\n "${this.startProductionProtected(e,t)}"\n "${this.waitAndOpenApp(e)}"`:this.startProductionProtected(e,t)}async startTest(e,t){return await lt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await lt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && YARN concurrently --raw --kill-others-on-fail\n "${pt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}"\n "${this.waitAndOpenApp(e)}"`:`${this.buildDocker(e,"development")}\n && ${pt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?Fe.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${it(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,pt.stopAndStart(e),n)}async testStart(e,t){return await lt(e.env.PORT,e),`NODE_ENV="" YARN concurrently --kill-others --raw --success first "${this.startDevProtected(e,t)}" "${this.waitApp(e)}"`}async testE2EProtected(e,t,n,{playwrightArgs:r="test test/e2e/"}){const s=await lt(e.env.PORT,e),o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=function(e,t,n){const r="BUN playwright",s=t?.join(" ")||"test/e2e/";if(!e.startsWith("test ")||!t?.length)return ht(`${r} ${e}`,n);const o=e.slice(5).trim(),i=o.length>0?o.split(/\s+/):[];!i[0]||i[0].startsWith("-")?i.unshift(s):i[0]=s;return ht(`${r} test ${i.join(" ")}`,n)}(r,t.targets,t.bail);return e.skipLaunchingServerForPlaywright?`${i}${o}`:`YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${i}${o}"`}testUnit(e,t){const n=t.targets?.join(" ")||"test/unit/";if(e.hasVitest){return`YARN vitest run ${n} --color --passWithNoTests --allowOnly --watch=false${t.bail?" --bail=1":""}`}if(e.isBunAvailable){return`bun test ${n}${t.bail?" --bail":""}`}return'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function ht(e,t){return t&&e.includes("playwright test")?/--max-failures(?:=|\s)/.test(e)?e:`${e} --max-failures=1`:e}const mt=new class extends ft{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const gt=new class extends ft{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);const s=await lt(e.env.PORT,e),o=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"";return`YARN concurrently --kill-others --raw --success first\n "${n} && exit 1"\n "wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && vitest run ${t.targets&&t.targets.length>0?t.targets.join(" "):"test/e2e/"} --color --passWithNoTests --allowOnly${t.bail?" --bail=1":""}${o}"`}};const bt=new class extends ft{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const vt=new class extends ft{constructor(){super(!1)}startDevProtected(e,t){throw new Error("This method should not be called.")}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${ee} dist/index.js ${t.normalizedArgsText??""} | tee server.log`)}startTest(){return Promise.resolve("echo 'do nothing.'")}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,"development")} && ${pt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const wt=new class extends ft{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const yt=new class extends ft{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??""}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??""}`.trim()}},kt=["express","fastify","elysia","hono"],Et={command:"start [args..]",describe:"Start app",builder:{watch:{description:"Whether to watch files",type:"boolean"},args:{description:"Arguments for core command",type:"array",alias:"a",default:[]},"docker-options":{description:'Arguments for "docker run"',type:"array",default:[]},mode:{description:"Start mode: dev[elopment] (default) | staging | docker | docker-debug | test",type:"string",alias:"m"}},async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[]].map(e=>`'${e}'`).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>`'${e}'`).join(" ")}(e);const t=await Q(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let s;if(t.blitz)s=mt;else if(t.next)s=bt;else if(r["@remix-run/dev"])s=wt;else if(r.vite)s=yt;else if(kt.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))s=gt;else{if(!t["build-ts"]&&!r["build-ts"])continue;s=vt}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await pe(await s.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await pe(await s.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await pe(await s.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await pe(await s.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await s.startTest(n,e);await pe(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},At={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"},bail:{description:"Stop tests after the first failure",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 Q(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const s=n.targets??[],o=0===s.length,i=s.some(e=>e.includes("/e2e")),a=s.some(e=>e.includes("/unit")),c=o||a,l=o||i;for(const o of r.descendants){const r=o.packageJson.dependencies??{},i=o.packageJson.devDependencies??{};let a;if(a=r.blitz?mt:r.next?bt:i["@remix-run/dev"]?wt:i.vite?yt:kt.some(e=>r[e])&&!r["firebase-functions"]?gt:vt,console.info(`Running "test" for ${o.name} ...`),c&&e.existsSync(t.join(o.dirPath,"test","unit"))){const e=s.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await pe(a.testUnit(o,t),o,n,{timeout:n.unitTimeout})}if(!l||!e.existsSync(t.join(o.dirPath,"test","e2e")))continue;const d=s.filter(e=>e.includes("/e2e")),u={...n,targets:d.length>0?d:void 0};switch(n.e2e){case"headless":await pe(await a.testE2EProduction(o,u,{}),o,n);continue;case"headless-dev":await pe(await a.testE2EDev(o,u,{}),o,n);continue;case"docker":await $t(o,u,a);continue;case"docker-debug":{const e=d.length>0?d.join(" "):"test/e2e/";await $t(o,u,a,`test ${e} --debug`);continue}}if(r.blitz||r.next||i["@remix-run/dev"]||i.vite){const e=d.length>0?d.join(" "):"test/e2e/";switch(n.e2e){case"headed":await pe(await a.testE2EProduction(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"headed-dev":await pe(await a.testE2EDev(o,u,{playwrightArgs:`test ${e} --headed`}),o,n);break;case"debug":await pe(await a.testE2EProduction(o,u,{playwrightArgs:`test ${e} --debug`}),o,n);break;case"generate":await pe(await a.testE2EProduction(o,u,{playwrightArgs:`codegen http://localhost:${o.env.PORT}`}),o,n);break;case"trace":await pe("BUN playwright show-trace",o,n)}}}}(n)}};async function $t(e,t,n,r){e.env.WB_DOCKER||="1",await pe(`${n.buildDocker(e,"test")}${it(t)}`,e,t),process.exitCode=await pe(await n.testE2EDocker(e,t,{playwrightArgs:r}),e,t,{exitIfFailed:!1}),await pe(pt.stop(e),e,t)}const Pt={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await Q(n);r||(console.error(d.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const s of r.descendants){const r=s.packageJson.dependencies??{},o=s.packageJson.devDependencies??{};let i;if(i=r.blitz?mt:r.next?bt:o["@remix-run/dev"]?wt:o.vite?yt:kt.some(e=>r[e])&&!r["firebase-functions"]?gt:vt,console.info(`Running "test-on-ci" for ${s.name} ...`),await fe(pt.stopAll(),s,n),e.existsSync(t.join(s.dirPath,"test","unit"))&&await fe(i.testUnit(s,n).replaceAll(" --allowOnly",""),s,n),e.existsSync(t.join(s.dirPath,"test","e2e"))){await fe(await i.testStart(s,n),s,n),await le.promiseAll(),s.hasDockerfile&&(s.env.WB_DOCKER||="1",await pe(`${i.buildDocker(s,"test")}${it(n)}`,s,n));const e=s.hasDockerfile?await i.testE2EDocker(s,n,{}):await i.testE2EProduction(s,n,{});process.exitCode=await pe(e.replaceAll(" --allowOnly",""),s,n,{exitIfFailed:!1}),await pe(pt.stop(s),s,n)}}}(n)}};const St={command:"tree-kill <pid> [signal]",describe:"Kill the given process and all descendants",builder:e=>e.positional("pid",{description:"The process ID to kill.",type:"number",demandOption:!0}).option("signal",{description:"Signal to send to the process tree.",type:"string",default:"SIGTERM"}),handler(e){try{const t=e.signal;if(!(t in b.signals))throw new Error(`Invalid signal: ${t}`);E(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Rt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await Q(n,!1);r||(console.error(d.red("No project found.")),process.exit(1));let s=!1;const o=r.descendants.map(async o=>{const i=[];for(o.packageJson.workspaces?o.hasSourceCode&&(o.packageJson.dependencies?.typescript||o.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"):((o.packageJson.dependencies?.typescript||o.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"),o.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await fe(i.join(" && "),o,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(o.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking.")),s=!0}}),i=await Promise.all(o);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.green(s?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found.")),process.exit(a)}},xt={...Rt,command:"tc"};await n(r(process.argv)).scriptName("wb").options(Je).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(re).command(de).command(Ae).command(De).command(Ue).command(st).command(ot).command(Et).command(At).command(Pt).command(St).command(Rt).command(xt).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;let jt=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!jt){jt=!0;try{E(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
10
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy9zY3JpcHRzL3J1bi50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9wcmlzbWEudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvdXRpbHMvcG9ydC50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiA9IHtcbiAgZW52OiB7XG4gICAgZGVzY3JpcHRpb246ICcuZW52IGZpbGVzIHRvIGJlIGxvYWRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdjYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdFbnZpcm9ubWVudCB0byBsb2FkIGNhc2NhZGluZyAuZW52IGZpbGVzIChlLmcuLCBgLmVudmAsIGAuZW52LjxlbnZpcm9ubWVudD5gLCBgLmVudi5sb2NhbGAgYW5kIGAuZW52LjxlbnZpcm9ubWVudD4ubG9jYWxgKS4gUHJlZmVycmVkIG92ZXIgYGNhc2NhZGUtbm9kZS1lbnZgIGFuZCBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgJ2Nhc2NhZGUtbm9kZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08Tk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4gUHJlZmVycmVkIG92ZXIgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAnYXV0by1jYXNjYWRlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxXQl9FTlYgfHwgTk9ERV9FTlYgfHwgXCJkZXZlbG9wbWVudFwiPi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnaW5jbHVkZS1yb290LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0luY2x1ZGUgLmVudiBmaWxlcyBpbiByb290IGRpcmVjdG9yeSBpZiB0aGUgcHJvamVjdCBpcyBpbiBhIG1vbm9yZXBvIGFuZCAtLWVudiBvcHRpb24gaXMgbm90IHVzZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2NoZWNrLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NoZWNrIHdoZXRoZXIgdGhlIGtleXMgb2YgdGhlIGxvYWRlZCAuZW52IGZpbGVzIGFyZSBzYW1lIHdpdGggdGhlIGdpdmVuIC5lbnYgZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcuZW52LmV4YW1wbGUnLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudlxuICAgICAgICA/IHByb2Nlc3MuZW52LldCX0VOViB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3Byb2Nlc3MuZW52LldCX0VOVn0sIE5PREVfRU5WOiAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICBjb25zdCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXM6IFtzdHJpbmcsIHN0cmluZ1tdXVtdID0gW107XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2VudlBhdGgsIGtleXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V4cGFuZCh7IHBhcnNlZDogZW52VmFycywgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IGVudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lc107XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5pbXBvcnQgeyBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAsIGNvbGxlY3REZXNjZW5kYW50UGlkcyBhcyBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIH0gZnJvbSAnLi9wcm9jZXNzVHJlZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlS2lsbChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGlkKSB8fCBwaWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwaWQ6ICR7cGlkfWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBraWxsVHJlZU9uV2luZG93cyhwaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlc2NlbmRhbnRzID0gY29sbGVjdERlc2NlbmRhbnRQaWRzKHBpZCk7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZCwgZGVzY2VuZGFudHMpO1xuICBmb3IgKGNvbnN0IHRhcmdldFBpZCBvZiB0YXJnZXRQaWRzKSB7XG4gICAga2lsbElmTmVlZGVkKHRhcmdldFBpZCwgc2lnbmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsSWZOZWVkZWQocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBzaWduYWwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFRyZWVPbldpbmRvd3MocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBydW5Db21tYW5kKCd0YXNra2lsbCcsIFsnL1BJRCcsIFN0cmluZyhwaWQpLCAnL1QnLCAnL0YnXSwge1xuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gcnVuQ29tbWFuZChcbiAgICAncHMnLFxuICAgIFsnLUFvJywgJ3BpZD0scHBpZD0nXSxcbiAgICAvLyBLZWVwIGNvbW1hbmQgYm91bmRlZCBzbyB3YXRjaC1tb2RlIGtpbGwgbG9vcHMgY2Fubm90IGhhbmcgdGhpcyBwYXRoLlxuICAgIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCwgdGltZW91dDogMjAwMCB9XG4gICk7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAoc3Rkb3V0KTtcbiAgcmV0dXJuIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAocm9vdFBpZCwgY2hpbGRyZW5CeVBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkOiBudW1iZXIsIGRlc2NlbmRhbnRzOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IGRlc2NlbmRhbnRzLnRvUmV2ZXJzZWQoKTtcbiAgdGFyZ2V0UGlkcy5wdXNoKHBpZCk7XG4gIHJldHVybiB0YXJnZXRQaWRzO1xufVxuXG5mdW5jdGlvbiBydW5Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogeyB0aW1lb3V0OiBudW1iZXI7IG1heEJ1ZmZlcjogbnVtYmVyIH1cbik6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYyhjb21tYW5kLCBbLi4uYXJnc10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IG9wdGlvbnM/Lm1heEJ1ZmZlcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnI6ICcnIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3Qgc3RkZXJyID0gZXh0cmFjdFN0ZGVycihlcnJvcik7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRFeGVjdXRpb25FcnJvcihjb21tYW5kLCBhcmdzLCBzdGRlcnIsIHRvRXhpdENvZGUoZXJyb3IpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIC9ubyBzdWNoIHByb2Nlc3N8bm90IGZvdW5kfG5vdCByZWNvZ25pemVkfHRoZXJlIGlzIG5vIHJ1bm5pbmcgaW5zdGFuY2UvaS50ZXN0KGVycm9yLnN0ZGVycik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0b0V4aXRDb2RlKGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ3N0YXR1cycgaW4gZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM6IHVua25vd24gfSkuc3RhdHVzO1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0ZGVycihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8IGVycm9yID09PSBudWxsIHx8ICEoJ3N0ZGVycicgaW4gZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc3RkZXJyID0gKGVycm9yIGFzIFJlY29yZDwnc3RkZXJyJywgdW5rbm93bj4pLnN0ZGVycjtcbiAgaWYgKHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ZGVycjtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0ZGVycikpIHtcbiAgICByZXR1cm4gc3RkZXJyLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgc3RkZXJyOiBzdHJpbmcsIGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKGBDb21tYW5kIGZhaWxlZDogJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRoaXMubmFtZSA9ICdDb21tYW5kRXhlY3V0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RkZXJyID0gc3RkZXJyO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAocHNPdXRwdXQ6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcltdPiB7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBwc091dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKVxccyokLy5leGVjKGxpbmUpO1xuICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRQaWQgPSBOdW1iZXIobWF0Y2hlZFsxXSk7XG4gICAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyKG1hdGNoZWRbMl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50UGlkKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRQaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnRQaWQsIFtjaGlsZFBpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5CeVBhcmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIsIGNoaWxkcmVuQnlQYXJlbnQ6IE1hcDxudW1iZXIsIG51bWJlcltdPik6IG51bWJlcltdIHtcbiAgY29uc3QgZGVzY2VuZGFudHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHF1ZXVlID0gWy4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChyb290UGlkKSA/PyBbXSldO1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBwaWQgPSBxdWV1ZVtpbmRleF0gYXMgbnVtYmVyO1xuICAgIGluZGV4ICs9IDE7XG4gICAgZGVzY2VuZGFudHMucHVzaChwaWQpO1xuICAgIHF1ZXVlLnB1c2goLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBpZCkgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gZGVzY2VuZGFudHM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2MucGlkfSlgLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgY2xlYW51cFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPVxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gWydTSUdJTlQnLCAnU0lHVEVSTSddIDogWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ107XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBjb25zdCByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3QgW3NpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuY2xlYXIoKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBjbGVhbnVwU2lnbmFscykge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHN0b3BQcm9jZXNzKCk7XG4gICAgICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSA9PT0gMCkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09PTAmJihpPW4oaSkscihpKSxsPTApfXJldHVybiBvJiYoaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSxvPjEmJihmKz10W2g+PjEyJjE1XSt0W2g+PjgmMTVdKSxvPjImJihmKz10W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSkpLGZ9fWNvbnN0IHI9ZnVuY3Rpb24odCl7bGV0IHMsaSxvLG4saCxyLGwsYyxmLGEsdSxkLGIsayx5LHgsQixwLEMseixJLGcsdyxBLFAsRSxqLG0scSx2LEQsRixHLEgsSixLLEwsTSxOLE8sUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sdHQsc3QsaXQsZXQsb3QsbnQsaHQscnQsbHQsY3QsZnQ7Zm9yKG89MDtvPDQ4O28rPTIpbj10WzBdXnRbMTBdXnRbMjBdXnRbMzBdXnRbNDBdLGg9dFsxXV50WzExXV50WzIxXV50WzMxXV50WzQxXSxyPXRbMl1edFsxMl1edFsyMl1edFszMl1edFs0Ml0sbD10WzNdXnRbMTNdXnRbMjNdXnRbMzNdXnRbNDNdLGM9dFs0XV50WzE0XV50WzI0XV50WzM0XV50WzQ0XSxmPXRbNV1edFsxNV1edFsyNV1edFszNV1edFs0NV0sYT10WzZdXnRbMTZdXnRbMjZdXnRbMzZdXnRbNDZdLHU9dFs3XV50WzE3XV50WzI3XV50WzM3XV50WzQ3XSxkPXRbOF1edFsxOF1edFsyOF1edFszOF1edFs0OF0sYj10WzldXnRbMTldXnRbMjldXnRbMzldXnRbNDldLHM9ZF4ocjw8MXxsPj4+MzEpLGk9Yl4obDw8MXxyPj4+MzEpLHRbMF1ePXMsdFsxXV49aSx0WzEwXV49cyx0WzExXV49aSx0WzIwXV49cyx0WzIxXV49aSx0WzMwXV49cyx0WzMxXV49aSx0WzQwXV49cyx0WzQxXV49aSxzPW5eKGM8PDF8Zj4+PjMxKSxpPWheKGY8PDF8Yz4+PjMxKSx0WzJdXj1zLHRbM11ePWksdFsxMl1ePXMsdFsxM11ePWksdFsyMl1ePXMsdFsyM11ePWksdFszMl1ePXMsdFszM11ePWksdFs0Ml1ePXMsdFs0M11ePWkscz1yXihhPDwxfHU+Pj4zMSksaT1sXih1PDwxfGE+Pj4zMSksdFs0XV49cyx0WzVdXj1pLHRbMTRdXj1zLHRbMTVdXj1pLHRbMjRdXj1zLHRbMjVdXj1pLHRbMzRdXj1zLHRbMzVdXj1pLHRbNDRdXj1zLHRbNDVdXj1pLHM9Y14oZDw8MXxiPj4+MzEpLGk9Zl4oYjw8MXxkPj4+MzEpLHRbNl1ePXMsdFs3XV49aSx0WzE2XV49cyx0WzE3XV49aSx0WzI2XV49cyx0WzI3XV49aSx0WzM2XV49cyx0WzM3XV49aSx0WzQ2XV49cyx0WzQ3XV49aSxzPWFeKG48PDF8aD4+PjMxKSxpPXVeKGg8PDF8bj4+PjMxKSx0WzhdXj1zLHRbOV1ePWksdFsxOF1ePXMsdFsxOV1ePWksdFsyOF1ePXMsdFsyOV1ePWksdFszOF1ePXMsdFszOV1ePWksdFs0OF1ePXMsdFs0OV1ePWksaz10WzBdLHk9dFsxXSxWPXRbMTFdPDw0fHRbMTBdPj4+MjgsVz10WzEwXTw8NHx0WzExXT4+PjI4LG09dFsyMF08PDN8dFsyMV0+Pj4yOSxxPXRbMjFdPDwzfHRbMjBdPj4+MjkscnQ9dFszMV08PDl8dFszMF0+Pj4yMyxsdD10WzMwXTw8OXx0WzMxXT4+PjIzLFI9dFs0MF08PDE4fHRbNDFdPj4+MTQsUz10WzQxXTw8MTh8dFs0MF0+Pj4xNCxIPXRbMl08PDF8dFszXT4+PjMxLEo9dFszXTw8MXx0WzJdPj4+MzEseD10WzEzXTw8MTJ8dFsxMl0+Pj4yMCxCPXRbMTJdPDwxMnx0WzEzXT4+PjIwLFg9dFsyMl08PDEwfHRbMjNdPj4+MjIsWT10WzIzXTw8MTB8dFsyMl0+Pj4yMix2PXRbMzNdPDwxM3x0WzMyXT4+PjE5LEQ9dFszMl08PDEzfHRbMzNdPj4+MTksY3Q9dFs0Ml08PDJ8dFs0M10+Pj4zMCxmdD10WzQzXTw8Mnx0WzQyXT4+PjMwLHN0PXRbNV08PDMwfHRbNF0+Pj4yLGl0PXRbNF08PDMwfHRbNV0+Pj4yLEs9dFsxNF08PDZ8dFsxNV0+Pj4yNixMPXRbMTVdPDw2fHRbMTRdPj4+MjYscD10WzI1XTw8MTF8dFsyNF0+Pj4yMSxDPXRbMjRdPDwxMXx0WzI1XT4+PjIxLFo9dFszNF08PDE1fHRbMzVdPj4+MTcsJD10WzM1XTw8MTV8dFszNF0+Pj4xNyxGPXRbNDVdPDwyOXx0WzQ0XT4+PjMsRz10WzQ0XTw8Mjl8dFs0NV0+Pj4zLEE9dFs2XTw8Mjh8dFs3XT4+PjQsUD10WzddPDwyOHx0WzZdPj4+NCxldD10WzE3XTw8MjN8dFsxNl0+Pj45LG90PXRbMTZdPDwyM3x0WzE3XT4+PjksTT10WzI2XTw8MjV8dFsyN10+Pj43LE49dFsyN108PDI1fHRbMjZdPj4+Nyx6PXRbMzZdPDwyMXx0WzM3XT4+PjExLEk9dFszN108PDIxfHRbMzZdPj4+MTEsXz10WzQ3XTw8MjR8dFs0Nl0+Pj44LHR0PXRbNDZdPDwyNHx0WzQ3XT4+PjgsVD10WzhdPDwyN3x0WzldPj4+NSxVPXRbOV08PDI3fHRbOF0+Pj41LEU9dFsxOF08PDIwfHRbMTldPj4+MTIsaj10WzE5XTw8MjB8dFsxOF0+Pj4xMixudD10WzI5XTw8N3x0WzI4XT4+PjI1LGh0PXRbMjhdPDw3fHRbMjldPj4+MjUsTz10WzM4XTw8OHx0WzM5XT4+PjI0LFE9dFszOV08PDh8dFszOF0+Pj4yNCxnPXRbNDhdPDwxNHx0WzQ5XT4+PjE4LHc9dFs0OV08PDE0fHRbNDhdPj4+MTgsdFswXT1rXn54JnAsdFsxXT15Xn5CJkMsdFsxMF09QV5+RSZtLHRbMTFdPVBefmomcSx0WzIwXT1IXn5LJk0sdFsyMV09Sl5+TCZOLHRbMzBdPVReflYmWCx0WzMxXT1VXn5XJlksdFs0MF09c3RefmV0Jm50LHRbNDFdPWl0Xn5vdCZodCx0WzJdPXhefnAmeix0WzNdPUJefkMmSSx0WzEyXT1FXn5tJnYsdFsxM109al5+cSZELHRbMjJdPUtefk0mTyx0WzIzXT1MXn5OJlEsdFszMl09Vl5+WCZaLHRbMzNdPVdeflkmJCx0WzQyXT1ldF5+bnQmcnQsdFs0M109b3Refmh0Jmx0LHRbNF09cF5+eiZnLHRbNV09Q15+SSZ3LHRbMTRdPW1efnYmRix0WzE1XT1xXn5EJkcsdFsyNF09TV5+TyZSLHRbMjVdPU5eflEmUyx0WzM0XT1YXn5aJl8sdFszNV09WV5+JCZ0dCx0WzQ0XT1udF5+cnQmY3QsdFs0NV09aHRefmx0JmZ0LHRbNl09el5+ZyZrLHRbN109SV5+dyZ5LHRbMTZdPXZefkYmQSx0WzE3XT1EXn5HJlAsdFsyNl09T15+UiZILHRbMjddPVFeflMmSix0WzM2XT1aXn5fJlQsdFszN109JF5+dHQmVSx0WzQ2XT1ydF5+Y3Qmc3QsdFs0N109bHRefmZ0Jml0LHRbOF09Z15+ayZ4LHRbOV09d15+eSZCLHRbMThdPUZefkEmRSx0WzE5XT1HXn5QJmosdFsyOF09Ul5+SCZLLHRbMjldPVNefkomTCx0WzM4XT1fXn5UJlYsdFszOV09dHReflUmVyx0WzQ4XT1jdF5+c3QmZXQsdFs0OV09ZnRefml0Jm90LHRbMF1ePWVbb10sdFsxXV49ZVtvKzFdfTtleHBvcnR7byBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiY29uc3QgZT1cIlwiLHQ9ZnVuY3Rpb24oKXtjb25zdCBlPXtpbnN0YW5jZTpFcnJvcixmcm9tOmU9Pntjb25zdCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gdm9pZCAwIT09ZS5zdGFjayYmdC5wdXNoKGUuc3RhY2spLHZvaWQgMCE9PWUuY2F1c2UmJih2b2lkIDA9PT1lLnN0YWNrJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9Pm5ldyBFcnJvcixoeWRyYXRlOihlLFt0LG4sYSxzXSk9PntlLm5hbWU9dCxlLm1lc3NhZ2U9bix2b2lkIDA9PT1hP2RlbGV0ZSBlLnN0YWNrOmUuc3RhY2s9YSx2b2lkIDAhPT1zJiYoZS5jYXVzZT1zKX19LHQ9e2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShhLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+bi5lbmNvZGUoYXRvYihlKSl9LHM9e2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0W24sYV1vZiB0KWUuc2V0KG4sYSl9fSxvPXtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0IG4gb2YgdCllLmFkZChuKX19LHI9e2luc3RhbmNlOkRhdGUsZnJvbTplPT5bZS50b0pTT04oKV0sY3JlYXRlOihbZV0pPT5uZXcgRGF0ZShlKX0sYz17aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LGQ9e2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX07cmV0dXJuIG5ldyBNYXAoW2UsdCxzLG8scixjLGRdLm1hcChlPT5bZS5pbnN0YW5jZS5uYW1lLGVdKSl9KCksbj1uZXcgVGV4dEVuY29kZXIsYT1uZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtleHBvcnR7dCBhcyBHTE9CQUxfQ09OU1RSVUNUT1JfTUFQLGUgYXMgUExBSU5fT0JKRUNUX0xBQkVMfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0cnVjdG9ycy5qcy5tYXBcbiIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIHQsUExBSU5fT0JKRUNUX0xBQkVMIGFzIG59ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtjb25zdCBlPS0xLHI9LTIsbz0tMyxpPS00LHM9LTUsYz0tNjtmdW5jdGlvbiBmKG49dm9pZCAwLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFjaUVudiAmJiBjaUVudiAhPT0gJzAnICYmIGNpRW52ICE9PSAnZmFsc2UnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi91dGlscy9jaS5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmd2OiBFbnZSZWFkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRFbnY6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aEJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlyUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpclBhdGg6IHN0cmluZywgYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICB0aGlzLmxvYWRFbnYgPSBsb2FkRW52O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGlzQnVuQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyhefFxcbilidW5cXHMvLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBlbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHJldHVybiBwcm9jZXNzLmVudjtcblxuICAgIGNvbnN0IFtlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtjb3VudH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4geyAuLi5lbnZWYXJzLCAuLi5wcm9jZXNzLmVudiB9O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ucHJpc21hID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wcmlzbWEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNCaW9tZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdAYmlvbWVqcy9iaW9tZScpIHx8IHRoaXMuaGFzRGVwZW5kZW5jeSgnYmlvbWUnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNFc2xpbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnZXNsaW50Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdiaW9tZScgfCAnZXNsaW50JyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzQmlvbWUpIHJldHVybiAnYmlvbWUnO1xuICAgIGlmICh0aGlzLmhhc0VzbGludCkgcmV0dXJuICdlc2xpbnQnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGhhc0RlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc0RlcGVuZGVuY3lJblBhY2thZ2VKc29uID0gKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgICAgICEhKFxuICAgICAgICBwYWNrYWdlSnNvbiAmJlxuICAgICAgICAocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8XG4gICAgICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8XG4gICAgICAgICAgcGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHxcbiAgICAgICAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdKVxuICAgICAgKTtcblxuICAgIHJldHVybiBoYXNEZXBlbmRlbmN5SW5QYWNrYWdlSnNvbih0aGlzLnBhY2thZ2VKc29uKSB8fCBoYXNEZXBlbmRlbmN5SW5QYWNrYWdlSnNvbih0aGlzLnJvb3RQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcblxuICByZXR1cm4ge1xuICAgIC4uLnJvb3RBbmRTZWxmUHJvamVjdHMsXG4gICAgZGVzY2VuZGFudHM6XG4gICAgICByb290QW5kU2VsZlByb2plY3RzLnJvb3QgPT09IHJvb3RBbmRTZWxmUHJvamVjdHMuc2VsZlxuICAgICAgICA/IGF3YWl0IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCByb290QW5kU2VsZlByb2plY3RzLnJvb3QsIGxvYWRFbnYpXG4gICAgICAgIDogW3Jvb3RBbmRTZWxmUHJvamVjdHMuc2VsZl0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICBjb25zdCB0aGlzUHJvamVjdCA9IG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICBsZXQgcm9vdFByb2plY3QgPSB0aGlzUHJvamVjdDtcbiAgaWYgKCF0aGlzUHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHBhdGguZGlybmFtZShkaXJQYXRoKS5lbmRzV2l0aCgnL3BhY2thZ2VzJykpIHtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJvb3RQcm9qZWN0ID0gbmV3IFByb2plY3Qocm9vdERpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gcHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIHByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gcHJvamVjdHM7XG59XG4iLCJleHBvcnQgY29uc3QgaXNSdW5uaW5nT25CdW4gPVxuICAvLyBEZXRlY3QgYGJ1biAtLWJ1biBydW4gd2IgLi4uYC4gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgcHJvY2Vzcy52ZXJzaW9ucy5idW4gfHxcbiAgLy8gRGV0ZWN0IGBidW4gcnVuIHdiIC4uLmAuXG4gIHByb2Nlc3MuYXJndlswXT8uZW5kc1dpdGgoJy9idW4nKSB8fFxuICBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmVuZHNXaXRoKCcvYnVuJyk7XG5cbmV4cG9ydCBjb25zdCBydW50aW1lV2l0aEFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuJyA6ICdub2RlJztcbmV4cG9ydCBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAneWFybic7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXJXaXRoUnVuID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1J1bm5pbmdPbkJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGJ1aWxkIGNvbW1hbmQgKGRlZmF1bHQ6IHlhcm58YnVuIGJ1aWxkKScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdjJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXJndiA9IHsgLi4uYXJndiwgY29tbWFuZDogYXJndi5jb21tYW5kID8/IChpc1J1bm5pbmdPbkJ1biA/ICdidW4gcnVuIGJ1aWxkJyA6ICd5YXJuIGJ1aWxkJykgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUnVubmluZ09uQnVuLCBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QpO1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIG9wdHMpLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogeyBwcmludGFibGU6IHN0cmluZzsgcnVubmFibGU6IHN0cmluZyB9IHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAnUFJJU01BIGdlbmVyYXRlICcsXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnUFJJU01BIGdlbmVyYXRlICcgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMgJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYFxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuICcgOiAneWFybiBydW4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gYnVpbGQtdHMgcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLnJlcGxhY2VBbGwoJ2J1biAtLWJ1biBydW4gYnVuIC0tYnVuIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC8vIEJlY2F1c2UgYnVuIGNhbiBydW4gc3JjL2luZGV4LnRzIGRpcmVjdGx5LlxuICAgICAgLnJlcGxhY2VBbGwoJ2Rpc3QvaW5kZXguanMnLCAnc3JjL2luZGV4LnRzJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oPzpZQVJOICk/dml0ZXN0IHJ1bi9nLCAnYnVuIHRlc3QnKVxuICAgICAgLy8gJy0tYWxsb3dPbmx5JyBpcyBzb21ldGltZXMgcmVtb3ZlZC5cbiAgICAgIC5yZXBsYWNlQWxsKC8gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyg/OiAtLWFsbG93T25seSk/L2csICcnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQoXG4gICAgbmV3U2NyaXB0XG4gICAgICAvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGB5YXJuIHBsYXl3cmlnaHRgIGluIGEgcHJvamVjdCBkZXBlbmRpbmcgb24gYGFydGlsbGVyeS1lbmdpbmUtcGxheXdyaWdodGAuXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICk7XG4gIC8vIEFkZCBjYXNjYWRlIG9wdGlvbiB3aGVuIFdCX0VOViBpcyBkZWZpbmVkXG4gIGNvbnN0IGNhc2NhZGVPcHRpb24gPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgIC1jPSR7cHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCd9YCA6ICcnO1xuICByZXR1cm4ge1xuICAgIHByaW50YWJsZTogYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBkb3RlbnYke2Nhc2NhZGVPcHRpb259IC0tICR7cHJpbnRhYmxlU2NyaXB0fWAsXG4gICAgcnVubmFibGU6IHJ1bm5hYmxlU2NyaXB0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmlndXJlRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgb3B0czogT3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBpZiAob3B0cy5mb3JjZUNvbG9yKSB7XG4gICAgbmV3RW52LkZPUkNFX0NPTE9SID0gJzMnO1xuICB9XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYmlvbWVFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdhc3RybycsXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdncWwnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzdmVsdGUnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IGVzbGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICd0cycsICd0c3gnXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjc3MnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2phdmEnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIWJpb21lRXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXJndi5maWxlcyA/PyBbXTtcbiAgICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgICBjb25zdCBwcmV0dGllckZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICAgIGxldCBwcmV0dGllckFyZ3M6IHN0cmluZ1tdO1xuICAgIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKFN0cmluZyhmaWxlKSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC1maXh0dXJlcycpIHx8XG4gICAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvcGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb2plY3QgPSBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgpO1xuICAgICAgICBpZiAoIXByb2plY3QpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChuZWVkc1ByZXR0aWVyKHByb2plY3QpKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIEVTTGludCBvciBCaW9tZS5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByZXR0aWVyQXJncyA9IHByZXR0aWVyRmlsZVBhdGhzO1xuICAgICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHBhY2thZ2VKc29uRmlsZVBhdGhzO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoKHApID0+IHAucGFja2FnZUpzb25QYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW50UHJvbWlzZXM6IFByb21pc2U8bnVtYmVyPltdID0gW107XG4gICAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIGZvcmNlQ29sb3I6IHRydWUgfSBhcyBjb25zdDtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndiwgbGludEZpbGVQYXRocyk7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmICFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgICAgbGludFByb21pc2VzLnB1c2gocnVuV2l0aFNwYXduSW5QYXJhbGxlbChsaW50Q29tbWFuZCwgcHJvamVjdCwgYXJndiwgbGludFJ1bk9wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGludEV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKGxpbnRQcm9taXNlcyk7XG5cbiAgICBpZiAobWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyB8fCBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAgICdZQVJOJyxcbiAgICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgICAnLS1jb2xvcicsXG4gICAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgICAnLS0nLFxuICAgICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgICAgYXJndixcbiAgICAgICAgICB7IGZvcmNlQ29sb3I6IHRydWUgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICAgICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yY2VDb2xvcjogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LFxuICBhcmd2OiBQaWNrPFxuICAgIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+LFxuICAgICdmaXgnIHwgJ2Zvcm1hdCdcbiAgPixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnKSB7XG4gICAgbGV0IGJpb21lQXJnczogc3RyaW5nW107XG4gICAgaWYgKGFyZ3YuZml4ICYmIGFyZ3YuZm9ybWF0KSB7XG4gICAgICBiaW9tZUFyZ3MgPSBbJ2NoZWNrJywgJy0tZml4J107XG4gICAgfSBlbHNlIGlmIChhcmd2LmZpeCkge1xuICAgICAgYmlvbWVBcmdzID0gWydsaW50JywgJy0tZml4J107XG4gICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgYmlvbWVBcmdzID0gWydmb3JtYXQnLCAnLS1maXgnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlvbWVBcmdzID0gWydsaW50J107XG4gICAgfVxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnQlVOJyxcbiAgICAgICdiaW9tZScsXG4gICAgICAuLi5iaW9tZUFyZ3MsXG4gICAgICAnLS1jb2xvcnM9Zm9yY2UnLFxuICAgICAgJy0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCcsXG4gICAgICAnLS1maWxlcy1pZ25vcmUtdW5rbm93bj10cnVlJyxcbiAgICAgIC4uLihmaWxlcz8ubGVuZ3RoID8gWyctLSddIDogW10pLFxuICAgICAgLi4uKGZpbGVzID8/IFtdKSxcbiAgICBdKTtcbiAgfVxuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdlc2xpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdlc2xpbnQnLFxuICAgICAgJy0tY29sb3InLFxuICAgICAgLi4uKGFyZ3YuZml4IHx8IGFyZ3YuZm9ybWF0ID8gWyctLWZpeCddIDogW10pLFxuICAgICAgJy0tJyxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcmV0dGllckFyZ3MoXG4gIHNlbGZEaXJQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwcmVmZXJyZWRMaW50ZXInPltdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3MgPSBuZXcgU2V0PHN0cmluZz4oW2AqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWAsICchKiovdGVzdHstLC99Zml4dHVyZXMvKionXSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmICghbmVlZHNQcmV0dGllcihwcm9qZWN0KSkgY29udGludWU7XG5cbiAgICBjb25zdCBwcm9qZWN0UGF0dGVybiA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcqKi97LiovLH0qLnsnICsgWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uam9pbignLCcpICsgJ30nKTtcbiAgICBhcmdzLmFkZChwYXRoLnJlbGF0aXZlKHNlbGZEaXJQYXRoLCBwcm9qZWN0UGF0dGVybikgfHwgcHJvamVjdFBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBbLi4uYXJnc107XG59XG5cbmZ1bmN0aW9uIGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzOiBQcm9qZWN0W10sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgbGV0IG93bmluZ1Byb2plY3Q6IFByb2plY3QgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGlmIChcbiAgICAgIChmaWxlUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7cHJvamVjdC5kaXJQYXRofS9gKSkgJiZcbiAgICAgICghb3duaW5nUHJvamVjdCB8fCBwcm9qZWN0LmRpclBhdGgubGVuZ3RoID4gb3duaW5nUHJvamVjdC5kaXJQYXRoLmxlbmd0aClcbiAgICApIHtcbiAgICAgIG93bmluZ1Byb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3duaW5nUHJvamVjdDtcbn1cblxuZnVuY3Rpb24gaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgZXNsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LCBleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdiaW9tZScpIHJldHVybiBiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2VzbGludCcpIHJldHVybiBlc2xpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnZXNsaW50Jztcbn1cblxuZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li86PSxAJSstXSskL3UudGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlQWxsKFwiJ1wiLCBgJ1wiJ1wiJ2ApfSdgO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIG91dHNpZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdGhlIG9wdGltaXphdGlvbiBpcyBleGVjdXRlZCBvdXRzaWRlIGEgZG9ja2VyIGNvbnRhaW5lciBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLFxuICBkZXNjcmliZTogJ09wdGltaXplIGNvbmZpZ3VyYXRpb24gd2hlbiBidWlsZGluZyBhIERvY2tlciBpbWFnZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IGtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBzKSkge1xuICAgICAgICAgIGlmICh2YWx1ZT8uc3RhcnRzV2l0aCgnZ2l0QGdpdGh1Yi5jb206JykpIHtcbiAgICAgICAgICAgIGRlcHNbbmFtZV0gPSBgLi8ke25hbWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWFyZ3Yub3V0c2lkZSkge1xuICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gICAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGFsbCBkZXZEZXBlbmRlbmNpZXMuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAncGxheXdyaWdodCcsXG4gICAgJ3ByZXR0aWVyJyxcbiAgICAncGluc3QnLFxuICAgICdyYWlsd2F5JyxcbiAgICAnc2VtYW50aWMtcmVsZWFzZScsXG4gICAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgICAnd2FpdC1vbicsXG4gICAgJ3ZpdGVzdCcsXG4gIF07XG4gIGNvbnN0IHJlbW92ZWREZXBzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGV2RGVwcykpIHtcbiAgICBpZiAoXG4gICAgICBuYW1lV29yZHNUb0JlUmVtb3ZlZC5zb21lKCh3b3JkKSA9PiBuYW1lLmluY2x1ZGVzKHdvcmQpKSB8fFxuICAgICAgKG5hbWUuaW5jbHVkZXMoJ3dpbGxib29zdGVyJykgJiYgbmFtZS5pbmNsdWRlcygnY29uZmlnJykpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZGV2RGVwc1tuYW1lXTtcbiAgICAgIHJlbW92ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBkZXZEZXBlbmRlbmNpZXM6JywgcmVtb3ZlZERlcHMuam9pbignLCAnKSB8fCAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydjaGVjaycsICdkZXBsb3knLCAnZm9ybWF0JywgJ2xpbnQnLCAnc3RhcnQnLCAndGVzdCddO1xuICBjb25zdCBjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyA9IFsncGluc3QgJywgJ2h1c2t5ICddO1xuICBjb25zdCBzY3JpcHRzID0gKHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0IHJlbW92ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IG5hbWUuc3RhcnRzV2l0aCh3b3JkKSkgfHxcbiAgICAgIC8vIFN1cHBvcnQgXCJodXNreVwiIHNpbmNlIGh1c2t5IHY5IHJlcXVpcmVzIGBcInBvc3RpbnN0YWxsXCI6IFwiaHVza3lcImBcbiAgICAgIGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzLnNvbWUoKHdvcmQpID0+IGNvbnRlbnQuaW5jbHVkZXMod29yZCkgfHwgY29udGVudC50cmltKCkgPT09IHdvcmQudHJpbSgpKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHNjcmlwdHNbbmFtZV07XG4gICAgICByZW1vdmVkU2NyaXB0cy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgc2NyaXB0czonLCByZW1vdmVkU2NyaXB0cy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBkZWxldGUgcGFja2FnZUpzb24ucHJpdmF0ZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWc7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcmV0dGllcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY2xlYW5VcENvbW1hbmQgPSBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIENsZWFudXAgZXhpc3RpbmcgYXJ0aWZhY3RzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIExpdGVzdHJlYW0gcmVwbGljYXRpb24uXG4gICAgLy8gTm90ZSB0aGF0IGRvbid0IG1lcmdlIG11bHRpcGxlIHJtIGNvbW1hbmRzIGludG8gb25lLCBiZWNhdXNlIGlmIG9uZSBmYWlscywgdGhlIHN1YnNlcXVlbnQgb25lcyB3b24ndCBydW4uXG4gICAgcmV0dXJuIGAke2NsZWFuVXBDb21tYW5kfTsgcm0gLVJmICR7ZGlyUGF0aH0vLnByb2Quc3FsaXRlMyogfHwgdHJ1ZWA7XG4gIH1cblxuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBgcHJpc21hIG1pZ3JhdGUgcmVzZXRgIGNhbiBmYWlsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFiYXNlLCBzbyB3ZSByZW1vdmUgaXQgZmlyc3QuXG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmIFBSSVNNQSBnZW5lcmF0ZSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICAgIHN0ZXBzLnB1c2godGhpcy5zZWVkKHByb2plY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlIC1jb25maWcgbGl0ZXN0cmVhbS55bWwgLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL21vdW50JyA6ICdwcmlzbWEvbW91bnQnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgUFJJU01BIGRiIGV4ZWN1dGUgLS1zdGRpbiAtLXVybCBcIiR7RklMRV9TQ0hFTUF9JHtkYlBhdGh9XCI7IGZpICYmIHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSpgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd0RiUGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdXQl9FTlY9dGVzdCBwcmlzbWEgcmVzZXQnLCBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndikpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmtub3duT3B0aW9ucy5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgb25TaWduYWw6IChzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cCcsXG4gIGRlc2NyaWJlOiAnU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgc2V0dXAoYXJndik7XG4gIH0sXG59O1xuXG4vLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdzZXR1cCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5yZWFkZGlyKHByb2plY3QuZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGlmIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290KSB7XG4gICAgICBpZiAob3MucGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSBbJ3BzdHJlZSddO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKVxuICAgIC5qb2luKCcgJyk7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA9IChhcmd2LmRvY2tlck9wdGlvbnMgPz8gW10pLm1hcCgoYXJnKSA9PiBgJyR7YXJnfSdgKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkLCBwcmludFN0YXJ0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5pbXBvcnQgeyBpc1BvcnRBdmFpbGFibGUgfSBmcm9tICcuL3BvcnQuanMnO1xuXG5jb25zdCBraWxsZWQgPSBuZXcgU2V0PG51bWJlciB8IHN0cmluZz4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBpc1BvcnRBdmFpbGFibGUocG9ydCk7XG4gIGlmICghYXZhaWxhYmxlKSB7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9XG5cbiAgY29uc3Qga2lsbEZ1bmMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMocG9ydCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQocG9ydCk7XG4gICAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdlIHNob3VsZCBzdG9wIERvY2tlciBjb250YWluZXJzIGZpcnN0IGJlY2F1c2UgYGtpbGwtcG9ydGAgbWF5IGZhaWwgdG8gc3RvcCBEb2NrZXIgY29udGFpbmVycy5cbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259IC5gO1xuICB9XG5cbiAgc3RvcEFuZFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnN0b3AocHJvamVjdCl9ICYmICR7dGhpcy5zdGFydChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucywgYWRkaXRpb25hbEFyZ3MpfWA7XG4gIH1cblxuICBzdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICBzcGF3blN5bmNPbkV4aXQodGhpcy5zdG9wKHByb2plY3QpLCBwcm9qZWN0KTtcbiAgICBjb25zdCBhbGxvY2F0ZVR0eSA9IGFkZGl0aW9uYWxBcmdzLmluY2x1ZGVzKCcvYmluL2Jhc2gnKTtcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyB7XG4gIC8qKiAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgKi9cbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7dGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KX1cIlxuICAgICAgXCIke3RoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCl9XCJgO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBgWUFSTiBjb25jdXJyZW50bHkgLS1yYXcgLS1raWxsLW90aGVycy1vbi1mYWlsXG4gICAgICBcIiR7dGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndil9XCJcbiAgICAgIFwiJHt0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpfVwiYDtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmIFlBUk4gY29uY3VycmVudGx5IC0tcmF3IC0ta2lsbC1vdGhlcnMtb24tZmFpbFxuICAgICAgICBcIiR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKX1cIlxuICAgICAgICBcIiR7dGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KX1cImA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPVxuICAgICAgZWNvc3lzdGVtQ29uZmlnUGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW1xuICAgICAgICAgICAgYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke2FyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YC50cmltKCksXG4gICAgICAgICAgICBgbm9kZSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICAgICAgXVxuICAgICAgICA6IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdO1xuXG4gICAgcmV0dXJuIFsuLi4ocHJvamVjdC5oYXNQcmlzbWEgPyBwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCkuc3BsaXQoJyYmJykgOiBbXSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBVc2UgZW1wdHkgTk9ERV9FTlYgdG8gYXZvaWQgXCJwcm9kdWN0aW9uXCIgbW9kZSBpbiBzb21lIGZyYW1ld29ya3MgbGlrZSBCbGl0ei5qcy5cbiAgICByZXR1cm4gYE5PREVfRU5WPVwiXCIgWUFSTiBjb25jdXJyZW50bHkgLS1raWxsLW90aGVycyAtLXJhdyAtLXN1Y2Nlc3MgZmlyc3QgXCIke3RoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndil9XCIgXCIke3RoaXMud2FpdEFwcChwcm9qZWN0KX1cImA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9ICd0ZXN0IHRlc3QvZTJlLycgfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1cImA7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGVzdFRhcmdldCA9IGFyZ3YudGFyZ2V0cz8uam9pbignICcpIHx8ICd0ZXN0L3VuaXQvJztcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIGNvbnN0IGJhaWxPcHRpb24gPSBhcmd2LmJhaWwgPyAnIC0tYmFpbD0xJyA6ICcnO1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYFlBUk4gdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkgLS13YXRjaD1mYWxzZSR7YmFpbE9wdGlvbn1gO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgY29uc3QgYmFpbE9wdGlvbiA9IGFyZ3YuYmFpbCA/ICcgLS1iYWlsJyA6ICcnO1xuICAgICAgcmV0dXJuIGBidW4gdGVzdCAke3Rlc3RUYXJnZXR9JHtiYWlsT3B0aW9ufWA7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA5MDAwMCAtaSAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzOiBzdHJpbmcsIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9ICdCVU4gcGxheXdyaWdodCc7XG4gIGNvbnN0IHRhcmdldCA9IHRhcmdldHM/LmpvaW4oJyAnKSB8fCAndGVzdC9lMmUvJztcbiAgaWYgKCFwbGF5d3JpZ2h0QXJncy5zdGFydHNXaXRoKCd0ZXN0ICcpIHx8ICF0YXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oYCR7YmFzZX0gJHtwbGF5d3JpZ2h0QXJnc31gLCBiYWlsKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgndGVzdCAnLmxlbmd0aCkudHJpbSgpO1xuICBjb25zdCBwYXJ0cyA9IHJlc3QubGVuZ3RoID4gMCA/IHJlc3Quc3BsaXQoL1xccysvKSA6IFtdO1xuICBpZiAoIXBhcnRzWzBdIHx8IHBhcnRzWzBdLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgIHBhcnRzLnVuc2hpZnQodGFyZ2V0KTtcbiAgfSBlbHNlIHtcbiAgICBwYXJ0c1swXSA9IHRhcmdldDtcbiAgfVxuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oYCR7YmFzZX0gdGVzdCAke3BhcnRzLmpvaW4oJyAnKX1gLCBiYWlsKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oY29tbWFuZDogc3RyaW5nLCBiYWlsPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICghYmFpbCB8fCAhY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCB0ZXN0JykpIHtcbiAgICByZXR1cm4gY29tbWFuZDtcbiAgfVxuICBpZiAoLy0tbWF4LWZhaWx1cmVzKD86PXxcXHMpLy50ZXN0KGNvbW1hbmQpKSB7XG4gICAgcmV0dXJuIGNvbW1hbmQ7XG4gIH1cbiAgcmV0dXJuIGAke2NvbW1hbmR9IC0tbWF4LWZhaWx1cmVzPTFgO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzLCB0eXBlIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodENvbmZpZykge1xuICAgICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgc3RhcnRDb21tYW5kLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRlc3RUYXJnZXQgPSBhcmd2LnRhcmdldHMgJiYgYXJndi50YXJnZXRzLmxlbmd0aCA+IDAgPyBhcmd2LnRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgY29uc3QgYmFpbE9wdGlvbiA9IGFyZ3YuYmFpbCA/ICcgLS1iYWlsPTEnIDogJyc7XG5cbiAgICByZXR1cm4gYFlBUk4gY29uY3VycmVudGx5IC0ta2lsbC1vdGhlcnMgLS1yYXcgLS1zdWNjZXNzIGZpcnN0XG4gICAgICBcIiR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFcIlxuICAgICAgXCJ3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgdml0ZXN0IHJ1biAke3Rlc3RUYXJnZXR9IC0tY29sb3IgLS1wYXNzV2l0aE5vVGVzdHMgLS1hbGxvd09ubHkke2JhaWxPcHRpb259JHtzdWZmaXh9XCJgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnU3RhcnQgYXBwJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ2RldmVsb3BtZW50JztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERldihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0UyZSB0ZXN0IG1vZGU6IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGJhaWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0b3AgdGVzdHMgYWZ0ZXIgdGhlIGZpcnN0IGZhaWx1cmUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8XG4gIEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuPjtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuJyxcbiAgYnVpbGRlcjogeyAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMDtcblxuICAvLyBEZXRlY3QgdGVzdCBtb2RlcyBmcm9tIHRhcmdldCBwYXRoc1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5Vbml0ID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHM7XG4gIGNvbnN0IHNob3VsZFJ1bkUyZSA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHM7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiB1bmRlZmluZWQgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZTJlVGFyZ2V0ID0gZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cy5qb2luKCcgJykgOiAndGVzdC9lMmUvJztcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMsIGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIGNvbnN0IGUyZVRhcmdldCA9IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMuam9pbignICcpIDogJ3Rlc3QvZTJlLyc7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWhlYWRlZGAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwgeyBwbGF5d3JpZ2h0QXJnczogYHRlc3QgJHtlMmVUYXJnZXR9IC0taGVhZGVkYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHsgcGxheXdyaWdodEFyZ3M6IGB0ZXN0ICR7ZTJlVGFyZ2V0fSAtLWRlYnVnYCB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGBjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWAsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkNJIHx8PSAnMSc7XG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgYXJndikucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICAvLyBBdm9pZCBsYXVuY2hpbmcgZGV2IHNlcnZlcnMgZm9yIGJ1aWxkLW9ubHkgcGFja2FnZXM7IG9ubHkgc3RhcnQgYSBzZXJ2ZXIgd2hlbiBFMkUgbmVlZHMgaXQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBwcm9qZWN0Lmhhc0RvY2tlcmZpbGVcbiAgICAgICAgPyBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge30pXG4gICAgICAgIDogYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2LCB7fSk7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgIHNjcmlwdC5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIHtcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmludGVyZmFjZSBUcmVlS2lsbENvbW1hbmRBcmdzIHtcbiAgcGlkOiBudW1iZXI7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5jb25zdCBidWlsZGVyID0gKHlhcmdzOiBBcmd2KTogQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPiA9PlxuICB5YXJnc1xuICAgIC5wb3NpdGlvbmFsKCdwaWQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwcm9jZXNzIElEIHRvIGtpbGwuJyxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbignc2lnbmFsJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTaWduYWwgdG8gc2VuZCB0byB0aGUgcHJvY2VzcyB0cmVlLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6ICdTSUdURVJNJyxcbiAgICB9KSBhcyBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+O1xuXG5leHBvcnQgY29uc3QgdHJlZUtpbGxDb21tYW5kOiBDb21tYW5kTW9kdWxlPG9iamVjdCwgVHJlZUtpbGxDb21tYW5kQXJncz4gPSB7XG4gIGNvbW1hbmQ6ICd0cmVlLWtpbGwgPHBpZD4gW3NpZ25hbF0nLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIGdpdmVuIHByb2Nlc3MgYW5kIGFsbCBkZXNjZW5kYW50cycsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBhcmd2LnNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscztcbiAgICAgIGlmICghKHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpZ25hbDogJHtzaWduYWx9YCk7XG4gICAgICB9XG4gICAgICB0cmVlS2lsbChhcmd2LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gICAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgY29tbWFuZHMucHVzaCgnQlVOIHRzYyAtLW5vRW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHlyaWdodCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICAgICAgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0IHx8IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KVxuICAgICAgKSB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQnKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICAgIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIHByb2Nlc3MuZXhpdChmaW5hbEV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoa2lsbFBvcnRJZk5vbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0cmVlS2lsbENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2Nlc3MucGlkfSkgZHVyaW5nIHNodXRkb3duOmAsIGVycm9yKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbImNhY2hlZEVudlZhcnMiLCJNYXAiLCJyZWFkRW52RmlsZSIsImZpbGVQYXRoIiwiY2FjaGVkIiwiZ2V0IiwicGFyc2VkIiwiY29uZmlnIiwicGF0aCIsInJlc29sdmUiLCJwcm9jZXNzRW52Iiwic2V0IiwiaXNFcnJub0V4Y2VwdGlvbiIsImVycm9yIiwiRXJyb3IiLCJ0cmVlS2lsbCIsInBpZCIsInNpZ25hbCIsIk51bWJlciIsImlzSW50ZWdlciIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInJ1bkNvbW1hbmQiLCJTdHJpbmciLCJtYXhCdWZmZXIiLCJ0aW1lb3V0IiwiaXNOb1N1Y2hQcm9jZXNzRXJyb3IiLCJraWxsVHJlZU9uV2luZG93cyIsImRlc2NlbmRhbnRzIiwicm9vdFBpZCIsInN0ZG91dCIsImNoaWxkcmVuQnlQYXJlbnQiLCJwc091dHB1dCIsImxpbmUiLCJzcGxpdCIsIm1hdGNoZWQiLCJleGVjIiwiY2hpbGRQaWQiLCJwYXJlbnRQaWQiLCJjaGlsZHJlbiIsInB1c2giLCJidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAiLCJxdWV1ZSIsImluZGV4IiwibGVuZ3RoIiwiY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsInRhcmdldFBpZHMiLCJ0b1JldmVyc2VkIiwidG9DaGlsZHJlbkZpcnN0UGlkcyIsInRhcmdldFBpZCIsImtpbGxJZk5lZWRlZCIsImtpbGwiLCJjb21tYW5kIiwiYXJncyIsIm9wdGlvbnMiLCJleGVjRmlsZVN5bmMiLCJlbmNvZGluZyIsInN0ZGlvIiwic3RkZXJyIiwiQnVmZmVyIiwiaXNCdWZmZXIiLCJ0b1N0cmluZyIsImV4dHJhY3RTdGRlcnIiLCJDb21tYW5kRXhlY3V0aW9uRXJyb3IiLCJjb2RlIiwic3RhdHVzIiwidG9FeGl0Q29kZSIsInRlc3QiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwiam9pbiIsInRoaXMiLCJuYW1lIiwiYXN5bmMiLCJzcGF3bkFzeW5jIiwiUHJvbWlzZSIsInJlamVjdCIsInByb2MiLCJzcGF3biIsInNldEVuY29kaW5nIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsInZlcmJvc2UiLCJjb25zb2xlIiwiaW5mbyIsIndhcm4iLCJjbGVhbnVwU2lnbmFscyIsInNpZ25hbEhhbmRsZXJzIiwicmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzIiwicmVtb3ZlTGlzdGVuZXIiLCJoYW5kbGVyIiwiY2xlYXIiLCJraWxsT25FeGl0IiwiaGFuZGxlU2lnbmFsIiwibGlzdGVuZXJDb3VudCIsInJlbW92ZUFsbExpc3RlbmVycyIsInVuZGVmaW5lZCIsImlucHV0Iiwic3RkaW4iLCJlbmQiLCJ0IiwicyIsImkiLCJlIiwibiIsImVudHJpZXMiLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm1lc3NhZ2UiLCJzdGFjayIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwibWFwIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc05hTiIsImlzRmluaXRlIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsbCIsInNsaWNlIiwiT2JqZWN0IiwiY2FjaGVEdXJhdGlvbiIsIlBPU0lUSVZFX0lORklOSVRZIiwiZ2V0Q2FjaGVLZXkiLCJraW5kIiwibm93IiwiY2FsbCIsImlzQ0kiLCJjaUVudiIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsIm1lbW9pemVPbmUiLCJhcmd2IiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsImZzIiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImVudiIsImVudlZhcnMiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImN3ZCIsImVudlBhdGhzIiwiZW52UGF0aCIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZsYXRNYXAiLCJmaWx0ZXIiLCJyZWxhdGl2ZSIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcyIsImtleXMiLCJrZXkiLCJ2YWx1ZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJleHBhbmQiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJjb3VudCIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicHJpc21hIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0Iiwidml0ZXN0IiwiaGFzQmlvbWUiLCJoYXNEZXBlbmRlbmN5IiwiaGFzRXNsaW50IiwicHJlZmVycmVkTGludGVyIiwiaGFzUGxheXdyaWdodENvbmZpZyIsInNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0IiwiQ0kiLCJjb25maWdQYXRoIiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsInBhY2thZ2VOYW1lIiwiaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24iLCJvcHRpb25hbERlcGVuZGVuY2llcyIsInBlZXJEZXBlbmRlbmNpZXMiLCJyb290UGFja2FnZUpzb24iLCJmaW5kU2VsZlByb2plY3QiLCJmaW5kRGVzY2VuZGFudFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwiZW5kc1dpdGgiLCJyb290Iiwic2VsZiIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwicHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJwcm9qZWN0IiwiY2hhbGsiLCJyZWQiLCJjYW5Ta2lwIiwiY2FjaGVGaWxlUGF0aCIsImNvbnRlbnRIYXNoIiwiY2FjaGVEaXJlY3RvcnlQYXRoIiwicHJvbWlzZXMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImhhc2giLCJjcmVhdGVIYXNoIiwiY29tbWl0SGFzaCIsImNoaWxkX3Byb2Nlc3MiLCJleGVjU3luYyIsInRyaW0iLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiaGFzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInNwYXduU3luYyIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJzb21lIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJncmVlbiIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwia2lsbFBvcnRJZk5vbkNpQ29tbWFuZCIsImJ1aWxkZXIiLCJleGl0IiwicG9ydEVudiIsIlBPUlQiLCJwb3J0Iiwia2lsbFBvcnRQcm9jZXNzIiwia2lsbFBvcnRJZk5vbkNpIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJwcmludFN0YXJ0IiwicHJpbnRhYmxlIiwicnVubmFibGUiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwiY29uZmlndXJlRW52Iiwib25TaWduYWwiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsIiwicnVuQW5kV2FpdEZvclJldHVyblZhbHVlIiwib3V0IiwibmV3U2NyaXB0IiwiYmxpdHoiLCJwcmludGFibGVTY3JpcHQiLCJmaXhCdW5Db21tYW5kIiwicnVubmFibGVTY3JpcHQiLCJjYXNjYWRlT3B0aW9uIiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsIm5ld0VudiIsImNpIiwiZm9yY2VDb2xvciIsIkZPUkNFX0NPTE9SIiwiYmlvbWVFeHRlbnNpb25zIiwiZXNsaW50RXh0ZW5zaW9ucyIsInByZXR0aWVyRXh0ZW5zaW9ucyIsInByZXR0aWVyT25seUV4dGVuc2lvbnMiLCJleHQiLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImZpbGVzIiwibGludEZpbGVQYXRoc0J5UHJvamVjdCIsInByZXR0aWVyRmlsZVBhdGhzIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJwcmV0dGllckFyZ3MiLCJzb3J0UGFja2FnZUpzb25BcmdzIiwibWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyIsImZpbGUiLCJleHRlbnNpb24iLCJleHRuYW1lIiwiZmluZE93bmluZ1Byb2plY3QiLCJzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24iLCJsaW50RmlsZVBhdGhzIiwibmVlZHNQcmV0dGllciIsImlzUG90ZW50aWFsTGludFRhcmdldCIsInNlbGZEaXJQYXRoIiwicHJvamVjdFBhdHRlcm4iLCJidWlsZFByZXR0aWVyQXJncyIsImxpbnRQcm9taXNlcyIsImxpbnRSdW5PcHRpb25zIiwiYnVpbGRMaW50Q29tbWFuZCIsImxpbnRFeGl0Q29kZXMiLCJhbGwiLCJidWlsZFNoZWxsQ29tbWFuZCIsImJpb21lQXJncyIsIm93bmluZ1Byb2plY3QiLCJzdGFydHNXaXRoIiwiYXJnIiwic2hlbGxFc2NhcGVBcmd1bWVudCIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwib3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQiLCJvdXRzaWRlIiwiZGVwcyIsIm9wdGltaXplRGV2RGVwZW5kZW5jaWVzIiwib3B0aW1pemVTY3JpcHRzIiwib3B0aW1pemVSb290UHJvcHMiLCJkaXN0RGlyUGF0aCIsImRldkRlcHMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsIm5hbWVXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwiY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJyZW1vdmVkU2NyaXB0cyIsImNvbnRlbnQiLCJwcml2YXRlIiwicHVibGlzaENvbmZpZyIsInByZXR0aWVyIiwiRklMRV9TQ0hFTUEiLCJQT1NTSUJMRV9QUklTTUFfUEFUSFMiLCJzY2hlbWFQYXRoIiwiZGJQYXRoIiwiZ2V0RGF0YWJhc2VEaXJQYXRoIiwiZ2V0UHJpc21hQmFzZURpciIsInByaXNtYVNjcmlwdHMiLCJjbGVhblVwTGl0ZXN0cmVhbSIsImRlcGxveSIsImFkZGl0aW9uYWxPcHRpb25zIiwiZGVwbG95Rm9yY2UiLCJyZW1vdmVEYkNvbW1hbmQiLCJsaXN0QmFja3VwcyIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInN0ZXBzIiwiY2xlYW51cENvbW1hbmQiLCJkYlVybCIsIkRBVEFCQVNFX1VSTCIsInJhd0RiUGF0aCIsImJhc2VEaXIiLCJhYnNvbHV0ZVBhdGgiLCJpc0Fic29sdXRlIiwiY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQiLCJyZXNldENvbW1hbmQiLCJCb29sZWFuIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImRlZmF1bHQiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZCIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXN0QmFja3Vwc0NvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmRQcmlzbWFQcm9qZWN0cyIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWciLCJ1bmtub3duT3B0aW9ucyIsImV4dHJhY3RVbmtub3duT3B0aW9ucyIsIm91dHB1dCIsInJlc3RvcmVkIiwiZnVsbENvbW1hbmQiLCJ0cmltRW5kIiwicmVxdWlyZWRFbnZWYXJzIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSIsIm1pc3NpbmdFbnZWYXJzIiwicmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCIsImxpdGVzdHJlYW1Db25maWciLCJ3cml0ZUZpbGVTeW5jIiwicmVhc29uIiwiZmlsdGVyZWQiLCJrbm93bk9wdGlvbnMiLCJzaGFyZWRPcHRpb25LZXlzIiwic2hhcmVkT3B0aW9uQWxpYXNlcyIsIm9wdGlvbiIsImFsbEtub3duT3B0aW9ucyIsImtlYmFiQ2FzZUtleSIsIm1hdGNoIiwidG9Mb3dlckNhc2UiLCJpdGVtIiwicmV0cnlDb21tYW5kIiwicmV0cnkiLCJjbWRBbmRBcmdzIiwibGFzdFN0YXR1cyIsInllbGxvdyIsInNldHVwQ29tbWFuZCIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9zIiwicGFja2FnZXMiLCJpc0ZpbGUiLCJ2ZXJzaW9uIiwicHJvbWlzZUFsbCIsInBsYXl3cmlnaHQiLCJzZXR1cCIsInRvRGV2TnVsbCIsInNpbGVudCIsImtpbGxlZCIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiYXZhaWxhYmxlIiwiaG9zdCIsInByb2JlUG9ydCIsImlzUG9ydEF2YWlsYWJsZSIsImtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2VzcyIsImtpbGxGdW5jIiwiZmlsdGVyQXJncyIsImNvbnRhaW5lcklkcyIsImlkIiwibGlzdERvY2tlckNvbnRhaW5lcklkcyIsInJlbW92ZURvY2tlckNvbnRhaW5lcnMiLCJzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0IiwiY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MiLCJyYXdQb3J0Iiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwib25jZSIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkSW1hZ2UiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJzdG9wQWxsIiwiQmFzZVNjcmlwdHMiLCJzaG91bGRXYWl0QW5kT3BlbkFwcCIsImJ1aWxkRG9ja2VyIiwic3RhcnREZXYiLCJzdGFydERldlByb3RlY3RlZCIsIndhaXRBbmRPcGVuQXBwIiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkIiwic3RhcnRUZXN0Iiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJlY29zeXN0ZW1Db25maWdQYXRoIiwiZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJjb21tYW5kcyIsImNtZCIsInRlc3RFMkVEZXYiLCJ0ZXN0RTJFUHJvdGVjdGVkIiwidGVzdEUyRVByb2R1Y3Rpb24iLCJ0ZXN0RTJFRG9ja2VyIiwidGVzdFN0YXJ0Iiwid2FpdEFwcCIsInN0YXJ0Q29tbWFuZCIsInBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodENvbW1hbmQiLCJ0YXJnZXRzIiwiYmFpbCIsImJhc2UiLCJ0YXJnZXQiLCJhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbiIsInJlc3QiLCJwYXJ0cyIsInVuc2hpZnQiLCJidWlsZFBsYXl3cmlnaHRDb21tYW5kIiwidGVzdFVuaXQiLCJ0ZXN0VGFyZ2V0IiwiYmxpdHpTY3JpcHRzIiwiaHR0cFNlcnZlclNjcmlwdHMiLCJ3YXRjaCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwiXzEiLCJfMiIsInJlbWl4U2NyaXB0cyIsInZpdGVTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsInZpdGUiLCJ0ZXN0Q29tbWFuZCIsImUyZSIsImNob2ljZXMiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkFsbFRlc3RzIiwiaGFzRTJlVGFyZ2V0cyIsImhhc1VuaXRUYXJnZXRzIiwic2hvdWxkUnVuVW5pdCIsInNob3VsZFJ1bkUyZSIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwidGVzdE9uRG9ja2VyIiwiZTJlVGFyZ2V0IiwiV0JfRE9DS0VSIiwidGVzdE9uQ2lDb21tYW5kIiwidGVzdE9uQ2kiLCJ0cmVlS2lsbENvbW1hbmQiLCJwb3NpdGlvbmFsIiwiZGVtYW5kT3B0aW9uIiwiY29uc3RhbnRzIiwic2lnbmFscyIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwibmV4dERpclBhdGgiLCJybVN5bmMiLCJmb3JjZSIsImV4aXRDb2RlcyIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwidXJsIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCIsInNodXR0aW5nRG93biJdLCJtYXBwaW5ncyI6IjRoQkFtSUEsTUFBTUEsRUFBZ0IsSUFBSUMsSUFFMUIsU0FBU0MsRUFBWUMsR0FDbkIsTUFBTUMsRUFBU0osRUFBY0ssSUFBSUYsR0FDakMsR0FBSUMsRUFBUSxPQUFPQSxFQUVuQixNQUFNRSxFQUFTQyxFQUFPLENBQUVDLEtBQU1BLEVBQUtDLFFBQVFOLEdBQVdPLFdBQVksQ0FBQSxJQUFNSixRQUFVLENBQUEsRUFFbEYsT0FEQU4sRUFBY1csSUFBSVIsRUFBVUcsR0FDckJBLENBQ1QsQ0M1SU8sU0FBU00sRUFBaUJDLEdBQy9CLE9BQU9BLGFBQWlCQyxPQUFTLFNBQVVELENBQzdDLENDR08sU0FBU0UsRUFBU0MsRUFBYUMsRUFBeUIsV0FDN0QsSUFBS0MsT0FBT0MsVUFBVUgsSUFBUUEsR0FBTyxFQUNuQyxNQUFNLElBQUlGLE1BQU0sZ0JBQWdCRSxLQUdsQyxHQUF5QixVQUFyQkksUUFBUUMsU0FFVixZQXFCSixTQUEyQkwsR0FDekIsSUFDRU0sRUFBVyxXQUFZLENBQUMsT0FBUUMsT0FBT1AsR0FBTSxLQUFNLE1BQU8sQ0FDeERRLFVBQVcsUUFDWEMsUUFBUyxLQUViLENBQUUsTUFBT1osR0FDUCxHQUFJYSxFQUFxQmIsR0FDdkIsT0FFRixNQUFNQSxDQUNSLENBQ0YsQ0FsQ0ljLENBQWtCWCxHQUlwQixNQUFNWSxFQWdDUixTQUErQkMsR0FDN0IsTUFBTUMsT0FBRUEsR0FBV1IsRUFDakIsS0FDQSxDQUFDLE1BQU8sY0FFUixDQUFFRSxVQUFXLFFBQWFDLFFBQVMsTUFFL0JNLEVDdERELFNBQWtDQyxHQUN2QyxNQUFNRCxFQUFtQixJQUFJOUIsSUFDN0IsSUFBSyxNQUFNZ0MsS0FBUUQsRUFBU0UsTUFBTSxNQUFPLENBQ3ZDLE1BQU1DLEVBQVUsd0JBQXdCQyxLQUFLSCxHQUM3QyxJQUFLRSxFQUNILFNBR0YsTUFBTUUsRUFBV25CLE9BQU9pQixFQUFRLElBQzFCRyxFQUFZcEIsT0FBT2lCLEVBQVEsSUFDM0JJLEVBQVdSLEVBQWlCMUIsSUFBSWlDLEdBQ2xDQyxFQUNGQSxFQUFTQyxLQUFLSCxHQUVkTixFQUFpQnBCLElBQUkyQixFQUFXLENBQUNELEdBRXJDLENBQ0EsT0FBT04sQ0FDVCxDRG9DMkJVLENBQXlCWCxHQUNsRCxPQ25DSyxTQUErQkQsRUFBaUJFLEdBQ3JELE1BQU1ILEVBQXdCLEdBQ3hCYyxFQUFRLElBQUtYLEVBQWlCMUIsSUFBSXdCLElBQVksSUFDcEQsSUFBSWMsRUFBUSxFQUNaLEtBQU9BLEVBQVFELEVBQU1FLFFBQVEsQ0FDM0IsTUFBTTVCLEVBQU0wQixFQUFNQyxHQUNsQkEsR0FBUyxFQUNUZixFQUFZWSxLQUFLeEIsR0FDakIwQixFQUFNRixRQUFTVCxFQUFpQjFCLElBQUlXLElBQVEsR0FDOUMsQ0FDQSxPQUFPWSxDQUNULENEd0JTaUIsQ0FBNkJoQixFQUFTRSxFQUMvQyxDQXpDc0JlLENBQXNCOUIsR0FDcEMrQixFQTBDUixTQUE2Qi9CLEVBQWFZLEdBQ3hDLE1BQU1tQixFQUFhbkIsRUFBWW9CLGFBRS9CLE9BREFELEVBQVdQLEtBQUt4QixHQUNUK0IsQ0FDVCxDQTlDcUJFLENBQW9CakMsRUFBS1ksR0FDNUMsSUFBSyxNQUFNc0IsS0FBYUgsRUFDdEJJLEVBQWFELEVBQVdqQyxFQUU1QixDQUVBLFNBQVNrQyxFQUFhbkMsRUFBYUMsR0FDakMsSUFDRUcsUUFBUWdDLEtBQUtwQyxFQUFLQyxFQUNwQixDQUFFLE1BQU9KLEdBQ1AsR0FBSWEsRUFBcUJiLEdBQ3ZCLE9BRUYsTUFBTUEsQ0FDUixDQUNGLENBaUNBLFNBQVNTLEVBQ1ArQixFQUNBQyxFQUNBQyxHQUVBLElBT0UsTUFBTyxDQUFFekIsT0FOTTBCLEVBQWFILEVBQVMsSUFBSUMsR0FBTyxDQUM5Q0csU0FBVSxPQUNWakMsVUFBVytCLEdBQVMvQixVQUNwQkMsUUFBUzhCLEdBQVM5QixRQUNsQmlDLE1BQU8sQ0FBQyxTQUFVLE9BQVEsVUFFWEMsT0FBUSxHQUMzQixDQUFFLE1BQU85QyxHQUNQLE1BQU04QyxFQTZCVixTQUF1QjlDLEdBQ3JCLEdBQXFCLGlCQUFWQSxHQUFnQyxPQUFWQSxLQUFvQixXQUFZQSxHQUMvRCxNQUFPLEdBR1QsTUFBTThDLEVBQVU5QyxFQUFvQzhDLE9BQ3BELEdBQXNCLGlCQUFYQSxFQUNULE9BQU9BLEVBRVQsR0FBSUMsT0FBT0MsU0FBU0YsR0FDbEIsT0FBT0EsRUFBT0csU0FBUyxRQUV6QixNQUFPLEVBQ1QsQ0ExQ21CQyxDQUFjbEQsR0FDN0IsTUFBTSxJQUFJbUQsRUFBc0JYLEVBQVNDLEVBQU1LLEVBZW5ELFNBQW9COUMsR0FDbEIsR0FBSUQsRUFBaUJDLEdBQ25CLE9BQU9BLEVBQU1vRCxLQUVmLEdBQXFCLGlCQUFWcEQsR0FBZ0MsT0FBVkEsR0FBa0IsV0FBWUEsRUFBTyxDQUNwRSxNQUFNcUQsRUFBVXJELEVBQThCcUQsT0FDOUMsR0FBc0IsaUJBQVhBLEVBQ1QsT0FBT0EsQ0FFWCxDQUNBLE1BQ0YsQ0ExQjJEQyxDQUFXdEQsR0FDcEUsQ0FDRixDQUVBLFNBQVNhLEVBQXFCYixHQUM1QixTQUFJRCxFQUFpQkMsSUFBeUIsVUFBZkEsRUFBTW9ELE9BSWpDcEQsYUFBaUJtRCxHQUNaLHlFQUF5RUksS0FBS3ZELEVBQU04QyxPQUcvRixDQThCQSxNQUFNSyxVQUE4QmxELE1BSWxDdUQsV0FBQUEsQ0FBWWhCLEVBQWlCQyxFQUF5QkssRUFBZ0JNLEdBQ3BFSyxNQUFNLG1CQUFtQmpCLEtBQVdDLEVBQUtpQixLQUFLLFFBQzlDQyxLQUFLQyxLQUFPLHdCQUNaRCxLQUFLYixPQUFTQSxFQUNkYSxLQUFLUCxLQUFPQSxDQUNkLEVFL0RLUyxlQUFlQyxFQUNwQnRCLEVBQ0FDLEVBQ0FDLEdBRUEsT0FBTyxJQUFJcUIsUUFBUSxDQUFDbkUsRUFBU29FLEtBQzNCLElBQ0UsTUFBTUMsRUFBT0MsRUFBTTFCLEVBQVNDLEdBQVEsR0FBSUMsR0FBVyxJQUduRHVCLEVBQUtoRCxRQUFRa0QsY0FBYyxRQUUzQkYsRUFBS25CLFFBQVFxQixjQUFjLFFBRTNCLElBQUlsRCxFQUFTLEdBQ1Q2QixFQUFTLEdBQ2JtQixFQUFLaEQsUUFBUW1ELEdBQUcsT0FBU0MsSUFDdkJwRCxHQUFVb0QsRUFDTjNCLEdBQVM0QixnQkFDWC9ELFFBQVFVLE9BQU9zRCxNQUFNRixLQUd6QkosRUFBS25CLFFBQVFzQixHQUFHLE9BQVNDLElBQ25CM0IsR0FBUzhCLGlCQUNYdkQsR0FBVW9ELEVBRVZ2QixHQUFVdUIsRUFFUjNCLEdBQVMrQixnQkFDWGxFLFFBQVF1QyxPQUFPeUIsTUFBTUYsS0FJekIsSUFBSUssR0FBVSxFQUNkLE1BQU1DLEVBQWNBLEtBQ2xCLElBQUlELEdBQVlULEVBQUs5RCxJQUFyQixDQUVBdUUsR0FBVSxFQUNOaEMsR0FBU2tDLFNBQ1hDLFFBQVFDLEtBQUssWUFBWWIsRUFBSzlELFFBRWhDLElBQ0VELEVBQVMrRCxFQUFLOUQsSUFDaEIsQ0FBRSxNQUFPSCxHQUNIMEMsR0FBU2tDLFNBQ1hDLFFBQVFFLEtBQUssc0JBQXNCZCxFQUFLOUQsT0FBUUgsRUFFcEQsQ0FaMEIsR0FjdEJnRixFQUNpQixVQUFyQnpFLFFBQVFDLFNBQXVCLENBQUMsU0FBVSxXQUFhLENBQUMsU0FBVSxVQUFXLFdBQ3pFeUUsRUFBaUIsSUFBSTdGLElBQ3JCOEYsRUFBMkJBLEtBQy9CM0UsUUFBUTRFLGVBQWUsYUFBY1IsR0FDckMsSUFBSyxNQUFPdkUsRUFBUWdGLEtBQVlILEVBQzlCMUUsUUFBUTRFLGVBQWUvRSxFQUFRZ0YsR0FFakNILEVBQWVJLFNBRWpCLEdBQUkzQyxHQUFTNEMsV0FBWSxDQUN2Qi9FLFFBQVE2RCxHQUFHLGFBQWNPLEdBQ3pCLElBQUssTUFBTXZFLEtBQVU0RSxFQUFnQixDQUNuQyxNQUFNTyxFQUFlQSxLQUNuQlosSUFDQU8sSUFDc0MsSUFBbEMzRSxRQUFRaUYsY0FBY3BGLElBQ3hCRyxRQUFRZ0MsS0FBS2hDLFFBQVFKLElBQUtDLElBRzlCNkUsRUFBZW5GLElBQUlNLEVBQVFtRixHQUMzQmhGLFFBQVE2RCxHQUFHaEUsRUFBUW1GLEVBQ3JCLENBQ0YsQ0FFQXRCLEVBQUtHLEdBQUcsUUFBVXBFLElBQ2hCa0YsSUFDQWpCLEVBQUt3QixtQkFBbUIsU0FDeEJ6QixFQUFPaEUsS0FFVGlFLEVBQUtHLEdBQUcsUUFBUyxDQUFDaEIsRUFBcUJoRCxLQUNyQzhFLFNBQ2lCUSxJQUFiekIsRUFBSzlELElBQ1A2RCxFQUFPLElBQUkvRCxNQUFNLHdCQUVqQkwsRUFBUSxDQUNOTyxJQUFLOEQsRUFBSzlELElBQ1ZjLFNBQ0E2QixTQUNBTyxPQUFRRCxFQUNSaEQsYUFLRnNDLEdBQVNpRCxRQUNYMUIsRUFBSzJCLE9BQU9yQixNQUFNN0IsRUFBUWlELE9BQzFCMUIsRUFBSzJCLE9BQU9DLE1BRWhCLENBQUUsTUFBTzdGLEdBRVBnRSxFQUFPaEUsRUFDVCxHQUVKOzs7Ozs7OztHQ25LQSxNQUFNOEYsRUFBRSxJQUFJLG9CQUFvQkMsRUFBRSxDQUFDLEVBQUUsS0FBSyxPQUFPLFdBQVdDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJQyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsV0FBVyxXQUFXLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxXQUFXLE1BQU0sV0FBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksV0FBVyxNQUFNLFdBQVcsTUFBTSxXQUFXLE1BQU0sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFLFdBQVcsV0FBVyxXQUFXLFdBQVcsTUFBTSxXQUFXLFdBQVcsRUFBRSxXQUFXLFlBQWtFLE1BQU1DLEVBQUVKLElBQUksTUFBTUMsRUFBRSxHQUFHLElBQUksTUFBTUMsRUFBRUMsS0FBS0gsRUFBRUssVUFBVUosRUFBRUMsR0FBR0MsRUFBRSxPQUFPRixHQUFHLE1BQU1LLEVBQUVDLE9BQU8sR0FBR04sRUFBRSxHQUFHTyxPQUFNLEVBQUdDLFdBQVUsRUFBR0MsTUFBTSxFQUFFQyxNQUFNLEVBQUVDLGNBQWMsRUFBRSxXQUFBbEQsQ0FBWXNDLEVBQUVDLEVBQUVDLEdBQUdyQyxLQUFLZ0QsUUFBUVosRUFBRXBDLEtBQUtpRCxXQUFXWixFQUFFckMsS0FBS2tELFdBQVcsTUFBTWYsR0FBRyxJQUFJLEVBQUVuQyxLQUFLbUQsVUFBVW5ELEtBQUtrRCxZQUFZLEVBQUVsRCxLQUFLb0QsYUFBYWYsR0FBRyxFQUFFckMsS0FBS3FELFlBQVksR0FBR2hCLElBQUksRUFBRSxJQUFJLElBQUlGLEVBQUUsRUFBRUEsRUFBRSxLQUFLQSxFQUFFbkMsS0FBS29DLEVBQUVELEdBQUcsQ0FBQyxDQUFDLE1BQUFtQixDQUFPbkIsR0FBRyxHQUFHbkMsS0FBSzRDLFVBQVUsTUFBTSxJQUFJdEcsTUFBTSwyQkFBMkIsTUFBTThGLEVBQUVwQyxLQUFLMEMsT0FBT0osRUFBRXRDLEtBQUttRCxVQUFVSSxFQUFFcEIsRUFBRS9ELE9BQU9tRSxFQUFFdkMsS0FBS2tELFdBQVdULEVBQUV6QyxLQUFLb0MsRUFBRSxJQUFJb0IsRUFBRUMsRUFBRUMsRUFBRSxFQUFFLEtBQUtBLEVBQUVILEdBQUcsQ0FBQyxHQUFHdkQsS0FBSzJDLE1BQU0sSUFBSTNDLEtBQUsyQyxPQUFNLEVBQUdQLEVBQUUsR0FBR3BDLEtBQUs2QyxNQUFNVyxFQUFFLEVBQUVBLEVBQUVqQixFQUFFLElBQUlpQixFQUFFcEIsRUFBRW9CLEdBQUcsRUFBRSxJQUFJQSxFQUFFeEQsS0FBSzhDLE1BQU1ZLEVBQUVILEdBQUdDLEVBQUVsQixJQUFJb0IsRUFBRUQsRUFBRXRCLEVBQUV3QixZQUFZRCxJQUFJLEVBQUVELEVBQUUsSUFBSXJCLEVBQUVvQixHQUFHLElBQUlDLEdBQUdwQixFQUFFLEVBQUVtQixLQUFLQyxFQUFFLE1BQU1yQixFQUFFb0IsR0FBRyxLQUFLLElBQUlDLEdBQUcsSUFBSXBCLEVBQUUsRUFBRW1CLEtBQUtwQixFQUFFb0IsR0FBRyxLQUFLLElBQUksR0FBR0MsSUFBSXBCLEVBQUUsRUFBRW1CLE1BQU1DLEVBQUUsT0FBT0EsR0FBRyxPQUFPckIsRUFBRW9CLEdBQUcsS0FBSyxJQUFJQyxHQUFHLEtBQUtwQixFQUFFLEVBQUVtQixLQUFLcEIsRUFBRW9CLEdBQUcsS0FBSyxJQUFJQyxHQUFHLEVBQUUsS0FBS3BCLEVBQUUsRUFBRW1CLEtBQUtwQixFQUFFb0IsR0FBRyxLQUFLLElBQUksR0FBR0MsSUFBSXBCLEVBQUUsRUFBRW1CLE9BQU9DLEVBQUUsUUFBUSxLQUFLQSxJQUFJLEdBQUcsTUFBTXRCLEVBQUV3QixjQUFjRCxJQUFJLElBQUl0QixFQUFFb0IsR0FBRyxLQUFLLElBQUlDLEdBQUcsS0FBS3BCLEVBQUUsRUFBRW1CLEtBQUtwQixFQUFFb0IsR0FBRyxLQUFLLElBQUlDLEdBQUcsR0FBRyxLQUFLcEIsRUFBRSxFQUFFbUIsS0FBS3BCLEVBQUVvQixHQUFHLEtBQUssSUFBSUMsR0FBRyxFQUFFLEtBQUtwQixFQUFFLEVBQUVtQixLQUFLcEIsRUFBRW9CLEdBQUcsS0FBSyxJQUFJLEdBQUdDLElBQUlwQixFQUFFLEVBQUVtQixNQUFNLEdBQUd4RCxLQUFLK0MsY0FBY1MsRUFBRUEsR0FBR2xCLEVBQUUsQ0FBQyxJQUFJdEMsS0FBSzhDLE1BQU1VLEVBQUVsQixFQUFFdEMsS0FBSzZDLE1BQU1ULEVBQUVHLEdBQUdpQixFQUFFLEVBQUVBLEVBQUVqQixJQUFJaUIsRUFBRWYsRUFBRWUsSUFBSXBCLEVBQUVvQixHQUFHSSxFQUFFbkIsR0FBR3pDLEtBQUsyQyxPQUFNLENBQUUsTUFBTTNDLEtBQUs4QyxNQUFNVSxDQUFDLENBQUMsT0FBT3hELElBQUksQ0FBQyxRQUFBNkQsR0FBVyxHQUFHN0QsS0FBSzRDLFVBQVUsT0FBTzVDLEtBQUs0QyxXQUFVLEVBQUcsTUFBTVQsRUFBRW5DLEtBQUswQyxPQUFPLElBQUlOLEVBQUVwQyxLQUFLK0MsY0FBYyxNQUFNVixFQUFFckMsS0FBS2tELFdBQVdaLEVBQUV0QyxLQUFLb0MsRUFBRSxHQUFHRCxFQUFFQyxHQUFHLElBQUlwQyxLQUFLZ0QsUUFBUSxFQUFFWixHQUFHcEMsS0FBSytDLGdCQUFnQi9DLEtBQUttRCxVQUFVLElBQUloQixFQUFFLEdBQUdBLEVBQUVFLEdBQUdELEVBQUUsRUFBRUEsRUFBRUMsRUFBRSxJQUFJRCxFQUFFRCxFQUFFQyxHQUFHLEVBQUUsSUFBSUQsRUFBRUUsRUFBRSxJQUFJLFdBQVdELEVBQUUsRUFBRUEsRUFBRUMsSUFBSUQsRUFBRUUsRUFBRUYsSUFBSUQsRUFBRUMsR0FBR3dCLEVBQUV0QixFQUFFLENBQUMsR0FBQXdCLEdBQU05RCxLQUFLNkQsV0FBVyxNQUFNekIsRUFBRXBDLEtBQUtrRCxXQUFXLElBQUliLEVBQUVyQyxLQUFLb0MsRUFBRSxNQUFNRSxFQUFFdEMsS0FBS29ELGFBQWFHLEVBQUV2RCxLQUFLcUQsV0FBVyxJQUFJWixFQUFFZSxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxHQUFHLEtBQUtELEVBQUVuQixHQUFHLENBQUMsSUFBSWtCLEVBQUUsRUFBRUEsRUFBRXBCLEdBQUdxQixFQUFFbkIsSUFBSWtCLElBQUlDLEVBQUVoQixFQUFFSixFQUFFbUIsR0FBR0UsR0FBR3ZCLEVBQUVNLEdBQUcsRUFBRSxJQUFJTixFQUFFLEdBQUdNLEdBQUdOLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEVBQUUsSUFBSU4sRUFBRU0sR0FBRyxHQUFHLElBQUlOLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEdBQUcsSUFBSU4sRUFBRU0sR0FBRyxHQUFHLElBQUlnQixFQUFFckIsSUFBSSxJQUFJQyxFQUFFRSxFQUFFRixHQUFHdUIsRUFBRXZCLEdBQUdtQixFQUFFLEVBQUUsQ0FBQyxPQUFPRCxJQUFJZCxFQUFFSixFQUFFbUIsR0FBR0UsR0FBR3ZCLEVBQUVNLEdBQUcsRUFBRSxJQUFJTixFQUFFLEdBQUdNLEdBQUdjLEVBQUUsSUFBSUcsR0FBR3ZCLEVBQUVNLEdBQUcsR0FBRyxJQUFJTixFQUFFTSxHQUFHLEVBQUUsS0FBS2MsRUFBRSxJQUFJRyxHQUFHdkIsRUFBRU0sR0FBRyxHQUFHLElBQUlOLEVBQUVNLEdBQUcsR0FBRyxNQUFNaUIsQ0FBQyxFQUFFLE1BQU1FLEVBQUUsU0FBU3pCLEdBQUcsSUFBSUMsRUFBRUMsRUFBRWtCLEVBQUVoQixFQUFFRSxFQUFFbUIsRUFBRUosRUFBRUMsRUFBRUMsRUFBRUssRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBRyxJQUFJN0QsRUFBRSxFQUFFQSxFQUFFLEdBQUdBLEdBQUcsRUFBRWhCLEVBQUVKLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJTSxFQUFFTixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXlCLEVBQUV6QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXFCLEVBQUVyQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXNCLEVBQUV0QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSXVCLEVBQUV2QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTRCLEVBQUU1QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSTZCLEVBQUU3QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSThCLEVBQUU5QixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSStCLEVBQUUvQixFQUFFLEdBQUdBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUMsRUFBRTZCLEdBQUdMLEdBQUcsRUFBRUosSUFBSSxJQUFJbkIsRUFBRTZCLEdBQUdWLEdBQUcsRUFBRUksSUFBSSxJQUFJekIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFRyxHQUFHa0IsR0FBRyxFQUFFQyxJQUFJLElBQUlyQixFQUFFSSxHQUFHaUIsR0FBRyxFQUFFRCxJQUFJLElBQUl0QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUV3QixHQUFHRyxHQUFHLEVBQUVDLElBQUksSUFBSTNCLEVBQUVtQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSTVCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXFCLEdBQUdRLEdBQUcsRUFBRUMsSUFBSSxJQUFJN0IsRUFBRXFCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJOUIsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFMkIsR0FBR3hCLEdBQUcsRUFBRUUsSUFBSSxJQUFJSixFQUFFMkIsR0FBR3ZCLEdBQUcsRUFBRUYsSUFBSSxJQUFJSixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUU4QixFQUFFaEMsRUFBRSxHQUFHaUMsRUFBRWpDLEVBQUUsR0FBR2dFLEVBQUVoRSxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUdpRSxFQUFFakUsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHOEMsRUFBRTlDLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBRytDLEVBQUUvQyxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUc4RSxHQUFHOUUsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHK0UsR0FBRy9FLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBRzRELEVBQUU1RCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUc2RCxFQUFFN0QsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHb0QsRUFBRXBELEVBQUUsSUFBSSxFQUFFQSxFQUFFLEtBQUssR0FBR3FELEVBQUVyRCxFQUFFLElBQUksRUFBRUEsRUFBRSxLQUFLLEdBQUdrQyxFQUFFbEMsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHbUMsRUFBRW5DLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR2tFLEVBQUVsRSxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdtRSxFQUFFbkUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHZ0QsRUFBRWhELEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR2lELEVBQUVqRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdnRixHQUFHaEYsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHaUYsR0FBR2pGLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR3dFLEdBQUd4RSxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUV5RSxHQUFHekUsRUFBRSxJQUFJLEdBQUdBLEVBQUUsS0FBSyxFQUFFc0QsRUFBRXRELEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR3VELEVBQUV2RCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUdvQyxFQUFFcEMsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHcUMsRUFBRXJDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR29FLEVBQUVwRSxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdxRSxFQUFFckUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHa0QsRUFBRWxELEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRW1ELEVBQUVuRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUUwQyxFQUFFMUMsRUFBRSxJQUFJLEdBQUdBLEVBQUUsS0FBSyxFQUFFMkMsRUFBRTNDLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEtBQUssRUFBRTBFLEdBQUcxRSxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUUyRSxHQUFHM0UsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFd0QsRUFBRXhELEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRXlELEVBQUV6RCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUVzQyxFQUFFdEMsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHdUMsRUFBRXZDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3NFLEVBQUV0RSxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUV1RSxHQUFHdkUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFOEQsRUFBRTlELEVBQUUsSUFBSSxHQUFHQSxFQUFFLEtBQUssRUFBRStELEVBQUUvRCxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUU0QyxFQUFFNUMsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHNkMsRUFBRTdDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBRzRFLEdBQUc1RSxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUc2RSxHQUFHN0UsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHMEQsRUFBRTFELEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBRzJELEVBQUUzRCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUd3QyxFQUFFeEMsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHeUMsRUFBRXpDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR0EsRUFBRSxHQUFHZ0MsR0FBR0UsRUFBRUUsRUFBRXBDLEVBQUUsR0FBR2lDLEdBQUdFLEVBQUVFLEVBQUVyQyxFQUFFLElBQUkwQyxHQUFHRSxFQUFFRSxFQUFFOUMsRUFBRSxJQUFJMkMsR0FBR0UsRUFBRUUsRUFBRS9DLEVBQUUsSUFBSW9ELEdBQUdFLEVBQUVFLEVBQUV4RCxFQUFFLElBQUlxRCxHQUFHRSxFQUFFRSxFQUFFekQsRUFBRSxJQUFJOEQsR0FBR0UsRUFBRUUsRUFBRWxFLEVBQUUsSUFBSStELEdBQUdFLEVBQUVFLEVBQUVuRSxFQUFFLElBQUl3RSxJQUFJRSxHQUFHRSxHQUFHNUUsRUFBRSxJQUFJeUUsSUFBSUUsR0FBR0UsR0FBRzdFLEVBQUUsR0FBR2tDLEdBQUdFLEVBQUVFLEVBQUV0QyxFQUFFLEdBQUdtQyxHQUFHRSxFQUFFRSxFQUFFdkMsRUFBRSxJQUFJNEMsR0FBR0UsRUFBRUUsRUFBRWhELEVBQUUsSUFBSTZDLEdBQUdFLEVBQUVFLEVBQUVqRCxFQUFFLElBQUlzRCxHQUFHRSxFQUFFRSxFQUFFMUQsRUFBRSxJQUFJdUQsR0FBR0UsRUFBRUUsRUFBRTNELEVBQUUsSUFBSWdFLEdBQUdFLEVBQUVFLEVBQUVwRSxFQUFFLElBQUlpRSxHQUFHRSxFQUFFRSxFQUFFckUsRUFBRSxJQUFJMEUsSUFBSUUsR0FBR0UsR0FBRzlFLEVBQUUsSUFBSTJFLElBQUlFLEdBQUdFLEdBQUcvRSxFQUFFLEdBQUdvQyxHQUFHRSxFQUFFRSxFQUFFeEMsRUFBRSxHQUFHcUMsR0FBR0UsRUFBRUUsRUFBRXpDLEVBQUUsSUFBSThDLEdBQUdFLEVBQUVFLEVBQUVsRCxFQUFFLElBQUkrQyxHQUFHRSxFQUFFRSxFQUFFbkQsRUFBRSxJQUFJd0QsR0FBR0UsRUFBRUUsRUFBRTVELEVBQUUsSUFBSXlELEdBQUdFLEVBQUVFLEVBQUU3RCxFQUFFLElBQUlrRSxHQUFHRSxFQUFFRSxFQUFFdEUsRUFBRSxJQUFJbUUsR0FBR0UsRUFBRUUsR0FBR3ZFLEVBQUUsSUFBSTRFLElBQUlFLEdBQUdFLEdBQUdoRixFQUFFLElBQUk2RSxJQUFJRSxHQUFHRSxHQUFHakYsRUFBRSxHQUFHc0MsR0FBR0UsRUFBRVIsRUFBRWhDLEVBQUUsR0FBR3VDLEdBQUdFLEVBQUVSLEVBQUVqQyxFQUFFLElBQUlnRCxHQUFHRSxFQUFFUixFQUFFMUMsRUFBRSxJQUFJaUQsR0FBR0UsRUFBRVIsRUFBRTNDLEVBQUUsSUFBSTBELEdBQUdFLEVBQUVSLEVBQUVwRCxFQUFFLElBQUkyRCxHQUFHRSxFQUFFUixFQUFFckQsRUFBRSxJQUFJb0UsR0FBR0UsRUFBRVIsRUFBRTlELEVBQUUsSUFBSXFFLEdBQUdFLEdBQUdSLEVBQUUvRCxFQUFFLElBQUk4RSxJQUFJRSxHQUFHUixHQUFHeEUsRUFBRSxJQUFJK0UsSUFBSUUsR0FBR1IsR0FBR3pFLEVBQUUsR0FBR3dDLEdBQUdSLEVBQUVFLEVBQUVsQyxFQUFFLEdBQUd5QyxHQUFHUixFQUFFRSxFQUFFbkMsRUFBRSxJQUFJa0QsR0FBR1IsRUFBRUUsRUFBRTVDLEVBQUUsSUFBSW1ELEdBQUdSLEVBQUVFLEVBQUU3QyxFQUFFLElBQUk0RCxHQUFHUixFQUFFRSxFQUFFdEQsRUFBRSxJQUFJNkQsR0FBR1IsRUFBRUUsRUFBRXZELEVBQUUsSUFBSXNFLEdBQUdSLEVBQUVFLEVBQUVoRSxFQUFFLElBQUl1RSxJQUFJUixFQUFFRSxFQUFFakUsRUFBRSxJQUFJZ0YsSUFBSVIsR0FBR0UsR0FBRzFFLEVBQUUsSUFBSWlGLElBQUlSLEdBQUdFLEdBQUczRSxFQUFFLElBQUlHLEVBQUVpQixHQUFHcEIsRUFBRSxJQUFJRyxFQUFFaUIsRUFBRSxFQUFFLEVDUmhsS3BCLEVBQUUsV0FBVyxNQUFNRyxFQUFFLENBQUMrRSxTQUFTL0ssTUFBTWdMLEtBQUtoRixJQUFJLE1BQU1ILEVBQUUsQ0FBQ0csRUFBRXJDLEtBQUtxQyxFQUFFaUYsU0FBUyxZQUFPLElBQVNqRixFQUFFa0YsT0FBT3JGLEVBQUVuRSxLQUFLc0UsRUFBRWtGLFlBQU8sSUFBU2xGLEVBQUVtRixhQUFRLElBQVNuRixFQUFFa0YsT0FBT3JGLEVBQUVuRSxVQUFLLEdBQVFtRSxFQUFFbkUsS0FBS3NFLEVBQUVtRixRQUFRdEYsR0FBR3VGLEtBQUssSUFBSSxJQUFJcEwsTUFBTXFMLFFBQVEsQ0FBQ3JGLEdBQUdILEVBQUVJLEVBQUV3QixFQUFFM0IsTUFBTUUsRUFBRXJDLEtBQUtrQyxFQUFFRyxFQUFFaUYsUUFBUWhGLE9BQUUsSUFBU3dCLFNBQVN6QixFQUFFa0YsTUFBTWxGLEVBQUVrRixNQUFNekQsT0FBRSxJQUFTM0IsSUFBSUUsRUFBRW1GLE1BQU1yRixLQUFLRCxFQUFFLENBQUNrRixTQUFTTyxXQUFXTixLQUFLaEYsR0FBRyxDQUFDdUYsS0FBSzlELEVBQUUrRCxPQUFPeEYsS0FBS3lGLE9BQU8sRUFBRXpGLEtBQUtDLEVBQUV5RixPQUFPQyxLQUFLM0YsS0FBS0YsRUFBRSxDQUFDaUYsU0FBUzVMLElBQUk2TCxLQUFLaEYsR0FBRyxJQUFJQSxFQUFFRSxXQUFXa0YsS0FBSyxJQUFJLElBQUlqTSxJQUFJa00sUUFBUSxDQUFDckYsRUFBRUgsS0FBSyxJQUFJLE1BQU1JLEVBQUV3QixLQUFLNUIsRUFBRUcsRUFBRW5HLElBQUlvRyxFQUFFd0IsS0FBS1IsRUFBRSxDQUFDOEQsU0FBU2EsSUFBSVosS0FBS2hGLEdBQUcsSUFBSUEsRUFBRTZGLFVBQVVULEtBQUssSUFBSSxJQUFJUSxJQUFJUCxRQUFRLENBQUNyRixFQUFFSCxLQUFLLElBQUksTUFBTUksS0FBS0osRUFBRUcsRUFBRThGLElBQUk3RixLQUFLcUIsRUFBRSxDQUFDeUQsU0FBU2dCLEtBQUtmLEtBQUtoRixHQUFHLENBQUNBLEVBQUVnRyxVQUFVUCxPQUFPLEVBQUV6RixLQUFLLElBQUkrRixLQUFLL0YsSUFBSW1CLEVBQUUsQ0FBQzRELFNBQVNrQixPQUFPakIsS0FBSyxFQUFFa0IsTUFBTWxHLEVBQUVtRyxPQUFPdEcsS0FBS0csRUFBRSxDQUFDSCxFQUFFRyxHQUFHLENBQUNILEdBQUc0RixPQUFPLEVBQUV6RixFQUFFSCxLQUFLLElBQUlvRyxPQUFPakcsRUFBRUgsSUFBSThCLEVBQUUsQ0FBQ29ELFNBQVNxQixJQUFJcEIsS0FBS2hGLEdBQUcsQ0FBQ0EsRUFBRXFHLE1BQU1aLE9BQU8sRUFBRXpGLEtBQUssSUFBSW9HLElBQUlwRyxJQUFJLE9BQU8sSUFBSTdHLElBQUksQ0FBQzZHLEVBQUVILEVBQUVDLEVBQUVtQixFQUFFSyxFQUFFSCxFQUFFUSxHQUFHMkUsSUFBSXRHLEdBQUcsQ0FBQ0EsRUFBRStFLFNBQVNwSCxLQUFLcUMsSUFBSSxDQUEzMkIsR0FBKzJCQyxFQUFFLElBQUlzRyxZQUFZOUUsRUFBRSxJQUFJK0UsWUFBWSxTQ0F6eUIsU0FBU3BGLEVBQUVuQixTQUFTRCxFQUFFSCxHQUFHLE9BQU80RyxLQUFLQyxVQUFVakYsRUFBRXhCLEVBQUVELEdBQUcsQ0FBQyxTQUFTMEIsRUFBRTdCLEdBQUcsUUFBRyxJQUFTQSxFQUFFLE9BQU0sRUFBRyxHQUFHLGlCQUFpQkEsRUFBRSxDQUFDLEdBQUd6RixPQUFPdU0sTUFBTTlHLEdBQUcsT0FBTSxFQUFHLElBQUl6RixPQUFPd00sU0FBUy9HLEdBQUcsT0FBT0EsRUFBRSxHQUFFLEdBQUcsQ0FBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU1xQixFQUFFLEdBQUcsU0FBU08sRUFBRXpCLEVBQUVzQixFQUFFekIsR0FBRyxNQUFNb0IsRUFBRVMsRUFBRTFCLEdBQUcsR0FBRyxPQUFPaUIsRUFBRSxPQUFPQSxFQUFFLE1BQU1sQixFQUFFLEdBQUdELEVBQUUsSUFBSTNHLElBQUksT0FBTyxTQUFTMEcsRUFBRUcsR0FBRyxNQUFNaUIsRUFBRVMsRUFBRTFCLEdBQUcsR0FBRyxPQUFPaUIsRUFBRSxPQUFPQSxFQUFFLElBQUlFLEVBQUVyQixFQUFFdkcsSUFBSXlHLEdBQUcsWUFBWW1CLEVBQUUsT0FBT0EsRUFBRSxPQUFPQSxFQUFFcEIsRUFBRWpFLGNBQWNrRSxHQUFHLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxVQUFVRCxFQUFFb0IsR0FBR25CLEVBQUVGLEVBQUVqRyxJQUFJbUcsRUFBRW1CLEdBQUcsTUFBTSxJQUFJLFNBQVNwQixFQUFFb0IsR0FBRyxFQUFDLEVBQUduQixFQUFFaEQsU0FBUyxLQUFLOEMsRUFBRWpHLElBQUltRyxFQUFFbUIsR0FBRyxNQUFNLElBQUksU0FBUyxHQUFHLE9BQU9uQixFQUFFRCxFQUFFb0IsR0FBR25CLEVBQUVGLEVBQUVqRyxJQUFJbUcsRUFBRW1CLFFBQVEsR0FBRzBGLE1BQU1DLFFBQVE5RyxHQUFHLENBQUMsTUFBTUMsRUFBRSxTQUFTSixHQUFHLEdBQUdxQixFQUFFcEYsT0FBTytELEVBQUUsQ0FBQyxNQUFNSSxFQUFFaUIsRUFBRXBGLE9BQU9vRixFQUFFcEYsT0FBTytELEVBQUVxQixFQUFFNkYsTUFBSyxFQUFHOUcsRUFBRUosRUFBRSxDQUFDLE9BQU9xQixFQUFFOEYsTUFBTSxFQUFFbkgsRUFBRSxDQUF6RixDQUEyRkcsRUFBRWxFLFFBQVFpRSxFQUFFb0IsR0FBR2xCLEVBQUVILEVBQUVqRyxJQUFJbUcsRUFBRW1CLEdBQUcsSUFBSSxNQUFNRyxFQUFFTCxLQUFLakIsRUFBRUUsVUFBVUQsRUFBRXFCLEdBQUd6QixFQUFFb0IsRUFBRSxLQUFLLENBQUMsTUFBTUEsRUFBRUcsR0FBRyxTQUFTdkIsRUFBRUcsR0FBRyxNQUFNc0IsRUFBRXpCLEVBQUV0QyxZQUFZLEdBQUcsbUJBQW1CK0QsRUFBRSxDQUFDLE1BQU1yQixFQUFFcUIsRUFBRTNELEtBQUtzRCxFQUFFakIsRUFBRXpHLElBQUkwRyxHQUFHLFFBQUcsSUFBU2dCLEVBQUUsTUFBTSxDQUFDaEIsRUFBRWdCLEVBQUUrRCxLQUFLbkYsR0FBRyxDQUFDLE1BQU1vQixFQUFFZ0csT0FBTy9HLFFBQVFMLEdBQUdFLEVBQUVrQixFQUFFbkYsT0FBT2dFLEVBQUUrRyxNQUFNN0IsS0FBSyxDQUFDbEosT0FBT2lFLEVBQUVBLElBQUksSUFBSSxJQUFJRixFQUFFLEVBQUVBLEVBQUVFLEVBQUVGLElBQUksQ0FBQyxNQUFNSSxFQUFFZ0IsRUFBRXBCLEdBQUdHLEVBQUVILEVBQUVBLEVBQUVDLEVBQUVFLEdBQUdDLEVBQUUsR0FBR0gsRUFBRUUsRUFBRSxHQUFHQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENEQTltQyxHQ0FpbkNILEVBQUUsQ0FBbFEsQ0FBb1FFLEVBQUVzQixHQUFHSSxFQUFFTixFQUFFdEYsT0FBT29GLEVBQUUyRixNQUFNN0IsS0FBSyxDQUFDbEosT0FBTzRGLEVBQUUsSUFBSVIsRUFBRSxHQUFHRCxFQUFFbEIsRUFBRW9CLEdBQUdELEVBQUVwQixFQUFFakcsSUFBSW1HLEVBQUVtQixHQUFHLElBQUksSUFBSWxCLEVBQUUsRUFBRUEsRUFBRXlCLEVBQUV6QixJQUFJaUIsRUFBRWpCLEVBQUUsR0FBR0osRUFBRXVCLEVBQUVuQixHQUFHLEVBQUUsT0FBT2tCLENBQUMsQ0FBeDFCLENBQTAxQm5CLEdBQUdELENBQUMsQ0NBOXBDLFNBQVNrQixFQUFFQSxFQUFFcEIsR0FBRyxPSFFvVSxTQUFXQSxHQUFHLE9BQU8sSUFBSU0sRUFBRSxJQUFJTCxFQUFFLEtBQUtrQixPQUFPbkIsR0FBRzJCLEtBQUssQ0dSbFhGLENBQUVyQixFQUFFLENBQUNnQixFQUFFcEIsSUFBSSxDQ0EvQixNQUFDSSxFQUEwQyxVQUFZaUgsY0FBY2xILEVBQUU1RixPQUFPK00sa0JBQWtCQyxZQUFZbkgsRUFBRUosR0FBRyxDQUFBLEdBQUksT0FBTyxTQUFTQSxFQUFFc0IsR0FBRyxJQUFJRyxFQUFFTCxFQUFFbEIsRUFBRSxNQUFNLFdBQVdvQixHQUFHa0csS0FBSyxXQUFXLE1BQU1sRyxFQUFFbEIsRUFBRXZDLEtBQUssSUFBSStELEVBQUVzRSxLQUFLdUIsTUFBTSxPQUFPdkgsSUFBSW9CLEdBQUdNLEVBQUVSLEVBQUVqQixLQUFLRCxFQUFFb0IsRUFBRUcsRUFBRXpCLEVBQUUwSCxLQUFLN0osTUFBTXVELEVBQUVRLEdBQUdILENBQUMsRUFBRSxZQUFZRyxHQUFHLE1BQU1DLEVBQUV6QixFQUFFdkMsS0FBSytELEdBQUd0QixFQUFFNEYsS0FBS3VCLE1BQU0sT0FBT3ZILElBQUkyQixHQUFHdkIsRUFBRWMsRUFBRWpCLEtBQUtELEVBQUUyQixFQUFFSixFQUFFSCxFQUFFdEIsRUFBRTBILEtBQUs3SixRQUFRK0QsR0FBRzVCLEtBQUs0QixHQUFHUixFQUFFZCxHQUFHbUIsQ0FBQyxDQUFDLENBQUMsQ0FBdFhBLENBQUUsQ0FBQzhGLFlBQVl2SCxJQ0FuRyxTQUFTMkgsRUFBS0MsR0FDbkIsUUFBU0EsR0FBbUIsTUFBVkEsR0FBMkIsVUFBVkEsQ0FDckMsT0NTTyxNQUFNQyxVQUFRQywrcUZBQUFDLENBQUFsSyxLQUFBLEdBQUEsQ0FBQSxDQWFsQm1LLEVBQVUsRUFBQSxrQkFBQSxDQVNWQSxxQkFhQUEsRUFBVSxFQUFBLGVBQUEsQ0FPVkEsRUFBVSxFQUFBLGNBQUEsQ0FLVkEsc0JBU0FBLEVBQVUsRUFBQSxpQkFBQSxDQUtWQSxFQUFVLEVBQUEsUUFBQSxDQUtWQSxFQUFVLEVBQUEsbUJBQUEsQ0FNVkEsRUFBVSxFQUFBLE9BQUEsQ0FXVkEsb0JBS0FBLEVBQVUsRUFBQSxtQkFBQSxDQUtWQSxFQUFVLEVBQUEsYUFBQSxDQUtWQSxrQkFLQUEsRUFBVSxFQUFBLFlBQUEsQ0FLVkEsRUFBVSxFQUFBLGFBQUEsQ0FLVkEsd0JBT0FBLEVBQVUsRUFBQSx1QkFBQSxDQVNWQSxFQUFVLEVBQUEsb0NBQUEsQ0FXVkEsMEJBU0FBLEVBQVUsRUFBQSxhQUFBLENBa0RWQSxFQUFVLEVBQUEscUJBQUE3SCxDQUFBLENBdE1NOEgsVUFBSUgsRUFBQWpLLE1BRUpxSyxXQUFhLElBQUk1TyxJQUlsQ29FLFdBQUFBLENBQVl5SyxFQUFpQkYsRUFBd0JHLEdBQ25EdkssS0FBS3dLLFNBQVd4TyxFQUFLQyxRQUFRcU8sR0FDN0J0SyxLQUFLb0ssS0FBT0EsRUFDWnBLLEtBQUt1SyxRQUFVQSxDQUNqQixDQUVBLGtCQUNJRSxHQUNGLElBQ0UsTUFBTyxjQUFjN0ssS0FBSzhLLEVBQUdDLGFBQWEzTyxFQUFLK0QsS0FBS0MsS0FBSzRLLFlBQWEsa0JBQW1CLFFBQzNGLENBQUUsTUFDQSxPQUFPLENBQ1QsQ0FDRixDQUVBLGdCQUNJQyxHQUNGLE9BQU83SyxLQUFLOEssWUFBWUMsU0FBU0MsT0FBT0MsU0FBUyxpQkFDN0MsaUJBQ0FqTCxLQUFLOEssWUFBWUMsU0FBU0MsTUFDeEIsMEJBQXlCaEwsS0FBS29LLEtBQUtuSixRQUFVLFlBQWMsSUFDM0Qsd0JBQ1IsQ0FFQSxXQUFJcUosR0FDRixPQUFPdEssS0FBS3dLLFFBQ2QsQ0FFQSxlQUNJSSxHQUNGLE9BQU9GLEVBQUdRLFdBQVdsUCxFQUFLK0QsS0FBS0MsS0FBS3NLLFFBQVMsS0FBTSxLQUFNLGlCQUNyRHRPLEVBQUtDLFFBQVErRCxLQUFLc0ssUUFBUyxLQUFNLE1BQ2pDdEssS0FBS3NLLE9BQ1gsQ0FFQSxjQUNJYSxHQUNGLE9BQU9ULEVBQUdDLGFBQWEzSyxLQUFLb0wsU0FBUyxjQUFlLE9BQ3RELENBRUEsaUJBQ0lDLEdBQ0YsSUFDRSxRQUFTckwsS0FBS29MLFNBQVMsYUFDekIsQ0FBRSxNQUNBLE9BQU8sQ0FDVCxDQUNGLENBRUEsaUJBQ0lFLEdBQ0YsT0FBT1osRUFBR1EsV0FBV2xQLEVBQUsrRCxLQUFLQyxLQUFLc0ssUUFBUyxPQUMvQyxDQUVBLFFBQ0lySyxHQUNGLE9BQU9ELEtBQUs4SyxZQUFZN0ssTUFBUSxTQUNsQyxDQUVBLG1CQUNJc0wsR0FFRixPQURhdkwsS0FBSzhLLFlBQVk3SyxNQUFRLFdBQzFCdUwsV0FBVyxJQUFLLElBQUlBLFdBQVcsSUFBSyxJQUNsRCxDQUVBLE9BQ0lDLEdBQ0YsSUFBS3pMLEtBQUt1SyxRQUFTLE9BQU8zTixRQUFRNk8sSUFFbEMsTUFBT0MsRUFBU0MsR1hyQ2IsU0FDTHZCLEVBQ0F3QixHQUVBLElBQUlDLEdBQVl6QixFQUFLcUIsS0FBTyxJQUFJN0MsSUFBS2tELEdBQVk5UCxFQUFLQyxRQUFRMlAsRUFBS0UsRUFBUXhNLGFBQzNFLE1BQU15TSxFQUNKM0IsRUFBSzRCLGFBQ0o1QixFQUFLNkIsZUFDRnJQLFFBQVE2TyxJQUFJUyxVQUFZLGNBQ3hCOUIsRUFBSytCLGVBQ0h2UCxRQUFRNk8sSUFBSVcsUUFBVXhQLFFBQVE2TyxJQUFJUyxVQUFZLG1CQUM5Q25LLEdBQ1IsR0FBdUIsaUJBQVpnSyxFQUFzQixDQUMvQixHQUF3QixJQUFwQkYsRUFBU3pOLFNBQ1h5TixFQUFTN04sS0FBS2hDLEVBQUsrRCxLQUFLNkwsRUFBSyxTQUN6QnhCLEVBQUtpQyxnQkFBZ0IsQ0FDdkIsTUFBTUMsRUFBV3RRLEVBQUtDLFFBQVEyUCxFQUFLLEtBQU0sTUFDckNsQixFQUFHUSxXQUFXbFAsRUFBSytELEtBQUt1TSxFQUFVLGtCQUNwQ1QsRUFBUzdOLEtBQUtoQyxFQUFLK0QsS0FBS3VNLEVBQVUsUUFFdEMsQ0FFRlQsRUFBV0EsRUFBU1UsUUFBU1QsR0FDM0JDLEVBQ0ksQ0FBQyxHQUFHRCxLQUFXQyxVQUFpQixHQUFHRCxVQUFpQixHQUFHQSxLQUFXQyxJQUFXRCxHQUM3RSxDQUFDLEdBQUdBLFVBQWlCQSxHQUU3QixDQUNBRCxFQUFXQSxFQUFTVyxPQUFRVixHQUFZcEIsRUFBR1EsV0FBV1ksSUFBVWxELElBQUtrRCxHQUFZOVAsRUFBS3lRLFNBQVNiLEVBQUtFLElBQ2hHMUIsRUFBS25KLFVBQ1BDLFFBQVFDLEtBQUssV0FBV3ZFLFFBQVE2TyxJQUFJVyxxQkFBcUJ4UCxRQUFRNk8sSUFBSVMsWUFDckVoTCxRQUFRQyxLQUFLLHFCQUFzQjBLLEVBQVM5TCxLQUFLLFFBR25ELE1BQU0yTSxFQUFvRCxHQUNwRGhCLEVBQWtDLENBQUEsRUFDeEMsSUFBSyxNQUFNSSxLQUFXRCxFQUFVLENBQzlCLE1BQU1jLEVBQWlCLEdBQ3ZCLElBQUssTUFBT0MsRUFBS0MsS0FBVXRELE9BQU8vRyxRQUFROUcsRUFBWU0sRUFBSytELEtBQUs2TCxFQUFLRSxLQUM3RGMsS0FBT2xCLEdBQWNrQixLQUFPaFEsUUFBUTZPLE1BQ3hDQyxFQUFRa0IsR0FBT0MsRUFDZkYsRUFBSzNPLEtBQUs0TyxJQUdkRixFQUE0QjFPLEtBQUssQ0FBQzhOLEVBQVNhLElBQ3ZDdkMsRUFBS25KLFNBQVcwTCxFQUFLdk8sT0FBUyxHQUNoQzhDLFFBQVFDLEtBQUssUUFBUXdMLEVBQUt2TyxxQ0FBcUMwTixJQUVuRSxDQU9BLEdBTksxQixFQUFLbkosU0FDUkMsUUFBUUMsS0FDTixtQkFBbUJ1TCxFQUE0QjlELElBQUksRUFBRWtELEVBQVNhLEtBQVdBLEVBQUt2TyxPQUFTLEVBQUksR0FBRzBOLE1BQVlhLEVBQUs1TSxLQUFLLFNBQVcrTCxHQUFVL0wsS0FBSyxPQUFTLGFBSXZKcUssRUFBSzBDLFNBQVUsQ0FDakIsTUFDTUMsRUFEY3hELE9BQU9vRCxLQUFLalIsRUFBWU0sRUFBSytELEtBQUs2TCxFQUFLeEIsRUFBSzBDLFlBQ2hDTixPQUFRSSxLQUFVQSxLQUFPbEIsTUFBY2tCLEtBQU9oUSxRQUFRNk8sTUFDdEYsR0FBSXNCLEVBQVkzTyxPQUFTLEVBQ3ZCLE1BQU0sSUFBSTlCLE1BQU0scUNBQXFDdVAsRUFBUzlMLEtBQUssWUFBWWdOLEVBQVloTixLQUFLLFNBRXBHLENBQ0EsTUFBTyxDQUFDaU4sRUFBTyxDQUFFbFIsT0FBUTRQLEVBQVN4UCxXQUFZLENBQUEsSUFBTUosUUFBVTRQLEVBQVNnQixFQUN6RSxDVzFCd0RPLENBQXlCak4sS0FBS29LLEtBQU1wSyxLQUFLc0ssU0FDN0YsSUFBSyxNQUFPd0IsRUFBU29CLEtBQVV2QixFQUM3QnpLLFFBQVFDLEtBQUssVUFBVStMLGdDQUFvQ3BCLEtBRTdELE1BQU8sSUFBS0osS0FBWTlPLFFBQVE2TyxJQUNsQyxDQUVBLGVBQ0lYLEdBQ0YsT0FBTy9CLEtBQUtvRSxNQUFNekMsRUFBR0MsYUFBYTNLLEtBQUtvTixnQkFBaUIsUUFDMUQsQ0FFQSxtQkFDSUEsR0FDRixPQUFPcFIsRUFBSytELEtBQUtDLEtBQUtzSyxRQUFTLGVBQ2pDLENBRUEsYUFDSStDLEdBQ0YsU0FBVXJOLEtBQUs4SyxZQUFZd0MsY0FBY0MsUUFBVXZOLEtBQUs4SyxZQUFZMEMsaUJBQWlCRCxPQUN2RixDQUVBLGFBQ0lFLEdBQ0YsU0FBVXpOLEtBQUs4SyxZQUFZd0MsY0FBY0ksUUFBVTFOLEtBQUs4SyxZQUFZMEMsaUJBQWlCRSxPQUN2RixDQUVBLFlBQ0lDLEdBQ0YsT0FBTzNOLEtBQUs0TixjQUFjLG1CQUFxQjVOLEtBQUs0TixjQUFjLFFBQ3BFLENBRUEsYUFDSUMsR0FDRixPQUFPN04sS0FBSzROLGNBQWMsU0FDNUIsQ0FFQSxtQkFDSUUsR0FDRixPQUFJOU4sS0FBSzJOLFNBQWlCLFFBQ3RCM04sS0FBSzZOLFVBQWtCLGNBQTNCLENBRUYsQ0FFQSx1QkFDSUUsR0FDRixJQUNFLFFBQVMvTixLQUFLb0wsU0FBUyx1QkFDekIsQ0FBRSxNQUNBLE9BQU8sQ0FDVCxDQUNGLENBRUEsb0NBQ0k0QyxHQUNGLEdBQUlsRSxFQUFLOUosS0FBS3lMLElBQUl3QyxJQUFLLE9BQU8sRUFDOUIsSUFDRSxNQUFNQyxFQUFhbE8sS0FBS29MLFNBQVMsd0JBQ2pDLE1BQU8sZ0JBQWdCeEwsS0FBSzhLLEVBQUdDLGFBQWF1RCxFQUFZLFFBQzFELENBQUUsTUFDQSxPQUFPLENBQ1QsQ0FDRixDQUVBLHFCQUNJQyxHQUNGLE9BQU9uUyxFQUFLb1MsUUFBUXBPLEtBQUtvTCxTQUFTLGlCQUFtQnBMLEtBQUtzSyxRQUN0RHRLLEtBQUs4SyxZQUNKL0IsS0FBS29FLE1BQ0p6QyxFQUFHQyxhQUFhM08sRUFBSytELEtBQUsvRCxFQUFLb1MsUUFBUXBPLEtBQUtvTCxTQUFTLGVBQWdCLGdCQUFpQixRQUU5RixDQUVBLGFBQ0lpRCxHQUNGLElBQUlDLEdBQVcsRUFDWEMsRUFBY3ZPLEtBQUtzSyxRQUN2QixPQUFTLENBQ1AsTUFBTWtFLEVBQVV4UyxFQUFLK0QsS0FBS3dPLEVBQWEsZUFBZ0IsUUFNdkQsR0FMSTdELEVBQUdRLFdBQVdzRCxLQUNoQnhPLEtBQUt5TCxJQUFJZ0QsS0FBTyxHQUFHRCxLQUFXeE8sS0FBS3lMLElBQUlnRCxPQUN2Q0gsR0FBVyxHQUdUNUQsRUFBR1EsV0FBV2xQLEVBQUsrRCxLQUFLd08sRUFBYSxTQUN2QyxNQUVGLE1BQU1HLEVBQWExUyxFQUFLb1MsUUFBUUcsR0FDaEMsR0FBSUEsSUFBZ0JHLEVBQ2xCLE1BRUZILEVBQWNHLENBQ2hCLENBQ0EsT0FBT0osQ0FDVCxDQUVBbEQsUUFBQUEsQ0FBU3VELEdBQ1AsSUFBSWhULEVBQVdxRSxLQUFLcUssV0FBV3hPLElBQUk4UyxHQUNuQyxHQUFJaFQsRUFBVSxPQUFPQSxFQUtyQixHQUhBQSxFQUFXLENBQUNnVCxFQUFVM1MsRUFBSytELEtBQUssS0FBTSxLQUFNNE8sSUFDekMvRixJQUFLckUsR0FBTXZJLEVBQUtDLFFBQVErRCxLQUFLc0ssUUFBUy9GLElBQ3RDcUssS0FBTXJLLEdBQU1tRyxFQUFHUSxXQUFXM0csS0FDeEI1SSxFQUNILE1BQU0sSUFBSVcsTUFBTSxtQkFBbUJxUyxLQUdyQyxPQURBM08sS0FBS3FLLFdBQVdsTyxJQUFJd1MsRUFBVWhULEdBQ3ZCQSxDQUNULENBRVFpUyxhQUFBQSxDQUFjaUIsR0FDcEIsTUFBTUMsRUFBOEJoRSxNQUVoQ0EsS0FDQ0EsRUFBWXdDLGVBQWV1QixJQUMxQi9ELEVBQVkwQyxrQkFBa0JxQixJQUM5Qi9ELEVBQVlpRSx1QkFBdUJGLElBQ25DL0QsRUFBWWtFLG1CQUFtQkgsS0FHckMsT0FBT0MsRUFBMkI5TyxLQUFLOEssY0FBZ0JnRSxFQUEyQjlPLEtBQUtpUCxnQkFDekYsQ0FFQSxtQkFDWUEsR0FDVixHQUFJalAsS0FBSzRLLGNBQWdCNUssS0FBS3NLLFFBQVMsT0FBT3RLLEtBQUs4SyxZQUVuRCxJQUNFLE9BQU8vQixLQUFLb0UsTUFBTXpDLEVBQUdDLGFBQWEzTyxFQUFLK0QsS0FBS0MsS0FBSzRLLFlBQWEsZ0JBQWlCLFFBQ2pGLENBQUUsTUFBT3ZPLEdBRVAsWUFEQTZFLFFBQVE3RSxNQUFNLGdDQUFnQ0wsRUFBSytELEtBQUtDLEtBQUs0SyxZQUFhLGtCQUFtQnZPLEVBRS9GLENBQ0YsRUFTSyxTQUFTNlMsRUFBZ0I5RSxFQUF3QkcsR0FBVSxFQUFNRCxHQUV0RSxHQURBQSxJQUFZMU4sUUFBUWdQLE1BQ2ZsQixFQUFHUSxXQUFXbFAsRUFBSytELEtBQUt1SyxFQUFTLGlCQUV0QyxPQUFPLElBQUlOLEVBQVFNLEVBQVNGLEVBQU1HLEVBQ3BDLENBRU9ySyxlQUFlaVAsRUFDcEIvRSxFQUNBRyxHQUFVLEVBQ1ZELEdBRUEsTUFBTThFLEVBWUQsU0FDTGhGLEVBQ0FHLEdBQVUsRUFDVkQsR0FHQSxHQURBQSxJQUFZMU4sUUFBUWdQLE9BQ2ZsQixFQUFHUSxXQUFXbFAsRUFBSytELEtBQUt1SyxFQUFTLGlCQUFrQixPQUV4RCxNQUFNK0UsRUFBYyxJQUFJckYsRUFBUU0sRUFBU0YsRUFBTUcsR0FDL0MsSUFBSStFLEVBQWNELEVBQ2xCLElBQUtBLEVBQVl2RSxZQUFZeUUsWUFBY3ZULEVBQUtvUyxRQUFROUQsR0FBU2tGLFNBQVMsYUFBYyxDQUN0RixNQUFNNUUsRUFBYzVPLEVBQUtDLFFBQVFxTyxFQUFTLEtBQU0sTUFDNUNJLEVBQUdRLFdBQVdsUCxFQUFLK0QsS0FBSzZLLEVBQWEsbUJBQ3ZDMEUsRUFBYyxJQUFJdEYsRUFBUVksRUFBYVIsRUFBTUcsR0FFakQsQ0FDQSxNQUFPLENBQUVrRixLQUFNSCxFQUFhSSxLQUFNTCxFQUNwQyxDQTdCOEJNLENBQXdCdkYsRUFBTUcsRUFBU0QsR0FDbkUsR0FBSzhFLEVBRUwsTUFBTyxJQUNGQSxFQUNIaFMsWUFDRWdTLEVBQW9CSyxPQUFTTCxFQUFvQk0sV0FDdkNFLEVBQXlCeEYsRUFBTWdGLEVBQW9CSyxLQUFNbEYsR0FDL0QsQ0FBQzZFLEVBQW9CTSxNQUUvQixDQXFCQXhQLGVBQWUwUCxFQUNieEYsRUFDQWtGLEVBQ0EvRSxHQUVBLE1BQU1zRixFQUFXLENBQUNQLEdBRVpRLEVBQVlSLEVBQVl4RSxZQUFZeUUsV0FDMUMsSUFBS3BHLE1BQU1DLFFBQVEwRyxHQUFZLE9BQU9ELEVBRXRDLE1BQU1FLEVBQXdCLEdBQ3hCQyxFQUF3QixHQUM5QixJQUFLLE1BQU1DLEtBQWlCSCxFQUFVbEgsSUFBS3NILEdBQWVsVSxFQUFLK0QsS0FBS3VQLEVBQVloRixRQUFTNEYsSUFDbkZ4RixFQUFHUSxXQUFXK0UsR0FDaEJELEVBQVloUyxLQUFLaVMsR0FFakJGLEVBQVkvUixLQUFLaVMsR0FHckJELEVBQVloUyxjQUFlbVMsRUFBT0osRUFBYSxDQUFFSyxLQUFLLEVBQU1DLGlCQUFpQixLQUM3RSxJQUFLLE1BQU1DLEtBQXFCTixFQUN6QnRGLEVBQUdRLFdBQVdsUCxFQUFLK0QsS0FBS3VRLEVBQW1CLGtCQUVoRFQsRUFBUzdSLEtBQUssSUFBSWdNLEVBQVFzRyxFQUFtQmxHLEVBQU1HLElBRXJELE9BQU9zRixDQUNULENDMVNPLE1BQU1VLEVBRVgzVCxRQUFRNFQsU0FBU0MsS0FFakI3VCxRQUFRd04sS0FBSyxJQUFJb0YsU0FBUyxTQUMxQjVTLFFBQVE2TyxJQUFJaUYsY0FBY2xCLFNBQVMsUUFFeEJtQixHQUFrQkosRUFBaUIsZ0JBQWtCLE9BQ3JESyxHQUFpQkwsRUFBaUIsTUFBUSxPQUMxQ00sR0FBd0JOLEVBQWlCLGdCQUFrQixPQ2MzRE8sR0FBb0YsQ0FDL0ZqUyxRQUFTLGdCQUNUa1MsU0FBVSw2Q0FWSSxDQUNkbFMsUUFBUyxDQUNQbVMsWUFBYSw0Q0FDYkMsS0FBTSxTQUNOQyxNQUFPLE1BUVQsYUFBTXpQLENBQVEySSxTQUtUbEssZUFFTGtLLEVBQ0ErRyxHQUVBLE1BQU1DLEVBQVVsQyxFQUFnQjlFLEdBQU0sRUFBTStHLEdBQzVDLElBQUtDLEVBRUgsT0FEQWxRLFFBQVE3RSxNQUFNZ1YsRUFBTUMsSUFBSSx1QkFDakIsRUFLVCxHQUZBbEgsRUFBTyxJQUFLQSxFQUFNdkwsUUFBU3VMLEVBQUt2TCxVQUFZMFIsRUFBaUIsZ0JBQWtCLGdCQUUxRTdGLEVBQUdRLFdBQVdsUCxFQUFLK0QsS0FBS3FSLEVBQVF4RyxZQUFhLFNBRWhELE9BREFJLEdBQU1vRyxFQUFTaEgsSUFDUixFQUdULE1BQU9tSCxFQUFTQyxFQUFlQyxTQWlDMUJ2UixlQUNMa1IsRUFDQWhILEdBRUEsTUFBTXNILEVBQXFCMVYsRUFBS0MsUUFBUW1WLEVBQVE5RyxRQUFTLGVBQWdCLFNBQVUsU0FDN0VrSCxFQUFnQnhWLEVBQUtDLFFBQVF5VixFQUFvQixvQkFDakRoSCxFQUFHaUgsU0FBU0MsTUFBTUYsRUFBb0IsQ0FBRUcsV0FBVyxJQUV6RCxNQUFNQyxFQUFPQyxFQUFXLFVBRWxCQyxFQUFhQyxFQUFjQyxTQUFTLHFCQUFzQixDQUFFdEcsSUFBS3dGLEVBQVE5RyxVQUFXaEwsV0FBVzZTLE9BQ3JHTCxFQUFLeE8sT0FBTzBPLEdBRVosTUFBTUksRUFBa0JySixLQUFLQyxVQUMzQk8sT0FBTy9HLFFBQVE0TyxFQUFRM0YsS0FDcEJlLE9BQU8sRUFBRUksTUFBVXlGLEdBQW9CQyxJQUFJMUYsSUFDM0MyRixTQUFTLEVBQUVDLElBQVFDLEtBQVVELEVBQUtFLGNBQWNELEtBRXJEWCxFQUFLeE8sT0FBTzhPLFNBMkJkbFMsZUFDRWtSLEVBQ0FoSCxFQUNBMEgsR0FFQSxPQUFPLElBQUkxUixRQUFTbkUsSUFDbEIsTUFlTTBXLEVBZk1WLEVBQWNXLFVBQVUsTUFBTyxDQUFDLFNBQVUsZUFBZ0IsQ0FDcEVoSCxJQUFLd0YsRUFBUTlHLFFBQ2JtQixJQUFLMkYsRUFBUTNGLElBQ2J2TSxNQUFPLE9BQ1BELFNBQVUsU0FFTTNCLE9BQ2Y2VSxPQUNBelUsTUFBTSxNQUNOOE8sT0FBUS9PLEdBQVNBLEVBQUtXLE9BQVMsR0FFL0J3SyxJQUFLbkwsR0FBU0EsRUFBSzZMLE1BQU0sR0FBRzZJLFFBQzVCdkosSUFBS2pOLEdBQ21CLFNBQXZCeVYsRUFBUTNGLElBQUlXLE9BQW9CelEsRUFBU2tYLFFBQVEsd0NBQXlDLElBQU1sWCxHQUVoRTZRLE9BQ2pDN1EsSUFDRW1YLEdBQWdCQyxLQUFNQyxHQUFZclgsRUFBU3NQLFNBQVMrSCxLQUNuREMsR0FBY0YsS0FBTUcsR0FBV3ZYLEVBQVM2VCxTQUFTMEQsT0FDbERDLEdBQWdCSixLQUFNQyxHQUFZclgsRUFBU3NQLFNBQVMrSCxLQUVyRDVJLEVBQUtuSixTQUNQQyxRQUFRQyxLQUFLLGtCQUFrQndSLEVBQWtCNVMsS0FBSyxTQUl4RCxNQUFNTyxFQUFPMlIsRUFBYzFSLE1BQU0sTUFBTyxDQUFDLE9BQVEsUUFBU29TLEdBQW9CLENBQUUvRyxJQUFLd0YsRUFBUXhHLGNBQzdGdEssRUFBS2hELE9BQU9tRCxHQUFHLE9BQVNDLElBQ3RCb1IsRUFBS3hPLE9BQU81QyxHQUNSMEosRUFBS25KLFVBQ1BDLFFBQVFDLEtBQUssUUFBU1QsR0FDdEJRLFFBQVFDLEtBQUssUUFBUzJRLEVBQUtzQixPQUFPQyxPQUFPLFdBRzdDL1MsRUFBS0csR0FBRyxRQUFTLEtBQ2Z4RSxPQUdOLENBckVRcVgsQ0FBeUJsQyxFQUFTaEgsRUFBTTBILEdBQzlDLE1BQU1MLEVBQWNLLEVBQUt1QixPQUFPLE9BRTFCRSxRQy9ERHJULGVBQW9Dc1QsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT25YLEdBQ1AsR0FBcUIsaUJBQVZBLEdBQXNCQSxHQUFTLFNBQVVBLEdBQXdCLFdBQWZBLEVBQU1vRCxLQUNqRSxPQUVGLE1BQU1wRCxDQUNSLENBQ0YsQ0RzRGtDb1gsQ0FBa0IsSUFBTS9JLEVBQUdpSCxTQUFTK0IsU0FBU2xDLEVBQWUsU0FDNUYsTUFBTyxDQUFDK0IsSUFBc0I5QixFQUFhRCxFQUFlQyxFQUM1RCxDQTFEc0RrQyxDQUFhdkMsRUFBU2hILEdBQzFFLEdBQUltSCxFQUVGLE9BREFyUSxRQUFRQyxLQUFLa1EsRUFBTXVDLE1BQU0sZ0JBQWdCeEosRUFBS3ZMLGlCQUN2QyxFQUdULElBQUttTSxHQUFNb0csRUFBU2hILEdBQU8sT0FFdEJBLEVBQUt5SixjQUNGbkosRUFBR2lILFNBQVNtQyxVQUFVdEMsRUFBZUMsRUFBYSxRQUUxRCxPQUFPLENBQ1QsQ0FsQ1VzQyxDQUFjM0osRUFDdEIsR0FtQ0YsU0FBU1ksR0FBTW9HLEVBQWtCaEgsR0FFL0IsR0FEQWxKLFFBQVFDLEtBQUtrUSxFQUFNdUMsTUFBTSxRQUFReEosRUFBS3ZMLGNBQ2pDdUwsRUFBS3lKLE9BQVEsQ0FDaEIsTUFBTUcsRUFBTS9CLEVBQWNXLFVBQVV4SSxFQUFLdkwsU0FBVyxHQUFJLENBQ3REK00sSUFBS3dGLEVBQVE5RyxRQUNibUIsSUFBSzJGLEVBQVEzRixJQUNid0ksT0FBTyxFQUNQL1UsTUFBTyxZQUVULEdBQW1CLElBQWY4VSxFQUFJdFUsT0FFTixPQURBOUMsUUFBUXNYLFNBQVdGLEVBQUl0VSxRQUFVLEdBQzFCLENBRVgsQ0FDQSxPQUFPLENBQ1QsQ0FFQSxNQUFNMlMsR0FBc0IsSUFBSW5LLElBQUksQ0FBQyxLQUFNLFVBQVcsV0E2QnRELE1BQU00SyxHQUFrQixDQUFDLE9BQVEsV0FDM0JHLEdBQWdCLENBQ3BCLE1BQ0EsT0FDQSxPQUNBLE9BQ0EsTUFDQSxPQUNBLE9BQ0EsT0FDQSxRQUNBLGtCQUVBLGVBQ0EsYUFFSUUsR0FBa0IsQ0FBQyxRQUFTLFNBQVUsYUFBYyxpQkFBa0Isa0JFdEg1RSxNQUVhZ0IsR0FHVCxDQUNGdFYsUUFBUyxzQkFDVGtTLFNBQVUsa0VBQ1ZxRCxRQVI2QixDQUFBLEVBUzdCLGFBQU0zUyxDQUFRMkksU0FLVGxLLGVBQ0xrSyxHQUVBLE1BQU1nSCxFQUFVbEMsRUFBZ0I5RSxHQUMzQmdILElBQ0hsUSxRQUFRN0UsTUFBTWdWLEVBQU1DLElBQUksc0JBQ3hCMVUsUUFBUXlYLEtBQUssSUFHZixHQUFJdkssRUFBS3NILEVBQVEzRixJQUFJd0MsSUFFbkIsWUFEQS9NLFFBQVFDLEtBQUssZ0NBQWdDaVEsRUFBUTNGLElBQUl3QyxNQUkzRCxNQUFNcUcsRUFBVWxELEVBQVEzRixJQUFJOEksS0FDdEJDLEVBQU85WCxPQUFPNFgsS0FDZjVYLE9BQU9DLFVBQVU2WCxJQUFTQSxHQUFRLEtBQ3JDdFQsUUFBUTdFLE1BQU1nVixFQUFNQyxJQUFJLHlDQUF5Q2dELE1BQ2pFMVgsUUFBUXlYLEtBQUssSUFHZm5ULFFBQVFDLEtBQUsscUJBQXFCcVQsS0FDbEMsVUFDUUMsRUFBZ0JELEVBQ3hCLENBQUUsTUFDQSxDQUVKLENBL0JVRSxDQUFnQnRLLEVBQ3hCLEdDakJLLE1BQU11SyxHQUFjLElBQUlDLEVDZXpCQyxHQUEwQixDQUM5QkMsY0FBYyxHQUdUNVUsZUFBZTZVLEdBQ3BCQyxFQUNBNUQsRUFDQWhILEVBQ0E2SyxFQUFnQkosSUFFaEIsTUFBTUssRUFBbUJDLEdBQWdCSCxFQUFRNUQsR0FLakQsR0FKQWdFLEdBQVdGLEVBQWlCRyxVQUFXakUsR0FDbkNoSCxFQUFLbkosU0FDUG1VLEdBQVdGLEVBQWlCSSxTQUFVbEUsRUFBUyxlQUFlLEdBRTVEaEgsRUFBS3lKLE9BRVAsT0FEQTBCLEdBQTZCTCxFQUFpQkcsVUFBVyxFQUFHSixHQUNyRCxFQUdULE1BQU1qQixRQUFZN1QsRUFBVytVLEVBQWlCSSxjQUFVdlQsRUFBVyxDQUNqRTZKLElBQUt3RixFQUFROUcsUUFDYm1CLElBQUsrSixHQUFhcEUsRUFBUTNGLElBQUt3SixHQUMvQmhCLE9BQU8sRUFDUC9VLE1BQU8sVUFDUGpDLFFBQVNnWSxFQUFLaFksUUFDZDBFLFlBQVksRUFDWlYsUUFBU21KLEVBQUtuSixVQUloQixPQUZBZ1UsRUFBS1EsV0FBV3pCLEVBQUl2WCxRQUNwQjhZLEdBQTZCTCxFQUFpQkcsVUFBV3JCLEVBQUl0VSxPQUFRdVYsR0FDOURqQixFQUFJdFUsUUFBVSxDQUN2QixDQUVPLFNBQVNnVyxHQUNkVixFQUNBNUQsRUFDQWhILEVBQ0E2SyxFQUFnQkosSUFFaEIsT0FBT0YsR0FBWWdCLHlCQUF5QnpWLFVBQzFDLE1BQU1nVixFQUFtQkMsR0FBZ0JILEVBQVE1RCxHQUVqRCxHQURBZ0UsR0FBV0YsRUFBaUJHLFVBQVdqRSxFQUFTLG9CQUFvQixHQUNoRWhILEVBQUt5SixPQU1QLE9BTEF1QixHQUFXRixFQUFpQkcsVUFBV2pFLEVBQVMsaUJBQzVDaEgsRUFBS25KLFNBQ1BtVSxHQUFXRixFQUFpQkksU0FBVWxFLEVBQVMsaUJBQWlCLEdBRWxFbUUsR0FBNkJMLEVBQWlCRyxVQUFXLEVBQUdKLEdBQ3JELEVBR1QsTUFBTWpCLFFBQVk3VCxFQUFXK1UsRUFBaUJJLGNBQVV2VCxFQUFXLENBQ2pFNkosSUFBS3dGLEVBQVE5RyxRQUNibUIsSUFBSytKLEdBQWFwRSxFQUFRM0YsSUFBS3dKLEdBQy9CaEIsT0FBTyxFQUNQL1UsTUFBTyxPQUNQakMsUUFBU2dZLEVBQUtoWSxRQUNkNEQsa0JBQWtCLEVBQ2xCYyxZQUFZLEVBQ1pWLFFBQVNtSixFQUFLbkosVUFFaEJnVSxFQUFLUSxXQUFXekIsRUFBSXZYLFFBQ3BCMlksR0FBV0YsRUFBaUJHLFVBQVdqRSxFQUFTLGlCQUM1Q2hILEVBQUtuSixTQUNQbVUsR0FBV0YsRUFBaUJJLFNBQVVsRSxFQUFTLGlCQUFpQixHQUVsRSxNQUFNd0UsRUFBTTVCLEVBQUkxVyxPQUFPNlUsT0FNdkIsT0FMSXlELElBQ0ZoWixRQUFRVSxPQUFPc0QsTUFBTWdWLEdBQ3JCaFosUUFBUVUsT0FBT3NELE1BQU0sT0FFdkIyVSxHQUE2QkwsRUFBaUJHLFVBQVdyQixFQUFJdFUsT0FBUXVWLEdBQzlEakIsRUFBSXRVLFFBQVUsR0FFekIsQ0FLQSxTQUFTeVYsR0FBZ0JILEVBQWdCNUQsR0FDdkMsSUFBSXlFLEVBQVliLEVBQ2J4SixXQUFXLEtBQU0sSUFDakJBLFdBQVcsU0FBVSxLQUNyQkEsV0FDQyxtQkFDQTRGLEVBQVF0RyxZQUFZd0MsY0FBY3dJLE1BQVEsbUJBQXFCLCtCQUVoRXRLLFdBQVcsVUFBVzRGLEVBQVF0RyxZQUFZd0MsY0FBY3dJLE1BQVEscUJBQXVCLGdCQUN2RnRLLFdBQVcsT0FBUTRGLEVBQVEzRyxlQUFpQixpQkFBbUIsU0FFL0RlLFdBQVcsWUFBYStFLEVBQWlCLGlCQUFtQixhQUMzREEsSUFDRnNGLEVBQVlBLEVBQ1RySyxXQUFXLG9CQUFxQixpQkFDaENBLFdBQVcsOEJBQStCLGlCQUUxQ0EsV0FBVyxnQkFBaUIsZ0JBQzVCQSxXQUFXLHdCQUF5QixZQUVwQ0EsV0FBVywrQ0FBZ0QsS0FFaEVxSyxFQUFZQSxFQUFVMUQsT0FDdEIsTUFBTTRELEVBQWtCQyxHQUFjSCxFQUFVckssV0FBVyxRQUFTLEdBQUdxRixRQUNqRW9GLEVBQWlCRCxHQUNyQkgsRUFFR3JLLFdBQVcsbUJBQW9CLEdBQUdxRixrQkFDbENyRixXQUFXLFNBQVUrRSxHQUFrQmEsRUFBUS9DLFVBQVksR0FBSyxHQUFHd0MsUUFHbEVxRixFQUFnQjlFLEVBQVEzRixJQUFJVyxPQUFTLE9BQU9nRixFQUFRM0YsSUFBSVcsUUFBVSxnQkFBa0IsR0FDMUYsTUFBTyxDQUNMaUosVUFBVyxHQUFHeEUsWUFBK0JxRixRQUFvQkgsSUFDakVULFNBQVVXLEVBRWQsQ0FFTyxTQUFTYixHQUFXRixFQUEwQjlELEVBQWtCK0UsRUFBUyxRQUFTQyxHQUFPLEdBQzlGbFYsUUFBUUMsS0FDTixNQUNHaVYsRUFBTy9FLEVBQU1nRixLQUFPaEYsRUFBTWlGLE1BQU1qRixFQUFNa0YsS0FBSyxHQUFHSixNQUFZakIsR0FDM0Q3RCxFQUFNZ0YsS0FBSyxPQUFPakYsRUFBUTlHLFdBRWhDLENBRU8sU0FBU2lMLEdBQ2RQLEVBQ0FkLEVBQ0FlLEdBRWlCLElBQWJmLEVBQ0ZoVCxRQUFRQyxLQUFLa1EsRUFBTXVDLE1BQU12QyxFQUFNa0YsS0FBSyxhQUFjdkIsS0FFbEQ5VCxRQUFRQyxLQUFLa1EsRUFBTUMsSUFBSUQsRUFBTWtGLEtBQUsscUJBQXFCckMsUUFBZ0JjLEtBQzdDLElBQXRCQyxFQUFLSCxjQUNQbFksUUFBUXlYLEtBQUtILEdBQVksR0FHL0IsQ0FFQSxTQUFTc0IsR0FBYS9KLEVBQXlDd0osR0FDN0QsTUFBTXVCLEVBQVMsSUFBSy9LLEdBT3BCLE9BTkl3SixFQUFLd0IsS0FDUEQsRUFBT3ZJLEdBQUssS0FFVmdILEVBQUt5QixhQUNQRixFQUFPRyxZQUFjLEtBRWhCSCxDQUNULENBRUEsU0FBU1IsR0FBY25YLEdBRXJCLE9BQU9BLEVBQVFvTSxTQUFTLGFBRXRCcE0sRUFBUW9NLFNBQVMsZUFFakJwTSxFQUFRb00sU0FBUyxXQUNqQnBNLEVBQVFvTSxTQUFTLHVCQUNmcE0sRUFBUTJNLFdBQVcsWUFBYSxPQUNoQzNNLENBQ04sQ0N6S0EsTUFrQk0rWCxHQUFrQixJQUFJMU8sSUFBSSxDQUM5QixRQUNBLE1BQ0EsTUFDQSxNQUNBLE1BQ0EsTUFDQSxPQUNBLEtBQ0EsT0FDQSxRQUNBLFFBQ0EsTUFDQSxNQUNBLE1BQ0EsU0FDQSxLQUNBLE1BQ0EsTUFDQSxPQUNBLFFBRUkyTyxHQUFtQixJQUFJM08sSUFBSSxDQUFDLE1BQU8sTUFBTyxLQUFNLE1BQU8sTUFBTyxNQUFPLEtBQU0sUUFDM0U0TyxHQUFxQixJQUFJNU8sSUFBSSxDQUNqQyxNQUNBLE1BQ0EsTUFDQSxNQUNBLE9BQ0EsT0FDQSxLQUNBLE9BQ0EsUUFDQSxRQUNBLE1BQ0EsS0FDQSxNQUNBLE1BQ0EsT0FDQSxLQUNBLE1BQ0EsTUFDQSxPQUNBLFFBRUk2TyxHQUF5QixJQUFJN08sSUFBSSxJQUFJNE8sSUFBb0J0SyxPQUFRd0ssSUFBU0osR0FBZ0J0RSxJQUFJMEUsS0FFdkZDLEdBR1QsQ0FDRnBZLFFBQVMsa0JBQ1RrUyxTQUFVLG9CQXRFSSxDQUNkbUcsSUFBSyxDQUNIbEcsWUFBYSx5QkFDYkMsS0FBTSxXQUVSa0csT0FBUSxDQUNObkcsWUFBYSxrQkFDYkMsS0FBTSxZQWlFUixhQUFNeFAsQ0FBUTJJLEdBQ2EsVUFBckJ4TixRQUFRQyxXQUNWcUUsUUFBUTdFLE1BQU1nVixFQUFNQyxJQUFJLDhDQUN4QjFVLFFBQVF5WCxLQUFLLElBR2YsTUFBTXhFLFFBQWlCVixFQUF1Qi9FLEdBQU0sR0FDL0N5RixJQUNIM08sUUFBUTdFLE1BQU1nVixFQUFNQyxJQUFJLHNCQUN4QjFVLFFBQVF5WCxLQUFLLElBR2YsTUFBTStDLEVBQVFoTixFQUFLZ04sT0FBUyxHQUN0QkMsRUFBeUIsSUFBSTViLElBQzdCNmIsRUFBOEIsR0FDOUJDLEVBQWlDLEdBQ3ZDLElBQ0lDLEVBQ0FDLEVBRkFDLEdBQWtDLEVBR3RDLEdBQUlOLEVBQU1oWixPQUFTLEVBQUcsQ0FDcEIsSUFBSyxNQUFNdVosS0FBUVAsRUFBTyxDQUN4QixNQUFNemIsRUFBV0ssRUFBS0MsUUFBUWMsT0FBTzRhLElBQ3JDLEdBQ0VoYyxFQUFTNlQsU0FBUyxtQkFDbEI3VCxFQUFTc1AsU0FBUyxvQkFDbEJ0UCxFQUFTNlQsU0FBUyxtQkFDbEI3VCxFQUFTc1AsU0FBUyxtQkFFbEIsU0FHRixNQUFNMk0sRUFBWTViLEVBQUs2YixRQUFRbGMsR0FBVTJOLE1BQU0sR0FDL0MsR0FBSTNOLEVBQVM2VCxTQUFTLGlCQUFrQixDQUN0QytILEVBQXFCdlosS0FBS3JDLEdBQzFCLFFBQ0YsQ0FFQSxNQUFNeVYsRUFBVTBHLEdBQWtCakksRUFBU3pTLFlBQWF6QixHQUN4RCxHQUFLeVYsRUFFTCxHQUFJMkcsR0FBeUIzRyxFQUFTd0csR0FBWSxDQUNoRCxNQUFNSSxFQUFnQlgsRUFBdUJ4YixJQUFJdVYsSUFBWSxHQUM3RDRHLEVBQWNoYSxLQUFLckMsR0FDbkIwYixFQUF1QmxiLElBQUlpVixFQUFTNEcsR0FDaENDLEdBQWM3RyxJQUNoQmtHLEVBQWtCdFosS0FBS3JDLEVBRTNCLE1BQVdtYixHQUFtQnhFLElBQUlzRixHQUNoQ04sRUFBa0J0WixLQUFLckMsR0FDZHVjLEdBQXNCTixLQUFleEcsRUFBUXRELGtCQUN0RDVNLFFBQVE3RSxNQUFNZ1YsRUFBTUMsSUFBSSx1QkFBdUJGLEVBQVFuUixtQ0FDdkR5WCxHQUFrQyxFQUV0QyxDQUNBRixFQUFlRixFQUNmRyxFQUFzQkYsQ0FDeEIsTUFDRUMsRUF3R0MsU0FDTFcsRUFDQXRJLEdBRUEsTUFBTS9RLEVBQU8sSUFBSW9KLElBQVksQ0FBQyxlQUFlLElBQUk2TyxJQUF3QmhYLEtBQUssUUFBUyw2QkFDdkYsSUFBSyxNQUFNcVIsS0FBV3ZCLEVBQVUsQ0FDOUIsSUFBS29JLEdBQWM3RyxHQUFVLFNBRTdCLE1BQU1nSCxFQUFpQnBjLEVBQUsrRCxLQUFLcVIsRUFBUTlHLFFBQVMsZUFBaUIsSUFBSXdNLElBQW9CL1csS0FBSyxLQUFPLEtBQ3ZHakIsRUFBS3NKLElBQUlwTSxFQUFLeVEsU0FBUzBMLEVBQWFDLElBQW1CQSxFQUN6RCxDQUNBLE1BQU8sSUFBSXRaLEVBQ2IsQ0FwSHFCdVosQ0FBa0J4SSxFQUFTSCxLQUFLcEYsUUFBU3VGLEVBQVN6UyxhQUNqRXFhLEVBQXNCNUgsRUFBU3pTLFlBQVl3TCxJQUFLckUsR0FBTUEsRUFBRTZJLGlCQUcxRCxNQUFNa0wsRUFBa0MsR0FDbENDLEVBQWlCLENBQUV6RCxjQUFjLEVBQU80QixZQUFZLEdBQzFELEdBQUlVLEVBQU1oWixPQUFTLEVBQ2pCLElBQUssTUFBT2dULEVBQVM0RyxLQUFrQlgsRUFBd0IsQ0FDN0QsTUFBTUosRUFBY3VCLEdBQWlCcEgsRUFBU2hILEVBQU00TixHQUMvQ2YsR0FFTHFCLEVBQWF0YSxLQUFLMFgsR0FBdUJ1QixFQUFhN0YsRUFBU2hILEVBQU1tTyxHQUN2RSxNQUVBLElBQUssTUFBTW5ILEtBQVd2QixFQUFTelMsWUFBYSxDQUMxQyxHQUFJZ1UsRUFBUXRHLFlBQVl5RSxhQUFlNkIsRUFBUTlGLGNBQWUsU0FFOUQsTUFBTTJMLEVBQWN1QixHQUFpQnBILEVBQVNoSCxHQUN6QzZNLEdBRUxxQixFQUFhdGEsS0FBSzBYLEdBQXVCdUIsRUFBYTdGLEVBQVNoSCxFQUFNbU8sR0FDdkUsQ0FFRixNQUFNRSxRQUFzQnJZLFFBQVFzWSxJQUFJSixJQUVwQ1osR0FBbUNlLEVBQWMxRixLQUFNbUIsR0FBMEIsSUFBYkEsS0FDdEV0WCxRQUFReVgsS0FBSyxHQUdYakssRUFBSytNLFNBQ0hLLEVBQWFwWixPQUFTLFNBQ2xCc1gsR0FDSmlELEdBQWtCLENBQ2hCLE9BQ0EsV0FDQSxVQUNBLFVBQ0Esa0NBQ0EsVUFDQSxRQUNHbkIsSUFFTDNILEVBQVNILEtBQ1R0RixFQUNBLENBQUVzTSxZQUFZLElBR2RlLEVBQW9CclosT0FBUyxTQUN6QnNYLEdBQ0ppRCxHQUFrQixDQUFDLE9BQVEsb0JBQXFCLFFBQVNsQixJQUN6RDVILEVBQVNILEtBQ1R0RixFQUNBLENBQ0VzTSxZQUFZLElBS3RCLEdBR0ssU0FBUzhCLEdBQ2RwSCxFQUNBaEgsRUFJQWdOLEdBRUEsR0FBZ0MsVUFBNUJoRyxFQUFRdEQsZ0JBQTZCLENBQ3ZDLElBQUk4SyxFQVVKLE9BUkVBLEVBREV4TyxFQUFLOE0sS0FBTzlNLEVBQUsrTSxPQUNQLENBQUMsUUFBUyxTQUNiL00sRUFBSzhNLElBQ0YsQ0FBQyxPQUFRLFNBQ1o5TSxFQUFLK00sT0FDRixDQUFDLFNBQVUsU0FFWCxDQUFDLFFBRVJ3QixHQUFrQixDQUN2QixNQUNBLFdBQ0dDLEVBQ0gsaUJBQ0EsMkJBQ0EsaUNBQ0l4QixHQUFPaFosT0FBUyxDQUFDLE1BQVEsTUFDekJnWixHQUFTLElBRWpCLENBQ0EsR0FBZ0MsV0FBNUJoRyxFQUFRdEQsZ0JBQ1YsT0FBTzZLLEdBQWtCLENBQ3ZCLE9BQ0EsU0FDQSxhQUNJdk8sRUFBSzhNLEtBQU85TSxFQUFLK00sT0FBUyxDQUFDLFNBQVcsR0FDMUMsUUFDSUMsR0FBUyxDQUFDLE1BSXBCLENBZ0JBLFNBQVNVLEdBQWtCakksRUFBcUJsVSxHQUM5QyxJQUFJa2QsRUFDSixJQUFLLE1BQU16SCxLQUFXdkIsRUFFakJsVSxJQUFheVYsRUFBUTlHLFVBQVczTyxFQUFTbWQsV0FBVyxHQUFHMUgsRUFBUTlHLGFBQzlEdU8sS0FBaUJ6SCxFQUFROUcsUUFBUWxNLE9BQVN5YSxFQUFjdk8sUUFBUWxNLFVBRWxFeWEsRUFBZ0J6SCxHQUdwQixPQUFPeUgsQ0FDVCxDQUVBLFNBQVNYLEdBQXNCTixHQUM3QixPQUFPaEIsR0FBZ0J0RSxJQUFJc0YsSUFBY2YsR0FBaUJ2RSxJQUFJc0YsRUFDaEUsQ0FFQSxTQUFTRyxHQUF5QjNHLEVBQTJDd0csR0FDM0UsTUFBZ0MsVUFBNUJ4RyxFQUFRdEQsZ0JBQW9DOEksR0FBZ0J0RSxJQUFJc0YsR0FDcEMsV0FBNUJ4RyxFQUFRdEQsaUJBQXFDK0ksR0FBaUJ2RSxJQUFJc0YsRUFFeEUsQ0FFQSxTQUFTSyxHQUFjN0csR0FDckIsTUFBbUMsV0FBNUJBLEVBQVF0RCxlQUNqQixDQUVBLFNBQVM2SyxHQUFrQjdaLEdBQ3pCLE9BQU9BLEVBQUs4SixJQUFLbVEsR0FHbkIsU0FBNkJBLEdBQzNCLE1BQU8sb0JBQW9CblosS0FBS21aLEdBQU9BLEVBQU0sSUFBSUEsRUFBSXZOLFdBQVcsSUFBSyxhQUN2RSxDQUwyQndOLENBQW9CRCxJQUFNaFosS0FBSyxJQUMxRCxDQzVSTyxTQUFVa1osR0FBeUJDLEVBQXFCckosR0FDN0QsSUFBSyxNQUFNdUIsS0FBV3ZCLEVBQ3BCM08sUUFBUUMsS0FBSyxZQUFZK1gsVUFBb0I5SCxFQUFRblIsa0JBRS9DbVIsQ0FFVixDQ0tBLE1BUWErSCxHQUE2RixDQUN4R3RhLFFBQVMseUJBQ1RrUyxTQUFVLDhEQVZJLENBQ2RxSSxRQUFTLENBQ1BwSSxZQUFhLHlFQUNiQyxLQUFNLFVBQ05DLE1BQU8sTUFRVCxhQUFNelAsQ0FBUTJJLEdBQ1osTUFBTXlGLFFBQWlCVixFQUF1Qi9FLEdBQ3pDeUYsSUFDSDNPLFFBQVE3RSxNQUFNZ1YsRUFBTUMsSUFBSSxzQkFDeEIxVSxRQUFReVgsS0FBSyxJQUdmLElBQUssTUFBTWpELEtBQVc2SCxHQUF5Qix5QkFBMEJwSixFQUFTelMsYUFBYyxDQUM5RixNQUFNME4sRUFBMkJzRyxFQUFRdEcsWUFDbkM2QixFQUFPLENBQUMsZUFBZ0IsbUJBQzlCLElBQUssTUFBTUMsS0FBT0QsRUFBTSxDQUN0QixNQUFNME0sRUFBT3ZPLEVBQVk4QixJQUFRLENBQUEsRUFDakMsSUFBSyxNQUFPM00sRUFBTTRNLEtBQVV0RCxPQUFPL0csUUFBUTZXLEdBQ3JDeE0sR0FBT2lNLFdBQVcscUJBQ3BCTyxFQUFLcFosR0FBUSxLQUFLQSxJQUd4QixDQVFBLEdBTkFxWixHQUF3QmxQLEVBQU1VLEdBRTlCeU8sR0FBZ0J6TyxHQUVoQjBPLEdBQWtCMU8sR0FFZFYsRUFBS3lKLE9BQVEsU0FFakIsTUFBTTRGLEVBQWNyUCxFQUFLZ1AsUUFBVXBkLEVBQUsrRCxLQUFLcVIsRUFBUTlHLFFBQVMsUUFBVThHLEVBQVE5RyxjQUMxRUksRUFBR2lILFNBQVNDLE1BQU02SCxFQUFhLENBQUU1SCxXQUFXLFVBQzVDbkgsRUFBR2lILFNBQVNtQyxVQUFVOVgsRUFBSytELEtBQUswWixFQUFhLGdCQUFpQjFRLEtBQUtDLFVBQVU4QixHQUFjLE9BQ25HLENBQ0tWLEVBQUt5SixRQUFXekosRUFBS2dQLFVBQ3hCbkgsRUFBY1csVUFBVWhDLEdBQWdCLENBQUMsV0FBWSxDQUNuRDFSLE1BQU8sWUFFVGdDLFFBQVFDLEtBQUssMkJBRWpCLEdBR0YsU0FBU21ZLEdBQXdCbFAsRUFBMkNVLEdBQzFFLElBQUtWLEVBQUtnUCxRQUdSLGNBRk90TyxFQUFZMEMscUJBQ25CdE0sUUFBUUMsS0FBSyxnQ0FJZixNQUFNdVksRUFBVTVPLEVBQVkwQyxpQkFBbUIsQ0FBQSxFQUN6Q21NLEVBQXVCLENBQzNCLFlBQ0EsUUFDQSxlQUNBLDZDQUNBLFNBQ0EsUUFDQSxXQUNBLE9BQ0EsWUFDQSxjQUNBLFdBQ0EsYUFDQSxXQUNBLFFBQ0EsVUFDQSxtQkFDQSxvQkFDQSxVQUNBLFVBRUlDLEVBQXdCLEdBQzlCLElBQUssTUFBTTNaLEtBQVFzSixPQUFPb0QsS0FBSytNLElBRTNCQyxFQUFxQjVHLEtBQU04RyxHQUFTNVosRUFBS2dMLFNBQVM0TyxLQUNqRDVaLEVBQUtnTCxTQUFTLGdCQUFrQmhMLEVBQUtnTCxTQUFTLG9CQUd4Q3lPLEVBQVF6WixHQUNmMlosRUFBWTViLEtBQUtpQyxJQUdyQmlCLFFBQVFDLEtBQUssMkJBQTRCeVksRUFBWTdaLEtBQUssT0FBUyxPQUNyRSxDQUVBLFNBQVN3WixHQUFnQnpPLEdBQ3ZCLE1BQU1nUCxFQUFnQyxDQUFDLFFBQVMsU0FBVSxTQUFVLE9BQVEsUUFBUyxRQUMvRUMsRUFBbUMsQ0FBQyxTQUFVLFVBQzlDaFAsRUFBV0QsRUFBWUMsU0FBVyxDQUFBLEVBQ2xDaVAsRUFBMkIsR0FDakMsSUFBSyxNQUFPL1osRUFBTWdhLEtBQVkxUSxPQUFPL0csUUFBUXVJLElBRXpDK08sRUFBOEIvRyxLQUFNOEcsR0FBUzVaLEVBQUs2WSxXQUFXZSxLQUU3REUsRUFBaUNoSCxLQUFNOEcsR0FBU0ksRUFBUWhQLFNBQVM0TyxJQUFTSSxFQUFROUgsU0FBVzBILEVBQUsxSCxrQkFHM0ZwSCxFQUFROUssR0FDZitaLEVBQWVoYyxLQUFLaUMsSUFHeEJpQixRQUFRQyxLQUFLLG1CQUFvQjZZLEVBQWVqYSxLQUFLLE9BQVMsT0FDaEUsQ0FFQSxTQUFTeVosR0FBa0IxTyxVQUNsQkEsRUFBWW9QLGVBQ1pwUCxFQUFZcVAscUJBQ1pyUCxFQUFZc1AsUUFDckIsQ0M5SEEsTUFBTUMsR0FBYyxRQUVkQyxHQUF3QixDQUM1QixDQUFFQyxXQUFZdmUsRUFBSytELEtBQUssU0FBVSxpQkFBa0J5YSxPQUFRLFVBQzVELENBQUVELFdBQVl2ZSxFQUFLK0QsS0FBSyxTQUFVLFVBQVd5YSxPQUFReGUsRUFBSytELEtBQUssU0FBVSxXQUN6RSxDQUFFd2EsV0FBWXZlLEVBQUsrRCxLQUFLLEtBQU0saUJBQWtCeWEsT0FBUSxPQTJGMUQsU0FBU0MsR0FBbUJySixHQUMxQixPQUFPQSxFQUFRdEcsWUFBWXdDLGNBQWN3SSxNQUFRLFdBQWEsY0FDaEUsQ0FFQSxTQUFTNEUsR0FBaUJ0SixHQUN4QixPQUFPa0osR0FBc0IxTCxLQUFLLEVBQUcyTCxnQkFBaUI3UCxFQUFHUSxXQUFXbFAsRUFBS0MsUUFBUW1WLEVBQVE5RyxRQUFTaVEsTUFDOUZDLE1BQ04sQ0F5Qk8sTUFBTUcsR0FBZ0IsSUFuSDdCLE1BQ0VDLGlCQUFBQSxDQUFrQnhKLEdBQ2hCLE1BQU05RyxFQUFVbVEsR0FBbUJySixHQThGdkMsSUFBOERvSixFQTFGMUQsTUFBTyxHQTJGRixZQURxREEsRUE3RmtCLEdBQUdsUSwwR0E4RmtDK1AsS0FBY0csb0JBQXlCQSxTQUFjQSxrQkEzRmxJbFEsMEJBQ3RDLENBRUF1USxNQUFBQSxDQUFPcFUsRUFBWXFVLEVBQW9CLElBQ3JDLE1BQU8seUJBQXlCQSxHQUNsQyxDQUVBQyxXQUFBQSxDQUFZM0osR0FDVixNQUFNOUcsRUFBVW1RLEdBQW1CckosR0FDN0I0SixFQThFRCxXQTlFOEMsR0FBRzFRLHFCQUd0RCxNQUFPLEdBQUcwUSxrREFBZ0VBLDREQUN0QjFRLGtCQUF3QkEsNkJBQW1DQSw4REFDakgsQ0FFQTJRLFdBQUFBLENBQVk3SixHQUVWLE1BQU8seUNBRFNxSixHQUFtQnJKLGlCQUVyQyxDQUVBOEosT0FBQUEsQ0FBUTlKLEVBQWtCMEosRUFBb0IsSUFDNUMsTUFBTyx5QkFBeUJBLDJCQUEyQzlhLEtBQUttYixLQUFLL0osSUFDdkYsQ0FFQWdLLFVBQUFBLENBQVczVSxFQUFZcVUsRUFBb0IsSUFDekMsTUFBTyxzQkFBc0JBLEdBQy9CLENBRUFuWSxLQUFBQSxDQUFNeU8sRUFBa0IwSixFQUFvQixJQUUxQyxNQUFNTyxFQUFrQixHQUNsQkMsRUE4REgsU0FBaUNsSyxHQUN0QyxNQUFNbUssRUFBUW5LLEVBQVEzRixJQUFJK1AsYUFDMUIsSUFBS0QsR0FBT3pDLFdBQVd1QixJQUFjLE9BRXJDLE1BQU1vQixFQUFZRixFQUFNalMsTUFBTStRLEdBQW9CeEgsUUFBUSxVQUFXLElBQ3JFLElBQUs0SSxFQUFXLE9BRWhCLE1BQU1DLEVBQVVoQixHQUFpQnRKLEdBQzNCdUssRUFBZTNmLEVBQUs0ZixXQUFXSCxHQUNqQ0EsRUFDQXpmLEVBQUtDLFFBQVFtVixFQUFROUcsUUFBU29SLEdBQVcsSUFBS0QsR0FFbEQsTUFBTyxVQUFVRSxPQUFrQkEsV0FBc0JBLFFBQzNELENBM0UyQkUsQ0FBd0J6SyxHQUMzQ2tLLEdBQWdCRCxFQUFNcmQsS0FBS3NkLEdBQy9CLE1BQU1RLEVBQWUsQ0FBQywrQkFBZ0NoQixHQUFtQnRPLE9BQU91UCxTQUFTaGMsS0FBSyxLQU05RixPQUxBc2IsRUFBTXJkLEtBQUs4ZCxHQUNQMUssRUFBUXRHLFlBQVl3QyxjQUFjd0ksT0FFcEN1RixFQUFNcmQsS0FBS2dDLEtBQUttYixLQUFLL0osSUFFaEJpSyxFQUFNN08sT0FBT3VQLFNBQVNoYyxLQUFLLE9BQ3BDLENBRUFpYyxPQUFBQSxDQUFRNUssRUFBa0I2SyxHQUV4QixNQUFPLFVBQVVBLG9EQUE2REEsS0FEOUR4QixHQUFtQnJKLGlCQUVyQyxDQUVBK0osSUFBQUEsQ0FBSy9KLEVBQWtCOEssR0FDckIsT0FBSTlLLEVBQVF0RyxZQUFZd0MsY0FBY3dJLE1BQWMsc0JBQXFCb0csRUFBYSxPQUFPQSxJQUFlLElBQ3hHQSxFQUFtQixvQkFBb0JBLElBQ3RDOUssRUFBUXRHLFlBQVl5QyxRQUErQzROLEtBQWEsc0JBQzlFLHdFQUNULENBRUFnQixNQUFBQSxDQUFPL0ssRUFBa0JnTCxFQUFzQnRCLEVBQW9CLElBQ2pFLElBQUkzRSxFQUFTLEdBRWIsR0FBSWlHLEVBQ0YsSUFDRSxJQUFJMVQsSUFBSTBULEdBQ1JqRyxFQUFTLGdCQUFnQmlHLElBQzNCLENBQUUsTUFDQSxNQUFNVCxFQUFlM2YsRUFBS0MsUUFBUW1nQixHQUNsQ2pHLEVBQVMsZ0JBQWdCa0UsS0FBY3NCLElBQ3pDLE1BQ0ssR0FBSXZLLEVBQVEzRixJQUFJK1AsY0FBYzFDLFdBQVd1QixJQUFjLENBQzVELE1BQU1xQixFQUFVaEIsR0FBaUJ0SixHQUNqQyxHQUFJc0ssRUFBUyxDQUNYLE1BQU1DLEVBQWUzZixFQUFLQyxRQUFRbVYsRUFBUTlHLFFBQVNvUixFQUFTdEssRUFBUTNGLElBQUkrUCxhQUFhbFMsTUFBTStRLElBQzNGbEUsRUFBUyxnQkFBZ0JrRSxLQUFjc0IsSUFDekMsQ0FDRixDQUNBLE1BQU8sR0FBR3hGLGtCQUF1QjJFLEdBQ25DLEdDaEdXdUIsR0FBdUIsQ3RCTWxDNVEsSUFBSyxDQUNIdUYsWUFBYSwyQkFDYkMsS0FBTSxTQUVSLGNBQWUsQ0FDYkQsWUFDRSx3TEFDRkMsS0FBTSxVQUVSLG1CQUFvQixDQUNsQkQsWUFBYSwwRkFDYkMsS0FBTSxXQUVSLG1CQUFvQixDQUNsQkQsWUFBYSxpRUFDYkMsS0FBTSxVQUNOcUwsU0FBUyxHQUVYLG1CQUFvQixDQUNsQnRMLFlBQWEscUdBQ2JDLEtBQU0sVUFDTnFMLFNBQVMsR0FFWCxZQUFhLENBQ1h0TCxZQUFhLHFGQUNiQyxLQUFNLFNBQ05xTCxRQUFTLGdCQUVYcmIsUUFBUyxDQUNQK1AsWUFBYSxzQ0FDYkMsS0FBTSxVQUNOQyxNQUFPLEtzQmxDVCxjQUFlLENBQ2JGLFlBQWEsc0JBQ2JDLEtBQU0sU0FDTkMsTUFBTyxLQUVULFVBQVcsQ0FDVEYsWUFBYSwyQ0FDYkMsS0FBTSxVQUNOQyxNQUFPLENBQUMsTUFBTyxPQ0Nia0QsR0FBVSxDQUFBLEVBRUhtSSxHQUErQixDQUMxQzFkLFFBQVMsU0FDVGtTLFNBQVUsc0JBQ1ZxRCxRQUFVb0ksR0FDREEsRUFDSjNkLFFBQVE0ZCxJQUNSNWQsUUFBUTZkLElBQ1I3ZCxRQUFROGQsSUFDUjlkLFFBQVErZCxJQUNSL2QsUUFBUWdlLElBQ1JoZSxRQUFRaWUsSUFDUmplLFFBQVFrZSxJQUNSbGUsUUFBUWlkLElBQ1JqZCxRQUFRbWUsSUFDUm5lLFFBQVFvZSxJQUNScGUsUUFBUXFlLElBQ1JyZSxRQUFRc2UsSUFDUkMsZ0JBQ0FDLFFBQU8sR0FFWjViLE9BQUFBLEdBQ0UsR0FJRWdiLEdBQXdGLENBQzVGNWQsUUFBUyxxQkFDVGtTLFNBQVUsNkNBQ1ZxRCxHQUNBLGFBQU0zUyxDQUFRMkksR0FDWixNQUFNa1QsUUFBb0JDLEdBQW1CblQsR0FDN0MsSUFBSyxNQUFNZ0gsS0FBVzZILEdBQXlCLDRCQUE2QnFFLFNBQ3BFdkksR0FBYTRGLEdBQWNDLGtCQUFrQnhKLEdBQVVBLEVBQVNoSCxFQUUxRSxHQUdJc1MsR0FBNkYsQ0FDakc3ZCxRQUFTLDJCQUNUa1MsU0FBVSwrQ0FDVnFELEdBQ0EsYUFBTTNTLENBQVEySSxHQUNaLE1BQU1rVCxRQUFvQkMsR0FBbUJuVCxHQUM3QyxJQUFLLE1BQU1nSCxLQUFXNkgsR0FBeUIsa0NBQW1DcUUsR0FDaEZFLEdBQXVCcE0sRUFFM0IsR0FHSXVMLEdBQTZFLENBQ2pGOWQsUUFBUyxTQUNUa1MsU0FBVSx3REFDVnFELEdBQ0EsYUFBTTNTLENBQVEySSxHQUNaLE1BQU1rVCxRQUFvQkMsR0FBbUJuVCxHQUN2Q3FULEVBQWlCQyxHQUFzQnRULEdBQzdDLElBQUssTUFBTWdILEtBQVc2SCxHQUF5QixnQkFBaUJxRSxTQUN4RHZJLEdBQWE0RixHQUFjRSxPQUFPekosRUFBU3FNLEdBQWlCck0sRUFBU2hILEVBRS9FLEdBR0l3UyxHQUFrRixDQUN0Ri9kLFFBQVMsZUFDVGtTLFNBQVUsK0ZBQ1ZxRCxHQUNBLGFBQU0zUyxDQUFRMkksR0FDWixNQUFNa1QsUUFBb0JDLEdBQW1CblQsR0FDN0MsSUFBSyxNQUFNZ0gsS0FBVzZILEdBQXlCLHNCQUF1QnFFLFNBQzlEdkksR0FBYTRGLEdBQWNJLFlBQVkzSixHQUFVQSxFQUFTaEgsRUFFcEUsR0FHSXlTLEdBQWtGLENBQ3RGaGUsUUFBUyxlQUNUa1MsU0FBVSxrQ0FDVnFELEdBQ0EsYUFBTTNTLENBQVEySSxHQUNaLE1BQU1rVCxRQUFvQkMsR0FBbUJuVCxHQUM3QyxJQUFLLE1BQU1nSCxLQUFXNkgsR0FBeUIsc0JBQXVCcUUsU0FDOUR2SSxHQUFhNEYsR0FBY00sWUFBWTdKLEdBQVVBLEVBQVNoSCxFQUVwRSxHQUdJMFMsR0FBOEUsQ0FDbEZqZSxRQUFTLFVBQ1RrUyxTQUFVLHFEQUNWcUQsR0FDQSxhQUFNM1MsQ0FBUTJJLEdBQ1osTUFBTWtULFFBQW9CQyxHQUFtQm5ULEdBQ3ZDcVQsRUFBaUJDLEdBQXNCdFQsR0FDN0MsSUFBSyxNQUFNZ0gsS0FBVzZILEdBQXlCLGlCQUFrQnFFLFNBQ3pEdkksR0FBYTRGLEdBQWNPLFFBQVE5SixFQUFTcU0sR0FBaUJyTSxFQUFTaEgsRUFFaEYsR0FHSTJTLEdBQWlGLENBQ3JGbGUsUUFBUyxjQUNUa1MsU0FBVSxrQ0FDVnFELEdBQ0EsYUFBTTNTLENBQVEySSxHQUNaLE1BQU1rVCxRQUFvQkMsR0FBbUJuVCxHQUN2Q3FULEVBQWlCQyxHQUFzQnRULEdBQzdDLElBQUssTUFBTWdILEtBQVc2SCxHQUF5QixxQkFBc0JxRSxTQUM3RHZJLEdBQWE0RixHQUFjUyxXQUFXaEssRUFBU3FNLEdBQWlCck0sRUFBU2hILEVBRW5GLEdBR0kwUixHQUE0RSxDQUNoRmpkLFFBQVMsUUFDVGtTLFNBQVUsbUJBQ1ZxRCxHQUNBLGFBQU0zUyxDQUFRMkksR0FDWixNQUFNa1QsUUFBb0JDLEdBQW1CblQsR0FDdkNxVCxFQUFpQkMsR0FBc0J0VCxHQUM3QyxJQUFLLE1BQU1nSCxLQUFXNkgsR0FBeUIsZUFBZ0JxRSxTQUN2RHZJLEdBQWE0RixHQUFjaFksTUFBTXlPLEVBQVNxTSxHQUFpQnJNLEVBQVNoSCxHQUc1RSxHQUEyQixTQUF2QnhOLFFBQVE2TyxJQUFJVyxPQUFtQixDQUNqQ3hQLFFBQVE2TyxJQUFJVyxPQUFTLE9BQ3JCLElBQUssTUFBTWdGLEtBQVc2SCxHQUF5QixpQ0FBa0NzRSxHQUFtQm5ULFVBQzVGMkssR0FBYTRGLEdBQWNoWSxNQUFNeU8sRUFBU3FNLEdBQWlCck0sRUFBU2hILEVBRTlFLENBQ0YsR0FXSTRTLEdBQXFGLENBQ3pGbmUsUUFBUyxVQUNUa1MsU0FBVSxzQ0FDVnFELFFBWHFCLElBQ2xCQSxHQUNIdUosT0FBUSxDQUNOM00sWUFBYSxvRkFDYkMsS0FBTSxXQVFSLGFBQU14UCxDQUFRMkksR0FDWixNQUFNa1QsUUFBb0JDLEdBQW1CblQsR0FDN0MsSUFBSyxNQUFNZ0gsS0FBVzZILEdBQXlCLGlCQUFrQnFFLEdBQWMsQ0FDN0UsTUFBTUssRUFDSnZULEVBQUt1VCxTQUFXdk0sRUFBUXRHLFlBQVl3QyxjQUFjd0ksTUFBUSxzQkFBd0IsaUNBQzlFZixHQUFhNEYsR0FBY3FCLFFBQVE1SyxFQUFTdU0sR0FBU3ZNLEVBQVNoSCxFQUN0RSxDQUNGLEdBWUk2UyxHQUErRSxDQUNuRnBlLFFBQVMsT0FDVGtTLFNBQVUsNkJBQ1ZxRCxRQVprQixJQUNmQSxHQUNIdUQsS0FBTSxDQUNKekcsTUFBTyxJQUNQRixZQUFhLDJCQUNiQyxLQUFNLFdBUVIsYUFBTXhQLENBQVEySSxHQUNaLE1BQU1rVCxRQUFvQkMsR0FBbUJuVCxHQUM3QyxJQUFLLE1BQU1nSCxLQUFXNkgsR0FBeUIsY0FBZXFFLFNBQ3REdkksR0FBYTRGLEdBQWNRLEtBQUsvSixFQUFTaEgsRUFBS3VOLE1BQU92RyxFQUFTaEgsRUFFeEUsR0FlSThTLEdBQW1GLENBQ3ZGcmUsUUFBUywwQkFDVGtTLFNBQVUscUJBQ1ZxRCxRQWZvQixJQUNqQkEsR0FDSCxpQkFBa0IsQ0FDaEJwRCxZQUFhLDhCQUNiQyxLQUFNLFVBRVIyTSxTQUFVLENBQ1I1TSxZQUFhLGdGQUNiQyxLQUFNLFlBUVIsYUFBTXhQLENBQVEySSxHQUNaLEdBQUlBLEVBQUt3VCxVQUFZeFQsRUFBS2dTLFlBQ3hCLE1BQU0sSUFBSTlmLE1BQU0sNERBR2xCLE1BQU1naEIsUUFBb0JDLEdBQW1CblQsR0FDdkNxVCxFQUFpQkMsR0FBc0J0VCxFQUFNLENBQUMsaUJBQWtCLGFBQ3RFLElBQUssTUFBTWdILEtBQVc2SCxHQUF5QixnQkFBaUJxRSxHQUFjLENBQzVFLE1BQU1sQixFQUFjaFMsRUFBS3dULFNBQ3JCeE0sRUFBUXRHLFlBQVl3QyxjQUFjd0ksTUFDaEMsc0JBQ0EsMEJBQ0YxTCxFQUFLZ1MsYUFBYTljLGlCQUNoQnlWLEdBQWE0RixHQUFjd0IsT0FBTy9LLEVBQVNnTCxFQUFhcUIsR0FBaUJyTSxFQUFTaEgsRUFDMUYsQ0FDRixHQUtJK1MsR0FBNEYsQ0FDaEd0ZSxRQUFTLGNBQ1RrUyxTQUFVLGlEQUNWcUQsUUFMNEIsQ0FBRXRWLEtBQU0sQ0FBRW1TLEtBQU0sVUFNNUMsYUFBTXhQLENBQVEySSxHQUNaLE1BQU1rVCxRQUFvQkMsR0FBbUJuVCxHQUd2Q3lULEVBQWMsRUFGSnpULEVBQUt0TCxNQUFNaUIsS0FBSyxNQUFRLElBQUkrZCxVQUNyQkosR0FBc0J0VCxFQUFNLENBQUMsVUFDUG9DLE9BQU91UCxTQUFTaGMsS0FBSyxLQUNsRSxJQUFLLE1BQU1xUixLQUFXNkgsR0FBeUIsVUFBVTRFLElBQWVQLFNBQ2hFdkksR0FBYSxVQUFVOEksSUFBZXpNLEVBQVNoSCxFQUV6RCxHQUdGLFNBQVNvVCxHQUF1QnBNLEdBQzlCLE1BQ01vSixFQUFTLEdBRENwSixFQUFRdEcsWUFBWXdDLGNBQWN3SSxNQUFRLEtBQU8sOEJBRTNEaUksRUFBa0IsQ0FDdEJDLG9DQUFxQzVNLEVBQVEzRixJQUFJdVMsb0NBQ2pEQyxxQ0FBc0M3TSxFQUFRM0YsSUFBSXdTLHFDQUNsREMsdUNBQXdDOU0sRUFBUTNGLElBQUl5Uyx1Q0FDcERDLDJDQUE0Qy9NLEVBQVEzRixJQUFJMFMsNENBRXBEQyxFQUFpQjdVLE9BQU8vRyxRQUFRdWIsR0FDbkN2UixPQUFPLEVBQUMsQ0FBR0ssTUFBWUEsR0FDdkJqRSxJQUFJLEVBQUVnRSxLQUFTQSxHQUNsQixHQUFJd1IsRUFBZWhnQixPQUFTLEVBQzFCLE1BQU0sSUFBSTlCLE1BQU0saURBQWlEOGhCLEVBQWVyZSxLQUFLLFNBR3ZGLE1BQU1zZSxFQUFnRCxZQUF2QmpOLEVBQVEzRixJQUFJVyxPQUF1QixLQUFPLEtBQ25Fa1MsRUFBbUIsbUJBQ2Y5RCwrR0FLY3VELEVBQWdCQywrRUFDMUJELEVBQWdCRSw4REFDVEYsRUFBZ0JHLG9FQUNaSCxFQUFnQkksaU1BR1RFLCtCQUkxQm5RLEVBQWEsc0JBQ25CLElBQ0V4RCxFQUFHNlQsY0FBY3JRLEVBQVlvUSxHQUM3QnBkLFFBQVFDLEtBQUssYUFBYStNLElBQzVCLENBQUUsTUFBTzdSLEdBQ1AsTUFBTW1pQixFQUFTbmlCLGFBQWlCQyxNQUFRRCxFQUFNa0wsUUFBVXhLLE9BQU9WLEdBQy9ELE1BQU0sSUFBSUMsTUFBTSxtQkFBbUI0UixNQUFlc1EsSUFDcEQsQ0FDRixDQUVBdGUsZUFBZXFkLEdBQW1CblQsR0FDaEMsTUFBTXlGLFFBQWlCVixFQUF1Qi9FLEdBQ3pDeUYsSUFDSDNPLFFBQVE3RSxNQUFNZ1YsRUFBTUMsSUFBSSxzQkFDeEIxVSxRQUFReVgsS0FBSyxJQUdmLE1BQU1vSyxFQUFXNU8sRUFBU3pTLFlBQVlvUCxPQUNuQzRFLEdBQVlBLEVBQVF0RyxZQUFZd0MsY0FBY0MsUUFBVTZELEVBQVF0RyxZQUFZMEMsaUJBQWlCRCxRQU1oRyxPQUp3QixJQUFwQmtSLEVBQVNyZ0IsU0FDWDhDLFFBQVE3RSxNQUFNZ1YsRUFBTUMsSUFBSSw2QkFDeEIxVSxRQUFReVgsS0FBSyxJQUVSb0ssQ0FDVCxDQUtPLFNBQVNmLEdBQXNCdFQsRUFBK0JzVSxFQUF5QixJQUM1RixNQUFNakIsRUFBMkIsR0FHM0JrQixFQUFtQnBWLE9BQU9vRCxLQUFLMFAsSUFDL0J1QyxFQUFzQnJWLE9BQU9wQixPQUFPa1UsSUFDdkM5UCxRQUFTc1MsR0FDSixVQUFXQSxFQUNOMVYsTUFBTUMsUUFBUXlWLEVBQU8zTixPQUFTMk4sRUFBTzNOLE1BQVEsQ0FBQzJOLEVBQU8zTixPQUV2RCxJQUVSdEksSUFBSTdMLFFBRUQraEIsRUFBa0IsSUFBSTVXLElBQUksSUFDM0J3VyxLQUNBQyxLQUNBQyxFQUVILElBQ0EsT0FHRixJQUFLLE1BQU9oUyxFQUFLQyxLQUFVdEQsT0FBTy9HLFFBQVE0SCxHQUN4QyxJQUFLMFUsRUFBZ0J4TSxJQUFJMUYsR0FBTSxDQUc3QixNQUFNbVMsRUFBZW5TLEVBQUlwQixXQUFXLFNBQVd3VCxHQUFVLElBQUlBLEVBQU1DLGlCQUNuRSxHQUFJRixJQUFpQm5TLFFBQThCN0ssSUFBdkJxSSxFQUFLMlUsR0FDL0IsU0FJRixHQUFxQixrQkFBVmxTLEdBQXVCQSxFQUNoQzRRLEVBQWV6ZixLQUFLLEtBQUs0TyxVQUd0QixHQUFxQixpQkFBVkMsR0FBdUMsaUJBQVZBLEVBQzNDNFEsRUFBZXpmLEtBQUssS0FBSzRPLElBQU83UCxPQUFPOFAsU0FHcEMsR0FBSTFELE1BQU1DLFFBQVF5RCxHQUNyQixJQUFLLE1BQU1xUyxLQUFRclMsRUFDakI0USxFQUFlemYsS0FBSyxLQUFLNE8sSUFBTzdQLE9BQU9taUIsR0FHN0MsQ0FHRixPQUFPekIsRUFBZTFkLEtBQUssSUFDN0IsQ0M1VkEsTUFvQmFvZixHQUdULENBQ0Z0Z0IsUUFBUyw0QkFDVGtTLFNBQVUsb0RBekJJLENBQ2RxTyxNQUFPLENBQ0xwTyxZQUFhLHdCQUNiQyxLQUFNLFNBQ05DLE1BQU8sSUFDUG9MLFFBQVMsSUFzQlgsYUFBTTdhLENBQVEySSxHQUNaLE1BQU1nSCxFQUFVbEMsRUFBZ0I5RSxHQUMzQmdILElBQ0hsUSxRQUFRN0UsTUFBTWdWLEVBQU1DLElBQUksc0JBQ3hCMVUsUUFBUXlYLEtBQUssSUFHZixNQUFNZ0wsRUFBYSxDQUFDalYsRUFBS3ZMLFdBQWF1TCxFQUFLdEwsTUFBUSxNQUFRc0wsRUFBSzNELEVBQUU2QyxNQUFNLElBQUlrRCxPQUFPdVAsU0FDbkYsSUFBSXVELEVBQWEsRUFDakIsSUFBSyxJQUFJamQsRUFBSSxFQUFHQSxFQUFJK0gsRUFBS2dWLE1BQU8vYyxJQWE5QixHQVpJQSxFQUFJLEdBQ05uQixRQUFRQyxLQUFLLEtBQUtrUSxFQUFNa08sT0FBTyxJQUFJbGQsZUFBZWdkLEVBQVd0ZixLQUFLLFdBR3BFdWYsUUFBbUJ2SyxHQUFhc0ssRUFBV3RmLEtBQUssS0FBTXFSLEVBQVNoSCxFQUFNLENBQ25FMEssY0FBYyxFQUNkVyxTQUFXaFosSUFDTEEsR0FDRkcsUUFBUXlYLEtBQUssTUFJQSxJQUFmaUwsRUFBa0IsT0FFeEIxaUIsUUFBUXlYLEtBQUtpTCxFQUNmLEdDM0NXRSxHQUE0RSxDQUN2RjNnQixRQUFTLFFBQ1RrUyxTQUFVLGlFQUpJLENBQUEsRUFNZCxhQUFNdFAsQ0FBUTJJLFNBTVRsSyxlQUNMa0ssRUFDQStHLEdBRUEsTUFBTXRCLFFBQWlCVixFQUF1Qi9FLEdBQU0sRUFBTytHLEdBQ3REdEIsSUFDSDNPLFFBQVE3RSxNQUFNZ1YsRUFBTUMsSUFBSSxzQkFDeEIxVSxRQUFReVgsS0FBSyxJQUdmLElBQUssTUFBTWpELEtBQVc2SCxHQUF5QixRQUFTcEosRUFBU3pTLGFBQWMsQ0FDN0UsTUFBTXFpQixRQUFnQi9VLEVBQUdnVixRQUFRdE8sRUFBUTlHLFFBQVMsQ0FBRXFWLGVBQWUsSUFDbkUsR0FBSXZPLElBQVl2QixFQUFTSixLQUFNLENBQzdCLEdBQXNCLFdBQWxCbVEsRUFBRy9pQixXQUF5QixDQUM5QixNQUFNZ2pCLEVBQVcsQ0FBQyxnQkFDWm5LLEdBQXVCLGdCQUFnQm1LLEVBQVM5ZixLQUFLLE9BQVFxUixFQUFTaEgsRUFDOUUsQ0FFSXFWLEVBQVExTSxLQUFNOU8sR0FBTUEsRUFBRTZiLFVBQVk3YixFQUFFaEUsS0FBS2dMLFNBQVMsb0JBQzlDOEosR0FBYSxlQUFnQjNELEVBQVNoSCxFQUFNLENBQUUwSyxjQUFjLEdBRXRFLENBRUEsR0FBSTJLLEVBQVExTSxLQUFNOU8sR0FBTUEsRUFBRTZiLFVBQXVCLG1CQUFYN2IsRUFBRWhFLE1BQTRCLE9BQzVEeVYsR0FBdUIsNENBQTZDdEUsRUFBU2hILEdBQ25GLE9BQVMyVixHQUFXOU4sRUFBY0MsU0FBUyx1QkFBdUI1UyxXQUFXNlMsT0FBT3pVLE1BQU0sYUFDcEZnWSxHQUF1QixrQkFBa0JxSyxJQUFXM08sRUFBU2hILFNBQzdEdUssR0FBWXFMLG1CQUNaakwsR0FBYSx1Q0FBd0MzRCxFQUFTaEgsU0FDOUQySyxHQUFhLHdCQUF5QjNELEVBQVNoSCxFQUN2RCxDQUdHZ0gsSUFBWXZCLEVBQVNKLE1BQVNJLEVBQVNKLEtBQUszRSxZQUFZQyxVQUFVLGNBQ25FcUcsRUFBUXRHLFlBQVlDLFVBQVUsbUJBRXhCZ0ssR0FBYSxHQUFHbEUsY0FBa0NPLEVBQVNoSCxFQUVyRSxDQUVBLE1BQU1nSCxFQUFVdkIsRUFBU3pTLFlBQVl3UixLQUFNckssR0FBTUEsRUFBRXVHLFlBQVkwQyxpQkFBaUJ5UyxZQUM1RTdPLFNBQ0kyRCxHQUFhLEdBQUdsRSxvQ0FBd0RPLEVBQVNoSCxFQUUzRixDQWpEVThWLENBQU05VixFQUNkLEdDY0ssU0FBUytWLEdBQVUvVixHQUN4QixPQUFRQSxFQUE2QmdXLE9BQVMsZUFBaUIsRUFDakUsQ0M1QkEsTUFBTUMsR0FBUyxJQUFJblksSUFFWmhJLGVBQWVvZ0IsR0FBb0M5TCxFQUFjcEQsR0FDdEUsTUFBTW1QLFFDVURyZ0IsZUFBK0JzVSxHQUVwQyxJQUFLLE1BQU1nTSxJQUFRLENBQUMsWUFBYSxNQUFPLENBRXRDLFVBRHdCQyxHQUFVRCxFQUFNaE0sR0FDeEIsT0FBTyxDQUN6QixDQUNBLE9BQU8sQ0FDVCxDRGpCMEJrTSxDQUFnQmxNLEdBQ25DK0wsU0FDR0ksR0FBNEJuTSxFQUFNcEQsR0FHMUMsTUFBTXdQLEVBQVcxZ0IsVUFDWG1nQixHQUFPL04sSUFBSWtDLEtBRWY2TCxHQUFPalksSUFBSW9NLFNBQ0xtTSxHQUE0Qm5NLEVBQU1wRCxLQUUxQyxJQUFLLE1BQU0zVSxJQUFVLENBQUMsYUFBYyxTQUFVLFVBQVcsV0FDdkRHLFFBQVE2RCxHQUFHaEUsRUFBUW1rQixFQUV2QixDQUVBMWdCLGVBQWV5Z0IsR0FBNEJuTSxFQUFjcEQsU0FjbERsUixlQUF5Q3NVLEVBQWNwRCxTQUk5RGxSLGVBQXNDMmdCLEVBQXNCelAsR0FDMUQsSUFDRSxNQUFNMFAsUUFZVjVnQixlQUFzQzJnQixFQUFzQnpQLEdBQzFELE1BQU05VCxPQUFFQSxTQUFpQjZDLEVBQVcsU0FBVSxDQUFDLEtBQU0sUUFBUzBnQixHQUFhLENBQ3pFalYsSUFBS3dGLEVBQVE5RyxRQUNibUIsSUFBSzJGLEVBQVEzRixNQUVmLE9BQU9uTyxFQUNKSSxNQUFNLE9BQ05rTCxJQUFLbVksR0FBT0EsRUFBRzVPLFFBQ2YzRixPQUFPdVAsUUFDWixDQXJCK0JpRixDQUF1QkgsRUFBWXpQLEdBQzlELEdBQTRCLElBQXhCMFAsRUFBYTFpQixPQUFjLGFBRXpCK0IsRUFBVyxTQUFVLENBQUMsS0FBTSxRQUFTMmdCLEdBQWUsQ0FDeERsVixJQUFLd0YsRUFBUTlHLFFBQ2JtQixJQUFLMkYsRUFBUTNGLEtBRWpCLENBQUUsTUFDQSxDQUVKLENBZlF3VixDQUF1QixDQUFDLFdBQVksV0FBV3pNLEtBQVNwRCxFQUNoRSxDQWRROFAsQ0FBMEIxTSxFQUFNcEQsR0FDdEMsVUFDUXFELEVBQWdCRCxFQUN4QixDQUFFLE1BQ0EsQ0FFSixDQzNCT3RVLGVBQWVpaEIsR0FBd0JDLEVBQWtCaFEsR0FDOUQsTUFBTW9ELEVBQU85WCxPQUFPMGtCLEdBQ3BCLElBQUs1TSxFQUFNLE1BQU0sSUFBSWxZLE1BQU0sbUJBQW1Ca1ksa0JBRzlDLGFBRE04TCxHQUFvQzlMLEVBQU1wRCxHQUN6Q29ELENBQ1QsQ0FnQkF0VSxlQUFldWdCLEdBQVVELEVBQWNoTSxHQUNyQyxPQUFPLElBQUlwVSxRQUFTbkUsSUFDbEIsTUFBTW9sQixFQUFTQyxJQUVmRCxFQUFPRSxLQUFLLFFBQVVDLElBQ0gsZUFBYkEsRUFBSS9oQixLQUlTLGlCQUFiK2hCLEVBQUkvaEIsS0FJUnhELEdBQVEsR0FITkEsR0FBUSxHQUpSQSxHQUFRLEtBVVpvbEIsRUFBT0UsS0FBSyxZQUFhLEtBQ3ZCRixFQUFPSSxNQUFNLEtBQ1h4bEIsR0FBUSxPQUlab2xCLEVBQU9LLE9BQU9sTixFQUFNZ00sSUFFeEIsQ0NkTyxNQUFNbUIsR0FBZ0IsSUFqQzdCLE1BQ0VDLFVBQUFBLENBQVd4USxFQUFrQjJPLEdBRTNCLE1BQU01SixFQUFTL0UsRUFBUWpELGtCQUFrQnBELFVBQVUsd0JBQy9DLG9DQUNBLEdBQ0osTUFBTyxNQUFNL08sRUFBS29TLFFBQVFnRCxFQUFRaEcsU0FBUywwQkFDdEMrSyxzRkFDaUMvRSxFQUFRN0YsbUlBRXJCNkYsRUFBUTNGLElBQUlXLDBDQUNSMlQsS0FDL0IsQ0FFQThCLFlBQUFBLENBQWF6USxFQUFrQjBKLEVBQW9CLEdBQUlnSCxFQUFpQixJQUN0RSxNQUFPLEdBQUc5aEIsS0FBSytoQixLQUFLM1EsU0FBZXBSLEtBQUs4QyxNQUFNc08sRUFBUzBKLEVBQW1CZ0gsSUFDNUUsQ0FFQWhmLEtBQUFBLENBQU1zTyxFQUFrQjBKLEVBQW9CLEdBQUlnSCxFQUFpQixLRjZDNUQsU0FBeUI5TSxFQUFnQjVELEdBQzlDLE1BQU13UCxFQUFXQSxLQUNmLEdBQUlQLEdBQU8vTixJQUFJMEMsR0FBUyxPQUV4QnFMLEdBQU9qWSxJQUFJNE0sR0FDWEksR0FBV0osRUFBUTVELEdBQ25CLE1BQU0xUixPQUFFQSxHQUFXa1QsRUFBVW9DLEVBQVEsQ0FBRXBKLElBQUt3RixFQUFROUcsUUFBUzJKLE9BQU8sRUFBTS9VLE1BQU8sWUFDakZxVyxHQUE2QlAsRUFBUXRWLEVBQVEsS0FFL0MsSUFBSyxNQUFNakQsSUFBVSxDQUFDLGFBQWMsU0FBVSxVQUFXLFdBQ3ZERyxRQUFRNkQsR0FBR2hFLEVBQVFta0IsRUFFdkIsQ0V4RElvQixDQUFnQmhpQixLQUFLK2hCLEtBQUszUSxHQUFVQSxHQUVwQyxNQUFPLG1CQURhMFEsRUFBZTdXLFNBQVMsYUFDSixPQUFTLGVBQWVtRyxFQUFRM0YsSUFBSThJLG9CQUFvQm5ELEVBQVE3RixtQkFBbUJ1UCxLQUFxQjFKLEVBQVE3RixtQkFBbUJ1VyxHQUM3SyxDQUVBQyxJQUFBQSxDQUFLM1EsR0FDSCxNQUFPLHdEQUF3REEsRUFBUTdGLGdDQUN6RSxDQUVBMFcsT0FBQUEsR0FDRSxNQUFPLG1EQUNULEdDdEJLLE1BQWVDLEdBRVZyaUIsV0FBQUEsQ0FBWXNpQixHQUNwQm5pQixLQUFLbWlCLHFCQUF1QkEsQ0FDOUIsQ0FFQUMsV0FBQUEsQ0FBWWhSLEVBQWtCMk8sR0FDNUIsT0FBTzRCLEdBQWNDLFdBQVd4USxFQUFTMk8sRUFDM0MsQ0FHQSxjQUFNc0MsQ0FBU2pSLEVBQWtCaEgsR0FFL0IsYUFETStXLEdBQXdCL1AsRUFBUTNGLElBQUk4SSxLQUFNbkQsR0FDM0NwUixLQUFLbWlCLHFCQUVILHlEQUNGbmlCLEtBQUtzaUIsa0JBQWtCbFIsRUFBU2hILGVBQ2hDcEssS0FBS3VpQixlQUFlblIsTUFKY3BSLEtBQUtzaUIsa0JBQWtCbFIsRUFBU2hILEVBS3pFLENBQ0EscUJBQU1vWSxDQUFnQnBSLEVBQWtCaEgsR0FFdEMsYUFETStXLEdBQXdCL1AsRUFBUTNGLElBQUk4SSxLQUFNbkQsR0FDM0NwUixLQUFLbWlCLHFCQUVILHlEQUNGbmlCLEtBQUt5aUIseUJBQXlCclIsRUFBU2hILGVBQ3ZDcEssS0FBS3VpQixlQUFlblIsTUFKY3BSLEtBQUt5aUIseUJBQXlCclIsRUFBU2hILEVBS2hGLENBQ0EsZUFBTXNZLENBQVV0UixFQUFrQmhILEdBRWhDLGFBRE0rVyxHQUF3Qi9QLEVBQVEzRixJQUFJOEksS0FBTW5ELEdBQ3pDcFIsS0FBS3lpQix5QkFBeUJyUixFQUFTaEgsRUFDaEQsQ0FDQSxpQkFBTXVZLENBQVl2UixFQUFrQmhILEdBRWxDLGFBRE0rVyxHQUF3Qi9QLEVBQVEzRixJQUFJOEksS0FBTW5ELEdBQzNDcFIsS0FBS21pQixxQkFLSCxHQUFHbmlCLEtBQUtvaUIsWUFBWWhSLEVBQVMsb0ZBRTdCdVEsR0FBY0UsYUFBYXpRLEVBQVNoSCxFQUFLd1ksNkJBQStCLEdBQUl4WSxFQUFLeVksb0JBQXNCLGtCQUN2RzdpQixLQUFLdWlCLGVBQWVuUixNQVBsQixHQUFHcFIsS0FBS29pQixZQUFZaFIsRUFBUyw0QkFDL0J1USxHQUFjRSxhQUFhelEsRUFBU2hILEVBQUt3WSw2QkFBK0IsR0FBSXhZLEVBQUt5WSxvQkFBc0IsS0FPaEgsQ0FHVUosd0JBQUFBLENBQXlCclIsRUFBa0JoSCxHQUNuRCxNQUFNMFksRUFvRlYsU0FBaUMxUixHQUMvQixJQUNFLE9BQU9BLEVBQVFoRyxTQUFTLHVCQUMxQixDQUFFLE1BQ0EsTUFDRixDQUNGLENBMUZnQzJYLENBQXdCM1IsR0FDOUM0UixPQUNvQmpoQixJQUF4QitnQixFQUNJLEVBQ0UsMEJBQXlCMVksRUFBS25KLFFBQVUsWUFBYyxLQUFLa1IsT0FDM0Qsc0JBQXNCL0gsRUFBS3lZLG9CQUFzQixLQUFLMVEsUUFFeEQsQ0FBQ2YsRUFBUXZHLGFBQWMsc0NBQXNDaVksS0FFbkUsTUFBTyxJQUFLMVIsRUFBUS9ELFVBQVlzTixHQUFjTyxRQUFROUosR0FBUzFULE1BQU0sTUFBUSxNQUFRc2xCLEdBQ2xGeFcsT0FBT3VQLFNBQ1BuVCxJQUFLcWEsR0FBUSxHQUFHQSxLQUFPOUMsR0FBVS9WLEtBQVErSCxRQUN6Q3BTLEtBQUssT0FDVixDQUlBbWpCLFVBQUFBLENBQVc5UixFQUFrQmhILEVBQWdCckwsR0FDM0MsT0FBT2lCLEtBQUttakIsaUJBQWlCL1IsRUFBU2hILEVBQU1wSyxLQUFLc2lCLGtCQUFrQmxSLEVBQVNoSCxHQUFPckwsRUFDckYsQ0FDQXFrQixpQkFBQUEsQ0FBa0JoUyxFQUFrQmhILEVBQWdCckwsR0FDbEQsT0FBT2lCLEtBQUttakIsaUJBQWlCL1IsRUFBU2hILEVBQU1wSyxLQUFLeWlCLHlCQUF5QnJSLEVBQVNoSCxHQUFPckwsRUFDNUYsQ0FDQXNrQixhQUFBQSxDQUFjalMsRUFBa0JoSCxFQUFnQnJMLEdBQzlDLE9BQU9pQixLQUFLbWpCLGlCQUFpQi9SLEVBQVNoSCxFQUFNdVgsR0FBY0UsYUFBYXpRLEdBQVVyUyxFQUNuRixDQUNBLGVBQU11a0IsQ0FBVWxTLEVBQWtCaEgsR0FHaEMsYUFGTStXLEdBQXdCL1AsRUFBUTNGLElBQUk4SSxLQUFNbkQsR0FFekMsc0VBQXNFcFIsS0FBS3NpQixrQkFBa0JsUixFQUFTaEgsUUFBV3BLLEtBQUt1akIsUUFBUW5TLEtBQ3ZJLENBRUEsc0JBQU0rUixDQUNKL1IsRUFDQWhILEVBQ0FvWixHQUNBQyxlQUFFQSxFQUFpQixtQkFFbkIsTUFBTWpQLFFBQWEyTSxHQUF3Qi9QLEVBQVEzRixJQUFJOEksS0FBTW5ELEdBQ3ZEOEIsRUFBUzlCLEVBQVF0RyxZQUFZQyxVQUFVLHVCQUF5QiwrQkFBaUMsR0FDakcyWSxFQW9EVixTQUFnQ0QsRUFBd0JFLEVBQThCQyxHQUNwRixNQUFNQyxFQUFPLGlCQUNQQyxFQUFTSCxHQUFTNWpCLEtBQUssTUFBUSxZQUNyQyxJQUFLMGpCLEVBQWUzSyxXQUFXLFdBQWE2SyxHQUFTdmxCLE9BQ25ELE9BQU8ybEIsR0FBMkIsR0FBR0YsS0FBUUosSUFBa0JHLEdBR2pFLE1BQU1JLEVBQU9QLEVBQWVuYSxNQUFNLEdBQWdCNkksT0FDNUM4UixFQUFRRCxFQUFLNWxCLE9BQVMsRUFBSTRsQixFQUFLdG1CLE1BQU0sT0FBUyxJQUMvQ3VtQixFQUFNLElBQU1BLEVBQU0sR0FBR25MLFdBQVcsS0FDbkNtTCxFQUFNQyxRQUFRSixHQUVkRyxFQUFNLEdBQUtILEVBRWIsT0FBT0MsR0FBMkIsR0FBR0YsVUFBYUksRUFBTWxrQixLQUFLLE9BQVE2akIsRUFDdkUsQ0FuRThCTyxDQUF1QlYsRUFBZ0JyWixFQUFLdVosUUFBU3ZaLEVBQUt3WixNQUNwRixPQUFJeFMsRUFBUXBELGlDQUNILEdBQUcwVixJQUFvQnhRLElBR3pCLGlFQUNGc1EsdUVBQytDaFAsaUJBQzNDa1AsSUFBb0J4USxJQUMvQixDQUdBa1IsUUFBQUEsQ0FBU2hULEVBQWtCaEgsR0FDekIsTUFBTWlhLEVBQWFqYSxFQUFLdVosU0FBUzVqQixLQUFLLE1BQVEsYUFDOUMsR0FBSXFSLEVBQVEzRCxVQUFXLENBR3JCLE1BQU8sbUJBQW1CNFcsd0RBRlBqYSxFQUFLd1osS0FBTyxZQUFjLElBRy9DLENBQU8sR0FBSXhTLEVBQVEzRyxlQUFnQixDQUVqQyxNQUFPLFlBQVk0WixJQURBamEsRUFBS3daLEtBQU8sVUFBWSxJQUU3QyxDQUNBLE1BQU8sa0JBQ1QsQ0FFVUwsT0FBQUEsQ0FBUW5TLEdBQ2hCLE1BQU1vRCxFQUFPcEQsRUFBUTNGLElBQUk4SSxLQUN6QixNQUFPLHlDQUF5Q0MseUVBQ0lBLDBFQUNDQSwwRUFDQUEsMEVBQ0FBLDBFQUNBQSwyRUFDQ0EsR0FDeEQsQ0FFVStOLGNBQUFBLENBQWVuUixHQUN2QixNQUFNb0QsRUFBT3BELEVBQVEzRixJQUFJOEksS0FDekIsTUFBTyxHQUFHdlUsS0FBS3VqQixRQUNiblMsc0NBQ21Db0QsNENBQStDQSxHQUN0RixFQTRCRixTQUFTdVAsR0FBMkJsbEIsRUFBaUIra0IsR0FDbkQsT0FBS0EsR0FBUy9rQixFQUFRb00sU0FBUyxtQkFHM0IseUJBQXlCckwsS0FBS2YsR0FDekJBLEVBRUYsR0FBR0EscUJBTERBLENBTVgsQ0NqS08sTUFBTXlsQixHQUFlLElBVjVCLGNBQTJCcEMsR0FDekJyaUIsV0FBQUEsR0FDRUMsT0FBTSxFQUNSLENBRW1Cd2lCLGlCQUFBQSxDQUFrQjdiLEVBQVkyRCxHQUMvQyxNQUFPLGFBQWFBLEVBQUt5WSxvQkFBc0IsSUFDakQsR0MwQkssTUFBTTBCLEdBQW9CLElBL0JqQyxjQUFnQ3JDLEdBQzlCcmlCLFdBQUFBLEdBQ0VDLE9BQU0sRUFDUixDQUVtQndpQixpQkFBQUEsQ0FBa0I3YixFQUFZMkQsR0FDL0MsTUFBTyxxQkFBcUJBLEVBQUtvYSxNQUFRLFVBQVksc0JBQXNCcGEsRUFBS3lZLG9CQUFzQixJQUN4RyxDQUVBLHNCQUFNTSxDQUNKL1IsRUFDQWhILEVBQ0FvWixFQUNBemtCLEVBQTBCLENBQUEsR0FFMUIsR0FBSXFTLEVBQVFyRCxvQkFDVixPQUFPak8sTUFBTXFqQixpQkFBaUIvUixFQUFTaEgsRUFBTW9aLEVBQWN6a0IsR0FHN0QsTUFBTXlWLFFBQWEyTSxHQUF3Qi9QLEVBQVEzRixJQUFJOEksS0FBTW5ELEdBQ3ZEOEIsRUFBUzlCLEVBQVF0RyxZQUFZQyxVQUFVLHVCQUF5QiwrQkFBaUMsR0FJdkcsTUFBTyxpRUFDRnlZLHVFQUMrQ2hQLDRCQUxqQ3BLLEVBQUt1WixTQUFXdlosRUFBS3VaLFFBQVF2bEIsT0FBUyxFQUFJZ00sRUFBS3VaLFFBQVE1akIsS0FBSyxLQUFPLG9EQUNuRXFLLEVBQUt3WixLQUFPLFlBQWMsS0FLdUMxUSxJQUN0RixHQ3BCSyxNQUFNdVIsR0FBYyxJQVYzQixjQUEwQnZDLEdBQ3hCcmlCLFdBQUFBLEdBQ0VDLE9BQU0sRUFDUixDQUVtQndpQixpQkFBQUEsQ0FBa0I3YixFQUFZMkQsR0FDL0MsTUFBTyx3QkFBd0JBLEVBQUt5WSxvQkFBc0IsSUFDNUQsR0MwQ0ssTUFBTTZCLEdBQWtCLElBOUMvQixjQUE4QnhDLEdBQzVCcmlCLFdBQUFBLEdBQ0VDLE9BQU0sRUFDUixDQUVVd2lCLGlCQUFBQSxDQUFrQnFDLEVBQWFDLEdBQ3ZDLE1BQU0sSUFBSXRvQixNQUFNLG9DQUNsQixDQUVTK2xCLFFBQUFBLENBQVM1YixFQUFZMkQsR0FDNUIsT0FBT2hLLFFBQVFuRSxRQUNiLHFCQUFxQm1PLEVBQUtvYSxNQUFRLFVBQVksc0JBQXNCcGEsRUFBS3lZLG9CQUFzQixLQUVuRyxDQUNTTCxlQUFBQSxDQUFnQnBSLEVBQWtCaEgsR0FDekMsT0FBT2hLLFFBQVFuRSxRQUNiLEdBQUdtVixFQUFRdkcsbUJBQW1COEYsb0JBQWlDdkcsRUFBS3lZLG9CQUFzQixzQkFFOUYsQ0FDU0gsU0FBQUEsR0FDUCxPQUFPdGlCLFFBQVFuRSxRQUFRLHFCQUN6QixDQUNTMG1CLFdBQUFBLENBQVl2UixFQUFrQmhILEdBQ3JDLE9BQU9oSyxRQUFRbkUsUUFDYixHQUFHK0QsS0FBS29pQixZQUFZaFIsRUFBUyxxQkFBcUJ1USxHQUFjRSxhQUM5RHpRLEVBQ0FoSCxFQUFLd1ksNkJBQStCLEdBQ3BDeFksRUFBS3lZLG9CQUFzQixNQUdqQyxDQUVTSyxVQUFBQSxHQUNQLE9BQU85aUIsUUFBUW5FLFFBQVEscUJBQ3pCLENBQ1NtbkIsaUJBQUFBLEdBQ1AsT0FBT2hqQixRQUFRbkUsUUFBUSxxQkFDekIsQ0FDU29uQixhQUFBQSxHQUNQLE9BQU9qakIsUUFBUW5FLFFBQVEscUJBQ3pCLENBQ1NxbkIsU0FBQUEsR0FDUCxPQUFPbGpCLFFBQVFuRSxRQUFRLHFCQUN6QixHQ3BDSyxNQUFNNG9CLEdBQWUsSUFWNUIsY0FBMkIzQyxHQUN6QnJpQixXQUFBQSxHQUNFQyxPQUFNLEVBQ1IsQ0FFbUJ3aUIsaUJBQUFBLENBQWtCN2IsRUFBWTJELEdBQy9DLE1BQU8sYUFBYUEsRUFBS3lZLG9CQUFzQixJQUNqRCxHQ09LLE1BQU1pQyxHQUFjLElBZDNCLGNBQTBCNUMsR0FDeEJyaUIsV0FBQUEsR0FDRUMsT0FBTSxFQUNSLENBRW1Cd2lCLGlCQUFBQSxDQUFrQjdiLEVBQVkyRCxHQUMvQyxNQUFPLGlCQUFpQkEsRUFBS3lZLG9CQUFzQixLQUFLMVEsTUFDMUQsQ0FFbUJzUSx3QkFBQUEsQ0FBeUJyUixFQUFrQmhILEdBQzVELE1BQU8sR0FBR2dILEVBQVF2RyxxQ0FBcUNULEVBQUt5WSxvQkFBc0IsS0FBSzFRLE1BQ3pGLEdDcEJXNFMsR0FBcUIsQ0FBQyxVQUFXLFVBQVcsU0FBVSxRQzBCdER2QixHQUEwRyxDQUNySDNrQixRQUFTLGlCQUNUa1MsU0FBVSxvQkFYSSxDWmRkeVQsTUFBTyxDQUNMeFQsWUFBYSx5QkFDYkMsS0FBTSxXQUVSblMsS0FBTSxDQUNKa1MsWUFBYSw2QkFDYkMsS0FBTSxRQUNOQyxNQUFPLElBQ1BvTCxRQUFTLElBRVgsaUJBQWtCLENBQ2hCdEwsWUFBYSw2QkFDYkMsS0FBTSxRQUNOcUwsUUFBUyxJWUdYMEksS0FBTSxDQUNKaFUsWUFBYSwrRUFDYkMsS0FBTSxTQUNOQyxNQUFPLE1BUVQsYUFBTXpQLENBQVEySSxJWkhULFNBQ0xBLEdBRUNBLEVBQW9CeVksbUJBQXFCLElBQUt6WSxFQUFLdEwsTUFBUSxNQUFTc0wsRUFBSzNELEdBQUc2QyxNQUFNLElBQU0sSUFDdEZWLElBQUttUSxHQUFRLElBQUlBLE1BQ2pCaFosS0FBSyxLQUNQcUssRUFBb0J3WSw2QkFBK0J4WSxFQUFLNmEsZUFBaUIsSUFBSXJjLElBQUttUSxHQUFRLElBQUlBLE1BQVFoWixLQUFLLElBQzlHLENZSEltbEIsQ0FBYzlhLEdBRWQsTUFBTXlGLFFBQWlCVixFQUF1Qi9FLEdBQ3pDeUYsSUFDSDNPLFFBQVE3RSxNQUFNZ1YsRUFBTUMsSUFBSSxzQkFDeEIxVSxRQUFReVgsS0FBSyxJQUdmLElBQUssTUFBTWpELEtBQVd2QixFQUFTelMsWUFBYSxDQUMxQyxNQUFNaWMsRUFBT2pJLEVBQVF0RyxZQUFZd0MsY0FBZ0IsQ0FBQSxFQUMzQ29NLEVBQVV0SSxFQUFRdEcsWUFBWTBDLGlCQUFtQixDQUFBLEVBQ3ZELElBQUl6QyxFQUNKLEdBQUlzTyxFQUFLdkQsTUFDUC9LLEVBQVV1WixRQUNMLEdBQUlqTCxFQUFLOEwsS0FDZHBhLEVBQVUwWixRQUNMLEdBQUkvSyxFQUFRLGtCQUNqQjNPLEVBQVU4WixRQUNMLEdBQUluTCxFQUFRMEwsS0FDakJyYSxFQUFVK1osUUFDTCxHQUNKQyxHQUFtQmhTLEtBQU14TyxHQUFNOFUsRUFBSzlVLE1BQVE4VSxFQUFLLHVCQUNqRGpJLEVBQVEvRixlQUFpQixnQkFBZ0J6TCxLQUFLd1IsRUFBUWpHLFlBRXZESixFQUFVd1osT0FDTCxLQUFJbEwsRUFBSyxjQUFlSyxFQUFRLFlBR3JDLFNBRkEzTyxFQUFVMlosRUFHWixDQUdBLE9BRkF4akIsUUFBUUMsS0FBSyx1QkFBdUJpUSxFQUFRblIsWUFFcENtSyxFQUFLNGEsTUFBUSxPQUNuQixJQUFLLE1BQ0wsSUFBSyxjQUNIcG9CLFFBQVE2TyxJQUFJVyxTQUFXLG9CQUNqQjJJLFNBQW1CaEssRUFBUXNYLFNBQVNqUixFQUFTaEgsR0FBT2dILEVBQVNoSCxHQUNuRSxNQUVGLElBQUssVUFDSHhOLFFBQVE2TyxJQUFJVyxTQUFXLGdCQUNqQjJJLFNBQW1CaEssRUFBUXlYLGdCQUFnQnBSLEVBQVNoSCxHQUFPZ0gsRUFBU2hILEdBQzFFLE1BRUYsSUFBSyxTQUNIeE4sUUFBUTZPLElBQUlXLFNBQVcsZ0JBQ2pCMkksU0FBbUJoSyxFQUFRNFgsWUFBWXZSLEVBQVNoSCxHQUFPZ0gsRUFBU2hILEdBQ3RFLE1BRUYsSUFBSyxlQUNIeE4sUUFBUTZPLElBQUlXLFNBQVcsVUFDdkJoQyxFQUFLeVksbUJBQXFCLG9CQUNwQjlOLFNBQW1CaEssRUFBUTRYLFlBQVl2UixFQUFTaEgsR0FBT2dILEVBQVNoSCxHQUN0RSxNQUVGLElBQUssT0FBUSxDQUNYeE4sUUFBUTZPLElBQUlXLFNBQVcsT0FDdkIsTUFBTTRJLFFBQWVqSyxFQUFRMlgsVUFBVXRSLEVBQVNoSCxTQUMxQzJLLEdBQWFDLEVBQVE1RCxFQUFTaEgsR0FDcEMsS0FDRixDQUNBLFFBQ0UsTUFBTSxJQUFJOU4sTUFBTSx1QkFBdUI4TixFQUFLNGEsUUFHbEQsQ0FDRixHQy9CV0ssR0FHVCxDQUNGeG1CLFFBQVMsb0JBQ1RrUyxTQUFVLGlFQUNWcUQsUUFBUyxDQWhEVGtSLElBQUssQ0FDSHRVLFlBQ0UsNEhBQ0ZDLEtBQU0sU0FDTnNVLFFBQVMsQ0FDUCxXQUNBLGVBQ0EsU0FDQSxhQUNBLFNBQ0EsZUFDQSxRQUNBLFdBQ0EsU0FFRmpKLFFBQVMsWUFFWDhELE9BQVEsQ0FDTnBQLFlBQWEsMkJBQ2JDLEtBQU0sV0FFUjJTLEtBQU0sQ0FDSjVTLFlBQWEscUNBQ2JDLEtBQU0sV0FFUixlQUFnQixDQUNkRCxZQUFhLHlCQUNiQyxLQUFNLFVBS1IwUyxRQUFTLENBQ1AzUyxZQUFhLG9CQUNiQyxLQUFNLFVBZVIsYUFBTXhQLENBQVEySSxTQUtUbEssZUFDTGtLLEdBRUEsTUFBTXlGLFFBQWlCVixFQUF1Qi9FLEdBQ3pDeUYsSUFDSDNPLFFBQVE3RSxNQUFNZ1YsRUFBTUMsSUFBSSxzQkFDeEIxVSxRQUFReVgsS0FBSyxJQUdmelgsUUFBUTZPLElBQUlrTCxjQUFnQixJQUM1Qi9aLFFBQVE2TyxJQUFJVyxTQUFXLE9BR3ZCLE1BQU1vWixFQUFlcGIsRUFBS3VaLFNBQVcsR0FDL0I4QixFQUEyQyxJQUF2QkQsRUFBWXBuQixPQUdoQ3NuQixFQUFnQkYsRUFBWXpTLEtBQU0rUSxHQUFXQSxFQUFPN1ksU0FBUyxTQUM3RDBhLEVBQWlCSCxFQUFZelMsS0FBTStRLEdBQVdBLEVBQU83WSxTQUFTLFVBQzlEMmEsRUFBZ0JILEdBQXFCRSxFQUNyQ0UsRUFBZUosR0FBcUJDLEVBRTFDLElBQUssTUFBTXRVLEtBQVd2QixFQUFTelMsWUFBYSxDQUMxQyxNQUFNaWMsRUFBT2pJLEVBQVF0RyxZQUFZd0MsY0FBZ0IsQ0FBQSxFQUMzQ29NLEVBQVV0SSxFQUFRdEcsWUFBWTBDLGlCQUFtQixDQUFBLEVBQ3ZELElBQUl6QyxFQWtCSixHQWhCRUEsRUFERXNPLEVBQUt2RCxNQUNHd08sR0FDRGpMLEVBQUs4TCxLQUNKVixHQUNEL0ssRUFBUSxrQkFDUG1MLEdBQ0RuTCxFQUFRMEwsS0FDUE4sR0FDREMsR0FBbUJoUyxLQUFNeE8sR0FBTThVLEVBQUs5VSxNQUFROFUsRUFBSyxzQkFDaERrTCxHQUVBRyxHQUdaeGpCLFFBQVFDLEtBQUssc0JBQXNCaVEsRUFBUW5SLFlBR3ZDMmxCLEdBQWlCbGIsRUFBR1EsV0FBV2xQLEVBQUsrRCxLQUFLcVIsRUFBUTlHLFFBQVMsT0FBUSxTQUFVLENBQzlFLE1BQU13YixFQUFjTixFQUFZaFosT0FBUXNYLEdBQVdBLEVBQU83WSxTQUFTLFVBQzdEOGEsRUFBVyxJQUFLM2IsRUFBTXVaLFFBQVNtQyxFQUFZMW5CLE9BQVMsRUFBSTBuQixPQUFjL2pCLFNBQ3RFZ1QsR0FBYWhLLEVBQVFxWixTQUFTaFQsRUFBUzJVLEdBQVczVSxFQUFTaEgsRUFBTSxDQUFFbk4sUUFBU21OLEVBQUs0YixhQUN6RixDQUVBLElBQUtILElBQWlCbmIsRUFBR1EsV0FBV2xQLEVBQUsrRCxLQUFLcVIsRUFBUTlHLFFBQVMsT0FBUSxRQUNyRSxTQUlGLE1BQU0yYixFQUFhVCxFQUFZaFosT0FBUXNYLEdBQVdBLEVBQU83WSxTQUFTLFNBQzVEaWIsRUFBVSxJQUFLOWIsRUFBTXVaLFFBQVNzQyxFQUFXN25CLE9BQVMsRUFBSTZuQixPQUFhbGtCLEdBRXpFLE9BQVFxSSxFQUFLa2IsS0FDWCxJQUFLLGlCQUNHdlEsU0FBbUJoSyxFQUFRcVksa0JBQWtCaFMsRUFBUzhVLEVBQVMsQ0FBQSxHQUFLOVUsRUFBU2hILEdBQ25GLFNBRUYsSUFBSyxxQkFDRzJLLFNBQW1CaEssRUFBUW1ZLFdBQVc5UixFQUFTOFUsRUFBUyxDQUFBLEdBQUs5VSxFQUFTaEgsR0FDNUUsU0FFRixJQUFLLGVBQ0crYixHQUFhL1UsRUFBUzhVLEVBQVNuYixHQUNyQyxTQUVGLElBQUssZUFBZ0IsQ0FDbkIsTUFBTXFiLEVBQVlILEVBQVc3bkIsT0FBUyxFQUFJNm5CLEVBQVdsbUIsS0FBSyxLQUFPLGtCQUMzRG9tQixHQUFhL1UsRUFBUzhVLEVBQVNuYixFQUFTLFFBQVFxYixhQUN0RCxRQUNGLEVBRUYsR0FBSS9NLEVBQUt2RCxPQUFTdUQsRUFBSzhMLE1BQVF6TCxFQUFRLG1CQUFxQkEsRUFBUTBMLEtBQU0sQ0FDeEUsTUFBTWdCLEVBQVlILEVBQVc3bkIsT0FBUyxFQUFJNm5CLEVBQVdsbUIsS0FBSyxLQUFPLFlBQ2pFLE9BQVFxSyxFQUFLa2IsS0FDWCxJQUFLLGVBQ0d2USxTQUNFaEssRUFBUXFZLGtCQUFrQmhTLEVBQVM4VSxFQUFTLENBQUV6QyxlQUFnQixRQUFRMkMsZUFDNUVoVixFQUNBaEgsR0FFRixNQUVGLElBQUssbUJBQ0cySyxTQUNFaEssRUFBUW1ZLFdBQVc5UixFQUFTOFUsRUFBUyxDQUFFekMsZUFBZ0IsUUFBUTJDLGVBQ3JFaFYsRUFDQWhILEdBRUYsTUFFRixJQUFLLGNBQ0cySyxTQUNFaEssRUFBUXFZLGtCQUFrQmhTLEVBQVM4VSxFQUFTLENBQUV6QyxlQUFnQixRQUFRMkMsY0FDNUVoVixFQUNBaEgsR0FFRixNQUVGLElBQUssaUJBQ0cySyxTQUNFaEssRUFBUXFZLGtCQUFrQmhTLEVBQVM4VSxFQUFTLENBQ2hEekMsZUFBZ0IsNEJBQTRCclMsRUFBUTNGLElBQUk4SSxTQUUxRG5ELEVBQ0FoSCxHQUVGLE1BRUYsSUFBSyxjQUNHMkssR0FBYSw0QkFBNkIzRCxFQUFTaEgsR0FJL0QsQ0FDRixDQUNGLENBNUhVeEssQ0FBS3dLLEVBQ2IsR0E2SEZsSyxlQUFlaW1CLEdBQ2IvVSxFQUNBaEgsRUFDQVcsRUFDQTBZLEdBRUFyUyxFQUFRM0YsSUFBSTRhLFlBQWMsVUFDcEJ0UixHQUFhLEdBQUdoSyxFQUFRcVgsWUFBWWhSLEVBQVMsVUFBVStPLEdBQVUvVixLQUFTZ0gsRUFBU2hILEdBQ3pGeE4sUUFBUXNYLGVBQWlCYSxTQUNqQmhLLEVBQVFzWSxjQUFjalMsRUFBU2hILEVBQU0sQ0FDekNxWixtQkFFRnJTLEVBQ0FoSCxFQUNBLENBQUUwSyxjQUFjLFVBRVpDLEdBQWE0TSxHQUFjSSxLQUFLM1EsR0FBVUEsRUFBU2hILEVBQzNELENDbk1BLE1BTWFrYyxHQUdULENBQ0Z6bkIsUUFBUyxhQUNUa1MsU0FBVSxzQ0FDVnFELFFBWnNCLENBQ3RCZ00sT0FBUSxDQUNOcFAsWUFBYSwyQkFDYkMsS0FBTSxZQVVSLGFBQU14UCxDQUFRMkksU0FLVGxLLGVBQ0xrSyxHQUVBLE1BQU15RixRQUFpQlYsRUFBdUIvRSxHQUN6Q3lGLElBQ0gzTyxRQUFRN0UsTUFBTWdWLEVBQU1DLElBQUksc0JBQ3hCMVUsUUFBUXlYLEtBQUssSUFHZnpYLFFBQVE2TyxJQUFJd0MsS0FBTyxJQUNuQnJSLFFBQVE2TyxJQUFJa0wsY0FBZ0IsSUFDNUIvWixRQUFRNk8sSUFBSVcsU0FBVyxPQUV2QixJQUFLLE1BQU1nRixLQUFXdkIsRUFBU3pTLFlBQWEsQ0FDMUMsTUFBTWljLEVBQU9qSSxFQUFRdEcsWUFBWXdDLGNBQWdCLENBQUEsRUFDM0NvTSxFQUFVdEksRUFBUXRHLFlBQVkwQyxpQkFBbUIsQ0FBQSxFQUN2RCxJQUFJekMsRUFzQkosR0FwQkVBLEVBREVzTyxFQUFLdkQsTUFDR3dPLEdBQ0RqTCxFQUFLOEwsS0FDSlYsR0FDRC9LLEVBQVEsa0JBQ1BtTCxHQUNEbkwsRUFBUTBMLEtBQ1BOLEdBQ0RDLEdBQW1CaFMsS0FBTXhPLEdBQU04VSxFQUFLOVUsTUFBUThVLEVBQUssc0JBQ2hEa0wsR0FFQUcsR0FHWnhqQixRQUFRQyxLQUFLLDRCQUE0QmlRLEVBQVFuUixrQkFFM0N5VixHQUF1QmlNLEdBQWNNLFVBQVc3USxFQUFTaEgsR0FDM0RNLEVBQUdRLFdBQVdsUCxFQUFLK0QsS0FBS3FSLEVBQVE5RyxRQUFTLE9BQVEsZ0JBRTdDb0wsR0FBdUIzSyxFQUFRcVosU0FBU2hULEVBQVNoSCxHQUFNb0IsV0FBVyxlQUFnQixJQUFLNEYsRUFBU2hILEdBRXBHTSxFQUFHUSxXQUFXbFAsRUFBSytELEtBQUtxUixFQUFROUcsUUFBUyxPQUFRLFFBQVMsT0FFdERvTCxTQUE2QjNLLEVBQVF1WSxVQUFVbFMsRUFBU2hILEdBQU9nSCxFQUFTaEgsU0FDeEV1SyxHQUFZcUwsYUFDZDVPLEVBQVEvRixnQkFDVitGLEVBQVEzRixJQUFJNGEsWUFBYyxVQUNwQnRSLEdBQWEsR0FBR2hLLEVBQVFxWCxZQUFZaFIsRUFBUyxVQUFVK08sR0FBVS9WLEtBQVNnSCxFQUFTaEgsSUFFM0YsTUFBTTRLLEVBQVM1RCxFQUFRL0Ysb0JBQ2JOLEVBQVFzWSxjQUFjalMsRUFBU2hILEVBQU0sQ0FBQSxTQUNyQ1csRUFBUXFZLGtCQUFrQmhTLEVBQVNoSCxFQUFNLElBQ25EeE4sUUFBUXNYLGVBQWlCYSxHQUV2QkMsRUFBT3hKLFdBQVcsZUFBZ0IsSUFDbEM0RixFQUNBaEgsRUFDQSxDQUNFMEssY0FBYyxVQUdaQyxHQUFhNE0sR0FBY0ksS0FBSzNRLEdBQVVBLEVBQVNoSCxFQUMzRCxDQUNGLENBQ0YsQ0FqRVVtYyxDQUFTbmMsRUFDakIsR0MzQkYsTUFhYW9jLEdBQThELENBQ3pFM25CLFFBQVMsMkJBQ1RrUyxTQUFVLHFEQWZLeUwsR0FDZkEsRUFDR2lLLFdBQVcsTUFBTyxDQUNqQnpWLFlBQWEsMEJBQ2JDLEtBQU0sU0FDTnlWLGNBQWMsSUFFZjdILE9BQU8sU0FBVSxDQUNoQjdOLFlBQWEsc0NBQ2JDLEtBQU0sU0FDTnFMLFFBQVMsWUFPYjdhLE9BQUFBLENBQVEySSxHQUNOLElBQ0UsTUFBTTNOLEVBQVMyTixFQUFLM04sT0FDcEIsS0FBTUEsS0FBVWtxQixFQUFVQyxTQUN4QixNQUFNLElBQUl0cUIsTUFBTSxtQkFBbUJHLEtBRXJDRixFQUFTNk4sRUFBSzVOLElBQUtDLEVBQ3JCLENBQUUsTUFBT0osR0FDUDZFLFFBQVE3RSxNQUFNQSxhQUFpQkMsTUFBUUQsRUFBTWtMLFFBQVV4SyxPQUFPVixJQUM5RE8sUUFBUXlYLEtBQUssRUFDZixDQUNGLEdDMUJXd1MsR0FHVCxDQUNGaG9CLFFBQVMsWUFDVGtTLFNBQVUsNkNBQ1ZxRCxRQVJjLENBQUEsRUFTZCxhQUFNM1MsQ0FBUTJJLEdBQ1osTUFBTXlGLFFBQWlCVixFQUF1Qi9FLEdBQU0sR0FDL0N5RixJQUNIM08sUUFBUTdFLE1BQU1nVixFQUFNQyxJQUFJLHNCQUN4QjFVLFFBQVF5WCxLQUFLLElBR2YsSUFBSXlTLEdBQWlCLEVBQ3JCLE1BQU1uVixFQUFXOUIsRUFBU3pTLFlBQVl3TCxJQUFJMUksVUFDeEMsTUFBTThpQixFQUFxQixHQWMzQixJQWJLNVIsRUFBUXRHLFlBQVl5RSxXQVF2QjZCLEVBQVE5RixnQkFDUDhGLEVBQVF0RyxZQUFZd0MsY0FBY3laLFlBQWMzVixFQUFRdEcsWUFBWTBDLGlCQUFpQnVaLGFBRXRGL0QsRUFBU2hsQixLQUFLLHNCQVZWb1QsRUFBUXRHLFlBQVl3QyxjQUFjeVosWUFBYzNWLEVBQVF0RyxZQUFZMEMsaUJBQWlCdVosYUFDdkYvRCxFQUFTaGxCLEtBQUssb0JBRVpvVCxFQUFRdEcsWUFBWTBDLGlCQUFpQndaLFNBQ3ZDaEUsRUFBU2hsQixLQUFLLGlCQVFYZ2xCLEVBQVM1a0IsT0FBUyxHQUFHLENBQzFCLE1BQU04VixRQUFpQndCLEdBQXVCc04sRUFBU2pqQixLQUFLLFFBQVNxUixFQUFTaEgsRUFBTSxDQUVsRnFNLEdBQUk1RyxFQUFTelMsWUFBWWdCLE9BQVMsRUFDbEMwVyxjQUFjLEVBQ2Q0QixZQUFZLElBSVJ1USxFQUFjanJCLEVBQUsrRCxLQUFLcVIsRUFBUTlHLFFBQVMsU0FDL0MsSUFBSTRKLElBQVl4SixFQUFHUSxXQUFXK2IsR0FPOUIsT0FBTy9TLEVBTkx4SixFQUFHd2MsT0FBT0QsRUFBYSxDQUFFRSxPQUFPLEVBQU10VixXQUFXLElBQ2pEM1EsUUFBUUMsS0FBS2tRLEVBQU1rTyxPQUFPLDZEQUMxQnVILEdBQWlCLENBS3JCLElBRUlNLFFBQWtCaG5CLFFBQVFzWSxJQUFJL0csR0FDcEMsSUFBSTBWLEVBQWdCLEVBQ3BCLElBQUssTUFBT2hsQixFQUFHNlIsS0FBYWtULEVBQVU1a0IsVUFDcEMsR0FBSTBSLEVBQVUsRUFDQ3JFLEVBQVN6UyxZQUFZaUYsSUFBSXlJLFlBQVl3QyxjQUFnQixDQUFBLEdBQ3pEd0ksT0FDUDVVLFFBQVFDLEtBQUtrUSxFQUFNa08sT0FBTyxnRUFFNUI4SCxFQUFnQm5ULENBQ2xCLENBRUdtVCxHQUNIbm1CLFFBQVFDLEtBQ05rUSxFQUFNdUMsTUFDSmtULEVBQ0ksNEhBQ0EsMEJBR1ZscUIsUUFBUXlYLEtBQUtnVCxFQUNmLEdBR1dDLEdBQXVHLElBQy9HVCxHQUNIaG9CLFFBQVMsWUNsRUwyZCxFQUFNK0ssRUFBUTNxQixRQUFRd04sT0FDekJvZCxXQUFXLE1BQ1h6b0IsUUFBUXNkLElBQ1JvTCxXQUFZcmQsSUFDWCxNQUFNc2QsRUFBYXRkLEVBQUssZUFDeEIsR0FBSXNkLEVBQVksQ0FDZCxNQUFNcGQsRUFBVXRPLEVBQUtDLFFBQVF5ckIsR0FDN0I5cUIsUUFBUStxQixNQUFNcmQsRUFDaEIsRTNDb0hHLFNBQThDb0IsR0FFL0NBLEVBQVErQyxNQUFRL0MsRUFBUWtjLG1CQUMxQmxjLEVBQVErQyxLQUFPL0MsRUFBUStDLEtBQUtvRSxRQUFRLEdBQUduSCxFQUFRa2Msb0JBQXFCLElBRWpFcGMsV0FBVyxtQ0FBb0MsSUFFL0NBLFdBQVcsc0JBQXVCLElBQ2xDQSxXQUFXLGlCQUFrQixLQUVsQyxJQUFLLE1BQU1vQixLQUFPckQsT0FBT29ELEtBQUtqQixHQUFVLENBQ3RDLE1BQU1tYyxFQUFXamIsRUFBSWtiLGVBRW5CRCxFQUFTL08sV0FBVyxTQUNwQitPLEVBQVMvTyxXQUFXLFVBQ3BCK08sRUFBUy9PLFdBQVcsV0FDUCxnQkFBYitPLEdBQ2EsYUFBYkEsV0FHT25jLEVBQVFrQixFQUVuQixDQUNGLEMyQ3pJSW1iLENBQXFDbnJCLFFBQVE2TyxPQUU5QzVNLFFBQVFpUyxJQUNSalMsUUFBUXNWLElBQ1J0VixRQUFRb1ksSUFDUnBZLFFBQVFzYSxJQUNSdGEsUUFBUTBkLElBQ1IxZCxRQUFRc2dCLElBQ1J0Z0IsUUFBUTJnQixJQUNSM2dCLFFBQVEya0IsSUFDUjNrQixRQUFRd21CLElBQ1J4bUIsUUFBUXluQixJQUNSem5CLFFBQVEybkIsSUFDUjNuQixRQUFRZ29CLElBQ1Job0IsUUFBUXlvQixJQUNSbEssZ0JBQ0FDLFNBQ0EwQyxRQUdILFdBQ0UsSUFBSWlJLEVBQWlCaHNCLEVBQUtvUyxRQUFRLElBQUkxRixnQkFBZ0J1ZixLQUFLQyxVQUMzRCxNQUFReGQsRUFBR1EsV0FBV2xQLEVBQUsrRCxLQUFLaW9CLEVBQWdCLGtCQUM5Q0EsRUFBaUJoc0IsRUFBS29TLFFBQVE0WixHQUtoQyxPQUhvQmpmLEtBQUtvRSxNQUFNekMsRUFBR0MsYUFBYTNPLEVBQUsrRCxLQUFLaW9CLEVBQWdCLGdCQUFpQixTQUd2RWpJLE9BQ3JCLENBWldvSSxJQUNSQyxPQUFPaGUsS0FhVixJQUFJaWUsSUFBZSxFQUNuQixJQUFLLE1BQU01ckIsSUFBVSxDQUFDLFNBQVUsVUFBVyxXQUN6Q0csUUFBUTZELEdBQUdoRSxFQUFRLEtBQ2pCLElBQUk0ckIsR0FBSixDQUVBQSxJQUFlLEVBQ2YsSUFDRTlyQixFQUFTSyxRQUFRSixJQUNuQixDQUFFLE1BQU9ILEdBQ1A2RSxRQUFRRSxLQUFLLHNCQUFzQnhFLFFBQVFKLHdCQUF5QkgsRUFDdEUsQ0FDQU8sUUFBUXlYLE1BUlUiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNSw2LDcsOCw5XX0=
9
+ */const T=[..."0123456789abcdef"],I=[6,1536,393216,100663296],O=[0,8,16,24],_=[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 C=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class B{blocks=[];s=[];reset=!0;finalized=!1;block=0;start=0;lastByteIndex=0;constructor(e,t,n){this.padding=t,this.outputBits=n,this.blockCount=1600-(e<<1)>>5,this.byteCount=this.blockCount<<2,this.outputBlocks=n>>5,this.extraBytes=(31&n)>>3;for(let e=0;e<50;++e)this.s[e]=0}update(e){if(this.finalized)throw new Error("finalize already called");const t=this.blocks,n=this.byteCount,r=e.length,o=this.blockCount,s=this.s;let i,a,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,i=1;i<o+1;++i)t[i]=0;for(i=this.start;c<r&&i<n;++c)a=e.codePointAt(c)||0,a<128?t[i>>2]|=a<<O[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<O[3&i++],t[i>>2]|=(128|63&a)<<O[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<O[3&i++],t[i>>2]|=(128|a>>6&63)<<O[3&i++],t[i>>2]|=(128|63&a)<<O[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<O[3&i++],t[i>>2]|=(128|a>>12&63)<<O[3&i++],t[i>>2]|=(128|a>>6&63)<<O[3&i++],t[i>>2]|=(128|63&a)<<O[3&i++]);if(this.lastByteIndex=i,i>=n){for(this.start=i-n,this.block=t[o],i=0;i<o;++i)s[i]^=t[i];L(s),this.reset=!0}else this.start=i}return this}finalize(){if(this.finalized)return;this.finalized=!0;const e=this.blocks;let t=this.lastByteIndex;const n=this.blockCount,r=this.s;if(e[t>>2]|=this.padding[3&t],this.lastByteIndex===this.byteCount)for(e[0]=e[n],t=1;t<n+1;++t)e[t]=0;for(e[n-1]|=2147483648,t=0;t<n;++t)r[t]^=e[t];L(r)}hex(){this.finalize();const e=this.blockCount;let t=this.s;const n=this.outputBlocks,r=this.extraBytes;let o,s=0,i=0,a="";for(;i<n;){for(s=0;s<e&&i<n;++s,++i)o=t[s],a+=T[o>>4&15]+T[15&o]+T[o>>12&15]+T[o>>8&15]+T[o>>20&15]+T[o>>16&15]+T[o>>28&15]+T[o>>24&15];i%e===0&&(t=C(t),L(t),s=0)}return r&&(o=t[s],a+=T[o>>4&15]+T[15&o],r>1&&(a+=T[o>>12&15]+T[o>>8&15]),r>2&&(a+=T[o>>20&15]+T[o>>16&15])),a}}const L=function(e){let t,n,r,o,s,i,a,c,l,d,u,p,f,h,m,g,b,v,y,w,k,E,A,S,$,P,R,x,N,j,D,T,I,O,C,B,L,F,J,W,U,M,z,Y,V,G,K,q,H,Q,X,Z,ee,te,ne,re,oe,se,ie,ae,ce,le,de;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],l=e[5]^e[15]^e[25]^e[35]^e[45],d=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|l>>>31),n=s^(l<<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^(d<<1|u>>>31),n=a^(u<<1|d>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=l^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=d^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],G=e[11]<<4|e[10]>>>28,K=e[10]<<4|e[11]>>>28,x=e[20]<<3|e[21]>>>29,N=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,M=e[40]<<18|e[41]>>>14,z=e[41]<<18|e[40]>>>14,O=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,q=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,j=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,le=e[42]<<2|e[43]>>>30,de=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,B=e[14]<<6|e[15]>>>26,L=e[15]<<6|e[14]>>>26,v=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,X=e[35]<<15|e[34]>>>17,T=e[45]<<29|e[44]>>>3,I=e[44]<<29|e[45]>>>3,S=e[6]<<28|e[7]>>>4,$=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,F=e[26]<<25|e[27]>>>7,J=e[27]<<25|e[26]>>>7,w=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,Z=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,Y=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,P=e[18]<<20|e[19]>>>12,R=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,W=e[38]<<8|e[39]>>>24,U=e[39]<<8|e[38]>>>24,E=e[48]<<14|e[49]>>>18,A=e[49]<<14|e[48]>>>18,e[0]=h^~g&v,e[1]=m^~b&y,e[10]=S^~P&x,e[11]=$^~R&N,e[20]=O^~B&F,e[21]=C^~L&J,e[30]=Y^~G&q,e[31]=V^~K&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~v&w,e[3]=b^~y&k,e[12]=P^~x&j,e[13]=R^~N&D,e[22]=B^~F&W,e[23]=L^~J&U,e[32]=G^~q&Q,e[33]=K^~H&X,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=v^~w&E,e[5]=y^~k&A,e[14]=x^~j&T,e[15]=N^~D&I,e[24]=F^~W&M,e[25]=J^~U&z,e[34]=q^~Q&Z,e[35]=H^~X&ee,e[44]=se^~ae&le,e[45]=ie^~ce&de,e[6]=w^~E&h,e[7]=k^~A&m,e[16]=j^~T&S,e[17]=D^~I&$,e[26]=W^~M&O,e[27]=U^~z&C,e[36]=Q^~Z&Y,e[37]=X^~ee&V,e[46]=ae^~le&te,e[47]=ce^~de&ne,e[8]=E^~h&g,e[9]=A^~m&b,e[18]=T^~S&P,e[19]=I^~$&R,e[28]=M^~O&B,e[29]=z^~C&L,e[38]=Z^~Y&G,e[39]=ee^~V&K,e[48]=le^~te&re,e[49]=de^~ne&oe,e[0]^=_[r],e[1]^=_[r+1]},F=function(){const e={instance:Error,from:e=>{const t=[e.name,e.message];return void 0!==e.stack&&t.push(e.stack),void 0!==e.cause&&(void 0===e.stack&&t.push(void 0),t.push(e.cause)),t},stub:()=>new Error,hydrate:(e,[t,n,r,o])=>{e.name=t,e.message=n,void 0===r?delete e.stack:e.stack=r,void 0!==o&&(e.cause=o)}},t={instance:Uint8Array,from:e=>[btoa(W.decode(e))],create:([e])=>J.encode(atob(e))},n={instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(const[n,r]of t)e.set(n,r)}},r={instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(const n of t)e.add(n)}},o={instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},s={instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},i={instance:URL,from:e=>[e.href],create:([e])=>new URL(e)};return new Map([e,t,n,r,o,s,i].map(e=>[e.instance.name,e]))}(),J=new TextEncoder,W=new TextDecoder("utf-8");function U(e=void 0,t=F){return JSON.stringify(Y(e,t))}function M(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 z=[];function Y(e,t=F){const n=M(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=M(n);if(null!==s)return s;let i=o.get(n);if(void 0!==i)return i;switch(i=r.length,typeof n){case"number":case"string":case"boolean":r[i]=n,o.set(n,i);break;case"bigint":r[i]=[-6,n.toString(16)],o.set(n,i);break;case"object":if(null===n)r[i]=n,o.set(n,i);else if(Array.isArray(n)){const t=function(e){if(z.length<e){const t=z.length;z.length=e,z.fill(-2,t,e)}return z.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,l=Array.from({length:c+1});l[0]=s,r[i]=l,o.set(n,i);for(let t=0;t<c;t++)l[t+1]=e(a[t])}}return i}(e),r}function V(e,t){return function(e){return new B(512,I,512).update(e).hex()}(U([e,t]))}const G=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=V}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),l=Date.now();return(i!==c||l-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=l),o}}}({getCacheKey:V});function K(e){return!!e&&"0"!==e&&"false"!==e}let q;class H{static{[q]=function(e,t,n,r,o){var s,i,a,c,l,d,u,p=Symbol.metadata||Symbol.for("Symbol.metadata"),f=Object.defineProperty,h=Object.create,m=[h(null),h(null)],g=t.length;function b(t,n,r){return function(o,s){n&&(s=o,o=e);for(var i=0;i<t.length;i++)s=t[i].apply(o,r?[s]:[]);return r?s:o}}function v(e,t,n,r){if("function"!=typeof e&&(r||void 0!==e))throw new TypeError(t+" must "+(n||"be")+" a function"+(r?"":" or undefined"));return e}function y(e,t,n,r,o,a,c,l,d,u,p){function h(e){if(!p(e))throw new TypeError("Attempted to access private element on non-instance")}var g=[].concat(t[0]),y=t[3],w=!c,k=1===o,E=3===o,A=4===o,S=2===o;function $(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),P[t].call(o,s)}}if(!w){var P={},R=[],x=E?"get":A||k?"set":"value";if(d?(u||k?P={get:j(function(){return y(this)},r,"get"),set:function(e){t[4](this,e)}}:P[x]=y,u||j(P[x],r,S?"":x)):u||(P=Object.getOwnPropertyDescriptor(e,r)),!u&&!d){if((i=m[+l][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+P[x].name+") is not supported yet");m[+l][r]=o<3?1:o}}for(var N=e,D=g.length-1;D>=0;D-=n?2:1){var T=v(g[D],"A decorator","be",!0),I=n?g[D-1]:void 0,O={},_={kind:["field","accessor","method","getter","setter","class"][o],name:r,metadata:s,addInitializer:function(e,t){if(e.v)throw new TypeError("attempted to call addInitializer after decoration was finished");v(t,"An initializer","be",!0),a.push(t)}.bind(null,O)};if(w)i=T.call(I,N,_),O.v=1,v(i,"class decorators","return")&&(N=i);else if(_.static=l,_.private=d,i=_.access={has:d?p.bind():function(e){return r in e}},A||(i.get=d?S?function(e){return h(e),P.value}:$("get",0,h):function(e){return e[r]}),S||E||(i.set=d?$("set",0,h):function(e,t){e[r]=t}),N=T.call(I,k?{get:P.get,set:P.set}:P[x],_),O.v=1,k){if("object"==typeof N&&N)(i=v(N.get,"accessor.get"))&&(P.get=i),(i=v(N.set,"accessor.set"))&&(P.set=i),(i=v(N.init,"accessor.init"))&&R.unshift(i);else if(void 0!==N)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else v(N,(u?"field":"method")+" decorators","return")&&(u?R.unshift(N):P[x]=N)}return o<2&&c.push(b(R,l,1),b(a,l,0)),u||w||(d?k?c.splice(-1,0,$("get",l),$("set",l)):c.push(S?P[x]:v.call.bind(P[x])):f(e,r,P)),N}function w(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),l=[],d=function(e){e&&l.push(b(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],d=i[1],u=7&d;if((8&d)==t&&!u==r){var p=i[2],f=!!i[3],h=16&d;y(t?e:e.prototype,i,h,f?"#"+p:D(p),u,u<2?[]:t?c=c||[]:a=a||[],l,!!t,f,r,t&&f?function(t){return N(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),d(a),d(c),i=l,g||w(e),{e:i,get c(){var n=[];return g&&[w(e=y(e,[t],r,e.name,5,n)),b(n,1)]}}}(this,[],[[G,3,"isBunAvailable"],[G,3,"buildCommand"],[G,3,"rootDirPath"],[G,3,"dockerfile"],[G,3,"hasDockerfile"],[G,3,"hasSourceCode"],[G,3,"name"],[G,3,"dockerImageName"],[G,3,"env"],[G,3,"packageJson"],[G,3,"packageJsonPath"],[G,3,"hasPrisma"],[G,3,"hasVitest"],[G,3,"hasBiome"],[G,3,"hasEslint"],[G,3,"preferredLinter"],[G,3,"hasPlaywrightConfig"],[G,3,"skipLaunchingServerForPlaywright"],[G,3,"dockerPackageJson"],[G,3,"binExists"],[G,3,"rootPackageJson"]]).e}argv=void q(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}get buildCommand(){return this.packageJson.scripts?.build?.includes("buildIfNeeded")?"YARN run build":this.packageJson.scripts?.build?"YARN wb buildIfNeeded "+(this.argv.verbose?"--verbose":""):"echo 'No build script'"}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,"..","..","package.json"))?t.resolve(this.dirPath,"..",".."):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile("Dockerfile"),"utf8")}get hasDockerfile(){try{return!!this.findFile("Dockerfile")}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,"src"))}get name(){return this.packageJson.name||"unknown"}get dockerImageName(){return(this.packageJson.name||"unknown").replaceAll("@","").replaceAll("/","-")}get env(){if(!this.loadEnv)return process.env;const[n,r]=function(n,r){let o=(n.env??[]).map(e=>t.resolve(r,e.toString()));const s=n.cascadeEnv??(n.cascadeNodeEnv?process.env.NODE_ENV||"development":n.autoCascadeEnv?process.env.WB_ENV||process.env.NODE_ENV||"development":void 0);if("string"==typeof s){if(0===o.length&&(o.push(t.join(r,".env")),n.includeRootEnv)){const n=t.resolve(r,"..","..");e.existsSync(t.join(n,"package.json"))&&o.push(t.join(n,".env"))}o=o.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}o=o.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e)),n.verbose&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",o.join(", ")));const i=[],a={};for(const e of o){const o=[];for(const[n,s]of Object.entries(k(t.join(r,e))))n in a||n in process.env||(a[n]=s,o.push(n));i.push([e,o]),n.verbose&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}if(n.verbose||console.info(`Read env files: ${i.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(k(t.join(r,n.checkEnv))).filter(e=>!(e in a)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${o.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:a,processEnv:{}}).parsed??a,i]}(this.argv,this.dirPath);for(const[e,t]of r)console.info(`Loaded ${t} environment variables from ${e}`);return{...n,...process.env}}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 hasBiome(){return this.hasDependency("@biomejs/biome")||this.hasDependency("biome")}get hasEslint(){return this.hasDependency("eslint")}get preferredLinter(){return this.hasBiome?"biome":this.hasEslint?"eslint":void 0}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(K(this.env.CI))return!1;try{const t=this.findFile("playwright.config.ts");return/\bwebServer\b/.test(e.readFileSync(t,"utf8"))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile("Dockerfile"))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile("Dockerfile")),"package.json"),"utf8"))}get binExists(){let n=!1,r=this.dirPath;for(;;){const o=t.join(r,"node_modules",".bin");if(e.existsSync(o)&&(this.env.PATH=`${o}:${this.env.PATH}`,n=!0),e.existsSync(t.join(r,".git")))break;const s=t.dirname(r);if(r===s)break;r=s}return n}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join("..","..",n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw new Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){const t=t=>!(!t||!(t.dependencies?.[e]||t.devDependencies?.[e]||t.optionalDependencies?.[e]||t.peerDependencies?.[e]));return t(this.packageJson)||t(this.rootPackageJson)}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,"package.json"),"utf8"))}catch(e){return void console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,"package.json")}`,e)}}}function Q(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new H(o,n,r)}async function X(n,r=!0,o){const s=function(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new H(o,n,r);let i=s;if(!s.packageJson.workspaces&&t.dirname(o).endsWith("/packages")){const s=t.resolve(o,"..","..");e.existsSync(t.join(s,"package.json"))&&(i=new H(s,n,r))}return{root:i,self:s}}(n,r,o);if(s)return{...s,descendants:s.root===s.self?await Z(n,s.root,r):[s.self]}}async function Z(n,r,o){const s=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return s;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await d(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new H(r,n,o));return s}const ee=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),te=ee?"bun --bun run":"node",ne=ee?"bun":"yarn",re=ee?"bun --bun run":"yarn",oe={command:"buildIfNeeded",describe:"Build code if changes are detected",builder:{command:{description:"A build command (default: yarn|bun build)",type:"string",alias:"c"}},async handler(n){await async function(n,r){const s=Q(n,!0,r);if(!s)return console.error(l.red("No project found.")),!0;if(n={...n,command:n.command??(ee?"bun run build":"yarn build")},!e.existsSync(t.join(s.rootDirPath,".git")))return se(s,n),!0;const[i,a,d]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),l=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(l);const d=JSON.stringify(Object.entries(n.env).filter(([e])=>!ie.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(d),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(ae.some(t=>e.includes(t))||ce.some(t=>e.endsWith(t)))&&!le.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${s.join(", ")}`);const i=o.spawn("git",["diff","--",...s],{cwd:e.rootDirPath});i.stdout.on("data",e=>{n.update(e),t.verbose&&(console.info("Data:",e),console.info("Hash:",n.copy().digest("hex")))}),i.on("close",()=>{r()})})}(n,r,a);const u=a.digest("hex"),p=await async function(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}(()=>e.promises.readFile(i,"utf8"));return[p===u,i,u]}(s,n);if(i)return console.info(l.green(`Skip to run '${n.command}' 💫`)),!1;if(!se(s,n))return;n.dryRun||await e.promises.writeFile(a,d,"utf8");return!0}(n)}};function se(e,t){if(console.info(l.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const ie=new Set(["CI","PWDEBUG","TMPDIR"]);const ae=["src/","public/"],ce=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],le=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const de=new m,ue={exitIfFailed:!0};async function pe(e,t,n,r=ue){const o=he(e,t);if(me(o.printable,t),n.verbose&&me(o.runnable,t,"Start (raw)",!0),n.dryRun)return ge(o.printable,0,r),0;const s=await x(o.runnable,void 0,{cwd:t.dirPath,env:be(t.env,r),shell:!0,stdio:"inherit",timeout:r.timeout,killOnExit:!0,verbose:n.verbose});return r.onSignal?.(s.signal),ge(o.printable,s.status,r),s.status??1}function fe(e,t,n,r=ue){return de.runAndWaitForReturnValue(async()=>{const o=he(e,t);if(me(o.printable,t,"Start (parallel)",!0),n.dryRun)return me(o.printable,t,"Started (log)"),n.verbose&&me(o.runnable,t,"Started (raw)",!0),ge(o.printable,0,r),0;const s=await x(o.runnable,void 0,{cwd:t.dirPath,env:be(t.env,r),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,verbose:n.verbose});r.onSignal?.(s.signal),me(o.printable,t,"Started (log)"),n.verbose&&me(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&(process.stdout.write(i),process.stdout.write("\n")),ge(o.printable,s.status,r),s.status??1})}function he(e,t){let n=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll("PRISMA generate ",t.packageJson.dependencies?.blitz?"PRISMA generate ":"PRISMA generate --no-hints ").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN ",t.isBunAvailable?"bun --bun run ":"YARN ").replaceAll("YARN run ",ee?"bun --bun run ":"yarn run ");ee&&(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=ve(n.replaceAll("YARN ",`${re} `)),o=ve(n.replaceAll("YARN playwright ",`${re} playwright `).replaceAll("YARN ",!ee&&t.binExists?"":`${re} `)),s=t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:"";return{printable:`${re} dotenv${s} -- ${r}`,runnable:o}}function me(e,t,n="Start",r=!1){console.info("\n"+(r?l.gray:l.cyan)(l.bold(`${n}:`),e)+l.gray(` at ${t.dirPath}`))}function ge(e,t,n){0===t?console.info(l.green(l.bold("Finished:"),e)):(console.info(l.red(l.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1))}function be(e,t){const n={...e};return t.ci&&(n.CI="1"),t.forceColor&&(n.FORCE_COLOR="3"),n}function ve(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const ye={...y,"working-dir":{description:"A working directory",type:"string",alias:"w"},"dry-run":{description:"Whether to skip actual command execution",type:"boolean",alias:["dry","d"]}};function we(e){const t=[];for(const n of Object.keys(y)){const r=ke(e,n);if(void 0!==r)if("boolean"!=typeof r)if("string"!=typeof r&&"number"!=typeof r){if(Array.isArray(r))for(const e of r)t.push(`--${n}=${e}`)}else t.push(`--${n}=${r}`);else t.push(r?`--${n}`:`--${n}=false`)}return t}function ke(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Ee={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...ye,"kill-others":{description:"Kill other commands when one command exits",type:"boolean"},"kill-others-on-fail":{description:"Kill other commands when one command fails",type:"boolean"},success:{description:"Define successful completion criteria",type:"string",choices:["all","first"],default:"all"},commands:{description:"Commands to run concurrently",type:"array"}},async handler(e){"win32"===process.platform&&(console.error(l.red("This command is not supported on Windows.")),process.exit(1));const t=Q(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(l.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>o.spawn(he(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:be(e.project.env,{ci:e.ci,forceColor:e.forceColor}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=Array.from({length:t.length}),c=t.map((n,o)=>new Promise(c=>{let l=!1;const d=n=>{l||(l=!0,a[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,Se(t)),c())};n.once("error",e=>{console.error("Failed to start child process:",e),d(1)}),n.once("exit",(e,t)=>{d(Ae(e,t))})})),l=e=>{n??=e,i||(i=!0,Se(t))},d=()=>{l("SIGINT")},u=()=>{l("SIGTERM")},p=()=>{l("SIGQUIT")};process.on("SIGINT",d),process.on("SIGTERM",u),process.on("SIGQUIT",p);try{await Promise.all(c)}finally{process.removeListener("SIGINT",d),process.removeListener("SIGTERM",u),process.removeListener("SIGQUIT",p)}if(n)return Ae(null,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of a)if(void 0!==e&&0!==e)return e;return 0}({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:"boolean"==typeof e.ci?e.ci:void 0,forceColor:"boolean"==typeof e.forceColor?e.forceColor:void 0});process.exit(r)}catch(e){console.error(l.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function Ae(e,t){return null!==e?e:t&&t in h.signals?128+h.signals[t]:1}function Se(e){for(const t of e)if(t.pid)try{$e(t.pid),A(t.pid)}catch(e){console.warn("Failed to kill child process:",e)}}function $e(e){try{process.kill(-e,"SIGTERM")}catch(e){if(function(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}(e))return;throw e}}const Pe={command:"kill-port-if-non-ci",describe:"Kill the port specified by PORT environment variable if non-CI.",builder:{},async handler(e){await async function(e){const t=Q(e);t||(console.error(l.red("No project found.")),process.exit(1));if(K(t.env.CI))return void console.info(`Skip killing port due to CI: ${t.env.CI}`);const n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(l.red(`PORT environment variable is invalid: ${n}`)),process.exit(1));console.info(`Killing the port: ${r}`);try{await g(r)}catch{}}(e)}};function Re(e){return e.map(e=>xe(e)).join(" ")}function xe(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const Ne=new Set(["astro","cjs","css","cts","gql","htm","html","js","json","json5","jsonc","jsx","mjs","mts","svelte","ts","tsx","vue","yaml","yml"]),je=new Set(["cjs","cts","js","jsx","mjs","mts","ts","tsx"]),De=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),Te=new Set([...De].filter(e=>!Ne.has(e))),Ie={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"}},async handler(e){"win32"===process.platform&&(console.error(l.red("This command is not supported on Windows.")),process.exit(1));const n=await X(e,!1);n||(console.error(l.red("No project found.")),process.exit(1));const r=e.files??[],o=new Map,s=[],i=[];let a,c,d=!1;if(r.length>0){for(const e of r){const r=t.resolve(String(e));if(r.endsWith("/test/fixtures")||r.includes("/test/fixtures/")||r.endsWith("/test-fixtures")||r.includes("/test-fixtures/"))continue;const a=t.extname(r).slice(1);if(r.endsWith("/package.json")){i.push(r);continue}const c=_e(n.descendants,r);if(c)if(Be(c,a)){const e=o.get(c)??[];e.push(r),o.set(c,e),Le(c)&&s.push(r)}else De.has(a)?s.push(r):Ce(a)&&!c.preferredLinter&&(console.error(l.red(`No linter found for ${c.name}. Install ESLint or Biome.`)),d=!0)}a=s,c=i}else a=function(e,n){const r=new Set([`**/{.*/,}*.{${[...Te].join(",")}}`,"!**/test{-,/}fixtures/**"]);for(const o of n){if(!Le(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...De].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),c=n.descendants.map(e=>e.packageJsonPath);const u=[],p={exitIfFailed:!1,forceColor:!0};if(r.length>0)for(const[t,n]of o){const r=Oe(t,e,n);r&&u.push(fe(r,t,e,p))}else for(const t of n.descendants){if(t.packageJson.workspaces&&!t.hasSourceCode)continue;const n=Oe(t,e);n&&u.push(fe(n,t,e,p))}const f=await Promise.all(u);(d||f.some(e=>0!==e))&&process.exit(1),e.format&&(a.length>0&&await fe(Re(["YARN","prettier","--cache","--color","--no-error-on-unmatched-pattern","--write","--",...a]),n.self,e,{forceColor:!0}),c.length>0&&await fe(Re(["YARN","sort-package-json","--",...c]),n.self,e,{forceColor:!0}))}};function Oe(e,t,n){if("biome"===e.preferredLinter){let e;return e=t.fix&&t.format?["check","--fix"]:t.fix?["lint","--fix"]:t.format?["format","--fix"]:["lint"],Re(["BUN","biome",...e,"--colors=force","--no-errors-on-unmatched","--files-ignore-unknown=true",...n?.length?["--"]:[],...n??[]])}if("eslint"===e.preferredLinter)return Re(["YARN","eslint","--color",...t.fix||t.format?["--fix"]:[],"--",...n??["."]])}function _e(e,t){let n;for(const r of e)t!==r.dirPath&&!t.startsWith(`${r.dirPath}/`)||n&&!(r.dirPath.length>n.dirPath.length)||(n=r);return n}function Ce(e){return Ne.has(e)||je.has(e)}function Be(e,t){return"biome"===e.preferredLinter?Ne.has(t):"eslint"===e.preferredLinter&&je.has(t)}function Le(e){return"eslint"===e.preferredLinter}function*Fe(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Je={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 X(n);r||(console.error(l.red("No project found.")),process.exit(1));for(const o of Fe("optimizeForDockerBuild",r.descendants)){const r=o.packageJson,s=["dependencies","devDependencies"];for(const e of s){const t=r[e]??{};for(const[e,n]of Object.entries(t))n?.startsWith("git@github.com:")&&(t[e]=`./${e}`)}if(We(n,r),Ue(r),Me(r),n.dryRun)continue;const i=n.outside?t.join(o.dirPath,"dist"):o.dirPath;await e.promises.mkdir(i,{recursive:!0}),await e.promises.writeFile(t.join(i,"package.json"),JSON.stringify(r),"utf8")}n.dryRun||n.outside||(o.spawnSync(ne,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};function We(e,t){if(!e.outside)return delete t.devDependencies,void console.info("Removed all devDependencies.");const n=t.devDependencies??{},r=["artillery","biome","concurrently","conventional-changelog-conventionalcommits","eslint","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],o=[];for(const e of Object.keys(n))(r.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete n[e],o.push(e));console.info("Removed devDependencies:",o.join(", ")||"none")}function Ue(e){const t=["check","deploy","format","lint","start","test"],n=["pinst ","husky "],r=e.scripts??{},o=[];for(const[e,s]of Object.entries(r))(t.some(t=>e.startsWith(t))||n.some(e=>s.includes(e)||s.trim()===e.trim()))&&(delete r[e],o.push(e));console.info("Removed scripts:",o.join(", ")||"none")}function Me(e){delete e.private,delete e.publishConfig,delete e.prettier}const ze="file:",Ye=[{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"}];function Ve(e){return e.packageJson.dependencies?.blitz?"db/mount":"prisma/mount"}function Ge(n){return Ye.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}const Ke=new class{cleanUpLitestream(e){const t=Ve(e);var n;return`${`if [ -f "${n=`${t}/prod.sqlite3`}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${ze}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}deployForce(e){const t=Ve(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore -config litestream.yml -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){return`litestream ltx -config litestream.yml ${Ve(e)}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && PRISMA generate && ${this.seed(e)}`}migrateDev(e,t=""){return`PRISMA migrate dev ${t}`}reset(e,n=""){const r=[],o=function(e){const n=e.env.DATABASE_URL;if(!n?.startsWith(ze))return;const r=n.slice(5).replace(/[?#].*$/,"");if(!r)return;const o=Ge(e),s=t.isAbsolute(r)?r:t.resolve(e.dirPath,o??".",r);return`rm -f "${s}" "${s}-wal" "${s}-shm"`}(e);o&&r.push(o);const s=["PRISMA migrate reset --force",n].filter(Boolean).join(" ");return r.push(s),e.packageJson.dependencies?.blitz&&r.push(this.seed(e)),r.filter(Boolean).join(" && ")}restore(e,t){return`rm -Rf ${t}*; litestream restore -config litestream.yml -o ${t} ${Ve(e)}/prod.sqlite3`}seed(e,t){return e.packageJson.dependencies?.blitz?"YARN blitz db seed"+(t?` -f ${t}`:""):t?`BUN build-ts run ${t}`:e.packageJson.prisma?.seed?"YARN prisma db seed":'if [ -e "prisma/seeds.ts" ]; then BUN build-ts run prisma/seeds.ts; fi'}studio(e,n,r=""){let o="";if(n)try{new URL(n),o=`DATABASE_URL=${n} `}catch{const e=t.resolve(n);o=`DATABASE_URL=${ze}${e} `}else if(e.env.DATABASE_URL?.startsWith(ze)){const n=Ge(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${ze}${r} `}}return`${o}PRISMA studio ${r}`}},qe={},He={command:"prisma",describe:"Run prisma commands",builder:e=>e.command(Qe).command(Xe).command(Ze).command(et).command(tt).command(nt).command(rt).command(ot).command(st).command(it).command(at).command(ct).demandCommand().strict(!1),handler(){}},Qe={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:qe,async handler(e){const t=await dt(e);for(const n of Fe("prisma cleanup-litestream",t))await pe(Ke.cleanUpLitestream(n),n,e)}},Xe={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:qe,async handler(e){const t=await dt(e);for(const e of Fe("prisma create-litestream-config",t))lt(e)}},Ze={command:"deploy",describe:"Apply migration to DB without initializing it",builder:qe,async handler(e){const t=await dt(e),n=ut(e);for(const r of Fe("prisma deploy",t))await pe(Ke.deploy(r,n),r,e)}},et={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:qe,async handler(e){const t=await dt(e);for(const n of Fe("prisma deploy-force",t))await pe(Ke.deployForce(n),n,e)}},tt={command:"list-backups",describe:"List Litestream backups",builder:qe,async handler(e){const t=await dt(e);for(const n of Fe("prisma list-backups",t))await pe(Ke.listBackups(n),n,e)}},nt={command:"migrate",describe:"Apply migration to DB with initializing it",builder:qe,async handler(e){const t=await dt(e),n=ut(e);for(const r of Fe("prisma migrate",t))await pe(Ke.migrate(r,n),r,e)}},rt={command:"migrate-dev",describe:"Create a migration file",builder:qe,async handler(e){const t=await dt(e),n=ut(e);for(const r of Fe("prisma migrate-dev",t))await pe(Ke.migrateDev(r,n),r,e)}},ot={command:"reset",describe:"Reset DB",builder:qe,async handler(e){const t=await dt(e),n=ut(e);for(const r of Fe("prisma reset",t))await pe(Ke.reset(r,n),r,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const t of Fe("WB_ENV=test prisma reset",await dt(e)))await pe(Ke.reset(t,n),t,e)}}},st={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...qe,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await dt(e);for(const n of Fe("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await pe(Ke.restore(n,t),n,e)}}},it={command:"seed",describe:"Populate DB with seed data",builder:{...qe,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await dt(e);for(const n of Fe("prisma seed",t))await pe(Ke.seed(n,e.file),n,e)}},at={command:"studio [db-url-or-path]",describe:"Open Prisma Studio",builder:{...qe,"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 dt(e),n=ut(e,["db-url-or-path","restored"]);for(const r of Fe("prisma studio",t)){const t=e.restored?r.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await pe(Ke.studio(r,t,n),r,e)}}},ct={command:"$0 <args..>",describe:"Pass the command and arguments to prisma as is",builder:{args:{type:"array"}},async handler(e){const t=await dt(e),n=[(e.args?.join(" ")??"").trimEnd(),ut(e,["args"])].filter(Boolean).join(" ");for(const r of Fe(`prisma ${n}`,t))await pe(`PRISMA ${n}`,r,e)}};function lt(t){const n=`${t.packageJson.dependencies?.blitz?"db":"prisma"}/mount/prod.sqlite3`,r={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(r).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw new Error(`Missing environment variables for Litestream: ${o.join(", ")}`);const s="staging"===t.env.WB_ENV?"5m":"1h",i=`dbs:\n - path: ${n}\n busy-timeout: 5s\n checkpoint-interval: 1m\n replica:\n type: s3\n endpoint: https://${r.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID}.r2.cloudflarestorage.com\n bucket: ${r.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME}\n access-key-id: ${r.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}\n secret-access-key: ${r.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}\n snapshot-interval: 24h # Create a backup per day\n retention: 72h # Keep backups for 3 days\n retention-check-interval: ${s}\n sync-interval: 1m\n`,a="/etc/litestream.yml";try{e.writeFileSync(a,i),console.info(`Generated ${a}`)}catch(e){const t=e instanceof Error?e.message:String(e);throw new Error(`Failed to write ${a}: ${t}`)}}async function dt(e){const t=await X(e);t||(console.error(l.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(l.red("No prisma project found.")),process.exit(1)),n}function ut(e,t=[]){const n=[],r=Object.keys(ye),o=Object.values(ye).flatMap(e=>"alias"in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),s=new Set([...t,...r,...o,"_","$0"]);for(const[t,r]of Object.entries(e))if(!s.has(t)){const o=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(o!==t&&void 0!==e[o])continue;if("boolean"==typeof r&&r)n.push(`--${t}`);else if("string"==typeof r||"number"==typeof r)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(const e of r)n.push(`--${t}`,String(e))}return n.join(" ")}const pt={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=Q(e);t||(console.error(l.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let o=0;o<e.retry;o++)if(o>0&&console.info(`\n${l.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await pe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},ft={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await X(e,!1,t);n||(console.error(l.red("No project found.")),process.exit(1));for(const t of Fe("setup",n.descendants)){const r=await b.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await fe(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await pe("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await fe("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await fe(`poetry env use ${n}`,t,e),await de.promiseAll(),await pe("poetry run pip install --upgrade pip",t,e),await pe("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await pe(`${re} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await pe(`${re} playwright install --with-deps`,r,e)}(e)}};function ht(e){return e.silent?" > /dev/null":""}const mt=new Set;async function gt(e,t){const n=await async function(e){for(const t of["127.0.0.1","::"]){if(!await yt(t,e))return!1}return!0}(e);n||await bt(e,t);const r=async()=>{mt.has(e)||(mt.add(e),await bt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,r)}async function bt(e,t){await async function(e,t){await async function(e,t){try{const n=await async function(e,t){const{stdout:n}=await x("docker",["ps","-q",...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}(e,t);if(0===n.length)return;await x("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function vt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await gt(n,t),n}async function yt(e,t){return new Promise(n=>{const r=v();r.once("error",e=>{"EADDRINUSE"!==e.code?"EAFNOSUPPORT"!==e.code?n(!1):n(!0):n(!1)}),r.once("listening",()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const wt=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"";return`cd ${t.dirname(e.findFile("Dockerfile"))}\n && ${r}YARN wb optimizeForDockerBuild --outside\n && YARN wb retry -- docker build -t ${e.dockerImageName}\n --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)\n --build-arg WB_ENV=${e.env.WB_ENV}\n --build-arg WB_VERSION=${n} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(mt.has(e))return;mt.add(e),me(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});ge(e,n,{})};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(this.stop(e),e);return`docker run --rm ${n.includes("/bin/bash")?"-it ":""}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`true $(docker rm -f $(docker container ls -q -f name=${e.dockerImageName}) 2> /dev/null)`}stopAll(){return"true $(docker rm -f $(docker ps -q) 2> /dev/null)"}};class kt{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return wt.buildImage(e,t)}async startDev(e,t){return await vt(e.env.PORT,e),this.shouldWaitAndOpenApp?Re(["YARN","wb","concurrently",...we(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await vt(e.env.PORT,e),this.shouldWaitAndOpenApp?Re(["YARN","wb","concurrently",...we(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await vt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await vt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${Re(["YARN","wb","concurrently",...we(t),"--kill-others-on-fail",wt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${wt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),r=void 0===n?[("YARN wb buildIfNeeded "+(t.verbose?"--verbose":"")).trim(),`node dist/index.js ${t.normalizedArgsText??""}`.trim()]:[e.buildCommand,`pm2-runtime start --no-autorestart ${n}`];return[...e.hasPrisma?Ke.migrate(e).split("&&"):[],...r].filter(Boolean).map(e=>`${e} ${ht(t)}`.trim()).join(" && ")}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,wt.stopAndStart(e),n)}async testStart(e,t){return await vt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${xe(r)}`} ${Re(["YARN","wb","concurrently",...we(t),"--kill-others","--success","first",this.startDevProtected(e,t),this.waitApp(e)])}`;var n,r}async testE2EProtected(e,t,n,{playwrightArgs:r=["test","test/e2e/"]}){const o=await vt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=function(e,t,n){const r=["BUN","playwright"],o=t?.map(String);if("test"!==e[0]||!o?.length)return Et([...r,...e],n);const s=e.slice(1),i=function(e){let t;const n=[];for(const[r,o]of e.entries()){if(t){if("required"===t||!o.startsWith("-")){t=void 0;continue}t=void 0}if("--"===o)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(o.startsWith("--")){if(o.includes("="))continue;At.has(o)?t="required":St.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&$t.has(e)&&(t="required");continue}n.push(r)}}return n}(s),a=0===i.length?s:s.filter((e,t)=>!i.includes(t));return Et([...r,"test",...o,...a],n)}(r,t.targets,t.bail);return e.skipLaunchingServerForPlaywright?`${i}${s}`:Re(["YARN","wb","concurrently",...we(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${i}${s}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?Re(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--color","--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?Re(["bun","test",...n?.length?n:["test/unit/"],...t.bail?["--bail"]:[]]):'echo "No tests."'}waitApp(e){const t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null\n || wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){const t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}}function Et(e,t){const n=e.indexOf("playwright"),r=-1!==n&&"test"===e[n+1];return t&&r?e.some(e=>"--max-failures"===e||e.startsWith("--max-failures="))?Re(e):Re([...e,"--max-failures=1"]):Re(e)}const At=new Set(["--browser","--config","--grep","--grep-invert","--global-timeout","--max-failures","--output","--project","--repeat-each","--reporter","--retries","--shard","--test-list","--test-list-invert","--timeout","--trace","--tsconfig","--ui-host","--ui-port","--ui-title","--workers"]),St=new Set(["--only-changed","--update-snapshots","--update-source-method"]),$t=new Set(["-c","-g","-j"]);const Pt=new class extends kt{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const Rt=new class extends kt{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);const o=await vt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String);return Re(["YARN","wb","concurrently",...we(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o}\n && ${Re(["vitest","run",...i&&i.length>0?i:["test/e2e/"],"--color","--passWithNoTests","--allowOnly",...t.bail?["--bail=1"]:[]])}${s}`])}};const xt=new class extends kt{constructor(){super(!0)}startDevProtected(e,t){return`next dev --turbopack ${t.normalizedArgsText??""}`}};const Nt=new class extends kt{constructor(){super(!1)}startDevProtected(e,t){throw new Error("This method should not be called.")}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?"--watch":""} src/index.ts -- ${t.normalizedArgsText??""}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${te} dist/index.js ${t.normalizedArgsText??""} | tee server.log`)}startTest(){return Promise.resolve("echo 'do nothing.'")}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,"development")} && ${wt.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`)}testE2EDev(){return Promise.resolve("echo 'do nothing.'")}testE2EProduction(){return Promise.resolve("echo 'do nothing.'")}testE2EDocker(){return Promise.resolve("echo 'do nothing.'")}testStart(){return Promise.resolve("echo 'do nothing.'")}};const jt=new class extends kt{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const Dt=new class extends kt{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??""}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??""}`.trim()}},Tt=["express","fastify","elysia","hono"],It={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=>xe(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>xe(String(e))).join(" ")}(e);const t=await X(e);t||(console.error(l.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=Pt;else if(t.next)o=xt;else if(r["@remix-run/dev"])o=jt;else if(r.vite)o=Dt;else if(Tt.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=Rt;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=Nt}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await pe(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await pe(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await pe(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await pe(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await pe(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},Ot={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"},bail:{description:"Stop tests after the first failure",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 X(n);r||(console.error(l.red("No project found.")),process.exit(1));process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";const o=n.targets??[],s=0===o.length,i=o.some(e=>e.includes("/e2e")),a=o.some(e=>e.includes("/unit")),c=s||a,d=s||i;for(const s of r.descendants){const r=s.packageJson.dependencies??{},i=s.packageJson.devDependencies??{};let a;if(a=r.blitz?Pt:r.next?xt:i["@remix-run/dev"]?jt:i.vite?Dt:Tt.some(e=>r[e])&&!r["firebase-functions"]?Rt:Nt,console.info(`Running "test" for ${s.name} ...`),c&&e.existsSync(t.join(s.dirPath,"test","unit"))){const e=o.filter(e=>e.includes("/unit")),t={...n,targets:e.length>0?e:void 0};await pe(a.testUnit(s,t),s,n,{timeout:n.unitTimeout})}if(!d||!e.existsSync(t.join(s.dirPath,"test","e2e")))continue;const l=o.filter(e=>e.includes("/e2e")),u={...n,targets:l.length>0?l:void 0};switch(n.e2e){case"headless":await pe(await a.testE2EProduction(s,u,{}),s,n);continue;case"headless-dev":await pe(await a.testE2EDev(s,u,{}),s,n);continue;case"docker":await _t(s,u,a);continue;case"docker-debug":await _t(s,u,a,["test",...l.length>0?l:["test/e2e/"],"--debug"]);continue}if(r.blitz||r.next||i["@remix-run/dev"]||i.vite)switch(n.e2e){case"headed":await pe(await a.testE2EProduction(s,u,{playwrightArgs:["test",...l.length>0?l:["test/e2e/"],"--headed"]}),s,n);break;case"headed-dev":await pe(await a.testE2EDev(s,u,{playwrightArgs:["test",...l.length>0?l:["test/e2e/"],"--headed"]}),s,n);break;case"debug":await pe(await a.testE2EProduction(s,u,{playwrightArgs:["test",...l.length>0?l:["test/e2e/"],"--debug"]}),s,n);break;case"generate":await pe(await a.testE2EProduction(s,u,{playwrightArgs:["codegen",`http://localhost:${s.env.PORT}`]}),s,n);break;case"trace":await pe("BUN playwright show-trace",s,n)}}}(n)}};async function _t(e,t,n,r){e.env.WB_DOCKER||="1",await pe(`${n.buildDocker(e,"test")}${ht(t)}`,e,t),process.exitCode=await pe(await n.testE2EDocker(e,t,{playwrightArgs:r}),e,t,{exitIfFailed:!1}),await pe(wt.stop(e),e,t)}const Ct={command:"test-on-ci",describe:"Test project on CI with no options.",builder:{silent:{description:"Reduce redundant outputs",type:"boolean"}},async handler(n){await async function(n){const r=await X(n);r||(console.error(l.red("No project found.")),process.exit(1));process.env.CI||="1",process.env.FORCE_COLOR||="3",process.env.WB_ENV||="test";for(const o of r.descendants){const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;if(i=r.blitz?Pt:r.next?xt:s["@remix-run/dev"]?jt:s.vite?Dt:Tt.some(e=>r[e])&&!r["firebase-functions"]?Rt:Nt,console.info(`Running "test-on-ci" for ${o.name} ...`),await fe(wt.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await fe(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await fe(await i.testStart(o,n),o,n),await de.promiseAll(),o.hasDockerfile&&(o.env.WB_DOCKER||="1",await pe(`${i.buildDocker(o,"test")}${ht(n)}`,o,n));const e=o.hasDockerfile?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await pe(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),await pe(wt.stop(o),o,n)}}}(n)}};const Bt={command:"tree-kill <pid> [signal]",describe:"Kill the given process and all descendants",builder:e=>e.positional("pid",{description:"The process ID to kill.",type:"number",demandOption:!0}).option("signal",{description:"Signal to send to the process tree.",type:"string",default:"SIGTERM"}),handler(e){try{const t=e.signal;if(!(t in h.signals))throw new Error(`Invalid signal: ${t}`);A(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Lt={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){const r=await X(n,!1);r||(console.error(l.red("No project found.")),process.exit(1));let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces?s.hasSourceCode&&(s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"):((s.packageJson.dependencies?.typescript||s.packageJson.devDependencies?.typescript)&&i.push("BUN tsc --noEmit"),s.packageJson.devDependencies?.pyright&&i.push("YARN pyright"));i.length>0;){const a=await fe(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,forceColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(l.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(l.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(l.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found.")),process.exit(a)}},Ft={...Lt,command:"tc"};await n(r(process.argv)).scriptName("wb").options(ye).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(oe).command(Ee).command(Pe).command(Ie).command(Je).command(He).command(pt).command(ft).command(It).command(Ot).command(Ct).command(Bt).command(Lt).command(Ft).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;let Jt=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!Jt){Jt=!0;try{A(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
10
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy91dGlscy9wcm9jZXNzLnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvc2NyaXB0cy9kb2NrZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9jb21tYW5kcy9zdGFydC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3RPbkNpLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3RyZWVLaWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3R5cGVjaGVjay50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHsgZXhwYW5kIH0gZnJvbSAnZG90ZW52LWV4cGFuZCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtlbnZQYXRoLCBrZXlzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiBrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke2tleXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgfVxuICB9XG4gIGlmICghYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IGZpbGVzOiAke2VudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5tYXAoKFtlbnZQYXRoLCBrZXlzXSkgPT4gKGtleXMubGVuZ3RoID4gMCA/IGAke2VudlBhdGh9ICgke2tleXMuam9pbignLCAnKX0pYCA6IGVudlBhdGgpKS5qb2luKCcsICcpIHx8ICdub3RoaW5nJ31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkpO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtleHBhbmQoeyBwYXJzZWQ6IGVudlZhcnMsIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyBlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJy4vdHJlZUtpbGwuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBiYXNlZCBvbiBTcGF3blN5bmNSZXR1cm5zIGJ1dCB3aXRob3V0IG91dHB1dCBhbmQgZXJyb3IgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGV4dGVuZGluZyB2YXJpb3VzIE5vZGUuanMgc3Bhd24gb3B0aW9ucyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICAvKiogSW5wdXQgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MncyBzdGRpbiAqL1xuICBpbnB1dD86IHN0cmluZztcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBvdXRwdXQgd2lsbCBiZSBtZXJnZWQgaW50byBzdGRvdXQgKi9cbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGUgc3Bhd25lZCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBwcm9jZXNzIGV4aXRzICovXG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgZW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcgb2YgcHJvY2VzcyBvcGVyYXRpb25zICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3Rkb3V0IGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZG91dD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3RkZXJyPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsZWFudXBTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID1cbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFsnU0lHSU5UJywgJ1NJR1RFUk0nXSA6IFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddO1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgY29uc3QgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgY2xlYW51cFNpZ25hbHMpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzdG9wUHJvY2VzcygpO1xuICAgICAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5saXN0ZW5lckNvdW50KHNpZ25hbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/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+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuPXZvaWQgMCxlPXQpe3JldHVybiBKU09OLnN0cmluZ2lmeShhKG4sZSkpfWZ1bmN0aW9uIHUodCl7aWYodm9pZCAwPT09dClyZXR1cm4tMTtpZihcIm51bWJlclwiPT10eXBlb2YgdCl7aWYoTnVtYmVyLmlzTmFOKHQpKXJldHVybi0zO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIHQ8MD8tNTotNH1yZXR1cm4gbnVsbH1jb25zdCBsPVtdO2Z1bmN0aW9uIGEoZSxyPXQpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztjb25zdCBpPVtdLHM9bmV3IE1hcDtyZXR1cm4gZnVuY3Rpb24gdChlKXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87bGV0IGM9cy5nZXQoZSk7aWYodm9pZCAwIT09YylyZXR1cm4gYztzd2l0Y2goYz1pLmxlbmd0aCx0eXBlb2YgZSl7Y2FzZVwibnVtYmVyXCI6Y2FzZVwic3RyaW5nXCI6Y2FzZVwiYm9vbGVhblwiOmlbY109ZSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcImJpZ2ludFwiOmlbY109Wy02LGUudG9TdHJpbmcoMTYpXSxzLnNldChlLGMpO2JyZWFrO2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1lKWlbY109ZSxzLnNldChlLGMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1mdW5jdGlvbih0KXtpZihsLmxlbmd0aDx0KXtjb25zdCBuPWwubGVuZ3RoO2wubGVuZ3RoPXQsbC5maWxsKC0yLG4sdCl9cmV0dXJuIGwuc2xpY2UoMCx0KX0oZS5sZW5ndGgpO2lbY109bixzLnNldChlLGMpO2Zvcihjb25zdFtyLG9db2YgZS5lbnRyaWVzKCkpbltyXT10KG8pfWVsc2V7Y29uc3RbbyxmXT1mdW5jdGlvbih0LGUpe2NvbnN0IHI9dC5jb25zdHJ1Y3RvcjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXtjb25zdCBuPXIubmFtZSxvPWUuZ2V0KG4pO2lmKHZvaWQgMCE9PW8pcmV0dXJuW24sby5mcm9tKHQpXX1jb25zdCBvPU9iamVjdC5lbnRyaWVzKHQpLGk9by5sZW5ndGgscz1BcnJheS5mcm9tKHtsZW5ndGg6aStpfSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj1vW3RdLGU9dCt0O3NbZV09blswXSxzW2UrMV09blsxXX1yZXR1cm5bbixzXX0oZSxyKSx1PWYubGVuZ3RoLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnUrMX0pO2xbMF09byxpW2NdPWwscy5zZXQoZSxjKTtmb3IobGV0IG49MDtuPHU7bisrKWxbbisxXT10KGZbbl0pfX1yZXR1cm4gY30oZSksaX1leHBvcnR7ciBhcyBBUlJBWV9IT0xFX0lOREVYLGMgYXMgQklHX0lOVF9MQUJFTCxvIGFzIE5BTl9JTkRFWCxzIGFzIE5FR19JTkZfSU5ERVgsaSBhcyBQT1NfSU5GX0lOREVYLGUgYXMgVU5ERUZJTkVEX0lOREVYLGEgYXMgbGlzdGlmeSxmIGFzIHN0cmluZ2lmeX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdpZnkuanMubWFwXG4iLCJpbXBvcnR7c2hhM181MTIgYXMgcn1mcm9tXCIuL2hhc2guanNcIjtpbXBvcnR7c3RyaW5naWZ5IGFzIG59ZnJvbVwiLi9vc29uL3N0cmluZ2lmeS5qc1wiO2Z1bmN0aW9uIG8obyx0KXtyZXR1cm4gcihuKFtvLHRdKSl9ZnVuY3Rpb24gdChyLG8pe3JldHVybiBuKFtyLG9dKX1mdW5jdGlvbiBpKCl7cmV0dXJuXCJcIn1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbyBhcyBnZXRDYWNoZUtleU9mSGFzaCx0IGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXBcbiIsImltcG9ydHtnZXRDYWNoZUtleU9mSGFzaCBhcyB0LGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyBhcyBlfWZyb21cIi4vZ2V0Q2FjaGVLZXkuanNcIjtjb25zdCBuPXIoe2dldENhY2hlS2V5OnR9KSxjPXIoe2dldENhY2hlS2V5OmV9KTtmdW5jdGlvbiByKHtjYWNoZUR1cmF0aW9uOmU9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGdldENhY2hlS2V5Om49dH09e30pe3JldHVybiBmdW5jdGlvbih0LGMpe2xldCByLG8saTtyZXR1cm5cImdldHRlclwiPT09Yz8ua2luZD9mdW5jdGlvbigpe2NvbnN0IGM9bih0aGlzLFtdKSxhPURhdGUubm93KCk7cmV0dXJuKGkhPT1jfHxhLW8+ZSkmJihpPWMscj10LmNhbGwodGhpcyksbz1hKSxyfTpmdW5jdGlvbiguLi5hKXtjb25zdCB1PW4odGhpcyxhKSxoPURhdGUubm93KCk7cmV0dXJuKGkhPT11fHxoLW8+ZSkmJihpPXUscj1jP3QuY2FsbCh0aGlzLC4uLmEpOnQoLi4uYSksbz1oKSxyfX19ZXhwb3J0e24gYXMgbWVtb2l6ZU9uZSxyIGFzIG1lbW9pemVPbmVGYWN0b3J5LGMgYXMgbWVtb2l6ZU9uZVdpdGhFbXB0eUhhc2h9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZU9uZS5qcy5tYXBcbiIsImV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhY2lFbnYgJiYgY2lFbnYgIT09ICcwJyAmJiBjaUVudiAhPT0gJ2ZhbHNlJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IG1lbW9pemVPbmUgfSBmcm9tICdhdC1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8oXnxcXG4pYnVuXFxzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IFtlbnZQYXRoLCBjb3VudF0gb2YgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uZW52VmFycywgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzQmlvbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnQGJpb21lanMvYmlvbWUnKSB8fCB0aGlzLmhhc0RlcGVuZGVuY3koJ2Jpb21lJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRXNsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ2VzbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHByZWZlcnJlZExpbnRlcigpOiAnYmlvbWUnIHwgJ2VzbGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc0Jpb21lKSByZXR1cm4gJ2Jpb21lJztcbiAgICBpZiAodGhpcy5oYXNFc2xpbnQpIHJldHVybiAnZXNsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUGxheXdyaWdodENvbmZpZygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ0kodGhpcy5lbnYuQ0kpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShcbiAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZSh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICAgKSBhcyBQYWNrYWdlSnNvbik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYmluRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGxldCBiaW5Gb3VuZCA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50UGF0aCA9IHRoaXMuZGlyUGF0aDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBiaW5QYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICAgIHRoaXMuZW52LlBBVEggPSBgJHtiaW5QYXRofToke3RoaXMuZW52LlBBVEh9YDtcbiAgICAgICAgYmluRm91bmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBiaW5Gb3VuZDtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNEZXBlbmRlbmN5SW5QYWNrYWdlSnNvbiA9IChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgICAhIShcbiAgICAgICAgcGFja2FnZUpzb24gJiZcbiAgICAgICAgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fFxuICAgICAgICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fFxuICAgICAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8XG4gICAgICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24odGhpcy5wYWNrYWdlSnNvbikgfHwgaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24odGhpcy5yb290UGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcm9vdFBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yb290RGlyUGF0aCA9PT0gdGhpcy5kaXJQYXRoKSByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbjtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt3Yl0gRmFpbGVkIHRvIHJlYWQgb3IgcGFyc2UgJHtwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfWAsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmUHJvamVjdChhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52ID0gdHJ1ZSwgZGlyUGF0aD86IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGFyZ3YuY29tbWFuZCA/PyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIH07XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSkge1xuICAgIGJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgW2NhblNraXAsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXSA9IGF3YWl0IGNhblNraXBCdWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKGNhblNraXApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFNraXAgdG8gcnVuICcke2FyZ3YuY29tbWFuZH0nIPCfkqtgKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFidWlsZChwcm9qZWN0LCBhcmd2KSkgcmV0dXJuO1xuXG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2gsICd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYW5Ta2lwQnVpbGQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj5cbik6IFByb21pc2U8W2Jvb2xlYW4sIHN0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBjYWNoZURpcmVjdG9yeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJy5jYWNoZScsICdidWlsZCcpO1xuICBjb25zdCBjYWNoZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNhY2hlRGlyZWN0b3J5UGF0aCwgJ2xhc3QtYnVpbGQnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoY2FjaGVEaXJlY3RvcnlQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2dpdCByZXYtcGFyc2UgSEVBRCcsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGggfSkudG9TdHJpbmcoKS50cmltKCk7XG4gIGhhc2gudXBkYXRlKGNvbW1pdEhhc2gpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudEhhc2ggPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkRmlsZShjYWNoZUZpbGVQYXRoLCAndXRmOCcpKTtcbiAgcmV0dXJuIFtjYWNoZWRDb250ZW50SGFzaCA9PT0gY29udGVudEhhc2gsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gWydzcmMvJywgJ3B1YmxpYy8nXTtcbmNvbnN0IGluY2x1ZGVTdWZmaXggPSBbXG4gICcuanMnLFxuICAnLmNqcycsXG4gICcubWpzJyxcbiAgJy5qc3gnLFxuICAnLnRzJyxcbiAgJy5jdHMnLFxuICAnLm10cycsXG4gICcudHN4JyxcbiAgJy5qc29uJyxcbiAgJy5icm93c2Vyc2xpc3RyYycsXG4gIC8vIEJlY2F1c2Ugc29tZSBidWlsZCBjb21tYW5kcyBhZmZlY3RlZCBieSBjaGFuZ2VzIGluIGBwYWNrYWdlLmpzb25gXG4gICdwYWNrYWdlLmpzb24nLFxuICAneWFybi5sb2NrJyxcbl07XG5jb25zdCBleGNsdWRlUGF0dGVybnMgPSBbJ3Rlc3QvJywgJ3Rlc3RzLycsICdfX3Rlc3RzX18vJywgJ3Rlc3QtZml4dHVyZXMvJywgJ3Rlc3QvZml4dHVyZXMvJ107XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgaGFzaDogSGFzaFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCBsaW5lcyA9IHJldC5zdGRvdXRcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgY29uc3QgZmlsZVBhdGhzID0gbGluZXNcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoMikudHJpbSgpKVxuICAgICAgLm1hcCgoZmlsZVBhdGgpID0+XG4gICAgICAgIHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnID8gZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpIDogZmlsZVBhdGhcbiAgICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlUGF0aHMgPSBmaWxlUGF0aHMuZmlsdGVyKFxuICAgICAgKGZpbGVQYXRoKSA9PlxuICAgICAgICAoaW5jbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKSB8fFxuICAgICAgICAgIGluY2x1ZGVTdWZmaXguc29tZSgoc3VmZml4KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChzdWZmaXgpKSkgJiZcbiAgICAgICAgIWV4Y2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSlcbiAgICApO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEZpbGVQYXRocy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vICdnaXQgZGlmZiAtLScgd29ya3Mgb25seSBvbiByb290RGlyUGF0aFxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnLS0nLCAuLi5maWx0ZXJlZEZpbGVQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4sIHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgb3B0cyksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogeyBwcmludGFibGU6IHN0cmluZzsgcnVubmFibGU6IHN0cmluZyB9IHtcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAnUFJJU01BIGdlbmVyYXRlICcsXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnUFJJU01BIGdlbmVyYXRlICcgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMgJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biAtLWJ1biBydW4gJyA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1biAtLWJ1bikgcnVuYFxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBpc1J1bm5pbmdPbkJ1biA/ICdidW4gLS1idW4gcnVuICcgOiAneWFybiBydW4gJyk7XG4gIGlmIChpc1J1bm5pbmdPbkJ1bikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gYnVpbGQtdHMgcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLnJlcGxhY2VBbGwoJ2J1biAtLWJ1biBydW4gYnVuIC0tYnVuIHJ1bicsICdidW4gLS1idW4gcnVuJylcbiAgICAgIC8vIEJlY2F1c2UgYnVuIGNhbiBydW4gc3JjL2luZGV4LnRzIGRpcmVjdGx5LlxuICAgICAgLnJlcGxhY2VBbGwoJ2Rpc3QvaW5kZXguanMnLCAnc3JjL2luZGV4LnRzJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oPzpZQVJOICk/dml0ZXN0IHJ1bi9nLCAnYnVuIHRlc3QnKVxuICAgICAgLy8gJy0tYWxsb3dPbmx5JyBpcyBzb21ldGltZXMgcmVtb3ZlZC5cbiAgICAgIC5yZXBsYWNlQWxsKC8gLS1jb2xvciAtLXBhc3NXaXRoTm9UZXN0cyg/OiAtLWFsbG93T25seSk/L2csICcnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCkpO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IGZpeEJ1bkNvbW1hbmQoXG4gICAgbmV3U2NyaXB0XG4gICAgICAvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGB5YXJuIHBsYXl3cmlnaHRgIGluIGEgcHJvamVjdCBkZXBlbmRpbmcgb24gYGFydGlsbGVyeS1lbmdpbmUtcGxheXdyaWdodGAuXG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIWlzUnVubmluZ09uQnVuICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGApXG4gICk7XG4gIC8vIEFkZCBjYXNjYWRlIG9wdGlvbiB3aGVuIFdCX0VOViBpcyBkZWZpbmVkXG4gIGNvbnN0IGNhc2NhZGVPcHRpb24gPSBwcm9qZWN0LmVudi5XQl9FTlYgPyBgIC1jPSR7cHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCd9YCA6ICcnO1xuICByZXR1cm4ge1xuICAgIHByaW50YWJsZTogYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBkb3RlbnYke2Nhc2NhZGVPcHRpb259IC0tICR7cHJpbnRhYmxlU2NyaXB0fWAsXG4gICAgcnVubmFibGU6IHJ1bm5hYmxlU2NyaXB0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUVudihcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBvcHRzOiBPcHRpb25zXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnYuQ0kgPSAnMSc7XG4gIH1cbiAgaWYgKG9wdHMuZm9yY2VDb2xvcikge1xuICAgIG5ld0Vudi5GT1JDRV9DT0xPUiA9ICczJztcbiAgfVxuICByZXR1cm4gbmV3RW52O1xufVxuXG5mdW5jdGlvbiBmaXhCdW5Db21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE0MzU5XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCduZXh0IGRldicpIHx8XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvODIyMlxuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3BsYXl3cmlnaHQnKSB8fFxuICAgIC8vIFwiYnVuIC0tYnVuIHByaXNtYSBnZW5lcmF0ZVwiIGRvZXNuJ3Qgd29ya1xuICAgIGNvbW1hbmQuaW5jbHVkZXMoJ3ByaXNtYScpIHx8XG4gICAgY29tbWFuZC5pbmNsdWRlcygndGVzdC9lMmUtYWRkaXRpb25hbCcpXG4gICAgPyBjb21tYW5kLnJlcGxhY2VBbGwoJ2J1biAtLWJ1bicsICdidW4nKVxuICAgIDogY29tbWFuZDtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdraWxsLW90aGVycyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBleGl0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAna2lsbC1vdGhlcnMtb24tZmFpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0tpbGwgb3RoZXIgY29tbWFuZHMgd2hlbiBvbmUgY29tbWFuZCBmYWlscycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBzdWNjZXNzOiB7XG4gICAgZGVzY3JpcHRpb246ICdEZWZpbmUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIGNyaXRlcmlhJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbJ2FsbCcsICdmaXJzdCddLFxuICAgIGRlZmF1bHQ6ICdhbGwnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0NvbW1hbmRzIHRvIHJ1biBjb25jdXJyZW50bHknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5pbnRlcmZhY2UgUnVuQ29uY3VycmVudGx5T3B0aW9ucyB7XG4gIGNvbW1hbmRzOiBzdHJpbmdbXTtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAga2lsbE90aGVyczogYm9vbGVhbjtcbiAga2lsbE90aGVyc09uRmFpbDogYm9vbGVhbjtcbiAgc3VjY2VzczogJ2FsbCcgfCAnZmlyc3QnO1xuICBjaT86IGJvb2xlYW47XG4gIGZvcmNlQ29sb3I/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZm9yY2VDb2xvcjogdHlwZW9mIGFyZ3YuZm9yY2VDb2xvciA9PT0gJ2Jvb2xlYW4nID8gYXJndi5mb3JjZUNvbG9yIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29uY3VycmVudGx5KG9wdGlvbnM6IFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuY29tbWFuZHMubWFwKChjb21tYW5kKSA9PlxuICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd24obm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIG9wdGlvbnMucHJvamVjdCkucnVubmFibGUsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5wcm9qZWN0LmRpclBhdGgsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogY29uZmlndXJlRW52KG9wdGlvbnMucHJvamVjdC5lbnYsIHsgY2k6IG9wdGlvbnMuY2ksIGZvcmNlQ29sb3I6IG9wdGlvbnMuZm9yY2VDb2xvciB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb208bnVtYmVyIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogY2hpbGRyZW4ubGVuZ3RoIH0pO1xuICBjb25zdCB3YWl0Rm9yRXhpdFByb21pc2VzID0gY2hpbGRyZW4ubWFwKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzZXR0bGUgPSAoZXhpdENvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IGV4aXRDb2RlO1xuICAgICAgICBmaXJzdFJlc3VsdCA/Pz0gZXhpdENvZGU7XG5cbiAgICAgICAgaWYgKCFzdG9wcGluZyAmJiBzaG91bGRTdG9wT3RoZXJzKGV4aXRDb2RlLCBvcHRpb25zKSkge1xuICAgICAgICAgIHN0b3BSZXN1bHQgPSBleGl0Q29kZTtcbiAgICAgICAgICBzdG9wcGluZyA9IHRydWU7XG4gICAgICAgICAgdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSwgc2lnbmFsKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ2ludCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdJTlQnKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lndGVybSA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdURVJNJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3F1aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHUVVJVCcpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc3RvcE9uU2lndGVybSk7XG4gIHByb2Nlc3Mub24oJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yRXhpdFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUobnVsbCwgaW50ZXJydXB0ZWRTaWduYWwpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0Jykge1xuICAgIHJldHVybiBmaXJzdFJlc3VsdCA/PyAxO1xuICB9XG4gIGlmIChzdG9wUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RvcFJlc3VsdDtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRDb2RlKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICBpZiAoc2lnbmFsICYmIHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykge1xuICAgIHJldHVybiAxMjggKyBjb25zdGFudHMuc2lnbmFsc1tzaWduYWxdO1xuICB9XG4gIHJldHVybiAxO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdG9wT3RoZXJzKFxuICBleGl0Q29kZTogbnVtYmVyLFxuICBvcHRpb25zOiBQaWNrPFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMsICdraWxsT3RoZXJzJyB8ICdraWxsT3RoZXJzT25GYWlsJyB8ICdzdWNjZXNzJz5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnIHx8IG9wdGlvbnMua2lsbE90aGVycyB8fCAob3B0aW9ucy5raWxsT3RoZXJzT25GYWlsICYmIGV4aXRDb2RlICE9PSAwKTtcbn1cblxuZnVuY3Rpb24gdGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgIGlmICghY2hpbGQucGlkKSBjb250aW51ZTtcblxuICAgIHRyeSB7XG4gICAgICBraWxsUHJvY2Vzc0dyb3VwKGNoaWxkLnBpZCk7XG4gICAgICB0cmVlS2lsbChjaGlsZC5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsICdTSUdURVJNJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGJpb21lRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnYXN0cm8nLFxuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnZ3FsJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc3ZlbHRlJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBlc2xpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAndHMnLCAndHN4J10pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqYXZhJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFiaW9tZUV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGFyZ3YuZmlsZXMgPz8gW107XG4gICAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gICAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGFja2FnZUpzb25GaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgICBsZXQgc29ydFBhY2thZ2VKc29uQXJnczogc3RyaW5nW107XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShTdHJpbmcoZmlsZSkpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgICAgcGFja2FnZUpzb25GaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9qZWN0ID0gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKCFwcm9qZWN0KSBjb250aW51ZTtcblxuICAgICAgICBpZiAoc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBjb25zdCBsaW50RmlsZVBhdGhzID0gbGludEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgbGludEZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAobmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIHByZXR0aWVyRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBFU0xpbnQgb3IgQmlvbWUuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcmV0dGllckFyZ3MgPSBwcmV0dGllckZpbGVQYXRocztcbiAgICAgIHNvcnRQYWNrYWdlSnNvbkFyZ3MgPSBwYWNrYWdlSnNvbkZpbGVQYXRocztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGludFByb21pc2VzOiBQcm9taXNlPG51bWJlcj5bXSA9IFtdO1xuICAgIGNvbnN0IGxpbnRSdW5PcHRpb25zID0geyBleGl0SWZGYWlsZWQ6IGZhbHNlLCBmb3JjZUNvbG9yOiB0cnVlIH0gYXMgY29uc3Q7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGxpbnRGaWxlUGF0aHNdIG9mIGxpbnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgICBsaW50UHJvbWlzZXMucHVzaChydW5XaXRoU3Bhd25JblBhcmFsbGVsKGxpbnRDb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBsaW50UnVuT3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiAhcHJvamVjdC5oYXNTb3VyY2VDb2RlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRQcm9taXNlcy5wdXNoKHJ1bldpdGhTcGF3bkluUGFyYWxsZWwobGludENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGxpbnRFeGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChsaW50UHJvbWlzZXMpO1xuXG4gICAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgfHwgbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICBpZiAocHJldHRpZXJBcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgICAncHJldHRpZXInLFxuICAgICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICAgJy0tJyxcbiAgICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAgeyBmb3JjZUNvbG9yOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnLS0nLCAuLi5zb3J0UGFja2FnZUpzb25BcmdzXSksXG4gICAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgICBhcmd2LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvcmNlQ29sb3I6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPixcbiAgYXJndjogUGljazxcbiAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPixcbiAgICAnZml4JyB8ICdmb3JtYXQnXG4gID4sXG4gIGZpbGVzPzogc3RyaW5nW11cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2Jpb21lJykge1xuICAgIGxldCBiaW9tZUFyZ3M6IHN0cmluZ1tdO1xuICAgIGlmIChhcmd2LmZpeCAmJiBhcmd2LmZvcm1hdCkge1xuICAgICAgYmlvbWVBcmdzID0gWydjaGVjaycsICctLWZpeCddO1xuICAgIH0gZWxzZSBpZiAoYXJndi5maXgpIHtcbiAgICAgIGJpb21lQXJncyA9IFsnbGludCcsICctLWZpeCddO1xuICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQpIHtcbiAgICAgIGJpb21lQXJncyA9IFsnZm9ybWF0JywgJy0tZml4J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpb21lQXJncyA9IFsnbGludCddO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ0JVTicsXG4gICAgICAnYmlvbWUnLFxuICAgICAgLi4uYmlvbWVBcmdzLFxuICAgICAgJy0tY29sb3JzPWZvcmNlJyxcbiAgICAgICctLW5vLWVycm9ycy1vbi11bm1hdGNoZWQnLFxuICAgICAgJy0tZmlsZXMtaWdub3JlLXVua25vd249dHJ1ZScsXG4gICAgICAuLi4oZmlsZXM/Lmxlbmd0aCA/IFsnLS0nXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbXSksXG4gICAgXSk7XG4gIH1cbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnZXNsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnZXNsaW50JyxcbiAgICAgICctLWNvbG9yJyxcbiAgICAgIC4uLihhcmd2LmZpeCB8fCBhcmd2LmZvcm1hdCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgICctLScsXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJz5bXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBhcmdzID0gbmV3IFNldDxzdHJpbmc+KFtgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gLCAnISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqJ10pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGVzbGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPiwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnYmlvbWUnKSByZXR1cm4gYmlvbWVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdlc2xpbnQnKSByZXR1cm4gZXNsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBuZWVkc1ByZXR0aWVyKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+KTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ2VzbGludCc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgZGVwc1tuYW1lXSA9IGAuLyR7bmFtZX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghYXJndi5vdXRzaWRlKSB7XG4gICAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcbiAgICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgYWxsIGRldkRlcGVuZGVuY2llcy4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBuYW1lV29yZHNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYXJ0aWxsZXJ5JyxcbiAgICAnYmlvbWUnLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdlc2xpbnQnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuY29uc3QgUE9TU0lCTEVfUFJJU01BX1BBVEhTID0gW1xuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAncHJpc21hJyB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpLCBkYlBhdGg6IHBhdGguam9pbigncHJpc21hJywgJ3NjaGVtYScpIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdkYicsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ2RiJyB9LFxuXTtcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFByaXNtYSBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgUFJJU01BYCBpcyByZXBsYWNlZCB3aXRoIGBZQVJOIHByaXNtYWAgb3IgYFlBUk4gYmxpdHogcHJpc21hYFxuICogYW5kIGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQcmlzbWFTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjbGVhblVwQ29tbWFuZCA9IGJ1aWxkV2FsQ2hlY2twb2ludEFuZFJlbW92ZVNxbGl0ZVNpZGVjYXJGaWxlc0NvbW1hbmQoYCR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYCk7XG4gICAgLy8gQ2xlYW51cCBleGlzdGluZyBhcnRpZmFjdHMgdG8gYXZvaWQgaXNzdWVzIHdpdGggTGl0ZXN0cmVhbSByZXBsaWNhdGlvbi5cbiAgICAvLyBOb3RlIHRoYXQgZG9uJ3QgbWVyZ2UgbXVsdGlwbGUgcm0gY29tbWFuZHMgaW50byBvbmUsIGJlY2F1c2UgaWYgb25lIGZhaWxzLCB0aGUgc3Vic2VxdWVudCBvbmVzIHdvbid0IHJ1bi5cbiAgICByZXR1cm4gYCR7Y2xlYW5VcENvbW1hbmR9OyBybSAtUmYgJHtkaXJQYXRofS8ucHJvZC5zcWxpdGUzKiB8fCB0cnVlYDtcbiAgfVxuXG4gIGRlcGxveShfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRlcGxveSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAtY29uZmlnIGxpdGVzdHJlYW0ueW1sIC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAtY29uZmlnIGxpdGVzdHJlYW0ueW1sICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgUFJJU01BIGdlbmVyYXRlICYmICR7dGhpcy5zZWVkKHByb2plY3QpfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGV2ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIC8vIGNmLiBodHRwczovL3d3dy5wcmlzbWEuaW8vZG9jcy9ndWlkZXMvZGF0YWJhc2Uvc2VlZC1kYXRhYmFzZSNpbnRlZ3JhdGVkLXNlZWRpbmctd2l0aC1wcmlzbWEtbWlncmF0ZVxuICAgIGNvbnN0IHN0ZXBzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNsZWFudXBDb21tYW5kID0gY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQocHJvamVjdCk7XG4gICAgaWYgKGNsZWFudXBDb21tYW5kKSBzdGVwcy5wdXNoKGNsZWFudXBDb21tYW5kKTtcbiAgICBjb25zdCByZXNldENvbW1hbmQgPSBbJ1BSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UnLCBhZGRpdGlvbmFsT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBzdGVwcy5wdXNoKHJlc2V0Q29tbWFuZCk7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgLy8gQmxpdHogZG9lcyBub3QgdHJpZ2dlciBzZWVkIGF1dG9tYXRpY2FsbHksIHNvIHdlIG5lZWQgdG8gcnVuIGl0IG1hbnVhbGx5LlxuICAgICAgc3RlcHMucHVzaCh0aGlzLnNlZWQocHJvamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgLWNvbmZpZyBsaXRlc3RyZWFtLnltbCAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikgcmV0dXJuIGBZQVJOIGJsaXR6IGRiIHNlZWQke3NjcmlwdFBhdGggPyBgIC1mICR7c2NyaXB0UGF0aH1gIDogJyd9YDtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwicHJpc21hL3NlZWRzLnRzXCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuIHByaXNtYS9zZWVkcy50czsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvbW91bnQnIDogJ3ByaXNtYS9tb3VudCc7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgZGVzY3JpYmU6ICdSdW4gcHJpc21hIGNvbW1hbmRzJyxcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGNyZWF0ZS1saXRlc3RyZWFtLWNvbmZpZycsIGFsbFByb2plY3RzKSkge1xuICAgICAgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZyhwcm9qZWN0KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIGRlcGxveScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Rm9yY2VDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2RlcGxveS1mb3JjZScsXG4gIGRlc2NyaWJlOiBcIkZvcmNlIHRvIGFwcGx5IG1pZ3JhdGlvbiB0byBEQiB1dGlsaXppbmcgTGl0ZXN0cmVhbSdzIGJhY2t1cCB3aXRob3V0IGluaXRpYWxpemluZyBpdFwiLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgZGVwbG95LWZvcmNlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdXQl9FTlY9dGVzdCBwcmlzbWEgcmVzZXQnLCBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndikpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kUHJpc21hUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdwcmlzbWEgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHByaXNtYVNjcmlwdHMuc2VlZChwcm9qZWN0LCBhcmd2LmZpbGUpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzdHVkaW9CdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICAnZGItdXJsLW9yLXBhdGgnOiB7XG4gICAgZGVzY3JpcHRpb246ICdVUkwgb3IgcGF0aCB0byB0aGUgZGF0YWJhc2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICByZXN0b3JlZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBvcGVuIHRoZSBkZWZhdWx0IHJlc3RvcmVkIGRhdGFiYXNlICg8ZGJ8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzKS4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHN0dWRpb0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc3R1ZGlvQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3R1ZGlvIFtkYi11cmwtb3ItcGF0aF0nLFxuICBkZXNjcmliZTogJ09wZW4gUHJpc21hIFN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmRQcmlzbWFQcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3ByaXNtYSBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTogJ1Bhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBwcmlzbWEgYXMgaXMnLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZFByaXNtYVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoYHByaXNtYSAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3QgZGlyTmFtZSA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYicgOiAncHJpc21hJztcbiAgY29uc3QgZGJQYXRoID0gYCR7ZGlyTmFtZX0vbW91bnQvcHJvZC5zcWxpdGUzYDtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJldGVudGlvbkNoZWNrSW50ZXJ2YWwgPSBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICdzdGFnaW5nJyA/ICc1bScgOiAnMWgnO1xuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYGRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc25hcHNob3QtaW50ZXJ2YWw6IDI0aCAgIyBDcmVhdGUgYSBiYWNrdXAgcGVyIGRheVxuICAgICAgcmV0ZW50aW9uOiA3MmggICAgICAgICAgIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuICAgICAgcmV0ZW50aW9uLWNoZWNrLWludGVydmFsOiAke3JldGVudGlvbkNoZWNrSW50ZXJ2YWx9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICBjb25zdCBjb25maWdQYXRoID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUHJpc21hUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbHRlcihcbiAgICAocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnByaXNtYSA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucHJpc21hXG4gICk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJpc21hIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCB1bmtub3duIG9wdGlvbnMgZnJvbSBhcmd2IHRvIHBhc3MgdG8gcHJpc21hIGNvbW1hbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmtub3duT3B0aW9ucy5qb2luKCcgJyk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgb25TaWduYWw6IChzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHNldHVwQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cCcsXG4gIGRlc2NyaWJlOiAnU2V0dXAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgc2V0dXAoYXJndik7XG4gIH0sXG59O1xuXG4vLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdzZXR1cCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5yZWFkZGlyKHByb2plY3QuZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGlmIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290KSB7XG4gICAgICBpZiAob3MucGxhdGZvcm0oKSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZXMgPSBbJ3BzdHJlZSddO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBicmV3IGluc3RhbGwgJHtwYWNrYWdlcy5qb2luKCcgJyl9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lLmluY2x1ZGVzKCctdmVyc2lvbicpKSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ2FzZGYgaW5zdGFsbCcsIHByb2plY3QsIGFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZSA9PT0gJ3B5cHJvamVjdC50b21sJykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlJywgcHJvamVjdCwgYXJndik7XG4gICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ2FzZGYgY3VycmVudCBweXRob24nKS50b1N0cmluZygpLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgcG9ldHJ5IGVudiB1c2UgJHt2ZXJzaW9ufWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IGluc3RhbGwgLS1hbnNpJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QgfHwgIXByb2plY3RzLnJvb3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSAmJlxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ11cbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtwYWNrYWdlTWFuYWdlcldpdGhSdW59IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRPcHRpb25zQnVpbGRlciA9IHtcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gd2F0Y2ggZmlsZXMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBjb3JlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdhJyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbiAgJ2RvY2tlci1vcHRpb25zJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciBcImRvY2tlciBydW5cIicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBkZWZhdWx0OiBbXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNjcmlwdEFyZ3YgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+XG4pOiB2b2lkIHtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZEFyZ3NUZXh0ID0gWy4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi4oYXJndi5fPy5zbGljZSgxKSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4vcG9ydC5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KTtcbiAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH1cblxuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gV2Ugc2hvdWxkIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMgZmlyc3QgYmVjYXVzZSBga2lsbC1wb3J0YCBtYXkgZmFpbCB0byBzdG9wIERvY2tlciBjb250YWluZXJzLlxuICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQsIHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jT25FeGl0IH0gZnJvbSAnLi4vdXRpbHMvcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBEb2NrZXIgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIERvY2tlclNjcmlwdHMge1xuICBidWlsZEltYWdlKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiBjb2RpbmctYm9vc3RlciB1c2VzIGBcImRvY2tlci9idWlsZC9wcmVwYXJlXCI6IFwidG91Y2ggZHJpbGwtdXNlcnMuY3N2XCIsYFxuICAgIGNvbnN0IHByZWZpeCA9IHByb2plY3QuZG9ja2VyUGFja2FnZUpzb24uc2NyaXB0cz8uWydkb2NrZXIvYnVpbGQvcHJlcGFyZSddXG4gICAgICA/ICdZQVJOIHJ1biBkb2NrZXIvYnVpbGQvcHJlcGFyZSAmJiAnXG4gICAgICA6ICcnO1xuICAgIHJldHVybiBgY2QgJHtwYXRoLmRpcm5hbWUocHJvamVjdC5maW5kRmlsZSgnRG9ja2VyZmlsZScpKX1cbiAgICAmJiAke3ByZWZpeH1ZQVJOIHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGQgLS1vdXRzaWRlXG4gICAgJiYgWUFSTiB3YiByZXRyeSAtLSBkb2NrZXIgYnVpbGQgLXQgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX1cbiAgICAgICAgLS1idWlsZC1hcmcgQVJDSD0kKFsgJCh1bmFtZSAtbSkgPSAnYXJtNjQnIF0gJiYgZWNobyBhcm02NCB8fCBlY2hvIHg4Nl82NClcbiAgICAgICAgLS1idWlsZC1hcmcgV0JfRU5WPSR7cHJvamVjdC5lbnYuV0JfRU5WfVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9WRVJTSU9OPSR7dmVyc2lvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBjb250YWluZXIgbHMgLXEgLWYgbmFtZT0ke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCwgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVjb3N5c3RlbUNvbmZpZ1BhdGggPSBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjb21tYW5kcyA9XG4gICAgICBlY29zeXN0ZW1Db25maWdQYXRoID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7YXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gLnRyaW0oKSxcbiAgICAgICAgICAgIGBub2RlIGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICAgICAgICBdXG4gICAgICAgIDogW3Byb2plY3QuYnVpbGRDb21tYW5kLCBgcG0yLXJ1bnRpbWUgc3RhcnQgLS1uby1hdXRvcmVzdGFydCAke2Vjb3N5c3RlbUNvbmZpZ1BhdGh9YF07XG5cbiAgICByZXR1cm4gWy4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IHByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KS5zcGxpdCgnJiYnKSA6IFtdKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIC8vIFVzZSBlbXB0eSBOT0RFX0VOViB0byBhdm9pZCBcInByb2R1Y3Rpb25cIiBtb2RlIGluIHNvbWUgZnJhbWV3b3JrcyBsaWtlIEJsaXR6LmpzLlxuICAgIHJldHVybiBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBwbGF5d3JpZ2h0QXJncyA9IFsndGVzdCcsICd0ZXN0L2UyZS8nXSB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgJ3J1bicsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAnLS1jb2xvcicsXG4gICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICctLWFsbG93T25seScsXG4gICAgICAgICctLXdhdGNoPWZhbHNlJyxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsPTEnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2J1bicsXG4gICAgICAgICd0ZXN0JyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbCddIDogW10pLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA5MDAwMCAtaSAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSwgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3NdLCBiYWlsKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgxKTtcbiAgY29uc3QgZXhwbGljaXRUYXJnZXRJbmRleGVzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMocmVzdCk7XG4gIGNvbnN0IHJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQgPVxuICAgIGV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5sZW5ndGggPT09IDAgPyByZXN0IDogcmVzdC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhZXhwbGljaXRUYXJnZXRJbmRleGVzLmluY2x1ZGVzKGluZGV4KSk7XG4gIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgJ3Rlc3QnLCAuLi5ub3JtYWxpemVkVGFyZ2V0cywgLi4ucmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldF0sIGJhaWwpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5mdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgICAncnVuJyxcbiAgICAgICAgICAuLi4odGFyZ2V0cyAmJiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXSksXG4gICAgICAgICAgJy0tY29sb3InLFxuICAgICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgICBdKX0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgU0VSVkVSX0xPR19GSUxFIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVXaXRoQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cnVudGltZVdpdGhBcmdzfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnU3RhcnQgYXBwJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ2RldmVsb3BtZW50JztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERldihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGUyZToge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0UyZSB0ZXN0IG1vZGU6IGhlYWRsZXNzIChkZWZhdWx0KSB8IGhlYWRsZXNzLWRldiB8IGhlYWRlZCB8IGhlYWRlZC1kZXYgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCBkZWJ1ZyB8IGdlbmVyYXRlIHwgdHJhY2UnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFtcbiAgICAgICdoZWFkbGVzcycsXG4gICAgICAnaGVhZGxlc3MtZGV2JyxcbiAgICAgICdoZWFkZWQnLFxuICAgICAgJ2hlYWRlZC1kZXYnLFxuICAgICAgJ2RvY2tlcicsXG4gICAgICAnZG9ja2VyLWRlYnVnJyxcbiAgICAgICdkZWJ1ZycsXG4gICAgICAnZ2VuZXJhdGUnLFxuICAgICAgJ3RyYWNlJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdoZWFkbGVzcycsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGJhaWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0b3AgdGVzdHMgYWZ0ZXIgdGhlIGZpcnN0IGZhaWx1cmUnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ3VuaXQtdGltZW91dCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWVvdXQgZm9yIHVuaXQgdGVzdHMnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgdGFyZ2V0czoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGVzdCB0YXJnZXQgcGF0aHMnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUZXN0QXJndiA9IFBhcnRpYWw8XG4gIEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PlxuPjtcblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuJyxcbiAgYnVpbGRlcjogeyAuLi5idWlsZGVyLCAuLi5hcmd1bWVudHNCdWlsZGVyIH0sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3QoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9IChhcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBzaG91bGRSdW5BbGxUZXN0cyA9IHRlc3RUYXJnZXRzLmxlbmd0aCA9PT0gMDtcblxuICAvLyBEZXRlY3QgdGVzdCBtb2RlcyBmcm9tIHRhcmdldCBwYXRoc1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICBjb25zdCBzaG91bGRSdW5Vbml0ID0gc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHM7XG4gIGNvbnN0IHNob3VsZFJ1bkUyZSA9IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc0UyZVRhcmdldHM7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi5hcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiB1bmRlZmluZWQgfTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgYXJndiwgeyB0aW1lb3V0OiBhcmd2LnVuaXRUaW1lb3V0IH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAoYXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7fSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgYXdhaXQgdGVzdE9uRG9ja2VyKHByb2plY3QsIGUyZUFyZ3YsIHNjcmlwdHMsIFtcbiAgICAgICAgICAndGVzdCcsXG4gICAgICAgICAgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddKSxcbiAgICAgICAgICAnLS1kZWJ1ZycsXG4gICAgICAgIF0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10gfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKGFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsndGVzdCcsIC4uLihlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogWyd0ZXN0L2UyZS8nXSksICctLWhlYWRlZCddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgYXJndlxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddKSwgJy0taGVhZGVkJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsndGVzdCcsIC4uLihlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogWyd0ZXN0L2UyZS8nXSksICctLWRlYnVnJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsnY29kZWdlbicsIGBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICB9KSxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgdGVzdE9uQ2lCdWlsZGVyID0ge1xuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB0ZXN0T25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0LW9uLWNpJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3Qgb24gQ0kgd2l0aCBubyBvcHRpb25zLicsXG4gIGJ1aWxkZXI6IHRlc3RPbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdE9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdE9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmVudi5DSSB8fD0gJzEnO1xuICBwcm9jZXNzLmVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQXZvaWQgbGF1bmNoaW5nIGRldiBzZXJ2ZXJzIGZvciBidWlsZC1vbmx5IHBhY2thZ2VzOyBvbmx5IHN0YXJ0IGEgc2VydmVyIHdoZW4gRTJFIG5lZWRzIGl0LlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChhd2FpdCBzY3JpcHRzLnRlc3RTdGFydChwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAocHJvamVjdC5oYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0ID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICAgIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2goJ0JVTiB0c2MgLS1ub0VtaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnB5cmlnaHQpIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgICAgIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udHlwZXNjcmlwdCB8fCBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udHlwZXNjcmlwdClcbiAgICAgICkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKCdCVU4gdHNjIC0tbm9FbWl0Jyk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICBmb3JjZUNvbG9yOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoZmluYWxFeGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMsIHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgY29uY3VycmVudGx5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvY29uY3VycmVudGx5LmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0cmVlS2lsbENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3RyZWVLaWxsLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChjb25jdXJyZW50bHlDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHRyZWVLaWxsQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxubGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG5cbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwcm9jZXNzLnBpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvY2Vzcy5waWR9KSBkdXJpbmcgc2h1dGRvd246YCwgZXJyb3IpO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsieWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiIsImVudiIsImRlc2NyaXB0aW9uIiwidHlwZSIsImRlZmF1bHQiLCJ2ZXJib3NlIiwiYWxpYXMiLCJjYWNoZWRFbnZWYXJzIiwiTWFwIiwicmVhZEVudkZpbGUiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsInBhcnNlZCIsImNvbmZpZyIsInBhdGgiLCJyZXNvbHZlIiwicHJvY2Vzc0VudiIsInNldCIsImlzRXJybm9FeGNlcHRpb24iLCJlcnJvciIsIkVycm9yIiwidHJlZUtpbGwiLCJwaWQiLCJzaWduYWwiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJydW5Db21tYW5kIiwiU3RyaW5nIiwibWF4QnVmZmVyIiwidGltZW91dCIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwia2lsbFRyZWVPbldpbmRvd3MiLCJkZXNjZW5kYW50cyIsInJvb3RQaWQiLCJzdGRvdXQiLCJjaGlsZHJlbkJ5UGFyZW50IiwicHNPdXRwdXQiLCJsaW5lIiwic3BsaXQiLCJtYXRjaGVkIiwiZXhlYyIsImNoaWxkUGlkIiwicGFyZW50UGlkIiwiY2hpbGRyZW4iLCJwdXNoIiwiYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwIiwicXVldWUiLCJpbmRleCIsImxlbmd0aCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJ0YXJnZXRQaWRzIiwidG9SZXZlcnNlZCIsInRvQ2hpbGRyZW5GaXJzdFBpZHMiLCJ0YXJnZXRQaWQiLCJraWxsSWZOZWVkZWQiLCJraWxsIiwiY29tbWFuZCIsImFyZ3MiLCJvcHRpb25zIiwiZXhlY0ZpbGVTeW5jIiwiZW5jb2RpbmciLCJzdGRpbyIsInN0ZGVyciIsIkJ1ZmZlciIsImlzQnVmZmVyIiwidG9TdHJpbmciLCJleHRyYWN0U3RkZXJyIiwiQ29tbWFuZEV4ZWN1dGlvbkVycm9yIiwiY29kZSIsInN0YXR1cyIsInRvRXhpdENvZGUiLCJ0ZXN0IiwiY29uc3RydWN0b3IiLCJzdXBlciIsImpvaW4iLCJ0aGlzIiwibmFtZSIsImFzeW5jIiwic3Bhd25Bc3luYyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzZXRFbmNvZGluZyIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0Iiwid3JpdGUiLCJtZXJnZU91dEFuZEVycm9yIiwicHJpbnRpbmdTdGRlcnIiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJjb25zb2xlIiwiaW5mbyIsIndhcm4iLCJjbGVhbnVwU2lnbmFscyIsInNpZ25hbEhhbmRsZXJzIiwicmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzIiwicmVtb3ZlTGlzdGVuZXIiLCJoYW5kbGVyIiwiY2xlYXIiLCJraWxsT25FeGl0IiwiaGFuZGxlU2lnbmFsIiwibGlzdGVuZXJDb3VudCIsInJlbW92ZUFsbExpc3RlbmVycyIsInVuZGVmaW5lZCIsImlucHV0Iiwic3RkaW4iLCJlbmQiLCJ0IiwicyIsImkiLCJlIiwibiIsImVudHJpZXMiLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm1lc3NhZ2UiLCJzdGFjayIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiUmVnRXhwIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwibWFwIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc05hTiIsImlzRmluaXRlIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsbCIsInNsaWNlIiwiT2JqZWN0IiwiY2FjaGVEdXJhdGlvbiIsIlBPU0lUSVZFX0lORklOSVRZIiwiZ2V0Q2FjaGVLZXkiLCJraW5kIiwibm93IiwiY2FsbCIsImlzQ0kiLCJjaUVudiIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsIm1lbW9pemVPbmUiLCJhcmd2IiwicGF0aEJ5TmFtZSIsImRpclBhdGgiLCJsb2FkRW52IiwiX2RpclBhdGgiLCJpc0J1bkF2YWlsYWJsZSIsImZzIiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJidWlsZENvbW1hbmQiLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImRvY2tlcmZpbGUiLCJmaW5kRmlsZSIsImhhc0RvY2tlcmZpbGUiLCJoYXNTb3VyY2VDb2RlIiwiZG9ja2VySW1hZ2VOYW1lIiwicmVwbGFjZUFsbCIsImVudlZhcnMiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImN3ZCIsImVudlBhdGhzIiwiZW52UGF0aCIsImNhc2NhZGUiLCJjYXNjYWRlRW52IiwiY2FzY2FkZU5vZGVFbnYiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwiaW5jbHVkZVJvb3RFbnYiLCJyb290UGF0aCIsImZsYXRNYXAiLCJmaWx0ZXIiLCJyZWxhdGl2ZSIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcyIsImtleXMiLCJrZXkiLCJ2YWx1ZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJleHBhbmQiLCJyZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJjb3VudCIsInBhcnNlIiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZGVwZW5kZW5jaWVzIiwicHJpc21hIiwiZGV2RGVwZW5kZW5jaWVzIiwiaGFzVml0ZXN0Iiwidml0ZXN0IiwiaGFzQmlvbWUiLCJoYXNEZXBlbmRlbmN5IiwiaGFzRXNsaW50IiwicHJlZmVycmVkTGludGVyIiwiaGFzUGxheXdyaWdodENvbmZpZyIsInNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0IiwiQ0kiLCJjb25maWdQYXRoIiwiZG9ja2VyUGFja2FnZUpzb24iLCJkaXJuYW1lIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJjdXJyZW50UGF0aCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbGVOYW1lIiwiZmluZCIsInBhY2thZ2VOYW1lIiwiaGFzRGVwZW5kZW5jeUluUGFja2FnZUpzb24iLCJvcHRpb25hbERlcGVuZGVuY2llcyIsInBlZXJEZXBlbmRlbmNpZXMiLCJyb290UGFja2FnZUpzb24iLCJmaW5kU2VsZlByb2plY3QiLCJmaW5kRGVzY2VuZGFudFByb2plY3RzIiwicm9vdEFuZFNlbGZQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwiZW5kc1dpdGgiLCJyb290Iiwic2VsZiIsImZpbmRSb290QW5kU2VsZlByb2plY3RzIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwicHJvamVjdHMiLCJ3b3Jrc3BhY2UiLCJnbG9iUGF0dGVybiIsInBhY2thZ2VEaXJzIiwid29ya3NwYWNlUGF0aCIsIndzIiwiZ2xvYmJ5IiwiZG90Iiwib25seURpcmVjdG9yaWVzIiwic3ViUGFja2FnZURpclBhdGgiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwibnBtX2V4ZWNwYXRoIiwicnVudGltZVdpdGhBcmdzIiwicGFja2FnZU1hbmFnZXIiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwicHJvamVjdCIsImNoYWxrIiwicmVkIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJ0cmltIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJzcGF3blN5bmMiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwic29tZSIsInBhdHRlcm4iLCJpbmNsdWRlU3VmZml4Iiwic3VmZml4IiwiZXhjbHVkZVBhdHRlcm5zIiwiY29weSIsImRpZ2VzdCIsInVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdCIsImNhY2hlZENvbnRlbnRIYXNoIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRGaWxlIiwiY2FuU2tpcEJ1aWxkIiwiZ3JlZW4iLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJub3JtYWxpemVkU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0IiwicHJpbnRTdGFydCIsInByaW50YWJsZSIsInJ1bm5hYmxlIiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsImNvbmZpZ3VyZUVudiIsIm9uU2lnbmFsIiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsIm91dCIsIm5ld1NjcmlwdCIsImJsaXR6IiwicHJpbnRhYmxlU2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsInJ1bm5hYmxlU2NyaXB0IiwiY2FzY2FkZU9wdGlvbiIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJleGl0IiwibmV3RW52IiwiY2kiLCJmb3JjZUNvbG9yIiwiRk9SQ0VfQ09MT1IiLCJzaGFyZWRPcHRpb25zQnVpbGRlciIsImJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyIsIm9wdGlvbk5hbWUiLCJnZXRPcHRpb25WYWx1ZSIsIml0ZW0iLCJjYW1lbENhc2VPcHRpb25OYW1lIiwiY2hhcmFjdGVyIiwidG9VcHBlckNhc2UiLCJjb25jdXJyZW50bHlDb21tYW5kIiwiYnVpbGRlciIsInN1Y2Nlc3MiLCJjaG9pY2VzIiwiY29tbWFuZHMiLCJCb29sZWFuIiwiZGV0YWNoZWQiLCJpbnRlcnJ1cHRlZFNpZ25hbCIsImZpcnN0UmVzdWx0Iiwic3RvcFJlc3VsdCIsInN0b3BwaW5nIiwicmVzdWx0cyIsIndhaXRGb3JFeGl0UHJvbWlzZXMiLCJjaGlsZCIsInNldHRsZWQiLCJzZXR0bGUiLCJraWxsT3RoZXJzIiwia2lsbE90aGVyc09uRmFpbCIsInNob3VsZFN0b3BPdGhlcnMiLCJ0ZXJtaW5hdGVDaGlsZHJlbiIsIm9uY2UiLCJnZXRFeGl0Q29kZSIsInN0b3BBbGwiLCJzdG9wT25TaWdpbnQiLCJzdG9wT25TaWd0ZXJtIiwic3RvcE9uU2lncXVpdCIsImFsbCIsInJlc3VsdCIsInJ1bkNvbmN1cnJlbnRseSIsImNvbnN0YW50cyIsInNpZ25hbHMiLCJraWxsUHJvY2Vzc0dyb3VwIiwia2lsbFBvcnRJZk5vbkNpQ29tbWFuZCIsInBvcnRFbnYiLCJQT1JUIiwicG9ydCIsImtpbGxQb3J0UHJvY2VzcyIsImtpbGxQb3J0SWZOb25DaSIsImJ1aWxkU2hlbGxDb21tYW5kIiwiYXJnIiwic2hlbGxFc2NhcGVBcmd1bWVudCIsImJpb21lRXh0ZW5zaW9ucyIsImVzbGludEV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwibGludENvbW1hbmQiLCJmaXgiLCJmb3JtYXQiLCJmaWxlcyIsImxpbnRGaWxlUGF0aHNCeVByb2plY3QiLCJwcmV0dGllckZpbGVQYXRocyIsInBhY2thZ2VKc29uRmlsZVBhdGhzIiwicHJldHRpZXJBcmdzIiwic29ydFBhY2thZ2VKc29uQXJncyIsIm1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMiLCJmaWxlIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImZpbmRPd25pbmdQcm9qZWN0Iiwic3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uIiwibGludEZpbGVQYXRocyIsIm5lZWRzUHJldHRpZXIiLCJpc1BvdGVudGlhbExpbnRUYXJnZXQiLCJzZWxmRGlyUGF0aCIsInByb2plY3RQYXR0ZXJuIiwiYnVpbGRQcmV0dGllckFyZ3MiLCJsaW50UHJvbWlzZXMiLCJsaW50UnVuT3B0aW9ucyIsImJ1aWxkTGludENvbW1hbmQiLCJsaW50RXhpdENvZGVzIiwiYmlvbWVBcmdzIiwib3duaW5nUHJvamVjdCIsInN0YXJ0c1dpdGgiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJkZXZEZXBzIiwibmFtZVdvcmRzVG9CZVJlbW92ZWQiLCJyZW1vdmVkRGVwcyIsIndvcmQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsIkZJTEVfU0NIRU1BIiwiUE9TU0lCTEVfUFJJU01BX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsImdldERhdGFiYXNlRGlyUGF0aCIsImdldFByaXNtYUJhc2VEaXIiLCJwcmlzbWFTY3JpcHRzIiwiY2xlYW5VcExpdGVzdHJlYW0iLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsImRlcGxveUZvcmNlIiwicmVtb3ZlRGJDb21tYW5kIiwibGlzdEJhY2t1cHMiLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiZGJVcmwiLCJEQVRBQkFTRV9VUkwiLCJyYXdEYlBhdGgiLCJiYXNlRGlyIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJwcmlzbWFDb21tYW5kIiwieWFyZ3MiLCJjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZCIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJsaXN0QmFja3Vwc0NvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVEZXZDb21tYW5kIiwicmVzdG9yZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmRQcmlzbWFQcm9qZWN0cyIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWciLCJ1bmtub3duT3B0aW9ucyIsImV4dHJhY3RVbmtub3duT3B0aW9ucyIsIm91dHB1dCIsInJlc3RvcmVkIiwiZnVsbENvbW1hbmQiLCJ0cmltRW5kIiwicmVxdWlyZWRFbnZWYXJzIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSIsIm1pc3NpbmdFbnZWYXJzIiwicmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCIsImxpdGVzdHJlYW1Db25maWciLCJ3cml0ZUZpbGVTeW5jIiwicmVhc29uIiwiZmlsdGVyZWQiLCJrbm93bk9wdGlvbnMiLCJzaGFyZWRPcHRpb25LZXlzIiwic2hhcmVkT3B0aW9uQWxpYXNlcyIsIm9wdGlvbiIsImFsbEtub3duT3B0aW9ucyIsImtlYmFiQ2FzZUtleSIsIm1hdGNoIiwidG9Mb3dlckNhc2UiLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwieWVsbG93Iiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwib3MiLCJwYWNrYWdlcyIsImlzRmlsZSIsInZlcnNpb24iLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwidG9EZXZOdWxsIiwic2lsZW50Iiwia2lsbGVkIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJhdmFpbGFibGUiLCJob3N0IiwicHJvYmVQb3J0IiwiaXNQb3J0QXZhaWxhYmxlIiwia2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzIiwia2lsbEZ1bmMiLCJmaWx0ZXJBcmdzIiwiY29udGFpbmVySWRzIiwiaWQiLCJsaXN0RG9ja2VyQ29udGFpbmVySWRzIiwicmVtb3ZlRG9ja2VyQ29udGFpbmVycyIsInN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQiLCJjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyIsInJhd1BvcnQiLCJzZXJ2ZXIiLCJjcmVhdGVTZXJ2ZXIiLCJlcnIiLCJjbG9zZSIsImxpc3RlbiIsImRvY2tlclNjcmlwdHMiLCJidWlsZEltYWdlIiwic3RvcEFuZFN0YXJ0IiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3Bhd25TeW5jT25FeGl0IiwiQmFzZVNjcmlwdHMiLCJzaG91bGRXYWl0QW5kT3BlbkFwcCIsImJ1aWxkRG9ja2VyIiwic3RhcnREZXYiLCJzdGFydERldlByb3RlY3RlZCIsIndhaXRBbmRPcGVuQXBwIiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkIiwic3RhcnRUZXN0Iiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJlY29zeXN0ZW1Db25maWdQYXRoIiwiZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJjbWQiLCJ0ZXN0RTJFRGV2IiwidGVzdEUyRVByb3RlY3RlZCIsInRlc3RFMkVQcm9kdWN0aW9uIiwidGVzdEUyRURvY2tlciIsInRlc3RTdGFydCIsIndhaXRBcHAiLCJzdGFydENvbW1hbmQiLCJwbGF5d3JpZ2h0QXJncyIsInBsYXl3cmlnaHRDb21tYW5kIiwidGFyZ2V0cyIsImJhaWwiLCJiYXNlIiwibm9ybWFsaXplZFRhcmdldHMiLCJhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbiIsInJlc3QiLCJleHBsaWNpdFRhcmdldEluZGV4ZXMiLCJwZW5kaW5nVmFsdWVNb2RlIiwidGFyZ2V0SW5kZXhlcyIsIm9mZnNldCIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTIiwiUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMiLCJzaG9ydE9wdGlvbiIsIlBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTIiwiZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMiLCJyZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0IiwiYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZCIsInRlc3RVbml0IiwiY29tbWFuZEFyZ3MiLCJwbGF5d3JpZ2h0SW5kZXgiLCJpbmRleE9mIiwiaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQiLCJibGl0elNjcmlwdHMiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwibmV4dFNjcmlwdHMiLCJwbGFpbkFwcFNjcmlwdHMiLCJfMSIsIl8yIiwicmVtaXhTY3JpcHRzIiwidml0ZVNjcmlwdHMiLCJodHRwU2VydmVyUGFja2FnZXMiLCJtb2RlIiwiZG9ja2VyT3B0aW9ucyIsIm5vcm1hbGl6ZUFyZ3MiLCJuZXh0Iiwidml0ZSIsInRlc3RDb21tYW5kIiwiZTJlIiwidGVzdFRhcmdldHMiLCJzaG91bGRSdW5BbGxUZXN0cyIsImhhc0UyZVRhcmdldHMiLCJ0YXJnZXQiLCJoYXNVbml0VGFyZ2V0cyIsInNob3VsZFJ1blVuaXQiLCJzaG91bGRSdW5FMmUiLCJ1bml0VGFyZ2V0cyIsInVuaXRBcmd2IiwidW5pdFRpbWVvdXQiLCJlMmVUYXJnZXRzIiwiZTJlQXJndiIsInRlc3RPbkRvY2tlciIsIldCX0RPQ0tFUiIsInRlc3RPbkNpQ29tbWFuZCIsInRlc3RPbkNpIiwidHJlZUtpbGxDb21tYW5kIiwicG9zaXRpb25hbCIsImRlbWFuZE9wdGlvbiIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsInR5cGVzY3JpcHQiLCJweXJpZ2h0IiwibmV4dERpclBhdGgiLCJybVN5bmMiLCJmb3JjZSIsImV4aXRDb2RlcyIsImZpbmFsRXhpdENvZGUiLCJ0Y0NvbW1hbmQiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInVybCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiLCJzaHV0dGluZ0Rvd24iXSwibWFwcGluZ3MiOiI0aEJBT08sTUFBTUEsRUFBNEIsQ0FDdkNDLElBQUssQ0FDSEMsWUFBYSwyQkFDYkMsS0FBTSxTQUVSLGNBQWUsQ0FDYkQsWUFDRSx3TEFDRkMsS0FBTSxVQUVSLG1CQUFvQixDQUNsQkQsWUFBYSwwRkFDYkMsS0FBTSxXQUVSLG1CQUFvQixDQUNsQkQsWUFBYSxpRUFDYkMsS0FBTSxVQUNOQyxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCRixZQUFhLHFHQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxZQUFhLENBQ1hGLFlBQWEscUZBQ2JDLEtBQU0sU0FDTkMsUUFBUyxnQkFFWEMsUUFBUyxDQUNQSCxZQUFhLHNDQUNiQyxLQUFNLFVBQ05HLE1BQU8sTUE0RlgsTUFBTUMs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QyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxFQUFFQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHQyxHQUFHLElBQUk3RCxFQUFFLEVBQUVBLEVBQUUsR0FBR0EsR0FBRyxFQUFFaEIsRUFBRUosRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlNLEVBQUVOLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJeUIsRUFBRXpCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJcUIsRUFBRXJCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJc0IsRUFBRXRCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJdUIsRUFBRXZCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNEIsRUFBRTVCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNkIsRUFBRTdCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJOEIsRUFBRTlCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEs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