@willbooster/wb 13.19.3 → 13.19.4

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 +4 -4
  2. package/package.json +1 -1
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 o,{execFileSync as s,spawn as i,spawnSync as a}from"node:child_process";import{createHash as c}from"node:crypto";import d from"chalk";import{globby as l}from"globby";import{config as u}from"dotenv";import{expand as p}from"dotenv-expand";import f,{constants as h}from"node:os";import{PromisePool as m}from"minimal-promise-pool";import g from"kill-port";import y from"node:fs/promises";import w from"node:assert";import{setTimeout as b}from"node:timers/promises";import{createServer as v}from"node:net";import{fileURLToPath as k}from"node:url";import{distance as S}from"fastest-levenshtein";const E={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},"quiet-env":{description:"Suppress .env file loading information.",type:"boolean"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};function A(n,r){let s=(n.env??[]).map(e=>t.resolve(r,e.toString()));const i=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 i){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=>i?[`${e}.${i}.local`,`${e}.local`,`${e}.${i}`,e]:[`${e}.local`,e])}s=s.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e));const a=x(n);n.verbose&&!a&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",s.join(", ")));const c=[],d={};for(const e of s){const o=[];for(const[n,s]of Object.entries(j(t.join(r,e))))n in d||n in process.env||(d[n]=s,o.push(n));c.push([e,o]),n.verbose&&!a&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}const[l,u]=function(n,r,s){if(!function(n){for(let r=t.resolve(n);;r=t.dirname(r)){if(e.existsSync(t.join(r,"mise.toml"))||e.existsSync(t.join(r,".mise.toml")))return!0;if(t.dirname(r)===r)return!1}}(n))return[{},[]];const i=["env","--json","--cd",n];r&&i.push("--env",r);const a=o.spawnSync("mise",i,{encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(a.error||0!==a.status||!a.stdout?.trim())return[{},[]];let c;try{c=JSON.parse(a.stdout)}catch{return[{},[]]}if(!c||"object"!=typeof c||Array.isArray(c))return[{},[]];const d={},l=[];for(const[e,t]of Object.entries(c))"string"==typeof t&&(e in s||process.env[e]===t||(d[e]=t,l.push(e)));return[d,l]}(r,i,d);if(Object.assign(d,l),u.length>0&&(c.push([P(i),u]),n.verbose&&!a&&console.info(`Read ${u.length} environment variables from ${P(i)}`)),n.verbose||a||console.info(`Read env files: ${c.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(j(t.join(r,n.checkEnv))).filter(e=>!(e in d)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:d,processEnv:{}}).parsed??d,c]}function P(e){return e?`mise env --env ${e}`:"mise env"}function x(e){const t=e;return!0===t.quietEnv||!1!==t.quietEnv&&!0===t.silent}const $=new Map;function j(e){const n=$.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{},quiet:!0}).parsed??{};return $.set(e,r),r}function R(e){return e instanceof Error&&"code"in e}function O(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{N("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(I(e))return;throw e}}(e);const n=function(e){const{stdout:t}=N("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)D(e,t)}function D(e,t){try{process.kill(e,t)}catch(e){if(I(e))return;throw e}}function N(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 T(e,t,r,function(e){if(R(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 I(e){return!(!R(e)||"ESRCH"!==e.code)||e instanceof T&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class T extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function _(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="";const d=F(process.stdout,n?.omitBlankLinesWhilePrinting),l=F(process.stderr,n?.omitBlankLinesWhilePrinting);s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&d.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&l.write(e)});let u=!1;const p=()=>{if(!u&&s.pid){u=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{O(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},f="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],h=new Map,m=()=>{process.removeListener("beforeExit",p);for(const[e,t]of h)process.removeListener(e,t);h.clear()};if(n?.killOnExit){process.on("beforeExit",p);for(const e of f){const t=()=>{p(),m(),0===process.listenerCount(e)&&process.kill(process.pid,e)};h.set(e,t),process.on(e,t)}}s.on("error",e=>{m(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{m(),d.flush(),l.flush(),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)}})}const C=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g");function F(e,t=!1){if(!t)return{write:t=>e.write(t),flush:()=>{}};let n="";return{write:t=>{n+=t;const r=n.split(/\r?\n/);n=r.pop()??"";for(const t of r)B(t)||e.write(`${t}\n`)},flush:()=>{B(n)||e.write(n),n=""}}}function B(e){return 0===e.replaceAll(C,"").trim().length}function z(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 M(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 L(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 d from"chalk";import{globby as l}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 y from"node:fs/promises";import w from"node:assert";import{setTimeout as b}from"node:timers/promises";import{createServer as v}from"node:net";import{fileURLToPath as k}from"node:url";import{distance as S}from"fastest-levenshtein";const E={env:{description:".env files to be loaded.",type:"array"},"cascade-env":{description:"Environment to load cascading .env files (e.g., `.env`, `.env.<environment>`, `.env.local` and `.env.<environment>.local`). Preferred over `cascade-node-env` and `auto-cascade-env`.",type:"string"},"cascade-node-env":{description:'Same with --cascade-env=<NODE_ENV || "development">. Preferred over `auto-cascade-env`.',type:"boolean"},"auto-cascade-env":{description:'Same with --cascade-env=<WB_ENV || NODE_ENV || "development">.',type:"boolean",default:!0},"include-root-env":{description:"Include .env files in root directory if the project is in a monorepo and --env option is not used.",type:"boolean",default:!0},"check-env":{description:"Check whether the keys of the loaded .env files are same with the given .env file.",type:"string",default:".env.example"},"quiet-env":{description:"Suppress .env file loading information.",type:"boolean"},verbose:{description:"Whether to show verbose information",type:"boolean",alias:"v"}};function P(n,r){let s=(n.env??[]).map(e=>t.resolve(r,e.toString()));const i=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 i){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=>i?[`${e}.${i}.local`,`${e}.local`,`${e}.${i}`,e]:[`${e}.local`,e])}s=s.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e));const a=x(n);n.verbose&&!a&&(console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`),console.info("Reading env files:",s.join(", ")));const c=[],d={};for(const e of s){const o=[];for(const[n,s]of Object.entries(j(t.join(r,e))))n in d||n in process.env||(d[n]=s,o.push(n));c.push([e,o]),n.verbose&&!a&&o.length>0&&console.info(`Read ${o.length} environment variables from ${e}`)}const[l,u]=function(n,r,s){if(!function(n){for(let r=t.resolve(n);;r=t.dirname(r)){if(e.existsSync(t.join(r,"mise.toml"))||e.existsSync(t.join(r,".mise.toml")))return!0;if(t.dirname(r)===r)return!1}}(n))return[{},[]];const i=["env","--json","--cd",n];r&&i.push("--env",r);const a=o.spawnSync("mise",i,{encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(a.error||0!==a.status||!a.stdout?.trim())return[{},[]];let c;try{c=JSON.parse(a.stdout)}catch{return[{},[]]}if(!c||"object"!=typeof c||Array.isArray(c))return[{},[]];const d={},l=[];for(const[e,t]of Object.entries(c))"string"==typeof t&&(e in s||process.env[e]===t||(d[e]=t,l.push(e)));return[d,l]}(r,i,d);if(Object.assign(d,l),u.length>0&&(c.push([A(i),u]),n.verbose&&!a&&console.info(`Read ${u.length} environment variables from ${A(i)}`)),n.verbose||a||console.info(`Read env files: ${c.map(([e,t])=>t.length>0?`${e} (${t.join(", ")})`:e).join(", ")||"nothing"}`),n.checkEnv){const e=Object.keys(j(t.join(r,n.checkEnv))).filter(e=>!(e in d)&&!(e in process.env));if(e.length>0)throw new Error(`Missing environment variables in [${s.join(", ")}]: [${e.join(", ")}]`)}return[p({parsed:d,processEnv:{}}).parsed??d,c]}function A(e){return e?`mise env --env ${e}`:"mise env"}function x(e){const t=e;return!0===t.quietEnv||!1!==t.quietEnv&&!0===t.silent}const $=new Map;function j(e){const n=$.get(e);if(n)return n;const r=u({path:t.resolve(e),processEnv:{},quiet:!0}).parsed??{};return $.set(e,r),r}function R(e){return e instanceof Error&&"code"in e}function O(e,t="SIGTERM"){if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid pid: ${e}`);if("win32"===process.platform)return void function(e){try{N("taskkill",["/PID",String(e),"/T","/F"],{maxBuffer:1048576,timeout:2e3})}catch(e){if(I(e))return;throw e}}(e);const n=function(e){const{stdout:t}=N("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)D(e,t)}function D(e,t){try{process.kill(e,t)}catch(e){if(I(e))return;throw e}}function N(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 T(e,t,r,function(e){if(R(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 I(e){return!(!R(e)||"ESRCH"!==e.code)||e instanceof T&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}class T extends Error{constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(" ")}`),this.name="CommandExecutionError",this.stderr=n,this.code=r}}async function _(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="";const d=F(process.stdout,n?.omitBlankLinesWhilePrinting),l=F(process.stderr,n?.omitBlankLinesWhilePrinting);s.stdout?.on("data",e=>{a+=e,n?.printingStdout&&d.write(e)}),s.stderr?.on("data",e=>{n?.mergeOutAndError?a+=e:c+=e,n?.printingStderr&&l.write(e)});let u=!1;const p=()=>{if(!u&&s.pid){u=!0,n?.verbose&&console.info(`treeKill(${s.pid})`);try{O(s.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${s.pid})`,e)}}},f="win32"===process.platform?["SIGINT","SIGTERM"]:["SIGINT","SIGTERM","SIGQUIT"],h=new Map,m=()=>{process.removeListener("beforeExit",p);for(const[e,t]of h)process.removeListener(e,t);h.clear()};if(n?.killOnExit){process.on("beforeExit",p);for(const e of f){const t=()=>{p(),m(),0===process.listenerCount(e)&&process.kill(process.pid,e)};h.set(e,t),process.on(e,t)}}s.on("error",e=>{m(),s.removeAllListeners("close"),o(e)}),s.on("close",(e,t)=>{m(),d.flush(),l.flush(),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)}})}const C=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g");function F(e,t=!1){if(!t)return{write:t=>e.write(t),flush:()=>{}};let n="";return{write:t=>{n+=t;const r=n.split(/\r?\n/);n=r.pop()??"";for(const t of r)B(t)||e.write(`${t}\n`)},flush:()=>{B(n)||e.write(n),n=""}}}function B(e){return 0===e.replaceAll(C,"").trim().length}function z(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 M(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 L(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,7 +6,7 @@ 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 W=[..."0123456789abcdef"],U=[6,1536,393216,100663296],J=[0,8,16,24],Y=[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 V=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class G{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<<J[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<J[3&i++],t[i>>2]|=(128|63&a)<<J[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<J[3&i++],t[i>>2]|=(128|a>>6&63)<<J[3&i++],t[i>>2]|=(128|63&a)<<J[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<J[3&i++],t[i>>2]|=(128|a>>12&63)<<J[3&i++],t[i>>2]|=(128|a>>6&63)<<J[3&i++],t[i>>2]|=(128|63&a)<<J[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];q(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];q(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+=W[o>>4&15]+W[15&o]+W[o>>12&15]+W[o>>8&15]+W[o>>20&15]+W[o>>16&15]+W[o>>28&15]+W[o>>24&15];i%e===0&&(t=V(t),q(t),s=0)}return r&&(o=t[s],a+=W[o>>4&15]+W[15&o],r>1&&(a+=W[o>>12&15]+W[o>>8&15]),r>2&&(a+=W[o>>20&15]+W[o>>16&15])),a}}const q=function(e){let t,n,r,o,s,i,a,c,d,l,u,p,f,h,m,g,y,w,b,v,k,S,E,A,P,x,$,j,R,O,D,N,I,T,_,C,F,B,z,M,L,W,U,J,V,G,q,K,H,Q,Z,X,ee,te,ne,re,oe,se,ie,ae,ce,de,le;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],d=e[5]^e[15]^e[25]^e[35]^e[45],l=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|d>>>31),n=s^(d<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(l<<1|u>>>31),n=a^(u<<1|l>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=d^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],G=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,j=e[20]<<3|e[21]>>>29,R=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,W=e[40]<<18|e[41]>>>14,U=e[41]<<18|e[40]>>>14,T=e[2]<<1|e[3]>>>31,_=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,y=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,C=e[14]<<6|e[15]>>>26,F=e[15]<<6|e[14]>>>26,w=e[25]<<11|e[24]>>>21,b=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,Z=e[35]<<15|e[34]>>>17,N=e[45]<<29|e[44]>>>3,I=e[44]<<29|e[45]>>>3,A=e[6]<<28|e[7]>>>4,P=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,B=e[26]<<25|e[27]>>>7,z=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,X=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,J=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,$=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,M=e[38]<<8|e[39]>>>24,L=e[39]<<8|e[38]>>>24,S=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=h^~g&w,e[1]=m^~y&b,e[10]=A^~x&j,e[11]=P^~$&R,e[20]=T^~C&B,e[21]=_^~F&z,e[30]=J^~G&K,e[31]=V^~q&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~w&v,e[3]=y^~b&k,e[12]=x^~j&O,e[13]=$^~R&D,e[22]=C^~B&M,e[23]=F^~z&L,e[32]=G^~K&Q,e[33]=q^~H&Z,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=w^~v&S,e[5]=b^~k&E,e[14]=j^~O&N,e[15]=R^~D&I,e[24]=B^~M&W,e[25]=z^~L&U,e[34]=K^~Q&X,e[35]=H^~Z&ee,e[44]=se^~ae&de,e[45]=ie^~ce&le,e[6]=v^~S&h,e[7]=k^~E&m,e[16]=O^~N&A,e[17]=D^~I&P,e[26]=M^~W&T,e[27]=L^~U&_,e[36]=Q^~X&J,e[37]=Z^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=S^~h&g,e[9]=E^~m&y,e[18]=N^~A&x,e[19]=I^~P&$,e[28]=W^~T&C,e[29]=U^~_&F,e[38]=X^~J&G,e[39]=ee^~V&q,e[48]=de^~te&re,e[49]=le^~ne&oe,e[0]^=Y[r],e[1]^=Y[r+1]},K=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(Q.decode(e))],create:([e])=>H.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]))}(),H=new TextEncoder,Q=new TextDecoder("utf-8");function Z(e,t=K){return JSON.stringify(te(e,t))}function X(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 ee=[];function te(e,t=K){const n=X(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=X(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(ee.length<e){const t=ee.length;ee.length=e,ee.fill(-2,t,e)}return ee.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=s,r[i]=d,o.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function ne(e,t){return function(e){return new G(512,U,512).update(e).hex()}(Z([e,t]))}const re=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=ne}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=d),o}}}({getCacheKey:ne});function oe(e){return!!e&&"0"!==e&&"false"!==e}let se;class ie{static{[se]=function(e,t,n,r,o){var s,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 y(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 w(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 b(e,t,n,r,o,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]),b=t[3],v=!c,k=1===o,S=3===o,E=4===o,A=2===o;function P(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),x[t].call(o,s)}}if(!v){var x={},$=[],j=S?"get":E||k?"set":"value";if(l?(u||k?x={get:M(function(){return b(this)},r,"get"),set:function(e){t[4](this,e)}}:x[j]=b,u||M(x[j],r,A?"":j)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=m[+d][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+x[j].name+") is not supported yet");m[+d][r]=o<3?1:o}}for(var R=e,O=g.length-1;O>=0;O-=n?2:1){var D=w(g[O],"A decorator","be",!0),N=n?g[O-1]:void 0,I={},T={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");w(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=D.call(N,R,T),I.v=1,w(i,"class decorators","return")&&(R=i);else if(T.static=d,T.private=l,i=T.access={has:l?p.bind():function(e){return r in e}},E||(i.get=l?A?function(e){return h(e),x.value}:P("get",0,h):function(e){return e[r]}),A||S||(i.set=l?P("set",0,h):function(e,t){e[r]=t}),R=D.call(N,k?{get:x.get,set:x.set}:x[j],T),I.v=1,k){if("object"==typeof R&&R)(i=w(R.get,"accessor.get"))&&(x.get=i),(i=w(R.set,"accessor.set"))&&(x.set=i),(i=w(R.init,"accessor.init"))&&$.unshift(i);else if(void 0!==R)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else w(R,(u?"field":"method")+" decorators","return")&&(u?$.unshift(R):x[j]=R)}return o<2&&c.push(y($,d,1),y(a,d,0)),u||v||(l?k?c.splice(-1,0,P("get",d),P("set",d)):c.push(A?x[j]:w.call.bind(x[j])):f(e,r,x)),R}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),d=[],l=function(e){e&&d.push(y(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],f=!!i[3],h=16&l;b(t?e:e.prototype,i,h,f?"#"+p:L(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return z(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=b(e,[t],r,e.name,5,n)),y(n,1)]}}}(this,[],[[re,3,"isBunAvailable"],[re,3,"usesBunPackageManager"],[re,3,"buildCommand"],[re,3,"rootDirPath"],[re,3,"dockerfile"],[re,3,"hasDockerfile"],[re,3,"hasSourceCode"],[re,3,"name"],[re,3,"dockerImageName"],[re,3,"env"],[re,3,"packageJson"],[re,3,"packageJsonPath"],[re,3,"hasPrisma"],[re,3,"hasDrizzle"],[re,3,"databaseOrm"],[re,3,"hasVitest"],[re,3,"hasOxlint"],[re,3,"hasOxfmt"],[re,3,"hasPrettier"],[re,3,"hasPoetryLock"],[re,3,"hasPubspecYaml"],[re,3,"preferredLinter"],[re,3,"hasPlaywrightConfig"],[re,3,"skipLaunchingServerForPlaywright"],[re,3,"dockerPackageJson"],[re,3,"binExists"],[re,3,"rootPackageJson"]]).e}argv=void se(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return!!this.hasBunToolVersion()||this.usesBunPackageManager}get usesBunPackageManager(){return!!this.hasBunLockfile()||this.hasBunPackageManager()}hasBunToolVersion(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}hasBunLockfile(){return["bun.lock","bun.lockb"].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){const e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return"string"==typeof e&&e.startsWith("bun@")}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[e,t]=A(this.argv,this.dirPath);if(!x(this.argv))for(const[e,n]of t)console.info(`Loaded ${n} environment variables from ${e}`);return{...process.env,...e}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!this.getOwnDependencyVersion("prisma")}get hasDrizzle(){return!!this.getOwnDependencyVersion("drizzle-orm")}get databaseOrm(){return this.hasPrisma?"prisma":this.hasDrizzle?"drizzle":void 0}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPrettier(){return this.hasDependency("prettier")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){if(this.hasOxlint)return"oxlint"}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(oe(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){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}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 ae(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new ie(o,n,r)}function ce(e,t){return e.env.WB_ENV===t||e.env.MISE_ENV===t}async function de(e,t=!0,n){const r=le(e,t,n);if(r)return{...r,descendants:r.root===r.self?await ue(e,r.root,t):[r.self]}}function le(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new ie(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 ie(s,n,r))}return{root:i,self:s}}async function ue(n,r,o){const s=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return s;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new ie(r,n,o));return s}const pe=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),fe=pe?"bun --bun run":"node",he=pe?"bun":"yarn",me=pe?"bun --bun run":"yarn",ge={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=ae(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?pe?"bun run build":"yarn build":void 0);if(!i)return console.info(d.green("Skip to build because no build command is defined.")),!1;if(n={...n,command:i},!e.existsSync(t.join(s.rootDirPath,".git")))return ye(s,n),!0;const[a,l,u]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!we.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(be.some(t=>e.includes(t))||ve.some(t=>e.endsWith(t)))&&!ke.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(a)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!ye(s,n))return;n.dryRun||await e.promises.writeFile(l,u,"utf8");return!0}(n)}};function ye(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const we=new Set(["CI","PWDEBUG","TMPDIR"]);const be=["src/","public/"],ve=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],ke=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const Se=new m,Ee={exitIfFailed:!0};async function Ae(e,t,n,r=Ee){const o=xe(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||$e(o.printable,t,n.silent?"Command":"Start"),n.verbose&&$e(o.runnable,t,"Start (raw)",!0),n.dryRun)return je(o.printable,0,r,{silentSuccess:n.silent}),0;const s=Boolean(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly));let i=!1;const a=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write("."),i=!0},r.silentProgressIntervalMs):void 0,c=await _(o.runnable,void 0,{cwd:t.dirPath,env:Re(t.env,{...r,preserveColor:r.preserveColor??(!!n.silent||void 0)}),shell:!0,stdio:n.silent?"pipe":"inherit",timeout:r.timeout,mergeOutAndError:s,killOnExit:!0,printingStdout:n.silent&&!s,printingStderr:n.silent&&!s,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{a&&clearInterval(a)}),l=c.status??1;if(i&&process.stdout.write("\n"),s&&(!r.printSilentOutputOnFailureOnly||0!==l)){const e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write("\n"))}return n.silent&&0===l&&r.silentSuccessMessage&&console.info(d.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),je(o.printable,l,r,{silentSuccess:n.silent}),l}function Pe(e,t,n,r=Ee){return Se.runAndWaitForReturnValue(async()=>{const o=xe(e,t);if($e(o.printable,t,"Start (parallel)",!0),n.dryRun)return $e(o.printable,t,"Started (log)"),n.verbose&&$e(o.runnable,t,"Started (raw)",!0),je(o.printable,0,r),0;const s=await _(o.runnable,void 0,{cwd:t.dirPath,env:Re(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(s.signal),$e(o.printable,t,"Started (log)"),n.verbose&&$e(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&!r.printRawOutput&&(process.stdout.write(i),process.stdout.write("\n")),je(o.printable,s.status,r),s.status??1})}function xe(e,t){const n=t.usesBunPackageManager?"bun --bun run":"yarn";let r=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,t.packageJson.dependencies?.blitz?"PRISMA generate":"PRISMA generate --no-hints").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN run ",t.usesBunPackageManager?`${n} `:"YARN run ").replaceAll("BUN ",t.usesBunPackageManager?`${n} `:"YARN ").replaceAll("YARN run ",t.usesBunPackageManager?`${n} `:"yarn run ");t.usesBunPackageManager&&(r=r.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")),r=r.trim();const o=Oe(r.replaceAll("YARN ",`${n} `)),s=Oe(r.replaceAll("YARN playwright ",`${n} playwright `).replaceAll("YARN ",!t.usesBunPackageManager&&t.binExists?"":`${n} `));return{printable:`${n} dotenv${t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:""} -- ${o}`,runnable:s}}function $e(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function je(e,t,n,r={}){if(0===t){if(r.silentSuccess)return;console.info(d.green(d.bold("Finished:"),e))}else console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1)}function Re(e,t){const n={...e};return t.ci&&(n.CI="1"),function(e,t){void 0!==e.NO_COLOR||!1===t?delete e.FORCE_COLOR:t&&process.stdout.isTTY&&(e.FORCE_COLOR||="3")}(n,t.preserveColor),n}function Oe(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const De={...E,"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 Ne(e){const t=[];for(const n of Object.keys(E)){const r=Ie(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!0===e.silent&&void 0===Ie(e,"quiet-env")&&t.push("--quiet-env"),t}function Ie(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Te={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...De,"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(d.red("This command is not supported on Windows.")),process.exit(1));const t=ae(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(d.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>o.spawn(xe(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:Re(e.project.env,{ci:e.ci}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=[],c=Array.from({length:t.length}),d=t.map((n,o)=>new Promise(d=>{let l=!1;const u=n=>{l||(l=!0,c[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,a.push(Ce(t,"SIGTERM"))),d())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(_e(e??void 0,t??void 0))})})),l=e=>{n??=e,i||(i=!0,a.push(Ce(t,e)))},u=()=>{l("SIGINT")},p=()=>{l("SIGTERM")},f=()=>{l("SIGQUIT")};process.on("SIGINT",u),process.on("SIGTERM",p),process.on("SIGQUIT",f);try{await Promise.all(d),await Promise.all(a)}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",p),process.removeListener("SIGQUIT",f)}if(n)return _e(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of c)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});process.exit(r)}catch(e){console.error(d.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function _e(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function Ce(e,t){const n=Fe(function(e){return e.flatMap(e=>void 0===e.pid?[]:[e.pid])}(e),t);0!==n.length&&await async function(e){const t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(Be))return!1;await ze(Math.min(100,t-Date.now()))}return!0}(n)&&Fe(n,"SIGKILL")}function Fe(e,t){const n=[];for(const r of e)try{if(!Me(r,t))continue;n.push(r),O(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function Be(e){try{return process.kill(-e,0),!1}catch(e){return!!Le(e)}}async function ze(e){await new Promise(t=>setTimeout(t,e))}function Me(e,t){try{return process.kill(-e,t),!0}catch(e){if(Le(e))return!1;throw e}}function Le(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const We="file:",Ue="litestream.yml",Je="/etc/litestream.yml",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}function qe(n){const r=t.join(n.dirPath,Ue);return e.existsSync(r)?`-config ./${Ue}`:e.existsSync(Je)?`-config ${Je}`:`-config ./${Ue}`}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 "${We}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}generate(e,t=""){return["PRISMA generate",t].filter(Boolean).join(" ")}deployForce(e){const t=Ve(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore ${qe(e)} -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){const t=Ve(e);return`litestream ltx ${qe(e)} ${t}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && ${this.generate(e)} && ${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(We))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){const n=Ve(e);return`rm -Rf ${t}*; litestream restore ${qe(e)} -o ${t} ${n}/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=${We}${e} `}else if(e.env.DATABASE_URL?.startsWith(We)){const n=Ge(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${We}${r} `}}return`${o}PRISMA studio ${r}`}},He={command:"gen-code",describe:"Generate code for the current project",builder:{},async handler(e){const t=await de(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.map(e=>({project:e,scripts:Qe(e)})).filter(({scripts:e})=>e.length>0);if(0!==n.length)for(const{project:t,scripts:r}of n){console.info(`Running "gen-code" for ${t.name} ...`);for(const n of r)await Ae(n,t,e)}else console.info(d.green("No code generation needed."))}};function Qe(e){const t=[];e.hasOwnDependency("blitz")?(t.push("YARN blitz codegen"),e.hasPrisma&&t.push(Ke.generate(e))):e.hasPrisma&&t.push(Ke.generate(e));const n=function(e){if(!e.hasOwnDependency("@chakra-ui/cli"))return;if(2===function(e,t){const n=e.packageJson,r=n.dependencies?.[t]??n.devDependencies?.[t]??n.optionalDependencies?.[t]??n.peerDependencies?.[t],o=r?.match(/\d+/u)?.[0];return void 0===o?void 0:Number(o)}(e,"@chakra-ui/cli"))return"YARN chakra-cli tokens src/core/theme.ts";if(Ze(e,"src/theme.ts"))return"YARN chakra typegen src/theme.ts --strict";return}(e);n&&t.push(n);const r=0===t.length&&e.hasDrizzle?function(e){return["drizzle.config.ts","drizzle.config.mts","drizzle.config.js","drizzle.config.mjs"].find(t=>Ze(e,t))}(e):void 0;return r&&t.push(`YARN drizzle-kit check --config ${r} || true`),t}function Ze(n,r){return e.existsSync(t.join(n.dirPath,r))}const Xe={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=ae(e);t||(console.error(d.red("No project found.")),process.exit(1));if(oe(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 g(r)}catch{}}(e)}};function et(e,t){if(!function(e,t){return 0!==e||function(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,""))}(t)}(e,t))return;const n=function(e){return e.trim()}(t);n&&(process.stdout.write(n),process.stdout.write("\n"))}function tt(e){return e.map(e=>nt(e)).join(" ")}function nt(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const rt=new Set(["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"]),ot=new Set(["py"]),st=new Set(["dart"]),it=new Set([...rt,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),at=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),ct=new Set([...at].filter(e=>!it.has(e))),dt="!**/test{-,/}fixtures/**",lt={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"},silent:{description:"Print only failed or warning command output",type:"boolean"}},async handler(e){const t=await ut(e);t&&process.exit(t)}};async function ut(e){if("win32"===process.platform)return console.error(d.red("This command is not supported on Windows.")),1;const n=await de(e,!1);if(!n)return console.error(d.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),o=new Map,s=new Map,i=new Map,a=new Map,c=[],l=[];let u,p,f=!1;if(r.length>0){const h=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await y.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of h){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const p=t.extname(u).slice(1);if(u.endsWith("/package.json"))l.push(u);else{l.push(...Pt(n.descendants,u,r));for(const{lintPath:t,project:l}of xt(n.descendants,u,r)){if(l.hasPoetryLock&&("directory"===r||ot.has(p))){const e=i.get(l)??[];if(e.push(t),i.set(l,e),"directory"!==r)continue}if(l.hasPubspecYaml&&("directory"===r||st.has(p))){const e=a.get(l)??[];if(e.push(t),a.set(l,e),"directory"!==r)continue}if("directory"===r||jt(l,p)){const n=o.get(l)??[];if(n.push(t),o.set(l,n),e.format)if("directory"===r&&l.hasOxfmt){const e=s.get(l)??[];e.push(t),s.set(l,e),c.push(At(t),dt)}else for(const e of Et(l,t,r,p))if(l.hasOxfmt){const t=s.get(l)??[];t.push(e),s.set(l,t)}else c.push(e)}else if(e.format&&(at.has(p)||it.has(p)))if(l.hasOxfmt&&it.has(p)){const e=s.get(l)??[];e.push(t),s.set(l,e)}else at.has(p)&&c.push(t);else $t(p)&&!l.preferredLinter&&(console.error(d.red(`No linter found for ${l.name}. Install Oxlint.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(l)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...ct].join(",")}}`,dt]);for(const o of n){if(!Rt(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...at].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),p=n.descendants.map(e=>e.packageJsonPath);const h=[],m=[],g={exitIfFailed:!1,preserveColor:!e.printAllOutput},w=Boolean(e.format),b=!e.format||e.fix;if(r.length>0){if(b)for(const[t,n]of o){const r=yt(t,e,n);r&&m.push({command:r,project:t})}for(const[t,n]of i)b&&m.push({command:vt(e,n),project:t}),w&&h.push({command:bt(n),project:t});for(const[e,t]of a)b&&m.push({command:St(t),project:e}),w&&h.push({command:kt(t),project:e});if(w)for(const[e,t]of s)h.push({command:wt(t),project:e})}else for(const t of n.descendants){if(b){if(!t.packageJson.workspaces||t.hasSourceCode){const n=yt(t,e);n&&m.push({command:n,project:t})}t.hasPoetryLock&&m.push({command:vt(e),project:t}),t.hasPubspecYaml&&m.push({command:St(),project:t})}w&&(t.hasOxfmt&&h.push({command:wt(),project:t}),t.hasPoetryLock&&h.push({command:bt(),project:t}),t.hasPubspecYaml&&h.push({command:kt(),project:t}))}const v=[];if(w){const t=await pt(h,e,g);if(ht(t,e),v.push(...t.map(e=>e.exitCode)),v.some(e=>0!==e))return 1}if(f)return 1;if(w){if(u.length>0&&n.self.hasPrettier){const t=await ft(tt(["YARN","prettier","--cache","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,g);ht([t],e),v.push(t.exitCode)}if(p.length>0){const t=await ft(tt(["YARN","sort-package-json","--",...p]),n.self,e,g);ht([t],e),v.push(t.exitCode)}if(v.some(e=>0!==e))return 1}if(b){const t=await pt(m,e,g);ht(t,e),v.push(...t.map(e=>e.exitCode))}return v.some(e=>0!==e)?1:0}function pt(e,t,n){return Promise.all(e.map(({command:e,project:r})=>ft(e,r,t,n)))}function ft(e,t,n,r){if(n.silent){const o=xe(e,t);return function(e,t,n,r=Ee){return Se.runAndWaitForReturnValue(async()=>{const o=xe(e,t);if(n.dryRun)return{exitCode:0,output:""};const s=await _(o.runnable,void 0,{cwd:t.dirPath,env:Re(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(s.signal),{exitCode:s.status??1,output:s.stdout}})}(e,t,n,r).then(e=>({...e,command:o.printable,cwd:t.dirPath}))}return Pe(e,t,n,r).then(e=>({exitCode:e}))}function ht(e,t){const n=t.silent&&!t.printAllOutput?e.filter(e=>0!==e.exitCode):e;if(0!==n.length)for(const e of n)"output"in e&&(t.printAllOutput?mt(e):(t.silent&&gt(e.command,e.cwd),et(e.exitCode,e.output)))}function mt(e){if(gt(e.command,e.cwd),0===e.exitCode&&((t=e.command).includes(" oxfmt ")||t.includes(" sort-package-json ")))return void console.info(d.green("Succeeded."));var t;const n=e.output.trim();n&&(process.stdout.write(n),process.stdout.write("\n"))}function gt(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}function yt(e,t,n){if("oxlint"===e.preferredLinter)return tt(["YARN","oxlint","--no-error-on-unmatched-pattern",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]])}function wt(e){return tt(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."],"!**/package.json"])}function bt(e){const t=e&&e.length>0?e:["."];return[tt(["poetry","run","isort","--profile","black","--filter-files",...t]),tt(["poetry","run","black",...t])].join(" && ")}function vt(e,t){const n=t&&t.length>0?t:["."];return tt(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])}function kt(e){return tt(["dart","format",...e&&e.length>0?e:["."]])}function St(e){return tt(["dart","analyze",...e&&e.length>0?e:["."]])}function Et(e,t,n,r){return"directory"===n&&e.hasOxfmt?[t]:"directory"===n&&Rt(e)?[t,dt]:function(e,t){return e.hasOxfmt?it.has(t):!!Rt(e)||ct.has(t)}(e,r)?[t]:[]}function At(e){return t.join(e,`**/{.*/,}*.{${[...ct].join(",")}}`)}function Pt(e,n,r){return"directory"!==r?[]:e.filter(e=>e.packageJsonPath===t.join(n,"package.json")||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath)}function xt(e,t,n){if("directory"===n){const n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}const r=function(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}(e,t);return r?[{lintPath:t,project:r}]:[]}function $t(e){return rt.has(e)||ot.has(e)||st.has(e)}function jt(e,t){return"oxlint"===e.preferredLinter&&rt.has(t)}function Rt(e){return!e.hasOxfmt&&"oxlint"===e.preferredLinter}const Ot=new Set;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 _("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 _("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Nt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await async function(e,t){await It(e)||await Dt(e,t);const n=async()=>{Ot.has(e)||(Ot.add(e),await Dt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(n,t),n}async function It(e){for(const t of["127.0.0.1","::"]){if(!await Tt(t,e))return!1}return!0}async function Tt(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 _t={};function Ct(e,t){return String.raw`
9
+ */const W=[..."0123456789abcdef"],U=[6,1536,393216,100663296],J=[0,8,16,24],Y=[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 V=e=>{const t=[];for(const[n,r]of e.entries())t[n]=r;return t};class G{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<<J[3&i++]:a<2048?(t[i>>2]|=(192|a>>6)<<J[3&i++],t[i>>2]|=(128|63&a)<<J[3&i++]):a<55296||a>=57344?(t[i>>2]|=(224|a>>12)<<J[3&i++],t[i>>2]|=(128|a>>6&63)<<J[3&i++],t[i>>2]|=(128|63&a)<<J[3&i++]):(a=65536+((1023&a)<<10|1023&(e.codePointAt(++c)||0)),t[i>>2]|=(240|a>>18)<<J[3&i++],t[i>>2]|=(128|a>>12&63)<<J[3&i++],t[i>>2]|=(128|a>>6&63)<<J[3&i++],t[i>>2]|=(128|63&a)<<J[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];q(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];q(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+=W[o>>4&15]+W[15&o]+W[o>>12&15]+W[o>>8&15]+W[o>>20&15]+W[o>>16&15]+W[o>>28&15]+W[o>>24&15];i%e===0&&(t=V(t),q(t),s=0)}return r&&(o=t[s],a+=W[o>>4&15]+W[15&o],r>1&&(a+=W[o>>12&15]+W[o>>8&15]),r>2&&(a+=W[o>>20&15]+W[o>>16&15])),a}}const q=function(e){let t,n,r,o,s,i,a,c,d,l,u,p,f,h,m,g,y,w,b,v,k,S,E,P,A,x,$,j,R,O,D,N,I,T,_,C,F,B,z,M,L,W,U,J,V,G,q,K,H,Q,Z,X,ee,te,ne,re,oe,se,ie,ae,ce,de,le;for(r=0;r<48;r+=2)o=e[0]^e[10]^e[20]^e[30]^e[40],s=e[1]^e[11]^e[21]^e[31]^e[41],i=e[2]^e[12]^e[22]^e[32]^e[42],a=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],d=e[5]^e[15]^e[25]^e[35]^e[45],l=e[6]^e[16]^e[26]^e[36]^e[46],u=e[7]^e[17]^e[27]^e[37]^e[47],p=e[8]^e[18]^e[28]^e[38]^e[48],f=e[9]^e[19]^e[29]^e[39]^e[49],t=p^(i<<1|a>>>31),n=f^(a<<1|i>>>31),e[0]^=t,e[1]^=n,e[10]^=t,e[11]^=n,e[20]^=t,e[21]^=n,e[30]^=t,e[31]^=n,e[40]^=t,e[41]^=n,t=o^(c<<1|d>>>31),n=s^(d<<1|c>>>31),e[2]^=t,e[3]^=n,e[12]^=t,e[13]^=n,e[22]^=t,e[23]^=n,e[32]^=t,e[33]^=n,e[42]^=t,e[43]^=n,t=i^(l<<1|u>>>31),n=a^(u<<1|l>>>31),e[4]^=t,e[5]^=n,e[14]^=t,e[15]^=n,e[24]^=t,e[25]^=n,e[34]^=t,e[35]^=n,e[44]^=t,e[45]^=n,t=c^(p<<1|f>>>31),n=d^(f<<1|p>>>31),e[6]^=t,e[7]^=n,e[16]^=t,e[17]^=n,e[26]^=t,e[27]^=n,e[36]^=t,e[37]^=n,e[46]^=t,e[47]^=n,t=l^(o<<1|s>>>31),n=u^(s<<1|o>>>31),e[8]^=t,e[9]^=n,e[18]^=t,e[19]^=n,e[28]^=t,e[29]^=n,e[38]^=t,e[39]^=n,e[48]^=t,e[49]^=n,h=e[0],m=e[1],G=e[11]<<4|e[10]>>>28,q=e[10]<<4|e[11]>>>28,j=e[20]<<3|e[21]>>>29,R=e[21]<<3|e[20]>>>29,ae=e[31]<<9|e[30]>>>23,ce=e[30]<<9|e[31]>>>23,W=e[40]<<18|e[41]>>>14,U=e[41]<<18|e[40]>>>14,T=e[2]<<1|e[3]>>>31,_=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,y=e[12]<<12|e[13]>>>20,K=e[22]<<10|e[23]>>>22,H=e[23]<<10|e[22]>>>22,O=e[33]<<13|e[32]>>>19,D=e[32]<<13|e[33]>>>19,de=e[42]<<2|e[43]>>>30,le=e[43]<<2|e[42]>>>30,te=e[5]<<30|e[4]>>>2,ne=e[4]<<30|e[5]>>>2,C=e[14]<<6|e[15]>>>26,F=e[15]<<6|e[14]>>>26,w=e[25]<<11|e[24]>>>21,b=e[24]<<11|e[25]>>>21,Q=e[34]<<15|e[35]>>>17,Z=e[35]<<15|e[34]>>>17,N=e[45]<<29|e[44]>>>3,I=e[44]<<29|e[45]>>>3,P=e[6]<<28|e[7]>>>4,A=e[7]<<28|e[6]>>>4,re=e[17]<<23|e[16]>>>9,oe=e[16]<<23|e[17]>>>9,B=e[26]<<25|e[27]>>>7,z=e[27]<<25|e[26]>>>7,v=e[36]<<21|e[37]>>>11,k=e[37]<<21|e[36]>>>11,X=e[47]<<24|e[46]>>>8,ee=e[46]<<24|e[47]>>>8,J=e[8]<<27|e[9]>>>5,V=e[9]<<27|e[8]>>>5,x=e[18]<<20|e[19]>>>12,$=e[19]<<20|e[18]>>>12,se=e[29]<<7|e[28]>>>25,ie=e[28]<<7|e[29]>>>25,M=e[38]<<8|e[39]>>>24,L=e[39]<<8|e[38]>>>24,S=e[48]<<14|e[49]>>>18,E=e[49]<<14|e[48]>>>18,e[0]=h^~g&w,e[1]=m^~y&b,e[10]=P^~x&j,e[11]=A^~$&R,e[20]=T^~C&B,e[21]=_^~F&z,e[30]=J^~G&K,e[31]=V^~q&H,e[40]=te^~re&se,e[41]=ne^~oe&ie,e[2]=g^~w&v,e[3]=y^~b&k,e[12]=x^~j&O,e[13]=$^~R&D,e[22]=C^~B&M,e[23]=F^~z&L,e[32]=G^~K&Q,e[33]=q^~H&Z,e[42]=re^~se&ae,e[43]=oe^~ie&ce,e[4]=w^~v&S,e[5]=b^~k&E,e[14]=j^~O&N,e[15]=R^~D&I,e[24]=B^~M&W,e[25]=z^~L&U,e[34]=K^~Q&X,e[35]=H^~Z&ee,e[44]=se^~ae&de,e[45]=ie^~ce&le,e[6]=v^~S&h,e[7]=k^~E&m,e[16]=O^~N&P,e[17]=D^~I&A,e[26]=M^~W&T,e[27]=L^~U&_,e[36]=Q^~X&J,e[37]=Z^~ee&V,e[46]=ae^~de&te,e[47]=ce^~le&ne,e[8]=S^~h&g,e[9]=E^~m&y,e[18]=N^~P&x,e[19]=I^~A&$,e[28]=W^~T&C,e[29]=U^~_&F,e[38]=X^~J&G,e[39]=ee^~V&q,e[48]=de^~te&re,e[49]=le^~ne&oe,e[0]^=Y[r],e[1]^=Y[r+1]},K=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(Q.decode(e))],create:([e])=>H.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]))}(),H=new TextEncoder,Q=new TextDecoder("utf-8");function Z(e,t=K){return JSON.stringify(te(e,t))}function X(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 ee=[];function te(e,t=K){const n=X(e);if(null!==n)return n;const r=[],o=new Map;return function e(n){const s=X(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(ee.length<e){const t=ee.length;ee.length=e,ee.fill(-2,t,e)}return ee.slice(0,e)}(n.length);r[i]=t,o.set(n,i);for(const[r,o]of n.entries())t[r]=e(o)}else{const[s,a]=function(e,t){const n=e.constructor;if("function"==typeof n){const r=n.name,o=t.get(r);if(void 0!==o)return[r,o.from(e)]}const r=Object.entries(e),o=r.length,s=Array.from({length:o+o});for(let e=0;e<o;e++){const t=r[e],n=e+e;s[n]=t[0],s[n+1]=t[1]}return["",s]}(n,t),c=a.length,d=Array.from({length:c+1});d[0]=s,r[i]=d,o.set(n,i);for(let t=0;t<c;t++)d[t+1]=e(a[t])}}return i}(e),r}function ne(e,t){return function(e){return new G(512,U,512).update(e).hex()}(Z([e,t]))}const re=function({cacheDuration:e=Number.POSITIVE_INFINITY,getCacheKey:t=ne}={}){return function(n,r){let o,s,i;return"getter"===r?.kind?function(){const r=t(this,[]),a=Date.now();return(i!==r||a-s>e)&&(i=r,o=n.call(this),s=a),o}:function(...a){const c=t(this,a),d=Date.now();return(i!==c||d-s>e)&&(i=c,o=r?n.call(this,...a):n(...a),s=d),o}}}({getCacheKey:ne});function oe(e){return!!e&&"0"!==e&&"false"!==e}let se;class ie{static{[se]=function(e,t,n,r,o){var s,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 y(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 w(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 b(e,t,n,r,o,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]),b=t[3],v=!c,k=1===o,S=3===o,E=4===o,P=2===o;function A(t,n,r){return function(o,s){return n&&(s=o,o=e),r&&r(o),x[t].call(o,s)}}if(!v){var x={},$=[],j=S?"get":E||k?"set":"value";if(l?(u||k?x={get:M(function(){return b(this)},r,"get"),set:function(e){t[4](this,e)}}:x[j]=b,u||M(x[j],r,P?"":j)):u||(x=Object.getOwnPropertyDescriptor(e,r)),!u&&!l){if((i=m[+d][r])&&7!==(i^o))throw Error("Decorating two elements with the same name ("+x[j].name+") is not supported yet");m[+d][r]=o<3?1:o}}for(var R=e,O=g.length-1;O>=0;O-=n?2:1){var D=w(g[O],"A decorator","be",!0),N=n?g[O-1]:void 0,I={},T={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");w(t,"An initializer","be",!0),a.push(t)}.bind(null,I)};if(v)i=D.call(N,R,T),I.v=1,w(i,"class decorators","return")&&(R=i);else if(T.static=d,T.private=l,i=T.access={has:l?p.bind():function(e){return r in e}},E||(i.get=l?P?function(e){return h(e),x.value}:A("get",0,h):function(e){return e[r]}),P||S||(i.set=l?A("set",0,h):function(e,t){e[r]=t}),R=D.call(N,k?{get:x.get,set:x.set}:x[j],T),I.v=1,k){if("object"==typeof R&&R)(i=w(R.get,"accessor.get"))&&(x.get=i),(i=w(R.set,"accessor.set"))&&(x.set=i),(i=w(R.init,"accessor.init"))&&$.unshift(i);else if(void 0!==R)throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined")}else w(R,(u?"field":"method")+" decorators","return")&&(u?$.unshift(R):x[j]=R)}return o<2&&c.push(y($,d,1),y(a,d,0)),u||v||(l?k?c.splice(-1,0,A("get",d),A("set",d)):c.push(P?x[j]:w.call.bind(x[j])):f(e,r,x)),R}function v(e){return f(e,p,{configurable:!0,enumerable:!0,value:s})}return s=h(null==s?null:s),d=[],l=function(e){e&&d.push(y(e))},u=function(t,r){for(var s=0;s<n.length;s++){var i=n[s],l=i[1],u=7&l;if((8&l)==t&&!u==r){var p=i[2],f=!!i[3],h=16&l;b(t?e:e.prototype,i,h,f?"#"+p:L(p),u,u<2?[]:t?c=c||[]:a=a||[],d,!!t,f,r,t&&f?function(t){return z(t)===e}:o)}}},u(8,0),u(0,0),u(8,1),u(0,1),l(a),l(c),i=d,g||v(e),{e:i,get c(){var n=[];return g&&[v(e=b(e,[t],r,e.name,5,n)),y(n,1)]}}}(this,[],[[re,3,"isBunAvailable"],[re,3,"usesBunPackageManager"],[re,3,"buildCommand"],[re,3,"rootDirPath"],[re,3,"dockerfile"],[re,3,"hasDockerfile"],[re,3,"hasSourceCode"],[re,3,"name"],[re,3,"dockerImageName"],[re,3,"env"],[re,3,"packageJson"],[re,3,"packageJsonPath"],[re,3,"hasPrisma"],[re,3,"hasDrizzle"],[re,3,"databaseOrm"],[re,3,"hasVitest"],[re,3,"hasOxlint"],[re,3,"hasOxfmt"],[re,3,"hasPrettier"],[re,3,"hasPoetryLock"],[re,3,"hasPubspecYaml"],[re,3,"preferredLinter"],[re,3,"hasPlaywrightConfig"],[re,3,"skipLaunchingServerForPlaywright"],[re,3,"dockerPackageJson"],[re,3,"binExists"],[re,3,"rootPackageJson"]]).e}argv=void se(this);pathByName=new Map;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return!!this.hasBunToolVersion()||this.usesBunPackageManager}get usesBunPackageManager(){return!!this.hasBunLockfile()||this.hasBunPackageManager()}hasBunToolVersion(){try{return/(^|\n)bun\s/.test(e.readFileSync(t.join(this.rootDirPath,".tool-versions"),"utf8"))}catch{return!1}}hasBunLockfile(){return["bun.lock","bun.lockb"].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){const e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return"string"==typeof e&&e.startsWith("bun@")}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[e,t]=P(this.argv,this.dirPath);if(!x(this.argv))for(const[e,n]of t)console.info(`Loaded ${n} environment variables from ${e}`);return{...process.env,...e}}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,"utf8"))}get packageJsonPath(){return t.join(this.dirPath,"package.json")}get hasPrisma(){return!!this.getOwnDependencyVersion("prisma")}get hasDrizzle(){return!!this.getOwnDependencyVersion("drizzle-orm")}get databaseOrm(){return this.hasPrisma?"prisma":this.hasDrizzle?"drizzle":void 0}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency("oxlint")}get hasOxfmt(){return this.hasDependency("oxfmt")}get hasPrettier(){return this.hasDependency("prettier")}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,"poetry.lock"))||e.existsSync(t.join(this.rootDirPath,"poetry.lock"))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,"pubspec.yaml"))||e.existsSync(t.join(this.rootDirPath,"pubspec.yaml"))}get preferredLinter(){if(this.hasOxlint)return"oxlint"}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile("playwright.config.ts")}catch{return!1}}get skipLaunchingServerForPlaywright(){if(oe(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){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}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 ae(n,r=!0,o){if(o??=process.cwd(),e.existsSync(t.join(o,"package.json")))return new ie(o,n,r)}function ce(e,t){return e.env.WB_ENV===t||e.env.MISE_ENV===t}async function de(e,t=!0,n){const r=le(e,t,n);if(r)return{...r,descendants:r.root===r.self?await ue(e,r.root,t):[r.self]}}function le(n,r=!0,o){if(o??=process.cwd(),!e.existsSync(t.join(o,"package.json")))return;const s=new ie(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 ie(s,n,r))}return{root:i,self:s}}async function ue(n,r,o){const s=[r],i=r.packageJson.workspaces;if(!Array.isArray(i))return s;const a=[],c=[];for(const n of i.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):a.push(n);c.push(...await l(a,{dot:!0,onlyDirectories:!0}));for(const r of c)e.existsSync(t.join(r,"package.json"))&&s.push(new ie(r,n,o));return s}const pe=process.versions.bun||process.argv[0]?.endsWith("/bun")||process.env.npm_execpath?.endsWith("/bun"),fe=pe?"bun --bun run":"node",he=pe?"bun":"yarn",me=pe?"bun --bun run":"yarn",ge={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=ae(n,!0,r);if(!s)return console.error(d.red("No project found.")),!0;const i=n.command??(s.packageJson.scripts?.build?pe?"bun run build":"yarn build":void 0);if(!i)return console.info(d.green("Skip to build because no build command is defined.")),!1;if(n={...n,command:i},!e.existsSync(t.join(s.rootDirPath,".git")))return ye(s,n),!0;const[a,l,u]=await async function(n,r){const s=t.resolve(n.dirPath,"node_modules",".cache","build"),i=t.resolve(s,"last-build");await e.promises.mkdir(s,{recursive:!0});const a=c("sha256"),d=o.execSync("git rev-parse HEAD",{cwd:n.dirPath}).toString().trim();a.update(d);const l=JSON.stringify(Object.entries(n.env).filter(([e])=>!we.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));a.update(l),await async function(e,t,n){return new Promise(r=>{const s=o.spawnSync("git",["status","--porcelain"],{cwd:e.dirPath,env:e.env,stdio:"pipe",encoding:"utf8"}).stdout.trim().split("\n").filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>"test"===e.env.WB_ENV?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,""):t).filter(e=>(be.some(t=>e.includes(t))||ve.some(t=>e.endsWith(t)))&&!ke.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(a)return console.info(d.green(`Skip to run '${n.command}' 💫`)),!1;if(!ye(s,n))return;n.dryRun||await e.promises.writeFile(l,u,"utf8");return!0}(n)}};function ye(e,t){if(console.info(d.green(`Run '${t.command}'`)),!t.dryRun){const n=o.spawnSync(t.command??"",{cwd:e.dirPath,env:e.env,shell:!0,stdio:"inherit"});if(0!==n.status)return process.exitCode=n.status??1,!1}return!0}const we=new Set(["CI","PWDEBUG","TMPDIR"]);const be=["src/","public/"],ve=[".js",".cjs",".mjs",".jsx",".ts",".cts",".mts",".tsx",".json",".browserslistrc","package.json","yarn.lock"],ke=["test/","tests/","__tests__/","test-fixtures/","test/fixtures/"];const Se=new m,Ee={exitIfFailed:!0};async function Pe(e,t,n,r=Ee){const o=xe(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||$e(o.printable,t,n.silent?"Command":"Start"),n.verbose&&$e(o.runnable,t,"Start (raw)",!0),n.dryRun)return je(o.printable,0,r,{silentSuccess:n.silent}),0;const s=Boolean(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly));let i=!1;const a=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write("."),i=!0},r.silentProgressIntervalMs):void 0,c=await _(o.runnable,void 0,{cwd:t.dirPath,env:Re(t.env,{...r,preserveColor:r.preserveColor??(!!n.silent||void 0)}),shell:!0,stdio:n.silent?"pipe":"inherit",timeout:r.timeout,mergeOutAndError:s,killOnExit:!0,printingStdout:n.silent&&!s,printingStderr:n.silent&&!s,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{a&&clearInterval(a)}),l=c.status??1;if(i&&process.stdout.write("\n"),s&&(!r.printSilentOutputOnFailureOnly||0!==l)){const e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write("\n"))}return n.silent&&0===l&&r.silentSuccessMessage&&console.info(d.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),je(o.printable,l,r,{silentSuccess:n.silent}),l}function Ae(e,t,n,r=Ee){return Se.runAndWaitForReturnValue(async()=>{const o=xe(e,t);if($e(o.printable,t,"Start (parallel)",!0),n.dryRun)return $e(o.printable,t,"Started (log)"),n.verbose&&$e(o.runnable,t,"Started (raw)",!0),je(o.printable,0,r),0;const s=await _(o.runnable,void 0,{cwd:t.dirPath,env:Re(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(s.signal),$e(o.printable,t,"Started (log)"),n.verbose&&$e(o.runnable,t,"Started (raw)",!0);const i=s.stdout.trim();return i&&!r.printRawOutput&&(process.stdout.write(i),process.stdout.write("\n")),je(o.printable,s.status,r),s.status??1})}function xe(e,t){const n=t.usesBunPackageManager?"bun --bun run":"yarn";let r=e.replaceAll("\n","").replaceAll(/\s\s+/g," ").replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,t.packageJson.dependencies?.blitz?"PRISMA generate":"PRISMA generate --no-hints").replaceAll("PRISMA ",t.packageJson.dependencies?.blitz?"YARN blitz prisma ":"YARN prisma ").replaceAll("BUN run ",t.usesBunPackageManager?`${n} `:"YARN run ").replaceAll("BUN ",t.usesBunPackageManager?`${n} `:"YARN ").replaceAll("YARN run ",t.usesBunPackageManager?`${n} `:"yarn run ");t.usesBunPackageManager&&(r=r.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")),r=r.trim();const o=Oe(r.replaceAll("YARN ",`${n} `)),s=Oe(r.replaceAll("YARN playwright ",`${n} playwright `).replaceAll("YARN ",!t.usesBunPackageManager&&t.binExists?"":`${n} `));return{printable:`${n} dotenv${t.env.WB_ENV?` -c=${t.env.WB_ENV||"development"}`:""} -- ${o}`,runnable:s}}function $e(e,t,n="Start",r=!1){console.info("\n"+(r?d.gray:d.cyan)(d.bold(`${n}:`),e)+d.gray(` at ${t.dirPath}`))}function je(e,t,n,r={}){if(0===t){if(r.silentSuccess)return;console.info(d.green(d.bold("Finished:"),e))}else console.info(d.red(d.bold(`Failed (exit code ${t}): `),e)),!1!==n.exitIfFailed&&process.exit(t??1)}function Re(e,t){const n={...e};return t.ci&&(n.CI="1"),function(e,t){void 0!==e.NO_COLOR||!1===t?delete e.FORCE_COLOR:t&&process.stdout.isTTY&&(e.FORCE_COLOR||="3")}(n,t.preserveColor),n}function Oe(e){return e.includes("next dev")||e.includes("playwright")||e.includes("prisma")||e.includes("test/e2e-additional")?e.replaceAll("bun --bun","bun"):e}const De={...E,"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 Ne(e){const t=[];for(const n of Object.keys(E)){const r=Ie(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!0===e.silent&&void 0===Ie(e,"quiet-env")&&t.push("--quiet-env"),t}function Ie(e,t){const n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Te={command:"concurrently <commands...>",describe:"Run commands concurrently",builder:{...De,"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(d.red("This command is not supported on Windows.")),process.exit(1));const t=ae(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=(e.commands??[]).map(String).filter(Boolean);0===n.length&&(console.error(d.red("No commands provided.")),process.exit(1));try{const r=await async function(e){const t=e.commands.map(t=>o.spawn(xe(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:Re(e.project.env,{ci:e.ci}),shell:!0,stdio:"inherit"}));let n,r,s,i=!1;const a=[],c=Array.from({length:t.length}),d=t.map((n,o)=>new Promise(d=>{let l=!1;const u=n=>{l||(l=!0,c[o]=n,r??=n,!i&&function(e,t){return"first"===t.success||t.killOthers||t.killOthersOnFail&&0!==e}(n,e)&&(s=n,i=!0,a.push(Ce(t,"SIGTERM"))),d())};n.once("error",e=>{console.error("Failed to start child process:",e),u(1)}),n.once("exit",(e,t)=>{u(_e(e??void 0,t??void 0))})})),l=e=>{n??=e,i||(i=!0,a.push(Ce(t,e)))},u=()=>{l("SIGINT")},p=()=>{l("SIGTERM")},f=()=>{l("SIGQUIT")};process.on("SIGINT",u),process.on("SIGTERM",p),process.on("SIGQUIT",f);try{await Promise.all(d),await Promise.all(a)}finally{process.removeListener("SIGINT",u),process.removeListener("SIGTERM",p),process.removeListener("SIGQUIT",f)}if(n)return _e(void 0,n);if("first"===e.success)return r??1;if(void 0!==s)return s;for(const e of c)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});process.exit(r)}catch(e){console.error(d.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};function _e(e,t){return void 0!==e?e:t&&t in h.signals?128+h.signals[t]:1}async function Ce(e,t){const n=Fe(function(e){return e.flatMap(e=>void 0===e.pid?[]:[e.pid])}(e),t);0!==n.length&&await async function(e){const t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(Be))return!1;await ze(Math.min(100,t-Date.now()))}return!0}(n)&&Fe(n,"SIGKILL")}function Fe(e,t){const n=[];for(const r of e)try{if(!Me(r,t))continue;n.push(r),O(r,t)}catch(e){console.warn("Failed to kill child process:",e)}return n}function Be(e){try{return process.kill(-e,0),!1}catch(e){return!!Le(e)}}async function ze(e){await new Promise(t=>setTimeout(t,e))}function Me(e,t){try{return process.kill(-e,t),!0}catch(e){if(Le(e))return!1;throw e}}function Le(e){return"object"==typeof e&&null!==e&&"code"in e&&"ESRCH"===e.code}const We="file:",Ue="litestream.yml",Je="/etc/litestream.yml",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}function qe(n){const r=t.join(n.dirPath,Ue);return e.existsSync(r)?`-config ./${Ue}`:e.existsSync(Je)?`-config ${Je}`:`-config ./${Ue}`}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 "${We}${n}"; fi && rm -f "${n}".* "${n}"-*`}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=""){return`PRISMA migrate deploy ${t}`}generate(e,t=""){return["PRISMA generate",t].filter(Boolean).join(" ")}deployForce(e){const t=Ve(e),n=`rm -Rf "${`${t}/prod.sqlite3`}"*`;return`${n}; PRISMA migrate reset --force --skip-seed && ${n}\n && litestream restore ${qe(e)} -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e){const t=Ve(e);return`litestream ltx ${qe(e)} ${t}/prod.sqlite3`}migrate(e,t=""){return`PRISMA migrate deploy ${t} && ${this.generate(e)} && ${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(We))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){const n=Ve(e);return`rm -Rf ${t}*; litestream restore ${qe(e)} -o ${t} ${n}/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=${We}${e} `}else if(e.env.DATABASE_URL?.startsWith(We)){const n=Ge(e);if(n){const r=t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5));o=`DATABASE_URL=${We}${r} `}}return`${o}PRISMA studio ${r}`}},He={command:"gen-code",describe:"Generate code for the current project",builder:{},async handler(e){const t=await de(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=t.descendants.map(e=>({project:e,scripts:Qe(e)})).filter(({scripts:e})=>e.length>0);if(0!==n.length)for(const{project:t,scripts:r}of n){console.info(`Running "gen-code" for ${t.name} ...`);for(const n of r)await Pe(n,t,e)}else console.info(d.green("No code generation needed."))}};function Qe(e){const t=[];e.hasOwnDependency("blitz")?(t.push("YARN blitz codegen"),e.hasPrisma&&t.push(Ke.generate(e))):e.hasPrisma&&t.push(Ke.generate(e));const n=function(e){if(!e.hasOwnDependency("@chakra-ui/cli"))return;if(2===function(e,t){const n=e.packageJson,r=n.dependencies?.[t]??n.devDependencies?.[t]??n.optionalDependencies?.[t]??n.peerDependencies?.[t],o=r?.match(/\d+/u)?.[0];return void 0===o?void 0:Number(o)}(e,"@chakra-ui/cli"))return"YARN chakra-cli tokens src/core/theme.ts";if(Ze(e,"src/theme.ts"))return"YARN chakra typegen src/theme.ts --strict";return}(e);n&&t.push(n);const r=0===t.length&&e.hasDrizzle?function(e){return["drizzle.config.ts","drizzle.config.mts","drizzle.config.js","drizzle.config.mjs"].find(t=>Ze(e,t))}(e):void 0;return r&&t.push(`YARN drizzle-kit check --config ${r} || true`),t}function Ze(n,r){return e.existsSync(t.join(n.dirPath,r))}const Xe={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=ae(e);t||(console.error(d.red("No project found.")),process.exit(1));if(oe(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 g(r)}catch{}}(e)}};function et(e,t){if(!function(e,t){return 0!==e||function(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,""))}(t)}(e,t))return;const n=function(e){return e.trim()}(t);n&&(process.stdout.write(n),process.stdout.write("\n"))}function tt(e){return e.map(e=>nt(e)).join(" ")}function nt(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll("'","'\"'\"'")}'`}const rt=new Set(["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"]),ot=new Set(["py"]),st=new Set(["dart"]),it=new Set([...rt,"css","gql","graphql","hbs","htm","html","json","json5","jsonc","less","md","mdx","scss","toml","yaml","yml"]),at=new Set(["cjs","css","cts","htm","html","java","js","json","json5","jsonc","jsx","md","mjs","mts","scss","ts","tsx","vue","yaml","yml"]),ct=new Set([...at].filter(e=>!it.has(e))),dt="!**/test{-,/}fixtures/**",lt={command:"lint [files...]",describe:"Lint code",builder:{fix:{description:"Fix the linting errors",type:"boolean"},format:{description:"Format the code",type:"boolean"},quiet:{description:"Report errors only",type:"boolean"},silent:{description:"Print only failed or warning command output",type:"boolean"}},async handler(e){const t=await ut(e);t&&process.exit(t)}};async function ut(e){if("win32"===process.platform)return console.error(d.red("This command is not supported on Windows.")),1;const n=await de(e,!1);if(!n)return console.error(d.red("No project found.")),1;const r=function(e){const t=new Set;for(const n of[...e.files??[],...e._.slice(1),...e["--"]??[]])t.add(String(n));return[...t]}(e),o=new Map,s=new Map,i=new Map,a=new Map,c=[],l=[];let u,p,f=!1;if(r.length>0){const h=await Promise.all(r.map(async e=>{const n=t.resolve(e),r=await async function(e){try{if((await y.stat(e)).isDirectory())return"directory"}catch{}return"other"}(n);return{fileKind:r,filePath:n}}));for(const{fileKind:r,filePath:u}of h){if(u.endsWith("/test/fixtures")||u.includes("/test/fixtures/")||u.endsWith("/test-fixtures")||u.includes("/test-fixtures/"))continue;const p=t.extname(u).slice(1);if(u.endsWith("/package.json"))l.push(u);else{l.push(...At(n.descendants,u,r));for(const{lintPath:t,project:l}of xt(n.descendants,u,r)){if(l.hasPoetryLock&&("directory"===r||ot.has(p))){const e=i.get(l)??[];if(e.push(t),i.set(l,e),"directory"!==r)continue}if(l.hasPubspecYaml&&("directory"===r||st.has(p))){const e=a.get(l)??[];if(e.push(t),a.set(l,e),"directory"!==r)continue}if("directory"===r||jt(l,p)){const n=o.get(l)??[];if(n.push(t),o.set(l,n),e.format)if("directory"===r&&l.hasOxfmt){const e=s.get(l)??[];e.push(t),s.set(l,e),c.push(Pt(t),dt)}else for(const e of Et(l,t,r,p))if(l.hasOxfmt){const t=s.get(l)??[];t.push(e),s.set(l,t)}else c.push(e)}else if(e.format&&(at.has(p)||it.has(p)))if(l.hasOxfmt&&it.has(p)){const e=s.get(l)??[];e.push(t),s.set(l,e)}else at.has(p)&&c.push(t);else $t(p)&&!l.preferredLinter&&(console.error(d.red(`No linter found for ${l.name}. Install Oxlint.`)),f=!0)}}}u=[...new Set(c)],p=[...new Set(l)]}else u=function(e,n){const r=new Set([`**/{.*/,}*.{${[...ct].join(",")}}`,dt]);for(const o of n){if(!Rt(o))continue;const n=t.join(o.dirPath,"**/{.*/,}*.{"+[...at].join(",")+"}");r.add(t.relative(e,n)||n)}return[...r]}(n.self.dirPath,n.descendants),p=n.descendants.map(e=>e.packageJsonPath);const h=[],m=[],g={exitIfFailed:!1,preserveColor:!e.printAllOutput},w=Boolean(e.format),b=!e.format||e.fix;if(r.length>0){if(b)for(const[t,n]of o){const r=yt(t,e,n);r&&m.push({command:r,project:t})}for(const[t,n]of i)b&&m.push({command:vt(e,n),project:t}),w&&h.push({command:bt(n),project:t});for(const[e,t]of a)b&&m.push({command:St(t),project:e}),w&&h.push({command:kt(t),project:e});if(w)for(const[e,t]of s)h.push({command:wt(t),project:e})}else for(const t of n.descendants){if(b){if(!t.packageJson.workspaces||t.hasSourceCode){const n=yt(t,e);n&&m.push({command:n,project:t})}t.hasPoetryLock&&m.push({command:vt(e),project:t}),t.hasPubspecYaml&&m.push({command:St(),project:t})}w&&(t.hasOxfmt&&h.push({command:wt(),project:t}),t.hasPoetryLock&&h.push({command:bt(),project:t}),t.hasPubspecYaml&&h.push({command:kt(),project:t}))}const v=[];if(w){const t=await pt(h,e,g);if(ht(t,e),v.push(...t.map(e=>e.exitCode)),v.some(e=>0!==e))return 1}if(f)return 1;if(w){if(u.length>0&&n.self.hasPrettier){const t=await ft(tt(["YARN","prettier","--cache","--no-error-on-unmatched-pattern","--write","--",...u]),n.self,e,g);ht([t],e),v.push(t.exitCode)}if(p.length>0){const t=await ft(tt(["YARN","sort-package-json","--",...p]),n.self,e,g);ht([t],e),v.push(t.exitCode)}if(v.some(e=>0!==e))return 1}if(b){const t=await pt(m,e,g);ht(t,e),v.push(...t.map(e=>e.exitCode))}return v.some(e=>0!==e)?1:0}function pt(e,t,n){return Promise.all(e.map(({command:e,project:r})=>ft(e,r,t,n)))}function ft(e,t,n,r){if(n.silent){const o=xe(e,t);return function(e,t,n,r=Ee){return Se.runAndWaitForReturnValue(async()=>{const o=xe(e,t);if(n.dryRun)return{exitCode:0,output:""};const s=await _(o.runnable,void 0,{cwd:t.dirPath,env:Re(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:"pipe",timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(s.signal),{exitCode:s.status??1,output:s.stdout}})}(e,t,n,r).then(e=>({...e,command:o.printable,cwd:t.dirPath}))}return Ae(e,t,n,r).then(e=>({exitCode:e}))}function ht(e,t){const n=t.silent&&!t.printAllOutput?e.filter(e=>0!==e.exitCode):e;if(0!==n.length)for(const e of n)"output"in e&&(t.printAllOutput?mt(e):(t.silent&&gt(e.command,e.cwd),et(e.exitCode,e.output)))}function mt(e){if(gt(e.command,e.cwd),0===e.exitCode&&((t=e.command).includes(" oxfmt ")||t.includes(" sort-package-json ")))return void console.info(d.green("Succeeded."));var t;const n=e.output.trim();n&&(process.stdout.write(n),process.stdout.write("\n"))}function gt(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}function yt(e,t,n){if("oxlint"===e.preferredLinter)return tt(["YARN","oxlint","--no-error-on-unmatched-pattern",...t.quiet?["--quiet"]:[],...t.fix?["--fix"]:[],...n??["."]])}function wt(e){return tt(["YARN","oxfmt","--write","--no-error-on-unmatched-pattern",...e??["."],"!**/package.json"])}function bt(e){const t=e&&e.length>0?e:["."];return[tt(["poetry","run","isort","--profile","black","--filter-files",...t]),tt(["poetry","run","black",...t])].join(" && ")}function vt(e,t){const n=t&&t.length>0?t:["."];return tt(["poetry","run","flake8",...e.quiet?["-q"]:[],...n])}function kt(e){return tt(["dart","format",...e&&e.length>0?e:["."]])}function St(e){return tt(["dart","analyze",...e&&e.length>0?e:["."]])}function Et(e,t,n,r){return"directory"===n&&e.hasOxfmt?[t]:"directory"===n&&Rt(e)?[t,dt]:function(e,t){return e.hasOxfmt?it.has(t):!!Rt(e)||ct.has(t)}(e,r)?[t]:[]}function Pt(e){return t.join(e,`**/{.*/,}*.{${[...ct].join(",")}}`)}function At(e,n,r){return"directory"!==r?[]:e.filter(e=>e.packageJsonPath===t.join(n,"package.json")||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath)}function xt(e,t,n){if("directory"===n){const n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}const r=function(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}(e,t);return r?[{lintPath:t,project:r}]:[]}function $t(e){return rt.has(e)||ot.has(e)||st.has(e)}function jt(e,t){return"oxlint"===e.preferredLinter&&rt.has(t)}function Rt(e){return!e.hasOxfmt&&"oxlint"===e.preferredLinter}const Ot=new Set;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 _("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 _("docker",["rm","-f",...n],{cwd:t.dirPath,env:t.env})}catch{}}(["--filter",`publish=${e}`],t)}(e,t);try{await g(e)}catch{}}async function Nt(e,t){const n=Number(e);if(!n)throw new Error(`The given port (${n}) is invalid.`);return await async function(e,t){await It(e)||await Dt(e,t);const n=async()=>{Ot.has(e)||(Ot.add(e),await Dt(e,t))};for(const e of["beforeExit","SIGINT","SIGTERM","SIGQUIT"])process.on(e,n)}(n,t),n}async function It(e){for(const t of["127.0.0.1","::"]){if(!await Tt(t,e))return!1}return!0}async function Tt(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 _t={};function Ct(e,t){return String.raw`
10
10
  import fs from 'node:fs';
11
11
  import http from 'node:http';
12
12
 
@@ -32,5 +32,5 @@ server.on('error', () => {
32
32
  server.listen(${e}, '0.0.0.0', () => {
33
33
  fs.writeFileSync(pidPath, String(process.pid) + '\n');
34
34
  });
35
- `}const Ft={command:"maintenance <action>",describe:"Start or stop a lightweight maintenance page server. Example: wb maintenance start",builder:e=>e.positional("action",{choices:["start","stop"],describe:"Maintenance server action",type:"string"}).options(_t),async handler(n){const r=ae(n);r||(console.error(d.red("No project found.")),process.exit(1));const s=n.action;if("test"===r.env.WB_ENV)return void console.info(`Skip maintenance ${s} because WB_ENV is test.`);const i=function(e){const t=Number(e);return w.ok(Number.isInteger(t)&&t>0,`PORT environment variable is invalid: ${e}`),t}(r.env.PORT);if("start"!==s){if("stop"!==s)throw new Error(`Unknown maintenance action: ${s}`);!function(e,t){const n=Bt(e,t),r=zt(n);if(void 0===r)return void console.info(`Maintenance server is not running on port ${t}.`);try{process.kill(r,"SIGTERM")}catch{}Lt(n),console.info(`Stopped maintenance server on port ${t}.`)}(r,i)}else await async function(n,r){const s=Bt(n,r),i=zt(s);if(void 0!==i&&Mt(i))return void console.info(`Maintenance server is already running on port ${r}.`);Lt(s),await It(r)||(console.error(d.red(`Port ${r} is already in use.`)),process.exit(1));e.mkdirSync(t.dirname(s),{recursive:!0});const a=o.spawn(process.execPath,["--input-type=module","--eval",Ct(r,s)],{detached:!0,env:n.env,stdio:"ignore"});if(void 0===a.pid)throw new Error("Failed to start maintenance server.");a.unref(),await async function(e,t){const n=Date.now()+5e3;for(;Date.now()<n;){if(void 0!==zt(e))return;if(!Mt(t))break;await b(50)}throw Lt(e),new Error("Failed to start maintenance server.")}(s,a.pid),console.info(`Started maintenance server on port ${r}.`)}(r,i)}};function Bt(e,n){return t.join(e.rootDirPath,".tmp",`wb-maintenance-server-${n}.pid`)}function zt(t){try{const n=Number(e.readFileSync(t,"utf8").trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function Mt(e){try{return process.kill(e,0),!0}catch{return!1}}function Lt(t){try{e.rmSync(t,{force:!0})}catch{}}function*Wt(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Ut=["@willbooster/wb","build-ts"],Jt={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 de(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of Wt("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(Vt(n,r),Gt(r),qt(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.outside&&await Yt(t.join(i,"bash"))}n.dryRun||n.outside||(o.spawnSync(he,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};async function Yt(n){const r=function(){let n=t.dirname(k(import.meta.url));for(;;){const r=t.join(n,"docker","bash");if(e.existsSync(r))return r;const o=t.dirname(n);if(o===n)throw new Error("Docker shell scripts directory not found.");n=o}}();await e.promises.mkdir(n,{recursive:!0});for(const o of await e.promises.readdir(r,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(".sh"))continue;const s=t.join(n,o.name);await e.promises.copyFile(t.join(r,o.name),s),await e.promises.chmod(s,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function Vt(e,t){!function(e){const t=e.devDependencies??{},n=e.dependencies??{},r=[];for(const e of Ut){const o=t[e];o&&(n[e]||(n[e]=o,r.push(e)),delete t[e])}r.length>0&&(e.dependencies=n);console.info("Promoted runtime devDependencies:",r.join(", ")||"none")}(t),e.outside?function(e){const t=e.devDependencies??{},n=["artillery","concurrently","conventional-changelog-conventionalcommits","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],r=[];for(const e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete t[e],r.push(e));console.info("Removed devDependencies:",r.join(", ")||"none")}(t):(delete t.devDependencies,console.info("Removed all devDependencies."))}function Gt(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 qt(e){delete e.private,delete e.publishConfig,delete e.prettier}const Kt="file:";function Ht(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(Kt))return;const n=t.slice(5).replace(/[?#].*$/,"");if(!n)return;return n}(e);if(!n)return;const r=t.isAbsolute(n)?n:t.resolve(e.dirPath,n);return`rm -f "${r}" "${r}-wal" "${r}-shm"`}const Qt=new class{reset(e,t=""){const n=Ht(e);return n?`${n} && ${this.migrate(e,t)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}migrate(e,t=""){const n=this.seed(e),r=this.deploy(e,t);return"true"===n?r:`${r} && ${n}`}migrateForStart(e,t=""){return ce(e,"test")&&Ht(e)?this.reset(e,t):this.migrate(e,t)}deploy(e,t=""){return`YARN drizzle-kit migrate ${t}`}generate(e,t=""){return`YARN drizzle-kit generate ${t}`}migrateDev(e,t=""){return this.generate(e,t)}seed(e,t){return t?`BUN build-ts run ${t}`:e.packageJson.scripts?.seed?"YARN run seed":"true"}studio(e,t,n=""){return t?"echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1":`YARN drizzle-kit studio ${n}`}},Zt={},Xt={command:"prisma",aliases:["db"],describe:"Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(en).command(tn).command(nn).command(rn).command(on).command(sn).command(an).command(ln).command(un).command(pn).command(fn).command(hn).command(mn).demandCommand().strict(!1),handler(){}},en={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:Zt,async handler(e){const t=await yn(e,"prisma");for(const{project:n}of bn("prisma cleanup-litestream",t))await Ae(Ke.cleanUpLitestream(n),n,e)}},tn={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Zt,async handler(e){const t=await yn(e,"prisma");for(const{project:e}of bn("prisma create-litestream-config",t))gn(e)}},nn={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Zt,async handler(e){const t=await yn(e),n=vn(e);for(const{orm:r,project:o}of bn("db deploy",t))await Ae(wn(r).deploy(o,n),o,e)}},rn={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Zt,async handler(e){const t=await yn(e,"prisma");for(const{project:n}of bn("prisma deploy-force",t))await Ae(Ke.deployForce(n),n,e)}},on={command:"generate",describe:"Generate ORM client code",builder:Zt,async handler(e){const t=await yn(e),n=vn(e);for(const{orm:r,project:o}of bn("db generate",t))await Ae(wn(r).generate(o,n),o,e)}},sn={command:"list-backups",describe:"List Litestream backups",builder:Zt,async handler(e){const t=await yn(e,"prisma");for(const{project:n}of bn("prisma list-backups",t))await Ae(Ke.listBackups(n),n,e)}},an={command:"migrate",describe:"Apply migration to DB with initializing it",builder:{...Zt,"check-idempotency":{description:"Run the migration command twice to confirm it is idempotent.",type:"boolean"}},async handler(e){const t=await yn(e),n=vn(e,["check-idempotency"]);for(const{orm:r,project:o}of bn("db migrate",t)){const t=wn(r);await Ae(t.migrate(o,n),o,e),cn(o,e.checkIdempotency)&&(dn(o)?console.info(d.yellow(`Skipping idempotency check for ${o.name} in production environment.`)):await Ae(t.deploy(o,n),o,e))}}};function cn(e,t){return t??function(e){return!!e.env.WB_DOCKER&&"0"!==e.env.WB_DOCKER&&"false"!==e.env.WB_DOCKER}(e)}function dn(e){return ce(e,"production")}const ln={command:"migrate-dev",describe:"Create a migration file",builder:Zt,async handler(e){const t=await yn(e),n=vn(e);for(const{orm:r,project:o}of bn("db migrate-dev",t))await Ae(wn(r).migrateDev(o,n),o,e)}},un={command:"reset",describe:"Reset DB",builder:Zt,async handler(e){const t=await yn(e),n=vn(e);for(const{orm:r,project:o}of bn("db reset",t))await Ae(wn(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of bn("WB_ENV=test db reset",await yn(e)))await Ae(wn(t).reset(r,n),r,e)}}},pn={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Zt,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await yn(e,"prisma");for(const{project:n}of bn("prisma restore",t)){const t=e.output??(n.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3");await Ae(Ke.restore(n,t),n,e)}}},fn={command:"seed",describe:"Populate DB with seed data",builder:{...Zt,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await yn(e);for(const{orm:n,project:r}of bn("db seed",t))await Ae(wn(n).seed(r,e.file),r,e)}},hn={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...Zt,"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 yn(e),n=vn(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of bn("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await Ae(wn(r).studio(o,t,n),o,e)}}},mn={command:"$0 <args..>",describe:"Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await yn(e),n=[(e.args?.join(" ")??"").trimEnd(),vn(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of bn(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await Ae(t,o,e)}}};function gn(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}`,{cause:e})}}async function yn(e,t){const n=await de(e);n||(console.error(d.red("No project found.")),process.exit(1));const r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!(!e||t&&e.orm!==t));return 0===r.length&&(console.error(d.red(t?`No ${t} project found.`:"No supported database ORM project found.")),process.exit(1)),r}function wn(e){return"prisma"===e?Ke:Qt}function*bn(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of Wt(e,t.map(({project:e})=>e))){const e=n.get(r);if(!e)throw new Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function vn(e,t=[]){const n=[],r=Object.keys(De),o=Object.values(De).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))}const i=Array.isArray(e["--"])?e["--"].map(String):[];return tt([...n,...i])}const kn={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=ae(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let o=0;o<e.retry;o++)if(o>0&&console.info(`\n${d.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await Ae(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},Sn={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await de(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of Wt("setup",n.descendants)){const r=await y.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await Pe(`brew install ${n.join(" ")}`,t,e)}r.some(e=>e.isFile()&&e.name.includes("-version"))&&await Ae("asdf install",t,e,{exitIfFailed:!1})}if(r.some(e=>e.isFile()&&"pyproject.toml"===e.name)){await Pe("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await Pe(`poetry env use ${n}`,t,e),await Se.promiseAll(),await Ae("poetry run pip install --upgrade pip",t,e),await Ae("poetry install --ansi",t,e)}t!==n.root&&n.root.packageJson.scripts?.["gen-code"]||!t.packageJson.scripts?.["gen-code"]||await Ae(`${me} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await Ae(`${me} playwright install --with-deps`,r,e)}(e)}};function En(e){return e.silent?" > /dev/null":""}const An=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"",o=e.env.MISE_AGE_KEY?"\n --secret id=mise_age_key,env=MISE_AGE_KEY":"";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}${o} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(Ot.has(e))return;Ot.add(e),$e(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});je(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 ":""}${e.env.MISE_AGE_KEY?"--env MISE_AGE_KEY ":""}--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 Pn{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return An.buildImage(e,t)}async startDev(e,t){return await Nt(e.env.PORT,e),this.shouldWaitAndOpenApp?tt(["YARN","wb","concurrently",...Ne(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Nt(e.env.PORT,e),this.shouldWaitAndOpenApp?tt(["YARN","wb","concurrently",...Ne(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Nt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Nt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${tt(["YARN","wb","concurrently",...Ne(t),"--kill-others-on-fail",An.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${An.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("scripts/start-production.sh")}catch{return}}(e);if(n)return this.buildProductionCommand(e,t,[e.buildCommand,`${tt(["bash",n])} ${t.normalizedArgsText??""}`.trim()]);const r=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),o=r?[e.buildCommand,`pm2-runtime start --no-autorestart ${r}`]:this.buildDefaultProductionStartCommands(e,t);return this.buildProductionCommand(e,t,o)}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`${e.isBunAvailable?"bun":"node"} dist/index.js ${t.normalizedArgsText??""}`.trim()]}buildProductionCommand(e,t,n){return[...[...e.hasPrisma?[Ke.migrate(e)]:[],...e.hasDrizzle?[Qt.migrateForStart(e)]:[]].flatMap(e=>e.split("&&")),...n].filter(Boolean).map(e=>`${e} ${En(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,An.stopAndStart(e),n)}async testStart(e,t){return await Nt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${nt(r)}`} ${tt(["YARN","wb","concurrently",...Ne(t),"--kill-others","--success","first",this.startDevProtected(e,t),this.waitApp(e)])}`;var n,r}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:o=["test","test/e2e/"]}){const s=await Nt(e.env.PORT,e),i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=function(e,t,n,r=[]){const o=["BUN","playwright"],s=t?.map(String);if("test"!==e[0]||!s?.length)return xn([...o,...e,...r],n);const i=e.slice(1),a=$n(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return xn([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:tt(["YARN","wb","concurrently",...Ne(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${a}${i}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?tt(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?tt(["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 xn(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="))?tt(e):tt([...e,"--max-failures=1"]):tt(e)}function $n(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;jn.has(o)?t="required":Rn.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&On.has(e)&&(t="required");continue}n.push(r)}}return n}const jn=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"]),Rn=new Set(["--only-changed","--update-snapshots","--update-source-method"]),On=new Set(["-c","-g","-j"]);const Dn=new class extends Pn{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const Nn=new class extends Pn{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 Nt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String),a=i?.length?i:["test/e2e/"],c=this.testUnit(e,{...t,targets:a});return tt(["YARN","wb","concurrently",...Ne(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o} && ${c}${s}`])}};const In=new class extends Pn{constructor(){super(!0)}startDevProtected(e,t){return`YARN next dev --turbopack ${t.normalizedArgsText??""}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??""}`.trim()]}};const Tn=new class extends Pn{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} && ${fe} 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")} && ${An.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 _n=new class extends Pn{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const Cn=new class extends Pn{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()}},Fn=["express","fastify","elysia","hono"],Bn={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"}},zn={command:"start [args..]",describe:"Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0",builder:e=>e.parserConfiguration({"populate--":!0}).options(Bn),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>nt(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>nt(String(e))).join(" ")}(e);const t=await de(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=Dn;else if(t.next)o=In;else if(r["@remix-run/dev"])o=_n;else if(r.vite)o=Cn;else if(Fn.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=Nn;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=Tn}switch(console.info(`Running "start" for ${n.name} ...`),e.mode??"dev"){case"dev":case"development":process.env.WB_ENV||="development",await Ae(await o.startDev(n,e),n,e);break;case"staging":process.env.WB_ENV||="staging",await Ae(await o.startProduction(n,e),n,e);break;case"docker":process.env.WB_ENV||="staging",await Ae(await o.startDocker(n,e),n,e);break;case"docker-debug":process.env.WB_ENV||="staging",e.normalizedArgsText="'/bin/bash'",await Ae(await o.startDocker(n,e),n,e);break;case"test":{process.env.WB_ENV||="test";const t=await o.startTest(n,e);await Ae(t,n,e);break}default:throw new Error(`Unknown start mode: ${e.mode}`)}}}},Mn=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g"),Ln={e2e:{description:"How to run E2E tests",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"}},Wn={array:!0,description:"Unit or E2E test target paths",type:"string"},Un={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'",builder:e=>e.parserConfiguration({"populate--":!0}).options(Ln).positional("targets",Wn),async handler(e){process.exit(await Jn(e))}};async function Jn(n,r={}){const o=function(e){if(e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||!1===e.autoCascadeEnv)return e;return{...e,cascadeEnv:"test"}}(n),s=await de(o);if(!s)return console.error(d.red("No project found.")),1;const i=o.targets??[],a=o["--"]??[],{shouldRunE2e:c,shouldRunUnit:l}=function(e,t=[]){const n=e.some(e=>e.includes("/e2e")),r=e.some(e=>e.includes("/unit")),o=0===e.length&&0===t.length;return{shouldRunUnit:o||r,shouldRunE2e:o||n||t.length>0}}(i,a);for(const n of s.descendants){n.env.WB_ENV||="test";const s=n.packageJson.dependencies??{},d=n.packageJson.devDependencies??{};let u;u=s.blitz?Dn:s.next?In:d["@remix-run/dev"]?_n:d.vite?Cn:Fn.some(e=>s[e])&&!s["firebase-functions"]?Nn:Tn,console.info(`Running "test" for ${n.name} ...`);const p=Yn(n);if(l&&!1!==p){const e=i.filter(e=>e.includes("/unit")),t=e.length>0?e:p.length>0?p:void 0,s={...o,targets:t},a=await qn(u.testUnit(n,s),n,o,{exitIfFailed:r.exitIfFailed,timeout:o.unitTimeout});if(0!==a)return a}if(!c||!e.existsSync(t.join(n.dirPath,"test","e2e")))continue;const f=i.filter(e=>e.includes("/e2e")),h={...o,targets:f.length>0?f:void 0};switch(o.e2e){case"headless":{const e=await Gn(await u.testE2EProduction(n,h,{playwrightArgs:Xn(f,a),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"headless-dev":{const e=await Gn(await u.testE2EDev(n,h,{playwrightArgs:Xn(f,a),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"docker":{const e=await Vn(n,h,u,Xn(f,a),a,r);if(0!==e)return e;continue}case"docker-debug":{const e=await Vn(n,h,u,Xn(f,a,["--debug"]),a,r);if(0!==e)return e;continue}}if(s.blitz||s.next||d["@remix-run/dev"]||d.vite)switch(o.e2e){case"headed":{const e=await Gn(await u.testE2EProduction(n,h,{playwrightArgs:Xn(f,a,["--headed"]),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"headed-dev":{const e=await Gn(await u.testE2EDev(n,h,{playwrightArgs:Xn(f,a,["--headed"]),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"debug":{const e=await Gn(await u.testE2EProduction(n,h,{playwrightArgs:Xn(f,a,["--debug"]),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"generate":{const e=await Gn(await u.testE2EProduction(n,h,{playwrightArgs:["codegen",`http://localhost:${n.env.PORT}`]}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"trace":{const e=await Gn("BUN playwright show-trace",n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}}}return 0}function Yn(n){return e.existsSync(t.join(n.dirPath,"test","unit"))?[]:!(!n.hasVitest||!e.existsSync(t.join(n.dirPath,"test")))&&(e.existsSync(t.join(n.dirPath,"test","e2e"))?["test","--exclude","test/e2e/**"]:["test"])}async function Vn(e,t,n,r,o,s={}){e.env.WB_DOCKER||="1";const i=await Ae(`${n.buildDocker(e,"test")}${En(t)}`,e,t,{exitIfFailed:s.exitIfFailed});if(0!==i)return i;const a=await Gn(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),c=await Ae(An.stop(e),e,t,{exitIfFailed:s.exitIfFailed});return 0!==a?a:c}function Gn(e,t,n,r={}){return Ae(e,t,n,{...r,processSilentOutput:Kn})}function qn(e,t,n,r={}){return Ae(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:"Unit tests passed."})}function Kn(e){const t=[],n=new Set,r=[];for(const o of function*(e){let t=0;for(;t<=e.length;){const n=e.indexOf("\n",t);if(-1===n)return void(yield e.slice(t));yield e.slice(t,n),t=n+1}}(e)){const e=Qn(o);n.has(e)||(t.some(t=>Zn(t,e))||(Hn(t,n,e),r.push(o)))}return r.join("\n")}function Hn(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;const r=e.shift();void 0!==r&&t.delete(r)}function Qn(e){return e.replaceAll(Mn,"").trim().replaceAll(/^(?:\[[^\]]+\]\s*)+/g,"").replaceAll(/\(node:\d+\)/g,"(node:<number>)").replaceAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?\b/g,"<timestamp>").replaceAll(/([?&]cache=)\d+/g,"$1<number>")}function Zn(e,t){const n=Math.max(e.length,t.length);return 0===n||!(Math.abs(e.length-t.length)>.05*n)&&S(e,t)/n<=.05}function Xn(e,t=[],n=[]){const r=$n(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const er={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 de(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of r.descendants){o.env.CI||="1",o.env.WB_ENV||="test";const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;i=r.blitz?Dn:r.next?In:s["@remix-run/dev"]?_n:s.vite?Cn:Fn.some(e=>r[e])&&!r["firebase-functions"]?Nn:Tn,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await Pe(An.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await Pe(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await Pe(await i.testStart(o,n),o,n),await Se.promiseAll(),a&&(o.env.WB_DOCKER||="1",await Ae(`${i.buildDocker(o,"test")}${En(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await Ae(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await Ae(An.stop(o),o,n)}}}(n)}};const tr={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}`);O(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},nr={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){process.exit(await async function(n){const r=await de(n,!1);if(!r)return console.error(d.red("No project found.")),1;let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces&&!s.hasSourceCode||i.push(...function(e){if(e.hasOwnDependency("@typescript/native-preview"))return["BUN tsgo --noEmit"];if(e.hasOwnDependency("typescript"))return["BUN tsc --noEmit"];return[]}(s)),!s.packageJson.workspaces&&s.hasOwnDependency("pyright")&&i.push("YARN pyright");i.length>0;){const a=await Pe(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,preserveColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found."));return a}(n))}};const rr={...nr,command:"tc"},or={command:"verify",describe:"Verify project code",builder:{full:{type:"boolean",default:!1,describe:"Run tests after verifying project code"}},async handler(n){const r=le(n,!1);r||(console.error(d.red("No project found.")),process.exit(1)),await(n.full?async function(n,r){const o=function(n){const r=Date.now(),o=t.join(n.dirPath,".wb");e.mkdirSync(o,{recursive:!0});const s=t.join(o,"verify-full.log"),i=e.openSync(s,"w"),a=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr);let l=!1,u=!1;process.stdout.write=ar(process.stdout.fd,i),process.stderr.write=ar(process.stderr.fd,i),console.info(d.cyan(d.bold("Full log:"),s));const p=()=>{if(u)return;u=!0,process.stdout.write=a,process.stderr.write=c;const t=function(e){const t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;if(0===n)return`${r}s`;return`${n}m ${r}s`}(Date.now()-r),n=`${l?"Succeeded":"Failed"} in ${t}. Full log: ${s}\n`,o=l?d.green(n):d.red(n);a(o),e.writeSync(i,n),e.closeSync(i)};return process.once("exit",p),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener("exit",p),p()},succeed:()=>{l=!0}}}(n);try{await sr(n,r),await async function(e,t){const n={...t,_:["test"],e2e:"headless",silent:!0},r=await Jn(n,{exitIfFailed:!1});if(0===r)return;e.packageJson.scripts?.["db-reset"]||(console.info(d.red(d.bold(`Failed (exit code ${r}):`),"test")),process.exit(r));console.info(d.yellow('Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.')),await ir(`${he} db-reset`,e,t,{printRawOutput:!0});const o=await Jn(n,{exitIfFailed:!1});0!==o&&(console.info(d.red(d.bold(`Failed (exit code ${o}):`),"test after db-reset retry")),process.exit(o));console.info(d.green("Tests passed after db-reset retry."))}(n,r),o.succeed()}catch(e){throw o.fail(e),e}finally{o.finish()}}(r.self,n):sr(r.self,n))}};async function sr(e,t){await ir(`${he} install`,e,t),e.packageJson.scripts?.["gen-code"]&&await ir(`${he} gen-code`,e,t),await async function(e,t,n={}){n.silent||console.info("\n"+d.cyan(d.bold("Start:"),e));const r=await t()??0;0===r||n.allowFailure?n.silent||console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${r}):`),e)),process.exit(r));return r}("cleanup",()=>ut({...t,_:["lint"],fix:!0,format:!0,printAllOutput:!0,quiet:!0,silent:!0}),{silent:!0})}async function ir(e,t,n,r={}){if(function(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}(e,t.dirPath),n.dryRun)return 0;const o=await _(e,void 0,{cwd:t.dirPath,env:Re(t.env,{preserveColor:!1}),shell:!0,stdio:"pipe",mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),s=o.status??1;return r.printRawOutput||function(e,t,n){if(0===t&&(e===`${he} install`||e===`${he} gen-code`))return void console.info(d.green("Succeeded."));const r=n.trim();r&&(process.stdout.write(r),process.stdout.write("\n"))}(e,s,o.stdout),0===s||r.allowFailure||(console.info(d.red(d.bold(`Failed (exit code ${s}):`),e)),process.exit(s)),s}function ar(t,n){return(r,o,s)=>{const i="string"==typeof r?Buffer.from(r,"string"==typeof o?o:"utf8"):r;return e.writeSync(n,i),e.writeSync(t,i),"function"==typeof o&&o(),s?.(),!0}}await n(r(process.argv)).scriptName("wb").options(De).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(or).command(ge).command(Te).command(He).command(Xe).command(lt).command(Ft).command(Jt).command(Xt).command(kn).command(Sn).command(zn).command(Un).command(er).command(tr).command(nr).command(rr).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 cr=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!cr){cr=!0;try{O(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
36
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvZ2VuQ29kZS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy91dGlscy9wb3J0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL21haW50ZW5hbmNlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ZlcmlmeUNvZGUudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gICdxdWlldC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdXBwcmVzcyAuZW52IGZpbGUgbG9hZGluZyBpbmZvcm1hdGlvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtlbnZQYXRoLCBrZXlzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQgJiYga2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtrZXlzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWlzZUVudlZhcnMsIG1pc2VFbnZWYXJOYW1lc10gPSByZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwgZW52VmFycyk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgbWlzZUVudlZhcnMpO1xuICBpZiAobWlzZUVudlZhck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbbWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKSwgbWlzZUVudlZhck5hbWVzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke21pc2VFbnZWYXJOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7bWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IGZpbGVzOiAke2VudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5tYXAoKFtlbnZQYXRoLCBrZXlzXSkgPT4gKGtleXMubGVuZ3RoID4gMCA/IGAke2VudlBhdGh9ICgke2tleXMuam9pbignLCAnKX0pYCA6IGVudlBhdGgpKS5qb2luKCcsICcpIHx8ICdub3RoaW5nJ31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkpO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtleHBhbmQoeyBwYXJzZWQ6IGVudlZhcnMsIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyBlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzKFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjdXJyZW50RW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIHN0cmluZ1tdXSB7XG4gIGlmICghaGFzUHJvamVjdE1pc2VDb25maWcoY3dkKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGNvbnN0IGFyZ3MgPSBbJ2VudicsICctLWpzb24nLCAnLS1jZCcsIGN3ZF07XG4gIGlmIChjYXNjYWRlKSB7XG4gICAgYXJncy5wdXNoKCctLWVudicsIGNhc2NhZGUpO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ21pc2UnLCBhcmdzLCB7XG4gICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gIH0pO1xuICBpZiAocmVzdWx0LmVycm9yIHx8IHJlc3VsdC5zdGF0dXMgIT09IDAgfHwgIXJlc3VsdC5zdGRvdXQ/LnRyaW0oKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXN1bHQuc3Rkb3V0KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFt7fSwgW11dO1xuICB9XG4gIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICBpZiAoa2V5IGluIGN1cnJlbnRFbnZWYXJzIHx8IHByb2Nlc3MuZW52W2tleV0gPT09IHZhbHVlKSBjb250aW51ZTtcbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QpOyA7IGN1cnJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ21pc2UudG9tbCcpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5taXNlLnRvbWwnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYG1pc2UgZW52IC0tZW52ICR7Y2FzY2FkZX1gIDogJ21pc2UgZW52Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCBvdXRwdXRPcHRpb25zID0gYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBxdWlldEVudj86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfTtcbiAgcmV0dXJuIG91dHB1dE9wdGlvbnMucXVpZXRFbnYgPT09IHRydWUgfHwgKG91dHB1dE9wdGlvbnMucXVpZXRFbnYgIT09IGZhbHNlICYmIG91dHB1dE9wdGlvbnMuc2lsZW50ID09PSB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5pbXBvcnQgeyBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAsIGNvbGxlY3REZXNjZW5kYW50UGlkcyBhcyBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIH0gZnJvbSAnLi9wcm9jZXNzVHJlZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlS2lsbChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGlkKSB8fCBwaWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwaWQ6ICR7cGlkfWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBraWxsVHJlZU9uV2luZG93cyhwaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlc2NlbmRhbnRzID0gY29sbGVjdERlc2NlbmRhbnRQaWRzKHBpZCk7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZCwgZGVzY2VuZGFudHMpO1xuICBmb3IgKGNvbnN0IHRhcmdldFBpZCBvZiB0YXJnZXRQaWRzKSB7XG4gICAga2lsbElmTmVlZGVkKHRhcmdldFBpZCwgc2lnbmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsSWZOZWVkZWQocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBzaWduYWwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFRyZWVPbldpbmRvd3MocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBydW5Db21tYW5kKCd0YXNra2lsbCcsIFsnL1BJRCcsIFN0cmluZyhwaWQpLCAnL1QnLCAnL0YnXSwge1xuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gcnVuQ29tbWFuZChcbiAgICAncHMnLFxuICAgIFsnLUFvJywgJ3BpZD0scHBpZD0nXSxcbiAgICAvLyBLZWVwIGNvbW1hbmQgYm91bmRlZCBzbyB3YXRjaC1tb2RlIGtpbGwgbG9vcHMgY2Fubm90IGhhbmcgdGhpcyBwYXRoLlxuICAgIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCwgdGltZW91dDogMjAwMCB9XG4gICk7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAoc3Rkb3V0KTtcbiAgcmV0dXJuIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAocm9vdFBpZCwgY2hpbGRyZW5CeVBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkOiBudW1iZXIsIGRlc2NlbmRhbnRzOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IGRlc2NlbmRhbnRzLnRvUmV2ZXJzZWQoKTtcbiAgdGFyZ2V0UGlkcy5wdXNoKHBpZCk7XG4gIHJldHVybiB0YXJnZXRQaWRzO1xufVxuXG5mdW5jdGlvbiBydW5Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogeyB0aW1lb3V0OiBudW1iZXI7IG1heEJ1ZmZlcjogbnVtYmVyIH1cbik6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYyhjb21tYW5kLCBbLi4uYXJnc10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IG9wdGlvbnM/Lm1heEJ1ZmZlcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnI6ICcnIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3Qgc3RkZXJyID0gZXh0cmFjdFN0ZGVycihlcnJvcik7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRFeGVjdXRpb25FcnJvcihjb21tYW5kLCBhcmdzLCBzdGRlcnIsIHRvRXhpdENvZGUoZXJyb3IpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIC9ubyBzdWNoIHByb2Nlc3N8bm90IGZvdW5kfG5vdCByZWNvZ25pemVkfHRoZXJlIGlzIG5vIHJ1bm5pbmcgaW5zdGFuY2UvaS50ZXN0KGVycm9yLnN0ZGVycik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0b0V4aXRDb2RlKGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ3N0YXR1cycgaW4gZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM6IHVua25vd24gfSkuc3RhdHVzO1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0ZGVycihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8IGVycm9yID09PSBudWxsIHx8ICEoJ3N0ZGVycicgaW4gZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc3RkZXJyID0gKGVycm9yIGFzIFJlY29yZDwnc3RkZXJyJywgdW5rbm93bj4pLnN0ZGVycjtcbiAgaWYgKHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ZGVycjtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0ZGVycikpIHtcbiAgICByZXR1cm4gc3RkZXJyLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgc3RkZXJyOiBzdHJpbmcsIGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKGBDb21tYW5kIGZhaWxlZDogJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRoaXMubmFtZSA9ICdDb21tYW5kRXhlY3V0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RkZXJyID0gc3RkZXJyO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAocHNPdXRwdXQ6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcltdPiB7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBwc091dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKVxccyokLy5leGVjKGxpbmUpO1xuICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRQaWQgPSBOdW1iZXIobWF0Y2hlZFsxXSk7XG4gICAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyKG1hdGNoZWRbMl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50UGlkKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRQaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnRQaWQsIFtjaGlsZFBpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5CeVBhcmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIsIGNoaWxkcmVuQnlQYXJlbnQ6IE1hcDxudW1iZXIsIG51bWJlcltdPik6IG51bWJlcltdIHtcbiAgY29uc3QgZGVzY2VuZGFudHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHF1ZXVlID0gWy4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChyb290UGlkKSA/PyBbXSldO1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBwaWQgPSBxdWV1ZVtpbmRleF0gYXMgbnVtYmVyO1xuICAgIGluZGV4ICs9IDE7XG4gICAgZGVzY2VuZGFudHMucHVzaChwaWQpO1xuICAgIHF1ZXVlLnB1c2goLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBpZCkgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gZGVzY2VuZGFudHM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+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+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFjaUVudiAmJiBjaUVudiAhPT0gJzAnICYmIGNpRW52ICE9PSAnZmFsc2UnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi91dGlscy9jaS5qcyc7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlT3JtID0gJ3ByaXNtYScgfCAnZHJpenpsZSc7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmd2OiBFbnZSZWFkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRFbnY6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aEJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlyUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpclBhdGg6IHN0cmluZywgYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICB0aGlzLmxvYWRFbnYgPSBsb2FkRW52O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGlzQnVuQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0J1blRvb2xWZXJzaW9uKCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLnVzZXNCdW5QYWNrYWdlTWFuYWdlcjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCB1c2VzQnVuUGFja2FnZU1hbmFnZXIoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFzQnVuTG9ja2ZpbGUoKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuaGFzQnVuUGFja2FnZU1hbmFnZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuVG9vbFZlcnNpb24oKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0J1bkxvY2tmaWxlKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHJlbHkgb24gdGhlIGxvY2tmaWxlIG9yIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIGluc3RlYWQgb2YgbWlzZS5cbiAgICAvLyBEb2NrZXIgb3B0aW1pemF0aW9uIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2IuXG4gICAgcmV0dXJuIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10uc29tZSgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsIGZpbGVOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHRoaXMucm9vdFBhY2thZ2VKc29uPy5wYWNrYWdlTWFuYWdlciA/PyB0aGlzLnBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyO1xuICAgIHJldHVybiB0eXBlb2YgcGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnICYmIHBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ2J1bkAnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBpZiAoIXNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQodGhpcy5hcmd2KSkge1xuICAgICAgZm9yIChjb25zdCBbZW52UGF0aCwgY291bnRdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmVudlZhcnMgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdwcmlzbWEnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEcml6emxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ2RyaXp6bGUtb3JtJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZGF0YWJhc2VPcm0oKTogRGF0YWJhc2VPcm0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc1ByaXNtYSkgcmV0dXJuICdwcmlzbWEnO1xuICAgIGlmICh0aGlzLmhhc0RyaXp6bGUpIHJldHVybiAnZHJpenpsZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hsaW50Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hmbXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hmbXQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmV0dGllcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdwcmV0dGllcicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BvZXRyeUxvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwb2V0cnkubG9jaycpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHVic3BlY1lhbWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSB8fFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGhhc0RlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpID8/IHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5yb290UGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm47XG5cbiAgICByZXR1cm4gKFxuICAgICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJvb3RQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucm9vdERpclBhdGggPT09IHRoaXMuZGlyUGF0aCkgcmV0dXJuIHRoaXMucGFja2FnZUpzb247XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbd2JdIEZhaWxlZCB0byByZWFkIG9yIHBhcnNlICR7cGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKX1gLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9qZWN0LmVudi5XQl9FTlYgPT09IG5hbWUgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlYgPT09IG5hbWU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkQ29tbWFuZCA9XG4gICAgYXJndi5jb21tYW5kID8/XG4gICAgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBvbWl0U2lsZW50U3RhcnQ/OiBib29sZWFuO1xuICBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbjtcbiAgcHJvY2Vzc1NpbGVudE91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcmludFJhd091dHB1dD86IGJvb2xlYW47XG4gIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seT86IGJvb2xlYW47XG4gIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc2lsZW50U3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUnVuUmVzdWx0IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgb3V0cHV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHsgc2lsZW50PzogYm9vbGVhbiB9LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKCEoYXJndi5zaWxlbnQgJiYgb3B0cy5vbWl0U2lsZW50U3RhcnQgJiYgIWFyZ3YuZHJ5UnVuKSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsIGFyZ3Yuc2lsZW50ID8gJ0NvbW1hbmQnIDogJ1N0YXJ0Jyk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgPSBCb29sZWFuKFxuICAgIGFyZ3Yuc2lsZW50ICYmIChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPz8gb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkpXG4gICk7XG4gIGxldCB3cm90ZVNpbGVudFByb2dyZXNzID0gZmFsc2U7XG4gIGNvbnN0IHByb2dyZXNzVGltZXIgPVxuICAgIGFyZ3Yuc2lsZW50ICYmIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLicpO1xuICAgICAgICAgIHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB9LCBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyAoYXJndi5zaWxlbnQgPyB0cnVlIDogdW5kZWZpbmVkKSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogYXJndi5zaWxlbnQgPyAncGlwZScgOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZzogYXJndi5zaWxlbnQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAocHJvZ3Jlc3NUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKHdyb3RlU2lsZW50UHJvZ3Jlc3MpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbiAgaWYgKHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgJiYgKCFvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSB8fCBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8gb3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0KHJldC5zdGRvdXQpIDogcmV0LnN0ZG91dCkudHJpbSgpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICB9XG4gIGlmIChhcmd2LnNpbGVudCAmJiBleGl0Q29kZSA9PT0gMCAmJiBvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpKTtcbiAgfVxuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIGV4aXRDb2RlLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCAmJiAhb3B0cy5wcmludFJhd091dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPEJ1ZmZlcmVkUnVuUmVzdWx0PiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICBvdXRwdXQ6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4aXRDb2RlOiByZXQuc3RhdHVzID8/IDEsXG4gICAgICBvdXRwdXQ6IHJldC5zdGRvdXQsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICBjb25zdCBwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVuID0gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgL1BSSVNNQSBnZW5lcmF0ZSg/IVxccystLW5vLWhpbnRzKSg/PVxcc3wkKS9ndSxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUnIDogJ1BSSVNNQSBnZW5lcmF0ZSAtLW5vLWhpbnRzJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gcnVuICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4gLS1idW4pIHJ1bmAuXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKFxuICAgIG5ld1NjcmlwdFxuICAgICAgLy8gS2VlcCBQbGF5d3JpZ2h0IGFzIGEgcGFja2FnZS1tYW5hZ2VyIGNvbW1hbmQgaW5zdGVhZCBvZiByZXNvbHZpbmcgaXQgdGhyb3VnaCBub2RlX21vZHVsZXMvLmJpbi5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoXG4gICAgICAgICdZQVJOICcsXG4gICAgICAgICFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYFxuICAgICAgKVxuICApO1xuICAvLyBBZGQgY2FzY2FkZSBvcHRpb24gd2hlbiBXQl9FTlYgaXMgZGVmaW5lZFxuICBjb25zdCBjYXNjYWRlT3B0aW9uID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYCAtYz0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz4sXG4gIHByaW50T3B0aW9uczogeyBzaWxlbnRTdWNjZXNzPzogYm9vbGVhbiB9ID0ge31cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBpZiAocHJpbnRPcHRpb25zLnNpbGVudFN1Y2Nlc3MpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBjb25maWd1cmVDb2xvckVudihuZXdFbnYsIG9wdHMucHJlc2VydmVDb2xvcik7XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBjaGlsZC1wcm9jZXNzIGNvbG9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igd2ItbWFuYWdlZCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIGVudiBUaGUgY2hpbGQtcHJvY2VzcyBlbnZpcm9ubWVudCB0byBtdXRhdGUuXG4gKiBAcGFyYW0gcHJlc2VydmVDb2xvciBXaGV0aGVyIHdiIHNob3VsZCBwcmVzZXJ2ZSBjb2xvcnMgZm9yIG91dHB1dCB0aGF0IGl0IGNhcHR1cmVzIGFuZCByZXByaW50cyB0byBhbiBpbnRlcmFjdGl2ZSBUVFkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVDb2xvckVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIHByZXNlcnZlQ29sb3I/OiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChlbnYuTk9fQ09MT1IgIT09IHVuZGVmaW5lZCB8fCBwcmVzZXJ2ZUNvbG9yID09PSBmYWxzZSkge1xuICAgIC8vIE5PX0NPTE9SIGFuZCBwcmVzZXJ2ZUNvbG9yPWZhbHNlIGFyZSBleHBsaWNpdCBuby1jb2xvciBjaG9pY2VzLCBzbyBpbmhlcml0ZWQgRk9SQ0VfQ09MT1IgbXVzdCBub3QgbGVhayB0aHJvdWdoLlxuICAgIGRlbGV0ZSBlbnYuRk9SQ0VfQ09MT1I7XG4gIH0gZWxzZSBpZiAocHJlc2VydmVDb2xvciAmJiBwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgIGVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgc2lsZW50PzogYm9vbGVhbiB9KS5zaWxlbnQgPT09IHRydWUgJiZcbiAgICBnZXRPcHRpb25WYWx1ZShhcmd2LCAncXVpZXQtZW52JykgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBhcmdzLnB1c2goJy0tcXVpZXQtZW52Jyk7XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IEZPUkNFX0tJTExfREVMQVlfTVMgPSA1MDAwO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAna2lsbC1vdGhlcnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZXhpdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2tpbGwtb3RoZXJzLW9uLWZhaWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZmFpbHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBjcml0ZXJpYScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhbGwnLCAnZmlyc3QnXSxcbiAgICBkZWZhdWx0OiAnYWxsJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdDb21tYW5kcyB0byBydW4gY29uY3VycmVudGx5JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMge1xuICBjb21tYW5kczogc3RyaW5nW107XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIGtpbGxPdGhlcnM6IGJvb2xlYW47XG4gIGtpbGxPdGhlcnNPbkZhaWw6IGJvb2xlYW47XG4gIHN1Y2Nlc3M6ICdhbGwnIHwgJ2ZpcnN0JztcbiAgY2k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmN1cnJlbnRseShvcHRpb25zOiBSdW5Db25jdXJyZW50bHlPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT5cbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduKG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBvcHRpb25zLnByb2plY3QpLnJ1bm5hYmxlLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMucHJvamVjdC5kaXJQYXRoLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihvcHRpb25zLnByb2plY3QuZW52LCB7IGNpOiBvcHRpb25zLmNpIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gICk7XG5cbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGxldCBpbnRlcnJ1cHRlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RvcFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JjZUtpbGxQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5mcm9tPG51bWJlciB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IGNoaWxkcmVuLmxlbmd0aCB9KTtcbiAgY29uc3Qgd2FpdEZvckV4aXRQcm9taXNlcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dGxlID0gKGV4aXRDb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBleGl0Q29kZTtcbiAgICAgICAgZmlyc3RSZXN1bHQgPz89IGV4aXRDb2RlO1xuXG4gICAgICAgIGlmICghc3RvcHBpbmcgJiYgc2hvdWxkU3RvcE90aGVycyhleGl0Q29kZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICBzdG9wUmVzdWx0ID0gZXhpdENvZGU7XG4gICAgICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sICdTSUdURVJNJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSA/PyB1bmRlZmluZWQsIHNpZ25hbCA/PyB1bmRlZmluZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBzdG9wQWxsID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICBpbnRlcnJ1cHRlZFNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuXG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIHNpZ25hbCkpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdpbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHSU5UJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3Rlcm0gPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHVEVSTScpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdxdWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1FVSVQnKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICBwcm9jZXNzLm9uKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvckV4aXRQcm9taXNlcyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZm9yY2VLaWxsUHJvbWlzZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgfVxuXG4gIGlmIChpbnRlcnJ1cHRlZFNpZ25hbCkge1xuICAgIHJldHVybiBnZXRFeGl0Q29kZSh1bmRlZmluZWQsIGludGVycnVwdGVkU2lnbmFsKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcpIHtcbiAgICByZXR1cm4gZmlyc3RSZXN1bHQgPz8gMTtcbiAgfVxuICBpZiAoc3RvcFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0b3BSZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGl0Q29kZShjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgaWYgKHNpZ25hbCAmJiBzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpIHtcbiAgICByZXR1cm4gMTI4ICsgY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3RvcE90aGVycyhcbiAgZXhpdENvZGU6IG51bWJlcixcbiAgb3B0aW9uczogUGljazxSdW5Db25jdXJyZW50bHlPcHRpb25zLCAna2lsbE90aGVycycgfCAna2lsbE90aGVyc09uRmFpbCcgfCAnc3VjY2Vzcyc+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0JyB8fCBvcHRpb25zLmtpbGxPdGhlcnMgfHwgKG9wdGlvbnMua2lsbE90aGVyc09uRmFpbCAmJiBleGl0Q29kZSAhPT0gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvcmNlS2lsbFBpZHMgPSBzaWduYWxQaWRzKHRvQ2hpbGRQaWRzKGNoaWxkcmVuKSwgc2lnbmFsKTtcbiAgaWYgKGZvcmNlS2lsbFBpZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgaWYgKGF3YWl0IHdhaXRGb3JGb3JjZUtpbGwoZm9yY2VLaWxsUGlkcykpIHtcbiAgICBzaWduYWxQaWRzKGZvcmNlS2lsbFBpZHMsICdTSUdLSUxMJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9DaGlsZFBpZHMoY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBjaGlsZHJlbi5mbGF0TWFwKChjaGlsZCkgPT4gKGNoaWxkLnBpZCA9PT0gdW5kZWZpbmVkID8gW10gOiBbY2hpbGQucGlkXSkpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxQaWRzKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogbnVtYmVyW10ge1xuICBjb25zdCBzaWduYWxlZFBpZHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgcGlkIG9mIHBpZHMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFraWxsUHJvY2Vzc0dyb3VwKHBpZCwgc2lnbmFsKSkgY29udGludWU7XG5cbiAgICAgIHNpZ25hbGVkUGlkcy5wdXNoKHBpZCk7XG4gICAgICB0cmVlS2lsbChwaWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGtpbGwgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaWduYWxlZFBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JGb3JjZUtpbGwocGlkczogcmVhZG9ubHkgbnVtYmVyW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRk9SQ0VfS0lMTF9ERUxBWV9NUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChwaWRzLmV2ZXJ5KGlzUHJvY2Vzc0dyb3VwR29uZSkpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHNsZWVwKE1hdGgubWluKDEwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0dyb3VwR29uZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCAwKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzR3JvdXAocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgc2lnbmFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcbmNvbnN0IExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSA9ICdsaXRlc3RyZWFtLnltbCc7XG5jb25zdCBERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY2xlYW5VcENvbW1hbmQgPSBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIENsZWFudXAgZXhpc3RpbmcgYXJ0aWZhY3RzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIExpdGVzdHJlYW0gcmVwbGljYXRpb24uXG4gICAgLy8gTm90ZSB0aGF0IGRvbid0IG1lcmdlIG11bHRpcGxlIHJtIGNvbW1hbmRzIGludG8gb25lLCBiZWNhdXNlIGlmIG9uZSBmYWlscywgdGhlIHN1YnNlcXVlbnQgb25lcyB3b24ndCBydW4uXG4gICAgcmV0dXJuIGAke2NsZWFuVXBDb21tYW5kfTsgcm0gLVJmICR7ZGlyUGF0aH0vLnByb2Quc3FsaXRlMyogfHwgdHJ1ZWA7XG4gIH1cblxuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZ2VuZXJhdGUoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnUFJJU01BIGdlbmVyYXRlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAke2xpdGVzdHJlYW1Db25maWdPcHRpb259IC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCl9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgJHt0aGlzLmdlbmVyYXRlKHByb2plY3QpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICAgIHN0ZXBzLnB1c2godGhpcy5zZWVkKHByb2plY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KX0gLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL21vdW50JyA6ICdwcmlzbWEvbW91bnQnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKSkgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIKSkgcmV0dXJuIGAtY29uZmlnICR7REVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIfWA7XG4gIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXTsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IFBSSVNNQSBkYiBleGVjdXRlIC0tc3RkaW4gLS11cmwgXCIke0ZJTEVfU0NIRU1BfSR7ZGJQYXRofVwiOyBmaSAmJiBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlVybCA9IHByb2plY3QuZW52LkRBVEFCQVNFX1VSTDtcbiAgaWYgKCFkYlVybD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHJldHVybjtcblxuICBjb25zdCByYXdEYlBhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShyYXdEYlBhdGgpXG4gICAgPyByYXdEYlBhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIgPz8gJy4nLCByYXdEYlBhdGgpO1xuXG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGdlbkNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZ2VuLWNvZGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIGNvZGUgZm9yIHRoZSBjdXJyZW50IHByb2plY3QnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbkNvZGVUYXJnZXRzID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAgIC5tYXAoKHByb2plY3QpID0+ICh7IHByb2plY3QsIHNjcmlwdHM6IGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3QpIH0pKVxuICAgICAgLmZpbHRlcigoeyBzY3JpcHRzIH0pID0+IHNjcmlwdHMubGVuZ3RoID4gMCk7XG4gICAgaWYgKGdlbkNvZGVUYXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QsIHNjcmlwdHMgfSBvZiBnZW5Db2RlVGFyZ2V0cykge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiZ2VuLWNvZGVcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpKSB7XG4gICAgc2NyaXB0cy5wdXNoKCdZQVJOIGJsaXR6IGNvZGVnZW4nKTtcbiAgICBpZiAocHJvamVjdC5oYXNQcmlzbWEpIHtcbiAgICAgIHNjcmlwdHMucHVzaChwcmlzbWFTY3JpcHRzLmdlbmVyYXRlKHByb2plY3QpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvamVjdC5oYXNQcmlzbWEpIHtcbiAgICBzY3JpcHRzLnB1c2gocHJpc21hU2NyaXB0cy5nZW5lcmF0ZShwcm9qZWN0KSk7XG4gIH1cblxuICBjb25zdCBjaGFrcmFUeXBlZ2VuU2NyaXB0ID0gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3QpO1xuICBpZiAoY2hha3JhVHlwZWdlblNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChjaGFrcmFUeXBlZ2VuU2NyaXB0KTtcbiAgfVxuXG4gIGNvbnN0IGRyaXp6bGVDb25maWdQYXRoID0gc2NyaXB0cy5sZW5ndGggPT09IDAgJiYgcHJvamVjdC5oYXNEcml6emxlID8gZ2V0RHJpenpsZUNvbmZpZ1BhdGgocHJvamVjdCkgOiB1bmRlZmluZWQ7XG4gIGlmIChkcml6emxlQ29uZmlnUGF0aCkge1xuICAgIHNjcmlwdHMucHVzaChgWUFSTiBkcml6emxlLWtpdCBjaGVjayAtLWNvbmZpZyAke2RyaXp6bGVDb25maWdQYXRofSB8fCB0cnVlYCk7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uIGdldENoYWtyYVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0BjaGFrcmEtdWkvY2xpJykpIHJldHVybjtcblxuICBpZiAoZ2V0T3duRGVwZW5kZW5jeU1ham9yKHByb2plY3QsICdAY2hha3JhLXVpL2NsaScpID09PSAyKSB7XG4gICAgcmV0dXJuICdZQVJOIGNoYWtyYS1jbGkgdG9rZW5zIHNyYy9jb3JlL3RoZW1lLnRzJztcbiAgfVxuICBpZiAoZmlsZUV4aXN0cyhwcm9qZWN0LCAnc3JjL3RoZW1lLnRzJykpIHtcbiAgICByZXR1cm4gJ1lBUk4gY2hha3JhIHR5cGVnZW4gc3JjL3RoZW1lLnRzIC0tc3RyaWN0JztcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGdldERyaXp6bGVDb25maWdQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWydkcml6emxlLmNvbmZpZy50cycsICdkcml6emxlLmNvbmZpZy5tdHMnLCAnZHJpenpsZS5jb25maWcuanMnLCAnZHJpenpsZS5jb25maWcubWpzJ107XG4gIHJldHVybiBjYW5kaWRhdGVzLmZpbmQoKGZpbGVQYXRoKSA9PiBmaWxlRXhpc3RzKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGdldE93bkRlcGVuZGVuY3lNYWpvcihwcm9qZWN0OiBQcm9qZWN0LCBwYWNrYWdlTmFtZTogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICBjb25zdCB2ZXJzaW9uID1cbiAgICBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV07XG4gIGNvbnN0IG1ham9yID0gdmVyc2lvbj8ubWF0Y2goL1xcZCsvdSk/LlswXTtcbiAgcmV0dXJuIG1ham9yID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBOdW1iZXIobWFqb3IpO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZVBhdGgpKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlLCBvdXRwdXQpKSByZXR1cm47XG5cbiAgY29uc3Qgbm9ybWFsaXplZE91dHB1dCA9IG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dCk7XG4gIGlmIChub3JtYWxpemVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobm9ybWFsaXplZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBleGl0Q29kZSAhPT0gMCB8fCBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvdXRwdXQudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxid2Fybig/OmluZyk/cz9cXGIvaS50ZXN0KG91dHB1dC5yZXBsYWNlQWxsKC9cXGIoPzowfG5vKSB3YXJuaW5ncz9cXGIvZ2ksICcnKSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfT0ke3NoZWxsRXNjYXBlQXJndW1lbnQodmFsdWUpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vOj0sQCUrLV0rJC91LnRlc3QoYXJnKSA/IGFyZyA6IGAnJHthcmcucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEJ1ZmZlcmVkUnVuUmVzdWx0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplU2NyaXB0LCBydW5XaXRoU3Bhd25JblBhcmFsbGVsLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRCdWZmZXJlZE91dHB1dCB9IGZyb20gJy4uL3V0aWxzL291dHB1dC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgTGludENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczxcbiAgdHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXJcbj47XG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8TGludENvbW1hbmRPcHRpb25zPiAmIHtcbiAgJy0tJz86IHVua25vd25bXTtcbiAgXzogdW5rbm93bltdO1xuICBwcmludEFsbE91dHB1dD86IGJvb2xlYW47XG59O1xuXG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhb3hmbXRFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbnR5cGUgQnVmZmVyZWRMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRSdW5SZXN1bHQgJiB7IGNvbW1hbmQ6IHN0cmluZzsgY3dkOiBzdHJpbmcgfTtcbnR5cGUgTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCB8IHsgZXhpdENvZGU6IG51bWJlciB9O1xuaW50ZXJmYWNlIExpbnRSdW5Db21tYW5kIHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xufVxuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTGludENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBsaW50KGFyZ3YgYXMgTGludENvbW1hbmRBcmd2KTtcbiAgICBpZiAoZXhpdENvZGUpIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChhcmd2OiBMaW50Q29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIHByZXNlcnZlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGNvbnN0IHNob3VsZFJ1bkZvcm1hdHRlcnMgPSBCb29sZWFuKGFyZ3YuZm9ybWF0KTtcbiAgY29uc3Qgc2hvdWxkUnVuTGludGVycyA9ICFhcmd2LmZvcm1hdCB8fCBhcmd2LmZpeDtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndiwgbGludEZpbGVQYXRocyk7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgcHl0aG9uRmlsZVBhdGhzXSBvZiBweXRob25GaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YsIHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGRhcnRGaWxlUGF0aHNdIG9mIGRhcnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgb3hmbXRGaWxlUGF0aHNdIG9mIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGlmIChsaW50Q29tbWFuZCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGxpbnRFeGl0Q29kZXM6IG51bWJlcltdID0gW107XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBjb25zdCBmb3JtYXR0ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGZvcm1hdHRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhmb3JtYXR0ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4uZm9ybWF0dGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAobWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcykge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBpZiAocHJldHRpZXJBcmdzLmxlbmd0aCA+IDAgJiYgcHJvamVjdHMuc2VsZi5oYXNQcmV0dGllcikge1xuICAgICAgY29uc3QgcHJldHRpZXJSZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAgICdZQVJOJyxcbiAgICAgICAgICAncHJldHRpZXInLFxuICAgICAgICAgICctLWNhY2hlJyxcbiAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICctLScsXG4gICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICBdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtwcmV0dGllclJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHByZXR0aWVyUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG4gICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydFBhY2thZ2VKc29uUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtzb3J0UGFja2FnZUpzb25SZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChzb3J0UGFja2FnZUpzb25SZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgY29uc3QgbGludGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhsaW50ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMobGludGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmxpbnRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZHMoXG4gIGNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdLFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHRbXT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoY29tbWFuZHMubWFwKCh7IGNvbW1hbmQsIHByb2plY3QgfSkgPT4gcnVuTGludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykpKTtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0PiB7XG4gIGlmIChhcmd2LnNpbGVudCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChyZXN1bHQpID0+ICh7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICBjb21tYW5kOiBub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSxcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChleGl0Q29kZSkgPT4gKHsgZXhpdENvZGUgfSkpO1xufVxuXG5mdW5jdGlvbiBwcmludFNpbGVudExpbnRPdXRwdXRzKFxuICByZXN1bHRzOiBMaW50UnVuUmVzdWx0W10sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAncHJpbnRBbGxPdXRwdXQnIHwgJ3NpbGVudCc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcHJpbnRhYmxlUmVzdWx0cyA9XG4gICAgYXJndi5zaWxlbnQgJiYgIWFyZ3YucHJpbnRBbGxPdXRwdXQgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUgIT09IDApIDogcmVzdWx0cztcbiAgaWYgKHByaW50YWJsZVJlc3VsdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcHJpbnRhYmxlUmVzdWx0cykge1xuICAgIGlmICghKCdvdXRwdXQnIGluIHJlc3VsdCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGFyZ3YucHJpbnRBbGxPdXRwdXQpIHtcbiAgICAgIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICAgICAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcbiAgICAgIH1cbiAgICAgIHByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdDogQnVmZmVyZWRMaW50UnVuUmVzdWx0KTogdm9pZCB7XG4gIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG5cbiAgaWYgKHJlc3VsdC5leGl0Q29kZSA9PT0gMCAmJiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQocmVzdWx0LmNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXQudHJpbSgpO1xuICBpZiAob3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kSGVhZGVyKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJyBveGZtdCAnKSB8fCBjb21tYW5kLmluY2x1ZGVzKCcgc29ydC1wYWNrYWdlLWpzb24gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPixcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tcXVpZXQnXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LmZpeCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPeGZtdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgJ1lBUk4nLFxuICAgICdveGZtdCcsXG4gICAgJy0td3JpdGUnLFxuICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgICchKiovcGFja2FnZS5qc29uJyxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIFtcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgXS5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3Y6IFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PiwgZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydExpbnRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnYW5hbHl6ZScsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4vcG9ydC5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KTtcbiAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH1cblxuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gV2Ugc2hvdWxkIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMgZmlyc3QgYmVjYXVzZSBga2lsbC1wb3J0YCBtYXkgZmFpbCB0byBzdG9wIERvY2tlciBjb250YWluZXJzLlxuICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQsIHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4uL3V0aWxzL3BvcnQuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG50eXBlIE1haW50ZW5hbmNlQXJndiA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+ICYge1xuICBhY3Rpb246ICdzdGFydCcgfCAnc3RvcCc7XG59O1xuY29uc3QgbWFpbnRlbmFuY2VIdG1sID0gYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImphXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPlxuICAgIDx0aXRsZT7jg6Hjg7Pjg4bjg4rjg7PjgrnkuK08L3RpdGxlPlxuICAgIDxzdHlsZT5cbiAgICAgIGJvZHkge1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgICBjb2xvcjogIzExMTgyNztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBzYW5zLXNlcmlmO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDtcbiAgICAgIH1cblxuICAgICAgbWFpbiB7XG4gICAgICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIH1cblxuICAgICAgaDEge1xuICAgICAgICBmb250LXNpemU6IDI4cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICAgIG1hcmdpbjogMCAwIDE2cHg7XG4gICAgICB9XG5cbiAgICAgIHAge1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjg7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxtYWluPlxuICAgICAgPGgxPuePvuWcqOODoeODs+ODhuODiuODs+OCueS4reOBp+OBmTwvaDE+XG4gICAgICA8cD7nmobmp5jjgavjga/jgZTkuI3kvr/jgpLjgYrjgYvjgZHjgZfjgb7jgZnjgYzjgIHjg6Hjg7Pjg4bjg4rjg7PjgrnntYLkuobjgb7jgafjgZfjgbDjgonjgY/jgYrlvoXjgaHjgY/jgaDjgZXjgYTjgII8L3A+XG4gICAgPC9tYWluPlxuICA8L2JvZHk+XG48L2h0bWw+YDtcblxuZnVuY3Rpb24gZ2V0TWFpbnRlbmFuY2VTZXJ2ZXJTb3VyY2UocG9ydDogbnVtYmVyLCBwaWRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nLnJhd2BcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5cbmNvbnN0IHBpZFBhdGggPSAke0pTT04uc3RyaW5naWZ5KHBpZFBhdGgpfTtcblxuY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICByZXNwb25zZS53cml0ZUhlYWQoNTAzLCB7XG4gICAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tc3RvcmUnLFxuICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgfSk7XG4gIHJlc3BvbnNlLmVuZCgke0pTT04uc3RyaW5naWZ5KG1haW50ZW5hbmNlSHRtbCl9KTtcbn0pO1xuXG5zZXJ2ZXIub24oJ2Vycm9yJywgKCkgPT4ge1xuICB0cnkge1xuICAgIGZzLnJtU3luYyhwaWRQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG5cbnNlcnZlci5saXN0ZW4oJHtwb3J0fSwgJzAuMC4wLjAnLCAoKSA9PiB7XG4gIGZzLndyaXRlRmlsZVN5bmMocGlkUGF0aCwgU3RyaW5nKHByb2Nlc3MucGlkKSArICdcXG4nKTtcbn0pO1xuYDtcbn1cblxuZXhwb3J0IGNvbnN0IG1haW50ZW5hbmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBNYWludGVuYW5jZUFyZ3Y+ID0ge1xuICBjb21tYW5kOiAnbWFpbnRlbmFuY2UgPGFjdGlvbj4nLFxuICBkZXNjcmliZTogJ1N0YXJ0IG9yIHN0b3AgYSBsaWdodHdlaWdodCBtYWludGVuYW5jZSBwYWdlIHNlcnZlci4gRXhhbXBsZTogd2IgbWFpbnRlbmFuY2Ugc3RhcnQnLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wb3NpdGlvbmFsKCdhY3Rpb24nLCB7XG4gICAgICAgIGNob2ljZXM6IFsnc3RhcnQnLCAnc3RvcCddIGFzIGNvbnN0LFxuICAgICAgICBkZXNjcmliZTogJ01haW50ZW5hbmNlIHNlcnZlciBhY3Rpb24nLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKSBhcyB1bmtub3duIGFzIEFyZ3Y8TWFpbnRlbmFuY2VBcmd2PixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSBhcmd2LmFjdGlvbjtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBtYWludGVuYW5jZSAke2FjdGlvbn0gYmVjYXVzZSBXQl9FTlYgaXMgdGVzdC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gcGFyc2VQb3J0KHByb2plY3QuZW52LlBPUlQpO1xuICAgIGlmIChhY3Rpb24gPT09ICdzdGFydCcpIHtcbiAgICAgIGF3YWl0IHN0YXJ0TWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGlkUGF0aCA9IGdldFBpZFBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IGV4aXN0aW5nUGlkID0gcmVhZFBpZChwaWRQYXRoKTtcbiAgaWYgKGV4aXN0aW5nUGlkICE9PSB1bmRlZmluZWQgJiYgaXNQcm9jZXNzUnVubmluZyhleGlzdGluZ1BpZCkpIHtcbiAgICBjb25zb2xlLmluZm8oYE1haW50ZW5hbmNlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcgb24gcG9ydCAke3BvcnR9LmApO1xuICAgIHJldHVybjtcbiAgfVxuICByZW1vdmVQaWRGaWxlKHBpZFBhdGgpO1xuXG4gIGlmICghKGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KSkpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUG9ydCAke3BvcnR9IGlzIGFscmVhZHkgaW4gdXNlLmApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShwaWRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKFxuICAgIHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgWyctLWlucHV0LXR5cGU9bW9kdWxlJywgJy0tZXZhbCcsIGdldE1haW50ZW5hbmNlU2VydmVyU291cmNlKHBvcnQsIHBpZFBhdGgpXSxcbiAgICB7XG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgfVxuICApO1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBtYWludGVuYW5jZSBzZXJ2ZXIuJyk7XG4gIH1cblxuICBjaGlsZC51bnJlZigpO1xuICBhd2FpdCB3YWl0Rm9yUGlkRmlsZShwaWRQYXRoLCBjaGlsZC5waWQpO1xuICBjb25zb2xlLmluZm8oYFN0YXJ0ZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCBwaWRQYXRoID0gZ2V0UGlkUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgcGlkID0gcmVhZFBpZChwaWRQYXRoKTtcbiAgaWYgKHBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5pbmZvKGBNYWludGVuYW5jZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcgb24gcG9ydCAke3BvcnR9LmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR1RFUk0nKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG4gIHJlbW92ZVBpZEZpbGUocGlkUGF0aCk7XG4gIGNvbnNvbGUuaW5mbyhgU3RvcHBlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBvcnQocG9ydEVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgYXNzZXJ0Lm9rKE51bWJlci5pc0ludGVnZXIocG9ydCkgJiYgcG9ydCA+IDAsIGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbmZ1bmN0aW9uIGdldFBpZFBhdGgocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLnRtcCcsIGB3Yi1tYWludGVuYW5jZS1zZXJ2ZXItJHtwb3J0fS5waWRgKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBpZChwaWRQYXRoOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBpZCA9IE51bWJlcihmcy5yZWFkRmlsZVN5bmMocGlkUGF0aCwgJ3V0ZjgnKS50cmltKCkpO1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgJiYgcGlkID4gMCA/IHBpZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc1J1bm5pbmcocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVBpZEZpbGUocGlkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgZnMucm1TeW5jKHBpZFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yUGlkRmlsZShwaWRQYXRoOiBzdHJpbmcsIHBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIDUwMDA7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocmVhZFBpZChwaWRQYXRoKSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgaWYgKCFpc1Byb2Nlc3NSdW5uaW5nKHBpZCkpIGJyZWFrO1xuICAgIGF3YWl0IHNldFRpbWVvdXQoNTApO1xuICB9XG5cbiAgcmVtb3ZlUGlkRmlsZShwaWRQYXRoKTtcbiAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc3RhcnQgbWFpbnRlbmFuY2Ugc2VydmVyLicpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG4vLyBUaGVzZSB0b29scyBhcmUgZGVjbGFyZWQgYXMgZGV2RGVwZW5kZW5jaWVzIGluIHNvdXJjZSByZXBvcywgYnV0IG9wdGltaXplZCBEb2NrZXJcbi8vIHBhY2thZ2UuanNvbiBmaWxlcyBzdGlsbCBuZWVkIHRoZW0gZm9yIGluLWltYWdlIGNvZGVnZW4vYnVpbGQgc3RlcHMuXG5jb25zdCBydW50aW1lRGV2RGVwZW5kZW5jaWVzID0gWydAd2lsbGJvb3N0ZXIvd2InLCAnYnVpbGQtdHMnXTtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgLy8gRG9ja2VyIGJ1aWxkcyBjYW5ub3QgYWNjZXNzIHByaXZhdGUgU1NIIFVSTHMgdW5sZXNzIGNyZWRlbnRpYWxzIGFyZSBmb3J3YXJkZWQuXG4gICAgICAgICAgICAvLyBUaGUgRG9ja2VyZmlsZSBjb3BpZXMgdGhvc2Ugd29ya3NwYWNlIHBhY2thZ2VzIGludG8gdGhlIGltYWdlIGluc3RlYWQuXG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMocGF0aC5qb2luKGRpc3REaXJQYXRoLCAnYmFzaCcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlRG9ja2VyU2hlbGxTY3JpcHRzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzb3VyY2VEaXJQYXRoID0gZmluZERvY2tlclNoZWxsU2NyaXB0c0RpclBhdGgoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoc291cmNlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNGaWxlKCkgfHwgIWRpcmVudC5uYW1lLmVuZHNXaXRoKCcuc2gnKSkgY29udGludWU7XG5cbiAgICBjb25zdCB0YXJnZXRGaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY29weUZpbGUocGF0aC5qb2luKHNvdXJjZURpclBhdGgsIGRpcmVudC5uYW1lKSwgdGFyZ2V0RmlsZVBhdGgpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLmNobW9kKHRhcmdldEZpbGVQYXRoLCAwbzc1NSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgRG9ja2VyIHNoZWxsIHNjcmlwdHM6ICR7cGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBkaXJQYXRoKSB8fCBkaXJQYXRofWApO1xufVxuXG5mdW5jdGlvbiBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpOiBzdHJpbmcge1xuICBsZXQgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ2RvY2tlcicsICdiYXNoJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb2NrZXIgc2hlbGwgc2NyaXB0cyBkaXJlY3Rvcnkgbm90IGZvdW5kLicpO1xuICAgIH1cbiAgICBjdXJyZW50RGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBwcm9tb3RlUnVudGltZURldkRlcGVuZGVuY2llcyhwYWNrYWdlSnNvbik7XG4gIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAvLyBPdXRzaWRlIG9wdGltaXphdGlvbiB3cml0ZXMgZGlzdC9wYWNrYWdlLmpzb24gYmVmb3JlIERvY2tlciBidWlsZHMgdGhlIGFwcC5cbiAgICAvLyBLZWVwIGJ1aWxkLXRpbWUgcGFja2FnZXMgZm9yIHRoYXQgbGF0ZXIgaW4taW1hZ2UgYnVpbGQgYW5kIHJlbW92ZSBvbmx5IGtub3duIG5vbi1idWlsZCB0b29saW5nLlxuICAgIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJbnNpZGUgRG9ja2VyLCBjb2RlZ2VuL2J1aWxkIGhhcyBhbHJlYWR5IGZpbmlzaGVkLCBzbyBwcm9kdWN0aW9uIGluc3RhbGwgc2hvdWxkIG5vdCBzZWUgZGV2IHRvb2xpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgLy8gSW4gLS1vdXRzaWRlIG1vZGUsIERvY2tlciBzdGlsbCBydW5zIGNvZGVnZW4vYnVpbGQgYmVmb3JlIGEgc2Vjb25kIGluLWltYWdlIG9wdGltaXphdGlvbi5cbiAgLy8gUmVtb3ZlIG9ubHkgdG9vbGluZyB0aGF0IGlzIG5vdCBuZWVkZWQgZm9yIHRoYXQgYnVpbGQgcGhhc2UuXG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIHByb21vdGVSdW50aW1lRGV2RGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IHByb21vdGVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIHJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gZGV2RGVwc1tuYW1lXTtcbiAgICBpZiAoIXZlcnNpb24pIGNvbnRpbnVlO1xuICAgIGlmICghZGVwZW5kZW5jaWVzW25hbWVdKSB7XG4gICAgICBkZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuICAgICAgcHJvbW90ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICB9XG4gIGlmIChwcm9tb3RlZERlcHMubGVuZ3RoID4gMCkge1xuICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgfVxuICBjb25zb2xlLmluZm8oJ1Byb21vdGVkIHJ1bnRpbWUgZGV2RGVwZW5kZW5jaWVzOicsIHByb21vdGVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG5cbmNsYXNzIERyaXp6bGVTY3JpcHRzIHtcbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gREFUQUJBU0VfUEFUSCBvciBmaWxlOiBEQVRBQkFTRV9VUkwgaXMgc2V0LicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3JlbW92ZUNvbW1hbmR9ICYmICR7dGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKX1gO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWVkQ29tbWFuZCA9IHRoaXMuc2VlZChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRlQ29tbWFuZCA9IHRoaXMuZGVwbG95KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICByZXR1cm4gc2VlZENvbW1hbmQgPT09ICd0cnVlJyA/IG1pZ3JhdGVDb21tYW5kIDogYCR7bWlncmF0ZUNvbW1hbmR9ICYmICR7c2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIG1pZ3JhdGVGb3JTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShfcHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGRyaXp6bGUta2l0IG1pZ3JhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZ2VuZXJhdGUoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF9wcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZShfcHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgcmV0dXJuICd0cnVlJztcbiAgfVxuXG4gIHN0dWRpbyhfcHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gZHJpenpsZS1raXQgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gcHJvamVjdC5lbnYuREFUQUJBU0VfUEFUSCA/PyBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiByYXdEYlBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlT3JtLCBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzLCBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgYWxpYXNlczogWydkYiddLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBkYXRhYmFzZSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIERyaXp6bGUgcHJvamVjdHMgdXNlIGRyaXp6bGUta2l0LiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZ2VuZXJhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBnZW5lcmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZ2VuZXJhdGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIE9STSBjbGllbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBnZW5lcmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmdlbmVyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ob3JtU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0LCBhcmd2LmNoZWNrSWRlbXBvdGVuY3kpKSB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0KSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFNraXBwaW5nIGlkZW1wb3RlbmN5IGNoZWNrIGZvciAke3Byb2plY3QubmFtZX0gaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKG9ybVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3Q6IFByb2plY3QsIGNoZWNrSWRlbXBvdGVuY3k6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrSWRlbXBvdGVuY3kgPz8gaXNEb2NrZXJFbmFibGVkKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5mdW5jdGlvbiBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAncHJvZHVjdGlvbicpO1xufVxuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgICAgICAgJ1dCX0VOVj10ZXN0IGRiIHJlc2V0JyxcbiAgICAgICAgYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndilcbiAgICAgICkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2LCAncHJpc21hJyk7XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIGRhdGFiYXNlIHN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6XG4gICAgXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gdGhlIGRldGVjdGVkIE9STSBhcyBpcy4gQWRkaXRpb25hbCBQcmlzbWEgZmxhZ3MgY2FuIGFsc28gYmUgZm9yd2FyZGVkIGFmdGVyICctLScuXCIsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoYGRiICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gb3JtID09PSAncHJpc21hJyA/IGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gIDogYFlBUk4gZHJpenpsZS1raXQgJHtmdWxsQ29tbWFuZH1gO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICBjb25zdCBkYlBhdGggPSBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgcmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCA9IHByb2plY3QuZW52LldCX0VOViA9PT0gJ3N0YWdpbmcnID8gJzVtJyA6ICcxaCc7XG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzbmFwc2hvdC1pbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gICAgICByZXRlbnRpb246IDcyaCAgICAgICAgICAjIEtlZXAgYmFja3VwcyBmb3IgMyBkYXlzXG4gICAgICByZXRlbnRpb24tY2hlY2staW50ZXJ2YWw6ICR7cmV0ZW50aW9uQ2hlY2tJbnRlcnZhbH1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDFtXG5gO1xuXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBsaXRlc3RyZWFtQ29uZmlnKTtcbiAgICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCAke2NvbmZpZ1BhdGh9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7Y29uZmlnUGF0aH06ICR7cmVhc29ufWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgRGF0YWJhc2VPcm1Qcm9qZWN0IHtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAgb3JtOiBEYXRhYmFzZU9ybTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3JtPzogRGF0YWJhc2VPcm0pOiBQcm9taXNlPERhdGFiYXNlT3JtUHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgLm1hcCgocHJvamVjdCkgPT4gKHByb2plY3QuZGF0YWJhc2VPcm0gPyB7IHByb2plY3QsIG9ybTogcHJvamVjdC5kYXRhYmFzZU9ybSB9IDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKChwcm9qZWN0KTogcHJvamVjdCBpcyBEYXRhYmFzZU9ybVByb2plY3QgPT4gISFwcm9qZWN0ICYmICghb3JtIHx8IHByb2plY3Qub3JtID09PSBvcm0pKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKG9ybSA/IGBObyAke29ybX0gcHJvamVjdCBmb3VuZC5gIDogJ05vIHN1cHBvcnRlZCBkYXRhYmFzZSBPUk0gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybTogRGF0YWJhc2VPcm0pOiB0eXBlb2YgcHJpc21hU2NyaXB0cyB8IHR5cGVvZiBkcml6emxlU2NyaXB0cyB7XG4gIHJldHVybiBvcm0gPT09ICdwcmlzbWEnID8gcHJpc21hU2NyaXB0cyA6IGRyaXp6bGVTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIHByb2plY3RzOiBEYXRhYmFzZU9ybVByb2plY3RbXVxuKTogR2VuZXJhdG9yPERhdGFiYXNlT3JtUHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBjb25zdCBvcm1Qcm9qZWN0QnlQcm9qZWN0ID0gbmV3IE1hcChwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LnByb2plY3QsIHByb2plY3RdKSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoXG4gICAgY29tbWFuZE5hbWUsXG4gICAgcHJvamVjdHMubWFwKCh7IHByb2plY3QgfSkgPT4gcHJvamVjdClcbiAgKSkge1xuICAgIGNvbnN0IG9ybVByb2plY3QgPSBvcm1Qcm9qZWN0QnlQcm9qZWN0LmdldChwcm9qZWN0KTtcbiAgICBpZiAoIW9ybVByb2plY3QpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRldGVjdCBkYXRhYmFzZSBPUk0gZm9yICR7cHJvamVjdC5uYW1lfS5gKTtcblxuICAgIHlpZWxkIG9ybVByb2plY3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBPUk0gY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gICctLSc/OiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYgeyAnLS0nPzogc3RyaW5nW10gfVxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICBjb25zdCBtaXNlQWdlS2V5U2VjcmV0T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZXG4gICAgICA/ICdcXG4gICAgICAgIC0tc2VjcmV0IGlkPW1pc2VfYWdlX2tleSxlbnY9TUlTRV9BR0VfS0VZJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259JHttaXNlQWdlS2V5U2VjcmV0T3B0aW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3RoaXMuc3RhcnQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMsIGFkZGl0aW9uYWxBcmdzKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgY29uc3QgYWxsb2NhdGVUdHkgPSBhZGRpdGlvbmFsQXJncy5pbmNsdWRlcygnL2Jpbi9iYXNoJyk7XG4gICAgY29uc3QgbWlzZUFnZUtleUVudk9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWSA/ICctLWVudiBNSVNFX0FHRV9LRVkgJyA6ICcnO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30ke21pc2VBZ2VLZXlFbnZPcHRpb259LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCA9IGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3QpO1xuICAgIGlmIChjdXN0b21TdGFydFNjcmlwdFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYCR7YnVpbGRTaGVsbENvbW1hbmQoWydiYXNoJywgY3VzdG9tU3RhcnRTY3JpcHRQYXRoXSl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPSBlY29zeXN0ZW1Db25maWdQYXRoXG4gICAgICA/IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdXG4gICAgICA6IHRoaXMuYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIGNvbW1hbmRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBjb21tYW5kczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gW1xuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5oYXNEcml6emxlID8gW2RyaXp6bGVTY3JpcHRzLm1pZ3JhdGVGb3JTdGFydChwcm9qZWN0KV0gOiBbXSksXG4gICAgXTtcbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIC8vIFVzZSBlbXB0eSBOT0RFX0VOViB0byBhdm9pZCBcInByb2R1Y3Rpb25cIiBtb2RlIGluIHNvbWUgZnJhbWV3b3JrcyBsaWtlIEJsaXR6LmpzLlxuICAgIHJldHVybiBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IFtdLCBwbGF5d3JpZ2h0QXJncyA9IFsndGVzdCcsICd0ZXN0L2UyZS8nXSB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnc2NyaXB0cy9zdGFydC1wcm9kdWN0aW9uLnNoJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHRlc3RDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHM6IG5vcm1hbGl6ZWRUYXJnZXRzIH0pO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBZQVJOIG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0UnVuT3B0aW9ucyB7XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcilcbiAgICAgIC5wb3NpdGlvbmFsKCd0YXJnZXRzJywgYXJndW1lbnRzQnVpbGRlci50YXJnZXRzKSBhcyBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YsIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndik7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyh0ZXN0QXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAodGVzdEFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gdGVzdEFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgICB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGRlZmF1bHRVbml0VGFyZ2V0cyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgIHRpbWVvdXQ6IHRlc3RBcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddIHx8IGRldkRlcHMudml0ZSkge1xuICAgICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsnY29kZWdlbicsIGBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuZW52Py5sZW5ndGggfHwgYXJndi5jYXNjYWRlRW52IHx8IGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gYXJndjtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuQ0kgfHw9ICcxJztcbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICAgIH1cbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgfVxuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgcHJlc2VydmVDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2dvIC0tbm9FbWl0J107XG4gIH1cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvcnVudGltZS5qcyc7XG5cbmltcG9ydCB7IGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2IH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdmVyaWZ5Q29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3ZlcmlmeScsXG4gIGRlc2NyaWJlOiAnVmVyaWZ5IHByb2plY3QgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCAoYXJndi5mdWxsID8gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3RzLnNlbGYsIGFyZ3YpIDogdmVyaWZ5Q29kZShwcm9qZWN0cy5zZWxmLCBhcmd2KSk7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9ydGVyID0gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZ5Q29kZShwcm9qZWN0LCBhcmd2KTtcbiAgICBhd2FpdCBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgLCBwcm9qZWN0LCBhcmd2KTtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXdhaXQgcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgICAnY2xlYW51cCcsXG4gICAgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHByaW50QWxsT3V0cHV0OiB0cnVlLFxuICAgICAgICBxdWlldDogdHJ1ZSxcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIExpbnRDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB7IC4uLmFyZ3YsIF86IFsndGVzdCddLCBlMmU6ICdoZWFkbGVzcycsIHNpbGVudDogdHJ1ZSB9IGFzIHVua25vd24gYXMgVGVzdENvbW1hbmRBcmd2O1xuICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSByZXR1cm47XG5cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGItcmVzZXQnXSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCAndGVzdCcpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgY29uc29sZS5pbmZvKFxuICAgIGNoYWxrLnllbGxvdygnVGVzdHMgZmFpbGVkLiBUaGlzIHByb2plY3QgZGVmaW5lcyBcImRiLXJlc2V0XCIsIHNvIHdiIHdpbGwgcmVzZXQgdGhlIGRhdGFiYXNlIG9uY2UgYW5kIHJldHJ5IHRlc3RzLicpXG4gICk7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3BhY2thZ2VNYW5hZ2VyfSBkYi1yZXNldGAsIHByb2plY3QsIGFyZ3YsIHsgcHJpbnRSYXdPdXRwdXQ6IHRydWUgfSk7XG5cbiAgY29uc3QgcmV0cnlFeGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKHJldHJ5RXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0cnlFeGl0Q29kZX0pOmApLCAndGVzdCBhZnRlciBkYi1yZXNldCByZXRyeScpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0cnlFeGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdUZXN0cyBwYXNzZWQgYWZ0ZXIgZGItcmVzZXQgcmV0cnkuJykpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKFxuICBjb21tYW5kTmFtZTogc3RyaW5nLFxuICBjb21tYW5kOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ1N0YXJ0OicpLCBjb21tYW5kTmFtZSkpO1xuICB9XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlID09PSAwIHx8IG9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBjb21tYW5kTmFtZSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHByaW50UmF3T3V0cHV0PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgcHJlc2VydmVDb2xvcjogZmFsc2UgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICghb3B0aW9ucy5wcmludFJhd091dHB1dCkge1xuICAgIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZCwgZXhpdENvZGUsIHJldC5zdGRvdXQpO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUHJpbnRzIHBhY2thZ2UgY29tbWFuZCBvdXRwdXQgZm9yIGB3YiB2ZXJpZnlgLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBzbyBzdWNjZXNzZnVsIG5vaXN5XG4gKiBjb21tYW5kcyBhcmUgc3VtbWFyaXplZCB3aGlsZSBmYWlsdXJlIG91dHB1dCByZW1haW5zIGF2YWlsYWJsZSBmb3IgZGlhZ25vc2lzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIFRoZSBleGVjdXRlZCBjb21tYW5kLlxuICogQHBhcmFtIGV4aXRDb2RlIFRoZSBjb21tYW5kIGV4aXQgY29kZS5cbiAqIEBwYXJhbSBvdXRwdXQgVGhlIG1lcmdlZCBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiAoY29tbWFuZCA9PT0gYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIHx8IGNvbW1hbmQgPT09IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZWApKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWRPdXRwdXQgPSBvdXRwdXQudHJpbSgpO1xuICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHRyaW1tZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdDogUHJvamVjdCk6IHtcbiAgZmFpbDogKGVycm9yPzogdW5rbm93bikgPT4gdm9pZDtcbiAgZmluaXNoOiAoKSA9PiB2b2lkO1xuICBzdWNjZWVkOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHdiRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcud2InKTtcbiAgZnMubWtkaXJTeW5jKHdiRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4od2JEaXJQYXRoLCAndmVyaWZ5LWZ1bGwubG9nJyk7XG4gIGNvbnN0IGxvZ0ZpbGUgPSBmcy5vcGVuU3luYyhsb2dGaWxlUGF0aCwgJ3cnKTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xuICBjb25zdCBvcmlnaW5hbFN0ZGVycldyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycik7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSB0ZWVXcml0ZShwcm9jZXNzLnN0ZG91dC5mZCwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IHRlZVdyaXRlKHByb2Nlc3Muc3RkZXJyLmZkLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0Z1bGwgbG9nOicpLCBsb2dGaWxlUGF0aCkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoZmluaXNoZWQpIHJldHVybjtcbiAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IG9yaWdpbmFsU3Rkb3V0V3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gb3JpZ2luYWxTdGRlcnJXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGZvcm1hdEVsYXBzZWRUaW1lKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWRlZCA/ICdTdWNjZWVkZWQnIDogJ0ZhaWxlZCc7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGAke3N0YXR1c30gaW4gJHtlbGFwc2VkVGltZX0uIEZ1bGwgbG9nOiAke2xvZ0ZpbGVQYXRofVxcbmA7XG4gICAgY29uc3QgY29sb3JlZFN1bW1hcnkgPSBzdWNjZWVkZWQgPyBjaGFsay5ncmVlbihzdW1tYXJ5KSA6IGNoYWxrLnJlZChzdW1tYXJ5KTtcbiAgICBvcmlnaW5hbFN0ZG91dFdyaXRlKGNvbG9yZWRTdW1tYXJ5KTtcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgc3VtbWFyeSk7XG4gICAgZnMuY2xvc2VTeW5jKGxvZ0ZpbGUpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmYWlsOiAoZXJyb3IpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmluaXNoOiAoKSA9PiB7XG4gICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdleGl0JywgZmluaXNoKTtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH0sXG4gICAgc3VjY2VlZDogKCkgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0ZWVXcml0ZShvdXRwdXRGaWxlOiBudW1iZXIsIGxvZ0ZpbGU6IG51bWJlcik6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSB7XG4gIHJldHVybiAoKFxuICAgIGNodW5rOiBVaW50OEFycmF5IHwgc3RyaW5nLFxuICAgIGVuY29kaW5nT3JDYWxsYmFjaz86IEJ1ZmZlckVuY29kaW5nIHwgKChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCksXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWRcbiAgKSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID1cbiAgICAgIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBCdWZmZXIuZnJvbShjaHVuaywgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ3N0cmluZycgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiAndXRmOCcpXG4gICAgICAgIDogY2h1bms7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIGJ1ZmZlcik7XG4gICAgZnMud3JpdGVTeW5jKG91dHB1dEZpbGUsIGJ1ZmZlcik7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVuY29kaW5nT3JDYWxsYmFjaygpO1xuICAgIH1cbiAgICBjYWxsYmFjaz8uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gYCR7cmVtYWluaW5nU2Vjb25kc31zYDtcbiAgfVxuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBidWlsZElmTmVlZGVkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGRJZk5lZWRlZC5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsgZ2VuQ29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkNvZGUuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRJZk5vbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG1haW50ZW5hbmNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbWFpbnRlbmFuY2UuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkNvZGVDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IiwiZW52IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiZGVmYXVsdCIsInZlcmJvc2UiLCJhbGlhcyIsInJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyIsImFyZ3YiLCJjd2QiLCJlbnZQYXRocyIsIm1hcCIsImVudlBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsInRvU3RyaW5nIiwiY2FzY2FkZSIsImNhc2NhZGVFbnYiLCJjYXNjYWRlTm9kZUVudiIsInByb2Nlc3MiLCJOT0RFX0VOViIsImF1dG9DYXNjYWRlRW52IiwiV0JfRU5WIiwidW5kZWZpbmVkIiwibGVuZ3RoIiwicHVzaCIsImpvaW4iLCJpbmNsdWRlUm9vdEVudiIsInJvb3RQYXRoIiwiZnMiLCJleGlzdHNTeW5jIiwiZmxhdE1hcCIsImZpbHRlciIsInJlbGF0aXZlIiwic2hvdWxkU3VwcHJlc3NPdXRwdXQiLCJzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0IiwiY29uc29sZSIsImluZm8iLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMiLCJlbnZWYXJzIiwia2V5cyIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsInJlYWRFbnZGaWxlIiwibWlzZUVudlZhcnMiLCJtaXNlRW52VmFyTmFtZXMiLCJjdXJyZW50RW52VmFycyIsImN1cnJlbnRQYXRoIiwiZGlybmFtZSIsImhhc1Byb2plY3RNaXNlQ29uZmlnIiwiYXJncyIsInJlc3VsdCIsImNoaWxkUHJvY2VzcyIsInNwYXduU3luYyIsImVuY29kaW5nIiwic3RkaW8iLCJlcnJvciIsInN0YXR1cyIsInN0ZG91dCIsInRyaW0iLCJwYXJzZWQiLCJKU09OIiwicGFyc2UiLCJBcnJheSIsImlzQXJyYXkiLCJyZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzIiwiYXNzaWduIiwibWlzZUVudmlyb25tZW50U291cmNlTmFtZSIsImNoZWNrRW52IiwibWlzc2luZ0tleXMiLCJFcnJvciIsImV4cGFuZCIsInByb2Nlc3NFbnYiLCJvdXRwdXRPcHRpb25zIiwicXVpZXRFbnYiLCJzaWxlbnQiLCJjYWNoZWRFbnZWYXJzIiwiTWFwIiwiZmlsZVBhdGgiLCJjYWNoZWQiLCJnZXQiLCJjb25maWciLCJxdWlldCIsInNldCIsImlzRXJybm9FeGNlcHRpb24iLCJ0cmVlS2lsbCIsInBpZCIsInNpZ25hbCIsIk51bWJlciIsImlzSW50ZWdlciIsInBsYXRmb3JtIiwicnVuQ29tbWFuZCIsIlN0cmluZyIsIm1heEJ1ZmZlciIsInRpbWVvdXQiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImtpbGxUcmVlT25XaW5kb3dzIiwiZGVzY2VuZGFudHMiLCJyb290UGlkIiwiY2hpbGRyZW5CeVBhcmVudCIsInBzT3V0cHV0IiwibGluZSIsInNwbGl0IiwibWF0Y2hlZCIsImV4ZWMiLCJjaGlsZFBpZCIsInBhcmVudFBpZCIsImNoaWxkcmVuIiwiYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwIiwicXVldWUiLCJpbmRleCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJ0YXJnZXRQaWRzIiwidG9SZXZlcnNlZCIsInRvQ2hpbGRyZW5GaXJzdFBpZHMiLCJ0YXJnZXRQaWQiLCJraWxsSWZOZWVkZWQiLCJraWxsIiwiY29tbWFuZCIsIm9wdGlvbnMiLCJleGVjRmlsZVN5bmMiLCJzdGRlcnIiLCJCdWZmZXIiLCJpc0J1ZmZlciIsImV4dHJhY3RTdGRlcnIiLCJDb21tYW5kRXhlY3V0aW9uRXJyb3IiLCJjb2RlIiwidG9FeGl0Q29kZSIsInRlc3QiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwidGhpcyIsIm5hbWUiLCJhc3luYyIsInNwYXduQXN5bmMiLCJQcm9taXNlIiwicmVqZWN0IiwicHJvYyIsInNwYXduIiwic2V0RW5jb2RpbmciLCJzdGRvdXRQcmludGVyIiwiY3JlYXRlUmVhbHRpbWVQcmludGVyIiwib21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nIiwic3RkZXJyUHJpbnRlciIsIm9uIiwiZGF0YSIsInByaW50aW5nU3Rkb3V0Iiwid3JpdGUiLCJtZXJnZU91dEFuZEVycm9yIiwicHJpbnRpbmdTdGRlcnIiLCJzdG9wcGVkIiwic3RvcFByb2Nlc3MiLCJ3YXJuIiwiY2xlYW51cFNpZ25hbHMiLCJzaWduYWxIYW5kbGVycyIsInJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyIsInJlbW92ZUxpc3RlbmVyIiwiaGFuZGxlciIsImNsZWFyIiwia2lsbE9uRXhpdCIsImhhbmRsZVNpZ25hbCIsImxpc3RlbmVyQ291bnQiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJmbHVzaCIsImlucHV0Iiwic3RkaW4iLCJlbmQiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsIlJlZ0V4cCIsImZyb21Db2RlUG9pbnQiLCJzdHJlYW0iLCJvbWl0QmxhbmtMaW5lcyIsInBlbmRpbmciLCJsaW5lcyIsInBvcCIsImlzQmxhbmtMaW5lIiwicmVwbGFjZUFsbCIsInQiLCJzIiwiaSIsImUiLCJuIiwiaCIsImJsb2NrcyIsInJlc2V0IiwiZmluYWxpemVkIiwiYmxvY2siLCJzdGFydCIsImxhc3RCeXRlSW5kZXgiLCJwYWRkaW5nIiwib3V0cHV0Qml0cyIsImJsb2NrQ291bnQiLCJieXRlQ291bnQiLCJvdXRwdXRCbG9ja3MiLCJleHRyYUJ5dGVzIiwidXBkYXRlIiwibyIsImwiLCJjIiwiZiIsImNvZGVQb2ludEF0IiwiciIsImZpbmFsaXplIiwiaGV4IiwiYSIsInUiLCJkIiwiYiIsImsiLCJ5IiwieCIsIkIiLCJwIiwiQyIsInoiLCJJIiwiZyIsInciLCJBIiwiUCIsIkUiLCJqIiwibSIsInEiLCJ2IiwiRCIsIkYiLCJHIiwiSCIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIkIiwiXyIsInR0Iiwic3QiLCJpdCIsImV0Iiwib3QiLCJudCIsImh0IiwicnQiLCJsdCIsImN0IiwiZnQiLCJpbnN0YW5jZSIsImZyb20iLCJtZXNzYWdlIiwic3RhY2siLCJjYXVzZSIsInN0dWIiLCJoeWRyYXRlIiwiVWludDhBcnJheSIsImJ0b2EiLCJkZWNvZGUiLCJjcmVhdGUiLCJlbmNvZGUiLCJhdG9iIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiRGF0ZSIsInRvSlNPTiIsImZsYWdzIiwic291cmNlIiwiVVJMIiwiaHJlZiIsIlRleHRFbmNvZGVyIiwiVGV4dERlY29kZXIiLCJzdHJpbmdpZnkiLCJpc05hTiIsImlzRmluaXRlIiwiZmlsbCIsInNsaWNlIiwiY2FjaGVEdXJhdGlvbiIsIlBPU0lUSVZFX0lORklOSVRZIiwiZ2V0Q2FjaGVLZXkiLCJraW5kIiwibm93IiwiY2FsbCIsImlzQ0kiLCJjaUVudiIsIlByb2plY3QiLCJfaW5pdFByb3RvIiwiX2FwcGx5RGVjcyIsIm1lbW9pemVPbmUiLCJwYXRoQnlOYW1lIiwiZGlyUGF0aCIsImxvYWRFbnYiLCJfZGlyUGF0aCIsImlzQnVuQXZhaWxhYmxlIiwiaGFzQnVuVG9vbFZlcnNpb24iLCJ1c2VzQnVuUGFja2FnZU1hbmFnZXIiLCJoYXNCdW5Mb2NrZmlsZSIsImhhc0J1blBhY2thZ2VNYW5hZ2VyIiwicmVhZEZpbGVTeW5jIiwicm9vdERpclBhdGgiLCJzb21lIiwiZmlsZU5hbWUiLCJwYWNrYWdlTWFuYWdlciIsInJvb3RQYWNrYWdlSnNvbiIsInBhY2thZ2VKc29uIiwic3RhcnRzV2l0aCIsImJ1aWxkQ29tbWFuZCIsInNjcmlwdHMiLCJidWlsZCIsImluY2x1ZGVzIiwiZG9ja2VyZmlsZSIsImZpbmRGaWxlIiwiaGFzRG9ja2VyZmlsZSIsImhhc1NvdXJjZUNvZGUiLCJkb2NrZXJJbWFnZU5hbWUiLCJlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycyIsImNvdW50IiwicGFja2FnZUpzb25QYXRoIiwiaGFzUHJpc21hIiwiZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24iLCJoYXNEcml6emxlIiwiZGF0YWJhc2VPcm0iLCJoYXNWaXRlc3QiLCJkZXBlbmRlbmNpZXMiLCJ2aXRlc3QiLCJkZXZEZXBlbmRlbmNpZXMiLCJoYXNPeGxpbnQiLCJoYXNEZXBlbmRlbmN5IiwiaGFzT3hmbXQiLCJoYXNQcmV0dGllciIsImhhc1BvZXRyeUxvY2siLCJoYXNQdWJzcGVjWWFtbCIsInByZWZlcnJlZExpbnRlciIsImhhc093bkRlcGVuZGVuY3kiLCJwYWNrYWdlTmFtZSIsImhhc1BsYXl3cmlnaHRDb25maWciLCJza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCIsIkNJIiwiY29uZmlnUGF0aCIsImRvY2tlclBhY2thZ2VKc29uIiwiYmluRXhpc3RzIiwiYmluRm91bmQiLCJiaW5QYXRoIiwiUEFUSCIsInBhcmVudFBhdGgiLCJmaW5kIiwiZ2V0RGVwZW5kZW5jeVZlcnNpb24iLCJvcHRpb25hbERlcGVuZGVuY2llcyIsInBlZXJEZXBlbmRlbmNpZXMiLCJmaW5kU2VsZlByb2plY3QiLCJpc1Byb2plY3RFbnZpcm9ubWVudCIsInByb2plY3QiLCJNSVNFX0VOViIsImZpbmREZXNjZW5kYW50UHJvamVjdHMiLCJyb290QW5kU2VsZlByb2plY3RzIiwiZmluZFJvb3RBbmRTZWxmUHJvamVjdHMiLCJyb290Iiwic2VsZiIsImdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyIsInRoaXNQcm9qZWN0Iiwicm9vdFByb2plY3QiLCJ3b3Jrc3BhY2VzIiwiZW5kc1dpdGgiLCJwcm9qZWN0cyIsIndvcmtzcGFjZSIsImdsb2JQYXR0ZXJuIiwicGFja2FnZURpcnMiLCJ3b3Jrc3BhY2VQYXRoIiwid3MiLCJnbG9iYnkiLCJkb3QiLCJvbmx5RGlyZWN0b3JpZXMiLCJzdWJQYWNrYWdlRGlyUGF0aCIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJucG1fZXhlY3BhdGgiLCJydW50aW1lV2l0aEFyZ3MiLCJwYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJidWlsZElmTmVlZGVkQ29tbWFuZCIsImRlc2NyaWJlIiwicHJvamVjdFBhdGhGb3JUZXN0aW5nIiwiY2hhbGsiLCJyZWQiLCJncmVlbiIsImNhblNraXAiLCJjYWNoZUZpbGVQYXRoIiwiY29udGVudEhhc2giLCJjYWNoZURpcmVjdG9yeVBhdGgiLCJwcm9taXNlcyIsIm1rZGlyIiwicmVjdXJzaXZlIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJjb21taXRIYXNoIiwiY2hpbGRfcHJvY2VzcyIsImV4ZWNTeW5jIiwiZW52aXJvbm1lbnRKc29uIiwiaWdub3JpbmdFbnZWYXJOYW1lcyIsImhhcyIsInRvU29ydGVkIiwia2V5MSIsImtleTIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRGaWxlUGF0aHMiLCJyZXBsYWNlIiwiaW5jbHVkZVBhdHRlcm5zIiwicGF0dGVybiIsImluY2x1ZGVTdWZmaXgiLCJzdWZmaXgiLCJleGNsdWRlUGF0dGVybnMiLCJjb3B5IiwiZGlnZXN0IiwidXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0IiwiY2FjaGVkQ29udGVudEhhc2giLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZEZpbGUiLCJjYW5Ta2lwQnVpbGQiLCJkcnlSdW4iLCJ3cml0ZUZpbGUiLCJidWlsZElmTmVlZGVkIiwicmV0Iiwic2hlbGwiLCJleGl0Q29kZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJkZWZhdWx0T3B0aW9ucyIsImV4aXRJZkZhaWxlZCIsInJ1bldpdGhTcGF3biIsInNjcmlwdCIsIm9wdHMiLCJub3JtYWxpemVkU2NyaXB0Iiwibm9ybWFsaXplU2NyaXB0Iiwib21pdFNpbGVudFN0YXJ0IiwicHJpbnRTdGFydCIsInByaW50YWJsZSIsInJ1bm5hYmxlIiwicHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCIsInNpbGVudFN1Y2Nlc3MiLCJzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0IiwiQm9vbGVhbiIsInByb2Nlc3NTaWxlbnRPdXRwdXQiLCJwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkiLCJ3cm90ZVNpbGVudFByb2dyZXNzIiwicHJvZ3Jlc3NUaW1lciIsInNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcyIsInNldEludGVydmFsIiwiY29uZmlndXJlRW52IiwicHJlc2VydmVDb2xvciIsImZpbmFsbHkiLCJjbGVhckludGVydmFsIiwib3V0cHV0Iiwic2lsZW50U3VjY2Vzc01lc3NhZ2UiLCJvblNpZ25hbCIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWwiLCJydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUiLCJwcmludFJhd091dHB1dCIsIm91dCIsInByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4iLCJuZXdTY3JpcHQiLCJibGl0eiIsInByaW50YWJsZVNjcmlwdCIsImZpeEJ1bkNvbW1hbmQiLCJydW5uYWJsZVNjcmlwdCIsInByZWZpeCIsIndlYWsiLCJncmF5IiwiY3lhbiIsImJvbGQiLCJwcmludE9wdGlvbnMiLCJleGl0IiwibmV3RW52IiwiY2kiLCJOT19DT0xPUiIsIkZPUkNFX0NPTE9SIiwiaXNUVFkiLCJjb25maWd1cmVDb2xvckVudiIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwiYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIiwib3B0aW9uTmFtZSIsImdldE9wdGlvblZhbHVlIiwiaXRlbSIsImNhbWVsQ2FzZU9wdGlvbk5hbWUiLCJjaGFyYWN0ZXIiLCJ0b1VwcGVyQ2FzZSIsImNvbmN1cnJlbnRseUNvbW1hbmQiLCJidWlsZGVyIiwic3VjY2VzcyIsImNob2ljZXMiLCJjb21tYW5kcyIsImRldGFjaGVkIiwiaW50ZXJydXB0ZWRTaWduYWwiLCJmaXJzdFJlc3VsdCIsInN0b3BSZXN1bHQiLCJzdG9wcGluZyIsImZvcmNlS2lsbFByb21pc2VzIiwicmVzdWx0cyIsIndhaXRGb3JFeGl0UHJvbWlzZXMiLCJjaGlsZCIsInNldHRsZWQiLCJzZXR0bGUiLCJraWxsT3RoZXJzIiwia2lsbE90aGVyc09uRmFpbCIsInNob3VsZFN0b3BPdGhlcnMiLCJ0ZXJtaW5hdGVDaGlsZHJlbiIsIm9uY2UiLCJnZXRFeGl0Q29kZSIsInN0b3BBbGwiLCJzdG9wT25TaWdpbnQiLCJzdG9wT25TaWd0ZXJtIiwic3RvcE9uU2lncXVpdCIsImFsbCIsInJ1bkNvbmN1cnJlbnRseSIsImNvbnN0YW50cyIsInNpZ25hbHMiLCJmb3JjZUtpbGxQaWRzIiwic2lnbmFsUGlkcyIsInRvQ2hpbGRQaWRzIiwicGlkcyIsImRlYWRsaW5lIiwiZXZlcnkiLCJpc1Byb2Nlc3NHcm91cEdvbmUiLCJzbGVlcCIsIk1hdGgiLCJtaW4iLCJ3YWl0Rm9yRm9yY2VLaWxsIiwic2lnbmFsZWRQaWRzIiwia2lsbFByb2Nlc3NHcm91cCIsIm1zIiwic2V0VGltZW91dCIsIkZJTEVfU0NIRU1BIiwiTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FIiwiREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIIiwiUE9TU0lCTEVfUFJJU01BX1BBVEhTIiwic2NoZW1hUGF0aCIsImRiUGF0aCIsImdldERhdGFiYXNlRGlyUGF0aCIsImdldFByaXNtYUJhc2VEaXIiLCJnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uIiwibG9jYWxDb25maWdQYXRoIiwicHJpc21hU2NyaXB0cyIsImNsZWFuVXBMaXRlc3RyZWFtIiwiZGVwbG95IiwiYWRkaXRpb25hbE9wdGlvbnMiLCJnZW5lcmF0ZSIsImRlcGxveUZvcmNlIiwicmVtb3ZlRGJDb21tYW5kIiwibGlzdEJhY2t1cHMiLCJtaWdyYXRlIiwic2VlZCIsIm1pZ3JhdGVEZXYiLCJzdGVwcyIsImNsZWFudXBDb21tYW5kIiwiZGJVcmwiLCJEQVRBQkFTRV9VUkwiLCJyYXdEYlBhdGgiLCJiYXNlRGlyIiwiYWJzb2x1dGVQYXRoIiwiaXNBYnNvbHV0ZSIsImNsZWFuVXBTcWxpdGVEYklmTmVlZGVkIiwicmVzZXRDb21tYW5kIiwicmVzdG9yZSIsIm91dHB1dFBhdGgiLCJzY3JpcHRQYXRoIiwicHJpc21hIiwic3R1ZGlvIiwiZGJVcmxPclBhdGgiLCJnZW5Db2RlQ29tbWFuZCIsImdlbkNvZGVUYXJnZXRzIiwiZ2V0R2VuQ29kZVNjcmlwdHMiLCJjaGFrcmFUeXBlZ2VuU2NyaXB0IiwidmVyc2lvbiIsIm1ham9yIiwibWF0Y2giLCJnZXRPd25EZXBlbmRlbmN5TWFqb3IiLCJmaWxlRXhpc3RzIiwiZ2V0Q2hha3JhU2NyaXB0IiwiZHJpenpsZUNvbmZpZ1BhdGgiLCJnZXREcml6emxlQ29uZmlnUGF0aCIsImtpbGxQb3J0SWZOb25DaUNvbW1hbmQiLCJwb3J0RW52IiwiUE9SVCIsInBvcnQiLCJraWxsUG9ydFByb2Nlc3MiLCJraWxsUG9ydElmTm9uQ2kiLCJwcmludEJ1ZmZlcmVkT3V0cHV0IiwiaGFzV2FybmluZ091dHB1dCIsInNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQiLCJub3JtYWxpemVkT3V0cHV0Iiwibm9ybWFsaXplQnVmZmVyZWRPdXRwdXQiLCJidWlsZFNoZWxsQ29tbWFuZCIsImFyZyIsInNoZWxsRXNjYXBlQXJndW1lbnQiLCJveGxpbnRFeHRlbnNpb25zIiwicHl0aG9uRXh0ZW5zaW9ucyIsImRhcnRFeHRlbnNpb25zIiwib3hmbXRFeHRlbnNpb25zIiwicHJldHRpZXJFeHRlbnNpb25zIiwicHJldHRpZXJPbmx5RXh0ZW5zaW9ucyIsImV4dCIsInByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4iLCJsaW50Q29tbWFuZCIsImZpeCIsImZvcm1hdCIsImxpbnQiLCJmaWxlcyIsImxpbnRUYXJnZXRzIiwiZ2V0TGludFRhcmdldEZpbGVzIiwibGludEZpbGVQYXRoc0J5UHJvamVjdCIsIm94Zm10RmlsZVBhdGhzQnlQcm9qZWN0IiwicHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0IiwiZGFydEZpbGVQYXRoc0J5UHJvamVjdCIsInByZXR0aWVyRmlsZVBhdGhzIiwicGFja2FnZUpzb25GaWxlUGF0aHMiLCJwcmV0dGllckFyZ3MiLCJzb3J0UGFja2FnZUpzb25BcmdzIiwibWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyIsImZpbGUiLCJmaWxlS2luZCIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImdldExpbnRUYXJnZXRGaWxlS2luZCIsImV4dGVuc2lvbiIsImV4dG5hbWUiLCJnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMiLCJsaW50UGF0aCIsImdldEV4cGxpY2l0TGludFRhcmdldHMiLCJweXRob25GaWxlUGF0aHMiLCJkYXJ0RmlsZVBhdGhzIiwic3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uIiwibGludEZpbGVQYXRocyIsIm94Zm10RmlsZVBhdGhzIiwiYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuIiwiZm9ybWF0dGVyUGF0aCIsImJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzIiwiaXNQb3RlbnRpYWxMaW50VGFyZ2V0Iiwic2VsZkRpclBhdGgiLCJuZWVkc1ByZXR0aWVyIiwicHJvamVjdFBhdHRlcm4iLCJidWlsZFByZXR0aWVyQXJncyIsImZvcm1hdHRlckNvbW1hbmRzIiwibGludGVyQ29tbWFuZHMiLCJsaW50UnVuT3B0aW9ucyIsInByaW50QWxsT3V0cHV0Iiwic2hvdWxkUnVuRm9ybWF0dGVycyIsInNob3VsZFJ1bkxpbnRlcnMiLCJidWlsZExpbnRDb21tYW5kIiwiYnVpbGRQb2V0cnlMaW50Q29tbWFuZCIsImJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCIsImJ1aWxkRGFydExpbnRDb21tYW5kIiwiYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZCIsImJ1aWxkT3hmbXRDb21tYW5kIiwibGludEV4aXRDb2RlcyIsImZvcm1hdHRlclJlc3VsdHMiLCJydW5MaW50Q29tbWFuZHMiLCJwcmludFNpbGVudExpbnRPdXRwdXRzIiwicHJldHRpZXJSZXN1bHQiLCJydW5MaW50Q29tbWFuZCIsInNvcnRQYWNrYWdlSnNvblJlc3VsdCIsImxpbnRlclJlc3VsdHMiLCJydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQiLCJ0aGVuIiwicHJpbnRhYmxlUmVzdWx0cyIsInByaW50Q29tbWFuZE91dHB1dCIsInByaW50Q29tbWFuZEhlYWRlciIsInRhcmdldHMiLCJzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIiLCJkZXNjZW5kYW50UHJvamVjdHMiLCJvd25pbmdQcm9qZWN0IiwiZmluZE93bmluZ1Byb2plY3QiLCJraWxsZWQiLCJraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MiLCJmaWx0ZXJBcmdzIiwiY29udGFpbmVySWRzIiwiaWQiLCJsaXN0RG9ja2VyQ29udGFpbmVySWRzIiwicmVtb3ZlRG9ja2VyQ29udGFpbmVycyIsInN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQiLCJjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyIsInJhd1BvcnQiLCJpc1BvcnRBdmFpbGFibGUiLCJraWxsRnVuYyIsImtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0IiwiaG9zdCIsInByb2JlUG9ydCIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsImVyciIsImNsb3NlIiwibGlzdGVuIiwiZ2V0TWFpbnRlbmFuY2VTZXJ2ZXJTb3VyY2UiLCJwaWRQYXRoIiwicmF3IiwibWFpbnRlbmFuY2VDb21tYW5kIiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiYWN0aW9uIiwiYXNzZXJ0Iiwib2siLCJwYXJzZVBvcnQiLCJnZXRQaWRQYXRoIiwicmVhZFBpZCIsInJlbW92ZVBpZEZpbGUiLCJzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIiLCJleGlzdGluZ1BpZCIsImlzUHJvY2Vzc1J1bm5pbmciLCJta2RpclN5bmMiLCJleGVjUGF0aCIsInVucmVmIiwid2FpdEZvclBpZEZpbGUiLCJzdGFydE1haW50ZW5hbmNlU2VydmVyIiwicm1TeW5jIiwiZm9yY2UiLCJwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQiLCJjb21tYW5kTmFtZSIsInJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCIsIm91dHNpZGUiLCJkZXBzIiwib3B0aW1pemVEZXZEZXBlbmRlbmNpZXMiLCJvcHRpbWl6ZVNjcmlwdHMiLCJvcHRpbWl6ZVJvb3RQcm9wcyIsImRpc3REaXJQYXRoIiwid3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMiLCJzb3VyY2VEaXJQYXRoIiwiY3VycmVudERpclBhdGgiLCJmaWxlVVJMVG9QYXRoIiwidXJsIiwiY2FuZGlkYXRlIiwicGFyZW50RGlyUGF0aCIsImZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoIiwiZGlyZW50IiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJpc0ZpbGUiLCJ0YXJnZXRGaWxlUGF0aCIsImNvcHlGaWxlIiwiY2htb2QiLCJkZXZEZXBzIiwicHJvbW90ZWREZXBzIiwicHJvbW90ZVJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMiLCJuYW1lV29yZHNUb0JlUmVtb3ZlZCIsInJlbW92ZWREZXBzIiwid29yZCIsInJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkIiwibmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMiLCJjb250ZW50V29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsInJlbW92ZWRTY3JpcHRzIiwiY29udGVudCIsInByaXZhdGUiLCJwdWJsaXNoQ29uZmlnIiwicHJldHRpZXIiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsIkRBVEFCQVNFX1BBVEgiLCJnZXRGaWxlRGF0YWJhc2VVcmxQYXRoIiwiZHJpenpsZVNjcmlwdHMiLCJyZW1vdmVDb21tYW5kIiwic2VlZENvbW1hbmQiLCJtaWdyYXRlQ29tbWFuZCIsIm1pZ3JhdGVGb3JTdGFydCIsIl9wcm9qZWN0IiwicHJpc21hQ29tbWFuZCIsImFsaWFzZXMiLCJwYXJzZXJDb25maWd1cmF0aW9uIiwiY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kIiwiY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQiLCJkZXBsb3lDb21tYW5kIiwiZGVwbG95Rm9yY2VDb21tYW5kIiwiZ2VuZXJhdGVDb21tYW5kIiwibGlzdEJhY2t1cHNDb21tYW5kIiwibWlncmF0ZURldkNvbW1hbmQiLCJyZXN0b3JlQ29tbWFuZCIsInN0dWRpb0NvbW1hbmQiLCJkZWZhdWx0Q29tbWFuZCIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJhbGxQcm9qZWN0cyIsImZpbmREYXRhYmFzZU9ybVByb2plY3RzIiwicHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnIiwidW5rbm93bk9wdGlvbnMiLCJleHRyYWN0VW5rbm93bk9wdGlvbnMiLCJvcm0iLCJnZXREYXRhYmFzZU9ybVNjcmlwdHMiLCJvcm1TY3JpcHRzIiwic2hvdWxkQ2hlY2tJZGVtcG90ZW5jeSIsImNoZWNrSWRlbXBvdGVuY3kiLCJpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCIsInllbGxvdyIsIldCX0RPQ0tFUiIsImlzRG9ja2VyRW5hYmxlZCIsInJlc3RvcmVkIiwiZnVsbENvbW1hbmQiLCJ0cmltRW5kIiwicmVxdWlyZWRFbnZWYXJzIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSIsIm1pc3NpbmdFbnZWYXJzIiwicmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCIsImxpdGVzdHJlYW1Db25maWciLCJ3cml0ZUZpbGVTeW5jIiwicmVhc29uIiwiZmlsdGVyZWQiLCJvcm1Qcm9qZWN0QnlQcm9qZWN0Iiwib3JtUHJvamVjdCIsImtub3duT3B0aW9ucyIsInNoYXJlZE9wdGlvbktleXMiLCJzaGFyZWRPcHRpb25BbGlhc2VzIiwib3B0aW9uIiwiYWxsS25vd25PcHRpb25zIiwia2ViYWJDYXNlS2V5IiwidG9Mb3dlckNhc2UiLCJwYXNzdGhyb3VnaEFyZ3MiLCJyZXRyeUNvbW1hbmQiLCJyZXRyeSIsImNtZEFuZEFyZ3MiLCJsYXN0U3RhdHVzIiwic2V0dXBDb21tYW5kIiwiZGlyZW50cyIsIm9zIiwicGFja2FnZXMiLCJwcm9taXNlQWxsIiwicGxheXdyaWdodCIsInNldHVwIiwidG9EZXZOdWxsIiwiZG9ja2VyU2NyaXB0cyIsImJ1aWxkSW1hZ2UiLCJtaXNlQWdlS2V5U2VjcmV0T3B0aW9uIiwiTUlTRV9BR0VfS0VZIiwic3RvcEFuZFN0YXJ0IiwiYWRkaXRpb25hbEFyZ3MiLCJzdG9wIiwic3Bhd25TeW5jT25FeGl0IiwiQmFzZVNjcmlwdHMiLCJzaG91bGRXYWl0QW5kT3BlbkFwcCIsImJ1aWxkRG9ja2VyIiwic3RhcnREZXYiLCJzdGFydERldlByb3RlY3RlZCIsIndhaXRBbmRPcGVuQXBwIiwic3RhcnRQcm9kdWN0aW9uIiwic3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkIiwic3RhcnRUZXN0Iiwic3RhcnREb2NrZXIiLCJub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQiLCJub3JtYWxpemVkQXJnc1RleHQiLCJjdXN0b21TdGFydFNjcmlwdFBhdGgiLCJmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aCIsImJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQiLCJlY29zeXN0ZW1Db25maWdQYXRoIiwiZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyIsImNtZCIsInRlc3RFMkVEZXYiLCJ0ZXN0RTJFUHJvdGVjdGVkIiwidGVzdEUyRVByb2R1Y3Rpb24iLCJ0ZXN0RTJFRG9ja2VyIiwidGVzdFN0YXJ0Iiwid2FpdEFwcCIsInN0YXJ0Q29tbWFuZCIsImZvcndhcmRlZFBsYXl3cmlnaHRBcmdzIiwicGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0Q29tbWFuZCIsImJhaWwiLCJiYXNlIiwibm9ybWFsaXplZFRhcmdldHMiLCJhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbiIsInJlc3QiLCJleHBsaWNpdFRhcmdldEluZGV4ZXMiLCJmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyIsInJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQiLCJidWlsZFBsYXl3cmlnaHRDb21tYW5kIiwidGVzdFVuaXQiLCJjb21tYW5kQXJncyIsInBsYXl3cmlnaHRJbmRleCIsImluZGV4T2YiLCJpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCIsInBlbmRpbmdWYWx1ZU1vZGUiLCJ0YXJnZXRJbmRleGVzIiwib2Zmc2V0IiwiUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyIsInNob3J0T3B0aW9uIiwiUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMiLCJibGl0elNjcmlwdHMiLCJodHRwU2VydmVyU2NyaXB0cyIsIndhdGNoIiwidGVzdENvbW1hbmQiLCJuZXh0U2NyaXB0cyIsInBsYWluQXBwU2NyaXB0cyIsIl8xIiwiXzIiLCJyZW1peFNjcmlwdHMiLCJ2aXRlU2NyaXB0cyIsImh0dHBTZXJ2ZXJQYWNrYWdlcyIsIm1vZGUiLCJkb2NrZXJPcHRpb25zIiwibm9ybWFsaXplQXJncyIsIm5leHQiLCJ2aXRlIiwiZTJlIiwiYXJndW1lbnRzQnVpbGRlciIsImFycmF5IiwidGVzdEFyZ3YiLCJ3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52IiwidGVzdFRhcmdldHMiLCJzaG91bGRSdW5FMmUiLCJzaG91bGRSdW5Vbml0IiwiaGFzRTJlVGFyZ2V0cyIsInRhcmdldCIsImhhc1VuaXRUYXJnZXRzIiwic2hvdWxkUnVuQWxsVGVzdHMiLCJyZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMiLCJkZWZhdWx0VW5pdFRhcmdldHMiLCJnZXREZWZhdWx0VW5pdFRhcmdldHMiLCJ1bml0VGFyZ2V0cyIsInVuaXRBcmd2IiwicnVuVW5pdFRlc3RDb21tYW5kIiwidW5pdFRpbWVvdXQiLCJlMmVUYXJnZXRzIiwiZTJlQXJndiIsInJ1blRlc3RDb21tYW5kIiwiYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRSIsInRlc3RPbkRvY2tlciIsImJ1aWxkRXhpdENvZGUiLCJ0ZXN0RXhpdENvZGUiLCJzdG9wRXhpdENvZGUiLCJkZWR1cGVOb2lzeVRlc3RPdXRwdXQiLCJyZWNlbnRQcmludGVkTGluZXMiLCJyZWNlbnRQcmludGVkTGluZVNldCIsImRlZHVwZWRMaW5lcyIsImxpbmVTdGFydEluZGV4IiwibGluZUVuZEluZGV4IiwiaXRlcmF0ZUxpbmVzIiwibm9ybWFsaXplZExpbmUiLCJub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eSIsInByaW50ZWRMaW5lIiwiYXJlTGluZXNTaW1pbGFyIiwicHVzaFJlY2VudFByaW50ZWRMaW5lIiwibGluZVNldCIsInJlbW92ZWRMaW5lIiwic2hpZnQiLCJkZWxldGUiLCJtYXhMZW5ndGgiLCJtYXgiLCJhYnMiLCJkaXN0YW5jZSIsImhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzIiwidGVzdE9uQ2lDb21tYW5kIiwidGVzdE9uQ2kiLCJ0cmVlS2lsbENvbW1hbmQiLCJkZW1hbmRPcHRpb24iLCJ0eXBlQ2hlY2tDb21tYW5kIiwicmVtb3ZlZE5leHREaXIiLCJidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyIsIm5leHREaXJQYXRoIiwiZXhpdENvZGVzIiwiZmluYWxFeGl0Q29kZSIsInR5cGVDaGVjayIsInRjQ29tbWFuZCIsInZlcmlmeUNvZGVDb21tYW5kIiwiZnVsbCIsInJlcG9ydGVyIiwic3RhcnRlZEF0Iiwid2JEaXJQYXRoIiwibG9nRmlsZVBhdGgiLCJsb2dGaWxlIiwib3BlblN5bmMiLCJvcmlnaW5hbFN0ZG91dFdyaXRlIiwiYmluZCIsIm9yaWdpbmFsU3RkZXJyV3JpdGUiLCJzdWNjZWVkZWQiLCJmaW5pc2hlZCIsInRlZVdyaXRlIiwiZmQiLCJmaW5pc2giLCJlbGFwc2VkVGltZSIsIm1pbGxpc2Vjb25kcyIsInNlY29uZHMiLCJyb3VuZCIsIm1pbnV0ZXMiLCJmbG9vciIsInJlbWFpbmluZ1NlY29uZHMiLCJmb3JtYXRFbGFwc2VkVGltZSIsInN1bW1hcnkiLCJjb2xvcmVkU3VtbWFyeSIsIndyaXRlU3luYyIsImNsb3NlU3luYyIsImZhaWwiLCJzdWNjZWVkIiwic3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIiLCJ2ZXJpZnlDb2RlIiwicnVuUGFja2FnZUNvbW1hbmQiLCJyZXRyeUV4aXRDb2RlIiwicnVuUHJvamVjdFRlc3QiLCJ2ZXJpZnlDb2RlRnVsbHkiLCJhbGxvd0ZhaWx1cmUiLCJydW5JblByb2Nlc3NDb21tYW5kIiwicHJpbnRDb21tYW5kIiwidHJpbW1lZE91dHB1dCIsInByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQiLCJvdXRwdXRGaWxlIiwiY2h1bmsiLCJlbmNvZGluZ09yQ2FsbGJhY2siLCJjYWxsYmFjayIsImJ1ZmZlciIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwibWlkZGxld2FyZSIsIndvcmtpbmdEaXIiLCJjaGRpciIsIkJFUlJZX0JJTl9GT0xERVIiLCJ1cHBlcktleSIsInJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyIsInBhY2thZ2VKc29uRGlyIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwiaGVscCIsInNodXR0aW5nRG93biJdLCJtYXBwaW5ncyI6ImlzQkFRTyxNQUFNQSxFQUE0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QUlHLEdBQUd0QixFQUFFSyxHQUFHLEdBQUcsSUFBSUwsRUFBRUssR0FBRyxFQUFFLEtBQUtjLEVBQUUsSUFBSUcsR0FBR3RCLEVBQUVLLEdBQUcsR0FBRyxJQUFJTCxFQUFFSyxHQUFHLEdBQUcsTUFBTWlCLENBQUMsRUFBRSxNQUFNRSxFQUFFLFNBQVN4QixHQUFHLElBQUlDLEVBQUVDLEVBQUVpQixFQUFFZixFQUFFQyxFQUFFbUIsRUFBRUosRUFBRUMsRUFBRUMsRUFBRUssRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsRUFBRUMsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBR0MsR0FBRyxJQUFJN0QsRUFBRSxFQUFFQSxFQUFFLEdBQUdBLEdBQUcsRUFBRWYsRUFBRUosRUFBRSxHQUFHQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQSxFQUFFLElBQUlLLEVBQUVMLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJd0IsRUFBRXhCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJb0IsRUFBRXBCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJcUIsRUFBRXJCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJc0IsRUFBRXRCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJMkIsRUFBRTNCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNEIsRUFBRTVCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJNkIsRUFBRTdCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJOEIsRUFBRTlCLEVBQUUsR0FBR0EsRUFBRSxJQUFJQSxFQUFFLElBQUlBLEVBQUUsSUFBSUEsRUFBRSxJQUFJQyxFQUFFNEIsR0FBR0wsR0FBRyxFQUFFSixJQUFJLElBQUlsQixFQUFFNEIsR0FBR1YsR0FBRyxFQUFFSSxJQUFJLElBQUl4QixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUVHLEdBQUdpQixHQUFHLEVBQUVDLElBQUksSUFBSXBCLEVBQUVHLEdBQUdpQixHQUFHLEVBQUVELElBQUksSUFBSXJCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRXVCLEdBQUdHLEdBQUcsRUFBRUMsSUFBSSxJQUFJMUIsRUFBRWtCLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJM0IsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FB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
35
+ `}const Ft={command:"maintenance <action>",describe:"Start or stop a lightweight maintenance page server. Example: wb maintenance start",builder:e=>e.positional("action",{choices:["start","stop"],describe:"Maintenance server action",type:"string"}).options(_t),async handler(n){const r=ae(n);r||(console.error(d.red("No project found.")),process.exit(1));const s=n.action;if("test"===r.env.WB_ENV)return void console.info(`Skip maintenance ${s} because WB_ENV is test.`);const i=function(e){const t=Number(e);return w.ok(Number.isInteger(t)&&t>0,`PORT environment variable is invalid: ${e}`),t}(r.env.PORT);if("start"!==s){if("stop"!==s)throw new Error(`Unknown maintenance action: ${s}`);!function(e,t){const n=Bt(e,t),r=zt(n);if(void 0===r)return void console.info(`Maintenance server is not running on port ${t}.`);try{process.kill(r,"SIGTERM")}catch{}Lt(n),console.info(`Stopped maintenance server on port ${t}.`)}(r,i)}else await async function(n,r){const s=Bt(n,r),i=zt(s);if(void 0!==i&&Mt(i))return void console.info(`Maintenance server is already running on port ${r}.`);Lt(s),await It(r)||(console.error(d.red(`Port ${r} is already in use.`)),process.exit(1));e.mkdirSync(t.dirname(s),{recursive:!0});const a=o.spawn(process.execPath,["--input-type=module","--eval",Ct(r,s)],{detached:!0,env:n.env,stdio:"ignore"});if(void 0===a.pid)throw new Error("Failed to start maintenance server.");a.unref(),await async function(e,t){const n=Date.now()+5e3;for(;Date.now()<n;){if(void 0!==zt(e))return;if(!Mt(t))break;await b(50)}throw Lt(e),new Error("Failed to start maintenance server.")}(s,a.pid),console.info(`Started maintenance server on port ${r}.`)}(r,i)}};function Bt(e,n){return t.join(e.rootDirPath,".tmp",`wb-maintenance-server-${n}.pid`)}function zt(t){try{const n=Number(e.readFileSync(t,"utf8").trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function Mt(e){try{return process.kill(e,0),!0}catch{return!1}}function Lt(t){try{e.rmSync(t,{force:!0})}catch{}}function*Wt(e,t){for(const n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Ut=["@willbooster/wb","build-ts"],Jt={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 de(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of Wt("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(Vt(n,r),Gt(r),qt(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.outside&&await Yt(t.join(i,"bash"))}n.dryRun||n.outside||(o.spawnSync(he,["install"],{stdio:"inherit"}),console.info("Installed dependencies."))}};async function Yt(n){const r=function(){let n=t.dirname(k(import.meta.url));for(;;){const r=t.join(n,"docker","bash");if(e.existsSync(r))return r;const o=t.dirname(n);if(o===n)throw new Error("Docker shell scripts directory not found.");n=o}}();await e.promises.mkdir(n,{recursive:!0});for(const o of await e.promises.readdir(r,{withFileTypes:!0})){if(!o.isFile()||!o.name.endsWith(".sh"))continue;const s=t.join(n,o.name);await e.promises.copyFile(t.join(r,o.name),s),await e.promises.chmod(s,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function Vt(e,t){!function(e){const t=e.devDependencies??{},n=e.dependencies??{},r=[];for(const e of Ut){const o=t[e];o&&(n[e]||(n[e]=o,r.push(e)),delete t[e])}r.length>0&&(e.dependencies=n);console.info("Promoted runtime devDependencies:",r.join(", ")||"none")}(t),e.outside?function(e){const t=e.devDependencies??{},n=["artillery","concurrently","conventional-changelog-conventionalcommits","husky","imagemin","jest","kill-port","lint-staged","open-cli","playwright","prettier","pinst","railway","semantic-release","sort-package-json","wait-on","vitest"],r=[];for(const e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes("willbooster")&&e.includes("config"))&&(delete t[e],r.push(e));console.info("Removed devDependencies:",r.join(", ")||"none")}(t):(delete t.devDependencies,console.info("Removed all devDependencies."))}function Gt(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 qt(e){delete e.private,delete e.publishConfig,delete e.prettier}const Kt="file:";function Ht(e){const n=e.env.DATABASE_PATH??function(e){const t=e.env.DATABASE_URL;if(!t?.startsWith(Kt))return;const n=t.slice(5).replace(/[?#].*$/,"");if(!n)return;return n}(e);if(!n)return;const r=t.isAbsolute(n)?n:t.resolve(e.dirPath,n);return`rm -f "${r}" "${r}-wal" "${r}-shm"`}const Qt=new class{reset(e,t=""){const n=Ht(e);return n?`${n} && ${this.migrate(e,t)}`:"echo 'wb db reset supports Drizzle only when DATABASE_PATH or file: DATABASE_URL is set.' && exit 1"}migrate(e,t=""){const n=this.seed(e),r=this.deploy(e,t);return"true"===n?r:`${r} && ${n}`}migrateForStart(e,t=""){return ce(e,"test")&&Ht(e)?this.reset(e,t):this.migrate(e,t)}deploy(e,t=""){return`YARN drizzle-kit migrate ${t}`}generate(e,t=""){return`YARN drizzle-kit generate ${t}`}migrateDev(e,t=""){return this.generate(e,t)}seed(e,t){return t?`BUN build-ts run ${t}`:e.packageJson.scripts?.seed?"YARN run seed":"true"}studio(e,t,n=""){return t?"echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1":`YARN drizzle-kit studio ${n}`}},Zt={},Xt={command:"prisma",aliases:["db"],describe:"Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init",builder:e=>e.parserConfiguration({"populate--":!0}).command(en).command(tn).command(nn).command(rn).command(on).command(sn).command(an).command(ln).command(un).command(pn).command(fn).command(hn).command(mn).demandCommand().strict(!1),handler(){}},en={command:"cleanup-litestream",describe:"Clean up temporal Litestream files",builder:Zt,async handler(e){const t=await yn(e,"prisma");for(const{project:n}of bn("prisma cleanup-litestream",t))await Pe(Ke.cleanUpLitestream(n),n,e)}},tn={command:"create-litestream-config",describe:"Create Litestream configuration file",builder:Zt,async handler(e){const t=await yn(e,"prisma");for(const{project:e}of bn("prisma create-litestream-config",t))gn(e)}},nn={command:"deploy",describe:"Apply migration to DB without initializing it",builder:Zt,async handler(e){const t=await yn(e),n=vn(e);for(const{orm:r,project:o}of bn("db deploy",t))await Pe(wn(r).deploy(o,n),o,e)}},rn={command:"deploy-force",describe:"Force to apply migration to DB utilizing Litestream's backup without initializing it",builder:Zt,async handler(e){const t=await yn(e,"prisma");for(const{project:n}of bn("prisma deploy-force",t))await Pe(Ke.deployForce(n),n,e)}},on={command:"generate",describe:"Generate ORM client code",builder:Zt,async handler(e){const t=await yn(e),n=vn(e);for(const{orm:r,project:o}of bn("db generate",t))await Pe(wn(r).generate(o,n),o,e)}},sn={command:"list-backups",describe:"List Litestream backups",builder:Zt,async handler(e){const t=await yn(e,"prisma");for(const{project:n}of bn("prisma list-backups",t))await Pe(Ke.listBackups(n),n,e)}},an={command:"migrate",describe:"Apply migration to DB with initializing it",builder:{...Zt,"check-idempotency":{description:"Run the migration command twice to confirm it is idempotent.",type:"boolean"}},async handler(e){const t=await yn(e),n=vn(e,["check-idempotency"]);for(const{orm:r,project:o}of bn("db migrate",t)){const t=wn(r);await Pe(t.migrate(o,n),o,e),cn(o,e.checkIdempotency)&&(dn(o)?console.info(d.yellow(`Skipping idempotency check for ${o.name} in production environment.`)):await Pe(t.deploy(o,n),o,e))}}};function cn(e,t){return t??function(e){return!!e.env.WB_DOCKER&&"0"!==e.env.WB_DOCKER&&"false"!==e.env.WB_DOCKER}(e)}function dn(e){return ce(e,"production")}const ln={command:"migrate-dev",describe:"Create a migration file",builder:Zt,async handler(e){const t=await yn(e),n=vn(e);for(const{orm:r,project:o}of bn("db migrate-dev",t))await Pe(wn(r).migrateDev(o,n),o,e)}},un={command:"reset",describe:"Reset DB",builder:Zt,async handler(e){const t=await yn(e),n=vn(e);for(const{orm:r,project:o}of bn("db reset",t))await Pe(wn(r).reset(o,n),o,e);if("test"!==process.env.WB_ENV){process.env.WB_ENV="test";for(const{orm:t,project:r}of bn("WB_ENV=test db reset",await yn(e)))await Pe(wn(t).reset(r,n),r,e)}}},pn={command:"restore",describe:"Restore DB from Litestream's backup",builder:{...Zt,output:{description:'Output path of the restored database. Defaults to "<db|prisma>/restored.sqlite3".',type:"string"}},async handler(e){const t=await yn(e,"prisma");for(const{project:n}of bn("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)}}},fn={command:"seed",describe:"Populate DB with seed data",builder:{...Zt,file:{alias:"f",description:"Path of the seed script.",type:"string"}},async handler(e){const t=await yn(e);for(const{orm:n,project:r}of bn("db seed",t))await Pe(wn(n).seed(r,e.file),r,e)}},hn={command:"studio [db-url-or-path]",describe:"Open database studio",builder:{...Zt,"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 yn(e),n=vn(e,["db-url-or-path","restored"]);for(const{orm:r,project:o}of bn("db studio",t)){const t=e.restored?o.packageJson.dependencies?.blitz?"db/restored.sqlite3":"prisma/restored.sqlite3":e.dbUrlOrPath?.toString();await Pe(wn(r).studio(o,t,n),o,e)}}},mn={command:"$0 <args..>",describe:"Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.",builder:{args:{type:"array"}},async handler(e){const t=await yn(e),n=[(e.args?.join(" ")??"").trimEnd(),vn(e,["args"])].filter(Boolean).join(" ");for(const{orm:r,project:o}of bn(`db ${n}`,t)){const t="prisma"===r?`PRISMA ${n}`:`YARN drizzle-kit ${n}`;await Pe(t,o,e)}}};function gn(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}`,{cause:e})}}async function yn(e,t){const n=await de(e);n||(console.error(d.red("No project found.")),process.exit(1));const r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!(!e||t&&e.orm!==t));return 0===r.length&&(console.error(d.red(t?`No ${t} project found.`:"No supported database ORM project found.")),process.exit(1)),r}function wn(e){return"prisma"===e?Ke:Qt}function*bn(e,t){const n=new Map(t.map(e=>[e.project,e]));for(const r of Wt(e,t.map(({project:e})=>e))){const e=n.get(r);if(!e)throw new Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function vn(e,t=[]){const n=[],r=Object.keys(De),o=Object.values(De).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))}const i=Array.isArray(e["--"])?e["--"].map(String):[];return tt([...n,...i])}const kn={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=ae(e);t||(console.error(d.red("No project found.")),process.exit(1));const n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean);let r=0;for(let o=0;o<e.retry;o++)if(o>0&&console.info(`\n${d.yellow(`#${o} Retrying: ${n.join(" ")}`)}`),r=await Pe(n.join(" "),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),0===r)return;process.exit(r)}},Sn={command:"setup",describe:"Setup development environment. .env files are ignored.",builder:{},async handler(e){await async function(e,t){const n=await de(e,!1,t);n||(console.error(d.red("No project found.")),process.exit(1));for(const t of Wt("setup",n.descendants)){const r=await y.readdir(t.dirPath,{withFileTypes:!0});if(t===n.root){if("darwin"===f.platform()){const n=["pstree"];await Ae(`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 Ae("poetry config virtualenvs.in-project true",t,e);const[,n]=o.execSync("asdf current python").toString().trim().split(/\s+/);await Ae(`poetry env use ${n}`,t,e),await Se.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(`${me} gen-code`,t,e)}const r=n.descendants.find(e=>e.packageJson.devDependencies?.playwright);r&&await Pe(`${me} playwright install --with-deps`,r,e)}(e)}};function En(e){return e.silent?" > /dev/null":""}const Pn=new class{buildImage(e,n){const r=e.dockerPackageJson.scripts?.["docker/build/prepare"]?"YARN run docker/build/prepare && ":"",o=e.env.MISE_AGE_KEY?"\n --secret id=mise_age_key,env=MISE_AGE_KEY":"";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}${o} .`}stopAndStart(e,t="",n=""){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t="",n=""){!function(e,t){const n=()=>{if(Ot.has(e))return;Ot.add(e),$e(e,t);const{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:"inherit"});je(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 ":""}${e.env.MISE_AGE_KEY?"--env MISE_AGE_KEY ":""}--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 An{constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return Pn.buildImage(e,t)}async startDev(e,t){return await Nt(e.env.PORT,e),this.shouldWaitAndOpenApp?tt(["YARN","wb","concurrently",...Ne(t),"--kill-others-on-fail",this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await Nt(e.env.PORT,e),this.shouldWaitAndOpenApp?tt(["YARN","wb","concurrently",...Ne(t),"--kill-others-on-fail",this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await Nt(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await Nt(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,"development")}\n && ${tt(["YARN","wb","concurrently",...Ne(t),"--kill-others-on-fail",Pn.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??""),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,"development")}\n && ${Pn.stopAndStart(e,t.normalizedDockerOptionsText??"",t.normalizedArgsText??"")}`}startProductionProtected(e,t){const n=function(e){try{return e.findFile("scripts/start-production.sh")}catch{return}}(e);if(n)return this.buildProductionCommand(e,t,[e.buildCommand,`${tt(["bash",n])} ${t.normalizedArgsText??""}`.trim()]);const r=function(e){try{return e.findFile("ecosystem.config.cjs")}catch{return}}(e),o=r?[e.buildCommand,`pm2-runtime start --no-autorestart ${r}`]:this.buildDefaultProductionStartCommands(e,t);return this.buildProductionCommand(e,t,o)}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`${e.isBunAvailable?"bun":"node"} dist/index.js ${t.normalizedArgsText??""}`.trim()]}buildProductionCommand(e,t,n){return[...[...e.hasPrisma?[Ke.migrate(e)]:[],...e.hasDrizzle?[Qt.migrateForStart(e)]:[]].flatMap(e=>e.split("&&")),...n].filter(Boolean).map(e=>`${e} ${En(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,Pn.stopAndStart(e),n)}async testStart(e,t){return await Nt(e.env.PORT,e),`${n="NODE_ENV",r="",`${n}=${nt(r)}`} ${tt(["YARN","wb","concurrently",...Ne(t),"--kill-others","--success","first",this.startDevProtected(e,t),this.waitApp(e)])}`;var n,r}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:o=["test","test/e2e/"]}){const s=await Nt(e.env.PORT,e),i=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",a=function(e,t,n,r=[]){const o=["BUN","playwright"],s=t?.map(String);if("test"!==e[0]||!s?.length)return xn([...o,...e,...r],n);const i=e.slice(1),a=$n(i),c=0===a.length?i:i.filter((e,t)=>!a.includes(t));return xn([...o,"test",...s,...c,...r],n)}(o,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${a}${i}`:tt(["YARN","wb","concurrently",...Ne(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${s}\n && ${a}${i}`])}testUnit(e,t){const n=t.targets?.map(String);return e.hasVitest?tt(["YARN","vitest","run",...n?.length?n:["test/unit/"],"--passWithNoTests","--allowOnly","--watch=false",...t.bail?["--bail=1"]:[]]):e.isBunAvailable?tt(["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 xn(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="))?tt(e):tt([...e,"--max-failures=1"]):tt(e)}function $n(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;jn.has(o)?t="required":Rn.has(o)&&(t="optional")}else{if(o.startsWith("-")&&"-"!==o){const e=o.slice(0,2);2===o.length&&On.has(e)&&(t="required");continue}n.push(r)}}return n}const jn=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"]),Rn=new Set(["--only-changed","--update-snapshots","--update-source-method"]),On=new Set(["-c","-g","-j"]);const Dn=new class extends An{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??""}`}};const Nn=new class extends An{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 Nt(e.env.PORT,e),s=e.packageJson.scripts?.["test/e2e-additional"]?" && YARN test/e2e-additional":"",i=t.targets?.map(String),a=i?.length?i:["test/e2e/"],c=this.testUnit(e,{...t,targets:a});return tt(["YARN","wb","concurrently",...Ne(t),"--kill-others","--success","first",`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${o} && ${c}${s}`])}};const In=new class extends An{constructor(){super(!0)}startDevProtected(e,t){return`YARN next dev --turbopack ${t.normalizedArgsText??""}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??""}`.trim()]}};const Tn=new class extends An{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} && ${fe} 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")} && ${Pn.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 _n=new class extends An{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??""}`}};const Cn=new class extends An{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()}},Fn=["express","fastify","elysia","hono"],Bn={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"}},zn={command:"start [args..]",describe:"Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0",builder:e=>e.parserConfiguration({"populate--":!0}).options(Bn),async handler(e){!function(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e["--"]??[]].map(e=>nt(String(e))).join(" "),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>nt(String(e))).join(" ")}(e);const t=await de(e);t||(console.error(d.red("No project found.")),process.exit(1));for(const n of t.descendants){const t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{};let o;if(t.blitz)o=Dn;else if(t.next)o=In;else if(r["@remix-run/dev"])o=_n;else if(r.vite)o=Cn;else if(Fn.some(e=>t[e])&&!t["firebase-functions"]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))o=Nn;else{if(!t["build-ts"]&&!r["build-ts"])continue;o=Tn}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}`)}}}},Mn=new RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,"g"),Ln={e2e:{description:"How to run E2E tests",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"}},Wn={array:!0,description:"Unit or E2E test target paths",type:"string"},Un={command:"test [targets...]",describe:"Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'",builder:e=>e.parserConfiguration({"populate--":!0}).options(Ln).positional("targets",Wn),async handler(e){process.exit(await Jn(e))}};async function Jn(n,r={}){const o=Yn(n),s=await de(o);if(!s)return console.error(d.red("No project found.")),1;const i=o.targets??[],a=o["--"]??[],{shouldRunE2e:c,shouldRunUnit:l}=function(e,t=[]){const n=e.some(e=>e.includes("/e2e")),r=e.some(e=>e.includes("/unit")),o=0===e.length&&0===t.length;return{shouldRunUnit:o||r,shouldRunE2e:o||n||t.length>0}}(i,a);for(const n of s.descendants){n.env.WB_ENV||="test";const s=n.packageJson.dependencies??{},d=n.packageJson.devDependencies??{};let u;u=s.blitz?Dn:s.next?In:d["@remix-run/dev"]?_n:d.vite?Cn:Fn.some(e=>s[e])&&!s["firebase-functions"]?Nn:Tn,console.info(`Running "test" for ${n.name} ...`);const p=Vn(n);if(l&&!1!==p){const e=i.filter(e=>e.includes("/unit")),t=e.length>0?e:p.length>0?p:void 0,s={...o,targets:t},a=await Kn(u.testUnit(n,s),n,o,{exitIfFailed:r.exitIfFailed,timeout:o.unitTimeout});if(0!==a)return a}if(!c||!e.existsSync(t.join(n.dirPath,"test","e2e")))continue;const f=i.filter(e=>e.includes("/e2e")),h={...o,targets:f.length>0?f:void 0};switch(o.e2e){case"headless":{const e=await qn(await u.testE2EProduction(n,h,{playwrightArgs:er(f,a),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"headless-dev":{const e=await qn(await u.testE2EDev(n,h,{playwrightArgs:er(f,a),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;continue}case"docker":{const e=await Gn(n,h,u,er(f,a),a,r);if(0!==e)return e;continue}case"docker-debug":{const e=await Gn(n,h,u,er(f,a,["--debug"]),a,r);if(0!==e)return e;continue}}if(s.blitz||s.next||d["@remix-run/dev"]||d.vite)switch(o.e2e){case"headed":{const e=await qn(await u.testE2EProduction(n,h,{playwrightArgs:er(f,a,["--headed"]),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"headed-dev":{const e=await qn(await u.testE2EDev(n,h,{playwrightArgs:er(f,a,["--headed"]),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"debug":{const e=await qn(await u.testE2EProduction(n,h,{playwrightArgs:er(f,a,["--debug"]),forwardedPlaywrightArgs:a}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"generate":{const e=await qn(await u.testE2EProduction(n,h,{playwrightArgs:["codegen",`http://localhost:${n.env.PORT}`]}),n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}case"trace":{const e=await qn("BUN playwright show-trace",n,o,{exitIfFailed:r.exitIfFailed});if(0!==e)return e;break}}}return 0}function Yn(e){return e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||!1===e.autoCascadeEnv?e:{...e,cascadeEnv:"test"}}function Vn(n){return e.existsSync(t.join(n.dirPath,"test","unit"))?[]:!(!n.hasVitest||!e.existsSync(t.join(n.dirPath,"test")))&&(e.existsSync(t.join(n.dirPath,"test","e2e"))?["test","--exclude","test/e2e/**"]:["test"])}async function Gn(e,t,n,r,o,s={}){e.env.WB_DOCKER||="1";const i=await Pe(`${n.buildDocker(e,"test")}${En(t)}`,e,t,{exitIfFailed:s.exitIfFailed});if(0!==i)return i;const a=await qn(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:o}),e,t,{exitIfFailed:!1}),c=await Pe(Pn.stop(e),e,t,{exitIfFailed:s.exitIfFailed});return 0!==a?a:c}function qn(e,t,n,r={}){return Pe(e,t,n,{...r,processSilentOutput:Hn})}function Kn(e,t,n,r={}){return Pe(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:"Unit tests passed."})}function Hn(e){const t=[],n=new Set,r=[];for(const o of function*(e){let t=0;for(;t<=e.length;){const n=e.indexOf("\n",t);if(-1===n)return void(yield e.slice(t));yield e.slice(t,n),t=n+1}}(e)){const e=Zn(o);n.has(e)||(t.some(t=>Xn(t,e))||(Qn(t,n,e),r.push(o)))}return r.join("\n")}function Qn(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;const r=e.shift();void 0!==r&&t.delete(r)}function Zn(e){return e.replaceAll(Mn,"").trim().replaceAll(/^(?:\[[^\]]+\]\s*)+/g,"").replaceAll(/\(node:\d+\)/g,"(node:<number>)").replaceAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?\b/g,"<timestamp>").replaceAll(/([?&]cache=)\d+/g,"$1<number>")}function Xn(e,t){const n=Math.max(e.length,t.length);return 0===n||!(Math.abs(e.length-t.length)>.05*n)&&S(e,t)/n<=.05}function er(e,t=[],n=[]){const r=$n(t).length>0;return["test",...e.length>0||r?[]:["test/e2e/"],...n]}const tr={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 de(n);r||(console.error(d.red("No project found.")),process.exit(1));for(const o of r.descendants){o.env.CI||="1",o.env.WB_ENV||="test";const r=o.packageJson.dependencies??{},s=o.packageJson.devDependencies??{};let i;i=r.blitz?Dn:r.next?In:s["@remix-run/dev"]?_n:s.vite?Cn:Fn.some(e=>r[e])&&!r["firebase-functions"]?Nn:Tn,console.info(`Running "test-on-ci" for ${o.name} ...`);const a=o.hasDockerfile;if(a&&await Ae(Pn.stopAll(),o,n),e.existsSync(t.join(o.dirPath,"test","unit"))&&await Ae(i.testUnit(o,n).replaceAll(" --allowOnly",""),o,n),e.existsSync(t.join(o.dirPath,"test","e2e"))){await Ae(await i.testStart(o,n),o,n),await Se.promiseAll(),a&&(o.env.WB_DOCKER||="1",await Pe(`${i.buildDocker(o,"test")}${En(n)}`,o,n));const e=a?await i.testE2EDocker(o,n,{}):await i.testE2EProduction(o,n,{});process.exitCode=await Pe(e.replaceAll(" --allowOnly",""),o,n,{exitIfFailed:!1}),a&&await Pe(Pn.stop(o),o,n)}}}(n)}};const nr={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}`);O(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},rr={command:"typecheck",describe:"Run type checking. .env files are ignored.",builder:{},async handler(n){process.exit(await async function(n){const r=await de(n,!1);if(!r)return console.error(d.red("No project found.")),1;let o=!1;const s=r.descendants.map(async s=>{const i=[];for(s.packageJson.workspaces&&!s.hasSourceCode||i.push(...function(e){if(e.hasOwnDependency("@typescript/native-preview"))return["BUN tsgo --noEmit"];if(e.hasOwnDependency("typescript"))return["BUN tsc --noEmit"];return[]}(s)),!s.packageJson.workspaces&&s.hasOwnDependency("pyright")&&i.push("YARN pyright");i.length>0;){const a=await Ae(i.join(" && "),s,n,{ci:r.descendants.length>1,exitIfFailed:!1,preserveColor:!0}),c=t.join(s.dirPath,".next");if(!a||!e.existsSync(c))return a;e.rmSync(c,{force:!0,recursive:!0}),console.info(d.yellow("Removed `.next` directory. We will re-try type checking.")),o=!0}}),i=await Promise.all(s);let a=0;for(const[e,t]of i.entries())if(t){(r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(d.yellow('Please try "yarn gen-code" if you face unknown type errors.')),a=t}a||console.info(d.green(o?"-----\nNo type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.":"No type errors found."));return a}(n))}};const or={...rr,command:"tc"},sr={command:"verify",describe:"Verify project code",builder:{full:{type:"boolean",default:!1,describe:"Run tests after verifying project code"}},async handler(n){const r=le(n,!1);r||(console.error(d.red("No project found.")),process.exit(1)),await(n.full?async function(n,r){const o=function(n){const r=Date.now(),o=t.join(n.dirPath,".wb");e.mkdirSync(o,{recursive:!0});const s=t.join(o,"verify-full.log"),i=e.openSync(s,"w"),a=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr);let l=!1,u=!1;process.stdout.write=cr(process.stdout.fd,i),process.stderr.write=cr(process.stderr.fd,i),console.info(d.cyan(d.bold("Full log:"),s));const p=()=>{if(u)return;u=!0,process.stdout.write=a,process.stderr.write=c;const t=function(e){const t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;if(0===n)return`${r}s`;return`${n}m ${r}s`}(Date.now()-r),n=`${l?"Succeeded":"Failed"} in ${t}. Full log: ${s}\n`,o=l?d.green(n):d.red(n);a(o),e.writeSync(i,n),e.closeSync(i)};return process.once("exit",p),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener("exit",p),p()},succeed:()=>{l=!0}}}(n);try{await ir(n,r),await async function(e,t){const n=Yn({...t,_:["test"],e2e:"headless",silent:!0}),r=await Jn(n,{exitIfFailed:!1});if(0===r)return;e.packageJson.scripts?.["db-reset"]||(console.info(d.red(d.bold(`Failed (exit code ${r}):`),"test")),process.exit(r));console.info(d.yellow('Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.')),await ar(`${he} db-reset`,function(e,t){const n=ae(t,!0,e.dirPath);if(!n)throw new Error(`Project not found: ${e.dirPath}`);return n}(e,n),n,{printRawOutput:!0});const o=await Jn(n,{exitIfFailed:!1});0!==o&&(console.info(d.red(d.bold(`Failed (exit code ${o}):`),"test after db-reset retry")),process.exit(o));console.info(d.green("Tests passed after db-reset retry."))}(n,r),o.succeed()}catch(e){throw o.fail(e),e}finally{o.finish()}}(r.self,n):ir(r.self,n))}};async function ir(e,t){await ar(`${he} install`,e,t),e.packageJson.scripts?.["gen-code"]&&await ar(`${he} gen-code`,e,t),await async function(e,t,n={}){n.silent||console.info("\n"+d.cyan(d.bold("Start:"),e));const r=await t()??0;0===r||n.allowFailure?n.silent||console.info(d.green(d.bold("Finished:"),e)):(console.info(d.red(d.bold(`Failed (exit code ${r}):`),e)),process.exit(r));return r}("cleanup",()=>ut({...t,_:["lint"],fix:!0,format:!0,printAllOutput:!0,quiet:!0,silent:!0}),{silent:!0})}async function ar(e,t,n,r={}){if(function(e,t){console.info("\n"+d.cyan(d.bold("Command:"),e)+d.gray(` at ${t}`))}(e,t.dirPath),n.dryRun)return 0;const o=await _(e,void 0,{cwd:t.dirPath,env:Re(t.env,{preserveColor:!1}),shell:!0,stdio:"pipe",mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),s=o.status??1;return r.printRawOutput||function(e,t,n){if(0===t&&(e===`${he} install`||e===`${he} gen-code`))return void console.info(d.green("Succeeded."));const r=n.trim();r&&(process.stdout.write(r),process.stdout.write("\n"))}(e,s,o.stdout),0===s||r.allowFailure||(console.info(d.red(d.bold(`Failed (exit code ${s}):`),e)),process.exit(s)),s}function cr(t,n){return(r,o,s)=>{const i="string"==typeof r?Buffer.from(r,"string"==typeof o?o:"utf8"):r;return e.writeSync(n,i),e.writeSync(t,i),"function"==typeof o&&o(),s?.(),!0}}await n(r(process.argv)).scriptName("wb").options(De).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(sr).command(ge).command(Te).command(He).command(Xe).command(lt).command(Ft).command(Jt).command(Xt).command(kn).command(Sn).command(zn).command(Un).command(tr).command(nr).command(rr).command(or).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 dr=!1;for(const e of["SIGINT","SIGTERM","SIGQUIT"])process.on(e,()=>{if(!dr){dr=!0;try{O(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZW52LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9zcGF3bi50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL3V0aWxzL3J1bnRpbWUudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL3NoYXJlZE9wdGlvbnNCdWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvZ2VuQ29kZS50cyIsIi4uL3NyYy9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kudHMiLCIuLi9zcmMvdXRpbHMvb3V0cHV0LnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2xpbnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy91dGlscy9wb3J0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL21haW50ZW5hbmNlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmRVdGlscy50cyIsIi4uL3NyYy9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLnRzIiwiLi4vc3JjL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ZlcmlmeUNvZGUudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gICdxdWlldC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdXBwcmVzcyAuZW52IGZpbGUgbG9hZGluZyBpbmZvcm1hdGlvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgbGV0IGVudlBhdGhzID0gKGFyZ3YuZW52ID8/IFtdKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVzb2x2ZShjd2QsIGVudlBhdGgudG9TdHJpbmcoKSkpO1xuICBjb25zdCBjYXNjYWRlID1cbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudlxuICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBwcm9jZXNzLmVudi5XQl9FTlYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgY2FzY2FkZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoZW52UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihjd2QsICcuZW52JykpO1xuICAgICAgaWYgKGFyZ3YuaW5jbHVkZVJvb3RFbnYpIHtcbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnLi4nLCAnLi4nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4ocm9vdFBhdGgsICcuZW52JykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhzID0gZW52UGF0aHMuZmxhdE1hcCgoZW52UGF0aCkgPT5cbiAgICAgIGNhc2NhZGVcbiAgICAgICAgPyBbYCR7ZW52UGF0aH0uJHtjYXNjYWRlfS5sb2NhbGAsIGAke2VudlBhdGh9LmxvY2FsYCwgYCR7ZW52UGF0aH0uJHtjYXNjYWRlfWAsIGVudlBhdGhdXG4gICAgICAgIDogW2Ake2VudlBhdGh9LmxvY2FsYCwgZW52UGF0aF1cbiAgICApO1xuICB9XG4gIGVudlBhdGhzID0gZW52UGF0aHMuZmlsdGVyKChlbnZQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGVudlBhdGgpKS5tYXAoKGVudlBhdGgpID0+IHBhdGgucmVsYXRpdmUoY3dkLCBlbnZQYXRoKSk7XG4gIGNvbnN0IHNob3VsZFN1cHByZXNzT3V0cHV0ID0gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KTtcbiAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oYFdCX0VOVjogJHtwcm9jZXNzLmVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtwcm9jZXNzLmVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFtlbnZQYXRoLCBrZXlzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQgJiYga2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtrZXlzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWlzZUVudlZhcnMsIG1pc2VFbnZWYXJOYW1lc10gPSByZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwgZW52VmFycyk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgbWlzZUVudlZhcnMpO1xuICBpZiAobWlzZUVudlZhck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbbWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKSwgbWlzZUVudlZhck5hbWVzXSk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUmVhZCAke21pc2VFbnZWYXJOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7bWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IGZpbGVzOiAke2VudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5tYXAoKFtlbnZQYXRoLCBrZXlzXSkgPT4gKGtleXMubGVuZ3RoID4gMCA/IGAke2VudlBhdGh9ICgke2tleXMuam9pbignLCAnKX0pYCA6IGVudlBhdGgpKS5qb2luKCcsICcpIHx8ICdub3RoaW5nJ31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhcmd2LmNoZWNrRW52KSB7XG4gICAgY29uc3QgZXhhbXBsZUtleXMgPSBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBhcmd2LmNoZWNrRW52KSkpO1xuICAgIGNvbnN0IG1pc3NpbmdLZXlzID0gZXhhbXBsZUtleXMuZmlsdGVyKChrZXkpID0+ICEoa2V5IGluIGVudlZhcnMpICYmICEoa2V5IGluIHByb2Nlc3MuZW52KSk7XG4gICAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gWyR7ZW52UGF0aHMuam9pbignLCAnKX1dOiBbJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtleHBhbmQoeyBwYXJzZWQ6IGVudlZhcnMsIHByb2Nlc3NFbnY6IHt9IH0pLnBhcnNlZCA/PyBlbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzKFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjdXJyZW50RW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIHN0cmluZ1tdXSB7XG4gIGlmICghaGFzUHJvamVjdE1pc2VDb25maWcoY3dkKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGNvbnN0IGFyZ3MgPSBbJ2VudicsICctLWpzb24nLCAnLS1jZCcsIGN3ZF07XG4gIGlmIChjYXNjYWRlKSB7XG4gICAgYXJncy5wdXNoKCctLWVudicsIGNhc2NhZGUpO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ21pc2UnLCBhcmdzLCB7XG4gICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gIH0pO1xuICBpZiAocmVzdWx0LmVycm9yIHx8IHJlc3VsdC5zdGF0dXMgIT09IDAgfHwgIXJlc3VsdC5zdGRvdXQ/LnRyaW0oKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXN1bHQuc3Rkb3V0KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFt7fSwgW11dO1xuICB9XG4gIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICBpZiAoa2V5IGluIGN1cnJlbnRFbnZWYXJzIHx8IHByb2Nlc3MuZW52W2tleV0gPT09IHZhbHVlKSBjb250aW51ZTtcbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QpOyA7IGN1cnJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ21pc2UudG9tbCcpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5taXNlLnRvbWwnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYG1pc2UgZW52IC0tZW52ICR7Y2FzY2FkZX1gIDogJ21pc2UgZW52Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCBvdXRwdXRPcHRpb25zID0gYXJndiBhcyBFbnZSZWFkZXJPcHRpb25zICYgeyBxdWlldEVudj86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfTtcbiAgcmV0dXJuIG91dHB1dE9wdGlvbnMucXVpZXRFbnYgPT09IHRydWUgfHwgKG91dHB1dE9wdGlvbnMucXVpZXRFbnYgIT09IGZhbHNlICYmIG91dHB1dE9wdGlvbnMuc2lsZW50ID09PSB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzIGFuZCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG5jb25zdCBjYWNoZWRFbnZWYXJzID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbmZ1bmN0aW9uIHJlYWRFbnZGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVkRW52VmFycy5nZXQoZmlsZVBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShmaWxlUGF0aCksIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gIGNhY2hlZEVudlZhcnMuc2V0KGZpbGVQYXRoLCBwYXJzZWQpO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5pbXBvcnQgeyBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAsIGNvbGxlY3REZXNjZW5kYW50UGlkcyBhcyBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIH0gZnJvbSAnLi9wcm9jZXNzVHJlZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlS2lsbChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGlkKSB8fCBwaWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwaWQ6ICR7cGlkfWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBraWxsVHJlZU9uV2luZG93cyhwaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlc2NlbmRhbnRzID0gY29sbGVjdERlc2NlbmRhbnRQaWRzKHBpZCk7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZCwgZGVzY2VuZGFudHMpO1xuICBmb3IgKGNvbnN0IHRhcmdldFBpZCBvZiB0YXJnZXRQaWRzKSB7XG4gICAga2lsbElmTmVlZGVkKHRhcmdldFBpZCwgc2lnbmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsSWZOZWVkZWQocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBzaWduYWwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFRyZWVPbldpbmRvd3MocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBydW5Db21tYW5kKCd0YXNra2lsbCcsIFsnL1BJRCcsIFN0cmluZyhwaWQpLCAnL1QnLCAnL0YnXSwge1xuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gcnVuQ29tbWFuZChcbiAgICAncHMnLFxuICAgIFsnLUFvJywgJ3BpZD0scHBpZD0nXSxcbiAgICAvLyBLZWVwIGNvbW1hbmQgYm91bmRlZCBzbyB3YXRjaC1tb2RlIGtpbGwgbG9vcHMgY2Fubm90IGhhbmcgdGhpcyBwYXRoLlxuICAgIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCwgdGltZW91dDogMjAwMCB9XG4gICk7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAoc3Rkb3V0KTtcbiAgcmV0dXJuIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAocm9vdFBpZCwgY2hpbGRyZW5CeVBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkOiBudW1iZXIsIGRlc2NlbmRhbnRzOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IGRlc2NlbmRhbnRzLnRvUmV2ZXJzZWQoKTtcbiAgdGFyZ2V0UGlkcy5wdXNoKHBpZCk7XG4gIHJldHVybiB0YXJnZXRQaWRzO1xufVxuXG5mdW5jdGlvbiBydW5Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogeyB0aW1lb3V0OiBudW1iZXI7IG1heEJ1ZmZlcjogbnVtYmVyIH1cbik6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYyhjb21tYW5kLCBbLi4uYXJnc10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IG9wdGlvbnM/Lm1heEJ1ZmZlcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnI6ICcnIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3Qgc3RkZXJyID0gZXh0cmFjdFN0ZGVycihlcnJvcik7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRFeGVjdXRpb25FcnJvcihjb21tYW5kLCBhcmdzLCBzdGRlcnIsIHRvRXhpdENvZGUoZXJyb3IpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIC9ubyBzdWNoIHByb2Nlc3N8bm90IGZvdW5kfG5vdCByZWNvZ25pemVkfHRoZXJlIGlzIG5vIHJ1bm5pbmcgaW5zdGFuY2UvaS50ZXN0KGVycm9yLnN0ZGVycik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0b0V4aXRDb2RlKGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ3N0YXR1cycgaW4gZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM6IHVua25vd24gfSkuc3RhdHVzO1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0ZGVycihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8IGVycm9yID09PSBudWxsIHx8ICEoJ3N0ZGVycicgaW4gZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc3RkZXJyID0gKGVycm9yIGFzIFJlY29yZDwnc3RkZXJyJywgdW5rbm93bj4pLnN0ZGVycjtcbiAgaWYgKHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ZGVycjtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0ZGVycikpIHtcbiAgICByZXR1cm4gc3RkZXJyLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgc3RkZXJyOiBzdHJpbmcsIGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKGBDb21tYW5kIGZhaWxlZDogJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRoaXMubmFtZSA9ICdDb21tYW5kRXhlY3V0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RkZXJyID0gc3RkZXJyO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAocHNPdXRwdXQ6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcltdPiB7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBwc091dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKVxccyokLy5leGVjKGxpbmUpO1xuICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRQaWQgPSBOdW1iZXIobWF0Y2hlZFsxXSk7XG4gICAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyKG1hdGNoZWRbMl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50UGlkKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRQaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnRQaWQsIFtjaGlsZFBpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5CeVBhcmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIsIGNoaWxkcmVuQnlQYXJlbnQ6IE1hcDxudW1iZXIsIG51bWJlcltdPik6IG51bWJlcltdIHtcbiAgY29uc3QgZGVzY2VuZGFudHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHF1ZXVlID0gWy4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChyb290UGlkKSA/PyBbXSldO1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBwaWQgPSBxdWV1ZVtpbmRleF0gYXMgbnVtYmVyO1xuICAgIGluZGV4ICs9IDE7XG4gICAgZGVzY2VuZGFudHMucHVzaChwaWQpO1xuICAgIHF1ZXVlLnB1c2goLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBpZCkgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gZGVzY2VuZGFudHM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+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+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFjaUVudiAmJiBjaUVudiAhPT0gJzAnICYmIGNpRW52ICE9PSAnZmFsc2UnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi91dGlscy9jaS5qcyc7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlT3JtID0gJ3ByaXNtYScgfCAnZHJpenpsZSc7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcmd2OiBFbnZSZWFkZXJPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRFbnY6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aEJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGlyUGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpclBhdGg6IHN0cmluZywgYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbikge1xuICAgIHRoaXMuX2RpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gICAgdGhpcy5hcmd2ID0gYXJndjtcbiAgICB0aGlzLmxvYWRFbnYgPSBsb2FkRW52O1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGlzQnVuQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0J1blRvb2xWZXJzaW9uKCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLnVzZXNCdW5QYWNrYWdlTWFuYWdlcjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCB1c2VzQnVuUGFja2FnZU1hbmFnZXIoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFzQnVuTG9ja2ZpbGUoKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuaGFzQnVuUGFja2FnZU1hbmFnZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuVG9vbFZlcnNpb24oKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKF58XFxuKWJ1blxccy8udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0J1bkxvY2tmaWxlKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHJlbHkgb24gdGhlIGxvY2tmaWxlIG9yIHBhY2thZ2VNYW5hZ2VyIGZpZWxkIGluc3RlYWQgb2YgbWlzZS5cbiAgICAvLyBEb2NrZXIgb3B0aW1pemF0aW9uIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2IuXG4gICAgcmV0dXJuIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10uc29tZSgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsIGZpbGVOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHRoaXMucm9vdFBhY2thZ2VKc29uPy5wYWNrYWdlTWFuYWdlciA/PyB0aGlzLnBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyO1xuICAgIHJldHVybiB0eXBlb2YgcGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnICYmIHBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ2J1bkAnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBidWlsZENvbW1hbmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZD8uaW5jbHVkZXMoJ2J1aWxkSWZOZWVkZWQnKVxuICAgICAgPyAnWUFSTiBydW4gYnVpbGQnXG4gICAgICA6IHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGRcbiAgICAgICAgPyBgWUFSTiB3YiBidWlsZElmTmVlZGVkICR7dGhpcy5hcmd2LnZlcmJvc2UgPyAnLS12ZXJib3NlJyA6ICcnfWBcbiAgICAgICAgOiBcImVjaG8gJ05vIGJ1aWxkIHNjcmlwdCdcIjtcbiAgfVxuXG4gIGdldCBkaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcm9vdERpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpXG4gICAgICA/IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsICcuLicsICcuLicpXG4gICAgICA6IHRoaXMuZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJmaWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyh0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRG9ja2VyZmlsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICEhdGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNTb3VyY2VDb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdzcmMnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlckltYWdlTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnBhY2thZ2VKc29uLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoJ0AnLCAnJykucmVwbGFjZUFsbCgnLycsICctJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5sb2FkRW52KSByZXR1cm4gcHJvY2Vzcy5lbnY7XG5cbiAgICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhckNvdW50UGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBpZiAoIXNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQodGhpcy5hcmd2KSkge1xuICAgICAgZm9yIChjb25zdCBbZW52UGF0aCwgY291bnRdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgTG9hZGVkICR7Y291bnR9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmVudlZhcnMgfTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ByaXNtYSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdwcmlzbWEnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEcml6emxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ2RyaXp6bGUtb3JtJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZGF0YWJhc2VPcm0oKTogRGF0YWJhc2VPcm0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc1ByaXNtYSkgcmV0dXJuICdwcmlzbWEnO1xuICAgIGlmICh0aGlzLmhhc0RyaXp6bGUpIHJldHVybiAnZHJpenpsZSc7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1ZpdGVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpdGVzdCA/PyB0aGlzLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udml0ZXN0KTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hsaW50Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hmbXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hmbXQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmV0dGllcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdwcmV0dGllcicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BvZXRyeUxvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwb2V0cnkubG9jaycpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHVic3BlY1lhbWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSB8fFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgbGV0IGJpbkZvdW5kID0gZmFsc2U7XG4gICAgbGV0IGN1cnJlbnRQYXRoID0gdGhpcy5kaXJQYXRoO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgICAgdGhpcy5lbnYuUEFUSCA9IGAke2JpblBhdGh9OiR7dGhpcy5lbnYuUEFUSH1gO1xuICAgICAgICBiaW5Gb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJpbkZvdW5kO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGhhc0RlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpID8/IHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5yb290UGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm47XG5cbiAgICByZXR1cm4gKFxuICAgICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJvb3RQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucm9vdERpclBhdGggPT09IHRoaXMuZGlyUGF0aCkgcmV0dXJuIHRoaXMucGFja2FnZUpzb247XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbd2JdIEZhaWxlZCB0byByZWFkIG9yIHBhcnNlICR7cGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKX1gLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9qZWN0LmVudi5XQl9FTlYgPT09IG5hbWUgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlYgPT09IG5hbWU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgcm9vdFByb2plY3Q6IFByb2plY3QsXG4gIGxvYWRFbnY6IGJvb2xlYW5cbik6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gW3Jvb3RQcm9qZWN0XTtcblxuICBjb25zdCB3b3Jrc3BhY2UgPSByb290UHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkod29ya3NwYWNlKSkgcmV0dXJuIHByb2plY3RzO1xuXG4gIGNvbnN0IGdsb2JQYXR0ZXJuOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlRGlyczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXRoIG9mIHdvcmtzcGFjZS5tYXAoKHdzOiBzdHJpbmcpID0+IHBhdGguam9pbihyb290UHJvamVjdC5kaXJQYXRoLCB3cykpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya3NwYWNlUGF0aCkpIHtcbiAgICAgIHBhY2thZ2VEaXJzLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JQYXR0ZXJuLnB1c2god29ya3NwYWNlUGF0aCk7XG4gICAgfVxuICB9XG4gIHBhY2thZ2VEaXJzLnB1c2goLi4uKGF3YWl0IGdsb2JieShnbG9iUGF0dGVybiwgeyBkb3Q6IHRydWUsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSkpO1xuICBmb3IgKGNvbnN0IHN1YlBhY2thZ2VEaXJQYXRoIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJQYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG5cbiAgICBwcm9qZWN0cy5wdXNoKG5ldyBQcm9qZWN0KHN1YlBhY2thZ2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RzO1xufVxuIiwiZXhwb3J0IGNvbnN0IGlzUnVubmluZ09uQnVuID1cbiAgLy8gRGV0ZWN0IGBidW4gLS1idW4gcnVuIHdiIC4uLmAuIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gIHByb2Nlc3MudmVyc2lvbnMuYnVuIHx8XG4gIC8vIERldGVjdCBgYnVuIHJ1biB3YiAuLi5gLlxuICBwcm9jZXNzLmFyZ3ZbMF0/LmVuZHNXaXRoKCcvYnVuJykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5lbmRzV2l0aCgnL2J1bicpO1xuXG5leHBvcnQgY29uc3QgcnVudGltZVdpdGhBcmdzID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuIC0tYnVuIHJ1bicgOiAnbm9kZSc7XG5leHBvcnQgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ3lhcm4nO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IGlzUnVubmluZ09uQnVuID8gJ2J1biAtLWJ1biBydW4nIDogJ3lhcm4nO1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHsgQmluYXJ5TGlrZSwgSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNSdW5uaW5nT25CdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYnVpbGRJZk5lZWRlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYnVpbGRJZk5lZWRlZCcsXG4gIGRlc2NyaWJlOiAnQnVpbGQgY29kZSBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGJ1aWxkSWZOZWVkZWQoYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJZk5lZWRlZChcbiAgLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJ1aWxkQ29tbWFuZCA9XG4gICAgYXJndi5jb21tYW5kID8/XG4gICAgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyAoaXNSdW5uaW5nT25CdW4gPyAnYnVuIHJ1biBidWlsZCcgOiAneWFybiBidWlsZCcpIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaCwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50SGFzaCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICByZXR1cm4gW2NhY2hlZENvbnRlbnRIYXNoID09PSBjb250ZW50SGFzaCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5jb25zdCBpbmNsdWRlUGF0dGVybnMgPSBbJ3NyYy8nLCAncHVibGljLyddO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuXTtcbmNvbnN0IGV4Y2x1ZGVQYXR0ZXJucyA9IFsndGVzdC8nLCAndGVzdHMvJywgJ19fdGVzdHNfXy8nLCAndGVzdC1maXh0dXJlcy8nLCAndGVzdC9maXh0dXJlcy8nXTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxpbmVzID0gcmV0LnN0ZG91dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBmaWxlUGF0aHMgPSBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSgyKS50cmltKCkpXG4gICAgICAubWFwKChmaWxlUGF0aCkgPT5cbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcgPyBmaWxlUGF0aC5yZXBsYWNlKC9wYWNrYWdlc1xcL3diXFwvdGVzdFxcL2ZpeHR1cmVzXFwvW14vXStcXC8vLCAnJykgOiBmaWxlUGF0aFxuICAgICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoXG4gICAgICAoZmlsZVBhdGgpID0+XG4gICAgICAgIChpbmNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGZpbGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZXhjbHVkZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGZpbGVQYXRoLmluY2x1ZGVzKHBhdHRlcm4pKVxuICAgICk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBDaGFuZ2VkIGZpbGVzOiAke2ZpbHRlcmVkRmlsZVBhdGhzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICctLScsIC4uLmZpbHRlcmVkRmlsZVBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBvbWl0U2lsZW50U3RhcnQ/OiBib29sZWFuO1xuICBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbjtcbiAgcHJvY2Vzc1NpbGVudE91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcmludFJhd091dHB1dD86IGJvb2xlYW47XG4gIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seT86IGJvb2xlYW47XG4gIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc2lsZW50U3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUnVuUmVzdWx0IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgb3V0cHV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHsgc2lsZW50PzogYm9vbGVhbiB9LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKCEoYXJndi5zaWxlbnQgJiYgb3B0cy5vbWl0U2lsZW50U3RhcnQgJiYgIWFyZ3YuZHJ5UnVuKSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsIGFyZ3Yuc2lsZW50ID8gJ0NvbW1hbmQnIDogJ1N0YXJ0Jyk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgPSBCb29sZWFuKFxuICAgIGFyZ3Yuc2lsZW50ICYmIChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPz8gb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkpXG4gICk7XG4gIGxldCB3cm90ZVNpbGVudFByb2dyZXNzID0gZmFsc2U7XG4gIGNvbnN0IHByb2dyZXNzVGltZXIgPVxuICAgIGFyZ3Yuc2lsZW50ICYmIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLicpO1xuICAgICAgICAgIHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB9LCBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyAoYXJndi5zaWxlbnQgPyB0cnVlIDogdW5kZWZpbmVkKSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogYXJndi5zaWxlbnQgPyAncGlwZScgOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZzogYXJndi5zaWxlbnQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAocHJvZ3Jlc3NUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKHdyb3RlU2lsZW50UHJvZ3Jlc3MpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbiAgaWYgKHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgJiYgKCFvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSB8fCBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8gb3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0KHJldC5zdGRvdXQpIDogcmV0LnN0ZG91dCkudHJpbSgpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICB9XG4gIGlmIChhcmd2LnNpbGVudCAmJiBleGl0Q29kZSA9PT0gMCAmJiBvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpKTtcbiAgfVxuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIGV4aXRDb2RlLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCAmJiAhb3B0cy5wcmludFJhd091dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPEJ1ZmZlcmVkUnVuUmVzdWx0PiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICBvdXRwdXQ6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4aXRDb2RlOiByZXQuc3RhdHVzID8/IDEsXG4gICAgICBvdXRwdXQ6IHJldC5zdGRvdXQsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICBjb25zdCBwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVuID0gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyAnYnVuIC0tYnVuIHJ1bicgOiAneWFybic7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgL1BSSVNNQSBnZW5lcmF0ZSg/IVxccystLW5vLWhpbnRzKSg/PVxcc3wkKS9ndSxcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdQUklTTUEgZ2VuZXJhdGUnIDogJ1BSSVNNQSBnZW5lcmF0ZSAtLW5vLWhpbnRzJ1xuICAgIClcbiAgICAucmVwbGFjZUFsbCgnUFJJU01BICcsIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdZQVJOIGJsaXR6IHByaXNtYSAnIDogJ1lBUk4gcHJpc21hICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gcnVuICcpXG4gICAgLnJlcGxhY2VBbGwoJ0JVTiAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiAnKVxuICAgIC8vIEF2b2lkIHJlcGxhY2luZyBgWUFSTiBydW5gIHdpdGggYHJ1bmAgYnkgcmVwbGFjaW5nIGBZQVJOYCB3aXRoIGAoeWFybnxidW4gLS1idW4pIHJ1bmAuXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICd5YXJuIHJ1biAnKTtcbiAgaWYgKHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgICAucmVwbGFjZUFsbCgnWUFSTiBidWlsZC10cyBydW4nLCAnYnVuIC0tYnVuIHJ1bicpXG4gICAgICAucmVwbGFjZUFsbCgnYnVuIC0tYnVuIHJ1biBidW4gLS1idW4gcnVuJywgJ2J1biAtLWJ1biBydW4nKVxuICAgICAgLy8gQmVjYXVzZSBidW4gY2FuIHJ1biBzcmMvaW5kZXgudHMgZGlyZWN0bHkuXG4gICAgICAucmVwbGFjZUFsbCgnZGlzdC9pbmRleC5qcycsICdzcmMvaW5kZXgudHMnKTtcbiAgfVxuICBuZXdTY3JpcHQgPSBuZXdTY3JpcHQudHJpbSgpO1xuICBjb25zdCBwcmludGFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApKTtcbiAgY29uc3QgcnVubmFibGVTY3JpcHQgPSBmaXhCdW5Db21tYW5kKFxuICAgIG5ld1NjcmlwdFxuICAgICAgLy8gS2VlcCBQbGF5d3JpZ2h0IGFzIGEgcGFja2FnZS1tYW5hZ2VyIGNvbW1hbmQgaW5zdGVhZCBvZiByZXNvbHZpbmcgaXQgdGhyb3VnaCBub2RlX21vZHVsZXMvLmJpbi5cbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIHBsYXl3cmlnaHQgJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBgKVxuICAgICAgLnJlcGxhY2VBbGwoXG4gICAgICAgICdZQVJOICcsXG4gICAgICAgICFwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciAmJiBwcm9qZWN0LmJpbkV4aXN0cyA/ICcnIDogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYFxuICAgICAgKVxuICApO1xuICAvLyBBZGQgY2FzY2FkZSBvcHRpb24gd2hlbiBXQl9FTlYgaXMgZGVmaW5lZFxuICBjb25zdCBjYXNjYWRlT3B0aW9uID0gcHJvamVjdC5lbnYuV0JfRU5WID8gYCAtYz0ke3Byb2plY3QuZW52LldCX0VOViB8fCAnZGV2ZWxvcG1lbnQnfWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiR7Y2FzY2FkZU9wdGlvbn0gLS0gJHtwcmludGFibGVTY3JpcHR9YCxcbiAgICBydW5uYWJsZTogcnVubmFibGVTY3JpcHQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCwgcHJlZml4ID0gJ1N0YXJ0Jywgd2VhayA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbyhcbiAgICAnXFxuJyArXG4gICAgICAod2VhayA/IGNoYWxrLmdyYXkgOiBjaGFsay5jeWFuKShjaGFsay5ib2xkKGAke3ByZWZpeH06YCksIG5vcm1hbGl6ZWRTY3JpcHQpICtcbiAgICAgIGNoYWxrLmdyYXkoYCBhdCAke3Byb2plY3QuZGlyUGF0aH1gKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIGV4aXRDb2RlOiBudW1iZXIgfCBudWxsLFxuICBvcHRzOiBPbWl0PE9wdGlvbnMsICd0aW1lb3V0Jz4sXG4gIHByaW50T3B0aW9uczogeyBzaWxlbnRTdWNjZXNzPzogYm9vbGVhbiB9ID0ge31cbik6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDApIHtcbiAgICBpZiAocHJpbnRPcHRpb25zLnNpbGVudFN1Y2Nlc3MpIHJldHVybjtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIHNjcmlwdCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOiBgKSwgc2NyaXB0KSk7XG4gICAgaWYgKG9wdHMuZXhpdElmRmFpbGVkICE9PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlID8/IDEpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlRW52KFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdHM6IE9wdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBuZXdFbnYgPSB7IC4uLmVudiB9O1xuICBpZiAob3B0cy5jaSkge1xuICAgIG5ld0Vudi5DSSA9ICcxJztcbiAgfVxuICBjb25maWd1cmVDb2xvckVudihuZXdFbnYsIG9wdHMucHJlc2VydmVDb2xvcik7XG4gIHJldHVybiBuZXdFbnY7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBjaGlsZC1wcm9jZXNzIGNvbG9yIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3Igd2ItbWFuYWdlZCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIGVudiBUaGUgY2hpbGQtcHJvY2VzcyBlbnZpcm9ubWVudCB0byBtdXRhdGUuXG4gKiBAcGFyYW0gcHJlc2VydmVDb2xvciBXaGV0aGVyIHdiIHNob3VsZCBwcmVzZXJ2ZSBjb2xvcnMgZm9yIG91dHB1dCB0aGF0IGl0IGNhcHR1cmVzIGFuZCByZXByaW50cyB0byBhbiBpbnRlcmFjdGl2ZSBUVFkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVDb2xvckVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sIHByZXNlcnZlQ29sb3I/OiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChlbnYuTk9fQ09MT1IgIT09IHVuZGVmaW5lZCB8fCBwcmVzZXJ2ZUNvbG9yID09PSBmYWxzZSkge1xuICAgIC8vIE5PX0NPTE9SIGFuZCBwcmVzZXJ2ZUNvbG9yPWZhbHNlIGFyZSBleHBsaWNpdCBuby1jb2xvciBjaG9pY2VzLCBzbyBpbmhlcml0ZWQgRk9SQ0VfQ09MT1IgbXVzdCBub3QgbGVhayB0aHJvdWdoLlxuICAgIGRlbGV0ZSBlbnYuRk9SQ0VfQ09MT1I7XG4gIH0gZWxzZSBpZiAocHJlc2VydmVDb2xvciAmJiBwcm9jZXNzLnN0ZG91dC5pc1RUWSkge1xuICAgIGVudi5GT1JDRV9DT0xPUiB8fD0gJzMnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpeEJ1bkNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTQzNTlcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJ25leHQgZGV2JykgfHxcbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL292ZW4tc2gvYnVuL2lzc3Vlcy84MjIyXG4gICAgY29tbWFuZC5pbmNsdWRlcygncGxheXdyaWdodCcpIHx8XG4gICAgLy8gXCJidW4gLS1idW4gcHJpc21hIGdlbmVyYXRlXCIgZG9lc24ndCB3b3JrXG4gICAgY29tbWFuZC5pbmNsdWRlcygncHJpc21hJykgfHxcbiAgICBjb21tYW5kLmluY2x1ZGVzKCd0ZXN0L2UyZS1hZGRpdGlvbmFsJylcbiAgICA/IGNvbW1hbmQucmVwbGFjZUFsbCgnYnVuIC0tYnVuJywgJ2J1bicpXG4gICAgOiBjb21tYW5kO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgc2lsZW50PzogYm9vbGVhbiB9KS5zaWxlbnQgPT09IHRydWUgJiZcbiAgICBnZXRPcHRpb25WYWx1ZShhcmd2LCAncXVpZXQtZW52JykgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBhcmdzLnB1c2goJy0tcXVpZXQtZW52Jyk7XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IEZPUkNFX0tJTExfREVMQVlfTVMgPSA1MDAwO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAna2lsbC1vdGhlcnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZXhpdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2tpbGwtb3RoZXJzLW9uLWZhaWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZmFpbHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBjcml0ZXJpYScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhbGwnLCAnZmlyc3QnXSxcbiAgICBkZWZhdWx0OiAnYWxsJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdDb21tYW5kcyB0byBydW4gY29uY3VycmVudGx5JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMge1xuICBjb21tYW5kczogc3RyaW5nW107XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIGtpbGxPdGhlcnM6IGJvb2xlYW47XG4gIGtpbGxPdGhlcnNPbkZhaWw6IGJvb2xlYW47XG4gIHN1Y2Nlc3M6ICdhbGwnIHwgJ2ZpcnN0JztcbiAgY2k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmN1cnJlbnRseShvcHRpb25zOiBSdW5Db25jdXJyZW50bHlPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT5cbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduKG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBvcHRpb25zLnByb2plY3QpLnJ1bm5hYmxlLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMucHJvamVjdC5kaXJQYXRoLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihvcHRpb25zLnByb2plY3QuZW52LCB7IGNpOiBvcHRpb25zLmNpIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gICk7XG5cbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGxldCBpbnRlcnJ1cHRlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RvcFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JjZUtpbGxQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5mcm9tPG51bWJlciB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IGNoaWxkcmVuLmxlbmd0aCB9KTtcbiAgY29uc3Qgd2FpdEZvckV4aXRQcm9taXNlcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dGxlID0gKGV4aXRDb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBleGl0Q29kZTtcbiAgICAgICAgZmlyc3RSZXN1bHQgPz89IGV4aXRDb2RlO1xuXG4gICAgICAgIGlmICghc3RvcHBpbmcgJiYgc2hvdWxkU3RvcE90aGVycyhleGl0Q29kZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICBzdG9wUmVzdWx0ID0gZXhpdENvZGU7XG4gICAgICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sICdTSUdURVJNJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSA/PyB1bmRlZmluZWQsIHNpZ25hbCA/PyB1bmRlZmluZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBzdG9wQWxsID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICBpbnRlcnJ1cHRlZFNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuXG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIHNpZ25hbCkpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdpbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHSU5UJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3Rlcm0gPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHVEVSTScpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdxdWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1FVSVQnKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICBwcm9jZXNzLm9uKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvckV4aXRQcm9taXNlcyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZm9yY2VLaWxsUHJvbWlzZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgfVxuXG4gIGlmIChpbnRlcnJ1cHRlZFNpZ25hbCkge1xuICAgIHJldHVybiBnZXRFeGl0Q29kZSh1bmRlZmluZWQsIGludGVycnVwdGVkU2lnbmFsKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcpIHtcbiAgICByZXR1cm4gZmlyc3RSZXN1bHQgPz8gMTtcbiAgfVxuICBpZiAoc3RvcFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0b3BSZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGl0Q29kZShjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgaWYgKHNpZ25hbCAmJiBzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpIHtcbiAgICByZXR1cm4gMTI4ICsgY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3RvcE90aGVycyhcbiAgZXhpdENvZGU6IG51bWJlcixcbiAgb3B0aW9uczogUGljazxSdW5Db25jdXJyZW50bHlPcHRpb25zLCAna2lsbE90aGVycycgfCAna2lsbE90aGVyc09uRmFpbCcgfCAnc3VjY2Vzcyc+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0JyB8fCBvcHRpb25zLmtpbGxPdGhlcnMgfHwgKG9wdGlvbnMua2lsbE90aGVyc09uRmFpbCAmJiBleGl0Q29kZSAhPT0gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvcmNlS2lsbFBpZHMgPSBzaWduYWxQaWRzKHRvQ2hpbGRQaWRzKGNoaWxkcmVuKSwgc2lnbmFsKTtcbiAgaWYgKGZvcmNlS2lsbFBpZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgaWYgKGF3YWl0IHdhaXRGb3JGb3JjZUtpbGwoZm9yY2VLaWxsUGlkcykpIHtcbiAgICBzaWduYWxQaWRzKGZvcmNlS2lsbFBpZHMsICdTSUdLSUxMJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9DaGlsZFBpZHMoY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBjaGlsZHJlbi5mbGF0TWFwKChjaGlsZCkgPT4gKGNoaWxkLnBpZCA9PT0gdW5kZWZpbmVkID8gW10gOiBbY2hpbGQucGlkXSkpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxQaWRzKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogbnVtYmVyW10ge1xuICBjb25zdCBzaWduYWxlZFBpZHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgcGlkIG9mIHBpZHMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFraWxsUHJvY2Vzc0dyb3VwKHBpZCwgc2lnbmFsKSkgY29udGludWU7XG5cbiAgICAgIHNpZ25hbGVkUGlkcy5wdXNoKHBpZCk7XG4gICAgICB0cmVlS2lsbChwaWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGtpbGwgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaWduYWxlZFBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JGb3JjZUtpbGwocGlkczogcmVhZG9ubHkgbnVtYmVyW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRk9SQ0VfS0lMTF9ERUxBWV9NUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChwaWRzLmV2ZXJ5KGlzUHJvY2Vzc0dyb3VwR29uZSkpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHNsZWVwKE1hdGgubWluKDEwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0dyb3VwR29uZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCAwKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzR3JvdXAocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgc2lnbmFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcbmNvbnN0IExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSA9ICdsaXRlc3RyZWFtLnltbCc7XG5jb25zdCBERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY2xlYW5VcENvbW1hbmQgPSBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIENsZWFudXAgZXhpc3RpbmcgYXJ0aWZhY3RzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIExpdGVzdHJlYW0gcmVwbGljYXRpb24uXG4gICAgLy8gTm90ZSB0aGF0IGRvbid0IG1lcmdlIG11bHRpcGxlIHJtIGNvbW1hbmRzIGludG8gb25lLCBiZWNhdXNlIGlmIG9uZSBmYWlscywgdGhlIHN1YnNlcXVlbnQgb25lcyB3b24ndCBydW4uXG4gICAgcmV0dXJuIGAke2NsZWFuVXBDb21tYW5kfTsgcm0gLVJmICR7ZGlyUGF0aH0vLnByb2Quc3FsaXRlMyogfHwgdHJ1ZWA7XG4gIH1cblxuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZ2VuZXJhdGUoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnUFJJU01BIGdlbmVyYXRlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAke2xpdGVzdHJlYW1Db25maWdPcHRpb259IC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCl9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgJHt0aGlzLmdlbmVyYXRlKHByb2plY3QpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICAgIHN0ZXBzLnB1c2godGhpcy5zZWVkKHByb2plY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KX0gLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL21vdW50JyA6ICdwcmlzbWEvbW91bnQnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKSkgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIKSkgcmV0dXJuIGAtY29uZmlnICR7REVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIfWA7XG4gIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXTsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IFBSSVNNQSBkYiBleGVjdXRlIC0tc3RkaW4gLS11cmwgXCIke0ZJTEVfU0NIRU1BfSR7ZGJQYXRofVwiOyBmaSAmJiBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlVybCA9IHByb2plY3QuZW52LkRBVEFCQVNFX1VSTDtcbiAgaWYgKCFkYlVybD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHJldHVybjtcblxuICBjb25zdCByYXdEYlBhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGlmICghcmF3RGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShyYXdEYlBhdGgpXG4gICAgPyByYXdEYlBhdGhcbiAgICA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIgPz8gJy4nLCByYXdEYlBhdGgpO1xuXG4gIHJldHVybiBgcm0gLWYgXCIke2Fic29sdXRlUGF0aH1cIiBcIiR7YWJzb2x1dGVQYXRofS13YWxcIiBcIiR7YWJzb2x1dGVQYXRofS1zaG1cImA7XG59XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFTY3JpcHRzID0gbmV3IFByaXNtYVNjcmlwdHMoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGdlbkNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZ2VuLWNvZGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIGNvZGUgZm9yIHRoZSBjdXJyZW50IHByb2plY3QnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbkNvZGVUYXJnZXRzID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAgIC5tYXAoKHByb2plY3QpID0+ICh7IHByb2plY3QsIHNjcmlwdHM6IGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3QpIH0pKVxuICAgICAgLmZpbHRlcigoeyBzY3JpcHRzIH0pID0+IHNjcmlwdHMubGVuZ3RoID4gMCk7XG4gICAgaWYgKGdlbkNvZGVUYXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkLicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QsIHNjcmlwdHMgfSBvZiBnZW5Db2RlVGFyZ2V0cykge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwiZ2VuLWNvZGVcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpKSB7XG4gICAgc2NyaXB0cy5wdXNoKCdZQVJOIGJsaXR6IGNvZGVnZW4nKTtcbiAgICBpZiAocHJvamVjdC5oYXNQcmlzbWEpIHtcbiAgICAgIHNjcmlwdHMucHVzaChwcmlzbWFTY3JpcHRzLmdlbmVyYXRlKHByb2plY3QpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvamVjdC5oYXNQcmlzbWEpIHtcbiAgICBzY3JpcHRzLnB1c2gocHJpc21hU2NyaXB0cy5nZW5lcmF0ZShwcm9qZWN0KSk7XG4gIH1cblxuICBjb25zdCBjaGFrcmFUeXBlZ2VuU2NyaXB0ID0gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3QpO1xuICBpZiAoY2hha3JhVHlwZWdlblNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChjaGFrcmFUeXBlZ2VuU2NyaXB0KTtcbiAgfVxuXG4gIGNvbnN0IGRyaXp6bGVDb25maWdQYXRoID0gc2NyaXB0cy5sZW5ndGggPT09IDAgJiYgcHJvamVjdC5oYXNEcml6emxlID8gZ2V0RHJpenpsZUNvbmZpZ1BhdGgocHJvamVjdCkgOiB1bmRlZmluZWQ7XG4gIGlmIChkcml6emxlQ29uZmlnUGF0aCkge1xuICAgIHNjcmlwdHMucHVzaChgWUFSTiBkcml6emxlLWtpdCBjaGVjayAtLWNvbmZpZyAke2RyaXp6bGVDb25maWdQYXRofSB8fCB0cnVlYCk7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uIGdldENoYWtyYVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0BjaGFrcmEtdWkvY2xpJykpIHJldHVybjtcblxuICBpZiAoZ2V0T3duRGVwZW5kZW5jeU1ham9yKHByb2plY3QsICdAY2hha3JhLXVpL2NsaScpID09PSAyKSB7XG4gICAgcmV0dXJuICdZQVJOIGNoYWtyYS1jbGkgdG9rZW5zIHNyYy9jb3JlL3RoZW1lLnRzJztcbiAgfVxuICBpZiAoZmlsZUV4aXN0cyhwcm9qZWN0LCAnc3JjL3RoZW1lLnRzJykpIHtcbiAgICByZXR1cm4gJ1lBUk4gY2hha3JhIHR5cGVnZW4gc3JjL3RoZW1lLnRzIC0tc3RyaWN0JztcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGdldERyaXp6bGVDb25maWdQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWydkcml6emxlLmNvbmZpZy50cycsICdkcml6emxlLmNvbmZpZy5tdHMnLCAnZHJpenpsZS5jb25maWcuanMnLCAnZHJpenpsZS5jb25maWcubWpzJ107XG4gIHJldHVybiBjYW5kaWRhdGVzLmZpbmQoKGZpbGVQYXRoKSA9PiBmaWxlRXhpc3RzKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGdldE93bkRlcGVuZGVuY3lNYWpvcihwcm9qZWN0OiBQcm9qZWN0LCBwYWNrYWdlTmFtZTogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICBjb25zdCB2ZXJzaW9uID1cbiAgICBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV07XG4gIGNvbnN0IG1ham9yID0gdmVyc2lvbj8ubWF0Y2goL1xcZCsvdSk/LlswXTtcbiAgcmV0dXJuIG1ham9yID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBOdW1iZXIobWFqb3IpO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZVBhdGgpKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlLCBvdXRwdXQpKSByZXR1cm47XG5cbiAgY29uc3Qgbm9ybWFsaXplZE91dHB1dCA9IG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dCk7XG4gIGlmIChub3JtYWxpemVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobm9ybWFsaXplZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBleGl0Q29kZSAhPT0gMCB8fCBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvdXRwdXQudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxid2Fybig/OmluZyk/cz9cXGIvaS50ZXN0KG91dHB1dC5yZXBsYWNlQWxsKC9cXGIoPzowfG5vKSB3YXJuaW5ncz9cXGIvZ2ksICcnKSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbENvbW1hbmQoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChhcmcpKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfT0ke3NoZWxsRXNjYXBlQXJndW1lbnQodmFsdWUpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIC9eW1xcdy4vOj0sQCUrLV0rJC91LnRlc3QoYXJnKSA/IGFyZyA6IGAnJHthcmcucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEJ1ZmZlcmVkUnVuUmVzdWx0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplU2NyaXB0LCBydW5XaXRoU3Bhd25JblBhcmFsbGVsLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRCdWZmZXJlZE91dHB1dCB9IGZyb20gJy4uL3V0aWxzL291dHB1dC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgTGludENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczxcbiAgdHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXJcbj47XG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8TGludENvbW1hbmRPcHRpb25zPiAmIHtcbiAgJy0tJz86IHVua25vd25bXTtcbiAgXzogdW5rbm93bltdO1xuICBwcmludEFsbE91dHB1dD86IGJvb2xlYW47XG59O1xuXG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhb3hmbXRFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbnR5cGUgQnVmZmVyZWRMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRSdW5SZXN1bHQgJiB7IGNvbW1hbmQ6IHN0cmluZzsgY3dkOiBzdHJpbmcgfTtcbnR5cGUgTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCB8IHsgZXhpdENvZGU6IG51bWJlciB9O1xuaW50ZXJmYWNlIExpbnRSdW5Db21tYW5kIHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xufVxuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTGludENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBsaW50KGFyZ3YgYXMgTGludENvbW1hbmRBcmd2KTtcbiAgICBpZiAoZXhpdENvZGUpIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChhcmd2OiBMaW50Q29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIHByZXNlcnZlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGNvbnN0IHNob3VsZFJ1bkZvcm1hdHRlcnMgPSBCb29sZWFuKGFyZ3YuZm9ybWF0KTtcbiAgY29uc3Qgc2hvdWxkUnVuTGludGVycyA9ICFhcmd2LmZvcm1hdCB8fCBhcmd2LmZpeDtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndiwgbGludEZpbGVQYXRocyk7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgcHl0aG9uRmlsZVBhdGhzXSBvZiBweXRob25GaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YsIHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGRhcnRGaWxlUGF0aHNdIG9mIGRhcnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgb3hmbXRGaWxlUGF0aHNdIG9mIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGlmIChsaW50Q29tbWFuZCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1BvZXRyeUxvY2spIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGxpbnRFeGl0Q29kZXM6IG51bWJlcltdID0gW107XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBjb25zdCBmb3JtYXR0ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGZvcm1hdHRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhmb3JtYXR0ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4uZm9ybWF0dGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAobWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcykge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICBpZiAocHJldHRpZXJBcmdzLmxlbmd0aCA+IDAgJiYgcHJvamVjdHMuc2VsZi5oYXNQcmV0dGllcikge1xuICAgICAgY29uc3QgcHJldHRpZXJSZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAgICdZQVJOJyxcbiAgICAgICAgICAncHJldHRpZXInLFxuICAgICAgICAgICctLWNhY2hlJyxcbiAgICAgICAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgICAgICAgJy0td3JpdGUnLFxuICAgICAgICAgICctLScsXG4gICAgICAgICAgLi4ucHJldHRpZXJBcmdzLFxuICAgICAgICBdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtwcmV0dGllclJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHByZXR0aWVyUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG4gICAgaWYgKHNvcnRQYWNrYWdlSnNvbkFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydFBhY2thZ2VKc29uUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICdzb3J0LXBhY2thZ2UtanNvbicsICctLScsIC4uLnNvcnRQYWNrYWdlSnNvbkFyZ3NdKSxcbiAgICAgICAgcHJvamVjdHMuc2VsZixcbiAgICAgICAgYXJndixcbiAgICAgICAgbGludFJ1bk9wdGlvbnNcbiAgICAgICk7XG4gICAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKFtzb3J0UGFja2FnZUpzb25SZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChzb3J0UGFja2FnZUpzb25SZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgY29uc3QgbGludGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhsaW50ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMobGludGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmxpbnRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuICB9XG5cbiAgcmV0dXJuIGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZHMoXG4gIGNvbW1hbmRzOiBMaW50UnVuQ29tbWFuZFtdLFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHRbXT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoY29tbWFuZHMubWFwKCh7IGNvbW1hbmQsIHByb2plY3QgfSkgPT4gcnVuTGludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykpKTtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0PiB7XG4gIGlmIChhcmd2LnNpbGVudCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChyZXN1bHQpID0+ICh7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICBjb21tYW5kOiBub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSxcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIH0pKTtcbiAgfVxuICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKS50aGVuKChleGl0Q29kZSkgPT4gKHsgZXhpdENvZGUgfSkpO1xufVxuXG5mdW5jdGlvbiBwcmludFNpbGVudExpbnRPdXRwdXRzKFxuICByZXN1bHRzOiBMaW50UnVuUmVzdWx0W10sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAncHJpbnRBbGxPdXRwdXQnIHwgJ3NpbGVudCc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcHJpbnRhYmxlUmVzdWx0cyA9XG4gICAgYXJndi5zaWxlbnQgJiYgIWFyZ3YucHJpbnRBbGxPdXRwdXQgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUgIT09IDApIDogcmVzdWx0cztcbiAgaWYgKHByaW50YWJsZVJlc3VsdHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcHJpbnRhYmxlUmVzdWx0cykge1xuICAgIGlmICghKCdvdXRwdXQnIGluIHJlc3VsdCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGFyZ3YucHJpbnRBbGxPdXRwdXQpIHtcbiAgICAgIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICAgICAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcbiAgICAgIH1cbiAgICAgIHByaW50QnVmZmVyZWRPdXRwdXQocmVzdWx0LmV4aXRDb2RlLCByZXN1bHQub3V0cHV0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdDogQnVmZmVyZWRMaW50UnVuUmVzdWx0KTogdm9pZCB7XG4gIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG5cbiAgaWYgKHJlc3VsdC5leGl0Q29kZSA9PT0gMCAmJiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQocmVzdWx0LmNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXQudHJpbSgpO1xuICBpZiAob3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kSGVhZGVyKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChjb21tYW5kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbW1hbmQuaW5jbHVkZXMoJyBveGZtdCAnKSB8fCBjb21tYW5kLmluY2x1ZGVzKCcgc29ydC1wYWNrYWdlLWpzb24gJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbnRDb21tYW5kKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInPixcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tcXVpZXQnXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LmZpeCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPeGZtdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgJ1lBUk4nLFxuICAgICdveGZtdCcsXG4gICAgJy0td3JpdGUnLFxuICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgICchKiovcGFja2FnZS5qc29uJyxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIFtcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgXS5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3Y6IFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PiwgZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydExpbnRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnYW5hbHl6ZScsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGtpbGxQb3J0UHJvY2VzcyBmcm9tICdraWxsLXBvcnQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4vcG9ydC5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KTtcbiAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH1cblxuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gV2Ugc2hvdWxkIHN0b3AgRG9ja2VyIGNvbnRhaW5lcnMgZmlyc3QgYmVjYXVzZSBga2lsbC1wb3J0YCBtYXkgZmFpbCB0byBzdG9wIERvY2tlciBjb250YWluZXJzLlxuICBhd2FpdCBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQsIHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlJbWFnZU5hbWUoaW1hZ2VOYW1lOiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYG5hbWU9JHtpbWFnZU5hbWV9YF0sIHByb2plY3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhbJy0tZmlsdGVyJywgYHB1Ymxpc2g9JHtwb3J0fWBdLCBwcm9qZWN0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQ29udGFpbmVycyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lcklkcyA9IGF3YWl0IGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJncywgcHJvamVjdCk7XG4gICAgaWYgKGNvbnRhaW5lcklkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncm0nLCAnLWYnLCAuLi5jb250YWluZXJJZHNdLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydwcycsICctcScsIC4uLmZpbHRlckFyZ3NdLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBwcm9qZWN0LmVudixcbiAgfSk7XG4gIHJldHVybiBzdGRvdXRcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGlkKSA9PiBpZC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY09uRXhpdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBraWxsRnVuYyA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhzY3JpcHQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHNjcmlwdCk7XG4gICAgcHJpbnRTdGFydChzY3JpcHQsIHByb2plY3QpO1xuICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoc2NyaXB0LCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzaGVsbDogdHJ1ZSwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKHNjcmlwdCwgc3RhdHVzLCB7fSk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4uL3V0aWxzL3BvcnQuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG50eXBlIE1haW50ZW5hbmNlQXJndiA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+ICYge1xuICBhY3Rpb246ICdzdGFydCcgfCAnc3RvcCc7XG59O1xuY29uc3QgbWFpbnRlbmFuY2VIdG1sID0gYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImphXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPlxuICAgIDx0aXRsZT7jg6Hjg7Pjg4bjg4rjg7PjgrnkuK08L3RpdGxlPlxuICAgIDxzdHlsZT5cbiAgICAgIGJvZHkge1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgICBjb2xvcjogIzExMTgyNztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBzYW5zLXNlcmlmO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDtcbiAgICAgIH1cblxuICAgICAgbWFpbiB7XG4gICAgICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIH1cblxuICAgICAgaDEge1xuICAgICAgICBmb250LXNpemU6IDI4cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICAgIG1hcmdpbjogMCAwIDE2cHg7XG4gICAgICB9XG5cbiAgICAgIHAge1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjg7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxtYWluPlxuICAgICAgPGgxPuePvuWcqOODoeODs+ODhuODiuODs+OCueS4reOBp+OBmTwvaDE+XG4gICAgICA8cD7nmobmp5jjgavjga/jgZTkuI3kvr/jgpLjgYrjgYvjgZHjgZfjgb7jgZnjgYzjgIHjg6Hjg7Pjg4bjg4rjg7PjgrnntYLkuobjgb7jgafjgZfjgbDjgonjgY/jgYrlvoXjgaHjgY/jgaDjgZXjgYTjgII8L3A+XG4gICAgPC9tYWluPlxuICA8L2JvZHk+XG48L2h0bWw+YDtcblxuZnVuY3Rpb24gZ2V0TWFpbnRlbmFuY2VTZXJ2ZXJTb3VyY2UocG9ydDogbnVtYmVyLCBwaWRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nLnJhd2BcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBodHRwIGZyb20gJ25vZGU6aHR0cCc7XG5cbmNvbnN0IHBpZFBhdGggPSAke0pTT04uc3RyaW5naWZ5KHBpZFBhdGgpfTtcblxuY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICByZXNwb25zZS53cml0ZUhlYWQoNTAzLCB7XG4gICAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tc3RvcmUnLFxuICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgfSk7XG4gIHJlc3BvbnNlLmVuZCgke0pTT04uc3RyaW5naWZ5KG1haW50ZW5hbmNlSHRtbCl9KTtcbn0pO1xuXG5zZXJ2ZXIub24oJ2Vycm9yJywgKCkgPT4ge1xuICB0cnkge1xuICAgIGZzLnJtU3luYyhwaWRQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG5cbnNlcnZlci5saXN0ZW4oJHtwb3J0fSwgJzAuMC4wLjAnLCAoKSA9PiB7XG4gIGZzLndyaXRlRmlsZVN5bmMocGlkUGF0aCwgU3RyaW5nKHByb2Nlc3MucGlkKSArICdcXG4nKTtcbn0pO1xuYDtcbn1cblxuZXhwb3J0IGNvbnN0IG1haW50ZW5hbmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBNYWludGVuYW5jZUFyZ3Y+ID0ge1xuICBjb21tYW5kOiAnbWFpbnRlbmFuY2UgPGFjdGlvbj4nLFxuICBkZXNjcmliZTogJ1N0YXJ0IG9yIHN0b3AgYSBsaWdodHdlaWdodCBtYWludGVuYW5jZSBwYWdlIHNlcnZlci4gRXhhbXBsZTogd2IgbWFpbnRlbmFuY2Ugc3RhcnQnLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wb3NpdGlvbmFsKCdhY3Rpb24nLCB7XG4gICAgICAgIGNob2ljZXM6IFsnc3RhcnQnLCAnc3RvcCddIGFzIGNvbnN0LFxuICAgICAgICBkZXNjcmliZTogJ01haW50ZW5hbmNlIHNlcnZlciBhY3Rpb24nLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKSBhcyB1bmtub3duIGFzIEFyZ3Y8TWFpbnRlbmFuY2VBcmd2PixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSBhcmd2LmFjdGlvbjtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBtYWludGVuYW5jZSAke2FjdGlvbn0gYmVjYXVzZSBXQl9FTlYgaXMgdGVzdC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gcGFyc2VQb3J0KHByb2plY3QuZW52LlBPUlQpO1xuICAgIGlmIChhY3Rpb24gPT09ICdzdGFydCcpIHtcbiAgICAgIGF3YWl0IHN0YXJ0TWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGlkUGF0aCA9IGdldFBpZFBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IGV4aXN0aW5nUGlkID0gcmVhZFBpZChwaWRQYXRoKTtcbiAgaWYgKGV4aXN0aW5nUGlkICE9PSB1bmRlZmluZWQgJiYgaXNQcm9jZXNzUnVubmluZyhleGlzdGluZ1BpZCkpIHtcbiAgICBjb25zb2xlLmluZm8oYE1haW50ZW5hbmNlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcgb24gcG9ydCAke3BvcnR9LmApO1xuICAgIHJldHVybjtcbiAgfVxuICByZW1vdmVQaWRGaWxlKHBpZFBhdGgpO1xuXG4gIGlmICghKGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KSkpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUG9ydCAke3BvcnR9IGlzIGFscmVhZHkgaW4gdXNlLmApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShwaWRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKFxuICAgIHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgWyctLWlucHV0LXR5cGU9bW9kdWxlJywgJy0tZXZhbCcsIGdldE1haW50ZW5hbmNlU2VydmVyU291cmNlKHBvcnQsIHBpZFBhdGgpXSxcbiAgICB7XG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgfVxuICApO1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBtYWludGVuYW5jZSBzZXJ2ZXIuJyk7XG4gIH1cblxuICBjaGlsZC51bnJlZigpO1xuICBhd2FpdCB3YWl0Rm9yUGlkRmlsZShwaWRQYXRoLCBjaGlsZC5waWQpO1xuICBjb25zb2xlLmluZm8oYFN0YXJ0ZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCBwaWRQYXRoID0gZ2V0UGlkUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgcGlkID0gcmVhZFBpZChwaWRQYXRoKTtcbiAgaWYgKHBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5pbmZvKGBNYWludGVuYW5jZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcgb24gcG9ydCAke3BvcnR9LmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR1RFUk0nKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG4gIHJlbW92ZVBpZEZpbGUocGlkUGF0aCk7XG4gIGNvbnNvbGUuaW5mbyhgU3RvcHBlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBvcnQocG9ydEVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgYXNzZXJ0Lm9rKE51bWJlci5pc0ludGVnZXIocG9ydCkgJiYgcG9ydCA+IDAsIGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbmZ1bmN0aW9uIGdldFBpZFBhdGgocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLnRtcCcsIGB3Yi1tYWludGVuYW5jZS1zZXJ2ZXItJHtwb3J0fS5waWRgKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBpZChwaWRQYXRoOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBpZCA9IE51bWJlcihmcy5yZWFkRmlsZVN5bmMocGlkUGF0aCwgJ3V0ZjgnKS50cmltKCkpO1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgJiYgcGlkID4gMCA/IHBpZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc1J1bm5pbmcocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVBpZEZpbGUocGlkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgZnMucm1TeW5jKHBpZFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yUGlkRmlsZShwaWRQYXRoOiBzdHJpbmcsIHBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIDUwMDA7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocmVhZFBpZChwaWRQYXRoKSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgaWYgKCFpc1Byb2Nlc3NSdW5uaW5nKHBpZCkpIGJyZWFrO1xuICAgIGF3YWl0IHNldFRpbWVvdXQoNTApO1xuICB9XG5cbiAgcmVtb3ZlUGlkRmlsZShwaWRQYXRoKTtcbiAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc3RhcnQgbWFpbnRlbmFuY2Ugc2VydmVyLicpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG4vLyBUaGVzZSB0b29scyBhcmUgZGVjbGFyZWQgYXMgZGV2RGVwZW5kZW5jaWVzIGluIHNvdXJjZSByZXBvcywgYnV0IG9wdGltaXplZCBEb2NrZXJcbi8vIHBhY2thZ2UuanNvbiBmaWxlcyBzdGlsbCBuZWVkIHRoZW0gZm9yIGluLWltYWdlIGNvZGVnZW4vYnVpbGQgc3RlcHMuXG5jb25zdCBydW50aW1lRGV2RGVwZW5kZW5jaWVzID0gWydAd2lsbGJvb3N0ZXIvd2InLCAnYnVpbGQtdHMnXTtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgY29uc3Qga2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlPy5zdGFydHNXaXRoKCdnaXRAZ2l0aHViLmNvbTonKSkge1xuICAgICAgICAgICAgLy8gRG9ja2VyIGJ1aWxkcyBjYW5ub3QgYWNjZXNzIHByaXZhdGUgU1NIIFVSTHMgdW5sZXNzIGNyZWRlbnRpYWxzIGFyZSBmb3J3YXJkZWQuXG4gICAgICAgICAgICAvLyBUaGUgRG9ja2VyZmlsZSBjb3BpZXMgdGhvc2Ugd29ya3NwYWNlIHBhY2thZ2VzIGludG8gdGhlIGltYWdlIGluc3RlYWQuXG4gICAgICAgICAgICBkZXBzW25hbWVdID0gYC4vJHtuYW1lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMocGF0aC5qb2luKGRpc3REaXJQYXRoLCAnYmFzaCcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlRG9ja2VyU2hlbGxTY3JpcHRzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzb3VyY2VEaXJQYXRoID0gZmluZERvY2tlclNoZWxsU2NyaXB0c0RpclBhdGgoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoc291cmNlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNGaWxlKCkgfHwgIWRpcmVudC5uYW1lLmVuZHNXaXRoKCcuc2gnKSkgY29udGludWU7XG5cbiAgICBjb25zdCB0YXJnZXRGaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY29weUZpbGUocGF0aC5qb2luKHNvdXJjZURpclBhdGgsIGRpcmVudC5uYW1lKSwgdGFyZ2V0RmlsZVBhdGgpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLmNobW9kKHRhcmdldEZpbGVQYXRoLCAwbzc1NSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgRG9ja2VyIHNoZWxsIHNjcmlwdHM6ICR7cGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBkaXJQYXRoKSB8fCBkaXJQYXRofWApO1xufVxuXG5mdW5jdGlvbiBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpOiBzdHJpbmcge1xuICBsZXQgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ2RvY2tlcicsICdiYXNoJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb2NrZXIgc2hlbGwgc2NyaXB0cyBkaXJlY3Rvcnkgbm90IGZvdW5kLicpO1xuICAgIH1cbiAgICBjdXJyZW50RGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndjogSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBwcm9tb3RlUnVudGltZURldkRlcGVuZGVuY2llcyhwYWNrYWdlSnNvbik7XG4gIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAvLyBPdXRzaWRlIG9wdGltaXphdGlvbiB3cml0ZXMgZGlzdC9wYWNrYWdlLmpzb24gYmVmb3JlIERvY2tlciBidWlsZHMgdGhlIGFwcC5cbiAgICAvLyBLZWVwIGJ1aWxkLXRpbWUgcGFja2FnZXMgZm9yIHRoYXQgbGF0ZXIgaW4taW1hZ2UgYnVpbGQgYW5kIHJlbW92ZSBvbmx5IGtub3duIG5vbi1idWlsZCB0b29saW5nLlxuICAgIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJbnNpZGUgRG9ja2VyLCBjb2RlZ2VuL2J1aWxkIGhhcyBhbHJlYWR5IGZpbmlzaGVkLCBzbyBwcm9kdWN0aW9uIGluc3RhbGwgc2hvdWxkIG5vdCBzZWUgZGV2IHRvb2xpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVVbm5lY2Vzc2FyeURldkRlcGVuZGVuY2llc0Zvck91dHNpZGVEb2NrZXJCdWlsZChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgZGV2RGVwcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgLy8gSW4gLS1vdXRzaWRlIG1vZGUsIERvY2tlciBzdGlsbCBydW5zIGNvZGVnZW4vYnVpbGQgYmVmb3JlIGEgc2Vjb25kIGluLWltYWdlIG9wdGltaXphdGlvbi5cbiAgLy8gUmVtb3ZlIG9ubHkgdG9vbGluZyB0aGF0IGlzIG5vdCBuZWVkZWQgZm9yIHRoYXQgYnVpbGQgcGhhc2UuXG4gIGNvbnN0IG5hbWVXb3Jkc1RvQmVSZW1vdmVkID0gW1xuICAgICdhcnRpbGxlcnknLFxuICAgICdjb25jdXJyZW50bHknLFxuICAgICdjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICdodXNreScsXG4gICAgJ2ltYWdlbWluJyxcbiAgICAnamVzdCcsXG4gICAgJ2tpbGwtcG9ydCcsXG4gICAgJ2xpbnQtc3RhZ2VkJyxcbiAgICAnb3Blbi1jbGknLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIHByb21vdGVSdW50aW1lRGV2RGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IHByb21vdGVkRGVwczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIHJ1bnRpbWVEZXZEZXBlbmRlbmNpZXMpIHtcbiAgICBjb25zdCB2ZXJzaW9uID0gZGV2RGVwc1tuYW1lXTtcbiAgICBpZiAoIXZlcnNpb24pIGNvbnRpbnVlO1xuICAgIGlmICghZGVwZW5kZW5jaWVzW25hbWVdKSB7XG4gICAgICBkZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuICAgICAgcHJvbW90ZWREZXBzLnB1c2gobmFtZSk7XG4gICAgfVxuICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICB9XG4gIGlmIChwcm9tb3RlZERlcHMubGVuZ3RoID4gMCkge1xuICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgfVxuICBjb25zb2xlLmluZm8oJ1Byb21vdGVkIHJ1bnRpbWUgZGV2RGVwZW5kZW5jaWVzOicsIHByb21vdGVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG59XG5cbmZ1bmN0aW9uIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBGSUxFX1NDSEVNQSA9ICdmaWxlOic7XG5cbmNsYXNzIERyaXp6bGVTY3JpcHRzIHtcbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gREFUQUJBU0VfUEFUSCBvciBmaWxlOiBEQVRBQkFTRV9VUkwgaXMgc2V0LicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3JlbW92ZUNvbW1hbmR9ICYmICR7dGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKX1gO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWVkQ29tbWFuZCA9IHRoaXMuc2VlZChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRlQ29tbWFuZCA9IHRoaXMuZGVwbG95KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICByZXR1cm4gc2VlZENvbW1hbmQgPT09ICd0cnVlJyA/IG1pZ3JhdGVDb21tYW5kIDogYCR7bWlncmF0ZUNvbW1hbmR9ICYmICR7c2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIG1pZ3JhdGVGb3JTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShfcHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGRyaXp6bGUta2l0IG1pZ3JhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZ2VuZXJhdGUoX3Byb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBkcml6emxlLWtpdCBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICBtaWdyYXRlRGV2KF9wcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZShfcHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgcmV0dXJuICd0cnVlJztcbiAgfVxuXG4gIHN0dWRpbyhfcHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYFlBUk4gZHJpenpsZS1raXQgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gcHJvamVjdC5lbnYuREFUQUJBU0VfUEFUSCA/PyBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3RGJQYXRoID0gZGJVcmwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKS5yZXBsYWNlKC9bPyNdLiokLywgJycpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiByYXdEYlBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlT3JtLCBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzLCBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBwcmlzbWFDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncHJpc21hJyxcbiAgYWxpYXNlczogWydkYiddLFxuICBkZXNjcmliZTpcbiAgICBcIlJ1biBkYXRhYmFzZSBjb21tYW5kcy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBQcmlzbWEuIERyaXp6bGUgcHJvamVjdHMgdXNlIGRyaXp6bGUta2l0LiBFeGFtcGxlOiB3YiBwcmlzbWEgbWlncmF0ZS1kZXYgLS0gLS1uYW1lIGluaXRcIixcbiAgYnVpbGRlcjogKHlhcmdzKSA9PiB7XG4gICAgcmV0dXJuIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLmNvbW1hbmQoY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Rm9yY2VDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZ2VuZXJhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobGlzdEJhY2t1cHNDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlRGV2Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc2V0Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKHJlc3RvcmVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc2VlZENvbW1hbmQpXG4gICAgICAuY29tbWFuZChzdHVkaW9Db21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVmYXVsdENvbW1hbmQpXG4gICAgICAuZGVtYW5kQ29tbWFuZCgpXG4gICAgICAuc3RyaWN0KGZhbHNlKTsgLy8gQWxsb3cgdW5rbm93biBvcHRpb25zIHRvIGJlIHBhc3NlZCB0aHJvdWdoXG4gIH0sXG4gIGhhbmRsZXIoKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9LFxufTtcblxuY29uc3QgY2xlYW5VcExpdGVzdHJlYW1Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2NsZWFudXAtbGl0ZXN0cmVhbScsXG4gIGRlc2NyaWJlOiAnQ2xlYW4gdXAgdGVtcG9yYWwgTGl0ZXN0cmVhbSBmaWxlcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjbGVhbnVwLWxpdGVzdHJlYW0nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndiwgJ3ByaXNtYScpO1xuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ3ByaXNtYSBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBnZW5lcmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZ2VuZXJhdGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIE9STSBjbGllbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBnZW5lcmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmdlbmVyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGlzdEJhY2t1cHNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YsICdwcmlzbWEnKTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdwcmlzbWEgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ocHJpc21hU2NyaXB0cy5saXN0QmFja3Vwcyhwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24ob3JtU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICBpZiAoc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0LCBhcmd2LmNoZWNrSWRlbXBvdGVuY3kpKSB7XG4gICAgICAgIGlmIChpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0KSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coYFNraXBwaW5nIGlkZW1wb3RlbmN5IGNoZWNrIGZvciAke3Byb2plY3QubmFtZX0gaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5gKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKG9ybVNjcmlwdHMuZGVwbG95KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3Q6IFByb2plY3QsIGNoZWNrSWRlbXBvdGVuY3k6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrSWRlbXBvdGVuY3kgPz8gaXNEb2NrZXJFbmFibGVkKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBpc0RvY2tlckVuYWJsZWQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9qZWN0LmVudi5XQl9ET0NLRVIgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnMCcgJiYgcHJvamVjdC5lbnYuV0JfRE9DS0VSICE9PSAnZmFsc2UnO1xufVxuXG5mdW5jdGlvbiBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAncHJvZHVjdGlvbicpO1xufVxuXG5jb25zdCBtaWdyYXRlRGV2Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdtaWdyYXRlLWRldicsXG4gIGRlc2NyaWJlOiAnQ3JlYXRlIGEgbWlncmF0aW9uIGZpbGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbWlncmF0ZS1kZXYnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5taWdyYXRlRGV2KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzZXRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc2V0JyxcbiAgZGVzY3JpYmU6ICdSZXNldCBEQicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXNldCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgICAgICAgJ1dCX0VOVj10ZXN0IGRiIHJlc2V0JyxcbiAgICAgICAgYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndilcbiAgICAgICkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgcmVzdG9yZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTNcIi4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgcmVzdG9yZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgcmVzdG9yZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3Jlc3RvcmUnLFxuICBkZXNjcmliZTogXCJSZXN0b3JlIERCIGZyb20gTGl0ZXN0cmVhbSdzIGJhY2t1cFwiLFxuICBidWlsZGVyOiByZXN0b3JlQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2LCAncHJpc21hJyk7XG4gICAgZm9yIChjb25zdCB7IHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgncHJpc21hIHJlc3RvcmUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIGFyZ3Yub3V0cHV0ID8/IChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGIvcmVzdG9yZWQuc3FsaXRlMycgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihwcmlzbWFTY3JpcHRzLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc2VlZEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGZpbGU6IHtcbiAgICBhbGlhczogJ2YnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgc2VlZCBzY3JpcHQuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHNlZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNlZWRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZWVkJyxcbiAgZGVzY3JpYmU6ICdQb3B1bGF0ZSBEQiB3aXRoIHNlZWQgZGF0YScsXG4gIGJ1aWxkZXI6IHNlZWRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc2VlZCcsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIGRhdGFiYXNlIHN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zdHVkaW8ocHJvamVjdCwgZGJVcmxPclBhdGgsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVmYXVsdENvbW1hbmRCdWlsZGVyID0geyBhcmdzOiB7IHR5cGU6ICdhcnJheScgfSB9IGFzIGNvbnN0O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJyQwIDxhcmdzLi4+JyxcbiAgZGVzY3JpYmU6XG4gICAgXCJQYXNzIHRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gdGhlIGRldGVjdGVkIE9STSBhcyBpcy4gQWRkaXRpb25hbCBQcmlzbWEgZmxhZ3MgY2FuIGFsc28gYmUgZm9yd2FyZGVkIGFmdGVyICctLScuXCIsXG4gIGJ1aWxkZXI6IGRlZmF1bHRDb21tYW5kQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCBzY3JpcHQgPSAoYXJndi5hcmdzPy5qb2luKCcgJykgPz8gJycpLnRyaW1FbmQoKTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2FyZ3MnXSk7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBbc2NyaXB0LCB1bmtub3duT3B0aW9uc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoYGRiICR7ZnVsbENvbW1hbmR9YCwgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gb3JtID09PSAncHJpc21hJyA/IGBQUklTTUEgJHtmdWxsQ29tbWFuZH1gIDogYFlBUk4gZHJpenpsZS1raXQgJHtmdWxsQ29tbWFuZH1gO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBjb25zdCBkaXJOYW1lID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiJyA6ICdwcmlzbWEnO1xuICBjb25zdCBkYlBhdGggPSBgJHtkaXJOYW1lfS9tb3VudC9wcm9kLnNxbGl0ZTNgO1xuICBjb25zdCByZXF1aXJlZEVudlZhcnMgPSB7XG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FLFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVk6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWSxcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgbWlzc2luZ0VudlZhcnMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEVudlZhcnMpXG4gICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGlmIChtaXNzaW5nRW52VmFycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTGl0ZXN0cmVhbTogJHttaXNzaW5nRW52VmFycy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgY29uc3QgcmV0ZW50aW9uQ2hlY2tJbnRlcnZhbCA9IHByb2plY3QuZW52LldCX0VOViA9PT0gJ3N0YWdpbmcnID8gJzVtJyA6ICcxaCc7XG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzbmFwc2hvdC1pbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gICAgICByZXRlbnRpb246IDcyaCAgICAgICAgICAjIEtlZXAgYmFja3VwcyBmb3IgMyBkYXlzXG4gICAgICByZXRlbnRpb24tY2hlY2staW50ZXJ2YWw6ICR7cmV0ZW50aW9uQ2hlY2tJbnRlcnZhbH1cbiAgICAgIHN5bmMtaW50ZXJ2YWw6IDFtXG5gO1xuXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBsaXRlc3RyZWFtQ29uZmlnKTtcbiAgICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCAke2NvbmZpZ1BhdGh9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7Y29uZmlnUGF0aH06ICR7cmVhc29ufWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgRGF0YWJhc2VPcm1Qcm9qZWN0IHtcbiAgcHJvamVjdDogUHJvamVjdDtcbiAgb3JtOiBEYXRhYmFzZU9ybTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndjogRW52UmVhZGVyT3B0aW9ucywgb3JtPzogRGF0YWJhc2VPcm0pOiBQcm9taXNlPERhdGFiYXNlT3JtUHJvamVjdFtdPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJlZCA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgLm1hcCgocHJvamVjdCkgPT4gKHByb2plY3QuZGF0YWJhc2VPcm0gPyB7IHByb2plY3QsIG9ybTogcHJvamVjdC5kYXRhYmFzZU9ybSB9IDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKChwcm9qZWN0KTogcHJvamVjdCBpcyBEYXRhYmFzZU9ybVByb2plY3QgPT4gISFwcm9qZWN0ICYmICghb3JtIHx8IHByb2plY3Qub3JtID09PSBvcm0pKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKG9ybSA/IGBObyAke29ybX0gcHJvamVjdCBmb3VuZC5gIDogJ05vIHN1cHBvcnRlZCBkYXRhYmFzZSBPUk0gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybTogRGF0YWJhc2VPcm0pOiB0eXBlb2YgcHJpc21hU2NyaXB0cyB8IHR5cGVvZiBkcml6emxlU2NyaXB0cyB7XG4gIHJldHVybiBvcm0gPT09ICdwcmlzbWEnID8gcHJpc21hU2NyaXB0cyA6IGRyaXp6bGVTY3JpcHRzO1xufVxuXG5mdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIHByb2plY3RzOiBEYXRhYmFzZU9ybVByb2plY3RbXVxuKTogR2VuZXJhdG9yPERhdGFiYXNlT3JtUHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBjb25zdCBvcm1Qcm9qZWN0QnlQcm9qZWN0ID0gbmV3IE1hcChwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IFtwcm9qZWN0LnByb2plY3QsIHByb2plY3RdKSk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoXG4gICAgY29tbWFuZE5hbWUsXG4gICAgcHJvamVjdHMubWFwKCh7IHByb2plY3QgfSkgPT4gcHJvamVjdClcbiAgKSkge1xuICAgIGNvbnN0IG9ybVByb2plY3QgPSBvcm1Qcm9qZWN0QnlQcm9qZWN0LmdldChwcm9qZWN0KTtcbiAgICBpZiAoIW9ybVByb2plY3QpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRldGVjdCBkYXRhYmFzZSBPUk0gZm9yICR7cHJvamVjdC5uYW1lfS5gKTtcblxuICAgIHlpZWxkIG9ybVByb2plY3Q7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHVua25vd24gb3B0aW9ucyBmcm9tIGFyZ3YgdG8gcGFzcyB0byBPUk0gY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtub3duT3B0aW9uczogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHVua25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIEJ1aWxkIGxpc3Qgb2Yga25vd24gb3B0aW9ucyBmcm9tIHNoYXJlZCBvcHRpb25zIGJ1aWxkZXJzXG4gIGNvbnN0IHNoYXJlZE9wdGlvbktleXMgPSBPYmplY3Qua2V5cyhzaGFyZWRPcHRpb25zQnVpbGRlcik7XG4gIGNvbnN0IHNoYXJlZE9wdGlvbkFsaWFzZXMgPSBPYmplY3QudmFsdWVzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAgIC5mbGF0TWFwKChvcHRpb24pID0+IHtcbiAgICAgIGlmICgnYWxpYXMnIGluIG9wdGlvbikge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcHRpb24uYWxpYXMpID8gb3B0aW9uLmFsaWFzIDogW29wdGlvbi5hbGlhc107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgYWxsS25vd25PcHRpb25zID0gbmV3IFNldChbXG4gICAgLi4ua25vd25PcHRpb25zLFxuICAgIC4uLnNoYXJlZE9wdGlvbktleXMsXG4gICAgLi4uc2hhcmVkT3B0aW9uQWxpYXNlcyxcbiAgICAvLyBJbnRlcm5hbCB5YXJncyBwcm9wZXJ0aWVzXG4gICAgJy0tJyxcbiAgICAnXycsXG4gICAgJyQwJyxcbiAgXSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJndikpIHtcbiAgICBpZiAoIWFsbEtub3duT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbnMgb2Yga2ViYWItY2FzZSBvcHRpb25zIHRvIGF2b2lkIGR1cGxpY2F0aW9uXG4gICAgICAvLyBJZiB3ZSBoYXZlIGJvdGggJ2NyZWF0ZS1vbmx5JyBhbmQgJ2NyZWF0ZU9ubHknLCBwcmVmZXIgdGhlIGtlYmFiLWNhc2UgdmVyc2lvblxuICAgICAgY29uc3Qga2ViYWJDYXNlS2V5ID0ga2V5LnJlcGxhY2VBbGwoL1tBLVpdL2csIChtYXRjaCkgPT4gYC0ke21hdGNoLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICBpZiAoa2ViYWJDYXNlS2V5ICE9PSBrZXkgJiYgYXJndltrZWJhYkNhc2VLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7IC8vIFNraXAgY2FtZWxDYXNlIHZlcnNpb24gaWYga2ViYWItY2FzZSBleGlzdHNcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGJvb2xlYW4gZmxhZ3NcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiB2YWx1ZSkge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWApO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIHN0cmluZy9udW1iZXIgdmFsdWVzXG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCwgU3RyaW5nKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IEFycmF5LmlzQXJyYXkoYXJndlsnLS0nXSkgPyBhcmd2WyctLSddLm1hcChTdHJpbmcpIDogW107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4udW5rbm93bk9wdGlvbnMsIC4uLnBhc3N0aHJvdWdoQXJnc10pO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYWNrYWdlTWFuYWdlcldpdGhSdW4gfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cGFja2FnZU1hbmFnZXJXaXRoUnVufSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3BhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzYCwgcHJvamVjdCwgYXJndik7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gICctLSc/OiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYgeyAnLS0nPzogc3RyaW5nW10gfVxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICBjb25zdCBtaXNlQWdlS2V5U2VjcmV0T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZXG4gICAgICA/ICdcXG4gICAgICAgIC0tc2VjcmV0IGlkPW1pc2VfYWdlX2tleSxlbnY9TUlTRV9BR0VfS0VZJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259JHttaXNlQWdlS2V5U2VjcmV0T3B0aW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3RoaXMuc3RhcnQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMsIGFkZGl0aW9uYWxBcmdzKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgY29uc3QgYWxsb2NhdGVUdHkgPSBhZGRpdGlvbmFsQXJncy5pbmNsdWRlcygnL2Jpbi9iYXNoJyk7XG4gICAgY29uc3QgbWlzZUFnZUtleUVudk9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWSA/ICctLWVudiBNSVNFX0FHRV9LRVkgJyA6ICcnO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30ke21pc2VBZ2VLZXlFbnZPcHRpb259LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgY29udGFpbmVyIGxzIC1xIC1mIG5hbWU9JHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0pIDI+IC9kZXYvbnVsbClgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCA9IGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3QpO1xuICAgIGlmIChjdXN0b21TdGFydFNjcmlwdFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgYCR7YnVpbGRTaGVsbENvbW1hbmQoWydiYXNoJywgY3VzdG9tU3RhcnRTY3JpcHRQYXRoXSl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPSBlY29zeXN0ZW1Db25maWdQYXRoXG4gICAgICA/IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdXG4gICAgICA6IHRoaXMuYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIGNvbW1hbmRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBjb21tYW5kczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gW1xuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5oYXNEcml6emxlID8gW2RyaXp6bGVTY3JpcHRzLm1pZ3JhdGVGb3JTdGFydChwcm9qZWN0KV0gOiBbXSksXG4gICAgXTtcbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIC8vIFVzZSBlbXB0eSBOT0RFX0VOViB0byBhdm9pZCBcInByb2R1Y3Rpb25cIiBtb2RlIGluIHNvbWUgZnJhbWV3b3JrcyBsaWtlIEJsaXR6LmpzLlxuICAgIHJldHVybiBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IFtdLCBwbGF5d3JpZ2h0QXJncyA9IFsndGVzdCcsICd0ZXN0L2UyZS8nXSB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnc2NyaXB0cy9zdGFydC1wcm9kdWN0aW9uLnNoJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHRlc3RDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHM6IG5vcm1hbGl6ZWRUYXJnZXRzIH0pO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBZQVJOIG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgeyBydW50aW1lV2l0aEFyZ3MgfSBmcm9tICcuLi8uLi91dGlscy9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBQbGFpbkFwcFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydERldlByb3RlY3RlZChfMTogUHJvamVjdCwgXzI6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQuJyk7XG4gIH1cblxuICBvdmVycmlkZSBzdGFydERldihfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiAke3J1bnRpbWVXaXRoQXJnc30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVBcmdzLCBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi9odHRwU2VydmVyUGFja2FnZXMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0UnVuT3B0aW9ucyB7XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcilcbiAgICAgIC5wb3NpdGlvbmFsKCd0YXJnZXRzJywgYXJndW1lbnRzQnVpbGRlci50YXJnZXRzKSBhcyBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YsIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndik7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyh0ZXN0QXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAodGVzdEFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gdGVzdEFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgICB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGRlZmF1bHRVbml0VGFyZ2V0cyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgIHRpbWVvdXQ6IHRlc3RBcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgY2FzZSAnaGVhZGxlc3MnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hlYWRsZXNzLWRldic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLmJsaXR6IHx8IGRlcHMubmV4dCB8fCBkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddIHx8IGRldkRlcHMudml0ZSkge1xuICAgICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVkJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGVhZGVkLWRldic6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1oZWFkZWQnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZGVidWcnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dlbmVyYXRlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IFsnY29kZWdlbicsIGBodHRwOi8vbG9jYWxob3N0OiR7cHJvamVjdC5lbnYuUE9SVH1gXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RyYWNlJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoYEJVTiBwbGF5d3JpZ2h0IHNob3ctdHJhY2VgLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuZW52Py5sZW5ndGggfHwgYXJndi5jYXNjYWRlRW52IHx8IGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gYXJndjtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuQ0kgfHw9ICcxJztcbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbnRlcmZhY2UgVHJlZUtpbGxDb21tYW5kQXJncyB7XG4gIHBpZDogbnVtYmVyO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuY29uc3QgYnVpbGRlciA9ICh5YXJnczogQXJndik6IEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz4gPT5cbiAgeWFyZ3NcbiAgICAucG9zaXRpb25hbCgncGlkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcHJvY2VzcyBJRCB0byBraWxsLicsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGRlbWFuZE9wdGlvbjogdHJ1ZSxcbiAgICB9KVxuICAgIC5vcHRpb24oJ3NpZ25hbCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2lnbmFsIHRvIHNlbmQgdG8gdGhlIHByb2Nlc3MgdHJlZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnU0lHVEVSTScsXG4gICAgfSkgYXMgQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPjtcblxuZXhwb3J0IGNvbnN0IHRyZWVLaWxsQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxvYmplY3QsIFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0ge1xuICBjb21tYW5kOiAndHJlZS1raWxsIDxwaWQ+IFtzaWduYWxdJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBnaXZlbiBwcm9jZXNzIGFuZCBhbGwgZGVzY2VuZGFudHMnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gYXJndi5zaWduYWwgYXMgTm9kZUpTLlNpZ25hbHM7XG4gICAgICBpZiAoIShzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaWduYWw6ICR7c2lnbmFsfWApO1xuICAgICAgfVxuICAgICAgdHJlZUtpbGwoYXJndi5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbnR5cGUgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVDaGVja0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndHlwZWNoZWNrJyxcbiAgZGVzY3JpYmU6ICdSdW4gdHlwZSBjaGVja2luZy4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goLi4uYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCkpO1xuICAgIH1cbiAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnWUFSTiBweXJpZ2h0Jyk7XG4gICAgfVxuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgcHJlc2VydmVDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBbaSwgZXhpdENvZGVdIG9mIGV4aXRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZXhpdENvZGUpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1tpXT8ucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUGxlYXNlIHRyeSBcInlhcm4gZ2VuLWNvZGVcIiBpZiB5b3UgZmFjZSB1bmtub3duIHR5cGUgZXJyb3JzLicpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFmaW5hbEV4aXRDb2RlKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICByZW1vdmVkTmV4dERpclxuICAgICAgICAgID8gJy0tLS0tXFxuTm8gdHlwZSBlcnJvcnMgZm91bmQuIFBsZWFzZSBpZ25vcmUgdGhlIHByZXZpb3VzIHR5cGUgZXJyb3JzLCBhcyB0aGV5IHdlcmUgY2F1c2VkIGJ5IG91dGRhdGVkIE5leHQuanMgY2FjaGUgZmlsZXMuJ1xuICAgICAgICAgIDogJ05vIHR5cGUgZXJyb3JzIGZvdW5kLidcbiAgICAgIClcbiAgICApO1xuICByZXR1cm4gZmluYWxFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2dvIC0tbm9FbWl0J107XG4gIH1cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFja2FnZU1hbmFnZXIgfSBmcm9tICcuLi91dGlscy9ydW50aW1lLmpzJztcblxuaW1wb3J0IHsgbGludCwgdHlwZSBMaW50Q29tbWFuZEFyZ3YgfSBmcm9tICcuL2xpbnQuanMnO1xuaW1wb3J0IHsgdGVzdCwgdHlwZSBUZXN0Q29tbWFuZEFyZ3YsIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgfSBmcm9tICcuL3Rlc3QuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmdWxsOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGRlc2NyaWJlOiAnUnVuIHRlc3RzIGFmdGVyIHZlcmlmeWluZyBwcm9qZWN0IGNvZGUnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz47XG50eXBlIFBhY2thZ2VDb21tYW5kQXJndiA9IFBpY2s8VmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCAnZHJ5UnVuJyB8ICd2ZXJib3NlJz47XG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlDb2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndmVyaWZ5JyxcbiAgZGVzY3JpYmU6ICdWZXJpZnkgcHJvamVjdCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGF3YWl0IChhcmd2LmZ1bGwgPyB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdHMuc2VsZiwgYXJndikgOiB2ZXJpZnlDb2RlKHByb2plY3RzLnNlbGYsIGFyZ3YpKTtcbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGVGdWxseShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3J0ZXIgPSBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3QsIGFyZ3YpO1xuICAgIGF3YWl0IHJ1blByb2plY3RUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgIHJlcG9ydGVyLnN1Y2NlZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRlci5mYWlsKGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZXBvcnRlci5maW5pc2goKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAsIHByb2plY3QsIGFyZ3YpO1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICdjbGVhbnVwJyxcbiAgICAoKSA9PlxuICAgICAgbGludCh7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIF86IFsnbGludCddLFxuICAgICAgICBmaXg6IHRydWUsXG4gICAgICAgIGZvcm1hdDogdHJ1ZSxcbiAgICAgICAgcHJpbnRBbGxPdXRwdXQ6IHRydWUsXG4gICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICB9IGFzIHVua25vd24gYXMgTGludENvbW1hbmRBcmd2KSxcbiAgICB7IHNpbGVudDogdHJ1ZSB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByb2plY3RUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoe1xuICAgIC4uLmFyZ3YsXG4gICAgXzogWyd0ZXN0J10sXG4gICAgZTJlOiAnaGVhZGxlc3MnLFxuICAgIHNpbGVudDogdHJ1ZSxcbiAgfSBhcyB1bmtub3duIGFzIFRlc3RDb21tYW5kQXJndik7XG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAoZXhpdENvZGUgPT09IDApIHJldHVybjtcblxuICBpZiAoIXByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkYi1yZXNldCddKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksICd0ZXN0JykpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oXG4gICAgY2hhbGsueWVsbG93KCdUZXN0cyBmYWlsZWQuIFRoaXMgcHJvamVjdCBkZWZpbmVzIFwiZGItcmVzZXRcIiwgc28gd2Igd2lsbCByZXNldCB0aGUgZGF0YWJhc2Ugb25jZSBhbmQgcmV0cnkgdGVzdHMuJylcbiAgKTtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cGFja2FnZU1hbmFnZXJ9IGRiLXJlc2V0YCwgZmluZFRlc3RQcm9qZWN0KHByb2plY3QsIHRlc3RBcmd2KSwgdGVzdEFyZ3YsIHtcbiAgICBwcmludFJhd091dHB1dDogdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3QgcmV0cnlFeGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKHJldHJ5RXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0cnlFeGl0Q29kZX0pOmApLCAndGVzdCBhZnRlciBkYi1yZXNldCByZXRyeScpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0cnlFeGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdUZXN0cyBwYXNzZWQgYWZ0ZXIgZGItcmVzZXQgcmV0cnkuJykpO1xufVxuXG5mdW5jdGlvbiBmaW5kVGVzdFByb2plY3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdENvbW1hbmRBcmd2KTogUHJvamVjdCB7XG4gIGNvbnN0IHRlc3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmICghdGVzdFByb2plY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2plY3Qgbm90IGZvdW5kOiAke3Byb2plY3QuZGlyUGF0aH1gKTtcbiAgfVxuICByZXR1cm4gdGVzdFByb2plY3Q7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH1cbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYWNrYWdlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBwcmVzZXJ2ZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBQcmludHMgcGFja2FnZSBjb21tYW5kIG91dHB1dCBmb3IgYHdiIHZlcmlmeWAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIHNvIHN1Y2Nlc3NmdWwgbm9pc3lcbiAqIGNvbW1hbmRzIGFyZSBzdW1tYXJpemVkIHdoaWxlIGZhaWx1cmUgb3V0cHV0IHJlbWFpbnMgYXZhaWxhYmxlIGZvciBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgVGhlIGV4ZWN1dGVkIGNvbW1hbmQuXG4gKiBAcGFyYW0gZXhpdENvZGUgVGhlIGNvbW1hbmQgZXhpdCBjb2RlLlxuICogQHBhcmFtIG91dHB1dCBUaGUgbWVyZ2VkIHN0ZG91dCBhbmQgc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwICYmIChjb21tYW5kID09PSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfHwgY29tbWFuZCA9PT0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlYCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKHByb2Nlc3Muc3Rkb3V0LmZkLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUocHJvY2Vzcy5zdGRlcnIuZmQsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRnVsbCBsb2c6JyksIGxvZ0ZpbGVQYXRoKSk7XG5cbiAgY29uc3QgZmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gb3JpZ2luYWxTdGRvdXRXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSBvcmlnaW5hbFN0ZGVycldyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcblxuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gZm9ybWF0RWxhcHNlZFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgY29uc3Qgc3RhdHVzID0gc3VjY2VlZGVkID8gJ1N1Y2NlZWRlZCcgOiAnRmFpbGVkJztcbiAgICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhdHVzfSBpbiAke2VsYXBzZWRUaW1lfS4gRnVsbCBsb2c6ICR7bG9nRmlsZVBhdGh9XFxuYDtcbiAgICBjb25zdCBjb2xvcmVkU3VtbWFyeSA9IHN1Y2NlZWRlZCA/IGNoYWxrLmdyZWVuKHN1bW1hcnkpIDogY2hhbGsucmVkKHN1bW1hcnkpO1xuICAgIG9yaWdpbmFsU3Rkb3V0V3JpdGUoY29sb3JlZFN1bW1hcnkpO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBzdW1tYXJ5KTtcbiAgICBmcy5jbG9zZVN5bmMobG9nRmlsZSk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdleGl0JywgZmluaXNoKTtcblxuICByZXR1cm4ge1xuICAgIGZhaWw6IChlcnJvcikgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5pc2g6ICgpID0+IHtcbiAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBmaW5pc2gpO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSxcbiAgICBzdWNjZWVkOiAoKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRlZVdyaXRlKG91dHB1dEZpbGU6IG51bWJlciwgbG9nRmlsZTogbnVtYmVyKTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlIHtcbiAgcmV0dXJuICgoXG4gICAgY2h1bms6IFVpbnQ4QXJyYXkgfCBzdHJpbmcsXG4gICAgZW5jb2RpbmdPckNhbGxiYWNrPzogQnVmZmVyRW5jb2RpbmcgfCAoKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSxcbiAgICBjYWxsYmFjaz86IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZFxuICApID0+IHtcbiAgICBjb25zdCBidWZmZXIgPVxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJ1xuICAgICAgICA/IEJ1ZmZlci5mcm9tKGNodW5rLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnc3RyaW5nJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6ICd1dGY4JylcbiAgICAgICAgOiBjaHVuaztcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgYnVmZmVyKTtcbiAgICBmcy53cml0ZVN5bmMob3V0cHV0RmlsZSwgYnVmZmVyKTtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZW5jb2RpbmdPckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGNhbGxiYWNrPy4oKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBnZW5Db2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuQ29kZS5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgbWFpbnRlbmFuY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9tYWludGVuYW5jZS5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBzZXR1cENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0cmVlS2lsbENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3RyZWVLaWxsLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHZlcmlmeUNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJpZnlDb2RlLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIH0pXG4gIC5jb21tYW5kKHZlcmlmeUNvZGVDb21tYW5kKVxuICAuY29tbWFuZChidWlsZElmTmVlZGVkQ29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChtYWludGVuYW5jZUNvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0cmVlS2lsbENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2Nlc3MucGlkfSkgZHVyaW5nIHNodXRkb3duOmAsIGVycm9yKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbInlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYiLCJlbnYiLCJkZXNjcmlwdGlvbiIsInR5cGUiLCJkZWZhdWx0IiwidmVyYm9zZSIsImFsaWFzIiwicmVhZEVudmlyb25tZW50VmFyaWFibGVzIiwiYXJndiIsImN3ZCIsImVudlBhdGhzIiwibWFwIiwiZW52UGF0aCIsInBhdGgiLCJyZXNvbHZlIiwidG9TdHJpbmciLCJjYXNjYWRlIiwiY2FzY2FkZUVudiIsImNhc2NhZGVOb2RlRW52IiwicHJvY2VzcyIsIk5PREVfRU5WIiwiYXV0b0Nhc2NhZGVFbnYiLCJXQl9FTlYiLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJwdXNoIiwiam9pbiIsImluY2x1ZGVSb290RW52Iiwicm9vdFBhdGgiLCJmcyIsImV4aXN0c1N5bmMiLCJmbGF0TWFwIiwiZmlsdGVyIiwicmVsYXRpdmUiLCJzaG91bGRTdXBwcmVzc091dHB1dCIsInNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQiLCJjb25zb2xlIiwiaW5mbyIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcyIsImVudlZhcnMiLCJrZXlzIiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVhZEVudkZpbGUiLCJtaXNlRW52VmFycyIsIm1pc2VFbnZWYXJOYW1lcyIsImN1cnJlbnRFbnZWYXJzIiwiY3VycmVudFBhdGgiLCJkaXJuYW1lIiwiaGFzUHJvamVjdE1pc2VDb25maWciLCJhcmdzIiwicmVzdWx0IiwiY2hpbGRQcm9jZXNzIiwic3Bhd25TeW5jIiwiZW5jb2RpbmciLCJzdGRpbyIsImVycm9yIiwic3RhdHVzIiwic3Rkb3V0IiwidHJpbSIsInBhcnNlZCIsIkpTT04iLCJwYXJzZSIsIkFycmF5IiwiaXNBcnJheSIsInJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJhc3NpZ24iLCJtaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lIiwiY2hlY2tFbnYiLCJtaXNzaW5nS2V5cyIsIkVycm9yIiwiZXhwYW5kIiwicHJvY2Vzc0VudiIsIm91dHB1dE9wdGlvbnMiLCJxdWlldEVudiIsInNpbGVudCIsImNhY2hlZEVudlZhcnMiLCJNYXAiLCJmaWxlUGF0aCIsImNhY2hlZCIsImdldCIsImNvbmZpZyIsInF1aWV0Iiwic2V0IiwiaXNFcnJub0V4Y2VwdGlvbiIsInRyZWVLaWxsIiwicGlkIiwic2lnbmFsIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwicGxhdGZvcm0iLCJydW5Db21tYW5kIiwiU3RyaW5nIiwibWF4QnVmZmVyIiwidGltZW91dCIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwia2lsbFRyZWVPbldpbmRvd3MiLCJkZXNjZW5kYW50cyIsInJvb3RQaWQiLCJjaGlsZHJlbkJ5UGFyZW50IiwicHNPdXRwdXQiLCJsaW5lIiwic3BsaXQiLCJtYXRjaGVkIiwiZXhlYyIsImNoaWxkUGlkIiwicGFyZW50UGlkIiwiY2hpbGRyZW4iLCJidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAiLCJxdWV1ZSIsImluZGV4IiwiY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsInRhcmdldFBpZHMiLCJ0b1JldmVyc2VkIiwidG9DaGlsZHJlbkZpcnN0UGlkcyIsInRhcmdldFBpZCIsImtpbGxJZk5lZWRlZCIsImtpbGwiLCJjb21tYW5kIiwib3B0aW9ucyIsImV4ZWNGaWxlU3luYyIsInN0ZGVyciIsIkJ1ZmZlciIsImlzQnVmZmVyIiwiZXh0cmFjdFN0ZGVyciIsIkNvbW1hbmRFeGVjdXRpb25FcnJvciIsImNvZGUiLCJ0b0V4aXRDb2RlIiwidGVzdCIsImNvbnN0cnVjdG9yIiwic3VwZXIiLCJ0aGlzIiwibmFtZSIsImFzeW5jIiwic3Bhd25Bc3luYyIsIlByb21pc2UiLCJyZWplY3QiLCJwcm9jIiwic3Bhd24iLCJzZXRFbmNvZGluZyIsInN0ZG91dFByaW50ZXIiLCJjcmVhdGVSZWFsdGltZVByaW50ZXIiLCJvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmciLCJzdGRlcnJQcmludGVyIiwib24iLCJkYXRhIiwicHJpbnRpbmdTdGRvdXQiLCJ3cml0ZSIsIm1lcmdlT3V0QW5kRXJyb3IiLCJwcmludGluZ1N0ZGVyciIsInN0b3BwZWQiLCJzdG9wUHJvY2VzcyIsIndhcm4iLCJjbGVhbnVwU2lnbmFscyIsInNpZ25hbEhhbmRsZXJzIiwicmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzIiwicmVtb3ZlTGlzdGVuZXIiLCJoYW5kbGVyIiwiY2xlYXIiLCJraWxsT25FeGl0IiwiaGFuZGxlU2lnbmFsIiwibGlzdGVuZXJDb3VudCIsInJlbW92ZUFsbExpc3RlbmVycyIsImZsdXNoIiwiaW5wdXQiLCJzdGRpbiIsImVuZCIsIkFOU0lfRVNDQVBFX0NPREVfUkVHRVhQIiwiUmVnRXhwIiwiZnJvbUNvZGVQb2ludCIsInN0cmVhbSIsIm9taXRCbGFua0xpbmVzIiwicGVuZGluZyIsImxpbmVzIiwicG9wIiwiaXNCbGFua0xpbmUiLCJyZXBsYWNlQWxsIiwidCIsInMiLCJpIiwiZSIsIm4iLCJoIiwiYmxvY2tzIiwicmVzZXQiLCJmaW5hbGl6ZWQiLCJibG9jayIsInN0YXJ0IiwibGFzdEJ5dGVJbmRleCIsInBhZGRpbmciLCJvdXRwdXRCaXRzIiwiYmxvY2tDb3VudCIsImJ5dGVDb3VudCIsIm91dHB1dEJsb2NrcyIsImV4dHJhQnl0ZXMiLCJ1cGRhdGUiLCJvIiwibCIsImMiLCJmIiwiY29kZVBvaW50QXQiLCJyIiwiZmluYWxpemUiLCJoZXgiLCJhIiwidSIsImQiLCJiIiwiayIsInkiLCJ4IiwiQiIsInAiLCJDIiwieiIsIkkiLCJnIiwidyIsIkEiLCJQIiwiRSIsImoiLCJtIiwicSIsInYiLCJEIiwiRiIsIkciLCJIIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsIiQiLCJfIiwidHQiLCJzdCIsIml0IiwiZXQiLCJvdCIsIm50IiwiaHQiLCJydCIsImx0IiwiY3QiLCJmdCIsImluc3RhbmNlIiwiZnJvbSIsIm1lc3NhZ2UiLCJzdGFjayIsImNhdXNlIiwic3R1YiIsImh5ZHJhdGUiLCJVaW50OEFycmF5IiwiYnRvYSIsImRlY29kZSIsImNyZWF0ZSIsImVuY29kZSIsImF0b2IiLCJTZXQiLCJ2YWx1ZXMiLCJhZGQiLCJEYXRlIiwidG9KU09OIiwiZmxhZ3MiLCJzb3VyY2UiLCJVUkwiLCJocmVmIiwiVGV4dEVuY29kZXIiLCJUZXh0RGVjb2RlciIsInN0cmluZ2lmeSIsImlzTmFOIiwiaXNGaW5pdGUiLCJmaWxsIiwic2xpY2UiLCJjYWNoZUR1cmF0aW9uIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJnZXRDYWNoZUtleSIsImtpbmQiLCJub3ciLCJjYWxsIiwiaXNDSSIsImNpRW52IiwiUHJvamVjdCIsIl9pbml0UHJvdG8iLCJfYXBwbHlEZWNzIiwibWVtb2l6ZU9uZSIsInBhdGhCeU5hbWUiLCJkaXJQYXRoIiwibG9hZEVudiIsIl9kaXJQYXRoIiwiaXNCdW5BdmFpbGFibGUiLCJoYXNCdW5Ub29sVmVyc2lvbiIsInVzZXNCdW5QYWNrYWdlTWFuYWdlciIsImhhc0J1bkxvY2tmaWxlIiwiaGFzQnVuUGFja2FnZU1hbmFnZXIiLCJyZWFkRmlsZVN5bmMiLCJyb290RGlyUGF0aCIsInNvbWUiLCJmaWxlTmFtZSIsInBhY2thZ2VNYW5hZ2VyIiwicm9vdFBhY2thZ2VKc29uIiwicGFja2FnZUpzb24iLCJzdGFydHNXaXRoIiwiYnVpbGRDb21tYW5kIiwic2NyaXB0cyIsImJ1aWxkIiwiaW5jbHVkZXMiLCJkb2NrZXJmaWxlIiwiZmluZEZpbGUiLCJoYXNEb2NrZXJmaWxlIiwiaGFzU291cmNlQ29kZSIsImRvY2tlckltYWdlTmFtZSIsImVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzIiwiY291bnQiLCJwYWNrYWdlSnNvblBhdGgiLCJoYXNQcmlzbWEiLCJnZXRPd25EZXBlbmRlbmN5VmVyc2lvbiIsImhhc0RyaXp6bGUiLCJkYXRhYmFzZU9ybSIsImhhc1ZpdGVzdCIsImRlcGVuZGVuY2llcyIsInZpdGVzdCIsImRldkRlcGVuZGVuY2llcyIsImhhc094bGludCIsImhhc0RlcGVuZGVuY3kiLCJoYXNPeGZtdCIsImhhc1ByZXR0aWVyIiwiaGFzUG9ldHJ5TG9jayIsImhhc1B1YnNwZWNZYW1sIiwicHJlZmVycmVkTGludGVyIiwiaGFzT3duRGVwZW5kZW5jeSIsInBhY2thZ2VOYW1lIiwiaGFzUGxheXdyaWdodENvbmZpZyIsInNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0IiwiQ0kiLCJjb25maWdQYXRoIiwiZG9ja2VyUGFja2FnZUpzb24iLCJiaW5FeGlzdHMiLCJiaW5Gb3VuZCIsImJpblBhdGgiLCJQQVRIIiwicGFyZW50UGF0aCIsImZpbmQiLCJnZXREZXBlbmRlbmN5VmVyc2lvbiIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwicGVlckRlcGVuZGVuY2llcyIsImZpbmRTZWxmUHJvamVjdCIsImlzUHJvamVjdEVudmlyb25tZW50IiwicHJvamVjdCIsIk1JU0VfRU5WIiwiZmluZERlc2NlbmRhbnRQcm9qZWN0cyIsInJvb3RBbmRTZWxmUHJvamVjdHMiLCJmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyIsInJvb3QiLCJzZWxmIiwiZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzIiwidGhpc1Byb2plY3QiLCJyb290UHJvamVjdCIsIndvcmtzcGFjZXMiLCJlbmRzV2l0aCIsInByb2plY3RzIiwid29ya3NwYWNlIiwiZ2xvYlBhdHRlcm4iLCJwYWNrYWdlRGlycyIsIndvcmtzcGFjZVBhdGgiLCJ3cyIsImdsb2JieSIsImRvdCIsIm9ubHlEaXJlY3RvcmllcyIsInN1YlBhY2thZ2VEaXJQYXRoIiwiaXNSdW5uaW5nT25CdW4iLCJ2ZXJzaW9ucyIsImJ1biIsIm5wbV9leGVjcGF0aCIsInJ1bnRpbWVXaXRoQXJncyIsInBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsImJ1aWxkSWZOZWVkZWRDb21tYW5kIiwiZGVzY3JpYmUiLCJwcm9qZWN0UGF0aEZvclRlc3RpbmciLCJjaGFsayIsInJlZCIsImdyZWVuIiwiY2FuU2tpcCIsImNhY2hlRmlsZVBhdGgiLCJjb250ZW50SGFzaCIsImNhY2hlRGlyZWN0b3J5UGF0aCIsInByb21pc2VzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJoYXNoIiwiY3JlYXRlSGFzaCIsImNvbW1pdEhhc2giLCJjaGlsZF9wcm9jZXNzIiwiZXhlY1N5bmMiLCJlbnZpcm9ubWVudEpzb24iLCJpZ25vcmluZ0VudlZhck5hbWVzIiwiaGFzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZEZpbGVQYXRocyIsInJlcGxhY2UiLCJpbmNsdWRlUGF0dGVybnMiLCJwYXR0ZXJuIiwiaW5jbHVkZVN1ZmZpeCIsInN1ZmZpeCIsImV4Y2x1ZGVQYXR0ZXJucyIsImNvcHkiLCJkaWdlc3QiLCJ1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQiLCJjYWNoZWRDb250ZW50SGFzaCIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJyZWFkRmlsZSIsImNhblNraXBCdWlsZCIsImRyeVJ1biIsIndyaXRlRmlsZSIsImJ1aWxkSWZOZWVkZWQiLCJyZXQiLCJzaGVsbCIsImV4aXRDb2RlIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImRlZmF1bHRPcHRpb25zIiwiZXhpdElmRmFpbGVkIiwicnVuV2l0aFNwYXduIiwic2NyaXB0Iiwib3B0cyIsIm5vcm1hbGl6ZWRTY3JpcHQiLCJub3JtYWxpemVTY3JpcHQiLCJvbWl0U2lsZW50U3RhcnQiLCJwcmludFN0YXJ0IiwicHJpbnRhYmxlIiwicnVubmFibGUiLCJwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkIiwic2lsZW50U3VjY2VzcyIsInNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQiLCJCb29sZWFuIiwicHJvY2Vzc1NpbGVudE91dHB1dCIsInByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSIsIndyb3RlU2lsZW50UHJvZ3Jlc3MiLCJwcm9ncmVzc1RpbWVyIiwic2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zIiwic2V0SW50ZXJ2YWwiLCJjb25maWd1cmVFbnYiLCJwcmVzZXJ2ZUNvbG9yIiwiZmluYWxseSIsImNsZWFySW50ZXJ2YWwiLCJvdXRwdXQiLCJzaWxlbnRTdWNjZXNzTWVzc2FnZSIsIm9uU2lnbmFsIiwicnVuV2l0aFNwYXduSW5QYXJhbGxlbCIsInJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSIsInByaW50UmF3T3V0cHV0Iiwib3V0IiwicHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1biIsIm5ld1NjcmlwdCIsImJsaXR6IiwicHJpbnRhYmxlU2NyaXB0IiwiZml4QnVuQ29tbWFuZCIsInJ1bm5hYmxlU2NyaXB0IiwicHJlZml4Iiwid2VhayIsImdyYXkiLCJjeWFuIiwiYm9sZCIsInByaW50T3B0aW9ucyIsImV4aXQiLCJuZXdFbnYiLCJjaSIsIk5PX0NPTE9SIiwiRk9SQ0VfQ09MT1IiLCJpc1RUWSIsImNvbmZpZ3VyZUNvbG9yRW52Iiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MiLCJvcHRpb25OYW1lIiwiZ2V0T3B0aW9uVmFsdWUiLCJpdGVtIiwiY2FtZWxDYXNlT3B0aW9uTmFtZSIsImNoYXJhY3RlciIsInRvVXBwZXJDYXNlIiwiY29uY3VycmVudGx5Q29tbWFuZCIsImJ1aWxkZXIiLCJzdWNjZXNzIiwiY2hvaWNlcyIsImNvbW1hbmRzIiwiZGV0YWNoZWQiLCJpbnRlcnJ1cHRlZFNpZ25hbCIsImZpcnN0UmVzdWx0Iiwic3RvcFJlc3VsdCIsInN0b3BwaW5nIiwiZm9yY2VLaWxsUHJvbWlzZXMiLCJyZXN1bHRzIiwid2FpdEZvckV4aXRQcm9taXNlcyIsImNoaWxkIiwic2V0dGxlZCIsInNldHRsZSIsImtpbGxPdGhlcnMiLCJraWxsT3RoZXJzT25GYWlsIiwic2hvdWxkU3RvcE90aGVycyIsInRlcm1pbmF0ZUNoaWxkcmVuIiwib25jZSIsImdldEV4aXRDb2RlIiwic3RvcEFsbCIsInN0b3BPblNpZ2ludCIsInN0b3BPblNpZ3Rlcm0iLCJzdG9wT25TaWdxdWl0IiwiYWxsIiwicnVuQ29uY3VycmVudGx5IiwiY29uc3RhbnRzIiwic2lnbmFscyIsImZvcmNlS2lsbFBpZHMiLCJzaWduYWxQaWRzIiwidG9DaGlsZFBpZHMiLCJwaWRzIiwiZGVhZGxpbmUiLCJldmVyeSIsImlzUHJvY2Vzc0dyb3VwR29uZSIsInNsZWVwIiwiTWF0aCIsIm1pbiIsIndhaXRGb3JGb3JjZUtpbGwiLCJzaWduYWxlZFBpZHMiLCJraWxsUHJvY2Vzc0dyb3VwIiwibXMiLCJzZXRUaW1lb3V0IiwiRklMRV9TQ0hFTUEiLCJMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUiLCJERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgiLCJQT1NTSUJMRV9QUklTTUFfUEFUSFMiLCJzY2hlbWFQYXRoIiwiZGJQYXRoIiwiZ2V0RGF0YWJhc2VEaXJQYXRoIiwiZ2V0UHJpc21hQmFzZURpciIsImdldExpdGVzdHJlYW1Db25maWdPcHRpb24iLCJsb2NhbENvbmZpZ1BhdGgiLCJwcmlzbWFTY3JpcHRzIiwiY2xlYW5VcExpdGVzdHJlYW0iLCJkZXBsb3kiLCJhZGRpdGlvbmFsT3B0aW9ucyIsImdlbmVyYXRlIiwiZGVwbG95Rm9yY2UiLCJyZW1vdmVEYkNvbW1hbmQiLCJsaXN0QmFja3VwcyIsIm1pZ3JhdGUiLCJzZWVkIiwibWlncmF0ZURldiIsInN0ZXBzIiwiY2xlYW51cENvbW1hbmQiLCJkYlVybCIsIkRBVEFCQVNFX1VSTCIsInJhd0RiUGF0aCIsImJhc2VEaXIiLCJhYnNvbHV0ZVBhdGgiLCJpc0Fic29sdXRlIiwiY2xlYW5VcFNxbGl0ZURiSWZOZWVkZWQiLCJyZXNldENvbW1hbmQiLCJyZXN0b3JlIiwib3V0cHV0UGF0aCIsInNjcmlwdFBhdGgiLCJwcmlzbWEiLCJzdHVkaW8iLCJkYlVybE9yUGF0aCIsImdlbkNvZGVDb21tYW5kIiwiZ2VuQ29kZVRhcmdldHMiLCJnZXRHZW5Db2RlU2NyaXB0cyIsImNoYWtyYVR5cGVnZW5TY3JpcHQiLCJ2ZXJzaW9uIiwibWFqb3IiLCJtYXRjaCIsImdldE93bkRlcGVuZGVuY3lNYWpvciIsImZpbGVFeGlzdHMiLCJnZXRDaGFrcmFTY3JpcHQiLCJkcml6emxlQ29uZmlnUGF0aCIsImdldERyaXp6bGVDb25maWdQYXRoIiwia2lsbFBvcnRJZk5vbkNpQ29tbWFuZCIsInBvcnRFbnYiLCJQT1JUIiwicG9ydCIsImtpbGxQb3J0UHJvY2VzcyIsImtpbGxQb3J0SWZOb25DaSIsInByaW50QnVmZmVyZWRPdXRwdXQiLCJoYXNXYXJuaW5nT3V0cHV0Iiwic2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dCIsIm5vcm1hbGl6ZWRPdXRwdXQiLCJub3JtYWxpemVCdWZmZXJlZE91dHB1dCIsImJ1aWxkU2hlbGxDb21tYW5kIiwiYXJnIiwic2hlbGxFc2NhcGVBcmd1bWVudCIsIm94bGludEV4dGVuc2lvbnMiLCJweXRob25FeHRlbnNpb25zIiwiZGFydEV4dGVuc2lvbnMiLCJveGZtdEV4dGVuc2lvbnMiLCJwcmV0dGllckV4dGVuc2lvbnMiLCJwcmV0dGllck9ubHlFeHRlbnNpb25zIiwiZXh0IiwicHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiIsImxpbnRDb21tYW5kIiwiZml4IiwiZm9ybWF0IiwibGludCIsImZpbGVzIiwibGludFRhcmdldHMiLCJnZXRMaW50VGFyZ2V0RmlsZXMiLCJsaW50RmlsZVBhdGhzQnlQcm9qZWN0Iiwib3hmbXRGaWxlUGF0aHNCeVByb2plY3QiLCJweXRob25GaWxlUGF0aHNCeVByb2plY3QiLCJkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0IiwicHJldHRpZXJGaWxlUGF0aHMiLCJwYWNrYWdlSnNvbkZpbGVQYXRocyIsInByZXR0aWVyQXJncyIsInNvcnRQYWNrYWdlSnNvbkFyZ3MiLCJtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzIiwiZmlsZSIsImZpbGVLaW5kIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiZ2V0TGludFRhcmdldEZpbGVLaW5kIiwiZXh0ZW5zaW9uIiwiZXh0bmFtZSIsImdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyIsImxpbnRQYXRoIiwiZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyIsInB5dGhvbkZpbGVQYXRocyIsImRhcnRGaWxlUGF0aHMiLCJzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24iLCJsaW50RmlsZVBhdGhzIiwib3hmbXRGaWxlUGF0aHMiLCJidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4iLCJmb3JtYXR0ZXJQYXRoIiwiYnVpbGRFeHBsaWNpdEZvcm1hdHRlckFyZ3MiLCJpc1BvdGVudGlhbExpbnRUYXJnZXQiLCJzZWxmRGlyUGF0aCIsIm5lZWRzUHJldHRpZXIiLCJwcm9qZWN0UGF0dGVybiIsImJ1aWxkUHJldHRpZXJBcmdzIiwiZm9ybWF0dGVyQ29tbWFuZHMiLCJsaW50ZXJDb21tYW5kcyIsImxpbnRSdW5PcHRpb25zIiwicHJpbnRBbGxPdXRwdXQiLCJzaG91bGRSdW5Gb3JtYXR0ZXJzIiwic2hvdWxkUnVuTGludGVycyIsImJ1aWxkTGludENvbW1hbmQiLCJidWlsZFBvZXRyeUxpbnRDb21tYW5kIiwiYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kIiwiYnVpbGREYXJ0TGludENvbW1hbmQiLCJidWlsZERhcnRGb3JtYXRDb21tYW5kIiwiYnVpbGRPeGZtdENvbW1hbmQiLCJsaW50RXhpdENvZGVzIiwiZm9ybWF0dGVyUmVzdWx0cyIsInJ1bkxpbnRDb21tYW5kcyIsInByaW50U2lsZW50TGludE91dHB1dHMiLCJwcmV0dGllclJlc3VsdCIsInJ1bkxpbnRDb21tYW5kIiwic29ydFBhY2thZ2VKc29uUmVzdWx0IiwibGludGVyUmVzdWx0cyIsInJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCIsInRoZW4iLCJwcmludGFibGVSZXN1bHRzIiwicHJpbnRDb21tYW5kT3V0cHV0IiwicHJpbnRDb21tYW5kSGVhZGVyIiwidGFyZ2V0cyIsInNob3VsZEZvcm1hdEV4cGxpY2l0UGF0aFdpdGhQcmV0dGllciIsImRlc2NlbmRhbnRQcm9qZWN0cyIsIm93bmluZ1Byb2plY3QiLCJmaW5kT3duaW5nUHJvamVjdCIsImtpbGxlZCIsImtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2VzcyIsImZpbHRlckFyZ3MiLCJjb250YWluZXJJZHMiLCJpZCIsImxpc3REb2NrZXJDb250YWluZXJJZHMiLCJyZW1vdmVEb2NrZXJDb250YWluZXJzIiwic3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydCIsImNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIiwicmF3UG9ydCIsImlzUG9ydEF2YWlsYWJsZSIsImtpbGxGdW5jIiwia2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQiLCJob3N0IiwicHJvYmVQb3J0Iiwic2VydmVyIiwiY3JlYXRlU2VydmVyIiwiZXJyIiwiY2xvc2UiLCJsaXN0ZW4iLCJnZXRNYWludGVuYW5jZVNlcnZlclNvdXJjZSIsInBpZFBhdGgiLCJyYXciLCJtYWludGVuYW5jZUNvbW1hbmQiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJhY3Rpb24iLCJhc3NlcnQiLCJvayIsInBhcnNlUG9ydCIsImdldFBpZFBhdGgiLCJyZWFkUGlkIiwicmVtb3ZlUGlkRmlsZSIsInN0b3BNYWludGVuYW5jZVNlcnZlciIsImV4aXN0aW5nUGlkIiwiaXNQcm9jZXNzUnVubmluZyIsIm1rZGlyU3luYyIsImV4ZWNQYXRoIiwidW5yZWYiLCJ3YWl0Rm9yUGlkRmlsZSIsInN0YXJ0TWFpbnRlbmFuY2VTZXJ2ZXIiLCJybVN5bmMiLCJmb3JjZSIsInByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCIsImNvbW1hbmROYW1lIiwicnVudGltZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIiwib3V0c2lkZSIsImRlcHMiLCJvcHRpbWl6ZURldkRlcGVuZGVuY2llcyIsIm9wdGltaXplU2NyaXB0cyIsIm9wdGltaXplUm9vdFByb3BzIiwiZGlzdERpclBhdGgiLCJ3cml0ZURvY2tlclNoZWxsU2NyaXB0cyIsInNvdXJjZURpclBhdGgiLCJjdXJyZW50RGlyUGF0aCIsImZpbGVVUkxUb1BhdGgiLCJ1cmwiLCJjYW5kaWRhdGUiLCJwYXJlbnREaXJQYXRoIiwiZmluZERvY2tlclNoZWxsU2NyaXB0c0RpclBhdGgiLCJkaXJlbnQiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImlzRmlsZSIsInRhcmdldEZpbGVQYXRoIiwiY29weUZpbGUiLCJjaG1vZCIsImRldkRlcHMiLCJwcm9tb3RlZERlcHMiLCJwcm9tb3RlUnVudGltZURldkRlcGVuZGVuY2llcyIsIm5hbWVXb3Jkc1RvQmVSZW1vdmVkIiwicmVtb3ZlZERlcHMiLCJ3b3JkIiwicmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQiLCJuYW1lV29yZHNPZlVubmVjZXNzYXJ5U2NyaXB0cyIsImNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzIiwicmVtb3ZlZFNjcmlwdHMiLCJjb250ZW50IiwicHJpdmF0ZSIsInB1Ymxpc2hDb25maWciLCJwcmV0dGllciIsImJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kIiwiREFUQUJBU0VfUEFUSCIsImdldEZpbGVEYXRhYmFzZVVybFBhdGgiLCJkcml6emxlU2NyaXB0cyIsInJlbW92ZUNvbW1hbmQiLCJzZWVkQ29tbWFuZCIsIm1pZ3JhdGVDb21tYW5kIiwibWlncmF0ZUZvclN0YXJ0IiwiX3Byb2plY3QiLCJwcmlzbWFDb21tYW5kIiwiYWxpYXNlcyIsInBhcnNlckNvbmZpZ3VyYXRpb24iLCJjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQiLCJjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZCIsImRlcGxveUNvbW1hbmQiLCJkZXBsb3lGb3JjZUNvbW1hbmQiLCJnZW5lcmF0ZUNvbW1hbmQiLCJsaXN0QmFja3Vwc0NvbW1hbmQiLCJtaWdyYXRlRGV2Q29tbWFuZCIsInJlc3RvcmVDb21tYW5kIiwic3R1ZGlvQ29tbWFuZCIsImRlZmF1bHRDb21tYW5kIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsImFsbFByb2plY3RzIiwiZmluZERhdGFiYXNlT3JtUHJvamVjdHMiLCJwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCIsImNyZWF0ZUxpdGVzdHJlYW1Db25maWciLCJ1bmtub3duT3B0aW9ucyIsImV4dHJhY3RVbmtub3duT3B0aW9ucyIsIm9ybSIsImdldERhdGFiYXNlT3JtU2NyaXB0cyIsIm9ybVNjcmlwdHMiLCJzaG91bGRDaGVja0lkZW1wb3RlbmN5IiwiY2hlY2tJZGVtcG90ZW5jeSIsImlzUHJvZHVjdGlvbkVudmlyb25tZW50IiwieWVsbG93IiwiV0JfRE9DS0VSIiwiaXNEb2NrZXJFbmFibGVkIiwicmVzdG9yZWQiLCJmdWxsQ29tbWFuZCIsInRyaW1FbmQiLCJyZXF1aXJlZEVudlZhcnMiLCJDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSIsIkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lEIiwiQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZIiwibWlzc2luZ0VudlZhcnMiLCJyZXRlbnRpb25DaGVja0ludGVydmFsIiwibGl0ZXN0cmVhbUNvbmZpZyIsIndyaXRlRmlsZVN5bmMiLCJyZWFzb24iLCJmaWx0ZXJlZCIsIm9ybVByb2plY3RCeVByb2plY3QiLCJvcm1Qcm9qZWN0Iiwia25vd25PcHRpb25zIiwic2hhcmVkT3B0aW9uS2V5cyIsInNoYXJlZE9wdGlvbkFsaWFzZXMiLCJvcHRpb24iLCJhbGxLbm93bk9wdGlvbnMiLCJrZWJhYkNhc2VLZXkiLCJ0b0xvd2VyQ2FzZSIsInBhc3N0aHJvdWdoQXJncyIsInJldHJ5Q29tbWFuZCIsInJldHJ5IiwiY21kQW5kQXJncyIsImxhc3RTdGF0dXMiLCJzZXR1cENvbW1hbmQiLCJkaXJlbnRzIiwib3MiLCJwYWNrYWdlcyIsInByb21pc2VBbGwiLCJwbGF5d3JpZ2h0Iiwic2V0dXAiLCJ0b0Rldk51bGwiLCJkb2NrZXJTY3JpcHRzIiwiYnVpbGRJbWFnZSIsIm1pc2VBZ2VLZXlTZWNyZXRPcHRpb24iLCJNSVNFX0FHRV9LRVkiLCJzdG9wQW5kU3RhcnQiLCJhZGRpdGlvbmFsQXJncyIsInN0b3AiLCJzcGF3blN5bmNPbkV4aXQiLCJCYXNlU2NyaXB0cyIsInNob3VsZFdhaXRBbmRPcGVuQXBwIiwiYnVpbGREb2NrZXIiLCJzdGFydERldiIsInN0YXJ0RGV2UHJvdGVjdGVkIiwid2FpdEFuZE9wZW5BcHAiLCJzdGFydFByb2R1Y3Rpb24iLCJzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQiLCJzdGFydFRlc3QiLCJzdGFydERvY2tlciIsIm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCIsIm5vcm1hbGl6ZWRBcmdzVGV4dCIsImN1c3RvbVN0YXJ0U2NyaXB0UGF0aCIsImZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoIiwiYnVpbGRQcm9kdWN0aW9uQ29tbWFuZCIsImVjb3N5c3RlbUNvbmZpZ1BhdGgiLCJmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aCIsImJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzIiwiY21kIiwidGVzdEUyRURldiIsInRlc3RFMkVQcm90ZWN0ZWQiLCJ0ZXN0RTJFUHJvZHVjdGlvbiIsInRlc3RFMkVEb2NrZXIiLCJ0ZXN0U3RhcnQiLCJ3YWl0QXBwIiwic3RhcnRDb21tYW5kIiwiZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MiLCJwbGF5d3JpZ2h0QXJncyIsInBsYXl3cmlnaHRDb21tYW5kIiwiYmFpbCIsImJhc2UiLCJub3JtYWxpemVkVGFyZ2V0cyIsImFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uIiwicmVzdCIsImV4cGxpY2l0VGFyZ2V0SW5kZXhlcyIsImZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzIiwicmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCIsImJ1aWxkUGxheXdyaWdodENvbW1hbmQiLCJ0ZXN0VW5pdCIsImNvbW1hbmRBcmdzIiwicGxheXdyaWdodEluZGV4IiwiaW5kZXhPZiIsImlzUGxheXdyaWdodFRlc3RDb21tYW5kIiwicGVuZGluZ1ZhbHVlTW9kZSIsInRhcmdldEluZGV4ZXMiLCJvZmZzZXQiLCJQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsIlBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTIiwic2hvcnRPcHRpb24iLCJQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyIsImJsaXR6U2NyaXB0cyIsImh0dHBTZXJ2ZXJTY3JpcHRzIiwid2F0Y2giLCJ0ZXN0Q29tbWFuZCIsIm5leHRTY3JpcHRzIiwicGxhaW5BcHBTY3JpcHRzIiwiXzEiLCJfMiIsInJlbWl4U2NyaXB0cyIsInZpdGVTY3JpcHRzIiwiaHR0cFNlcnZlclBhY2thZ2VzIiwibW9kZSIsImRvY2tlck9wdGlvbnMiLCJub3JtYWxpemVBcmdzIiwibmV4dCIsInZpdGUiLCJlMmUiLCJhcmd1bWVudHNCdWlsZGVyIiwiYXJyYXkiLCJ0ZXN0QXJndiIsIndpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYiLCJ0ZXN0VGFyZ2V0cyIsInNob3VsZFJ1bkUyZSIsInNob3VsZFJ1blVuaXQiLCJoYXNFMmVUYXJnZXRzIiwidGFyZ2V0IiwiaGFzVW5pdFRhcmdldHMiLCJzaG91bGRSdW5BbGxUZXN0cyIsInJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyIsImRlZmF1bHRVbml0VGFyZ2V0cyIsImdldERlZmF1bHRVbml0VGFyZ2V0cyIsInVuaXRUYXJnZXRzIiwidW5pdEFyZ3YiLCJydW5Vbml0VGVzdENvbW1hbmQiLCJ1bml0VGltZW91dCIsImUyZVRhcmdldHMiLCJlMmVBcmd2IiwicnVuVGVzdENvbW1hbmQiLCJidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFIiwidGVzdE9uRG9ja2VyIiwiYnVpbGRFeGl0Q29kZSIsInRlc3RFeGl0Q29kZSIsInN0b3BFeGl0Q29kZSIsImRlZHVwZU5vaXN5VGVzdE91dHB1dCIsInJlY2VudFByaW50ZWRMaW5lcyIsInJlY2VudFByaW50ZWRMaW5lU2V0IiwiZGVkdXBlZExpbmVzIiwibGluZVN0YXJ0SW5kZXgiLCJsaW5lRW5kSW5kZXgiLCJpdGVyYXRlTGluZXMiLCJub3JtYWxpemVkTGluZSIsIm5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5IiwicHJpbnRlZExpbmUiLCJhcmVMaW5lc1NpbWlsYXIiLCJwdXNoUmVjZW50UHJpbnRlZExpbmUiLCJsaW5lU2V0IiwicmVtb3ZlZExpbmUiLCJzaGlmdCIsImRlbGV0ZSIsIm1heExlbmd0aCIsIm1heCIsImFicyIsImRpc3RhbmNlIiwiaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMiLCJ0ZXN0T25DaUNvbW1hbmQiLCJ0ZXN0T25DaSIsInRyZWVLaWxsQ29tbWFuZCIsImRlbWFuZE9wdGlvbiIsInR5cGVDaGVja0NvbW1hbmQiLCJyZW1vdmVkTmV4dERpciIsImJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzIiwibmV4dERpclBhdGgiLCJleGl0Q29kZXMiLCJmaW5hbEV4aXRDb2RlIiwidHlwZUNoZWNrIiwidGNDb21tYW5kIiwidmVyaWZ5Q29kZUNvbW1hbmQiLCJmdWxsIiwicmVwb3J0ZXIiLCJzdGFydGVkQXQiLCJ3YkRpclBhdGgiLCJsb2dGaWxlUGF0aCIsImxvZ0ZpbGUiLCJvcGVuU3luYyIsIm9yaWdpbmFsU3Rkb3V0V3JpdGUiLCJiaW5kIiwib3JpZ2luYWxTdGRlcnJXcml0ZSIsInN1Y2NlZWRlZCIsImZpbmlzaGVkIiwidGVlV3JpdGUiLCJmZCIsImZpbmlzaCIsImVsYXBzZWRUaW1lIiwibWlsbGlzZWNvbmRzIiwic2Vjb25kcyIsInJvdW5kIiwibWludXRlcyIsImZsb29yIiwicmVtYWluaW5nU2Vjb25kcyIsImZvcm1hdEVsYXBzZWRUaW1lIiwic3VtbWFyeSIsImNvbG9yZWRTdW1tYXJ5Iiwid3JpdGVTeW5jIiwiY2xvc2VTeW5jIiwiZmFpbCIsInN1Y2NlZWQiLCJzdGFydFZlcmlmeUZ1bGxSZXBvcnRlciIsInZlcmlmeUNvZGUiLCJydW5QYWNrYWdlQ29tbWFuZCIsInRlc3RQcm9qZWN0IiwiZmluZFRlc3RQcm9qZWN0IiwicmV0cnlFeGl0Q29kZSIsInJ1blByb2plY3RUZXN0IiwidmVyaWZ5Q29kZUZ1bGx5IiwiYWxsb3dGYWlsdXJlIiwicnVuSW5Qcm9jZXNzQ29tbWFuZCIsInByaW50Q29tbWFuZCIsInRyaW1tZWRPdXRwdXQiLCJwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0Iiwib3V0cHV0RmlsZSIsImNodW5rIiwiZW5jb2RpbmdPckNhbGxiYWNrIiwiY2FsbGJhY2siLCJidWZmZXIiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsIm1pZGRsZXdhcmUiLCJ3b3JraW5nRGlyIiwiY2hkaXIiLCJCRVJSWV9CSU5fRk9MREVSIiwidXBwZXJLZXkiLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJwYWNrYWdlSnNvbkRpciIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiLCJzaHV0dGluZ0Rvd24iXSwibWFwcGluZ3MiOiJpc0JBUU8sTUFBTUEsRUFBNEIsQ0FDdkNDLElBQUssQ0FDSEMsWUFBYSwyQkFDYkMsS0FBTSxTQUVSLGNBQWUsQ0FDYkQsWUFDRSx3TEFDRkMsS0FBTSxVQUVSLG1CQUFvQixDQUNsQkQsWUFBYSwwRkFDYkMsS0FBTSxXQUVSLG1CQUFvQixDQUNsQkQsWUFBYSxpRUFDYkMsS0FBTSxVQUNOQyxTQUFTLEdBRVgsbUJBQW9CLENBQ2xCRixZQUFhLHFHQUNiQyxLQUFNLFVBQ05DLFNBQVMsR0FFWCxZQUFhLENBQ1hGLFlBQWEscUZBQ2JDLEtBQU0sU0FDTkMsUUFBUyxnQkFFWCxZQUFhLENBQ1hGLFlBQWEsMENBQ2JDLEtBQU0sV0FFUkUsUUFBUyxDQUNQSCxZQUFhLHNDQUNiQyxLQUFNLFVBQ05HLE1BQU8sTUFXSixTQUFTQyxFQUNkQyxFQUNBQyxHQUVBLElBQUlDLEdBQVlGLEVBQUtQLEtBQU8sSUFBSVUsSUFBS0MsR0FBWUMs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QUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFRyxHQUFHaUIsR0FBRyxFQUFFQyxJQUFJLElBQUlwQixFQUFFRyxHQUFHaUIsR0FBRyxFQUFFRCxJQUFJLElBQUlyQixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVELEVBQUV1QixHQUFHRyxHQUFHLEVBQUVDLElBQUksSUFBSTFCLEVBQUVrQixHQUFHUSxHQUFHLEVBQUVELElBQUksSUFBSTNCLEVBQUUsSUFBSUMsRUFBRUQsRUFBRSxJQUFJRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUQsRUFBRW9CLEdBQUdRLEdBQUcsRUFBRUMsSUFBSSxJQUFJNUIsRUFBRW9CLEdBQUdRLEdBQUcsRUFBRUQsSUFBSSxJQUFJN0IsRUFBRSxJQUFJQyxFQUFFRCxFQUFFLElBQUlFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRCxFQUFFMEIsR0FBR3ZCLEdBQUcsRUFBRUMsSUFBSSxJQUFJSCxFQUFFMEIsR0FBR3ZCLEdBQUcsRUFBRUQsSUFBSSxJQUFJSixFQUFFLElBQUlDLEVBQUVELEVBQUUsSUFBSUUsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUVGLEVBQUUsS0FBS0MsRUFBRUQsRUFBRSxLQUFLRSxFQUFFRixFQUFFLEtBQUtDLEVBQUVELEVBQUUsS0FBS0UsRUFBRUYsRUFBRSxLQUFLQyxFQUFFRCxFQUFFLEtBQUtFLEVBQUU2QixFQUFFL0IsRUFBRSxHQUFHZ0MsRUFBRWhDLEVBQUUsR0FBRytELEVBQUUvRCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUdnRSxFQUFFaEUsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHNkMsRUFBRTdDLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBRzhDLEVBQUU5QyxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUc2RSxHQUFHN0UsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHOEUsR0FBRzlFLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBRzJELEVBQUUzRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUc0RCxFQUFFNUQsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHbUQsRUFBRW5ELEVBQUUsSUFBSSxFQUFFQSxFQUFFLEtBQUssR0FBR29ELEVBQUVwRCxFQUFFLElBQUksRUFBRUEsRUFBRSxLQUFLLEdBQUdpQyxFQUFFakMsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHa0MsRUFBRWxDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR2lFLEVBQUVqRSxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdrRSxFQUFFbEUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHK0MsRUFBRS9DLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR2dELEVBQUVoRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUcrRSxHQUFHL0UsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHZ0YsR0FBR2hGLEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR3VFLEdBQUd2RSxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUV3RSxHQUFHeEUsRUFBRSxJQUFJLEdBQUdBLEVBQUUsS0FBSyxFQUFFcUQsRUFBRXJELEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBR3NELEVBQUV0RCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUdtQyxFQUFFbkMsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHb0MsRUFBRXBDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR21FLEVBQUVuRSxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEdBQUdvRSxFQUFFcEUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHaUQsRUFBRWpELEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRWtELEVBQUVsRCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUV5QyxFQUFFekMsRUFBRSxJQUFJLEdBQUdBLEVBQUUsS0FBSyxFQUFFMEMsRUFBRTFDLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEtBQUssRUFBRXlFLEdBQUd6RSxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUUwRSxHQUFHMUUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFdUQsRUFBRXZELEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sRUFBRXdELEVBQUV4RCxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUVxQyxFQUFFckMsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHc0MsRUFBRXRDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR3FFLEVBQUVyRSxFQUFFLEtBQUssR0FBR0EsRUFBRSxNQUFNLEVBQUVzRSxHQUFHdEUsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxFQUFFNkQsRUFBRTdELEVBQUUsSUFBSSxHQUFHQSxFQUFFLEtBQUssRUFBRThELEVBQUU5RCxFQUFFLElBQUksR0FBR0EsRUFBRSxLQUFLLEVBQUUyQyxFQUFFM0MsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHNEMsRUFBRTVDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBRzJFLEdBQUczRSxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUc0RSxHQUFHNUUsRUFBRSxLQUFLLEVBQUVBLEVBQUUsTUFBTSxHQUFHeUQsRUFBRXpELEVBQUUsS0FBSyxFQUFFQSxFQUFFLE1BQU0sR0FBRzBELEVBQUUxRCxFQUFFLEtBQUssRUFBRUEsRUFBRSxNQUFNLEdBQUd1QyxFQUFFdkMsRUFBRSxLQUFLLEdBQUdBLEVBQUUsTUFBTSxHQUFHd0MsRUFBRXhDLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE1BQU0sR0FBR0EsRUFBRSxHQUFHK0IsR0FBR0UsRUFBRUUsRUFBRW5DLEVBQUUsR0FBR2dDLEdBQUdFLEVBQUVFLEVBQUVwQyxFQUFFLElBQUl5QyxHQUFHRSxFQUFFRSxFQUFFN0MsRUFBRSxJQUFJMEMsR0FBR0UsRUFBRUUsRUFBRTlDLEVBQUUsSUFBSW1ELEdBQUdFLEVBQUVFLEVBQUV2RCxFQUFFLElBQUlvRCxHQUFHRSxFQUFFRSxFQUFFeEQsRUFBRSxJQUFJNkQsR0FBR0UsRUFBRUUsRUFBRWpFLEVBQUUsSUFBSThELEdBQUdFLEVBQUVFLEVBQUVsRSxFQUFFLElBQUl1RSxJQUFJRSxHQUFHRSxHQUFHM0UsRUFBRSxJQUFJd0UsSUFBSUUsR0FBR0UsR0FBRzVFLEVBQUUsR0FBR2lDLEdBQUdFLEVBQUVFLEVBQUVyQyxFQUFFLEdBQUdrQyxHQUFHRSxFQUFFRSxFQUFFdEMsRUFBRSxJQUFJMkMsR0FBR0UsRUFBRUUsRUFBRS9DLEVBQUUsSUFBSTRDLEdBQUdFLEVBQUVFLEVBQUVoRCxFQUFFLElBQUlxRCxHQUFHRSxFQUFFRSxFQUFFekQsRUFBRSxJQUFJc0QsR0FBR0UsRUFBRUUsRUFBRTFELEVBQUUsSUFBSStELEdBQUdFLEVBQUVFLEVBQUVuRSxFQUFFLElBQUlnRSxHQUFHRSxFQUFFRSxFQUFFcEUsRUFBRSxJQUFJeUUsSUFBSUUsR0FBR0UsR0FBRzdFLEVBQUUsSUFBSTBFLElBQUlFLEdBQUdFLEdBQUc5RSxFQUFFLEdBQUdtQyxHQUFHRSxFQUFFRSxFQUFFdkMsRUFBRSxHQUFHb0MsR0FBR0UsRUFBRUUsRUFBRXhDLEVBQUUsSUFBSTZDLEdBQUdFLEVBQUVFLEVBQUVqRCxFQUFFLElBQUk4QyxHQUFHRSxFQUFFRSxFQUFFbEQsRUFBRSxJQUFJdUQsR0FBR0UsRUFBRUUsRUFBRTNELEVBQUUsSUFBSXdELEdBQUdFLEVBQUVFLEVBQUU1RCxFQUFFLElBQUlpRSxHQUFHRSxFQUFFRSxFQUFFckUsRUFBRSxJQUFJa0UsR0FBR0UsRUFBRUUsR0FBR3RFLEVBQUUsSUFBSTJFLElBQUlFLEdBQUdFLEdBQUcvRSxFQUFFLElBQUk0RSxJQUFJRSxHQUFHRSxHQUFHaEYsRUFBRSxHQUFHcUMsR0FBR0UsRUFBRVIsRUFBRS9CLEVBQUUsR0FBR3NDLEdBQUdFLEVBQUVSLEVBQUVoQyxFQUFFLElBQUkrQyxHQUFHRSxFQUFFUixFQUFFekMsRUFBRSxJQUFJZ0QsR0FBR0UsRUFBRVIsRUFBRTFDLEVBQUUsSUFBSXlELEdBQUdFLEVBQUVSLEVBQUVuRCxFQUFFLElBQUkwRCxHQUFHRSxFQUFFUixFQUFFcEQsRUFBRSxJQUFJbUUsR0FBR0UsRUFBRVIsRUFBRTdELEVBQUUsSUFBSW9FLEdBQUdFLEdBQUdSLEVBQUU5RCxFQUFFLElBQUk2RSxJQUFJRSxHQUFHUixHQUFHdkUsRUFBRSxJQUFJOEUsSUFBSUUsR0FBR1IsR0FBR3hFLEVBQUUsR0FBR3VDLEdBQUdSLEVBQUVFLEVBQUVqQyxFQUFFLEdBQUd3QyxHQUFHUixFQUFFRSxFQUFFbEMsRUFBRSxJQUFJaUQsR0FBR1IsRUFBRUUsRUFBRTNDLEVBQUUsSUFBSWtELEdBQUdSLEVBQUVFLEVBQUU1QyxFQUFFLElBQUkyRCxHQUFHUixFQUFFRSxFQUFFckQsRUFBRSxJQUFJNEQsR0FBR1IsRUFBRUUsRUFBRXRELEVBQUUsSUFBSXFFLEdBQUdSLEVBQUVFLEVBQUUvRCxFQUFFLElBQUlzRSxJQUFJUixFQUFFRSxFQUFFaEUsRUFBRSxJQUFJK0UsSUFBSVIsR0FBR0UsR0FBR3pFLEVBQUUsSUFBSWdGLElBQUlSLEdBQUdFLEdBQUcxRSxFQUFFLElBQUlHLEVBQUVnQixHQUFHbkIsRUFBRSxJQUFJRyxFQUFFZ0IsRUFBRSxFQUFFLEVDUmhsS25CLEVBQUUsV0FBVyxNQUFNRyxFQUFFLENBQUM4RSxTQUFTN0wsTUFBTThMLEtBQUsvRSxJQUFJLE1BQU1ILEVBQUUsQ0FBQ0csRUFBRWhELEtBQUtnRCxFQUFFZ0YsU0FBUyxZQUFPLElBQVNoRixFQUFFaUYsT0FBT3BGLEVBQUUzSixLQUFLOEosRUFBRWlGLFlBQU8sSUFBU2pGLEVBQUVrRixhQUFRLElBQVNsRixFQUFFaUYsT0FBT3BGLEVBQUUzSixVQUFLLEdBQVEySixFQUFFM0osS0FBSzhKLEVBQUVrRixRQUFRckYsR0FBR3NGLEtBQUssSUFBSSxJQUFJbE0sTUFBTW1NLFFBQVEsQ0FBQ3BGLEdBQUdILEVBQUVJLEVBQUV1QixFQUFFMUIsTUFBTUUsRUFBRWhELEtBQUs2QyxFQUFFRyxFQUFFZ0YsUUFBUS9FLE9BQUUsSUFBU3VCLFNBQVN4QixFQUFFaUYsTUFBTWpGLEVBQUVpRixNQUFNekQsT0FBRSxJQUFTMUIsSUFBSUUsRUFBRWtGLE1BQU1wRixLQUFLRCxFQUFFLENBQUNpRixTQUFTTyxXQUFXTixLQUFLL0UsR0FBRyxDQUFDc0YsS0FBSzlELEVBQUUrRCxPQUFPdkYsS0FBS3dGLE9BQU8sRUFBRXhGLEtBQUtDLEVBQUV3RixPQUFPQyxLQUFLMUYsS0FBS0YsRUFBRSxDQUFDZ0YsU0FBU3RMLElBQUl1TCxLQUFLL0UsR0FBRyxJQUFJQSxFQUFFM0ksV0FBVzhOLEtBQUssSUFBSSxJQUFJM0wsSUFBSTRMLFFBQVEsQ0FBQ3BGLEVBQUVILEtBQUssSUFBSSxNQUFNSSxFQUFFdUIsS0FBSzNCLEVBQUVHLEVBQUVsRyxJQUFJbUcsRUFBRXVCLEtBQUtSLEVBQUUsQ0FBQzhELFNBQVNhLElBQUlaLEtBQUsvRSxHQUFHLElBQUlBLEVBQUU0RixVQUFVVCxLQUFLLElBQUksSUFBSVEsSUFBSVAsUUFBUSxDQUFDcEYsRUFBRUgsS0FBSyxJQUFJLE1BQU1JLEtBQUtKLEVBQUVHLEVBQUU2RixJQUFJNUYsS0FBS29CLEVBQUUsQ0FBQ3lELFNBQVNnQixLQUFLZixLQUFLL0UsR0FBRyxDQUFDQSxFQUFFK0YsVUFBVVAsT0FBTyxFQUFFeEYsS0FBSyxJQUFJOEYsS0FBSzlGLElBQUlrQixFQUFFLENBQUM0RCxTQUFTMUYsT0FBTzJGLEtBQUssRUFBRWlCLE1BQU1oRyxFQUFFaUcsT0FBT3BHLEtBQUtHLEVBQUUsQ0FBQ0gsRUFBRUcsR0FBRyxDQUFDSCxHQUFHMkYsT0FBTyxFQUFFeEYsRUFBRUgsS0FBSyxJQUFJVCxPQUFPWSxFQUFFSCxJQUFJNkIsRUFBRSxDQUFDb0QsU0FBU29CLElBQUluQixLQUFLL0UsR0FBRyxDQUFDQSxFQUFFbUcsTUFBTVgsT0FBTyxFQUFFeEYsS0FBSyxJQUFJa0csSUFBSWxHLElBQUksT0FBTyxJQUFJeEcsSUFBSSxDQUFDd0csRUFBRUgsRUFBRUMsRUFBRWtCLEVBQUVLLEVBQUVILEVBQUVRLEdBQUd0TSxJQUFJNEssR0FBRyxDQUFDQSxFQUFFOEUsU0FBUzlILEtBQUtnRCxJQUFJLENBQTMyQixHQUErMkJDLEVBQUUsSUFBSW1HLFlBQVk1RSxFQUFFLElBQUk2RSxZQUFZLFNDQXp5QixTQUFTbEYsRUFBRWxCLEVBQUVELEVBQUVILEdBQUcsT0FBT3JILEtBQUs4TixVQUFVOUUsR0FBRXZCLEVBQUVELEdBQUcsQ0FBQyxTQUFTeUIsRUFBRTVCLEdBQUcsUUFBRyxJQUFTQSxFQUFFLE9BQU0sRUFBRyxHQUFHLGlCQUFpQkEsRUFBRSxDQUFDLEdBQUcxRixPQUFPb00sTUFBTTFHLEdBQUcsT0FBTSxFQUFHLElBQUkxRixPQUFPcU0sU0FBUzNHLEdBQUcsT0FBT0EsRUFBRSxNQUFLLENBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNb0IsR0FBRSxHQUFHLFNBQVNPLEdBQUV4QixFQUFFcUIsRUFBRXhCLEdBQUcsTUFBTW1CLEVBQUVTLEVBQUV6QixHQUFHLEdBQUcsT0FBT2dCLEVBQUUsT0FBT0EsRUFBRSxNQUFNakIsRUFBRSxHQUFHRCxFQUFFLElBQUl0RyxJQUFJLE9BQU8sU0FBU3FHLEVBQUVHLEdBQUcsTUFBTWdCLEVBQUVTLEVBQUV6QixHQUFHLEdBQUcsT0FBT2dCLEVBQUUsT0FBT0EsRUFBRSxJQUFJRSxFQUFFcEIsRUFBRW5HLElBQUlxRyxHQUFHLFFBQUcsSUFBU2tCLEVBQUUsT0FBT0EsRUFBRSxPQUFPQSxFQUFFbkIsRUFBRTlKLGNBQWMrSixHQUFHLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxVQUFVRCxFQUFFbUIsR0FBR2xCLEVBQUVGLEVBQUVoRyxJQUFJa0csRUFBRWtCLEdBQUcsTUFBTSxJQUFJLFNBQVNuQixFQUFFbUIsR0FBRyxFQUFDLEVBQUdsQixFQUFFeEssU0FBUyxLQUFLc0ssRUFBRWhHLElBQUlrRyxFQUFFa0IsR0FBRyxNQUFNLElBQUksU0FBUyxHQUFHLE9BQU9sQixFQUFFRCxFQUFFbUIsR0FBR2xCLEVBQUVGLEVBQUVoRyxJQUFJa0csRUFBRWtCLFFBQVEsR0FBR3hJLE1BQU1DLFFBQVFxSCxHQUFHLENBQUMsTUFBTUMsRUFBRSxTQUFTSixHQUFHLEdBQUdvQixHQUFFaEwsT0FBTzRKLEVBQUUsQ0FBQyxNQUFNSSxFQUFFZ0IsR0FBRWhMLE9BQU9nTCxHQUFFaEwsT0FBTzRKLEVBQUVvQixHQUFFd0YsTUFBSyxFQUFHeEcsRUFBRUosRUFBRSxDQUFDLE9BQU9vQixHQUFFeUYsTUFBTSxFQUFFN0csRUFBRSxDQUF6RixDQUEyRkcsRUFBRS9KLFFBQVE4SixFQUFFbUIsR0FBR2pCLEVBQUVILEVBQUVoRyxJQUFJa0csRUFBRWtCLEdBQUcsSUFBSSxNQUFNRyxFQUFFTCxLQUFLaEIsRUFBRTNJLFVBQVU0SSxFQUFFb0IsR0FBR3hCLEVBQUVtQixFQUFFLEtBQUssQ0FBQyxNQUFNQSxFQUFFRyxHQUFHLFNBQVN0QixFQUFFRyxHQUFHLE1BQU1xQixFQUFFeEIsRUFBRWhELFlBQVksR0FBRyxtQkFBbUJ3RSxFQUFFLENBQUMsTUFBTXBCLEVBQUVvQixFQUFFckUsS0FBS2dFLEVBQUVoQixFQUFFckcsSUFBSXNHLEdBQUcsUUFBRyxJQUFTZSxFQUFFLE1BQU0sQ0FBQ2YsRUFBRWUsRUFBRStELEtBQUtsRixHQUFHLENBQUMsTUFBTW1CLEVBQUU1SixPQUFPQyxRQUFRd0ksR0FBR0UsRUFBRWlCLEVBQUUvSyxPQUFPNkosRUFBRXBILE1BQU1xTSxLQUFLLENBQUM5TyxPQUFPOEosRUFBRUEsSUFBSSxJQUFJLElBQUlGLEVBQUUsRUFBRUEsRUFBRUUsRUFBRUYsSUFBSSxDQUFDLE1BQU1JLEVBQUVlLEVBQUVuQixHQUFHRyxFQUFFSCxFQUFFQSxFQUFFQyxFQUFFRSxHQUFHQyxFQUFFLEdBQUdILEVBQUVFLEVBQUUsR0FBR0MsRUFBRSxFQUFFLENBQUMsTUFBTSxDREF2bUMsR0NBMG1DSCxFQUFFLENBQWxRLENBQW9RRSxFQUFFcUIsR0FBR0ksRUFBRU4sRUFBRWxMLE9BQU9nTCxFQUFFdkksTUFBTXFNLEtBQUssQ0FBQzlPLE9BQU93TCxFQUFFLElBQUlSLEVBQUUsR0FBR0QsRUFBRWpCLEVBQUVtQixHQUFHRCxFQUFFbkIsRUFBRWhHLElBQUlrRyxFQUFFa0IsR0FBRyxJQUFJLElBQUlqQixFQUFFLEVBQUVBLEVBQUV3QixFQUFFeEIsSUFBSWdCLEVBQUVoQixFQUFFLEdBQUdKLEVBQUVzQixFQUFFbEIsR0FBRyxFQUFFLE9BQU9pQixDQUFDLENBQXgxQixDQUEwMUJsQixHQUFHRCxDQUFDLENDQXZwQyxTQUFTaUIsR0FBRUEsRUFBRW5CLEdBQUcsT0hRb1UsU0FBV0EsR0FBRyxPQUFPLElBQUlLLEVBQUUsSUFBSUosRUFBRSxLQUFLaUIsT0FBT2xCLEdBQUcwQixLQUFLLENHUmxYRixDQUFFcEIsRUFBRSxDQUFDZSxFQUFFbkIsSUFBSSxDQ0EvQixNQUFDSSxHQUEwQyxVQUFZMEcsY0FBYzNHLEVBQUU3RixPQUFPeU0sa0JBQWtCQyxZQUFZNUcsRUFBRUosSUFBRyxDQUFBLEdBQUksT0FBTyxTQUFTQSxFQUFFcUIsR0FBRyxJQUFJRyxFQUFFTCxFQUFFakIsRUFBRSxNQUFNLFdBQVdtQixHQUFHNEYsS0FBSyxXQUFXLE1BQU01RixFQUFFakIsRUFBRWxELEtBQUssSUFBSXlFLEVBQUVzRSxLQUFLaUIsTUFBTSxPQUFPaEgsSUFBSW1CLEdBQUdNLEVBQUVSLEVBQUVoQixLQUFLRCxFQUFFbUIsRUFBRUcsRUFBRXhCLEVBQUVtSCxLQUFLakssTUFBTWlFLEVBQUVRLEdBQUdILENBQUMsRUFBRSxZQUFZRyxHQUFHLE1BQU1DLEVBQUV4QixFQUFFbEQsS0FBS3lFLEdBQUd0QixFQUFFNEYsS0FBS2lCLE1BQU0sT0FBT2hILElBQUkwQixHQUFHdkIsRUFBRWMsRUFBRWhCLEtBQUtELEVBQUUwQixFQUFFSixFQUFFSCxFQUFFckIsRUFBRW1ILEtBQUtqSyxRQUFReUUsR0FBRzNCLEtBQUsyQixHQUFHUixFQUFFZCxHQUFHbUIsQ0FBQyxDQUFDLENBQUMsQ0FBdFhBLENBQUUsQ0FBQ3dGLFlBQVloSCxLQ0FuRyxTQUFTb0gsR0FBS0MsR0FDbkIsUUFBU0EsR0FBbUIsTUFBVkEsR0FBMkIsVUFBVkEsQ0FDckMsUUNXTyxNQUFNQyxXQUFRQyxnckZBQUFDLENBQUF0SyxLQUFBLEdBQUEsQ0FBQSxDQWFsQnVLLEdBQVUsRUFBQSxrQkFBQSxDQU1WQSxHQUFVLEVBQUEseUJBQUEsQ0F5QlZBLEdBQVUsRUFBQSxnQkFBQSxDQWFWQSxHQUFVLEVBQUEsZUFBQSxDQU9WQSxHQUFVLEVBQUEsY0FBQSxDQUtWQSxHQUFVLEVBQUEsaUJBQUEsQ0FTVkEsR0FBVSxFQUFBLGlCQUFBLENBS1ZBLEdBQVUsRUFBQSxRQUFBLENBS1ZBLEdBQVUsRUFBQSxtQkFBQSxDQU1WQSxHQUFVLEVBQUEsT0FBQSxDQWFWQSxHQUFVLEVBQUEsZUFBQSxDQUtWQSxHQUFVLEVBQUEsbUJBQUEsQ0FLVkEsbUJBS0FBLEdBQVUsRUFBQSxjQUFBLENBS1ZBLEdBQVUsRUFBQSxlQUFBLENBT1ZBLEdBQVUsRUFBQSxhQUFBLENBS1ZBLEdBQVUsRUFBQSxhQUFBLENBS1ZBLEdBQVUsRUFBQSxZQUFBLENBS1ZBLEdBQVUsRUFBQSxlQUFBLENBS1ZBLEdBQVUsRUFBQSxpQkFBQSxDQU9WQSxHQUFVLEVBQUEsa0JBQUEsQ0FRVkEsR0FBVSxFQUFBLG1CQUFBLENBVVZBLEdBQVUsRUFBQSx1QkFBQSxDQVNWQSxHQUFVLEVBQUEsb0NBQUEsQ0FXVkEsR0FBVSxFQUFBLHFCQUFBLENBU1ZBLEdBQVUsRUFBQSxhQUFBLENBMERWQSxHQUFVLEVBQUEscUJBQUF0SCxDQUFBLENBelFNL0ssVUFBSW1TLEdBQUFySyxNQUVKd0ssV0FBYSxJQUFJL04sSUFJbENxRCxXQUFBQSxDQUFZMkssRUFBaUJ2UyxFQUF3QndTLEdBQ25EMUssS0FBSzJLLFNBQVdwUyxFQUFLQyxRQUFRaVMsR0FDN0J6SyxLQUFLOUgsS0FBT0EsRUFDWjhILEtBQUswSyxRQUFVQSxDQUNqQixDQUVBLGtCQUNJRSxHQUNGLFFBQUk1SyxLQUFLNksscUJBQ0Y3SyxLQUFLOEsscUJBQ2QsQ0FFQSx5QkFDSUEsR0FDRixRQUFJOUssS0FBSytLLGtCQUNGL0ssS0FBS2dMLHNCQUNkLENBRVFILGlCQUFBQSxHQUNOLElBQ0UsTUFBTyxjQUFjaEwsS0FBS3RHLEVBQUcwUixhQUFhMVMsRUFBS2EsS0FBSzRHLEtBQUtrTCxZQUFhLGtCQUFtQixRQUMzRixDQUFFLE1BQ0EsT0FBTyxDQUNULENBQ0YsQ0FFUUgsY0FBQUEsR0FHTixNQUFPLENBQUMsV0FBWSxhQUFhSSxLQUFNQyxHQUFhN1IsRUFBR0MsV0FBV2pCLEVBQUthLEtBQUs0RyxLQUFLa0wsWUFBYUUsSUFDaEcsQ0FFUUosb0JBQUFBLEdBQ04sTUFBTUssRUFBaUJyTCxLQUFLc0wsaUJBQWlCRCxnQkFBa0JyTCxLQUFLdUwsWUFBWUYsZUFDaEYsTUFBaUMsaUJBQW5CQSxHQUErQkEsRUFBZUcsV0FBVyxPQUN6RSxDQUVBLGdCQUNJQyxHQUNGLE9BQU96TCxLQUFLdUwsWUFBWUcsU0FBU0MsT0FBT0MsU0FBUyxpQkFDN0MsaUJBQ0E1TCxLQUFLdUwsWUFBWUcsU0FBU0MsTUFDeEIsMEJBQXlCM0wsS0FBSzlILEtBQUtILFFBQVUsWUFBYyxJQUMzRCx3QkFDUixDQUVBLFdBQUkwUyxHQUNGLE9BQU96SyxLQUFLMkssUUFDZCxDQUVBLGVBQ0lPLEdBQ0YsT0FBTzNSLEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLNEcsS0FBS3lLLFFBQVMsS0FBTSxLQUFNLGlCQUNyRGxTLEVBQUtDLFFBQVF3SCxLQUFLeUssUUFBUyxLQUFNLE1BQ2pDekssS0FBS3lLLE9BQ1gsQ0FFQSxjQUNJb0IsR0FDRixPQUFPdFMsRUFBRzBSLGFBQWFqTCxLQUFLOEwsU0FBUyxjQUFlLE9BQ3RELENBRUEsaUJBQ0lDLEdBQ0YsSUFDRSxRQUFTL0wsS0FBSzhMLFNBQVMsYUFDekIsQ0FBRSxNQUNBLE9BQU8sQ0FDVCxDQUNGLENBRUEsaUJBQ0lFLEdBQ0YsT0FBT3pTLEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLNEcsS0FBS3lLLFFBQVMsT0FDL0MsQ0FFQSxRQUNJeEssR0FDRixPQUFPRCxLQUFLdUwsWUFBWXRMLE1BQVEsU0FDbEMsQ0FFQSxtQkFDSWdNLEdBRUYsT0FEYWpNLEtBQUt1TCxZQUFZdEwsTUFBUSxXQUMxQjRDLFdBQVcsSUFBSyxJQUFJQSxXQUFXLElBQUssSUFDbEQsQ0FFQSxPQUNJbEwsR0FDRixJQUFLcUksS0FBSzBLLFFBQVMsT0FBTzdSLFFBQVFsQixJQUVsQyxNQUFPc0MsRUFBU2lTLEdBQW9DalUsRUFBeUIrSCxLQUFLOUgsS0FBTThILEtBQUt5SyxTQUM3RixJQUFLNVEsRUFBZ0NtRyxLQUFLOUgsTUFDeEMsSUFBSyxNQUFPSSxFQUFTNlQsS0FBVUQsRUFDN0JwUyxRQUFRQyxLQUFLLFVBQVVvUyxnQ0FBb0M3VCxLQUcvRCxNQUFPLElBQUtPLFFBQVFsQixPQUFRc0MsRUFDOUIsQ0FFQSxlQUNJc1IsR0FDRixPQUFPOVAsS0FBS0MsTUFBTW5DLEVBQUcwUixhQUFhakwsS0FBS29NLGdCQUFpQixRQUMxRCxDQUVBLG1CQUNJQSxHQUNGLE9BQU83VCxFQUFLYSxLQUFLNEcsS0FBS3lLLFFBQVMsZUFDakMsQ0FFQSxhQUNJNEIsR0FDRixRQUFTck0sS0FBS3NNLHdCQUF3QixTQUN4QyxDQUVBLGNBQ0lDLEdBQ0YsUUFBU3ZNLEtBQUtzTSx3QkFBd0IsY0FDeEMsQ0FFQSxlQUNJRSxHQUNGLE9BQUl4TSxLQUFLcU0sVUFBa0IsU0FDdkJyTSxLQUFLdU0sV0FBbUIsZUFBNUIsQ0FFRixDQUVBLGFBQ0lFLEdBQ0YsU0FBVXpNLEtBQUt1TCxZQUFZbUIsY0FBY0MsUUFBVTNNLEtBQUt1TCxZQUFZcUIsaUJBQWlCRCxPQUN2RixDQUVBLGFBQ0lFLEdBQ0YsT0FBTzdNLEtBQUs4TSxjQUFjLFNBQzVCLENBRUEsWUFDSUMsR0FDRixPQUFPL00sS0FBSzhNLGNBQWMsUUFDNUIsQ0FFQSxlQUNJRSxHQUNGLE9BQU9oTixLQUFLOE0sY0FBYyxXQUM1QixDQUVBLGlCQUNJRyxHQUNGLE9BQ0UxVCxFQUFHQyxXQUFXakIsRUFBS2EsS0FBSzRHLEtBQUt5SyxRQUFTLGlCQUFtQmxSLEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLNEcsS0FBS2tMLFlBQWEsZUFFdkcsQ0FFQSxrQkFDSWdDLEdBQ0YsT0FDRTNULEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLNEcsS0FBS3lLLFFBQVMsa0JBQ3RDbFIsRUFBR0MsV0FBV2pCLEVBQUthLEtBQUs0RyxLQUFLa0wsWUFBYSxnQkFFOUMsQ0FFQSxtQkFDSWlDLEdBQ0YsR0FBSW5OLEtBQUs2TSxVQUFXLE1BQU8sUUFFN0IsQ0FFQU8sZ0JBQUFBLENBQWlCQyxHQUNmLFFBQVNyTixLQUFLc00sd0JBQXdCZSxFQUN4QyxDQUVBLHVCQUNJQyxHQUNGLElBQ0UsUUFBU3ROLEtBQUs4TCxTQUFTLHVCQUN6QixDQUFFLE1BQ0EsT0FBTyxDQUNULENBQ0YsQ0FFQSxvQ0FDSXlCLEdBQ0YsR0FBSXJELEdBQUtsSyxLQUFLckksSUFBSTZWLElBQUssT0FBTyxFQUM5QixJQUNFLE1BQU1DLEVBQWF6TixLQUFLOEwsU0FBUyx3QkFDakMsTUFBTyxnQkFBZ0JqTSxLQUFLdEcsRUFBRzBSLGFBQWF3QyxFQUFZLFFBQzFELENBQUUsTUFDQSxPQUFPLENBQ1QsQ0FDRixDQUVBLHFCQUNJQyxHQUNGLE9BQU9uVixFQUFLcUMsUUFBUW9GLEtBQUs4TCxTQUFTLGlCQUFtQjlMLEtBQUt5SyxRQUN0RHpLLEtBQUt1TCxZQUNKOVAsS0FBS0MsTUFDSm5DLEVBQUcwUixhQUFhMVMsRUFBS2EsS0FBS2IsRUFBS3FDLFFBQVFvRixLQUFLOEwsU0FBUyxlQUFnQixnQkFBaUIsUUFFOUYsQ0FFQSxhQUNJNkIsR0FDRixJQUFJQyxHQUFXLEVBQ1hqVCxFQUFjcUYsS0FBS3lLLFFBQ3ZCLE9BQVMsQ0FDUCxNQUFNb0QsRUFBVXRWLEVBQUthLEtBQUt1QixFQUFhLGVBQWdCLFFBTXZELEdBTElwQixFQUFHQyxXQUFXcVUsS0FDaEI3TixLQUFLckksSUFBSW1XLEtBQU8sR0FBR0QsS0FBVzdOLEtBQUtySSxJQUFJbVcsT0FDdkNGLEdBQVcsR0FHVHJVLEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLdUIsRUFBYSxTQUN2QyxNQUVGLE1BQU1vVCxFQUFheFYsRUFBS3FDLFFBQVFELEdBQ2hDLEdBQUlBLElBQWdCb1QsRUFDbEIsTUFFRnBULEVBQWNvVCxDQUNoQixDQUNBLE9BQU9ILENBQ1QsQ0FFQTlCLFFBQUFBLENBQVNWLEdBQ1AsSUFBSTFPLEVBQVdzRCxLQUFLd0ssV0FBVzVOLElBQUl3TyxHQUNuQyxHQUFJMU8sRUFBVSxPQUFPQSxFQUtyQixHQUhBQSxFQUFXLENBQUMwTyxFQUFVN1MsRUFBS2EsS0FBSyxLQUFNLEtBQU1nUyxJQUN6Qy9TLElBQUs0TSxHQUFNMU0sRUFBS0MsUUFBUXdILEtBQUt5SyxRQUFTeEYsSUFDdEMrSSxLQUFNL0ksR0FBTTFMLEVBQUdDLFdBQVd5TCxLQUN4QnZJLEVBQ0gsTUFBTSxJQUFJUixNQUFNLG1CQUFtQmtQLEtBR3JDLE9BREFwTCxLQUFLd0ssV0FBV3pOLElBQUlxTyxFQUFVMU8sR0FDdkJBLENBQ1QsQ0FFUW9RLGFBQUFBLENBQWNPLEdBQ3BCLFNBQ0VyTixLQUFLc00sd0JBQXdCZSxJQUFnQnJOLEtBQUtpTyxxQkFBcUJqTyxLQUFLc0wsZ0JBQWlCK0IsR0FFakcsQ0FFUWYsdUJBQUFBLENBQXdCZSxHQUM5QixPQUFPck4sS0FBS2lPLHFCQUFxQmpPLEtBQUt1TCxZQUFhOEIsRUFDckQsQ0FFUVksb0JBQUFBLENBQXFCMUMsRUFBc0M4QixHQUNqRSxHQUFLOUIsRUFFTCxPQUNFQSxFQUFZbUIsZUFBZVcsSUFDM0I5QixFQUFZcUIsa0JBQWtCUyxJQUM5QjlCLEVBQVkyQyx1QkFBdUJiLElBQ25DOUIsRUFBWTRDLG1CQUFtQmQsRUFFbkMsQ0FFQSxtQkFDWS9CLEdBQ1YsR0FBSXRMLEtBQUtrTCxjQUFnQmxMLEtBQUt5SyxRQUFTLE9BQU96SyxLQUFLdUwsWUFFbkQsSUFDRSxPQUFPOVAsS0FBS0MsTUFBTW5DLEVBQUcwUixhQUFhMVMsRUFBS2EsS0FBSzRHLEtBQUtrTCxZQUFhLGdCQUFpQixRQUNqRixDQUFFLE1BQU85UCxHQUVQLFlBREF0QixRQUFRc0IsTUFBTSxnQ0FBZ0M3QyxFQUFLYSxLQUFLNEcsS0FBS2tMLFlBQWEsa0JBQW1COVAsRUFFL0YsQ0FDRixFQVNLLFNBQVNnVCxHQUFnQmxXLEVBQXdCd1MsR0FBVSxFQUFNRCxHQUV0RSxHQURBQSxJQUFZNVIsUUFBUVYsTUFDZm9CLEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLcVIsRUFBUyxpQkFFdEMsT0FBTyxJQUFJTCxHQUFRSyxFQUFTdlMsRUFBTXdTLEVBQ3BDLENBRU8sU0FBUzJELEdBQXFCQyxFQUFrQnJPLEdBQ3JELE9BQU9xTyxFQUFRM1csSUFBSXFCLFNBQVdpSCxHQUFRcU8sRUFBUTNXLElBQUk0VyxXQUFhdE8sQ0FDakUsQ0FFT0MsZUFBZXNPLEdBQ3BCdFcsRUFDQXdTLEdBQVUsRUFDVkQsR0FFQSxNQUFNZ0UsRUFBc0JDLEdBQXdCeFcsRUFBTXdTLEVBQVNELEdBQ25FLEdBQUtnRSxFQUVMLE1BQU8sSUFDRkEsRUFDSDVRLFlBQ0U0USxFQUFvQkUsT0FBU0YsRUFBb0JHLFdBQ3ZDQyxHQUF5QjNXLEVBQU11VyxFQUFvQkUsS0FBTWpFLEdBQy9ELENBQUMrRCxFQUFvQkcsTUFFL0IsQ0FFTyxTQUFTRixHQUNkeFcsRUFDQXdTLEdBQVUsRUFDVkQsR0FHQSxHQURBQSxJQUFZNVIsUUFBUVYsT0FDZm9CLEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLcVIsRUFBUyxpQkFBa0IsT0FFeEQsTUFBTXFFLEVBQWMsSUFBSTFFLEdBQVFLLEVBQVN2UyxFQUFNd1MsR0FDL0MsSUFBSXFFLEVBQWNELEVBQ2xCLElBQUtBLEVBQVl2RCxZQUFZeUQsWUFBY3pXLEVBQUtxQyxRQUFRNlAsR0FBU3dFLFNBQVMsYUFBYyxDQUN0RixNQUFNL0QsRUFBYzNTLEVBQUtDLFFBQVFpUyxFQUFTLEtBQU0sTUFDNUNsUixFQUFHQyxXQUFXakIsRUFBS2EsS0FBSzhSLEVBQWEsbUJBQ3ZDNkQsRUFBYyxJQUFJM0UsR0FBUWMsRUFBYWhULEVBQU13UyxHQUVqRCxDQUNBLE1BQU8sQ0FBRWlFLEtBQU1JLEVBQWFILEtBQU1FLEVBQ3BDLENBRUE1TyxlQUFlMk8sR0FDYjNXLEVBQ0E2VyxFQUNBckUsR0FFQSxNQUFNd0UsRUFBVyxDQUFDSCxHQUVaSSxFQUFZSixFQUFZeEQsWUFBWXlELFdBQzFDLElBQUtyVCxNQUFNQyxRQUFRdVQsR0FBWSxPQUFPRCxFQUV0QyxNQUFNRSxFQUF3QixHQUN4QkMsRUFBd0IsR0FDOUIsSUFBSyxNQUFNQyxLQUFpQkgsRUFBVTlXLElBQUtrWCxHQUFlaFgsRUFBS2EsS0FBSzJWLEVBQVl0RSxRQUFTOEUsSUFDbkZoVyxFQUFHQyxXQUFXOFYsR0FDaEJELEVBQVlsVyxLQUFLbVcsR0FFakJGLEVBQVlqVyxLQUFLbVcsR0FHckJELEVBQVlsVyxjQUFlcVcsRUFBT0osRUFBYSxDQUFFSyxLQUFLLEVBQU1DLGlCQUFpQixLQUM3RSxJQUFLLE1BQU1DLEtBQXFCTixFQUN6QjlWLEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLdVcsRUFBbUIsa0JBRWhEVCxFQUFTL1YsS0FBSyxJQUFJaVIsR0FBUXVGLEVBQW1CelgsRUFBTXdTLElBRXJELE9BQU93RSxDQUNULENDblhPLE1BQU1VLEdBRVgvVyxRQUFRZ1gsU0FBU0MsS0FFakJqWCxRQUFRWCxLQUFLLElBQUkrVyxTQUFTLFNBQzFCcFcsUUFBUWxCLElBQUlvWSxjQUFjZCxTQUFTLFFBRXhCZSxHQUFrQkosR0FBaUIsZ0JBQWtCLE9BQ3JEdkUsR0FBaUJ1RSxHQUFpQixNQUFRLE9BQzFDSyxHQUF3QkwsR0FBaUIsZ0JBQWtCLE9DYzNETSxHQUFvRixDQUMvRi9RLFFBQVMsZ0JBQ1RnUixTQUFVLDZDQVZJLENBQ2RoUixRQUFTLENBQ1B2SCxZQUFhLDRDQUNiQyxLQUFNLFNBQ05HLE1BQU8sTUFRVCxhQUFNMEosQ0FBUXhKLFNBS1RnSSxlQUVMaEksRUFDQWtZLEdBRUEsTUFBTTlCLEVBQVVGLEdBQWdCbFcsR0FBTSxFQUFNa1ksR0FDNUMsSUFBSzlCLEVBRUgsT0FEQXhVLFFBQVFzQixNQUFNaVYsRUFBTUMsSUFBSSx1QkFDakIsRUFHVCxNQUFNN0UsRUFDSnZULEVBQUtpSCxVQUNKbVAsRUFBUS9DLFlBQVlHLFNBQVNDLE1BQVNpRSxHQUFpQixnQkFBa0Isa0JBQWdCM1csR0FDNUYsSUFBS3dTLEVBRUgsT0FEQTNSLFFBQVFDLEtBQUtzVyxFQUFNRSxNQUFNLHdEQUNsQixFQUlULEdBRkFyWSxFQUFPLElBQUtBLEVBQU1pSCxRQUFTc00sSUFFdEJsUyxFQUFHQyxXQUFXakIsRUFBS2EsS0FBS2tWLEVBQVFwRCxZQUFhLFNBRWhELE9BREFTLEdBQU0yQyxFQUFTcFcsSUFDUixFQUdULE1BQU9zWSxFQUFTQyxFQUFlQyxTQWlDMUJ4USxlQUNMb08sRUFDQXBXLEdBRUEsTUFBTXlZLEVBQXFCcFksRUFBS0MsUUFBUThWLEVBQVE3RCxRQUFTLGVBQWdCLFNBQVUsU0FDN0VnRyxFQUFnQmxZLEVBQUtDLFFBQVFtWSxFQUFvQixvQkFDakRwWCxFQUFHcVgsU0FBU0MsTUFBTUYsRUFBb0IsQ0FBRUcsV0FBVyxJQUV6RCxNQUFNQyxFQUFPQyxFQUFXLFVBRWxCQyxFQUFhQyxFQUFjQyxTQUFTLHFCQUFzQixDQUFFaFosSUFBS21XLEVBQVE3RCxVQUFXaFMsV0FBVzhDLE9BQ3JHd1YsRUFBSy9NLE9BQU9pTixHQUVaLE1BQU1HLEVBQWtCM1YsS0FBSzhOLFVBQzNCbFAsT0FBT0MsUUFBUWdVLEVBQVEzVyxLQUNwQitCLE9BQU8sRUFBRVMsTUFBVWtYLEdBQW9CQyxJQUFJblgsSUFDM0NvWCxTQUFTLEVBQUVDLElBQVFDLEtBQVVELEVBQUtFLGNBQWNELEtBRXJEVixFQUFLL00sT0FBT29OLFNBMkJkbFIsZUFDRW9PLEVBQ0FwVyxFQUNBNlksR0FFQSxPQUFPLElBQUkzUSxRQUFTNUgsSUFDbEIsTUFlTW1aLEVBZk1ULEVBQWNqVyxVQUFVLE1BQU8sQ0FBQyxTQUFVLGVBQWdCLENBQ3BFOUMsSUFBS21XLEVBQVE3RCxRQUNiOVMsSUFBSzJXLEVBQVEzVyxJQUNid0QsTUFBTyxPQUNQRCxTQUFVLFNBRU1JLE9BQ2ZDLE9BQ0EyQyxNQUFNLE1BQ054RSxPQUFRdUUsR0FBU0EsRUFBSy9FLE9BQVMsR0FFL0JiLElBQUs0RixHQUFTQSxFQUFLMEwsTUFBTSxHQUFHcE8sUUFDNUJsRCxJQUFLcUUsR0FDbUIsU0FBdkI0UixFQUFRM1csSUFBSXFCLE9BQW9CMEQsRUFBU2tWLFFBQVEsd0NBQXlDLElBQU1sVixHQUVoRWhELE9BQ2pDZ0QsSUFDRW1WLEdBQWdCMUcsS0FBTTJHLEdBQVlwVixFQUFTa1AsU0FBU2tHLEtBQ25EQyxHQUFjNUcsS0FBTTZHLEdBQVd0VixFQUFTdVMsU0FBUytDLE9BQ2xEQyxHQUFnQjlHLEtBQU0yRyxHQUFZcFYsRUFBU2tQLFNBQVNrRyxLQUVyRDVaLEVBQUtILFNBQ1ArQixRQUFRQyxLQUFLLGtCQUFrQjRYLEVBQWtCdlksS0FBSyxTQUl4RCxNQUFNa0gsRUFBTzRRLEVBQWMzUSxNQUFNLE1BQU8sQ0FBQyxPQUFRLFFBQVNvUixHQUFvQixDQUFFeFosSUFBS21XLEVBQVFwRCxjQUM3RjVLLEVBQUtoRixPQUFPdUYsR0FBRyxPQUFTQyxJQUN0QmlRLEVBQUsvTSxPQUFPbEQsR0FDUjVJLEVBQUtILFVBQ1ArQixRQUFRQyxLQUFLLFFBQVMrRyxHQUN0QmhILFFBQVFDLEtBQUssUUFBU2dYLEVBQUttQixPQUFPQyxPQUFPLFdBRzdDN1IsRUFBS08sR0FBRyxRQUFTLEtBQ2ZySSxPQUdOLENBckVRNFosQ0FBeUI5RCxFQUFTcFcsRUFBTTZZLEdBQzlDLE1BQU1MLEVBQWNLLEVBQUtvQixPQUFPLE9BRTFCRSxRQ3RFRG5TLGVBQW9Db1MsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT2xYLEdBQ1AsR0FBcUIsaUJBQVZBLEdBQXNCQSxHQUFTLFNBQVVBLEdBQXdCLFdBQWZBLEVBQU11RSxLQUNqRSxPQUVGLE1BQU12RSxDQUNSLENBQ0YsQ0Q2RGtDbVgsQ0FBa0IsSUFBTWhaLEVBQUdxWCxTQUFTNEIsU0FBUy9CLEVBQWUsU0FDNUYsTUFBTyxDQUFDNEIsSUFBc0IzQixFQUFhRCxFQUFlQyxFQUM1RCxDQTFEc0QrQixDQUFhbkUsRUFBU3BXLEdBQzFFLEdBQUlzWSxFQUVGLE9BREExVyxRQUFRQyxLQUFLc1csRUFBTUUsTUFBTSxnQkFBZ0JyWSxFQUFLaUgsaUJBQ3ZDLEVBR1QsSUFBS3dNLEdBQU0yQyxFQUFTcFcsR0FBTyxPQUV0QkEsRUFBS3dhLGNBQ0ZuWixFQUFHcVgsU0FBUytCLFVBQVVsQyxFQUFlQyxFQUFhLFFBRTFELE9BQU8sQ0FDVCxDQXpDVWtDLENBQWMxYSxFQUN0QixHQTBDRixTQUFTeVQsR0FBTTJDLEVBQWtCcFcsR0FFL0IsR0FEQTRCLFFBQVFDLEtBQUtzVyxFQUFNRSxNQUFNLFFBQVFyWSxFQUFLaUgsY0FDakNqSCxFQUFLd2EsT0FBUSxDQUNoQixNQUFNRyxFQUFNM0IsRUFBY2pXLFVBQVUvQyxFQUFLaUgsU0FBVyxHQUFJLENBQ3REaEgsSUFBS21XLEVBQVE3RCxRQUNiOVMsSUFBSzJXLEVBQVEzVyxJQUNibWIsT0FBTyxFQUNQM1gsTUFBTyxZQUVULEdBQW1CLElBQWYwWCxFQUFJeFgsT0FFTixPQURBeEMsUUFBUWthLFNBQVdGLEVBQUl4WCxRQUFVLEdBQzFCLENBRVgsQ0FDQSxPQUFPLENBQ1QsQ0FFQSxNQUFNZ1csR0FBc0IsSUFBSXpJLElBQUksQ0FBQyxLQUFNLFVBQVcsV0E2QnRELE1BQU1pSixHQUFrQixDQUFDLE9BQVEsV0FDM0JFLEdBQWdCLENBQ3BCLE1BQ0EsT0FDQSxPQUNBLE9BQ0EsTUFDQSxPQUNBLE9BQ0EsT0FDQSxRQUNBLGtCQUVBLGVBQ0EsYUFFSUUsR0FBa0IsQ0FBQyxRQUFTLFNBQVUsYUFBYyxpQkFBa0Isa0JFbklyRSxNQUFNZSxHQUFjLElBQUlDLEVDb0J6QkMsR0FBMEIsQ0FDOUJDLGNBQWMsR0FRVGpULGVBQWVrVCxHQUNwQkMsRUFDQS9FLEVBQ0FwVyxFQUNBb2IsRUFBZ0JKLElBRWhCLE1BQU1LLEVBQW1CQyxHQUFnQkgsRUFBUS9FLEdBT2pELEdBTk1wVyxFQUFLcUUsUUFBVStXLEVBQUtHLGtCQUFvQnZiLEVBQUt3YSxRQUNqRGdCLEdBQVdILEVBQWlCSSxVQUFXckYsRUFBU3BXLEVBQUtxRSxPQUFTLFVBQVksU0FFeEVyRSxFQUFLSCxTQUNQMmIsR0FBV0gsRUFBaUJLLFNBQVV0RixFQUFTLGVBQWUsR0FFNURwVyxFQUFLd2EsT0FFUCxPQURBbUIsR0FBNkJOLEVBQWlCSSxVQUFXLEVBQUdMLEVBQU0sQ0FBRVEsY0FBZTViLEVBQUtxRSxTQUNqRixFQUdULE1BQU13WCxFQUE0QkMsUUFDaEM5YixFQUFLcUUsU0FBVytXLEVBQUtXLHFCQUF1QlgsRUFBS1ksaUNBRW5ELElBQUlDLEdBQXNCLEVBQzFCLE1BQU1DLEVBQ0psYyxFQUFLcUUsUUFBVStXLEVBQUtlLHlCQUNoQkMsWUFBWSxLQUNWemIsUUFBUXlDLE9BQU8wRixNQUFNLEtBQ3JCbVQsR0FBc0IsR0FDckJiLEVBQUtlLCtCQUNScGIsRUFDQTRaLFFBQVkxUyxFQUFXb1QsRUFBaUJLLGNBQVUzYSxFQUFXLENBQ2pFZCxJQUFLbVcsRUFBUTdELFFBQ2I5UyxJQUFLNGMsR0FBYWpHLEVBQVEzVyxJQUFLLElBQUsyYixFQUFNa0IsY0FBZWxCLEVBQUtrQixrQkFBa0J0YyxFQUFLcUUsYUFBZ0J0RCxLQUNyRzZaLE9BQU8sRUFDUDNYLE1BQU9qRCxFQUFLcUUsT0FBUyxPQUFTLFVBQzlCbUIsUUFBUzRWLEVBQUs1VixRQUNkdUQsaUJBQWtCOFMsRUFDbEJuUyxZQUFZLEVBQ1piLGVBQWdCN0ksRUFBS3FFLFNBQVd3WCxFQUNoQzdTLGVBQWdCaEosRUFBS3FFLFNBQVd3WCxFQUNoQ3BULDRCQUE2QnpJLEVBQUtxRSxPQUNsQ3hFLFFBQVNHLEVBQUtILFVBQ2IwYyxRQUFRLEtBQ0xMLEdBQ0ZNLGNBQWNOLEtBR1pyQixFQUFXRixFQUFJeFgsUUFBVSxFQUkvQixHQUhJOFksR0FDRnRiLFFBQVF5QyxPQUFPMEYsTUFBTSxNQUVuQitTLEtBQStCVCxFQUFLWSxnQ0FBK0MsSUFBYm5CLEdBQWlCLENBQ3pGLE1BQU00QixHQUFVckIsRUFBS1csb0JBQXNCWCxFQUFLVyxvQkFBb0JwQixFQUFJdlgsUUFBVXVYLEVBQUl2WCxRQUFRQyxPQUMxRm9aLElBQ0Y5YixRQUFReUMsT0FBTzBGLE1BQU0yVCxHQUNyQjliLFFBQVF5QyxPQUFPMEYsTUFBTSxNQUV6QixDQU1BLE9BTEk5SSxFQUFLcUUsUUFBdUIsSUFBYndXLEdBQWtCTyxFQUFLc0Isc0JBQ3hDOWEsUUFBUUMsS0FBS3NXLEVBQU1FLE1BQU0rQyxFQUFLc0IsdUJBRWhDdEIsRUFBS3VCLFdBQVdoQyxFQUFJMVYsUUFDcEIwVyxHQUE2Qk4sRUFBaUJJLFVBQVdaLEVBQVVPLEVBQU0sQ0FBRVEsY0FBZTViLEVBQUtxRSxTQUN4RndXLENBQ1QsQ0FFTyxTQUFTK0IsR0FDZHpCLEVBQ0EvRSxFQUNBcFcsRUFDQW9iLEVBQWdCSixJQUVoQixPQUFPRixHQUFZK0IseUJBQXlCN1UsVUFDMUMsTUFBTXFULEVBQW1CQyxHQUFnQkgsRUFBUS9FLEdBRWpELEdBREFvRixHQUFXSCxFQUFpQkksVUFBV3JGLEVBQVMsb0JBQW9CLEdBQ2hFcFcsRUFBS3dhLE9BTVAsT0FMQWdCLEdBQVdILEVBQWlCSSxVQUFXckYsRUFBUyxpQkFDNUNwVyxFQUFLSCxTQUNQMmIsR0FBV0gsRUFBaUJLLFNBQVV0RixFQUFTLGlCQUFpQixHQUVsRXVGLEdBQTZCTixFQUFpQkksVUFBVyxFQUFHTCxHQUNyRCxFQUdULE1BQU1ULFFBQVkxUyxFQUFXb1QsRUFBaUJLLGNBQVUzYSxFQUFXLENBQ2pFZCxJQUFLbVcsRUFBUTdELFFBQ2I5UyxJQUFLNGMsR0FBYWpHLEVBQVEzVyxJQUFLLElBQUsyYixFQUFNa0IsY0FBZWxCLEVBQUtrQixnQkFBaUIsSUFDL0UxQixPQUFPLEVBQ1AzWCxNQUFPLE9BQ1B1QyxRQUFTNFYsRUFBSzVWLFFBQ2R1RCxrQkFBa0IsRUFDbEJXLFlBQVksRUFDWmIsZUFBZ0J1UyxFQUFLMEIsZUFDckI5VCxlQUFnQm9TLEVBQUswQixlQUNyQmpkLFFBQVNHLEVBQUtILFVBRWhCdWIsRUFBS3VCLFdBQVdoQyxFQUFJMVYsUUFDcEJ1VyxHQUFXSCxFQUFpQkksVUFBV3JGLEVBQVMsaUJBQzVDcFcsRUFBS0gsU0FDUDJiLEdBQVdILEVBQWlCSyxTQUFVdEYsRUFBUyxpQkFBaUIsR0FFbEUsTUFBTTJHLEVBQU1wQyxFQUFJdlgsT0FBT0MsT0FNdkIsT0FMSTBaLElBQVEzQixFQUFLMEIsaUJBQ2ZuYyxRQUFReUMsT0FBTzBGLE1BQU1pVSxHQUNyQnBjLFFBQVF5QyxPQUFPMEYsTUFBTSxPQUV2QjZTLEdBQTZCTixFQUFpQkksVUFBV2QsRUFBSXhYLE9BQVFpWSxHQUM5RFQsRUFBSXhYLFFBQVUsR0FFekIsQ0F3Q08sU0FBU21ZLEdBQWdCSCxFQUFnQi9FLEdBQzlDLE1BQU00RyxFQUErQjVHLEVBQVF4RCxzQkFBd0IsZ0JBQWtCLE9BQ3ZGLElBQUlxSyxFQUFZOUIsRUFDYnhRLFdBQVcsS0FBTSxJQUNqQkEsV0FBVyxTQUFVLEtBQ3JCQSxXQUNDLDZDQUNBeUwsRUFBUS9DLFlBQVltQixjQUFjMEksTUFBUSxrQkFBb0IsOEJBRS9EdlMsV0FBVyxVQUFXeUwsRUFBUS9DLFlBQVltQixjQUFjMEksTUFBUSxxQkFBdUIsZ0JBQ3ZGdlMsV0FBVyxXQUFZeUwsRUFBUXhELHNCQUF3QixHQUFHb0ssS0FBa0MsYUFDNUZyUyxXQUFXLE9BQVF5TCxFQUFReEQsc0JBQXdCLEdBQUdvSyxLQUFrQyxTQUV4RnJTLFdBQVcsWUFBYXlMLEVBQVF4RCxzQkFBd0IsR0FBR29LLEtBQWtDLGFBQzVGNUcsRUFBUXhELHdCQUNWcUssRUFBWUEsRUFDVHRTLFdBQVcsb0JBQXFCLGlCQUNoQ0EsV0FBVyw4QkFBK0IsaUJBRTFDQSxXQUFXLGdCQUFpQixpQkFFakNzUyxFQUFZQSxFQUFVNVosT0FDdEIsTUFBTThaLEVBQWtCQyxHQUFjSCxFQUFVdFMsV0FBVyxRQUFTLEdBQUdxUyxPQUNqRUssRUFBaUJELEdBQ3JCSCxFQUVHdFMsV0FBVyxtQkFBb0IsR0FBR3FTLGlCQUNsQ3JTLFdBQ0MsU0FDQ3lMLEVBQVF4RCx1QkFBeUJ3RCxFQUFRWCxVQUFZLEdBQUssR0FBR3VILE9BS3BFLE1BQU8sQ0FDTHZCLFVBQVcsR0FBR3VCLFdBRk01RyxFQUFRM1csSUFBSXFCLE9BQVMsT0FBT3NWLEVBQVEzVyxJQUFJcUIsUUFBVSxnQkFBa0IsU0FFaEJxYyxJQUN4RXpCLFNBQVUyQixFQUVkLENBRU8sU0FBUzdCLEdBQVdILEVBQTBCakYsRUFBa0JrSCxFQUFTLFFBQVNDLEdBQU8sR0FDOUYzYixRQUFRQyxLQUNOLE1BQ0cwYixFQUFPcEYsRUFBTXFGLEtBQU9yRixFQUFNc0YsTUFBTXRGLEVBQU11RixLQUFLLEdBQUdKLE1BQVlqQyxHQUMzRGxELEVBQU1xRixLQUFLLE9BQU9wSCxFQUFRN0QsV0FFaEMsQ0FFTyxTQUFTb0osR0FDZFIsRUFDQU4sRUFDQU8sRUFDQXVDLEVBQTRDLENBQUEsR0FFNUMsR0FBaUIsSUFBYjlDLEVBQWdCLENBQ2xCLEdBQUk4QyxFQUFhL0IsY0FBZSxPQUNoQ2hhLFFBQVFDLEtBQUtzVyxFQUFNRSxNQUFNRixFQUFNdUYsS0FBSyxhQUFjdkMsR0FDcEQsTUFDRXZaLFFBQVFDLEtBQUtzVyxFQUFNQyxJQUFJRCxFQUFNdUYsS0FBSyxxQkFBcUI3QyxRQUFnQk0sS0FDN0MsSUFBdEJDLEVBQUtILGNBQ1B0YSxRQUFRaWQsS0FBSy9DLEdBQVksRUFHL0IsQ0FFTyxTQUFTd0IsR0FDZDVjLEVBQ0EyYixHQUVBLE1BQU15QyxFQUFTLElBQUtwZSxHQUtwQixPQUpJMmIsRUFBSzBDLEtBQ1BELEVBQU92SSxHQUFLLEtBWVQsU0FBMkI3VixFQUF5QzZjLFFBQ3BEdmIsSUFBakJ0QixFQUFJc2UsV0FBNEMsSUFBbEJ6QixTQUV6QjdjLEVBQUl1ZSxZQUNGMUIsR0FBaUIzYixRQUFReUMsT0FBTzZhLFFBQ3pDeGUsRUFBSXVlLGNBQWdCLElBRXhCLENBakJFRSxDQUFrQkwsRUFBUXpDLEVBQUtrQixlQUN4QnVCLENBQ1QsQ0FpQkEsU0FBU1QsR0FBY25XLEdBRXJCLE9BQU9BLEVBQVF5TSxTQUFTLGFBRXRCek0sRUFBUXlNLFNBQVMsZUFFakJ6TSxFQUFReU0sU0FBUyxXQUNqQnpNLEVBQVF5TSxTQUFTLHVCQUNmek0sRUFBUTBELFdBQVcsWUFBYSxPQUNoQzFELENBQ04sQ0N0Uk8sTUFBTWtYLEdBQXVCLElBQy9CM2UsRUFFSCxjQUFlLENBQ2JFLFlBQWEsc0JBQ2JDLEtBQU0sU0FDTkcsTUFBTyxLQUVULFVBQVcsQ0FDVEosWUFBYSwyQ0FDYkMsS0FBTSxVQUNORyxNQUFPLENBQUMsTUFBTyxPQUlaLFNBQVNzZSxHQUF5QnBlLEdBQ3ZDLE1BQU00QyxFQUFpQixHQUN2QixJQUFLLE1BQU15YixLQUFjbGMsT0FBT0gsS0FBS3hDLEdBQTRCLENBQy9ELE1BQU0wQyxFQUFRb2MsR0FBZXRlLEVBQU1xZSxHQUNuQyxRQUFjdGQsSUFBVm1CLEVBRUosR0FBcUIsa0JBQVZBLEVBSVgsR0FBcUIsaUJBQVZBLEdBQXVDLGlCQUFWQSxHQUl4QyxHQUFJdUIsTUFBTUMsUUFBUXhCLEdBQ2hCLElBQUssTUFBTXFjLEtBQVFyYyxFQUNqQlUsRUFBSzNCLEtBQUssS0FBS29kLEtBQWNFLFVBTC9CM2IsRUFBSzNCLEtBQUssS0FBS29kLEtBQWNuYyxVQUo3QlUsRUFBSzNCLEtBQUtpQixFQUFRLEtBQUttYyxJQUFlLEtBQUtBLFVBWS9DLENBT0EsT0FMK0QsSUFBNURyZSxFQUFpRHFFLGFBQ1p0RCxJQUF0Q3VkLEdBQWV0ZSxFQUFNLGNBRXJCNEMsRUFBSzNCLEtBQUssZUFFTDJCLENBQ1QsQ0FFQSxTQUFTMGIsR0FBZXRlLEVBQXdCcWUsR0FDOUMsTUFBTUcsRUFBc0JILEVBQVcxVCxXQUFXLFlBQWEsQ0FBQ3NFLEVBQUd3UCxJQUFzQkEsRUFBVUMsZUFDN0Z4WCxFQUFVbEgsRUFDaEIsT0FBT2tILEVBQVFtWCxJQUFlblgsRUFBUXNYLEVBQ3hDLENDeENBLE1BbUNhRyxHQUdULENBQ0YxWCxRQUFTLDZCQUNUZ1IsU0FBVSw0QkFDVjJHLFFBQVMsSUFBS1QsR0F0Q2QsY0FBZSxDQUNiemUsWUFBYSw2Q0FDYkMsS0FBTSxXQUVSLHNCQUF1QixDQUNyQkQsWUFBYSw2Q0FDYkMsS0FBTSxXQUVSa2YsUUFBUyxDQUNQbmYsWUFBYSx3Q0FDYkMsS0FBTSxTQUNObWYsUUFBUyxDQUFDLE1BQU8sU0FDakJsZixRQUFTLE9BS1htZixTQUFVLENBQ1JyZixZQUFhLCtCQUNiQyxLQUFNLFVBb0JSLGFBQU02SixDQUFReEosR0FDYSxVQUFyQlcsUUFBUXlFLFdBQ1Z4RCxRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUksOENBQ3hCelgsUUFBUWlkLEtBQUssSUFHZixNQUFNeEgsRUFBVUYsR0FBZ0JsVyxHQUMzQm9XLElBQ0h4VSxRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUksc0JBQ3hCelgsUUFBUWlkLEtBQUssSUFHZixNQUFNbUIsR0FBWS9lLEVBQUsrZSxVQUFZLElBQUk1ZSxJQUFJbUYsUUFBUTlELE9BQU9zYSxTQUNsQyxJQUFwQmlELEVBQVMvZCxTQUNYWSxRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUksMEJBQ3hCelgsUUFBUWlkLEtBQUssSUFHZixJQUNFLE1BQU0vQyxRQWdCTDdTLGVBQStCZCxHQUNwQyxNQUFNYixFQUFXYSxFQUFRNlgsU0FBUzVlLElBQUs4RyxHQUNyQytSLEVBQWMzUSxNQUFNaVQsR0FBZ0JyVSxFQUFTQyxFQUFRa1AsU0FBU3NGLFNBQVUsQ0FDdEV6YixJQUFLaUgsRUFBUWtQLFFBQVE3RCxRQUNyQnlNLFVBQVUsRUFDVnZmLElBQUs0YyxHQUFhblYsRUFBUWtQLFFBQVEzVyxJQUFLLENBQUVxZSxHQUFJNVcsRUFBUTRXLEtBQ3JEbEQsT0FBTyxFQUNQM1gsTUFBTyxhQUlYLElBQ0lnYyxFQUNBQyxFQUNBQyxFQUhBQyxHQUFXLEVBSWYsTUFBTUMsRUFBcUMsR0FDckNDLEVBQVU3YixNQUFNcU0sS0FBeUIsQ0FBRTlPLE9BQVFxRixFQUFTckYsU0FDNUR1ZSxFQUFzQmxaLEVBQVNsRyxJQUFJLENBQUNxZixFQUFPaFosSUFDeEMsSUFBSTBCLFFBQWU1SCxJQUN4QixJQUFJbWYsR0FBVSxFQUNkLE1BQU1DLEVBQVU3RSxJQUNWNEUsSUFFSkEsR0FBVSxFQUNWSCxFQUFROVksR0FBU3FVLEVBQ2pCcUUsSUFBZ0JyRSxHQUVYdUUsR0EwRWIsU0FDRXZFLEVBQ0EzVCxHQUVBLE1BQTJCLFVBQXBCQSxFQUFRMlgsU0FBdUIzWCxFQUFReVksWUFBZXpZLEVBQVEwWSxrQkFBaUMsSUFBYi9FLENBQzNGLENBL0V5QmdGLENBQWlCaEYsRUFBVTNULEtBQzFDaVksRUFBYXRFLEVBQ2J1RSxHQUFXLEVBQ1hDLEVBQWtCcGUsS0FBSzZlLEdBQWtCelosRUFBVSxhQUVyRC9GLE1BR0ZrZixFQUFNTyxLQUFLLFFBQVU3YyxJQUNuQnRCLFFBQVFzQixNQUFNLGlDQUFrQ0EsR0FDaER3YyxFQUFPLEtBRVRGLEVBQU1PLEtBQUssT0FBUSxDQUFDdFksRUFBTXhDLEtBQ3hCeWEsRUFBT00sR0FBWXZZLFFBQVExRyxFQUFXa0UsUUFBVWxFLFNBS2hEa2YsRUFBV2hiLElBQ2ZnYSxJQUFzQmhhLEVBQ2xCbWEsSUFFSkEsR0FBVyxFQUNYQyxFQUFrQnBlLEtBQUs2ZSxHQUFrQnpaLEVBQVVwQixNQUUvQ2liLEVBQWVBLEtBQ25CRCxFQUFRLFdBRUpFLEVBQWdCQSxLQUNwQkYsRUFBUSxZQUVKRyxFQUFnQkEsS0FDcEJILEVBQVEsWUFFVnRmLFFBQVFnSSxHQUFHLFNBQVV1WCxHQUNyQnZmLFFBQVFnSSxHQUFHLFVBQVd3WCxHQUN0QnhmLFFBQVFnSSxHQUFHLFVBQVd5WCxHQUN0QixVQUNRbFksUUFBUW1ZLElBQUlkLFNBQ1pyWCxRQUFRbVksSUFBSWhCLEVBQ3BCLENBQUMsUUFDQzFlLFFBQVE0SSxlQUFlLFNBQVUyVyxHQUNqQ3ZmLFFBQVE0SSxlQUFlLFVBQVc0VyxHQUNsQ3hmLFFBQVE0SSxlQUFlLFVBQVc2VyxFQUNwQyxDQUVBLEdBQUluQixFQUNGLE9BQU9lLFFBQVlqZixFQUFXa2UsR0FHaEMsR0FBd0IsVUFBcEIvWCxFQUFRMlgsUUFDVixPQUFPSyxHQUFlLEVBRXhCLFFBQW1CbmUsSUFBZm9lLEVBQ0YsT0FBT0EsRUFFVCxJQUFLLE1BQU10YyxLQUFVeWMsRUFDbkIsUUFBZXZlLElBQVg4QixHQUFtQyxJQUFYQSxFQUMxQixPQUFPQSxFQUdYLE9BQU8sQ0FDVCxDQXpHNkJ5ZCxDQUFnQixDQUNyQ3ZCLFdBQ0EzSSxVQUNBdUosV0FBWTNmLEVBQUsyZixhQUFjLEVBQy9CQyxpQkFBa0I1ZixFQUFLNGYsbUJBQW9CLEVBQzNDZixRQUFTN2UsRUFBSzZlLFFBQ2RmLEdBQXVCLGtCQUFaOWQsRUFBSzhkLEdBQW1COWQsRUFBSzhkLFFBQUsvYyxJQUUvQ0osUUFBUWlkLEtBQUsvQyxFQUNmLENBQUUsTUFBTzNYLEdBQ1B0QixRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUlsVixhQUFpQmMsTUFBUWQsRUFBTTZNLFFBQVV6SyxPQUFPcEMsS0FDeEV2QyxRQUFRaWQsS0FBSyxFQUNmLENBQ0YsR0E4RkYsU0FBU29DLEdBQVl2WSxFQUEwQnhDLEdBQzdDLFlBQWFsRSxJQUFUMEcsRUFDS0EsRUFFTHhDLEdBQVVBLEtBQVVzYixFQUFVQyxRQUN6QixJQUFNRCxFQUFVQyxRQUFRdmIsR0FFMUIsQ0FDVCxDQVNBK0MsZUFBZThYLEdBQWtCelosRUFBd0NwQixHQUN2RSxNQUFNd2IsRUFBZ0JDLEdBUXhCLFNBQXFCcmEsR0FDbkIsT0FBT0EsRUFBUzlFLFFBQVNpZSxRQUF5QnplLElBQWR5ZSxFQUFNeGEsSUFBb0IsR0FBSyxDQUFDd2EsRUFBTXhhLEtBQzVFLENBVm1DMmIsQ0FBWXRhLEdBQVdwQixHQUMzQixJQUF6QndiLEVBQWN6ZixjQTBCcEJnSCxlQUFnQzRZLEdBQzlCLE1BQU1DLEVBQVdoUSxLQUFLaUIsTUF0TkksSUF1TjFCLEtBQU9qQixLQUFLaUIsTUFBUStPLEdBQVUsQ0FDNUIsR0FBSUQsRUFBS0UsTUFBTUMsSUFBcUIsT0FBTyxRQUVyQ0MsR0FBTUMsS0FBS0MsSUFBSSxJQUFLTCxFQUFXaFEsS0FBS2lCLE9BQzVDLENBQ0EsT0FBTyxDQUNULENBaENZcVAsQ0FBaUJWLElBQ3pCQyxHQUFXRCxFQUFlLFVBRTlCLENBTUEsU0FBU0MsR0FBV0UsRUFBeUIzYixHQUMzQyxNQUFNbWMsRUFBeUIsR0FDL0IsSUFBSyxNQUFNcGMsS0FBTzRiLEVBQ2hCLElBQ0UsSUFBS1MsR0FBaUJyYyxFQUFLQyxHQUFTLFNBRXBDbWMsRUFBYW5nQixLQUFLK0QsR0FDbEJELEVBQVNDLEVBQUtDLEVBQ2hCLENBQUUsTUFBTy9CLEdBQ1B0QixRQUFRdUgsS0FBSyxnQ0FBaUNqRyxFQUNoRCxDQUVGLE9BQU9rZSxDQUNULENBWUEsU0FBU0wsR0FBbUIvYixHQUMxQixJQUVFLE9BREFyRSxRQUFRcUcsTUFBTWhDLEVBQUssSUFDWixDQUNULENBQUUsTUFBTzlCLEdBQ1AsUUFBSXVDLEdBQXFCdkMsRUFJM0IsQ0FDRixDQUVBOEUsZUFBZWdaLEdBQU1NLFNBQ2IsSUFBSXBaLFFBQVM1SCxHQUFZaWhCLFdBQVdqaEIsRUFBU2doQixHQUNyRCxDQUVBLFNBQVNELEdBQWlCcmMsRUFBYUMsR0FDckMsSUFFRSxPQURBdEUsUUFBUXFHLE1BQU1oQyxFQUFLQyxJQUNaLENBQ1QsQ0FBRSxNQUFPL0IsR0FDUCxHQUFJdUMsR0FBcUJ2QyxHQUN2QixPQUFPLEVBRVQsTUFBTUEsQ0FDUixDQUNGLENBRUEsU0FBU3VDLEdBQXFCdkMsR0FDNUIsTUFBd0IsaUJBQVZBLEdBQWdDLE9BQVZBLEdBQWtCLFNBQVVBLEdBQXdCLFVBQWZBLEVBQU11RSxJQUNqRixDQ25RQSxNQUFNK1osR0FBYyxRQUNkQyxHQUE4QixpQkFDOUJDLEdBQWlDLHNCQUVqQ0MsR0FBd0IsQ0FDNUIsQ0FBRUMsV0FBWXZoQixFQUFLYSxLQUFLLFNBQVUsaUJBQWtCMmdCLE9BQVEsVUFDNUQsQ0FBRUQsV0FBWXZoQixFQUFLYSxLQUFLLFNBQVUsVUFBVzJnQixPQUFReGhCLEVBQUthLEtBQUssU0FBVSxXQUN6RSxDQUFFMGdCLFdBQVl2aEIsRUFBS2EsS0FBSyxLQUFNLGlCQUFrQjJnQixPQUFRLE9BZ0cxRCxTQUFTQyxHQUFtQjFMLEdBQzFCLE9BQU9BLEVBQVEvQyxZQUFZbUIsY0FBYzBJLE1BQVEsV0FBYSxjQUNoRSxDQUVBLFNBQVM2RSxHQUFpQjNMLEdBQ3hCLE9BQU91TCxHQUFzQjdMLEtBQUssRUFBRzhMLGdCQUFpQnZnQixFQUFHQyxXQUFXakIsRUFBS0MsUUFBUThWLEVBQVE3RCxRQUFTcVAsTUFDOUZDLE1BQ04sQ0FFQSxTQUFTRyxHQUEwQjVMLEdBQ2pDLE1BQU02TCxFQUFrQjVoQixFQUFLYSxLQUFLa1YsRUFBUTdELFFBQVNrUCxJQUNuRCxPQUFJcGdCLEVBQUdDLFdBQVcyZ0IsR0FBeUIsYUFBYVIsS0FDcERwZ0IsRUFBR0MsV0FBV29nQixJQUF3QyxXQUFXQSxLQUM5RCxhQUFhRCxJQUN0QixDQXlCTyxNQUFNUyxHQUFnQixJQS9IN0IsTUFDRUMsaUJBQUFBLENBQWtCL0wsR0FDaEIsTUFBTTdELEVBQVV1UCxHQUFtQjFMLEdBMEd2QyxJQUE4RHlMLEVBdEcxRCxNQUFPLEdBdUdGLFlBRHFEQSxFQXpHa0IsR0FBR3RQLDBHQTBHa0NpUCxLQUFjSyxvQkFBeUJBLFNBQWNBLGtCQXZHbEl0UCwwQkFDdEMsQ0FFQTZQLE1BQUFBLENBQU9uVCxFQUFZb1QsRUFBb0IsSUFDckMsTUFBTyx5QkFBeUJBLEdBQ2xDLENBRUFDLFFBQUFBLENBQVNyVCxFQUFZb1QsRUFBb0IsSUFDdkMsTUFBTyxDQUFDLGtCQUFtQkEsR0FBbUI3Z0IsT0FBT3NhLFNBQVM1YSxLQUFLLElBQ3JFLENBRUFxaEIsV0FBQUEsQ0FBWW5NLEdBQ1YsTUFBTTdELEVBQVV1UCxHQUFtQjFMLEdBQzdCb00sRUFzRkQsV0F0RjhDLEdBQUdqUSxxQkFJdEQsTUFBTyxHQUFHaVEsa0RBQWdFQSxrQ0FIM0NSLEdBQTBCNUwsU0FJRjdELGtCQUF3QkEsNkJBQW1DQSw4REFDcEgsQ0FFQWtRLFdBQUFBLENBQVlyTSxHQUNWLE1BQU03RCxFQUFVdVAsR0FBbUIxTCxHQUNuQyxNQUFPLGtCQUFrQjRMLEdBQTBCNUwsTUFBWTdELGdCQUNqRSxDQUVBbVEsT0FBQUEsQ0FBUXRNLEVBQWtCaU0sRUFBb0IsSUFDNUMsTUFBTyx5QkFBeUJBLFFBQXdCdmEsS0FBS3dhLFNBQVNsTSxTQUFldE8sS0FBSzZhLEtBQUt2TSxJQUNqRyxDQUVBd00sVUFBQUEsQ0FBVzNULEVBQVlvVCxFQUFvQixJQUN6QyxNQUFPLHNCQUFzQkEsR0FDL0IsQ0FFQWxYLEtBQUFBLENBQU1pTCxFQUFrQmlNLEVBQW9CLElBRTFDLE1BQU1RLEVBQWtCLEdBQ2xCQyxFQXFFSCxTQUFpQzFNLEdBQ3RDLE1BQU0yTSxFQUFRM00sRUFBUTNXLElBQUl1akIsYUFDMUIsSUFBS0QsR0FBT3pQLFdBQVdrTyxJQUFjLE9BRXJDLE1BQU15QixFQUFZRixFQUFNdFIsTUFBTStQLEdBQW9COUgsUUFBUSxVQUFXLElBQ3JFLElBQUt1SixFQUFXLE9BRWhCLE1BQU1DLEVBQVVuQixHQUFpQjNMLEdBQzNCK00sRUFBZTlpQixFQUFLK2lCLFdBQVdILEdBQ2pDQSxFQUNBNWlCLEVBQUtDLFFBQVE4VixFQUFRN0QsUUFBUzJRLEdBQVcsSUFBS0QsR0FFbEQsTUFBTyxVQUFVRSxPQUFrQkEsV0FBc0JBLFFBQzNELENBbEYyQkUsQ0FBd0JqTixHQUMzQzBNLEdBQWdCRCxFQUFNNWhCLEtBQUs2aEIsR0FDL0IsTUFBTVEsRUFBZSxDQUFDLCtCQUFnQ2pCLEdBQW1CN2dCLE9BQU9zYSxTQUFTNWEsS0FBSyxLQU05RixPQUxBMmhCLEVBQU01aEIsS0FBS3FpQixHQUNQbE4sRUFBUS9DLFlBQVltQixjQUFjMEksT0FFcEMyRixFQUFNNWhCLEtBQUs2RyxLQUFLNmEsS0FBS3ZNLElBRWhCeU0sRUFBTXJoQixPQUFPc2EsU0FBUzVhLEtBQUssT0FDcEMsQ0FFQXFpQixPQUFBQSxDQUFRbk4sRUFBa0JvTixHQUN4QixNQUFNalIsRUFBVXVQLEdBQW1CMUwsR0FDbkMsTUFBTyxVQUFVb04sMEJBQW1DeEIsR0FBMEI1TCxTQUFlb04sS0FBY2pSLGdCQUM3RyxDQUVBb1EsSUFBQUEsQ0FBS3ZNLEVBQWtCcU4sR0FDckIsT0FBSXJOLEVBQVEvQyxZQUFZbUIsY0FBYzBJLE1BQWMsc0JBQXFCdUcsRUFBYSxPQUFPQSxJQUFlLElBQ3hHQSxFQUFtQixvQkFBb0JBLElBQ3RDck4sRUFBUS9DLFlBQVlxUSxRQUErQ2YsS0FBYSxzQkFDOUUsd0VBQ1QsQ0FFQWdCLE1BQUFBLENBQU92TixFQUFrQndOLEVBQXNCdkIsRUFBb0IsSUFDakUsSUFBSS9FLEVBQVMsR0FFYixHQUFJc0csRUFDRixJQUNFLElBQUkzUyxJQUFJMlMsR0FDUnRHLEVBQVMsZ0JBQWdCc0csSUFDM0IsQ0FBRSxNQUNBLE1BQU1ULEVBQWU5aUIsRUFBS0MsUUFBUXNqQixHQUNsQ3RHLEVBQVMsZ0JBQWdCa0UsS0FBYzJCLElBQ3pDLE1BQ0ssR0FBSS9NLEVBQVEzVyxJQUFJdWpCLGNBQWMxUCxXQUFXa08sSUFBYyxDQUM1RCxNQUFNMEIsRUFBVW5CLEdBQWlCM0wsR0FDakMsR0FBSThNLEVBQVMsQ0FDWCxNQUFNQyxFQUFlOWlCLEVBQUtDLFFBQVE4VixFQUFRN0QsUUFBUzJRLEVBQVM5TSxFQUFRM1csSUFBSXVqQixhQUFhdlIsTUFBTStQLElBQzNGbEUsRUFBUyxnQkFBZ0JrRSxLQUFjMkIsSUFDekMsQ0FDRixDQUNBLE1BQU8sR0FBRzdGLGtCQUF1QitFLEdBQ25DLEdDNUZXd0IsR0FBZ0MsQ0FDM0M1YyxRQUFTLFdBQ1RnUixTQUFVLGdEQUpJLENBQUEsRUFNZCxhQUFNek8sQ0FBUXhKLEdBQ1osTUFBTWdYLFFBQWlCVixHQUF1QnRXLEdBQ3pDZ1gsSUFDSHBWLFFBQVFzQixNQUFNaVYsRUFBTUMsSUFBSSxzQkFDeEJ6WCxRQUFRaWQsS0FBSyxJQUdmLE1BQU1rRyxFQUFpQjlNLEVBQVNyUixZQUM3QnhGLElBQUtpVyxJQUFPLENBQVFBLFVBQVM1QyxRQUFTdVEsR0FBa0IzTixNQUN4RDVVLE9BQU8sRUFBR2dTLGFBQWNBLEVBQVF4UyxPQUFTLEdBQzVDLEdBQThCLElBQTFCOGlCLEVBQWU5aUIsT0FJbkIsSUFBSyxNQUFNb1YsUUFBRUEsRUFBTzVDLFFBQUVBLEtBQWFzUSxFQUFnQixDQUNqRGxpQixRQUFRQyxLQUFLLDBCQUEwQnVVLEVBQVFyTyxZQUMvQyxJQUFLLE1BQU1vVCxLQUFVM0gsUUFDYjBILEdBQWFDLEVBQVEvRSxFQUFTcFcsRUFFeEMsTUFSRTRCLFFBQVFDLEtBQUtzVyxFQUFNRSxNQUFNLDhCQVM3QixHQUdGLFNBQVMwTCxHQUFrQjNOLEdBQ3pCLE1BQU01QyxFQUFvQixHQUN0QjRDLEVBQVFsQixpQkFBaUIsVUFDM0IxQixFQUFRdlMsS0FBSyxzQkFDVG1WLEVBQVFqQyxXQUNWWCxFQUFRdlMsS0FBS2loQixHQUFjSSxTQUFTbE0sS0FFN0JBLEVBQVFqQyxXQUNqQlgsRUFBUXZTLEtBQUtpaEIsR0FBY0ksU0FBU2xNLElBR3RDLE1BQU00TixFQVlSLFNBQXlCNU4sR0FDdkIsSUFBS0EsRUFBUWxCLGlCQUFpQixrQkFBbUIsT0FFakQsR0FBeUQsSUFjM0QsU0FBK0JrQixFQUFrQmpCLEdBQy9DLE1BQU05QixFQUFjK0MsRUFBUS9DLFlBQ3RCNFEsRUFDSjVRLEVBQVltQixlQUFlVyxJQUMzQjlCLEVBQVlxQixrQkFBa0JTLElBQzlCOUIsRUFBWTJDLHVCQUF1QmIsSUFDbkM5QixFQUFZNEMsbUJBQW1CZCxHQUMzQitPLEVBQVFELEdBQVNFLE1BQU0sVUFBVSxHQUN2QyxZQUFpQnBqQixJQUFWbWpCLE9BQXNCbmpCLEVBQVltRSxPQUFPZ2YsRUFDbEQsQ0F2Qk1FLENBQXNCaE8sRUFBUyxrQkFDakMsTUFBTywyQ0FFVCxHQUFJaU8sR0FBV2pPLEVBQVMsZ0JBQ3RCLE1BQU8sNENBRVQsTUFDRixDQXRCOEJrTyxDQUFnQmxPLEdBQ3hDNE4sR0FDRnhRLEVBQVF2UyxLQUFLK2lCLEdBR2YsTUFBTU8sRUFBdUMsSUFBbkIvUSxFQUFReFMsUUFBZ0JvVixFQUFRL0IsV0FtQjVELFNBQThCK0IsR0FFNUIsTUFEbUIsQ0FBQyxvQkFBcUIscUJBQXNCLG9CQUFxQixzQkFDbEVOLEtBQU10UixHQUFhNmYsR0FBV2pPLEVBQVM1UixHQUMzRCxDQXRCeUVnZ0IsQ0FBcUJwTyxRQUFXclYsRUFJdkcsT0FISXdqQixHQUNGL1EsRUFBUXZTLEtBQUssbUNBQW1Dc2pCLGFBRTNDL1EsQ0FDVCxDQThCQSxTQUFTNlEsR0FBV2pPLEVBQWtCNVIsR0FDcEMsT0FBT25ELEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLa1YsRUFBUTdELFFBQVMvTixHQUNsRCxDQ3JGQSxNQUVhaWdCLEdBR1QsQ0FDRnhkLFFBQVMsc0JBQ1RnUixTQUFVLGtFQUNWMkcsUUFSNkIsQ0FBQSxFQVM3QixhQUFNcFYsQ0FBUXhKLFNBS1RnSSxlQUNMaEksR0FFQSxNQUFNb1csRUFBVUYsR0FBZ0JsVyxHQUMzQm9XLElBQ0h4VSxRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUksc0JBQ3hCelgsUUFBUWlkLEtBQUssSUFHZixHQUFJNUwsR0FBS29FLEVBQVEzVyxJQUFJNlYsSUFFbkIsWUFEQTFULFFBQVFDLEtBQUssZ0NBQWdDdVUsRUFBUTNXLElBQUk2VixNQUkzRCxNQUFNb1AsRUFBVXRPLEVBQVEzVyxJQUFJa2xCLEtBQ3RCQyxFQUFPMWYsT0FBT3dmLEtBQ2Z4ZixPQUFPQyxVQUFVeWYsSUFBU0EsR0FBUSxLQUNyQ2hqQixRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUkseUNBQXlDc00sTUFDakUvakIsUUFBUWlkLEtBQUssSUFHZmhjLFFBQVFDLEtBQUsscUJBQXFCK2lCLEtBQ2xDLFVBQ1FDLEVBQWdCRCxFQUN4QixDQUFFLE1BQ0EsQ0FFSixDQS9CVUUsQ0FBZ0I5a0IsRUFDeEIsR0NuQkssU0FBUytrQixHQUFvQmxLLEVBQWtCNEIsR0FDcEQsSUFTSyxTQUFtQzVCLEVBQWtCNEIsR0FDMUQsT0FBb0IsSUFBYjVCLEdBT1QsU0FBMEI0QixHQUN4QixNQUFPLHNCQUFzQjlVLEtBQUs4VSxFQUFPOVIsV0FBVywyQkFBNEIsSUFDbEYsQ0FUMkJxYSxDQUFpQnZJLEVBQzVDLENBWE93SSxDQUEwQnBLLEVBQVU0QixHQUFTLE9BRWxELE1BQU15SSxFQVdELFNBQWlDekksR0FDdEMsT0FBT0EsRUFBT3BaLE1BQ2hCLENBYjJCOGhCLENBQXdCMUksR0FDN0N5SSxJQUNGdmtCLFFBQVF5QyxPQUFPMEYsTUFBTW9jLEdBQ3JCdmtCLFFBQVF5QyxPQUFPMEYsTUFBTSxNQUV6QixDQ1JPLFNBQVNzYyxHQUFrQnhpQixHQUNoQyxPQUFPQSxFQUFLekMsSUFBS2tsQixHQUFRQyxHQUFvQkQsSUFBTW5rQixLQUFLLElBQzFELENBTU8sU0FBU29rQixHQUFvQkQsR0FDbEMsTUFBTyxvQkFBb0IxZCxLQUFLMGQsR0FBT0EsRUFBTSxJQUFJQSxFQUFJMWEsV0FBVyxJQUFLLGFBQ3ZFLENDSUEsTUFtQ000YSxHQUFtQixJQUFJN1UsSUFBSSxDQUFDLFFBQVMsTUFBTyxNQUFPLEtBQU0sTUFBTyxNQUFPLE1BQU8sU0FBVSxLQUFNLE1BQU8sUUFDckc4VSxHQUFtQixJQUFJOVUsSUFBSSxDQUFDLE9BQzVCK1UsR0FBaUIsSUFBSS9VLElBQUksQ0FBQyxTQUMxQmdWLEdBQWtCLElBQUloVixJQUFJLElBQzNCNlUsR0FDSCxNQUNBLE1BQ0EsVUFDQSxNQUNBLE1BQ0EsT0FDQSxPQUNBLFFBQ0EsUUFDQSxPQUNBLEtBQ0EsTUFDQSxPQUNBLE9BQ0EsT0FDQSxRQUVJSSxHQUFxQixJQUFJalYsSUFBSSxDQUNqQyxNQUNBLE1BQ0EsTUFDQSxNQUNBLE9BQ0EsT0FDQSxLQUNBLE9BQ0EsUUFDQSxRQUNBLE1BQ0EsS0FDQSxNQUNBLE1BQ0EsT0FDQSxLQUNBLE1BQ0EsTUFDQSxPQUNBLFFBRUlrVixHQUF5QixJQUFJbFYsSUFBSSxJQUFJaVYsSUFBb0Jua0IsT0FBUXFrQixJQUFTSCxHQUFnQnRNLElBQUl5TSxLQUM5RkMsR0FBK0IsMkJBU3hCQyxHQUEwRCxDQUNyRTllLFFBQVMsa0JBQ1RnUixTQUFVLG9CQTNGSSxDQUNkK04sSUFBSyxDQUNIdG1CLFlBQWEseUJBQ2JDLEtBQU0sV0FFUnNtQixPQUFRLENBQ052bUIsWUFBYSxrQkFDYkMsS0FBTSxXQUVSaUYsTUFBTyxDQUNMbEYsWUFBYSxxQkFDYkMsS0FBTSxXQUVSMEUsT0FBUSxDQUNOM0UsWUFBYSw4Q0FDYkMsS0FBTSxZQThFUixhQUFNNkosQ0FBUXhKLEdBQ1osTUFBTTZhLFFBQWlCcUwsR0FBS2xtQixHQUN4QjZhLEdBQVVsYSxRQUFRaWQsS0FBSy9DLEVBQzdCLEdBR0s3UyxlQUFla2UsR0FBS2xtQixHQUN6QixHQUF5QixVQUFyQlcsUUFBUXlFLFNBRVYsT0FEQXhELFFBQVFzQixNQUFNaVYsRUFBTUMsSUFBSSw4Q0FDakIsRUFHVCxNQUFNcEIsUUFBaUJWLEdBQXVCdFcsR0FBTSxHQUNwRCxJQUFLZ1gsRUFFSCxPQURBcFYsUUFBUXNCLE1BQU1pVixFQUFNQyxJQUFJLHNCQUNqQixFQUdULE1BQU0rTixFQWdXRCxTQUE0Qm5tQixHQUNqQyxNQUFNb21CLEVBQWMsSUFBSTFWLElBQ3hCLElBQUssTUFBTXhPLElBQVMsSUFBS2xDLEVBQUttbUIsT0FBUyxNQUFRbm1CLEVBQUtpUCxFQUFFd0MsTUFBTSxNQUFRelIsRUFBSyxPQUFTLElBQ2hGb21CLEVBQVl4VixJQUFJdEwsT0FBT3BELElBRXpCLE1BQU8sSUFBSWtrQixFQUNiLENBdFdnQkMsQ0FBbUJybUIsR0FDM0JzbUIsRUFBeUIsSUFBSS9oQixJQUM3QmdpQixFQUEwQixJQUFJaGlCLElBQzlCaWlCLEVBQTJCLElBQUlqaUIsSUFDL0JraUIsRUFBeUIsSUFBSWxpQixJQUM3Qm1pQixFQUE4QixHQUM5QkMsRUFBaUMsR0FDdkMsSUFDSUMsRUFDQUMsRUFGQUMsR0FBa0MsRUFHdEMsR0FBSVgsRUFBTW5sQixPQUFTLEVBQUcsQ0FDcEIsTUFBTW9sQixRQUFvQmxlLFFBQVFtWSxJQUNoQzhGLEVBQU1obUIsSUFBSTZILFVBQ1IsTUFBTXhELEVBQVduRSxFQUFLQyxRQUFReW1CLEdBQ3hCQyxRQTBWUGhmLGVBQXFDeEQsR0FDMUMsSUFFRSxVQURvQm5ELEVBQUc0bEIsS0FBS3ppQixJQUNsQjBpQixjQUFlLE1BQU8sV0FDbEMsQ0FBRSxNQUNBLENBR0YsTUFBTyxPQUNULENBblcrQkMsQ0FBc0IzaUIsR0FDN0MsTUFBTyxDQUFFd2lCLFdBQVV4aUIsZUFHdkIsSUFBSyxNQUFNd2lCLFNBQUVBLEVBQVF4aUIsU0FBRUEsS0FBYzRoQixFQUFhLENBQ2hELEdBQ0U1aEIsRUFBU3VTLFNBQVMsbUJBQ2xCdlMsRUFBU2tQLFNBQVMsb0JBQ2xCbFAsRUFBU3VTLFNBQVMsbUJBQ2xCdlMsRUFBU2tQLFNBQVMsbUJBRWxCLFNBR0YsTUFBTTBULEVBQVkvbUIsRUFBS2duQixRQUFRN2lCLEdBQVVpTixNQUFNLEdBQy9DLEdBQUlqTixFQUFTdVMsU0FBUyxpQkFDcEI0UCxFQUFxQjFsQixLQUFLdUQsT0FENUIsQ0FJQW1pQixFQUFxQjFsQixRQUFRcW1CLEdBQTRCdFEsRUFBU3JSLFlBQWFuQixFQUFVd2lCLElBRXpGLElBQUssTUFBTU8sU0FBRUEsRUFBUW5SLFFBQUVBLEtBQWFvUixHQUF1QnhRLEVBQVNyUixZQUFhbkIsRUFBVXdpQixHQUFXLENBQ3BHLEdBQUk1USxFQUFRckIsZ0JBQStCLGNBQWJpUyxHQUE0QnhCLEdBQWlCcE0sSUFBSWdPLElBQWEsQ0FDMUYsTUFBTUssRUFBa0JqQixFQUF5QjloQixJQUFJMFIsSUFBWSxHQUdqRSxHQUZBcVIsRUFBZ0J4bUIsS0FBS3NtQixHQUNyQmYsRUFBeUIzaEIsSUFBSXVSLEVBQVNxUixHQUNyQixjQUFiVCxFQUEwQixRQUNoQyxDQUNBLEdBQUk1USxFQUFRcEIsaUJBQWdDLGNBQWJnUyxHQUE0QnZCLEdBQWVyTSxJQUFJZ08sSUFBYSxDQUN6RixNQUFNTSxFQUFnQmpCLEVBQXVCL2hCLElBQUkwUixJQUFZLEdBRzdELEdBRkFzUixFQUFjem1CLEtBQUtzbUIsR0FDbkJkLEVBQXVCNWhCLElBQUl1UixFQUFTc1IsR0FDbkIsY0FBYlYsRUFBMEIsUUFDaEMsQ0FDQSxHQUFpQixjQUFiQSxHQUE0QlcsR0FBeUJ2UixFQUFTZ1IsR0FBWSxDQUM1RSxNQUFNUSxFQUFnQnRCLEVBQXVCNWhCLElBQUkwUixJQUFZLEdBRzdELEdBRkF3UixFQUFjM21CLEtBQUtzbUIsR0FDbkJqQixFQUF1QnpoQixJQUFJdVIsRUFBU3dSLEdBQ2hDNW5CLEVBQUtpbUIsT0FDUCxHQUFpQixjQUFiZSxHQUE0QjVRLEVBQVF2QixTQUFVLENBQ2hELE1BQU1nVCxFQUFpQnRCLEVBQXdCN2hCLElBQUkwUixJQUFZLEdBQy9EeVIsRUFBZTVtQixLQUFLc21CLEdBQ3BCaEIsRUFBd0IxaEIsSUFBSXVSLEVBQVN5UixHQUNyQ25CLEVBQWtCemxCLEtBQUs2bUIsR0FBa0NQLEdBQVd6QixHQUN0RSxNQUNFLElBQUssTUFBTWlDLEtBQWlCQyxHQUEyQjVSLEVBQVNtUixFQUFVUCxFQUFVSSxHQUNsRixHQUFJaFIsRUFBUXZCLFNBQVUsQ0FDcEIsTUFBTWdULEVBQWlCdEIsRUFBd0I3aEIsSUFBSTBSLElBQVksR0FDL0R5UixFQUFlNW1CLEtBQUs4bUIsR0FDcEJ4QixFQUF3QjFoQixJQUFJdVIsRUFBU3lSLEVBQ3ZDLE1BQ0VuQixFQUFrQnpsQixLQUFLOG1CLEVBS2pDLE1BQU8sR0FBSS9uQixFQUFLaW1CLFNBQVdOLEdBQW1Cdk0sSUFBSWdPLElBQWMxQixHQUFnQnRNLElBQUlnTyxJQUNsRixHQUFJaFIsRUFBUXZCLFVBQVk2USxHQUFnQnRNLElBQUlnTyxHQUFZLENBQ3RELE1BQU1TLEVBQWlCdEIsRUFBd0I3aEIsSUFBSTBSLElBQVksR0FDL0R5UixFQUFlNW1CLEtBQUtzbUIsR0FDcEJoQixFQUF3QjFoQixJQUFJdVIsRUFBU3lSLEVBQ3ZDLE1BQVdsQyxHQUFtQnZNLElBQUlnTyxJQUNoQ1YsRUFBa0J6bEIsS0FBS3NtQixRQUVoQlUsR0FBc0JiLEtBQWVoUixFQUFRbkIsa0JBQ3REclQsUUFBUXNCLE1BQU1pVixFQUFNQyxJQUFJLHVCQUF1QmhDLEVBQVFyTywwQkFDdkQrZSxHQUFrQyxFQUV0QyxDQWxEQSxDQW1ERixDQUNBRixFQUFlLElBQUksSUFBSWxXLElBQUlnVyxJQUMzQkcsRUFBc0IsSUFBSSxJQUFJblcsSUFBSWlXLEdBQ3BDLE1BQ0VDLEVBOE9HLFNBQ0xzQixFQUNBbFIsR0FFQSxNQUFNcFUsRUFBTyxJQUFJOE4sSUFBWSxDQUFDLGVBQWUsSUFBSWtWLElBQXdCMWtCLEtBQUssUUFBUzRrQixLQUN2RixJQUFLLE1BQU0xUCxLQUFXWSxFQUFVLENBQzlCLElBQUttUixHQUFjL1IsR0FBVSxTQUU3QixNQUFNZ1MsRUFBaUIvbkIsRUFBS2EsS0FBS2tWLEVBQVE3RCxRQUFTLGVBQWlCLElBQUlvVCxJQUFvQnprQixLQUFLLEtBQU8sS0FDdkcwQixFQUFLZ08sSUFBSXZRLEVBQUtvQixTQUFTeW1CLEVBQWFFLElBQW1CQSxFQUN6RCxDQUNBLE1BQU8sSUFBSXhsQixFQUNiLENBMVBtQnlsQixDQUFrQnJSLEVBQVNOLEtBQUtuRSxRQUFTeUUsRUFBU3JSLGFBQ2pFa2hCLEVBQXNCN1AsRUFBU3JSLFlBQVl4RixJQUFLNE0sR0FBTUEsRUFBRW1ILGlCQUcxRCxNQUFNb1UsRUFBc0MsR0FDdENDLEVBQW1DLEdBQ25DQyxFQUFpQixDQUFFdk4sY0FBYyxFQUFPcUIsZUFBZ0J0YyxFQUFLeW9CLGdCQUM3REMsRUFBc0I1TSxRQUFROWIsRUFBS2ltQixRQUNuQzBDLEdBQW9CM29CLEVBQUtpbUIsUUFBVWptQixFQUFLZ21CLElBQzlDLEdBQUlHLEVBQU1ubEIsT0FBUyxFQUFHLENBQ3BCLEdBQUkybkIsRUFDRixJQUFLLE1BQU92UyxFQUFTd1IsS0FBa0J0QixFQUF3QixDQUM3RCxNQUFNUCxFQUFjNkMsR0FBaUJ4UyxFQUFTcFcsRUFBTTRuQixHQUMvQzdCLEdBRUx3QyxFQUFldG5CLEtBQUssQ0FBRWdHLFFBQVM4ZSxFQUFhM1AsV0FDOUMsQ0FFRixJQUFLLE1BQU9BLEVBQVNxUixLQUFvQmpCLEVBQ25DbUMsR0FDRkosRUFBZXRuQixLQUFLLENBQUVnRyxRQUFTNGhCLEdBQXVCN29CLEVBQU15bkIsR0FBa0JyUixZQUU1RXNTLEdBQ0ZKLEVBQWtCcm5CLEtBQUssQ0FBRWdHLFFBQVM2aEIsR0FBeUJyQixHQUFrQnJSLFlBR2pGLElBQUssTUFBT0EsRUFBU3NSLEtBQWtCakIsRUFDakNrQyxHQUNGSixFQUFldG5CLEtBQUssQ0FBRWdHLFFBQVM4aEIsR0FBcUJyQixHQUFnQnRSLFlBRWxFc1MsR0FDRkosRUFBa0JybkIsS0FBSyxDQUFFZ0csUUFBUytoQixHQUF1QnRCLEdBQWdCdFIsWUFHN0UsR0FBSXNTLEVBQ0YsSUFBSyxNQUFPdFMsRUFBU3lSLEtBQW1CdEIsRUFDdEMrQixFQUFrQnJuQixLQUFLLENBQUVnRyxRQUFTZ2lCLEdBQWtCcEIsR0FBaUJ6UixXQUczRSxNQUNFLElBQUssTUFBTUEsS0FBV1ksRUFBU3JSLFlBQWEsQ0FDMUMsR0FBSWdqQixFQUFrQixDQUNwQixJQUFLdlMsRUFBUS9DLFlBQVl5RCxZQUFjVixFQUFRdEMsY0FBZSxDQUM1RCxNQUFNaVMsRUFBYzZDLEdBQWlCeFMsRUFBU3BXLEdBQzFDK2xCLEdBQWF3QyxFQUFldG5CLEtBQUssQ0FBRWdHLFFBQVM4ZSxFQUFhM1AsV0FDL0QsQ0FDSUEsRUFBUXJCLGVBQWV3VCxFQUFldG5CLEtBQUssQ0FBRWdHLFFBQVM0aEIsR0FBdUI3b0IsR0FBT29XLFlBQ3BGQSxFQUFRcEIsZ0JBQWdCdVQsRUFBZXRuQixLQUFLLENBQUVnRyxRQUFTOGhCLEtBQXdCM1MsV0FDckYsQ0FDSXNTLElBQ0V0UyxFQUFRdkIsVUFBVXlULEVBQWtCcm5CLEtBQUssQ0FBRWdHLFFBQVNnaUIsS0FBcUI3UyxZQUN6RUEsRUFBUXJCLGVBQWV1VCxFQUFrQnJuQixLQUFLLENBQUVnRyxRQUFTNmhCLEtBQTRCMVMsWUFDckZBLEVBQVFwQixnQkFBZ0JzVCxFQUFrQnJuQixLQUFLLENBQUVnRyxRQUFTK2hCLEtBQTBCNVMsWUFFNUYsQ0FFRixNQUFNOFMsRUFBMEIsR0FFaEMsR0FBSVIsRUFBcUIsQ0FDdkIsTUFBTVMsUUFBeUJDLEdBQWdCZCxFQUFtQnRvQixFQUFNd29CLEdBSXhFLEdBSEFhLEdBQXVCRixFQUFrQm5wQixHQUN6Q2twQixFQUFjam9CLFFBQVFrb0IsRUFBaUJocEIsSUFBSzBDLEdBQVdBLEVBQU9nWSxXQUUxRHFPLEVBQWNqVyxLQUFNNEgsR0FBMEIsSUFBYkEsR0FDbkMsT0FBTyxDQUVYLENBRUEsR0FBSWlNLEVBQ0YsT0FBTyxFQUdULEdBQUk0QixFQUFxQixDQUN2QixHQUFJOUIsRUFBYTVsQixPQUFTLEdBQUtnVyxFQUFTTixLQUFLNUIsWUFBYSxDQUN4RCxNQUFNd1UsUUFBdUJDLEdBQzNCbkUsR0FBa0IsQ0FDaEIsT0FDQSxXQUNBLFVBQ0Esa0NBQ0EsVUFDQSxRQUNHd0IsSUFFTDVQLEVBQVNOLEtBQ1QxVyxFQUNBd29CLEdBRUZhLEdBQXVCLENBQUNDLEdBQWlCdHBCLEdBQ3pDa3BCLEVBQWNqb0IsS0FBS3FvQixFQUFlek8sU0FDcEMsQ0FDQSxHQUFJZ00sRUFBb0I3bEIsT0FBUyxFQUFHLENBQ2xDLE1BQU13b0IsUUFBOEJELEdBQ2xDbkUsR0FBa0IsQ0FBQyxPQUFRLG9CQUFxQixRQUFTeUIsSUFDekQ3UCxFQUFTTixLQUNUMVcsRUFDQXdvQixHQUVGYSxHQUF1QixDQUFDRyxHQUF3QnhwQixHQUNoRGtwQixFQUFjam9CLEtBQUt1b0IsRUFBc0IzTyxTQUMzQyxDQUVBLEdBQUlxTyxFQUFjalcsS0FBTTRILEdBQTBCLElBQWJBLEdBQ25DLE9BQU8sQ0FFWCxDQUVBLEdBQUk4TixFQUFrQixDQUNwQixNQUFNYyxRQUFzQkwsR0FBZ0JiLEVBQWdCdm9CLEVBQU13b0IsR0FDbEVhLEdBQXVCSSxFQUFlenBCLEdBQ3RDa3BCLEVBQWNqb0IsUUFBUXdvQixFQUFjdHBCLElBQUswQyxHQUFXQSxFQUFPZ1ksVUFDN0QsQ0FFQSxPQUFPcU8sRUFBY2pXLEtBQU00SCxHQUEwQixJQUFiQSxHQUFrQixFQUFJLENBQ2hFLENBRUEsU0FBU3VPLEdBQ1BySyxFQUNBL2UsRUFDQWtILEdBRUEsT0FBT2dCLFFBQVFtWSxJQUFJdEIsRUFBUzVlLElBQUksRUFBRzhHLFVBQVNtUCxhQUFjbVQsR0FBZXRpQixFQUFTbVAsRUFBU3BXLEVBQU1rSCxJQUNuRyxDQUVBLFNBQVNxaUIsR0FDUHRpQixFQUNBbVAsRUFDQXBXLEVBQ0FrSCxHQUVBLEdBQUlsSCxFQUFLcUUsT0FBUSxDQUNmLE1BQU1nWCxFQUFtQkMsR0FBZ0JyVSxFQUFTbVAsR0FDbEQsT1IzTUcsU0FDTCtFLEVBQ0EvRSxFQUNBcFcsRUFDQW9iLEVBQWdCSixJQUVoQixPQUFPRixHQUFZK0IseUJBQXlCN1UsVUFDMUMsTUFBTXFULEVBQW1CQyxHQUFnQkgsRUFBUS9FLEdBQ2pELEdBQUlwVyxFQUFLd2EsT0FDUCxNQUFPLENBQ0xLLFNBQVUsRUFDVjRCLE9BQVEsSUFJWixNQUFNOUIsUUFBWTFTLEVBQVdvVCxFQUFpQkssY0FBVTNhLEVBQVcsQ0FDakVkLElBQUttVyxFQUFRN0QsUUFDYjlTLElBQUs0YyxHQUFhakcsRUFBUTNXLElBQUssSUFBSzJiLEVBQU1rQixjQUFlbEIsRUFBS2tCLGdCQUFpQixJQUMvRTFCLE9BQU8sRUFDUDNYLE1BQU8sT0FDUHVDLFFBQVM0VixFQUFLNVYsUUFDZHVELGtCQUFrQixFQUNsQlcsWUFBWSxFQUNaYixlQUFnQnVTLEVBQUswQixlQUNyQjlULGVBQWdCb1MsRUFBSzBCLGVBQ3JCamQsUUFBU0csRUFBS0gsVUFHaEIsT0FEQXViLEVBQUt1QixXQUFXaEMsRUFBSTFWLFFBQ2IsQ0FDTDRWLFNBQVVGLEVBQUl4WCxRQUFVLEVBQ3hCc1osT0FBUTlCLEVBQUl2WCxTQUdsQixDUTBLV3NtQixDQUErQnppQixFQUFTbVAsRUFBU3BXLEVBQU1rSCxHQUFTeWlCLEtBQU05bUIsSUFBTSxJQUM5RUEsRUFDSG9FLFFBQVNvVSxFQUFpQkksVUFDMUJ4YixJQUFLbVcsRUFBUTdELFVBRWpCLENBQ0EsT0FBT3FLLEdBQXVCM1YsRUFBU21QLEVBQVNwVyxFQUFNa0gsR0FBU3lpQixLQUFNOU8sSUFBUSxDQUFRQSxhQUN2RixDQUVBLFNBQVN3TyxHQUNQL0osRUFDQXRmLEdBRUEsTUFBTTRwQixFQUNKNXBCLEVBQUtxRSxTQUFXckUsRUFBS3lvQixlQUFpQm5KLEVBQVE5ZCxPQUFRcUIsR0FBK0IsSUFBcEJBLEVBQU9nWSxVQUFrQnlFLEVBQzVGLEdBQWdDLElBQTVCc0ssRUFBaUI1b0IsT0FFckIsSUFBSyxNQUFNNkIsS0FBVSttQixFQUNiLFdBQVkvbUIsSUFFZDdDLEVBQUt5b0IsZUFDUG9CLEdBQW1CaG5CLElBRWY3QyxFQUFLcUUsUUFDUHlsQixHQUFtQmpuQixFQUFPb0UsUUFBU3BFLEVBQU81QyxLQUU1QzhrQixHQUFvQmxpQixFQUFPZ1ksU0FBVWhZLEVBQU80WixTQUdsRCxDQUVBLFNBQVNvTixHQUFtQmhuQixHQUcxQixHQUZBaW5CLEdBQW1Cam5CLEVBQU9vRSxRQUFTcEUsRUFBTzVDLEtBRWxCLElBQXBCNEMsRUFBT2dZLFlBZ0JpQzVULEVBaEJzQnBFLEVBQU9vRSxTQWlCMUR5TSxTQUFTLFlBQWN6TSxFQUFReU0sU0FBUyx3QkFmckQsWUFEQTlSLFFBQVFDLEtBQUtzVyxFQUFNRSxNQUFNLGVBZTdCLElBQThDcFIsRUFYNUMsTUFBTXdWLEVBQVM1WixFQUFPNFosT0FBT3BaLE9BQ3pCb1osSUFDRjliLFFBQVF5QyxPQUFPMEYsTUFBTTJULEdBQ3JCOWIsUUFBUXlDLE9BQU8wRixNQUFNLE1BRXpCLENBRUEsU0FBU2doQixHQUFtQjdpQixFQUFpQmhILEdBQzNDMkIsUUFBUUMsS0FBSyxLQUFPc1csRUFBTXNGLEtBQUt0RixFQUFNdUYsS0FBSyxZQUFhelcsR0FBV2tSLEVBQU1xRixLQUFLLE9BQU92ZCxLQUN0RixDQU1PLFNBQVMyb0IsR0FDZHhTLEVBQ0FwVyxFQUNBbW1CLEdBRUEsR0FBZ0MsV0FBNUIvUCxFQUFRbkIsZ0JBQ1YsT0FBT21RLEdBQWtCLENBQ3ZCLE9BQ0EsU0FDQSxxQ0FDSXBsQixFQUFLNEUsTUFBUSxDQUFDLFdBQWEsTUFDM0I1RSxFQUFLZ21CLElBQU0sQ0FBQyxTQUFXLE1BQ3ZCRyxHQUFTLENBQUMsTUFJcEIsQ0FFTyxTQUFTOEMsR0FBa0I5QyxHQUNoQyxPQUFPZixHQUFrQixDQUN2QixPQUNBLFFBQ0EsVUFDQSxxQ0FDSWUsR0FBUyxDQUFDLEtBQ2Qsb0JBRUosQ0FFTyxTQUFTMkMsR0FBeUIzQyxHQUN2QyxNQUFNNEQsRUFBVTVELEdBQVNBLEVBQU1ubEIsT0FBUyxFQUFJbWxCLEVBQVEsQ0FBQyxLQUNyRCxNQUFPLENBQ0xmLEdBQWtCLENBQUMsU0FBVSxNQUFPLFFBQVMsWUFBYSxRQUFTLG9CQUFxQjJFLElBQ3hGM0UsR0FBa0IsQ0FBQyxTQUFVLE1BQU8sV0FBWTJFLEtBQ2hEN29CLEtBQUssT0FDVCxDQUVPLFNBQVMybkIsR0FBdUI3b0IsRUFBa0RtbUIsR0FDdkYsTUFBTTRELEVBQVU1RCxHQUFTQSxFQUFNbmxCLE9BQVMsRUFBSW1sQixFQUFRLENBQUMsS0FDckQsT0FBT2YsR0FBa0IsQ0FBQyxTQUFVLE1BQU8sWUFBY3BsQixFQUFLNEUsTUFBUSxDQUFDLE1BQVEsTUFBUW1sQixHQUN6RixDQUVPLFNBQVNmLEdBQXVCN0MsR0FFckMsT0FBT2YsR0FBa0IsQ0FBQyxPQUFRLFlBRGxCZSxHQUFTQSxFQUFNbmxCLE9BQVMsRUFBSW1sQixFQUFRLENBQUMsTUFFdkQsQ0FFTyxTQUFTNEMsR0FBcUI1QyxHQUVuQyxPQUFPZixHQUFrQixDQUFDLE9BQVEsYUFEbEJlLEdBQVNBLEVBQU1ubEIsT0FBUyxFQUFJbWxCLEVBQVEsQ0FBQyxNQUV2RCxDQXlETyxTQUFTNkIsR0FDZDVSLEVBQ0E1UixFQUNBd2lCLEVBQ0FJLEdBRUEsTUFBaUIsY0FBYkosR0FBNEI1USxFQUFRdkIsU0FDL0IsQ0FBQ3JRLEdBRU8sY0FBYndpQixHQUE0Qm1CLEdBQWMvUixHQUNyQyxDQUFDNVIsRUFBVXNoQixJQW5CZixTQUNMMVAsRUFDQWdSLEdBRUEsT0FBSWhSLEVBQVF2QixTQUFpQjZRLEdBQWdCdE0sSUFBSWdPLEtBQzdDZSxHQUFjL1IsSUFDWHdQLEdBQXVCeE0sSUFBSWdPLEVBQ3BDLENBY000QyxDQUFxQzVULEVBQVNnUixHQUN6QyxDQUFDNWlCLEdBRUgsRUFDVCxDQUVBLFNBQVNzakIsR0FBa0N0akIsR0FDekMsT0FBT25FLEVBQUthLEtBQUtzRCxFQUFVLGVBQWUsSUFBSW9oQixJQUF3QjFrQixLQUFLLFFBQzdFLENBRU8sU0FBU29tQixHQUNkdFEsRUFDQXhTLEVBQ0F3aUIsR0FFQSxNQUFpQixjQUFiQSxFQUFpQyxHQUM5QmhRLEVBQ0p4VixPQUNFNFUsR0FDQ0EsRUFBUWxDLGtCQUFvQjdULEVBQUthLEtBQUtzRCxFQUFVLGlCQUNoRDRSLEVBQVFsQyxnQkFBZ0JaLFdBQVcsR0FBRzlPLE9BRXpDckUsSUFBS2lXLEdBQVlBLEVBQVFsQyxnQkFDOUIsQ0FFTyxTQUFTc1QsR0FDZHhRLEVBQ0F4UyxFQUNBd2lCLEdBRUEsR0FBaUIsY0FBYkEsRUFBMEIsQ0FDNUIsTUFBTWlELEVBQXFCalQsRUFBU3hWLE9BQ2pDNFUsR0FBWUEsRUFBUTdELFVBQVkvTixHQUFZNFIsRUFBUTdELFFBQVFlLFdBQVcsR0FBRzlPLE9BRTdFLEdBQUl5bEIsRUFBbUJqcEIsT0FBUyxFQUM5QixPQUFPaXBCLEVBQW1COXBCLElBQUtpVyxJQUFPLENBQVFtUixTQUFVblIsRUFBUTdELFFBQVM2RCxZQUU3RSxDQUVBLE1BQU1BLEVBNUZSLFNBQTJCWSxFQUFxQnhTLEdBQzlDLElBQUkwbEIsRUFDSixJQUFLLE1BQU05VCxLQUFXWSxFQUVqQnhTLElBQWE0UixFQUFRN0QsVUFBVy9OLEVBQVM4TyxXQUFXLEdBQUc4QyxFQUFRN0QsYUFDOUQyWCxLQUFpQjlULEVBQVE3RCxRQUFRdlIsT0FBU2twQixFQUFjM1gsUUFBUXZSLFVBRWxFa3BCLEVBQWdCOVQsR0FHcEIsT0FBTzhULENBQ1QsQ0FpRmtCQyxDQUFrQm5ULEVBQVV4UyxHQUM1QyxPQUFPNFIsRUFBVSxDQUFDLENBQUVtUixTQUFVL2lCLEVBQVU0UixZQUFhLEVBQ3ZELENBRUEsU0FBUzZSLEdBQXNCYixHQUM3QixPQUFPN0IsR0FBaUJuTSxJQUFJZ08sSUFBYzVCLEdBQWlCcE0sSUFBSWdPLElBQWMzQixHQUFlck0sSUFBSWdPLEVBQ2xHLENBRUEsU0FBU08sR0FBeUJ2UixFQUEyQ2dSLEdBQzNFLE1BQWdDLFdBQTVCaFIsRUFBUW5CLGlCQUFxQ3NRLEdBQWlCbk0sSUFBSWdPLEVBRXhFLENBRUEsU0FBU2UsR0FBYy9SLEdBQ3JCLE9BQVFBLEVBQVF2QixVQUF3QyxXQUE1QnVCLEVBQVFuQixlQUN0QyxDQ2pqQkEsTUFBTW1WLEdBQVMsSUFBSTFaLElBbUJuQjFJLGVBQWVxaUIsR0FBNEJ6RixFQUFjeE8sU0FjbERwTyxlQUF5QzRjLEVBQWN4TyxTQUk5RHBPLGVBQXNDc2lCLEVBQXNCbFUsR0FDMUQsSUFDRSxNQUFNbVUsUUFZVnZpQixlQUFzQ3NpQixFQUFzQmxVLEdBQzFELE1BQU1oVCxPQUFFQSxTQUFpQjZFLEVBQVcsU0FBVSxDQUFDLEtBQU0sUUFBU3FpQixHQUFhLENBQ3pFcnFCLElBQUttVyxFQUFRN0QsUUFDYjlTLElBQUsyVyxFQUFRM1csTUFFZixPQUFPMkQsRUFDSjRDLE1BQU0sT0FDTjdGLElBQUtxcUIsR0FBT0EsRUFBR25uQixRQUNmN0IsT0FBT3NhLFFBQ1osQ0FyQitCMk8sQ0FBdUJILEVBQVlsVSxHQUM5RCxHQUE0QixJQUF4Qm1VLEVBQWF2cEIsT0FBYyxhQUV6QmlILEVBQVcsU0FBVSxDQUFDLEtBQU0sUUFBU3NpQixHQUFlLENBQ3hEdHFCLElBQUttVyxFQUFRN0QsUUFDYjlTLElBQUsyVyxFQUFRM1csS0FFakIsQ0FBRSxNQUNBLENBRUosQ0FmUWlyQixDQUF1QixDQUFDLFdBQVksV0FBVzlGLEtBQVN4TyxFQUNoRSxDQWRRdVUsQ0FBMEIvRixFQUFNeE8sR0FDdEMsVUFDUXlPLEVBQWdCRCxFQUN4QixDQUFFLE1BQ0EsQ0FFSixDQzNCTzVjLGVBQWU0aUIsR0FBd0JDLEVBQWtCelUsR0FDOUQsTUFBTXdPLEVBQU8xZixPQUFPMmxCLEdBQ3BCLElBQUtqRyxFQUFNLE1BQU0sSUFBSTVnQixNQUFNLG1CQUFtQjRnQixrQkFHOUMsYURISzVjLGVBQW1ENGMsRUFBY3hPLFNBQzlDMFUsR0FBZ0JsRyxVQUVoQ3lGLEdBQTRCekYsRUFBTXhPLEdBRzFDLE1BQU0yVSxFQUFXL2lCLFVBQ1hvaUIsR0FBT2hSLElBQUl3TCxLQUVmd0YsR0FBT3haLElBQUlnVSxTQUNMeUYsR0FBNEJ6RixFQUFNeE8sS0FFMUMsSUFBSyxNQUFNblIsSUFBVSxDQUFDLGFBQWMsU0FBVSxVQUFXLFdBQ3ZEdEUsUUFBUWdJLEdBQUcxRCxFQUFROGxCLEVBRXZCLENDYlFDLENBQW9DcEcsRUFBTXhPLEdBQ3pDd08sQ0FDVCxDQU9PNWMsZUFBZThpQixHQUFnQmxHLEdBRXBDLElBQUssTUFBTXFHLElBQVEsQ0FBQyxZQUFhLE1BQU8sQ0FFdEMsVUFEd0JDLEdBQVVELEVBQU1yRyxHQUN4QixPQUFPLENBQ3pCLENBQ0EsT0FBTyxDQUNULENBRUE1YyxlQUFla2pCLEdBQVVELEVBQWNyRyxHQUNyQyxPQUFPLElBQUkxYyxRQUFTNUgsSUFDbEIsTUFBTTZxQixFQUFTQyxJQUVmRCxFQUFPcEwsS0FBSyxRQUFVc0wsSUFDSCxlQUFiQSxFQUFJNWpCLEtBSVMsaUJBQWI0akIsRUFBSTVqQixLQUlSbkgsR0FBUSxHQUhOQSxHQUFRLEdBSlJBLEdBQVEsS0FVWjZxQixFQUFPcEwsS0FBSyxZQUFhLEtBQ3ZCb0wsRUFBT0csTUFBTSxLQUNYaHJCLEdBQVEsT0FJWjZxQixFQUFPSSxPQUFPM0csRUFBTXFHLElBRXhCLENDM0NBLE1BQU1yTSxHQUFVLENBQUEsRUFnRGhCLFNBQVM0TSxHQUEyQjVHLEVBQWM2RyxHQUNoRCxPQUFPbm1CLE9BQU9vbUIsR0FBRzs7OztrQkFJRG5vQixLQUFLOE4sVUFBVW9hOzs7Ozs7O2lCQU9oQmxvQixLQUFLOE4sVUF4REU7Ozs7Ozs7Ozs7OztnQkFvRVJ1VDs7O0NBSWhCLENBRU8sTUFBTStHLEdBQThELENBQ3pFMWtCLFFBQVMsdUJBQ1RnUixTQUFVLHFGQUNWMkcsUUFBVWdOLEdBQ1JBLEVBQ0dDLFdBQVcsU0FBVSxDQUNwQi9NLFFBQVMsQ0FBQyxRQUFTLFFBQ25CN0csU0FBVSw0QkFDVnRZLEtBQU0sV0FFUHVILFFBQVEwWCxJQUNiLGFBQU1wVixDQUFReEosR0FDWixNQUFNb1csRUFBVUYsR0FBZ0JsVyxHQUMzQm9XLElBQ0h4VSxRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUksc0JBQ3hCelgsUUFBUWlkLEtBQUssSUFHZixNQUFNa08sRUFBUzlyQixFQUFLOHJCLE9BQ3BCLEdBQTJCLFNBQXZCMVYsRUFBUTNXLElBQUlxQixPQUVkLFlBREFjLFFBQVFDLEtBQUssb0JBQW9CaXFCLDZCQUluQyxNQUFNbEgsRUFnRVYsU0FBbUJGLEdBQ2pCLE1BQU1FLEVBQU8xZixPQUFPd2YsR0FFcEIsT0FEQXFILEVBQU9DLEdBQUc5bUIsT0FBT0MsVUFBVXlmLElBQVNBLEVBQU8sRUFBRyx5Q0FBeUNGLEtBQ2hGRSxDQUNULENBcEVpQnFILENBQVU3VixFQUFRM1csSUFBSWtsQixNQUNuQyxHQUFlLFVBQVhtSCxFQUFKLENBSUEsR0FBZSxTQUFYQSxFQUtKLE1BQU0sSUFBSTluQixNQUFNLCtCQUErQjhuQixNQXFDbkQsU0FBK0IxVixFQUFrQndPLEdBQy9DLE1BQU02RyxFQUFVUyxHQUFXOVYsRUFBU3dPLEdBQzlCNWYsRUFBTW1uQixHQUFRVixHQUNwQixRQUFZMXFCLElBQVJpRSxFQUVGLFlBREFwRCxRQUFRQyxLQUFLLDZDQUE2QytpQixNQUk1RCxJQUNFamtCLFFBQVFxRyxLQUFLaEMsRUFBSyxVQUNwQixDQUFFLE1BQ0EsQ0FFRm9uQixHQUFjWCxHQUNkN3BCLFFBQVFDLEtBQUssc0NBQXNDK2lCLEtBQ3JELENBeERNeUgsQ0FBc0JqVyxFQUFTd08sRUFGakMsWUFVSjVjLGVBQXNDb08sRUFBa0J3TyxHQUN0RCxNQUFNNkcsRUFBVVMsR0FBVzlWLEVBQVN3TyxHQUM5QjBILEVBQWNILEdBQVFWLEdBQzVCLFFBQW9CMXFCLElBQWhCdXJCLEdBQTZCQyxHQUFpQkQsR0FFaEQsWUFEQTFxQixRQUFRQyxLQUFLLGlEQUFpRCtpQixNQUdoRXdILEdBQWNYLFNBRUZYLEdBQWdCbEcsS0FDMUJoakIsUUFBUXNCLE1BQU1pVixFQUFNQyxJQUFJLFFBQVF3TSx5QkFDaENqa0IsUUFBUWlkLEtBQUssSUFFZnZjLEVBQUdtckIsVUFBVW5zQixFQUFLcUMsUUFBUStvQixHQUFVLENBQUU3UyxXQUFXLElBRWpELE1BQU00RyxFQUFReEcsRUFBYzNRLE1BQzFCMUgsUUFBUThyQixTQUNSLENBQUMsc0JBQXVCLFNBQVVqQixHQUEyQjVHLEVBQU02RyxJQUNuRSxDQUNFek0sVUFBVSxFQUNWdmYsSUFBSzJXLEVBQVEzVyxJQUNid0QsTUFBTyxXQUdYLFFBQWtCbEMsSUFBZHllLEVBQU14YSxJQUNSLE1BQU0sSUFBSWhCLE1BQU0sdUNBR2xCd2IsRUFBTWtOLGNBMERSMWtCLGVBQThCeWpCLEVBQWlCem1CLEdBQzdDLE1BQU02YixFQUFXaFEsS0FBS2lCLE1BQVEsSUFDOUIsS0FBT2pCLEtBQUtpQixNQUFRK08sR0FBVSxDQUM1QixRQUF5QjlmLElBQXJCb3JCLEdBQVFWLEdBQXdCLE9BQ3BDLElBQUtjLEdBQWlCdm5CLEdBQU0sWUFDdEJ1YyxFQUFXLEdBQ25CLENBR0EsTUFEQTZLLEdBQWNYLEdBQ1IsSUFBSXpuQixNQUFNLHNDQUNsQixDQW5FUTJvQixDQUFlbEIsRUFBU2pNLEVBQU14YSxLQUNwQ3BELFFBQVFDLEtBQUssc0NBQXNDK2lCLEtBQ3JELENBM0NZZ0ksQ0FBdUJ4VyxFQUFTd08sRUFTMUMsR0EyREYsU0FBU3NILEdBQVc5VixFQUFrQndPLEdBQ3BDLE9BQU92a0IsRUFBS2EsS0FBS2tWLEVBQVFwRCxZQUFhLE9BQVEseUJBQXlCNFIsUUFDekUsQ0FFQSxTQUFTdUgsR0FBUVYsR0FDZixJQUNFLE1BQU16bUIsRUFBTUUsT0FBTzdELEVBQUcwUixhQUFhMFksRUFBUyxRQUFRcG9CLFFBQ3BELE9BQU82QixPQUFPQyxVQUFVSCxJQUFRQSxFQUFNLEVBQUlBLE9BQU1qRSxDQUNsRCxDQUFFLE1BQ0EsTUFDRixDQUNGLENBRUEsU0FBU3dyQixHQUFpQnZuQixHQUN4QixJQUVFLE9BREFyRSxRQUFRcUcsS0FBS2hDLEVBQUssSUFDWCxDQUNULENBQUUsTUFDQSxPQUFPLENBQ1QsQ0FDRixDQUVBLFNBQVNvbkIsR0FBY1gsR0FDckIsSUFDRXBxQixFQUFHd3JCLE9BQU9wQixFQUFTLENBQUVxQixPQUFPLEdBQzlCLENBQUUsTUFDQSxDQUVKLENDbk5PLFNBQVVDLEdBQXlCQyxFQUFxQmhXLEdBQzdELElBQUssTUFBTVosS0FBV1ksRUFDcEJwVixRQUFRQyxLQUFLLFlBQVltckIsVUFBb0I1VyxFQUFRck8sa0JBRS9DcU8sQ0FFVixDQ1FBLE1BQU02VyxHQUF5QixDQUFDLGtCQUFtQixZQVV0Q0MsR0FBNkYsQ0FDeEdqbUIsUUFBUyx5QkFDVGdSLFNBQVUsOERBVkksQ0FDZGtWLFFBQVMsQ0FDUHp0QixZQUFhLHlFQUNiQyxLQUFNLFVBQ05HLE1BQU8sTUFRVCxhQUFNMEosQ0FBUXhKLEdBQ1osTUFBTWdYLFFBQWlCVixHQUF1QnRXLEdBQ3pDZ1gsSUFDSHBWLFFBQVFzQixNQUFNaVYsRUFBTUMsSUFBSSxzQkFDeEJ6WCxRQUFRaWQsS0FBSyxJQUdmLElBQUssTUFBTXhILEtBQVcyVyxHQUF5Qix5QkFBMEIvVixFQUFTclIsYUFBYyxDQUM5RixNQUFNME4sRUFBMkIrQyxFQUFRL0MsWUFDbkNyUixFQUFPLENBQUMsZUFBZ0IsbUJBQzlCLElBQUssTUFBTUMsS0FBT0QsRUFBTSxDQUN0QixNQUFNb3JCLEVBQU8vWixFQUFZcFIsSUFBUSxDQUFBLEVBQ2pDLElBQUssTUFBTzhGLEVBQU03RixLQUFVQyxPQUFPQyxRQUFRZ3JCLEdBQ3JDbHJCLEdBQU9vUixXQUFXLHFCQUdwQjhaLEVBQUtybEIsR0FBUSxLQUFLQSxJQUd4QixDQVFBLEdBTkFzbEIsR0FBd0JydEIsRUFBTXFULEdBRTlCaWEsR0FBZ0JqYSxHQUVoQmthLEdBQWtCbGEsR0FFZHJULEVBQUt3YSxPQUFRLFNBRWpCLE1BQU1nVCxFQUFjeHRCLEVBQUttdEIsUUFBVTlzQixFQUFLYSxLQUFLa1YsRUFBUTdELFFBQVMsUUFBVTZELEVBQVE3RCxjQUMxRWxSLEVBQUdxWCxTQUFTQyxNQUFNNlUsRUFBYSxDQUFFNVUsV0FBVyxVQUM1Q3ZYLEVBQUdxWCxTQUFTK0IsVUFBVXBhLEVBQUthLEtBQUtzc0IsRUFBYSxnQkFBaUJqcUIsS0FBSzhOLFVBQVVnQyxHQUFjLFFBQzdGclQsRUFBS210QixlQUNETSxHQUF3QnB0QixFQUFLYSxLQUFLc3NCLEVBQWEsUUFFekQsQ0FDS3h0QixFQUFLd2EsUUFBV3hhLEVBQUttdEIsVUFDeEJuVSxFQUFjalcsVUFBVW9RLEdBQWdCLENBQUMsV0FBWSxDQUNuRGxRLE1BQU8sWUFFVHJCLFFBQVFDLEtBQUssMkJBRWpCLEdBR0ZtRyxlQUFleWxCLEdBQXdCbGIsR0FDckMsTUFBTW1iLEVBWVIsV0FDRSxJQUFJQyxFQUFpQnR0QixFQUFLcUMsUUFBUWtyQixjQUEwQkMsTUFDNUQsT0FBUyxDQUNQLE1BQU1DLEVBQVl6dEIsRUFBS2EsS0FBS3lzQixFQUFnQixTQUFVLFFBQ3RELEdBQUl0c0IsRUFBR0MsV0FBV3dzQixHQUFZLE9BQU9BLEVBRXJDLE1BQU1DLEVBQWdCMXRCLEVBQUtxQyxRQUFRaXJCLEdBQ25DLEdBQUlJLElBQWtCSixFQUNwQixNQUFNLElBQUkzcEIsTUFBTSw2Q0FFbEIycEIsRUFBaUJJLENBQ25CLENBQ0YsQ0F4QndCQyxTQUNoQjNzQixFQUFHcVgsU0FBU0MsTUFBTXBHLEVBQVMsQ0FBRXFHLFdBQVcsSUFDOUMsSUFBSyxNQUFNcVYsV0FBZ0I1c0IsRUFBR3FYLFNBQVN3VixRQUFRUixFQUFlLENBQUVTLGVBQWUsSUFBUyxDQUN0RixJQUFLRixFQUFPRyxXQUFhSCxFQUFPbG1CLEtBQUtnUCxTQUFTLE9BQVEsU0FFdEQsTUFBTXNYLEVBQWlCaHVCLEVBQUthLEtBQUtxUixFQUFTMGIsRUFBT2xtQixZQUMzQzFHLEVBQUdxWCxTQUFTNFYsU0FBU2p1QixFQUFLYSxLQUFLd3NCLEVBQWVPLEVBQU9sbUIsTUFBT3NtQixTQUM1RGh0QixFQUFHcVgsU0FBUzZWLE1BQU1GLEVBQWdCLElBQzFDLENBQ0F6c0IsUUFBUUMsS0FBSyxtQ0FBbUN4QixFQUFLb0IsU0FBU2QsUUFBUVYsTUFBT3NTLElBQVlBLElBQzNGLENBZ0JBLFNBQVM4YSxHQUF3QnJ0QixFQUEyQ3FULElBb0Q1RSxTQUF1Q0EsR0FDckMsTUFBTW1iLEVBQVVuYixFQUFZcUIsaUJBQW1CLENBQUEsRUFDekNGLEVBQWVuQixFQUFZbUIsY0FBZ0IsQ0FBQSxFQUMzQ2lhLEVBQXlCLEdBQy9CLElBQUssTUFBTTFtQixLQUFRa2xCLEdBQXdCLENBQ3pDLE1BQU1oSixFQUFVdUssRUFBUXptQixHQUNuQmtjLElBQ0F6UCxFQUFhek0sS0FDaEJ5TSxFQUFhek0sR0FBUWtjLEVBQ3JCd0ssRUFBYXh0QixLQUFLOEcsV0FFYnltQixFQUFRem1CLEdBQ2pCLENBQ0kwbUIsRUFBYXp0QixPQUFTLElBQ3hCcVMsRUFBWW1CLGFBQWVBLEdBRTdCNVMsUUFBUUMsS0FBSyxvQ0FBcUM0c0IsRUFBYXZ0QixLQUFLLE9BQVMsT0FDL0UsQ0FwRUV3dEIsQ0FBOEJyYixHQUMxQnJULEVBQUttdEIsUUFZWCxTQUErRDlaLEdBQzdELE1BQU1tYixFQUFVbmIsRUFBWXFCLGlCQUFtQixDQUFBLEVBR3pDaWEsRUFBdUIsQ0FDM0IsWUFDQSxlQUNBLDZDQUNBLFFBQ0EsV0FDQSxPQUNBLFlBQ0EsY0FDQSxXQUNBLGFBQ0EsV0FDQSxRQUNBLFVBQ0EsbUJBQ0Esb0JBQ0EsVUFDQSxVQUVJQyxFQUF3QixHQUM5QixJQUFLLE1BQU03bUIsS0FBUTVGLE9BQU9ILEtBQUt3c0IsSUFFM0JHLEVBQXFCMWIsS0FBTTRiLEdBQVM5bUIsRUFBSzJMLFNBQVNtYixLQUVqRDltQixFQUFLMkwsU0FBUyxnQkFBa0IzTCxFQUFLMkwsU0FBUyxvQkFHeEM4YSxFQUFRem1CLEdBQ2Y2bUIsRUFBWTN0QixLQUFLOEcsSUFHckJuRyxRQUFRQyxLQUFLLDJCQUE0QitzQixFQUFZMXRCLEtBQUssT0FBUyxPQUNyRSxDQTdDSTR0QixDQUFzRHpiLFdBS2pEQSxFQUFZcUIsZ0JBQ25COVMsUUFBUUMsS0FBSyxnQ0FDZixDQTJEQSxTQUFTeXJCLEdBQWdCamEsR0FDdkIsTUFBTTBiLEVBQWdDLENBQUMsUUFBUyxTQUFVLFNBQVUsT0FBUSxRQUFTLFFBQy9FQyxFQUFtQyxDQUFDLFNBQVUsVUFDOUN4YixFQUFXSCxFQUFZRyxTQUFXLENBQUEsRUFDbEN5YixFQUEyQixHQUNqQyxJQUFLLE1BQU9sbkIsRUFBTW1uQixLQUFZL3NCLE9BQU9DLFFBQVFvUixJQUV6Q3ViLEVBQThCOWIsS0FBTTRiLEdBQVM5bUIsRUFBS3VMLFdBQVd1YixLQUU3REcsRUFBaUMvYixLQUFNNGIsR0FBU0ssRUFBUXhiLFNBQVNtYixJQUFTSyxFQUFRN3JCLFNBQVd3ckIsRUFBS3hyQixrQkFHM0ZtUSxFQUFRekwsR0FDZmtuQixFQUFlaHVCLEtBQUs4RyxJQUd4Qm5HLFFBQVFDLEtBQUssbUJBQW9Cb3RCLEVBQWUvdEIsS0FBSyxPQUFTLE9BQ2hFLENBRUEsU0FBU3FzQixHQUFrQmxhLFVBQ2xCQSxFQUFZOGIsZUFDWjliLEVBQVkrYixxQkFDWi9iLEVBQVlnYyxRQUNyQixDQ2hNQSxNQUFNN04sR0FBYyxRQW9EcEIsU0FBUzhOLEdBQTJCbFosR0FDbEMsTUFBTXlMLEVBQVN6TCxFQUFRM1csSUFBSTh2QixlQU83QixTQUFnQ25aLEdBQzlCLE1BQU0yTSxFQUFRM00sRUFBUTNXLElBQUl1akIsYUFDMUIsSUFBS0QsR0FBT3pQLFdBQVdrTyxJQUFjLE9BRXJDLE1BQU15QixFQUFZRixFQUFNdFIsTUFBTStQLEdBQW9COUgsUUFBUSxVQUFXLElBQ3JFLElBQUt1SixFQUFXLE9BRWhCLE9BQU9BLENBQ1QsQ0FmOEN1TSxDQUF1QnBaLEdBQ25FLElBQUt5TCxFQUFRLE9BRWIsTUFBTXNCLEVBQWU5aUIsRUFBSytpQixXQUFXdkIsR0FBVUEsRUFBU3hoQixFQUFLQyxRQUFROFYsRUFBUTdELFFBQVNzUCxHQUN0RixNQUFPLFVBQVVzQixPQUFrQkEsV0FBc0JBLFFBQzNELENBWU8sTUFBTXNNLEdBQWlCLElBcEU5QixNQUNFdGtCLEtBQUFBLENBQU1pTCxFQUFrQmlNLEVBQW9CLElBQzFDLE1BQU1xTixFQUFnQkosR0FBMkJsWixHQUNqRCxPQUFLc1osRUFJRSxHQUFHQSxRQUFvQjVuQixLQUFLNGEsUUFBUXRNLEVBQVNpTSxLQUgzQyxxR0FJWCxDQUVBSyxPQUFBQSxDQUFRdE0sRUFBa0JpTSxFQUFvQixJQUM1QyxNQUFNc04sRUFBYzduQixLQUFLNmEsS0FBS3ZNLEdBQ3hCd1osRUFBaUI5bkIsS0FBS3NhLE9BQU9oTSxFQUFTaU0sR0FDNUMsTUFBdUIsU0FBaEJzTixFQUF5QkMsRUFBaUIsR0FBR0EsUUFBcUJELEdBQzNFLENBRUFFLGVBQUFBLENBQWdCelosRUFBa0JpTSxFQUFvQixJQUNwRCxPQUFJbE0sR0FBcUJDLEVBQVMsU0FBV2taLEdBQTJCbFosR0FDL0R0TyxLQUFLcUQsTUFBTWlMLEVBQVNpTSxHQUV0QnZhLEtBQUs0YSxRQUFRdE0sRUFBU2lNLEVBQy9CLENBRUFELE1BQUFBLENBQU8wTixFQUFtQnpOLEVBQW9CLElBQzVDLE1BQU8sNEJBQTRCQSxHQUNyQyxDQUVBQyxRQUFBQSxDQUFTd04sRUFBbUJ6TixFQUFvQixJQUM5QyxNQUFPLDZCQUE2QkEsR0FDdEMsQ0FFQU8sVUFBQUEsQ0FBV2tOLEVBQW1Cek4sRUFBb0IsSUFDaEQsT0FBT3ZhLEtBQUt3YSxTQUFTd04sRUFBVXpOLEVBQ2pDLENBRUFNLElBQUFBLENBQUt2TSxFQUFrQnFOLEdBQ3JCLE9BQUlBLEVBQW1CLG9CQUFvQkEsSUFDdkNyTixFQUFRL0MsWUFBWUcsU0FBU21QLEtBQWEsZ0JBQ3ZDLE1BQ1QsQ0FFQWdCLE1BQUFBLENBQU9tTSxFQUFtQmxNLEVBQXNCdkIsRUFBb0IsSUFDbEUsT0FBSXVCLEVBQ0ssNkVBR0YsMkJBQTJCdkIsR0FDcEMsR0NyQ0l6RCxHQUFVLENBQUEsRUFFSG1SLEdBQStCLENBQzFDOW9CLFFBQVMsU0FDVCtvQixRQUFTLENBQUMsTUFDVi9YLFNBQ0UsMkxBQ0YyRyxRQUFVZ04sR0FDREEsRUFDSnFFLG9CQUFvQixDQUFFLGNBQWMsSUFDcENocEIsUUFBUWlwQixJQUNSanBCLFFBQVFrcEIsSUFDUmxwQixRQUFRbXBCLElBQ1JucEIsUUFBUW9wQixJQUNScHBCLFFBQVFxcEIsSUFDUnJwQixRQUFRc3BCLElBQ1J0cEIsUUFBUTJvQixJQUNSM29CLFFBQVF1cEIsSUFDUnZwQixRQUFRcWMsSUFDUnJjLFFBQVF3cEIsSUFDUnhwQixRQUFRMG9CLElBQ1Ixb0IsUUFBUXlwQixJQUNSenBCLFFBQVEwcEIsSUFDUkMsZ0JBQ0FDLFFBQU8sR0FFWnJuQixPQUFBQSxHQUNFLEdBSUUwbUIsR0FBd0YsQ0FDNUZqcEIsUUFBUyxxQkFDVGdSLFNBQVUsNkNBQ1YyRyxHQUNBLGFBQU1wVixDQUFReEosR0FDWixNQUFNOHdCLFFBQW9CQyxHQUF3Qi93QixFQUFNLFVBQ3hELElBQUssTUFBTW9XLFFBQUVBLEtBQWE0YSxHQUFvQyw0QkFBNkJGLFNBQ25GNVYsR0FBYWdILEdBQWNDLGtCQUFrQi9MLEdBQVVBLEVBQVNwVyxFQUUxRSxHQUdJbXdCLEdBQTZGLENBQ2pHbHBCLFFBQVMsMkJBQ1RnUixTQUFVLCtDQUNWMkcsR0FDQSxhQUFNcFYsQ0FBUXhKLEdBQ1osTUFBTTh3QixRQUFvQkMsR0FBd0Ivd0IsRUFBTSxVQUN4RCxJQUFLLE1BQU1vVyxRQUFFQSxLQUFhNGEsR0FBb0Msa0NBQW1DRixHQUMvRkcsR0FBdUI3YSxFQUUzQixHQUdJZ2EsR0FBNkUsQ0FDakZucEIsUUFBUyxTQUNUZ1IsU0FBVSx3REFDVjJHLEdBQ0EsYUFBTXBWLENBQVF4SixHQUNaLE1BQU04d0IsUUFBb0JDLEdBQXdCL3dCLEdBQzVDa3hCLEVBQWlCQyxHQUFzQm54QixHQUM3QyxJQUFLLE1BQU1veEIsSUFBRUEsRUFBR2hiLFFBQUVBLEtBQWE0YSxHQUFvQyxZQUFhRixTQUN4RTVWLEdBQWFtVyxHQUFzQkQsR0FBS2hQLE9BQU9oTSxFQUFTOGEsR0FBaUI5YSxFQUFTcFcsRUFFNUYsR0FHSXF3QixHQUFrRixDQUN0RnBwQixRQUFTLGVBQ1RnUixTQUFVLCtGQUNWMkcsR0FDQSxhQUFNcFYsQ0FBUXhKLEdBQ1osTUFBTTh3QixRQUFvQkMsR0FBd0Ivd0IsRUFBTSxVQUN4RCxJQUFLLE1BQU1vVyxRQUFFQSxLQUFhNGEsR0FBb0Msc0JBQXVCRixTQUM3RTVWLEdBQWFnSCxHQUFjSyxZQUFZbk0sR0FBVUEsRUFBU3BXLEVBRXBFLEdBR0lzd0IsR0FBK0UsQ0FDbkZycEIsUUFBUyxXQUNUZ1IsU0FBVSxtQ0FDVjJHLEdBQ0EsYUFBTXBWLENBQVF4SixHQUNaLE1BQU04d0IsUUFBb0JDLEdBQXdCL3dCLEdBQzVDa3hCLEVBQWlCQyxHQUFzQm54QixHQUM3QyxJQUFLLE1BQU1veEIsSUFBRUEsRUFBR2hiLFFBQUVBLEtBQWE0YSxHQUFvQyxjQUFlRixTQUMxRTVWLEdBQWFtVyxHQUFzQkQsR0FBSzlPLFNBQVNsTSxFQUFTOGEsR0FBaUI5YSxFQUFTcFcsRUFFOUYsR0FHSXV3QixHQUFrRixDQUN0RnRwQixRQUFTLGVBQ1RnUixTQUFVLGtDQUNWMkcsR0FDQSxhQUFNcFYsQ0FBUXhKLEdBQ1osTUFBTTh3QixRQUFvQkMsR0FBd0Ivd0IsRUFBTSxVQUN4RCxJQUFLLE1BQU1vVyxRQUFFQSxLQUFhNGEsR0FBb0Msc0JBQXVCRixTQUM3RTVWLEdBQWFnSCxHQUFjTyxZQUFZck0sR0FBVUEsRUFBU3BXLEVBRXBFLEdBV0k0dkIsR0FBcUYsQ0FDekYzb0IsUUFBUyxVQUNUZ1IsU0FBVSw2Q0FDVjJHLFFBWHFCLElBQ2xCQSxHQUNILG9CQUFxQixDQUNuQmxmLFlBQWEsK0RBQ2JDLEtBQU0sWUFRUixhQUFNNkosQ0FBUXhKLEdBQ1osTUFBTTh3QixRQUFvQkMsR0FBd0Ivd0IsR0FDNUNreEIsRUFBaUJDLEdBQXNCbnhCLEVBQU0sQ0FBQyxzQkFDcEQsSUFBSyxNQUFNb3hCLElBQUVBLEVBQUdoYixRQUFFQSxLQUFhNGEsR0FBb0MsYUFBY0YsR0FBYyxDQUM3RixNQUFNUSxFQUFhRCxHQUFzQkQsU0FDbkNsVyxHQUFhb1csRUFBVzVPLFFBQVF0TSxFQUFTOGEsR0FBaUI5YSxFQUFTcFcsR0FDckV1eEIsR0FBdUJuYixFQUFTcFcsRUFBS3d4QixvQkFDbkNDLEdBQXdCcmIsR0FDMUJ4VSxRQUFRQyxLQUFLc1csRUFBTXVaLE9BQU8sa0NBQWtDdGIsRUFBUXJPLDBDQUU5RG1ULEdBQWFvVyxFQUFXbFAsT0FBT2hNLEVBQVM4YSxHQUFpQjlhLEVBQVNwVyxHQUc5RSxDQUNGLEdBR0YsU0FBU3V4QixHQUF1Qm5iLEVBQWtCb2IsR0FDaEQsT0FBT0EsR0FHVCxTQUF5QnBiLEdBQ3ZCLFFBQVNBLEVBQVEzVyxJQUFJa3lCLFdBQXVDLE1BQTFCdmIsRUFBUTNXLElBQUlreUIsV0FBK0MsVUFBMUJ2YixFQUFRM1csSUFBSWt5QixTQUNqRixDQUw2QkMsQ0FBZ0J4YixFQUM3QyxDQU1BLFNBQVNxYixHQUF3QnJiLEdBQy9CLE9BQU9ELEdBQXFCQyxFQUFTLGFBQ3ZDLENBRUEsTUFBTW9hLEdBQWlGLENBQ3JGdnBCLFFBQVMsY0FDVGdSLFNBQVUsa0NBQ1YyRyxHQUNBLGFBQU1wVixDQUFReEosR0FDWixNQUFNOHdCLFFBQW9CQyxHQUF3Qi93QixHQUM1Q2t4QixFQUFpQkMsR0FBc0JueEIsR0FDN0MsSUFBSyxNQUFNb3hCLElBQUVBLEVBQUdoYixRQUFFQSxLQUFhNGEsR0FBb0MsaUJBQWtCRixTQUM3RTVWLEdBQWFtVyxHQUFzQkQsR0FBS3hPLFdBQVd4TSxFQUFTOGEsR0FBaUI5YSxFQUFTcFcsRUFFaEcsR0FHSXNqQixHQUE0RSxDQUNoRnJjLFFBQVMsUUFDVGdSLFNBQVUsbUJBQ1YyRyxHQUNBLGFBQU1wVixDQUFReEosR0FDWixNQUFNOHdCLFFBQW9CQyxHQUF3Qi93QixHQUM1Q2t4QixFQUFpQkMsR0FBc0JueEIsR0FDN0MsSUFBSyxNQUFNb3hCLElBQUVBLEVBQUdoYixRQUFFQSxLQUFhNGEsR0FBb0MsV0FBWUYsU0FDdkU1VixHQUFhbVcsR0FBc0JELEdBQUtqbUIsTUFBTWlMLEVBQVM4YSxHQUFpQjlhLEVBQVNwVyxHQUd6RixHQUEyQixTQUF2QlcsUUFBUWxCLElBQUlxQixPQUFtQixDQUNqQ0gsUUFBUWxCLElBQUlxQixPQUFTLE9BQ3JCLElBQUssTUFBTXN3QixJQUFFQSxFQUFHaGIsUUFBRUEsS0FBYTRhLEdBQzdCLDZCQUNNRCxHQUF3Qi93QixVQUV4QmtiLEdBQWFtVyxHQUFzQkQsR0FBS2ptQixNQUFNaUwsRUFBUzhhLEdBQWlCOWEsRUFBU3BXLEVBRTNGLENBQ0YsR0FXSXl3QixHQUFxRixDQUN6RnhwQixRQUFTLFVBQ1RnUixTQUFVLHNDQUNWMkcsUUFYcUIsSUFDbEJBLEdBQ0huQyxPQUFRLENBQ04vYyxZQUFhLG9GQUNiQyxLQUFNLFdBUVIsYUFBTTZKLENBQVF4SixHQUNaLE1BQU04d0IsUUFBb0JDLEdBQXdCL3dCLEVBQU0sVUFDeEQsSUFBSyxNQUFNb1csUUFBRUEsS0FBYTRhLEdBQW9DLGlCQUFrQkYsR0FBYyxDQUM1RixNQUFNclUsRUFDSnpjLEVBQUt5YyxTQUFXckcsRUFBUS9DLFlBQVltQixjQUFjMEksTUFBUSxzQkFBd0IsaUNBQzlFaEMsR0FBYWdILEdBQWNxQixRQUFRbk4sRUFBU3FHLEdBQVNyRyxFQUFTcFcsRUFDdEUsQ0FDRixHQVlJMnZCLEdBQStFLENBQ25GMW9CLFFBQVMsT0FDVGdSLFNBQVUsNkJBQ1YyRyxRQVprQixJQUNmQSxHQUNIbUksS0FBTSxDQUNKam5CLE1BQU8sSUFDUEosWUFBYSwyQkFDYkMsS0FBTSxXQVFSLGFBQU02SixDQUFReEosR0FDWixNQUFNOHdCLFFBQW9CQyxHQUF3Qi93QixHQUNsRCxJQUFLLE1BQU1veEIsSUFBRUEsRUFBR2hiLFFBQUVBLEtBQWE0YSxHQUFvQyxVQUFXRixTQUN0RTVWLEdBQWFtVyxHQUFzQkQsR0FBS3pPLEtBQUt2TSxFQUFTcFcsRUFBSyttQixNQUFPM1EsRUFBU3BXLEVBRXJGLEdBZUkwd0IsR0FBbUYsQ0FDdkZ6cEIsUUFBUywwQkFDVGdSLFNBQVUsdUJBQ1YyRyxRQWZvQixJQUNqQkEsR0FDSCxpQkFBa0IsQ0FDaEJsZixZQUFhLDhCQUNiQyxLQUFNLFVBRVJreUIsU0FBVSxDQUNSbnlCLFlBQWEsZ0ZBQ2JDLEtBQU0sWUFRUixhQUFNNkosQ0FBUXhKLEdBQ1osR0FBSUEsRUFBSzZ4QixVQUFZN3hCLEVBQUs0akIsWUFDeEIsTUFBTSxJQUFJNWYsTUFBTSw0REFHbEIsTUFBTThzQixRQUFvQkMsR0FBd0Ivd0IsR0FDNUNreEIsRUFBaUJDLEdBQXNCbnhCLEVBQU0sQ0FBQyxpQkFBa0IsYUFDdEUsSUFBSyxNQUFNb3hCLElBQUVBLEVBQUdoYixRQUFFQSxLQUFhNGEsR0FBb0MsWUFBYUYsR0FBYyxDQUM1RixNQUFNbE4sRUFBYzVqQixFQUFLNnhCLFNBQ3JCemIsRUFBUS9DLFlBQVltQixjQUFjMEksTUFDaEMsc0JBQ0EsMEJBQ0ZsZCxFQUFLNGpCLGFBQWFyakIsaUJBQ2hCMmEsR0FBYW1XLEdBQXNCRCxHQUFLek4sT0FBT3ZOLEVBQVN3TixFQUFhc04sR0FBaUI5YSxFQUFTcFcsRUFDdkcsQ0FDRixHQUtJMndCLEdBQTRGLENBQ2hHMXBCLFFBQVMsY0FDVGdSLFNBQ0Usc0hBQ0YyRyxRQU40QixDQUFFaGMsS0FBTSxDQUFFakQsS0FBTSxVQU81QyxhQUFNNkosQ0FBUXhKLEdBQ1osTUFBTTh3QixRQUFvQkMsR0FBd0Ivd0IsR0FHNUM4eEIsRUFBYyxFQUZKOXhCLEVBQUs0QyxNQUFNMUIsS0FBSyxNQUFRLElBQUk2d0IsVUFDckJaLEdBQXNCbnhCLEVBQU0sQ0FBQyxVQUNQd0IsT0FBT3NhLFNBQVM1YSxLQUFLLEtBQ2xFLElBQUssTUFBTWt3QixJQUFFQSxFQUFHaGIsUUFBRUEsS0FBYTRhLEdBQW9DLE1BQU1jLElBQWVoQixHQUFjLENBQ3BHLE1BQU03cEIsRUFBa0IsV0FBUm1xQixFQUFtQixVQUFVVSxJQUFnQixvQkFBb0JBLFVBQzNFNVcsR0FBYWpVLEVBQVNtUCxFQUFTcFcsRUFDdkMsQ0FDRixHQUdGLFNBQVNpeEIsR0FBdUI3YSxHQUM5QixNQUNNeUwsRUFBUyxHQURDekwsRUFBUS9DLFlBQVltQixjQUFjMEksTUFBUSxLQUFPLDhCQUUzRDhVLEVBQWtCLENBQ3RCQyxvQ0FBcUM3YixFQUFRM1csSUFBSXd5QixvQ0FDakRDLHFDQUFzQzliLEVBQVEzVyxJQUFJeXlCLHFDQUNsREMsdUNBQXdDL2IsRUFBUTNXLElBQUkweUIsdUNBQ3BEQywyQ0FBNENoYyxFQUFRM1csSUFBSTJ5Qiw0Q0FFcERDLEVBQWlCbHdCLE9BQU9DLFFBQVE0dkIsR0FDbkN4d0IsT0FBTyxFQUFDLENBQUdVLE1BQVlBLEdBQ3ZCL0IsSUFBSSxFQUFFOEIsS0FBU0EsR0FDbEIsR0FBSW93QixFQUFlcnhCLE9BQVMsRUFDMUIsTUFBTSxJQUFJZ0QsTUFBTSxpREFBaURxdUIsRUFBZW54QixLQUFLLFNBR3ZGLE1BQU1veEIsRUFBZ0QsWUFBdkJsYyxFQUFRM1csSUFBSXFCLE9BQXVCLEtBQU8sS0FDbkV5eEIsRUFBbUIsbUJBQ2YxUSwrR0FLY21RLEVBQWdCQywrRUFDMUJELEVBQWdCRSw4REFDVEYsRUFBZ0JHLG9FQUNaSCxFQUFnQkksaU1BR1RFLCtCQUkxQi9jLEVBQWEsc0JBQ25CLElBQ0VsVSxFQUFHbXhCLGNBQWNqZCxFQUFZZ2QsR0FDN0Izd0IsUUFBUUMsS0FBSyxhQUFhMFQsSUFDNUIsQ0FBRSxNQUFPclMsR0FDUCxNQUFNdXZCLEVBQVN2dkIsYUFBaUJjLE1BQVFkLEVBQU02TSxRQUFVekssT0FBT3BDLEdBQy9ELE1BQU0sSUFBSWMsTUFBTSxtQkFBbUJ1UixNQUFla2QsSUFBVSxDQUMxRHhpQixNQUFPL00sR0FFWCxDQUNGLENBT0E4RSxlQUFlK29CLEdBQXdCL3dCLEVBQXdCb3hCLEdBQzdELE1BQU1wYSxRQUFpQlYsR0FBdUJ0VyxHQUN6Q2dYLElBQ0hwVixRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUksc0JBQ3hCelgsUUFBUWlkLEtBQUssSUFHZixNQUFNOFUsRUFBVzFiLEVBQVNyUixZQUN2QnhGLElBQUtpVyxHQUFhQSxFQUFROUIsWUFBYyxDQUFFOEIsVUFBU2diLElBQUtoYixFQUFROUIsa0JBQWdCdlQsR0FDaEZTLE9BQVE0VSxNQUE2Q0EsR0FBYWdiLEdBQU9oYixFQUFRZ2IsTUFBUUEsSUFLNUYsT0FKd0IsSUFBcEJzQixFQUFTMXhCLFNBQ1hZLFFBQVFzQixNQUFNaVYsRUFBTUMsSUFBSWdaLEVBQU0sTUFBTUEsbUJBQXVCLDZDQUMzRHp3QixRQUFRaWQsS0FBSyxJQUVSOFUsQ0FDVCxDQUVBLFNBQVNyQixHQUFzQkQsR0FDN0IsTUFBZSxXQUFSQSxFQUFtQmxQLEdBQWdCdU4sRUFDNUMsQ0FFQSxTQUFVdUIsR0FDUmhFLEVBQ0FoVyxHQUVBLE1BQU0yYixFQUFzQixJQUFJcHVCLElBQUl5UyxFQUFTN1csSUFBS2lXLEdBQVksQ0FBQ0EsRUFBUUEsUUFBU0EsS0FDaEYsSUFBSyxNQUFNQSxLQUFXMlcsR0FDcEJDLEVBQ0FoVyxFQUFTN1csSUFBSSxFQUFHaVcsYUFBY0EsSUFDN0IsQ0FDRCxNQUFNd2MsRUFBYUQsRUFBb0JqdUIsSUFBSTBSLEdBQzNDLElBQUt3YyxFQUFZLE1BQU0sSUFBSTV1QixNQUFNLHFDQUFxQ29TLEVBQVFyTyxlQUV4RTZxQixDQUNSLENBQ0YsQ0FLTyxTQUFTekIsR0FBc0JueEIsRUFBK0I2eUIsRUFBeUIsSUFDNUYsTUFBTTNCLEVBQTJCLEdBRzNCNEIsRUFBbUIzd0IsT0FBT0gsS0FBS21jLElBQy9CNFUsRUFBc0I1d0IsT0FBT3dPLE9BQU93TixJQUN2QzVjLFFBQVN5eEIsR0FDSixVQUFXQSxFQUNOdnZCLE1BQU1DLFFBQVFzdkIsRUFBT2x6QixPQUFTa3pCLEVBQU9sekIsTUFBUSxDQUFDa3pCLEVBQU9sekIsT0FFdkQsSUFFUkssSUFBSW1GLFFBRUQydEIsRUFBa0IsSUFBSXZpQixJQUFJLElBQzNCbWlCLEtBQ0FDLEtBQ0FDLEVBRUgsS0FDQSxJQUNBLE9BR0YsSUFBSyxNQUFPOXdCLEVBQUtDLEtBQVVDLE9BQU9DLFFBQVFwQyxHQUN4QyxJQUFLaXpCLEVBQWdCN1osSUFBSW5YLEdBQU0sQ0FHN0IsTUFBTWl4QixFQUFlanhCLEVBQUkwSSxXQUFXLFNBQVd3WixHQUFVLElBQUlBLEVBQU1nUCxpQkFDbkUsR0FBSUQsSUFBaUJqeEIsUUFBOEJsQixJQUF2QmYsRUFBS2t6QixHQUMvQixTQUlGLEdBQXFCLGtCQUFWaHhCLEdBQXVCQSxFQUNoQ2d2QixFQUFlandCLEtBQUssS0FBS2dCLFVBR3RCLEdBQXFCLGlCQUFWQyxHQUF1QyxpQkFBVkEsRUFDM0NndkIsRUFBZWp3QixLQUFLLEtBQUtnQixJQUFPcUQsT0FBT3BELFNBR3BDLEdBQUl1QixNQUFNQyxRQUFReEIsR0FDckIsSUFBSyxNQUFNcWMsS0FBUXJjLEVBQ2pCZ3ZCLEVBQWVqd0IsS0FBSyxLQUFLZ0IsSUFBT3FELE9BQU9pWixHQUc3QyxDQUdGLE1BQU02VSxFQUFrQjN2QixNQUFNQyxRQUFRMUQsRUFBSyxPQUFTQSxFQUFLLE1BQU1HLElBQUltRixRQUFVLEdBQzdFLE9BQU84ZixHQUFrQixJQUFJOEwsS0FBbUJrQyxHQUNsRCxDQzdhQSxNQW9CYUMsR0FHVCxDQUNGcHNCLFFBQVMsNEJBQ1RnUixTQUFVLG9EQXpCSSxDQUNkcWIsTUFBTyxDQUNMNXpCLFlBQWEsd0JBQ2JDLEtBQU0sU0FDTkcsTUFBTyxJQUNQRixRQUFTLElBc0JYLGFBQU00SixDQUFReEosR0FDWixNQUFNb1csRUFBVUYsR0FBZ0JsVyxHQUMzQm9XLElBQ0h4VSxRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUksc0JBQ3hCelgsUUFBUWlkLEtBQUssSUFHZixNQUFNMlYsRUFBYSxDQUFDdnpCLEVBQUtpSCxXQUFhakgsRUFBSzRDLE1BQVEsTUFBUTVDLEVBQUtpUCxFQUFFd0MsTUFBTSxJQUFJalEsT0FBT3NhLFNBQ25GLElBQUkwWCxFQUFhLEVBQ2pCLElBQUssSUFBSTFvQixFQUFJLEVBQUdBLEVBQUk5SyxFQUFLc3pCLE1BQU94b0IsSUFhOUIsR0FaSUEsRUFBSSxHQUNObEosUUFBUUMsS0FBSyxLQUFLc1csRUFBTXVaLE9BQU8sSUFBSTVtQixlQUFleW9CLEVBQVdyeUIsS0FBSyxXQUdwRXN5QixRQUFtQnRZLEdBQWFxWSxFQUFXcnlCLEtBQUssS0FBTWtWLEVBQVNwVyxFQUFNLENBQ25FaWIsY0FBYyxFQUNkMEIsU0FBVzFYLElBQ0xBLEdBQ0Z0RSxRQUFRaWQsS0FBSyxNQUlBLElBQWY0VixFQUFrQixPQUV4Qjd5QixRQUFRaWQsS0FBSzRWLEVBQ2YsR0MzQ1dDLEdBQTRFLENBQ3ZGeHNCLFFBQVMsUUFDVGdSLFNBQVUsaUVBSkksQ0FBQSxFQU1kLGFBQU16TyxDQUFReEosU0FNVGdJLGVBQ0xoSSxFQUNBa1ksR0FFQSxNQUFNbEIsUUFBaUJWLEdBQXVCdFcsR0FBTSxFQUFPa1ksR0FDdERsQixJQUNIcFYsUUFBUXNCLE1BQU1pVixFQUFNQyxJQUFJLHNCQUN4QnpYLFFBQVFpZCxLQUFLLElBR2YsSUFBSyxNQUFNeEgsS0FBVzJXLEdBQXlCLFFBQVMvVixFQUFTclIsYUFBYyxDQUM3RSxNQUFNK3RCLFFBQWdCcnlCLEVBQUc2c0IsUUFBUTlYLEVBQVE3RCxRQUFTLENBQUU0YixlQUFlLElBQ25FLEdBQUkvWCxJQUFZWSxFQUFTUCxLQUFNLENBQzdCLEdBQXNCLFdBQWxCa2QsRUFBR3Z1QixXQUF5QixDQUM5QixNQUFNd3VCLEVBQVcsQ0FBQyxnQkFDWmhYLEdBQXVCLGdCQUFnQmdYLEVBQVMxeUIsS0FBSyxPQUFRa1YsRUFBU3BXLEVBQzlFLENBRUkwekIsRUFBUXpnQixLQUFNeEcsR0FBTUEsRUFBRTJoQixVQUFZM2hCLEVBQUUxRSxLQUFLMkwsU0FBUyxvQkFDOUN3SCxHQUFhLGVBQWdCOUUsRUFBU3BXLEVBQU0sQ0FBRWliLGNBQWMsR0FFdEUsQ0FFQSxHQUFJeVksRUFBUXpnQixLQUFNeEcsR0FBTUEsRUFBRTJoQixVQUF1QixtQkFBWDNoQixFQUFFMUUsTUFBNEIsT0FDNUQ2VSxHQUF1Qiw0Q0FBNkN4RyxFQUFTcFcsR0FDbkYsT0FBU2lrQixHQUFXakwsRUFBY0MsU0FBUyx1QkFBdUIxWSxXQUFXOEMsT0FBTzJDLE1BQU0sYUFDcEY0VyxHQUF1QixrQkFBa0JxSCxJQUFXN04sRUFBU3BXLFNBQzdEOGEsR0FBWStZLG1CQUNaM1ksR0FBYSx1Q0FBd0M5RSxFQUFTcFcsU0FDOURrYixHQUFhLHdCQUF5QjlFLEVBQVNwVyxFQUN2RCxDQUdHb1csSUFBWVksRUFBU1AsTUFBU08sRUFBU1AsS0FBS3BELFlBQVlHLFVBQVUsY0FDbkU0QyxFQUFRL0MsWUFBWUcsVUFBVSxtQkFFeEIwSCxHQUFhLEdBQUduRCxjQUFrQzNCLEVBQVNwVyxFQUVyRSxDQUVBLE1BQU1vVyxFQUFVWSxFQUFTclIsWUFBWW1RLEtBQU0vSSxHQUFNQSxFQUFFc0csWUFBWXFCLGlCQUFpQm9mLFlBQzVFMWQsU0FDSThFLEdBQWEsR0FBR25ELG9DQUF3RDNCLEVBQVNwVyxFQUUzRixDQWpEVSt6QixDQUFNL3pCLEVBQ2QsR0NtQkssU0FBU2cwQixHQUFVaDBCLEdBQ3hCLE9BQVFBLEVBQTZCcUUsT0FBUyxlQUFpQixFQUNqRSxDQ0dPLE1BQU00dkIsR0FBZ0IsSUFyQzdCLE1BQ0VDLFVBQUFBLENBQVc5ZCxFQUFrQjZOLEdBRTNCLE1BQU0zRyxFQUFTbEgsRUFBUVosa0JBQWtCaEMsVUFBVSx3QkFDL0Msb0NBQ0EsR0FDRTJnQixFQUF5Qi9kLEVBQVEzVyxJQUFJMjBCLGFBQ3ZDLHNEQUNBLEdBQ0osTUFBTyxNQUFNL3pCLEVBQUtxQyxRQUFRMFQsRUFBUXhDLFNBQVMsMEJBQ3RDMEosc0ZBQ2lDbEgsRUFBUXJDLG1JQUVyQnFDLEVBQVEzVyxJQUFJcUIsMENBQ1JtakIsSUFBVWtRLEtBQ3pDLENBRUFFLFlBQUFBLENBQWFqZSxFQUFrQmlNLEVBQW9CLEdBQUlpUyxFQUFpQixJQUN0RSxNQUFPLEdBQUd4c0IsS0FBS3lzQixLQUFLbmUsU0FBZXRPLEtBQUt3RCxNQUFNOEssRUFBU2lNLEVBQW1CaVMsSUFDNUUsQ0FFQWhwQixLQUFBQSxDQUFNOEssRUFBa0JpTSxFQUFvQixHQUFJaVMsRUFBaUIsS1YwQzVELFNBQXlCblosRUFBZ0IvRSxHQUM5QyxNQUFNMlUsRUFBV0EsS0FDZixHQUFJWCxHQUFPaFIsSUFBSStCLEdBQVMsT0FFeEJpUCxHQUFPeFosSUFBSXVLLEdBQ1hLLEdBQVdMLEVBQVEvRSxHQUNuQixNQUFNalQsT0FBRUEsR0FBV0osRUFBVW9ZLEVBQVEsQ0FBRWxiLElBQUttVyxFQUFRN0QsUUFBU3FJLE9BQU8sRUFBTTNYLE1BQU8sWUFDakYwWSxHQUE2QlIsRUFBUWhZLEVBQVEsS0FFL0MsSUFBSyxNQUFNOEIsSUFBVSxDQUFDLGFBQWMsU0FBVSxVQUFXLFdBQ3ZEdEUsUUFBUWdJLEdBQUcxRCxFQUFROGxCLEVBRXZCLENVckRJeUosQ0FBZ0Ixc0IsS0FBS3lzQixLQUFLbmUsR0FBVUEsR0FHcEMsTUFBTyxtQkFGYWtlLEVBQWU1Z0IsU0FBUyxhQUVKLE9BQVMsS0FEckIwQyxFQUFRM1csSUFBSTIwQixhQUFlLHNCQUF3QixlQUNPaGUsRUFBUTNXLElBQUlrbEIsb0JBQW9Cdk8sRUFBUXJDLG1CQUFtQnNPLEtBQXFCak0sRUFBUXJDLG1CQUFtQnVnQixHQUNuTSxDQUVBQyxJQUFBQSxDQUFLbmUsR0FDSCxNQUFPLHdEQUF3REEsRUFBUXJDLGdDQUN6RSxDQUVBa00sT0FBQUEsR0FDRSxNQUFPLG1EQUNULEdDckJLLE1BQWV3VSxHQUVWN3NCLFdBQUFBLENBQVk4c0IsR0FDcEI1c0IsS0FBSzRzQixxQkFBdUJBLENBQzlCLENBRUFDLFdBQUFBLENBQVl2ZSxFQUFrQjZOLEdBQzVCLE9BQU9nUSxHQUFjQyxXQUFXOWQsRUFBUzZOLEVBQzNDLENBR0EsY0FBTTJRLENBQVN4ZSxFQUFrQnBXLEdBRS9CLGFBRE00cUIsR0FBd0J4VSxFQUFRM1csSUFBSWtsQixLQUFNdk8sR0FDM0N0TyxLQUFLNHNCLHFCQUVIdFAsR0FBa0IsQ0FDdkIsT0FDQSxLQUNBLGtCQUNHaEgsR0FBeUJwZSxHQUM1Qix3QkFDQThILEtBQUsrc0Isa0JBQWtCemUsRUFBU3BXLEdBQ2hDOEgsS0FBS2d0QixlQUFlMWUsS0FUaUJ0TyxLQUFLK3NCLGtCQUFrQnplLEVBQVNwVyxFQVd6RSxDQUNBLHFCQUFNKzBCLENBQWdCM2UsRUFBa0JwVyxHQUV0QyxhQURNNHFCLEdBQXdCeFUsRUFBUTNXLElBQUlrbEIsS0FBTXZPLEdBQzNDdE8sS0FBSzRzQixxQkFFSHRQLEdBQWtCLENBQ3ZCLE9BQ0EsS0FDQSxrQkFDR2hILEdBQXlCcGUsR0FDNUIsd0JBQ0E4SCxLQUFLa3RCLHlCQUF5QjVlLEVBQVNwVyxHQUN2QzhILEtBQUtndEIsZUFBZTFlLEtBVGlCdE8sS0FBS2t0Qix5QkFBeUI1ZSxFQUFTcFcsRUFXaEYsQ0FDQSxlQUFNaTFCLENBQVU3ZSxFQUFrQnBXLEdBRWhDLGFBRE00cUIsR0FBd0J4VSxFQUFRM1csSUFBSWtsQixLQUFNdk8sR0FDekN0TyxLQUFLa3RCLHlCQUF5QjVlLEVBQVNwVyxFQUNoRCxDQUNBLGlCQUFNazFCLENBQVk5ZSxFQUFrQnBXLEdBRWxDLGFBRE00cUIsR0FBd0J4VSxFQUFRM1csSUFBSWtsQixLQUFNdk8sR0FDM0N0TyxLQUFLNHNCLHFCQUtILEdBQUc1c0IsS0FBSzZzQixZQUFZdmUsRUFBUyw0QkFDN0JnUCxHQUFrQixDQUNyQixPQUNBLEtBQ0Esa0JBQ0doSCxHQUF5QnBlLEdBQzVCLHdCQUNBaTBCLEdBQWNJLGFBQWFqZSxFQUFTcFcsRUFBS20xQiw2QkFBK0IsR0FBSW4xQixFQUFLbzFCLG9CQUFzQixJQUN2R3R0QixLQUFLZ3RCLGVBQWUxZSxPQVpmLEdBQUd0TyxLQUFLNnNCLFlBQVl2ZSxFQUFTLDRCQUMvQjZkLEdBQWNJLGFBQWFqZSxFQUFTcFcsRUFBS20xQiw2QkFBK0IsR0FBSW4xQixFQUFLbzFCLG9CQUFzQixLQWFoSCxDQUdVSix3QkFBQUEsQ0FBeUI1ZSxFQUFrQnBXLEdBQ25ELE1BQU1xMUIsRUFxSVYsU0FBNkNqZixHQUMzQyxJQUNFLE9BQU9BLEVBQVF4QyxTQUFTLDhCQUMxQixDQUFFLE1BQ0EsTUFDRixDQUNGLENBM0lrQzBoQixDQUFvQ2xmLEdBQ2xFLEdBQUlpZixFQUNGLE9BQU92dEIsS0FBS3l0Qix1QkFBdUJuZixFQUFTcFcsRUFBTSxDQUNoRG9XLEVBQVE3QyxhQUNSLEdBQUc2UixHQUFrQixDQUFDLE9BQVFpUSxPQUEyQnIxQixFQUFLbzFCLG9CQUFzQixLQUFLL3hCLFNBSTdGLE1BQU1teUIsRUFxSVYsU0FBaUNwZixHQUMvQixJQUNFLE9BQU9BLEVBQVF4QyxTQUFTLHVCQUMxQixDQUFFLE1BQ0EsTUFDRixDQUNGLENBM0lnQzZoQixDQUF3QnJmLEdBQzlDMkksRUFBV3lXLEVBQ2IsQ0FBQ3BmLEVBQVE3QyxhQUFjLHNDQUFzQ2lpQixLQUM3RDF0QixLQUFLNHRCLG9DQUFvQ3RmLEVBQVNwVyxHQUV0RCxPQUFPOEgsS0FBS3l0Qix1QkFBdUJuZixFQUFTcFcsRUFBTStlLEVBQ3BELENBRVUyVyxtQ0FBQUEsQ0FBb0N0ZixFQUFrQnBXLEdBQzlELE1BQU8sQ0FDTG9XLEVBQVE3QyxhQUNSLEdBQUc2QyxFQUFRMUQsZUFBaUIsTUFBUSx3QkFBd0IxUyxFQUFLbzFCLG9CQUFzQixLQUFLL3hCLE9BRWhHLENBRVVreUIsc0JBQUFBLENBQXVCbmYsRUFBa0JwVyxFQUFrQitlLEdBS25FLE1BQU8sSUFKbUIsSUFDcEIzSSxFQUFRakMsVUFBWSxDQUFDK04sR0FBY1EsUUFBUXRNLElBQVksTUFDdkRBLEVBQVEvQixXQUFhLENBQUNvYixHQUFlSSxnQkFBZ0J6WixJQUFZLElBRTFDN1UsUUFBU28wQixHQUFRQSxFQUFJM3ZCLE1BQU0sVUFBVytZLEdBQ2hFdmQsT0FBT3NhLFNBQ1AzYixJQUFLdzFCLEdBQVEsR0FBR0EsS0FBTzNCLEdBQVVoMEIsS0FBUXFELFFBQ3pDbkMsS0FBSyxPQUNWLENBSUEwMEIsVUFBQUEsQ0FBV3hmLEVBQWtCcFcsRUFBZ0JrSCxHQUMzQyxPQUFPWSxLQUFLK3RCLGlCQUFpQnpmLEVBQVNwVyxFQUFNOEgsS0FBSytzQixrQkFBa0J6ZSxFQUFTcFcsR0FBT2tILEVBQ3JGLENBQ0E0dUIsaUJBQUFBLENBQWtCMWYsRUFBa0JwVyxFQUFnQmtILEdBQ2xELE9BQU9ZLEtBQUsrdEIsaUJBQWlCemYsRUFBU3BXLEVBQU04SCxLQUFLa3RCLHlCQUF5QjVlLEVBQVNwVyxHQUFPa0gsRUFDNUYsQ0FDQTZ1QixhQUFBQSxDQUFjM2YsRUFBa0JwVyxFQUFnQmtILEdBQzlDLE9BQU9ZLEtBQUsrdEIsaUJBQWlCemYsRUFBU3BXLEVBQU1pMEIsR0FBY0ksYUFBYWplLEdBQVVsUCxFQUNuRixDQUNBLGVBQU04dUIsQ0FBVTVmLEVBQWtCcFcsR0FHaEMsYUFGTTRxQixHQUF3QnhVLEVBQVEzVyxJQUFJa2xCLEtBQU12TyxHQUV6QyxHYmxJcUNyTyxFYWtJRixXYmxJZ0I3RixFYWtJSixHYmpJakQsR0FBRzZGLEtBQVF1ZCxHQUFvQnBqQixRYWlJeUJrakIsR0FBa0IsQ0FDN0UsT0FDQSxLQUNBLGtCQUNHaEgsR0FBeUJwZSxHQUM1QixnQkFDQSxZQUNBLFFBQ0E4SCxLQUFLK3NCLGtCQUFrQnplLEVBQVNwVyxHQUNoQzhILEtBQUttdUIsUUFBUTdmLE9iM0laLElBQXlDck8sRUFBYzdGLENhNkk1RCxDQUVBLHNCQUFNMnpCLENBQ0p6ZixFQUNBcFcsRUFDQWsyQixHQUNBQyx3QkFBRUEsRUFBMEIsR0FBRUMsZUFBRUEsRUFBaUIsQ0FBQyxPQUFRLGVBRTFELE1BQU14UixRQUFhZ0csR0FBd0J4VSxFQUFRM1csSUFBSWtsQixLQUFNdk8sR0FDdkQwRCxFQUFTMUQsRUFBUS9DLFlBQVlHLFVBQVUsdUJBQXlCLCtCQUFpQyxHQUNqRzZpQixFQWdGVixTQUNFRCxFQUNBck0sRUFDQXVNLEVBQ0FILEVBQW9DLElBRXBDLE1BQU1JLEVBQU8sQ0FBQyxNQUFPLGNBQ2ZDLEVBQW9Cek0sR0FBUzVwQixJQUFJbUYsUUFDdkMsR0FBMEIsU0FBdEI4d0IsRUFBZSxLQUFrQkksR0FBbUJ4MUIsT0FDdEQsT0FBT3kxQixHQUEyQixJQUFJRixLQUFTSCxLQUFtQkQsR0FBMEJHLEdBRzlGLE1BQU1JLEVBQU9OLEVBQWUza0IsTUFBTSxHQUM1QmtsQixFQUF3QkMsR0FBb0NGLEdBQzVERyxFQUM2QixJQUFqQ0YsRUFBc0IzMUIsT0FBZTAxQixFQUFPQSxFQUFLbDFCLE9BQU8sQ0FBQ3lOLEVBQUd6SSxLQUFXbXdCLEVBQXNCampCLFNBQVNsTixJQUN4RyxPQUFPaXdCLEdBQ0wsSUFBSUYsRUFBTSxVQUFXQyxLQUFzQkssS0FBOEJWLEdBQ3pFRyxFQUVKLENBcEc4QlEsQ0FBdUJWLEVBQWdCcDJCLEVBQUsrcEIsUUFBUy9wQixFQUFLczJCLEtBQU1ILEdBQzFGLE9BQUkvZixFQUFRZixpQ0FDSCxHQUFHZ2hCLElBQW9CdmMsSUFHekJzTCxHQUFrQixDQUN2QixPQUNBLEtBQ0Esa0JBQ0doSCxHQUF5QnBlLEdBQzVCLGdCQUNBLFlBQ0EsUUFDQSxHQUFHazJCLGNBQ0gsa0RBQWtEdFIsaUJBQzNDeVIsSUFBb0J2YyxLQUUvQixDQUdBaWQsUUFBQUEsQ0FBUzNnQixFQUFrQnBXLEdBQ3pCLE1BQU0rcEIsRUFBVS9wQixFQUFLK3BCLFNBQVM1cEIsSUFBSW1GLFFBQ2xDLE9BQUk4USxFQUFRN0IsVUFFSDZRLEdBQWtCLENBQ3ZCLE9BQ0EsU0FDQSxTQUNJMkUsR0FBUy9vQixPQUFTK29CLEVBQVUsQ0FBQyxjQUNqQyxvQkFDQSxjQUNBLG1CQUNJL3BCLEVBQUtzMkIsS0FBTyxDQUFDLFlBQWMsS0FFeEJsZ0IsRUFBUTFELGVBQ1YwUyxHQUFrQixDQUN2QixNQUNBLFVBQ0kyRSxHQUFTL29CLE9BQVMrb0IsRUFBVSxDQUFDLGlCQUM3Qi9wQixFQUFLczJCLEtBQU8sQ0FBQyxVQUFZLEtBRzFCLGtCQUNULENBRVVMLE9BQUFBLENBQVE3ZixHQUNoQixNQUFNd08sRUFBT3hPLEVBQVEzVyxJQUFJa2xCLEtBQ3pCLE1BQU8seUNBQXlDQyx5RUFDSUEsMEVBQ0NBLDBFQUNBQSwwRUFDQUEsMEVBQ0FBLDJFQUNDQSxHQUN4RCxDQUVVa1EsY0FBQUEsQ0FBZTFlLEdBQ3ZCLE1BQU13TyxFQUFPeE8sRUFBUTNXLElBQUlrbEIsS0FDekIsTUFBTyxHQUFHN2MsS0FBS211QixRQUNiN2Ysc0NBQ21Dd08sNENBQStDQSxHQUN0RixFQXlDRixTQUFTNlIsR0FBMkJPLEVBQXVCVixHQUN6RCxNQUFNVyxFQUFrQkQsRUFBWUUsUUFBUSxjQUN0Q0MsR0FBOEMsSUFBcEJGLEdBQStELFNBQXJDRCxFQUFZQyxFQUFrQixHQUN4RixPQUFLWCxHQUFTYSxFQUdWSCxFQUFZL2pCLEtBQU1vUyxHQUFnQixtQkFBUkEsR0FBNEJBLEVBQUkvUixXQUFXLG9CQUNoRThSLEdBQWtCNFIsR0FFcEI1UixHQUFrQixJQUFJNFIsRUFBYSxxQkFMakM1UixHQUFrQjRSLEVBTTdCLENBRU8sU0FBU0osR0FBb0NoMEIsR0FDbEQsSUFBSXcwQixFQUNKLE1BQU1DLEVBQTBCLEdBRWhDLElBQUssTUFBTzd3QixFQUFPNmUsS0FBUXppQixFQUFLUixVQUFXLENBQ3pDLEdBQUlnMUIsRUFBa0IsQ0FDcEIsR0FBeUIsYUFBckJBLElBQW9DL1IsRUFBSS9SLFdBQVcsS0FBTSxDQUMzRDhqQixPQUFtQnIyQixFQUNuQixRQUNGLENBQ0FxMkIsT0FBbUJyMkIsQ0FDckIsQ0FFQSxHQUFZLE9BQVJza0IsRUFDRixNQUFPLElBQUlnUyxLQUFrQnowQixFQUFLNk8sTUFBTWpMLEVBQVEsR0FBR3JHLElBQUksQ0FBQzhPLEVBQUdxb0IsSUFBVzl3QixFQUFRLEVBQUk4d0IsSUFFcEYsR0FBSWpTLEVBQUkvUixXQUFXLE1BQW5CLENBQ0UsR0FBSStSLEVBQUkzUixTQUFTLEtBQU0sU0FDbkI2akIsR0FBNkNuZSxJQUFJaU0sR0FDbkQrUixFQUFtQixXQUNWSSxHQUE2Q3BlLElBQUlpTSxLQUMxRCtSLEVBQW1CLFdBR3ZCLEtBUkEsQ0FTQSxHQUFJL1IsRUFBSS9SLFdBQVcsTUFBZ0IsTUFBUitSLEVBQWEsQ0FDdEMsTUFBTW9TLEVBQWNwUyxFQUFJNVQsTUFBTSxFQUFHLEdBQ2QsSUFBZjRULEVBQUlya0IsUUFBZ0IwMkIsR0FBbUR0ZSxJQUFJcWUsS0FDN0VMLEVBQW1CLFlBRXJCLFFBQ0YsQ0FDQUMsRUFBY3AyQixLQUFLdUYsRUFSbkIsQ0FTRixDQUVBLE9BQU82d0IsQ0FDVCxDQUVBLE1BQU1FLEdBQStDLElBQUk3bUIsSUFBSSxDQUMzRCxZQUNBLFdBQ0EsU0FDQSxnQkFDQSxtQkFDQSxpQkFDQSxXQUNBLFlBQ0EsZ0JBQ0EsYUFDQSxZQUNBLFVBQ0EsY0FDQSxxQkFDQSxZQUNBLFVBQ0EsYUFDQSxZQUNBLFlBQ0EsYUFDQSxjQUdJOG1CLEdBQStDLElBQUk5bUIsSUFBSSxDQUMzRCxpQkFDQSxxQkFDQSwyQkFHSWduQixHQUFxRCxJQUFJaG5CLElBQUksQ0FBQyxLQUFNLEtBQU0sT0M5VHpFLE1BQU1pbkIsR0FBZSxJQVY1QixjQUEyQmxELEdBQ3pCN3NCLFdBQUFBLEdBQ0VDLE9BQU0sRUFDUixDQUVtQmd0QixpQkFBQUEsQ0FBa0I1bEIsRUFBWWpQLEdBQy9DLE1BQU8sYUFBYUEsRUFBS28xQixvQkFBc0IsSUFDakQsR0NtQ0ssTUFBTXdDLEdBQW9CLElBdENqQyxjQUFnQ25ELEdBQzlCN3NCLFdBQUFBLEdBQ0VDLE9BQU0sRUFDUixDQUVtQmd0QixpQkFBQUEsQ0FBa0I1bEIsRUFBWWpQLEdBQy9DLE1BQU8scUJBQXFCQSxFQUFLNjNCLE1BQVEsVUFBWSxzQkFBc0I3M0IsRUFBS28xQixvQkFBc0IsSUFDeEcsQ0FFQSxzQkFBTVMsQ0FDSnpmLEVBQ0FwVyxFQUNBazJCLEVBQ0FodkIsRUFBMEIsQ0FBQSxHQUUxQixHQUFJa1AsRUFBUWhCLG9CQUNWLE9BQU92TixNQUFNZ3VCLGlCQUFpQnpmLEVBQVNwVyxFQUFNazJCLEVBQWNodkIsR0FHN0QsTUFBTTBkLFFBQWFnRyxHQUF3QnhVLEVBQVEzVyxJQUFJa2xCLEtBQU12TyxHQUN2RDBELEVBQVMxRCxFQUFRL0MsWUFBWUcsVUFBVSx1QkFBeUIsK0JBQWlDLEdBQ2pHdVcsRUFBVS9wQixFQUFLK3BCLFNBQVM1cEIsSUFBSW1GLFFBQzVCa3hCLEVBQW9Cek0sR0FBUy9vQixPQUFTK29CLEVBQVUsQ0FBQyxhQUNqRCtOLEVBQWNod0IsS0FBS2l2QixTQUFTM2dCLEVBQVMsSUFBS3BXLEVBQU0rcEIsUUFBU3lNLElBQy9ELE9BQU9wUixHQUFrQixDQUN2QixPQUNBLEtBQ0Esa0JBQ0doSCxHQUF5QnBlLEdBQzVCLGdCQUNBLFlBQ0EsUUFDQSxHQUFHazJCLGNBQ0gsa0RBQWtEdFIsUUFBV2tULElBQWNoZSxLQUUvRSxHQ3pCSyxNQUFNaWUsR0FBYyxJQWQzQixjQUEwQnRELEdBQ3hCN3NCLFdBQUFBLEdBQ0VDLE9BQU0sRUFDUixDQUVtQmd0QixpQkFBQUEsQ0FBa0I1bEIsRUFBWWpQLEdBQy9DLE1BQU8sNkJBQTZCQSxFQUFLbzFCLG9CQUFzQixJQUNqRSxDQUVtQk0sbUNBQUFBLENBQW9DdGYsRUFBa0JwVyxHQUN2RSxNQUFPLENBQUNvVyxFQUFRN0MsYUFBYyxtQkFBbUJ2VCxFQUFLbzFCLG9CQUFzQixLQUFLL3hCLE9BQ25GLEdDc0NLLE1BQU0yMEIsR0FBa0IsSUE5Qy9CLGNBQThCdkQsR0FDNUI3c0IsV0FBQUEsR0FDRUMsT0FBTSxFQUNSLENBRVVndEIsaUJBQUFBLENBQWtCb0QsRUFBYUMsR0FDdkMsTUFBTSxJQUFJbDBCLE1BQU0sb0NBQ2xCLENBRVM0d0IsUUFBQUEsQ0FBUzNsQixFQUFZalAsR0FDNUIsT0FBT2tJLFFBQVE1SCxRQUNiLHFCQUFxQk4sRUFBSzYzQixNQUFRLFVBQVksc0JBQXNCNzNCLEVBQUtvMUIsb0JBQXNCLEtBRW5HLENBQ1NMLGVBQUFBLENBQWdCM2UsRUFBa0JwVyxHQUN6QyxPQUFPa0ksUUFBUTVILFFBQ2IsR0FBRzhWLEVBQVE3QyxtQkFBbUJ1RSxvQkFBaUM5WCxFQUFLbzFCLG9CQUFzQixzQkFFOUYsQ0FDU0gsU0FBQUEsR0FDUCxPQUFPL3NCLFFBQVE1SCxRQUFRLHFCQUN6QixDQUNTNDBCLFdBQUFBLENBQVk5ZSxFQUFrQnBXLEdBQ3JDLE9BQU9rSSxRQUFRNUgsUUFDYixHQUFHd0gsS0FBSzZzQixZQUFZdmUsRUFBUyxxQkFBcUI2ZCxHQUFjSSxhQUM5RGplLEVBQ0FwVyxFQUFLbTFCLDZCQUErQixHQUNwQ24xQixFQUFLbzFCLG9CQUFzQixNQUdqQyxDQUVTUSxVQUFBQSxHQUNQLE9BQU8xdEIsUUFBUTVILFFBQVEscUJBQ3pCLENBQ1N3MUIsaUJBQUFBLEdBQ1AsT0FBTzV0QixRQUFRNUgsUUFBUSxxQkFDekIsQ0FDU3kxQixhQUFBQSxHQUNQLE9BQU83dEIsUUFBUTVILFFBQVEscUJBQ3pCLENBQ1MwMUIsU0FBQUEsR0FDUCxPQUFPOXRCLFFBQVE1SCxRQUFRLHFCQUN6QixHQ3BDSyxNQUFNNjNCLEdBQWUsSUFWNUIsY0FBMkIxRCxHQUN6QjdzQixXQUFBQSxHQUNFQyxPQUFNLEVBQ1IsQ0FFbUJndEIsaUJBQUFBLENBQWtCNWxCLEVBQVlqUCxHQUMvQyxNQUFPLGFBQWFBLEVBQUtvMUIsb0JBQXNCLElBQ2pELEdDT0ssTUFBTWdELEdBQWMsSUFkM0IsY0FBMEIzRCxHQUN4QjdzQixXQUFBQSxHQUNFQyxPQUFNLEVBQ1IsQ0FFbUJndEIsaUJBQUFBLENBQWtCNWxCLEVBQVlqUCxHQUMvQyxNQUFPLGlCQUFpQkEsRUFBS28xQixvQkFBc0IsS0FBSy94QixNQUMxRCxDQUVtQjJ4Qix3QkFBQUEsQ0FBeUI1ZSxFQUFrQnBXLEdBQzVELE1BQU8sR0FBR29XLEVBQVE3QyxxQ0FBcUN2VCxFQUFLbzFCLG9CQUFzQixLQUFLL3hCLE1BQ3pGLEdDcEJXZzFCLEdBQXFCLENBQUMsVUFBVyxVQUFXLFNBQVUsUUNpQjdEelosR0FBVSxDVlpkaVosTUFBTyxDQUNMbjRCLFlBQWEseUJBQ2JDLEtBQU0sV0FFUmlELEtBQU0sQ0FDSmxELFlBQWEsNkJBQ2JDLEtBQU0sUUFDTkcsTUFBTyxJQUNQRixRQUFTLElBRVgsaUJBQWtCLENBQ2hCRixZQUFhLDZCQUNiQyxLQUFNLFFBQ05DLFFBQVMsSVVDWDA0QixLQUFNLENBQ0o1NEIsWUFBYSwrRUFDYkMsS0FBTSxTQUNORyxNQUFPLE1BSUVvMkIsR0FBMEcsQ0FDckhqdkIsUUFBUyxpQkFDVGdSLFNBQ0UsdUpBQ0YyRyxRQUFVZ04sR0FDUkEsRUFBTXFFLG9CQUFvQixDQUFFLGNBQWMsSUFBUS9vQixRQUFRMFgsSUFHNUQsYUFBTXBWLENBQVF4SixJVkpULFNBQ0xBLEdBRUNBLEVBQW9CbzFCLG1CQUFxQixJQUFLcDFCLEVBQUs0QyxNQUFRLE1BQVM1QyxFQUFLaVAsR0FBR3dDLE1BQU0sSUFBTSxNQUFTelIsRUFBSyxPQUFTLElBQzdHRyxJQUFLa2xCLEdBQVFDLEdBQW9CaGdCLE9BQU8rZixLQUN4Q25rQixLQUFLLEtBQ1BsQixFQUFvQm0xQiw2QkFBK0JuMUIsRUFBS3U0QixlQUFpQixJQUN2RXA0QixJQUFLa2xCLEdBQVFDLEdBQW9CaGdCLE9BQU8rZixLQUN4Q25rQixLQUFLLElBQ1YsQ1VKSXMzQixDQUFjeDRCLEdBRWQsTUFBTWdYLFFBQWlCVixHQUF1QnRXLEdBQ3pDZ1gsSUFDSHBWLFFBQVFzQixNQUFNaVYsRUFBTUMsSUFBSSxzQkFDeEJ6WCxRQUFRaWQsS0FBSyxJQUdmLElBQUssTUFBTXhILEtBQVdZLEVBQVNyUixZQUFhLENBQzFDLE1BQU15bkIsRUFBT2hYLEVBQVEvQyxZQUFZbUIsY0FBZ0IsQ0FBQSxFQUMzQ2dhLEVBQVVwWSxFQUFRL0MsWUFBWXFCLGlCQUFtQixDQUFBLEVBQ3ZELElBQUlsQixFQUNKLEdBQUk0WixFQUFLbFEsTUFDUDFKLEVBQVVta0IsUUFDTCxHQUFJdkssRUFBS3FMLEtBQ2RqbEIsRUFBVXVrQixRQUNMLEdBQUl2SixFQUFRLGtCQUNqQmhiLEVBQVUya0IsUUFDTCxHQUFJM0osRUFBUWtLLEtBQ2pCbGxCLEVBQVU0a0IsUUFDTCxHQUNKQyxHQUFtQnBsQixLQUFNbEcsR0FBTXFnQixFQUFLcmdCLE1BQVFxZ0IsRUFBSyx1QkFDakRoWCxFQUFRdkMsZUFBaUIsZ0JBQWdCbE0sS0FBS3lPLEVBQVF6QyxZQUV2REgsRUFBVW9rQixPQUNMLEtBQUl4SyxFQUFLLGNBQWVvQixFQUFRLFlBR3JDLFNBRkFoYixFQUFVd2tCLEVBR1osQ0FHQSxPQUZBcDJCLFFBQVFDLEtBQUssdUJBQXVCdVUsRUFBUXJPLFlBRXBDL0gsRUFBS3M0QixNQUFRLE9BQ25CLElBQUssTUFDTCxJQUFLLGNBQ0gzM0IsUUFBUWxCLElBQUlxQixTQUFXLG9CQUNqQm9hLFNBQW1CMUgsRUFBUW9oQixTQUFTeGUsRUFBU3BXLEdBQU9vVyxFQUFTcFcsR0FDbkUsTUFFRixJQUFLLFVBQ0hXLFFBQVFsQixJQUFJcUIsU0FBVyxnQkFDakJvYSxTQUFtQjFILEVBQVF1aEIsZ0JBQWdCM2UsRUFBU3BXLEdBQU9vVyxFQUFTcFcsR0FDMUUsTUFFRixJQUFLLFNBQ0hXLFFBQVFsQixJQUFJcUIsU0FBVyxnQkFDakJvYSxTQUFtQjFILEVBQVEwaEIsWUFBWTllLEVBQVNwVyxHQUFPb1csRUFBU3BXLEdBQ3RFLE1BRUYsSUFBSyxlQUNIVyxRQUFRbEIsSUFBSXFCLFNBQVcsVUFDdkJkLEVBQUtvMUIsbUJBQXFCLG9CQUNwQmxhLFNBQW1CMUgsRUFBUTBoQixZQUFZOWUsRUFBU3BXLEdBQU9vVyxFQUFTcFcsR0FDdEUsTUFFRixJQUFLLE9BQVEsQ0FDWFcsUUFBUWxCLElBQUlxQixTQUFXLE9BQ3ZCLE1BQU1xYSxRQUFlM0gsRUFBUXloQixVQUFVN2UsRUFBU3BXLFNBQzFDa2IsR0FBYUMsRUFBUS9FLEVBQVNwVyxHQUNwQyxLQUNGLENBQ0EsUUFDRSxNQUFNLElBQUlnRSxNQUFNLHVCQUF1QmhFLEVBQUtzNEIsUUFHbEQsQ0FDRixHQzVFSXB1QixHQUEwQixJQUFJQyxPQUFPLEdBQUc3RSxPQUFPOEUsY0FBYywwQkFBMkIsS0FJeEZ3VSxHQUFVLENBQ2QrWixJQUFLLENBQ0hqNUIsWUFBYSx1QkFDYkMsS0FBTSxTQUNObWYsUUFBUyxDQUNQLFdBQ0EsZUFDQSxTQUNBLGFBQ0EsU0FDQSxlQUNBLFFBQ0EsV0FDQSxTQUVGbGYsUUFBUyxZQUVYeUUsT0FBUSxDQUNOM0UsWUFBYSwyQkFDYkMsS0FBTSxXQUVSMjJCLEtBQU0sQ0FDSjUyQixZQUFhLHFDQUNiQyxLQUFNLFdBRVIsZUFBZ0IsQ0FDZEQsWUFBYSx5QkFDYkMsS0FBTSxXQUlKaTVCLEdBQ0ssQ0FDUEMsT0FBTyxFQUNQbjVCLFlBQWEsZ0NBQ2JDLEtBQU0sVUFnQkdtNEIsR0FBMEQsQ0FDckU3d0IsUUFBUyxvQkFDVGdSLFNBQ0UscU1BQ0YyRyxRQUFVZ04sR0FDUkEsRUFDR3FFLG9CQUFvQixDQUFFLGNBQWMsSUFDcEMvb0IsUUFBUTBYLElBQ1JpTixXQUFXLFVBQVcrTSxJQUMzQixhQUFNcHZCLENBQVF4SixHQUNaVyxRQUFRaWQsV0FBV2pXLEdBQUszSCxHQUMxQixHQUdLZ0ksZUFBZUwsR0FBSzNILEVBQXVCa0gsRUFBMEIsSUFDMUUsTUFBTTR4QixFQUFXQyxHQUEwQi80QixHQUNyQ2dYLFFBQWlCVixHQUF1QndpQixHQUM5QyxJQUFLOWhCLEVBRUgsT0FEQXBWLFFBQVFzQixNQUFNaVYsRUFBTUMsSUFBSSxzQkFDakIsRUFJVCxNQUFNNGdCLEVBQWVGLEVBQVMvTyxTQUFXLEdBQ25Db00sRUFBMEIyQyxFQUFTLE9BQVMsSUFDNUNHLGFBQUVBLEVBQVlDLGNBQUVBLEdBc1RqQixTQUNMRixFQUNBN0MsRUFBb0MsSUFFcEMsTUFBTWdELEVBQWdCSCxFQUFZL2xCLEtBQU1tbUIsR0FBV0EsRUFBTzFsQixTQUFTLFNBQzdEMmxCLEVBQWlCTCxFQUFZL2xCLEtBQU1tbUIsR0FBV0EsRUFBTzFsQixTQUFTLFVBQzlENGxCLEVBQTJDLElBQXZCTixFQUFZaDRCLFFBQW1ELElBQW5DbTFCLEVBQXdCbjFCLE9BRTlFLE1BQU8sQ0FDTGs0QixjQUFlSSxHQUFxQkQsRUFDcENKLGFBQWNLLEdBQXFCSCxHQUFpQmhELEVBQXdCbjFCLE9BQVMsRUFFekYsQ0FsVTBDdTRCLENBQTRCUCxFQUFhN0MsR0FFakYsSUFBSyxNQUFNL2YsS0FBV1ksRUFBU3JSLFlBQWEsQ0FDMUN5USxFQUFRM1csSUFBSXFCLFNBQVcsT0FFdkIsTUFBTXNzQixFQUFPaFgsRUFBUS9DLFlBQVltQixjQUFnQixDQUFBLEVBQzNDZ2EsRUFBVXBZLEVBQVEvQyxZQUFZcUIsaUJBQW1CLENBQUEsRUFDdkQsSUFBSWxCLEVBRUZBLEVBREU0WixFQUFLbFEsTUFDR3lhLEdBQ0R2SyxFQUFLcUwsS0FDSlYsR0FDRHZKLEVBQVEsa0JBQ1AySixHQUNEM0osRUFBUWtLLEtBQ1BOLEdBQ0RDLEdBQW1CcGxCLEtBQU1sRyxHQUFNcWdCLEVBQUtyZ0IsTUFBUXFnQixFQUFLLHNCQUNoRHdLLEdBRUFJLEdBR1pwMkIsUUFBUUMsS0FBSyxzQkFBc0J1VSxFQUFRck8sWUFHM0MsTUFBTXl4QixFQUFxQkMsR0FBc0JyakIsR0FDakQsR0FBSThpQixJQUF3QyxJQUF2Qk0sRUFBOEIsQ0FDakQsTUFBTUUsRUFBY1YsRUFBWXgzQixPQUFRNDNCLEdBQVdBLEVBQU8xbEIsU0FBUyxVQUM3RHFXLEVBQ0oyUCxFQUFZMTRCLE9BQVMsRUFBSTA0QixFQUFjRixFQUFtQng0QixPQUFTLEVBQUl3NEIsT0FBcUJ6NEIsRUFDeEY0NEIsRUFBVyxJQUFLYixFQUFVL08sV0FDMUJsUCxRQUFpQitlLEdBQW1CcG1CLEVBQVF1akIsU0FBUzNnQixFQUFTdWpCLEdBQVd2akIsRUFBUzBpQixFQUFVLENBQ2hHN2QsYUFBYy9ULEVBQVErVCxhQUN0QnpWLFFBQVNzekIsRUFBU2UsY0FFcEIsR0FBaUIsSUFBYmhmLEVBQ0YsT0FBT0EsQ0FFWCxDQUVBLElBQUtvZSxJQUFpQjUzQixFQUFHQyxXQUFXakIsRUFBS2EsS0FBS2tWLEVBQVE3RCxRQUFTLE9BQVEsUUFDckUsU0FJRixNQUFNdW5CLEVBQWFkLEVBQVl4M0IsT0FBUTQzQixHQUFXQSxFQUFPMWxCLFNBQVMsU0FDNURxbUIsRUFBVSxJQUFLakIsRUFBVS9PLFFBQVMrUCxFQUFXOTRCLE9BQVMsRUFBSTg0QixPQUFhLzRCLEdBRTdFLE9BQVErM0IsRUFBU0gsS0FDZixJQUFLLFdBQVksQ0FDZixNQUFNOWQsUUFBaUJtZixTQUNmeG1CLEVBQVFzaUIsa0JBQWtCMWYsRUFBUzJqQixFQUFTLENBQ2hEM0QsZUFBZ0I2RCxHQUEwQkgsRUFBWTNELEdBQ3REQSw0QkFFRi9mLEVBQ0EwaUIsRUFDQSxDQUFFN2QsYUFBYy9ULEVBQVErVCxlQUUxQixHQUFpQixJQUFiSixFQUFnQixPQUFPQSxFQUMzQixRQUNGLENBQ0EsSUFBSyxlQUFnQixDQUNuQixNQUFNQSxRQUFpQm1mLFNBQ2Z4bUIsRUFBUW9pQixXQUFXeGYsRUFBUzJqQixFQUFTLENBQ3pDM0QsZUFBZ0I2RCxHQUEwQkgsRUFBWTNELEdBQ3REQSw0QkFFRi9mLEVBQ0EwaUIsRUFDQSxDQUFFN2QsYUFBYy9ULEVBQVErVCxlQUUxQixHQUFpQixJQUFiSixFQUFnQixPQUFPQSxFQUMzQixRQUNGLENBQ0EsSUFBSyxTQUFVLENBQ2IsTUFBTUEsUUFBaUJxZixHQUNyQjlqQixFQUNBMmpCLEVBQ0F2bUIsRUFDQXltQixHQUEwQkgsRUFBWTNELEdBQ3RDQSxFQUNBanZCLEdBRUYsR0FBaUIsSUFBYjJULEVBQWdCLE9BQU9BLEVBQzNCLFFBQ0YsQ0FDQSxJQUFLLGVBQWdCLENBQ25CLE1BQU1BLFFBQWlCcWYsR0FDckI5akIsRUFDQTJqQixFQUNBdm1CLEVBQ0F5bUIsR0FBMEJILEVBQVkzRCxFQUF5QixDQUFDLFlBQ2hFQSxFQUNBanZCLEdBRUYsR0FBaUIsSUFBYjJULEVBQWdCLE9BQU9BLEVBQzNCLFFBQ0YsRUFFRixHQUFJdVMsRUFBS2xRLE9BQVNrUSxFQUFLcUwsTUFBUWpLLEVBQVEsbUJBQXFCQSxFQUFRa0ssS0FDbEUsT0FBUUksRUFBU0gsS0FDZixJQUFLLFNBQVUsQ0FDYixNQUFNOWQsUUFBaUJtZixTQUNmeG1CLEVBQVFzaUIsa0JBQWtCMWYsRUFBUzJqQixFQUFTLENBQ2hEM0QsZUFBZ0I2RCxHQUEwQkgsRUFBWTNELEVBQXlCLENBQUMsYUFDaEZBLDRCQUVGL2YsRUFDQTBpQixFQUNBLENBQUU3ZCxhQUFjL1QsRUFBUStULGVBRTFCLEdBQWlCLElBQWJKLEVBQWdCLE9BQU9BLEVBQzNCLEtBQ0YsQ0FDQSxJQUFLLGFBQWMsQ0FDakIsTUFBTUEsUUFBaUJtZixTQUNmeG1CLEVBQVFvaUIsV0FBV3hmLEVBQVMyakIsRUFBUyxDQUN6QzNELGVBQWdCNkQsR0FBMEJILEVBQVkzRCxFQUF5QixDQUFDLGFBQ2hGQSw0QkFFRi9mLEVBQ0EwaUIsRUFDQSxDQUFFN2QsYUFBYy9ULEVBQVErVCxlQUUxQixHQUFpQixJQUFiSixFQUFnQixPQUFPQSxFQUMzQixLQUNGLENBQ0EsSUFBSyxRQUFTLENBQ1osTUFBTUEsUUFBaUJtZixTQUNmeG1CLEVBQVFzaUIsa0JBQWtCMWYsRUFBUzJqQixFQUFTLENBQ2hEM0QsZUFBZ0I2RCxHQUEwQkgsRUFBWTNELEVBQXlCLENBQUMsWUFDaEZBLDRCQUVGL2YsRUFDQTBpQixFQUNBLENBQUU3ZCxhQUFjL1QsRUFBUStULGVBRTFCLEdBQWlCLElBQWJKLEVBQWdCLE9BQU9BLEVBQzNCLEtBQ0YsQ0FDQSxJQUFLLFdBQVksQ0FDZixNQUFNQSxRQUFpQm1mLFNBQ2Z4bUIsRUFBUXNpQixrQkFBa0IxZixFQUFTMmpCLEVBQVMsQ0FDaEQzRCxlQUFnQixDQUFDLFVBQVcsb0JBQW9CaGdCLEVBQVEzVyxJQUFJa2xCLFVBRTlEdk8sRUFDQTBpQixFQUNBLENBQUU3ZCxhQUFjL1QsRUFBUStULGVBRTFCLEdBQWlCLElBQWJKLEVBQWdCLE9BQU9BLEVBQzNCLEtBQ0YsQ0FDQSxJQUFLLFFBQVMsQ0FDWixNQUFNQSxRQUFpQm1mLEdBQWUsNEJBQTZCNWpCLEVBQVMwaUIsRUFBVSxDQUNwRjdkLGFBQWMvVCxFQUFRK1QsZUFFeEIsR0FBaUIsSUFBYkosRUFBZ0IsT0FBT0EsRUFDM0IsS0FDRixFQUdOLENBQ0EsT0FBTyxDQUNULENBRU8sU0FBU2tlLEdBQTBCLzRCLEdBQ3hDLE9BQUlBLEVBQUtQLEtBQUt1QixRQUFVaEIsRUFBS1MsWUFBY1QsRUFBS1UsaUJBQTBDLElBQXhCVixFQUFLYSxlQUM5RGIsRUFFRixJQUFLQSxFQUFNUyxXQUFZLE9BQ2hDLENBRUEsU0FBU2c1QixHQUFzQnJqQixHQUM3QixPQUFJL1UsRUFBR0MsV0FBV2pCLEVBQUthLEtBQUtrVixFQUFRN0QsUUFBUyxPQUFRLFNBQzVDLE1BRUw2RCxFQUFRN0IsWUFBYWxULEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLa1YsRUFBUTdELFFBQVMsWUFDekRsUixFQUFHQyxXQUFXakIsRUFBS2EsS0FBS2tWLEVBQVE3RCxRQUFTLE9BQVEsUUFBVSxDQUFDLE9BQVEsWUFBYSxlQUFpQixDQUFDLFFBRzlHLENBRUF2SyxlQUFla3lCLEdBQ2I5akIsRUFDQXBXLEVBQ0F3VCxFQUNBNGlCLEVBQ0FELEVBQ0FqdkIsRUFBMEIsSUFFMUJrUCxFQUFRM1csSUFBSWt5QixZQUFjLElBQzFCLE1BQU13SSxRQUFzQmpmLEdBQWEsR0FBRzFILEVBQVFtaEIsWUFBWXZlLEVBQVMsVUFBVTRkLEdBQVVoMEIsS0FBU29XLEVBQVNwVyxFQUFNLENBQ25IaWIsYUFBYy9ULEVBQVErVCxlQUV4QixHQUFzQixJQUFsQmtmLEVBQ0YsT0FBT0EsRUFFVCxNQUFNQyxRQUFxQkosU0FDbkJ4bUIsRUFBUXVpQixjQUFjM2YsRUFBU3BXLEVBQU0sQ0FDekNvMkIsaUJBQ0FELDRCQUVGL2YsRUFDQXBXLEVBQ0EsQ0FBRWliLGNBQWMsSUFFWm9mLFFBQXFCbmYsR0FBYStZLEdBQWNNLEtBQUtuZSxHQUFVQSxFQUFTcFcsRUFBTSxDQUNsRmliLGFBQWMvVCxFQUFRK1QsZUFFeEIsT0FBcUIsSUFBakJtZixFQUNLQSxFQUVGQyxDQUNULENBRUEsU0FBU0wsR0FDUDdlLEVBQ0EvRSxFQUNBcFcsRUFDQWtILEVBQThDLENBQUEsR0FFOUMsT0FBT2dVLEdBQWFDLEVBQVEvRSxFQUFTcFcsRUFBTSxJQUN0Q2tILEVBQ0g2VSxvQkFBcUJ1ZSxJQUV6QixDQUVBLFNBQVNWLEdBQ1B6ZSxFQUNBL0UsRUFDQXBXLEVBQ0FrSCxFQUE4QyxDQUFBLEdBRTlDLE9BQU9nVSxHQUFhQyxFQUFRL0UsRUFBU3BXLEVBQU0sSUFDdENrSCxFQUNIcVUsaUJBQWlCLEVBQ2pCUyxnQ0FBZ0MsRUFDaENHLHlCQUEwQixJQUMxQk8scUJBQXNCLHNCQUUxQixDQUVBLFNBQVM0ZCxHQUFzQjdkLEdBQzdCLE1BQU04ZCxFQUErQixHQUMvQkMsRUFBdUIsSUFBSTlwQixJQUMzQitwQixFQUF5QixHQUMvQixJQUFLLE1BQU0xMEIsS0FXYixVQUF1QjBXLEdBQ3JCLElBQUlpZSxFQUFpQixFQUNyQixLQUFPQSxHQUFrQmplLEVBQU96YixRQUFRLENBQ3RDLE1BQU0yNUIsRUFBZWxlLEVBQU95YSxRQUFRLEtBQU13RCxHQUMxQyxJQUFxQixJQUFqQkMsRUFFRixrQkFETWxlLEVBQU9oTCxNQUFNaXBCLFVBSWZqZSxFQUFPaEwsTUFBTWlwQixFQUFnQkMsR0FDbkNELEVBQWlCQyxFQUFlLENBQ2xDLENBQ0YsQ0F2QnFCQyxDQUFhbmUsR0FBUyxDQUN2QyxNQUFNb2UsRUFBaUJDLEdBQTJCLzBCLEdBQzlDeTBCLEVBQXFCcGhCLElBQUl5aEIsS0FDekJOLEVBQW1CdG5CLEtBQU04bkIsR0FBZ0JDLEdBQWdCRCxFQUFhRixNQUUxRUksR0FBc0JWLEVBQW9CQyxFQUFzQkssR0FDaEVKLEVBQWF4NUIsS0FBSzhFLElBQ3BCLENBQ0EsT0FBTzAwQixFQUFhdjVCLEtBQUssS0FDM0IsQ0FnQkEsU0FBUys1QixHQUFzQnp3QixFQUFpQjB3QixFQUFzQm4xQixHQUdwRSxHQUZBeUUsRUFBTXZKLEtBQUs4RSxHQUNYbTFCLEVBQVF0cUIsSUFBSTdLLEdBQ1J5RSxFQUFNeEosUUFsV29DLElBa1dlLE9BRTdELE1BQU1tNkIsRUFBYzN3QixFQUFNNHdCLGFBQ05yNkIsSUFBaEJvNkIsR0FDRkQsRUFBUUcsT0FBT0YsRUFFbkIsQ0FFQSxTQUFTTCxHQUEyQi8wQixHQUNsQyxPQUFPQSxFQUNKNEUsV0FBV1QsR0FBeUIsSUFDcEM3RyxPQUNBc0gsV0FBVyx1QkFBd0IsSUFDbkNBLFdBQVcsZ0JBQWlCLG1CQUM1QkEsV0FBVyx1REFBd0QsZUFDbkVBLFdBQVcsbUJBQW9CLGFBQ3BDLENBRUEsU0FBU3F3QixHQUFnQnp1QixFQUFXRyxHQUNsQyxNQUFNNHVCLEVBQVlyYSxLQUFLc2EsSUFBSWh2QixFQUFFdkwsT0FBUTBMLEVBQUUxTCxRQUN2QyxPQUFrQixJQUFkczZCLEtBQ0FyYSxLQUFLdWEsSUFBSWp2QixFQUFFdkwsT0FBUzBMLEVBQUUxTCxRQXRYZSxJQXNYTHM2QixJQUU3QkcsRUFBU2x2QixFQUFHRyxHQUFLNHVCLEdBeFhpQixHQXlYM0MsQ0FFTyxTQUFTckIsR0FDZEgsRUFDQTNELEVBQW9DLEdBQ3BDN0IsRUFBMkIsSUFFM0IsTUFBTW9ILEVBQWdDOUUsR0FBb0NULEdBQXlCbjFCLE9BQVMsRUFDNUcsTUFBTyxDQUFDLFVBQVk4NEIsRUFBVzk0QixPQUFTLEdBQUswNkIsRUFBZ0MsR0FBSyxDQUFDLGdCQUFrQnBILEVBQ3ZHLENDdllBLE1BTWFxSCxHQUdULENBQ0YxMEIsUUFBUyxhQUNUZ1IsU0FBVSxzQ0FDVjJHLFFBWnNCLENBQ3RCdmEsT0FBUSxDQUNOM0UsWUFBYSwyQkFDYkMsS0FBTSxZQVVSLGFBQU02SixDQUFReEosU0FLVGdJLGVBQ0xoSSxHQUVBLE1BQU1nWCxRQUFpQlYsR0FBdUJ0VyxHQUN6Q2dYLElBQ0hwVixRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUksc0JBQ3hCelgsUUFBUWlkLEtBQUssSUFHZixJQUFLLE1BQU14SCxLQUFXWSxFQUFTclIsWUFBYSxDQUMxQ3lRLEVBQVEzVyxJQUFJNlYsS0FBTyxJQUNuQmMsRUFBUTNXLElBQUlxQixTQUFXLE9BRXZCLE1BQU1zc0IsRUFBT2hYLEVBQVEvQyxZQUFZbUIsY0FBZ0IsQ0FBQSxFQUMzQ2dhLEVBQVVwWSxFQUFRL0MsWUFBWXFCLGlCQUFtQixDQUFBLEVBQ3ZELElBQUlsQixFQUVGQSxFQURFNFosRUFBS2xRLE1BQ0d5YSxHQUNEdkssRUFBS3FMLEtBQ0pWLEdBQ0R2SixFQUFRLGtCQUNQMkosR0FDRDNKLEVBQVFrSyxLQUNQTixHQUNEQyxHQUFtQnBsQixLQUFNbEcsR0FBTXFnQixFQUFLcmdCLE1BQVFxZ0IsRUFBSyxzQkFDaER3SyxHQUVBSSxHQUdacDJCLFFBQVFDLEtBQUssNEJBQTRCdVUsRUFBUXJPLFlBRWpELE1BQU04TCxFQUFnQnVDLEVBQVF2QyxjQVE5QixHQVBJQSxTQUNJK0ksR0FBdUJxWCxHQUFjaFUsVUFBVzdKLEVBQVNwVyxHQUU3RHFCLEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLa1YsRUFBUTdELFFBQVMsT0FBUSxnQkFFN0NxSyxHQUF1QnBKLEVBQVF1akIsU0FBUzNnQixFQUFTcFcsR0FBTTJLLFdBQVcsZUFBZ0IsSUFBS3lMLEVBQVNwVyxHQUVwR3FCLEVBQUdDLFdBQVdqQixFQUFLYSxLQUFLa1YsRUFBUTdELFFBQVMsT0FBUSxRQUFTLE9BRXREcUssU0FBNkJwSixFQUFRd2lCLFVBQVU1ZixFQUFTcFcsR0FBT29XLEVBQVNwVyxTQUN4RThhLEdBQVkrWSxhQUNkaGdCLElBQ0Z1QyxFQUFRM1csSUFBSWt5QixZQUFjLFVBQ3BCelcsR0FBYSxHQUFHMUgsRUFBUW1oQixZQUFZdmUsRUFBUyxVQUFVNGQsR0FBVWgwQixLQUFTb1csRUFBU3BXLElBRTNGLE1BQU1tYixFQUFTdEgsUUFDTEwsRUFBUXVpQixjQUFjM2YsRUFBU3BXLEVBQU0sQ0FBQSxTQUNyQ3dULEVBQVFzaUIsa0JBQWtCMWYsRUFBU3BXLEVBQU0sQ0FBQSxHQUNuRFcsUUFBUWthLGVBQWlCSyxHQUV2QkMsRUFBT3hRLFdBQVcsZUFBZ0IsSUFDbEN5TCxFQUNBcFcsRUFDQSxDQUNFaWIsY0FBYyxJQUdkcEgsU0FDSXFILEdBQWErWSxHQUFjTSxLQUFLbmUsR0FBVUEsRUFBU3BXLEVBRTdELENBQ0YsQ0FDRixDQXJFVTQ3QixDQUFTNTdCLEVBQ2pCLEdDM0JGLE1BYWE2N0IsR0FBOEQsQ0FDekU1MEIsUUFBUywyQkFDVGdSLFNBQVUscURBZksyVCxHQUNmQSxFQUNHQyxXQUFXLE1BQU8sQ0FDakJuc0IsWUFBYSwwQkFDYkMsS0FBTSxTQUNObThCLGNBQWMsSUFFZjlJLE9BQU8sU0FBVSxDQUNoQnR6QixZQUFhLHNDQUNiQyxLQUFNLFNBQ05DLFFBQVMsWUFPYjRKLE9BQUFBLENBQVF4SixHQUNOLElBQ0UsTUFBTWlGLEVBQVNqRixFQUFLaUYsT0FDcEIsS0FBTUEsS0FBVXNiLEVBQVVDLFNBQ3hCLE1BQU0sSUFBSXhjLE1BQU0sbUJBQW1CaUIsS0FFckNGLEVBQVMvRSxFQUFLZ0YsSUFBS0MsRUFDckIsQ0FBRSxNQUFPL0IsR0FDUHRCLFFBQVFzQixNQUFNQSxhQUFpQmMsTUFBUWQsRUFBTTZNLFFBQVV6SyxPQUFPcEMsSUFDOUR2QyxRQUFRaWQsS0FBSyxFQUNmLENBQ0YsR0N0QldtZSxHQUFvRSxDQUMvRTkwQixRQUFTLFlBQ1RnUixTQUFVLHFEQVBJLENBQUEsRUFTZCxhQUFNek8sQ0FBUXhKLEdBQ1pXLFFBQVFpZCxXQUlMNVYsZUFBeUJoSSxHQUM5QixNQUFNZ1gsUUFBaUJWLEdBQXVCdFcsR0FBTSxHQUNwRCxJQUFLZ1gsRUFFSCxPQURBcFYsUUFBUXNCLE1BQU1pVixFQUFNQyxJQUFJLHNCQUNqQixFQUdULElBQUk0akIsR0FBaUIsRUFDckIsTUFBTXRqQixFQUFXMUIsRUFBU3JSLFlBQVl4RixJQUFJNkgsVUFDeEMsTUFBTStXLEVBQXFCLEdBTzNCLElBTkszSSxFQUFRL0MsWUFBWXlELGFBQWNWLEVBQVF0QyxlQUM3Q2lMLEVBQVM5ZCxRQStDZixTQUEwQ21WLEdBQ3hDLEdBQUlBLEVBQVFsQixpQkFBaUIsOEJBQzNCLE1BQU8sQ0FBQyxxQkFFVixHQUFJa0IsRUFBUWxCLGlCQUFpQixjQUMzQixNQUFPLENBQUMsb0JBRVYsTUFBTyxFQUNULENBdkR1QittQixDQUFpQzdsQixLQUUvQ0EsRUFBUS9DLFlBQVl5RCxZQUFjVixFQUFRbEIsaUJBQWlCLFlBQzlENkosRUFBUzlkLEtBQUssZ0JBRVQ4ZCxFQUFTL2QsT0FBUyxHQUFHLENBQzFCLE1BQU02WixRQUFpQitCLEdBQXVCbUMsRUFBUzdkLEtBQUssUUFBU2tWLEVBQVNwVyxFQUFNLENBRWxGOGQsR0FBSTlHLEVBQVNyUixZQUFZM0UsT0FBUyxFQUNsQ2lhLGNBQWMsRUFDZHFCLGVBQWUsSUFJWDRmLEVBQWM3N0IsRUFBS2EsS0FBS2tWLEVBQVE3RCxRQUFTLFNBQy9DLElBQUlzSSxJQUFZeFosRUFBR0MsV0FBVzQ2QixHQU85QixPQUFPcmhCLEVBTkx4WixFQUFHd3JCLE9BQU9xUCxFQUFhLENBQUVwUCxPQUFPLEVBQU1sVSxXQUFXLElBQ2pEaFgsUUFBUUMsS0FBS3NXLEVBQU11WixPQUFPLDZEQUMxQnNLLEdBQWlCLENBS3JCLElBRUlHLFFBQWtCajBCLFFBQVFtWSxJQUFJM0gsR0FDcEMsSUFBSTBqQixFQUFnQixFQUNwQixJQUFLLE1BQU90eEIsRUFBRytQLEtBQWFzaEIsRUFBVS81QixVQUNwQyxHQUFJeVksRUFBVSxFQUNDN0QsRUFBU3JSLFlBQVltRixJQUFJdUksWUFBWW1CLGNBQWdCLENBQUEsR0FDekQwSSxPQUNQdGIsUUFBUUMsS0FBS3NXLEVBQU11WixPQUFPLGdFQUU1QjBLLEVBQWdCdmhCLENBQ2xCLENBRUd1aEIsR0FDSHg2QixRQUFRQyxLQUNOc1csRUFBTUUsTUFDSjJqQixFQUNJLDRIQUNBLDBCQUdWLE9BQU9JLENBQ1QsQ0E1RHVCQyxDQUFVcjhCLEdBQy9CLEdBdUVLLE1BQU1zOEIsR0FBNkQsSUFDckVQLEdBQ0g5MEIsUUFBUyxNQ25FRXMxQixHQUFzRSxDQUNqRnQxQixRQUFTLFNBQ1RnUixTQUFVLHNCQUNWMkcsUUFmYyxDQUNkNGQsS0FBTSxDQUNKNzhCLEtBQU0sVUFDTkMsU0FBUyxFQUNUcVksU0FBVSwyQ0FZWixhQUFNek8sQ0FBUXhKLEdBQ1osTUFBTWdYLEVBQVdSLEdBQXdCeFcsR0FBTSxHQUMxQ2dYLElBQ0hwVixRQUFRc0IsTUFBTWlWLEVBQU1DLElBQUksc0JBQ3hCelgsUUFBUWlkLEtBQUssVUFHUjVkLEVBQUt3OEIsS0FJaEJ4MEIsZUFBK0JvTyxFQUFrQnBXLEdBQy9DLE1BQU15OEIsRUF5SlIsU0FBaUNybUIsR0FLL0IsTUFBTXNtQixFQUFZN3JCLEtBQUtpQixNQUNqQjZxQixFQUFZdDhCLEVBQUthLEtBQUtrVixFQUFRN0QsUUFBUyxPQUM3Q2xSLEVBQUdtckIsVUFBVW1RLEVBQVcsQ0FBRS9qQixXQUFXLElBRXJDLE1BQU1na0IsRUFBY3Y4QixFQUFLYSxLQUFLeTdCLEVBQVcsbUJBQ25DRSxFQUFVeDdCLEVBQUd5N0IsU0FBU0YsRUFBYSxLQUNuQ0csRUFBc0JwOEIsUUFBUXlDLE9BQU8wRixNQUFNazBCLEtBQUtyOEIsUUFBUXlDLFFBQ3hENjVCLEVBQXNCdDhCLFFBQVF5RyxPQUFPMEIsTUFBTWswQixLQUFLcjhCLFFBQVF5RyxRQUM5RCxJQUFJODFCLEdBQVksRUFDWkMsR0FBVyxFQUVmeDhCLFFBQVF5QyxPQUFPMEYsTUFBUXMwQixHQUFTejhCLFFBQVF5QyxPQUFPaTZCLEdBQUlSLEdBQ25EbDhCLFFBQVF5RyxPQUFPMEIsTUFBUXMwQixHQUFTejhCLFFBQVF5RyxPQUFPaTJCLEdBQUlSLEdBQ25EajdCLFFBQVFDLEtBQUtzVyxFQUFNc0YsS0FBS3RGLEVBQU11RixLQUFLLGFBQWNrZixJQUVqRCxNQUFNVSxFQUFTQSxLQUNiLEdBQUlILEVBQVUsT0FDZEEsR0FBVyxFQUVYeDhCLFFBQVF5QyxPQUFPMEYsTUFBUWkwQixFQUN2QnA4QixRQUFReUcsT0FBTzBCLE1BQVFtMEIsRUFFdkIsTUFBTU0sRUFnRFYsU0FBMkJDLEdBQ3pCLE1BQU1DLEVBQVV4YyxLQUFLeWMsTUFBTUYsRUFBZSxLQUNwQ0csRUFBVTFjLEtBQUsyYyxNQUFNSCxFQUFVLElBQy9CSSxFQUFtQkosRUFBVSxHQUNuQyxHQUFnQixJQUFaRSxFQUNGLE1BQU8sR0FBR0UsS0FFWixNQUFPLEdBQUdGLE1BQVlFLElBQ3hCLENBeER3QkMsQ0FBa0JqdEIsS0FBS2lCLE1BQVE0cUIsR0FFN0NxQixFQUFVLEdBRERiLEVBQVksWUFBYyxlQUNUSyxnQkFBMEJYLE1BQ3BEb0IsRUFBaUJkLEVBQVkva0IsRUFBTUUsTUFBTTBsQixHQUFXNWxCLEVBQU1DLElBQUkybEIsR0FDcEVoQixFQUFvQmlCLEdBQ3BCMzhCLEVBQUc0OEIsVUFBVXBCLEVBQVNrQixHQUN0QjE4QixFQUFHNjhCLFVBQVVyQixJQUtmLE9BRkFsOEIsUUFBUW9mLEtBQUssT0FBUXVkLEdBRWQsQ0FDTGEsS0FBT2o3QixJQUNMZzZCLEdBQVksRUFDUmg2QixHQUNGdEIsUUFBUXNCLE1BQU1BLElBR2xCbzZCLE9BQVFBLEtBQ04zOEIsUUFBUTRJLGVBQWUsT0FBUSt6QixHQUMvQkEsS0FFRmMsUUFBU0EsS0FDUGxCLEdBQVksR0FHbEIsQ0E5TW1CbUIsQ0FBd0Jqb0IsR0FDekMsVUFDUWtvQixHQUFXbG9CLEVBQVNwVyxTQWdDOUJnSSxlQUE4Qm9PLEVBQWtCcFcsR0FDOUMsTUFBTTg0QixFQUFXQyxHQUEwQixJQUN0Qy80QixFQUNIaVAsRUFBRyxDQUFDLFFBQ0owcEIsSUFBSyxXQUNMdDBCLFFBQVEsSUFFSndXLFFBQWlCbFQsR0FBS214QixFQUFVLENBQUU3ZCxjQUFjLElBQ3RELEdBQWlCLElBQWJKLEVBQWdCLE9BRWZ6RSxFQUFRL0MsWUFBWUcsVUFBVSxjQUNqQzVSLFFBQVFDLEtBQUtzVyxFQUFNQyxJQUFJRCxFQUFNdUYsS0FBSyxxQkFBcUI3QyxPQUFlLFNBQ3RFbGEsUUFBUWlkLEtBQUsvQyxJQUdmalosUUFBUUMsS0FDTnNXLEVBQU11WixPQUFPLDZHQUVUNk0sR0FBa0IsR0FBR3ByQixjQVk3QixTQUF5QmlELEVBQWtCcFcsR0FDekMsTUFBTXcrQixFQUFjdG9CLEdBQWdCbFcsR0FBTSxFQUFNb1csRUFBUTdELFNBQ3hELElBQUtpc0IsRUFDSCxNQUFNLElBQUl4NkIsTUFBTSxzQkFBc0JvUyxFQUFRN0QsV0FFaEQsT0FBT2lzQixDQUNULENBbEJ3REMsQ0FBZ0Jyb0IsRUFBUzBpQixHQUFXQSxFQUFVLENBQ2xHaGMsZ0JBQWdCLElBR2xCLE1BQU00aEIsUUFBc0IvMkIsR0FBS214QixFQUFVLENBQUU3ZCxjQUFjLElBQ3JDLElBQWxCeWpCLElBQ0Y5OEIsUUFBUUMsS0FBS3NXLEVBQU1DLElBQUlELEVBQU11RixLQUFLLHFCQUFxQmdoQixPQUFvQiw4QkFDM0UvOUIsUUFBUWlkLEtBQUs4Z0IsSUFFZjk4QixRQUFRQyxLQUFLc1csRUFBTUUsTUFBTSxzQ0FDM0IsQ0EzRFVzbUIsQ0FBZXZvQixFQUFTcFcsR0FDOUJ5OEIsRUFBUzJCLFNBQ1gsQ0FBRSxNQUFPbDdCLEdBRVAsTUFEQXU1QixFQUFTMEIsS0FBS2o3QixHQUNSQSxDQUNSLENBQUMsUUFDQ3U1QixFQUFTYSxRQUNYLENBQ0YsQ0FoQnVCc0IsQ0FBZ0I1bkIsRUFBU04sS0FBTTFXLEdBQVFzK0IsR0FBV3RuQixFQUFTTixLQUFNMVcsR0FDdEYsR0FpQkZnSSxlQUFlczJCLEdBQVdsb0IsRUFBa0JwVyxTQUNwQ3UrQixHQUFrQixHQUFHcHJCLGFBQTBCaUQsRUFBU3BXLEdBQzFEb1csRUFBUS9DLFlBQVlHLFVBQVUsbUJBQzFCK3FCLEdBQWtCLEdBQUdwckIsY0FBMkJpRCxFQUFTcFcsU0F3RG5FZ0ksZUFDRWdsQixFQUNBL2xCLEVBQ0FDLEVBQXdELENBQUEsR0FFbkRBLEVBQVE3QyxRQUNYekMsUUFBUUMsS0FBSyxLQUFPc1csRUFBTXNGLEtBQUt0RixFQUFNdUYsS0FBSyxVQUFXc1AsSUFFdkQsTUFBTW5TLFFBQWtCNVQsS0FBYyxFQUNyQixJQUFiNFQsR0FBa0IzVCxFQUFRMjNCLGFBQ3ZCMzNCLEVBQVE3QyxRQUNYekMsUUFBUUMsS0FBS3NXLEVBQU1FLE1BQU1GLEVBQU11RixLQUFLLGFBQWNzUCxLQUdwRHByQixRQUFRQyxLQUFLc1csRUFBTUMsSUFBSUQsRUFBTXVGLEtBQUsscUJBQXFCN0MsT0FBZW1TLElBQ3RFcnNCLFFBQVFpZCxLQUFLL0MsSUFFZixPQUFPQSxDQUNULENBeEVRaWtCLENBQ0osVUFDQSxJQUNFNVksR0FBSyxJQUNBbG1CLEVBQ0hpUCxFQUFHLENBQUMsUUFDSitXLEtBQUssRUFDTEMsUUFBUSxFQUNSd0MsZ0JBQWdCLEVBQ2hCN2pCLE9BQU8sRUFDUFAsUUFBUSxJQUVaLENBQUVBLFFBQVEsR0FFZCxDQTREQTJELGVBQWV1MkIsR0FDYnQzQixFQUNBbVAsRUFDQXBXLEVBQ0FrSCxFQUFnRSxDQUFBLEdBR2hFLEdBa0RGLFNBQXNCRCxFQUFpQmhILEdBQ3JDMkIsUUFBUUMsS0FBSyxLQUFPc1csRUFBTXNGLEtBQUt0RixFQUFNdUYsS0FBSyxZQUFhelcsR0FBV2tSLEVBQU1xRixLQUFLLE9BQU92ZCxLQUN0RixDQXJERTgrQixDQUFhOTNCLEVBQVNtUCxFQUFRN0QsU0FDMUJ2UyxFQUFLd2EsT0FDUCxPQUFPLEVBR1QsTUFBTUcsUUFBWTFTLEVBQVdoQixPQUFTbEcsRUFBVyxDQUMvQ2QsSUFBS21XLEVBQVE3RCxRQUNiOVMsSUFBSzRjLEdBQWFqRyxFQUFRM1csSUFBSyxDQUFFNmMsZUFBZSxJQUNoRDFCLE9BQU8sRUFDUDNYLE1BQU8sT0FDUDhGLGtCQUFrQixFQUNsQlcsWUFBWSxFQUNaYixlQUFnQjNCLEVBQVE0VixlQUN4QjlULGVBQWdCOUIsRUFBUTRWLGVBQ3hCamQsUUFBU0csRUFBS0gsVUFFVmdiLEVBQVdGLEVBQUl4WCxRQUFVLEVBUy9CLE9BUksrRCxFQUFRNFYsZ0JBcUJmLFNBQW1DN1YsRUFBaUI0VCxFQUFrQjRCLEdBQ3BFLEdBQWlCLElBQWI1QixJQUFtQjVULElBQVksR0FBR2tNLGNBQTRCbE0sSUFBWSxHQUFHa00sZUFFL0UsWUFEQXZSLFFBQVFDLEtBQUtzVyxFQUFNRSxNQUFNLGVBSTNCLE1BQU0ybUIsRUFBZ0J2aUIsRUFBT3BaLE9BQ3pCMjdCLElBQ0ZyK0IsUUFBUXlDLE9BQU8wRixNQUFNazJCLEdBQ3JCcitCLFFBQVF5QyxPQUFPMEYsTUFBTSxNQUV6QixDQS9CSW0yQixDQUEwQmg0QixFQUFTNFQsRUFBVUYsRUFBSXZYLFFBR2xDLElBQWJ5WCxHQUFtQjNULEVBQVEyM0IsZUFDN0JqOUIsUUFBUUMsS0FBS3NXLEVBQU1DLElBQUlELEVBQU11RixLQUFLLHFCQUFxQjdDLE9BQWU1VCxJQUN0RXRHLFFBQVFpZCxLQUFLL0MsSUFFUkEsQ0FDVCxDQW9GQSxTQUFTdWlCLEdBQVM4QixFQUFvQnJDLEdBQ3BDLE1BQVEsQ0FDTnNDLEVBQ0FDLEVBQ0FDLEtBRUEsTUFBTUMsRUFDYSxpQkFBVkgsRUFDSDkzQixPQUFPeUksS0FBS3F2QixFQUFxQyxpQkFBdkJDLEVBQWtDQSxFQUFxQixRQUNqRkQsRUFPTixPQU5BOTlCLEVBQUc0OEIsVUFBVXBCLEVBQVN5QyxHQUN0QmorQixFQUFHNDhCLFVBQVVpQixFQUFZSSxHQUNTLG1CQUF2QkYsR0FDVEEsSUFFRkMsT0FDTyxFQUVYLE9DclBNelQsRUFBTTJULEVBQVE1K0IsUUFBUVgsT0FDekJ3L0IsV0FBVyxNQUNYdDRCLFFBQVFpWCxJQUNSc2hCLFdBQVl6L0IsSUFDWCxNQUFNMC9CLEVBQWExL0IsRUFBSyxlQUN4QixHQUFJMC9CLEVBQVksQ0FDZCxNQUFNbnRCLEVBQVVsUyxFQUFLQyxRQUFRby9CLEdBQzdCLytCLFFBQVFnL0IsTUFBTXB0QixFQUNoQixFbERxTEcsU0FBOEN4USxHQUUvQ0EsRUFBUTZULE1BQVE3VCxFQUFRNjlCLG1CQUMxQjc5QixFQUFRNlQsS0FBTzdULEVBQVE2VCxLQUFLOEQsUUFBUSxHQUFHM1gsRUFBUTY5QixvQkFBcUIsSUFFakVqMUIsV0FBVyxtQ0FBb0MsSUFFL0NBLFdBQVcsc0JBQXVCLElBQ2xDQSxXQUFXLGlCQUFrQixLQUVsQyxJQUFLLE1BQU0xSSxLQUFPRSxPQUFPSCxLQUFLRCxHQUFVLENBQ3RDLE1BQU04OUIsRUFBVzU5QixFQUFJeWMsZUFFbkJtaEIsRUFBU3ZzQixXQUFXLFNBQ3BCdXNCLEVBQVN2c0IsV0FBVyxVQUNwQnVzQixFQUFTdnNCLFdBQVcsV0FDUCxnQkFBYnVzQixHQUNhLGFBQWJBLFdBR085OUIsRUFBUUUsRUFFbkIsQ0FDRixDa0QxTUk2OUIsQ0FBcUNuL0IsUUFBUWxCLE9BRTlDd0gsUUFBUXMxQixJQUNSdDFCLFFBQVErUSxJQUNSL1EsUUFBUTBYLElBQ1IxWCxRQUFRNGMsSUFDUjVjLFFBQVF3ZCxJQUNSeGQsUUFBUThlLElBQ1I5ZSxRQUFRMGtCLElBQ1Ixa0IsUUFBUWltQixJQUNSam1CLFFBQVE4b0IsSUFDUjlvQixRQUFRb3NCLElBQ1Jwc0IsUUFBUXdzQixJQUNSeHNCLFFBQVFpdkIsSUFDUmp2QixRQUFRNndCLElBQ1I3d0IsUUFBUTAwQixJQUNSMTBCLFFBQVE0MEIsSUFDUjUwQixRQUFRODBCLElBQ1I5MEIsUUFBUXExQixJQUNSMUwsZ0JBQ0FDLFNBQ0E1TSxRQUdILFdBQ0UsSUFBSThiLEVBQWlCMS9CLEVBQUtxQyxRQUFRLElBQUl1TyxnQkFBZ0I0YyxLQUFLbVMsVUFDM0QsTUFBUTMrQixFQUFHQyxXQUFXakIsRUFBS2EsS0FBSzYrQixFQUFnQixrQkFDOUNBLEVBQWlCMS9CLEVBQUtxQyxRQUFRcTlCLEdBS2hDLE9BSG9CeDhCLEtBQUtDLE1BQU1uQyxFQUFHMFIsYUFBYTFTLEVBQUthLEtBQUs2K0IsRUFBZ0IsZ0JBQWlCLFNBR3ZFOWIsT0FDckIsQ0FaV2djLElBQ1JDLE9BQU9sZ0MsS0FhVixJQUFJbWdDLElBQWUsRUFDbkIsSUFBSyxNQUFNbDdCLElBQVUsQ0FBQyxTQUFVLFVBQVcsV0FDekN0RSxRQUFRZ0ksR0FBRzFELEVBQVEsS0FDakIsSUFBSWs3QixHQUFKLENBRUFBLElBQWUsRUFDZixJQUNFcDdCLEVBQVNwRSxRQUFRcUUsSUFDbkIsQ0FBRSxNQUFPOUIsR0FDUHRCLFFBQVF1SCxLQUFLLHNCQUFzQnhJLFFBQVFxRSx3QkFBeUI5QixFQUN0RSxDQUNBdkMsUUFBUWlkLE1BUlUiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNSw2LDcsOCw5XX0=