@willbooster/wb 19.5.9 → 19.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +10 -10
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -99,18 +99,18 @@ dbs:
|
|
|
99
99
|
--build-arg WB_VERSION=${n}${i} .`}stopAndStart(e,t=``,n=``){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t=``,n=``){ma(this.stop(e),e);let r=n.includes(`/bin/bash`),i=e.env.MISE_AGE_KEY?`--env MISE_AGE_KEY `:``;return`docker run --rm ${r?`-it `:``}${i}${hc(e)}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`docker rm -f ${e.dockerImageName} > /dev/null 2>&1 || true`}stopAll(){return`true $(docker rm -f $(docker ps -q) 2> /dev/null)`}},mc=new Set([`NODE_ENV`,`PORT`]);function hc(e){let t=gc(e.declaredEnvKeys,e.env).map(e=>`--env ${e}`);return t.length>0?`${t.join(` `)} `:``}function gc(e,t){return[...e].filter(e=>!mc.has(e)&&t[e]!==void 0).toSorted((e,t)=>e.localeCompare(t))}var _c=class{shouldWaitAndOpenApp;constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return pc.buildImage(e,t)}async startDev(e,t){return await na(e.env.PORT,e),this.shouldWaitAndOpenApp?U([`YARN`,`wb`,`concurrently`,...kt(t),`--kill-others-on-fail`,this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await na(e.env.PORT,e),this.shouldWaitAndOpenApp?U([`YARN`,`wb`,`concurrently`,...kt(t),`--kill-others-on-fail`,this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await na(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await na(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,`development`)}
|
|
100
100
|
&& ${U([`YARN`,`wb`,`concurrently`,...kt(t),`--kill-others-on-fail`,pc.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,`development`)}
|
|
101
101
|
&& ${pc.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`}startProductionProtected(e,n){let r=vc(e);if(r){let i=`${U([`bash`,r])} ${n.normalizedArgsText??``}`.trim(),a=t.dirname(t.dirname(r));return this.buildProductionCommand(e,n,[e.buildCommand,a===e.dirPath?i:`(${U([`cd`,a])} && ${i})`])}let i=yc(e),a=i?[e.buildCommand,`pm2-runtime start --no-autorestart ${i}`]:this.buildDefaultProductionStartCommands(e,n);return this.buildProductionCommand(e,n,a)}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`${e.isBunAvailable?`bun`:`node`} dist/index.js ${t.normalizedArgsText??``}`.trim()]}buildProductionCommand(e,t,n){return[...this.buildMigrationCommands(e).flatMap(e=>e.split(`&&`)),...n].filter(Boolean).map(e=>`${e} ${fc(t)}`.trim()).join(` && `)}buildMigrationCommands(e){let t=an(e,`test`)&&zt(e)?[`rm -Rf "${Ut(e)}"`]:[],n=!!Bt(e);return[...t,...e.hasPrisma?[Jr.migrate(e)]:[],...e.hasDrizzle&&!n?[It(e,vr.migrateForStart(e))]:[]]}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,pc.stopAndStart(e),n)}async testStart(e,t){e.env.PORT||=`3000`,await na(e.env.PORT,e);let n=an(e,`test`)?this.buildMigrationCommands(e):[],r=`${jt(`NODE_ENV`,``)} ${U([`YARN`,`wb`,`concurrently`,...kt(t),`--kill-others`,`--success`,`first`,this.startDevProtected(e,t),this.waitApp(e)])}`;return[...n,r].join(` && `)}async testE2EProtected(e,t,n,r){e.env.PORT||=`3000`;let i=await na(e.env.PORT,e),a=this.buildPlaywrightOnlyCommand(e,t,r);return e.skipLaunchingServerForPlaywright?a:U([`YARN`,`wb`,`concurrently`,...kt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${$(i,`-t 600000 -i 2000`)}
|
|
102
|
-
&& ${a}`])}buildPlaywrightOnlyCommand(e,t,{forwardedPlaywrightArgs:n=[],playwrightArgs:r=[`test`,`test/e2e/`]}){let i=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``;return`${bc(r,t.targets,t.bail,n)}${i}`}testUnit(e,t){let n=t.targets?.map(String);return e.hasVitest?U([`YARN`,`vitest`,`run`,...n?.length?n:[`test/unit/`],`--passWithNoTests`,`--allowOnly`,`--watch=false`,...t.bail?[`--bail=1`]:[]]):e.isBunAvailable?U([`bun`,`test`,...n?.length?n:[`test/unit/`],...t.bail?[`--bail`]:[]]):`echo "No tests."`}waitApp(e){let t=e.env.PORT;return`${$(t,`-t 10000`)} 2> /dev/null
|
|
102
|
+
&& ${a}`])}buildPlaywrightOnlyCommand(e,t,{forwardedPlaywrightArgs:n=[],playwrightArgs:r=[`test`,`test/e2e/`]}){let i=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``;return`${bc(r,t.targets,t.bail,n)}${i}`}runsE2eOnCi(e){return!0}usesUnitRunnerForE2e(e){return!1}testUnit(e,t){let n=t.targets?.map(String);return e.hasVitest?U([`YARN`,`vitest`,`run`,...n?.length?n:[`test/unit/`],`--passWithNoTests`,`--allowOnly`,`--watch=false`,...t.bail?[`--bail=1`]:[]]):e.isBunAvailable?U([`bun`,`test`,...n?.length?n:[`test/unit/`],...t.bail?[`--bail`]:[]]):`echo "No tests."`}waitApp(e){let t=e.env.PORT;return`${$(t,`-t 10000`)} 2> /dev/null
|
|
103
103
|
|| ${$(t,`-t 10000 -i 500`)} 2> /dev/null
|
|
104
104
|
|| ${$(t,`-t 10000 -i 1000`)} 2> /dev/null
|
|
105
105
|
|| ${$(t,`-t 10000 -i 2000`)} 2> /dev/null
|
|
106
106
|
|| ${$(t,`-t 20000 -i 4000`)} 2> /dev/null
|
|
107
107
|
|| ${$(t,`-t 60000 -i 5000`)} 2> /dev/null
|
|
108
|
-
|| ${$(t,`-t 90000 -i 10000`)}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || ${$(t)} && open-cli http://\${HOST:-localhost}:${t}`}};function $(e,t){if(e===void 0||e===``)throw Error(`Port is required for the loopback readiness check.`);return`wait-on ${t?`${t} `:``}tcp:localhost:${e}`}function vc(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function yc(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function bc(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return xc([...i,...e,...r],n);let o=e.slice(1),s=Sc(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return xc([...i,`test`,...a,...c,...r],n)}function xc(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?U(e):U([...e,`--max-failures=1`])}function Sc(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;Cc.has(i)?t=`required`:wc.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Tc.has(e)&&(t=`required`);continue}n.push(r)}return n}const Cc=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`]),wc=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Tc=new Set([`-c`,`-g`,`-j`]);var Ec=class extends _c{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);e.env.PORT||=`3000`;let i=await na(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return U([`YARN`,`wb`,`concurrently`,...kt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${$(i,`-t 600000 -i 2000`)} && ${c}${a}`])}};const Dc=new Ec,Oc=new class extends _c{constructor(){super(!1)}startDevProtected(e,t){throw 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} && ${e.isBunAvailable?`bun run`:`node`} 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`)} && ${pc.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EProduction(e,t,n){return this.testE2EWithPlaywrightManagedServer(e,t,n)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testE2EWithPlaywrightManagedServer(e,t,n){return Promise.resolve(e.hasPlaywrightWebServerConfig?this.buildPlaywrightOnlyCommand(e,t,n):`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},kc=[`express`,`fastify`,`elysia`,`hono`],Ac=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){let n=`--turbopack `;return e.packageJson.dependencies?.blitz&&(n=jc(e)>=16?`--webpack `:``),`YARN next dev ${n}${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}};function jc(n){try{let r=JSON.parse(e.readFileSync(t.join(n.dirPath,`node_modules`,`next`,`package.json`),`utf8`)),i=k.coerce(r.version)?.major;if(i!==void 0)return i}catch{}return k.coerce(n.packageJson.dependencies?.next)?.major??15}const Mc=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[Nt(t,`.dev.vars`)],i=an(e,`test`)?Ft(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=Ft(e);return[e.buildCommand,Nt(t,`dist/server/.dev.vars`),...r?[r]:[],Pt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${Ut(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},Nc=new class extends _c{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()}},Pc=new class extends Ec{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=Ut(e),r=[Nt(t,`.dev.vars`)],i=Ft(e);return i&&r.push(i),r.push(Pt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}};function Fc(e){return Ic(e)??(Lc(e)?Dc:Oc)}function Ic(e){let t=e.packageJson.dependencies??{},n=e.packageJson.devDependencies??{};if(t.vinext||n.vinext)return Mc;if(t.next)return Ac;if(n.vite)return Nc;if(zt(e))return Pc}function Lc(e){let t=e.packageJson.dependencies??{};return kc.some(e=>t[e])&&!t[`firebase-functions`]}const Rc={...uc,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},zc={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(Rc),async handler(e){dc(e);let t=await K(e);t||(console.error(p.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i=Ic(n);if(!i)if(Lc(n)||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=Dc;else if(t[`build-ts`]||r[`build-ts`])i=Oc;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await q(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await q(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await q(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await q(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await q(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},Bc=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),Vc=.05,Hc={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`}},Uc={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},Wc={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(Hc).positional(`targets`,Uc.targets),async handler(e){process.exit(await Gc(e))}};async function Gc(n,r={}){let i=Kc(n),a=await K(i);if(!a)return console.error(p.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=al(o,s);for(let n of a.descendants){n.env;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d=Fc(n);console.info(`Running "test" for ${n.name} ...`);let f=St(n);if(f.length>0)return Et(n.name,f),1;let p=qc(n),m=o.filter(e=>!il(e)),h=m.length>0?m:p;if(l&&h!==!1){let e={...i,targets:h},t=await Xc(d.testUnit(n,e),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(t!==0)return t}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`)))continue;let g=o.filter(e=>il(e)),_={...i,targets:g.length>0?g:void 0};switch(i.e2e){case`headless`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:nl(g,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await Yc(await d.testE2EDev(n,_,{playwrightArgs:nl(g,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await Jc(n,_,d,nl(g,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await Jc(n,_,d,nl(g,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.next||u.vite)switch(i.e2e){case`headed`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:nl(g,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await Yc(await d.testE2EDev(n,_,{playwrightArgs:nl(g,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:nl(g,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await Yc(await d.testE2EProduction(n,_,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await Yc(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function Kc(e){return e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?{...e,commandDefaultWbEnv:`test`}:{...e,cascadeEnv:`test`}}function qc(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[`./test/unit/`]:!1}async function Jc(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await q(`${n.buildDocker(e,`test`)}${fc(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await Yc(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await q(pc.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function Yc(e,t,n,r={}){return q(e,t,n,{...r,processSilentOutput:Zc})}function Xc(e,t,n,r={}){return q(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function Zc(e){let t=[],n=new Set,r=[];for(let i of Qc(e)){let e=el(i);n.has(e)||t.some(t=>tl(t,e))||($c(t,n,e),r.push(i))}return r.join(`
|
|
109
|
-
`)}function*
|
|
110
|
-
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function
|
|
111
|
-
No type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.`:`No type errors found.`)),s}function
|
|
112
|
-
`+p.cyan(p.bold(`Dry run — nothing was executed. Steps that would run:`)));for(let t of e)console.info(` - ${t.detail?t.name.padEnd(n)+p.gray(` ${t.detail}`):t.name}`);return}let r=e.map(e=>
|
|
113
|
-
`+p.green(p.bold(`Verified in ${
|
|
114
|
-
`))}function
|
|
115
|
-
`+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function
|
|
116
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJub3JtYWxpemVCdW5Mb2NrZmlsZSIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwicnVuQ29tbWFuZCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsImUiLCJ0IiwibiIsInIiLCJpIiwiciIsInQiLCJuIiwiciIsIm4iLCJuIiwiZSIsImkiLCJ0IiwiZSIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImFyZ3VtZW50c0J1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQiLCJwYXJzZSIsImRlcGxveUNvbW1hbmQiLCJub3JtYWxpemVTaGFyZWRCdW5Mb2NrZmlsZSIsInBhcnNlVG9tbCIsImJ1aWxkZXIiLCJwYXJzZURvdGVudiIsImJ1aWxkZXIiLCJmcyIsInNldFRpbWVvdXQiLCJidWlsZGVyIiwic2V0VGltZW91dCIsImZzIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZGVwbG95Q29tbWFuZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi9iaW4vcnVuQXJncy5qcyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9oYXNoLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9vc29uL2NvbnN0cnVjdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2dldENhY2hlS2V5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9tZW1vaXplT25lLmpzIiwiLi4vc3JjL3V0aWxzL2JpblBhdGgudHMiLCIuLi9zcmMvdXRpbHMvY2kudHMiLCIuLi9zcmMvdXRpbHMvZW52U291cmNlcy50cyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXIudHMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NoZWNrRW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL2xpdGVzdHJlYW0udHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9kZXBsb3kudHMiLCIuLi9zcmMvY29tbWFuZHMvZG90ZW52LnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9idW5Mb2NrZmlsZS50cyIsIi4uL3NyYy91dGlscy93b3JrZXJUeXBlc0Vudi50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5Db2RlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkRldlZhcnMudHMiLCIuLi9zcmMvY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLnRzIiwiLi4vc3JjL3V0aWxzL291dHB1dC50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy9jb21tYW5kcy9tYWludGVuYW5jZS50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUmVnaXN0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JhaWx3YXlFbnYudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVsZWFzZS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9sb2cudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3NlbGVjdFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0T25DaS50cyIsIi4uL3NyYy9jb21tYW5kcy90cmVlS2lsbC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyaWZ5Q29kZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgKGZub3ggcHJvZmlsZSAvIG1pc2UgZW52KSB0byBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ3F1aWV0LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N1cHByZXNzIGVudmlyb25tZW50IHZhcmlhYmxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+ICYge1xuICAvKipcbiAgICogQ29tbWFuZC1sZXZlbCBmYWxsYmFjayBmb3IgYW4gdW5zZXQgV0JfRU5WIChlLmcuIGB3YiB0ZXN0YCBzdXBwbGllcyAndGVzdCcgd2hlbiBleHBsaWNpdCBlbnZcbiAgICogZmxhZ3Mgc3VwcHJlc3MgaXRzIGRlZmF1bHQgdGVzdCBjYXNjYWRlKS4gTm90IGEgQ0xJIGZsYWcuXG4gICAqL1xuICBjb21tYW5kRGVmYXVsdFdiRW52Pzogc3RyaW5nO1xufTtcblxuY29uc3Qgc3RhbmRhcmRXYkVudk1vZGVzID0gbmV3IFNldChbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBXQl9FTlYgdmFsdWUgd2IgZmFsbHMgYmFjayB0byB3aGVuIG5vIGVudiBzb3VyY2UgYW5kIG5vIGV4cG9ydGVkIHZhcmlhYmxlIGRlZmluZXNcbiAqIGl0OiB0aGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGZpcnN0IChgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgIGxvYWRzIHRoZSBzdGFnaW5nIGZpbGVzXG4gKiBidXQgaXRzIHRlc3RzIG11c3Qgc3RpbGwgcnVuIGFzIGB0ZXN0YCwgbWlycm9yaW5nIHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKSwgdGhlbiB0aGVcbiAqIGZvcmNlZCBjYXNjYWRlLCB0aGVuIHRoZSBhbWJpZW50LU5PREVfRU5WLWRyaXZlbiBhdXRvIGNhc2NhZGUgY2xhbXBlZCB0byBhIHN0YW5kYXJkIG1vZGUgKGFcbiAqIG5vbi1zdGFuZGFyZCBOT0RFX0VOViBzdWNoIGFzIGBxYWAgc3RpbGwgc2VsZWN0cyB0aGUgY2FzY2FkZSBzdWZmaXgsIGJ1dCBtdXN0IG5vdCBwcm9kdWNlIGFcbiAqIG5vbi1zdGFuZGFyZCBXQl9FTlYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmIChhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnYpIHJldHVybiBhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnY7XG4gIGlmIChhcmd2LmNhc2NhZGVFbnYpIHJldHVybiBhcmd2LmNhc2NhZGVFbnY7XG4gIC8vIFJlYWQgTk9ERV9FTlYgdGhyb3VnaCB0aGUgYWxpYXMgZm9yIHRoZSBzYW1lIGJ1bmRsZXItaW5saW5pbmcgcmVhc29uIGFzIGluXG4gIC8vIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgYW5kIGZyb20gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgKG5vdCBsb2FkZWQgZmlsZXMpIGJlY2F1c2UgdGhlXG4gIC8vIGNhc2NhZGUgc2VsZWN0aW9uIGJlbG93IHVzZXMgdGhlIGFtYmllbnQgdmFsdWUgYXMgd2VsbC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBkZXJpdmVkID1cbiAgICBhcmd2LmNhc2NhZGVOb2RlRW52IHx8IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogJ2RldmVsb3BtZW50JztcbiAgcmV0dXJuIHN0YW5kYXJkV2JFbnZNb2Rlcy5oYXMoZGVyaXZlZCkgPyBkZXJpdmVkIDogJ2RldmVsb3BtZW50Jztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRoZSByZXBvc2l0b3J5J3MgZm5veCBjb25maWd1cmF0aW9uIGFuZCBtaXNlLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlNvdXJjZU5hbWVzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICAvKipcbiAgICAgKiBMb2FkIHZhcmlhYmxlcyBldmVuIGlmIHRoZXkgYWxyZWFkeSBleGlzdCBpbiBwcm9jZXNzLmVudi5cbiAgICAgKiBVc2VmdWwgd2hlbiBhIHBhcmVudCBwcm9jZXNzIGhhcyBhbHJlYWR5IGluamVjdGVkIHRoZSBmbm94IHZhbHVlcyBpbnRvIHRoZSBlbnZpcm9ubWVudFxuICAgICAqIGFuZCB0aGUgY29uZmlndXJlZCB2YXJpYWJsZXMgdGhlbXNlbHZlcyBhcmUgbmVlZGVkIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKS5cbiAgICAgKi9cbiAgICBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBFeHBhbmQgYCR7V0JfRU5WfWAgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBmYWxsYmFjayBtb2RlIHdoZW4gbm90aGluZyBkZWZpbmVzIFdCX0VOVi5cbiAgICAgKiBPbmx5IGZvciBjYWxsZXJzIHRoYXQgc3Vic2VxdWVudGx5IENPTVBMRVRFIFdCX0VOViB3aXRoIHRoYXQgZmFsbGJhY2sgKHdiJ3MgUHJvamVjdC5lbnYpLlxuICAgICAqL1xuICAgIGV4cGFuZEZhbGxiYWNrV2JFbnY/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgLy8gUmVhZCBOT0RFX0VOViB0aHJvdWdoIGFuIGFsaWFzLCBuZXZlciBhcyB0aGUgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCBtZW1iZXIgZXhwcmVzc2lvbjpcbiAgLy8gYnVuZGxlcnMgcmVwbGFjZSB0aGF0IGV4YWN0IGV4cHJlc3Npb24gYXQgYnVpbGQgdGltZSAocm9sbGRvd24vYnVpbGQtdHMgaW5saW5lIGl0IGFzXG4gIC8vICdwcm9kdWN0aW9uJyksIHdoaWNoIGNvbnN0YW50LWZvbGRzIHRoZSBmYWxsYmFjayBiZWxvdyBhbmQgbWFkZSB0aGUgcHVibGlzaGVkIHdiIHNlbGVjdFxuICAvLyB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdoZW5ldmVyIFdCX0VOViB3YXMgdW5zZXQuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBydW50aW1lRW52LldCX0VOViB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBjb25zdCBzaG91bGRTdXBwcmVzc091dHB1dCA9IHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndik7XG4gIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cnVudGltZUVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtydW50aW1lRW52Lk5PREVfRU5WfWApO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgZm9yY2VzIGEgbW9kZSAoLS1jYXNjYWRlLWVudiAvIC0tY2FzY2FkZS1ub2RlLWVudiAvIGFuIGV4cG9ydGVkXG4gIC8vIFdCX0VOViksIHZhbHVlcyB0aGF0IHRoZSBtb2RlJ3Mgb3duIGZub3ggcHJvZmlsZSBkZWZpbmVzIG11c3Qgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZFxuICAvLyBmcm9tIHRoZSBwYXJlbnQgc2hlbGw6IGEgc3RhbGUgYGV4cG9ydCBEQVRBQkFTRV9VUkw9Li4uYCBmcm9tIGEgZGV2ZWxvcG1lbnQgc2hlbGwgbXVzdCBub3RcbiAgLy8gbGVhayBpbnRvIGB3YiB0ZXN0YCdzIHRlc3QgbW9kZSAoY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuIE9uIENJXG4gIC8vIHRoZSBpbmhlcml0ZWQgdmFyaWFibGVzIGtlZXAgd2lubmluZyDigJQgd29ya2Zsb3dzIGRlbGliZXJhdGVseSBpbmplY3QgZW52IHZhcnMgdGhhdCBvdmVycmlkZVxuICAvLyB0aGUgY29tbWl0dGVkIHZhbHVlcyDigJQgYW5kIHRoYXQgc2hhZG93aW5nIGlzIHRoZSBkZXNpZ25lZCBiZWhhdmlvci5cbiAgY29uc3QgbW9kZUlzRm9yY2VkID0gQm9vbGVhbihcbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudiA/IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JyA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgPyBydW50aW1lRW52LldCX0VOViA6IHVuZGVmaW5lZClcbiAgKTtcbiAgY29uc3QgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ID0gbW9kZUlzRm9yY2VkICYmICFpc0NJRW52aXJvbm1lbnQocnVudGltZUVudi5DSSk7XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IHByb2plY3RIYXNGbm94Q29uZmlnID0gaGFzUHJvamVjdEZub3hDb25maWcoY3dkKTtcbiAgY29uc3QgW2Zub3hFbnZWYXJzLCBmbm94RW52VmFyTmFtZXNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudixcbiAgICBoYXNGbm94Q29uZmlnOiBwcm9qZWN0SGFzRm5veENvbmZpZyxcbiAgfSk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgZm5veEVudlZhcnMpO1xuICAvLyBSZXBvcnQgdGhlIGZub3ggc291cmNlIHdoZW5ldmVyIGZub3gudG9tbCBleGlzdHMg4oCUIGV2ZW4gd2hlbiBpdCB5aWVsZHMgbm8ga2V5cyAoYWxsIHNoYWRvd2VkLFxuICAvLyBlbXB0eSBwcm9maWxlLCBvciBhIGZhaWxpbmcgZXhwb3J0KTogY29uc3VtZXJzIHN1Y2ggYXMgd2IncyByZXF1aXJlZC1lbnZpcm9ubWVudCB2YWxpZGF0aW9uXG4gIC8vIG11c3Qgc2VlIHRoYXQgYSBkZWNsYXJlZCBlbnYgc291cmNlIGV4aXN0cyByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nIG9wZW4uXG4gIGlmIChmbm94RW52VmFyTmFtZXMubGVuZ3RoID4gMCB8fCBwcm9qZWN0SGFzRm5veENvbmZpZykge1xuICAgIGNvbnN0IGZub3hTb3VyY2VOYW1lID0gZm5veEVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKTtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZm5veFNvdXJjZU5hbWUsIGZub3hFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtmbm94RW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2Zub3hTb3VyY2VOYW1lfWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWlzZUVudlZhcnMsIG1pc2VFbnZWYXJOYW1lc10gPSByZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwgZW52VmFycywgb3B0aW9ucyk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgbWlzZUVudlZhcnMpO1xuICBpZiAobWlzZUVudlZhck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBtaXNlU291cmNlTmFtZSA9IG1pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSk7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW21pc2VTb3VyY2VOYW1lLCBtaXNlRW52VmFyTmFtZXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7bWlzZUVudlZhck5hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHttaXNlU291cmNlTmFtZX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IHNvdXJjZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwYW5kIHJlZmVyZW5jZXMgYWdhaW5zdCB0aGUgbGl2ZSBlbnZpcm9ubWVudCBmb3Iga2V5cyBOT1QgbG9hZGVkIGZyb20gZmlsZXMsIHNvIHRoYXQgYVxuICAvLyByZWZlcmVuY2UgdG8gYW4gZXhwb3J0ZWQga2V5IChleGNsdWRlZCBmcm9tIGVudlZhcnMgYnkgcHJvY2Vzcy1lbnYgcHJlY2VkZW5jZSkgcmVzb2x2ZXMgdG9cbiAgLy8gdGhlIGVmZmVjdGl2ZSB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy4gTG9hZGVkIGtleXMgYXJlIGRlbGliZXJhdGVseSBhYnNlbnQgZnJvbVxuICAvLyB0aGUgcmVmZXJlbmNlIHNldDogZG90ZW52LWV4cGFuZCB3b3VsZCBvdGhlcndpc2UgcmVwbGFjZSB0aGVpciBwYXJzZWQgdmFsdWVzIHdpdGggdGhlXG4gIC8vIHByb2Nlc3MgdmFsdWVzLCBicmVha2luZyBjYWxsZXJzIHRoYXQgbmVlZCB0aGUgZmlsZS1kZWZpbmVkIHZhbHVlcyB0aGVtc2VsdmVzLlxuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBkb3RlbnYtZXhwYW5kIHN1YnN0aXR1dGVzIGV4cG9ydGVkIHZhbHVlcyBsaXRlcmFsbHkgaW5zdGVhZCBvZlxuICAgIC8vIHJlY3Vyc2l2ZWx5IHJlLWV4cGFuZGluZyB0aGVtIChhbiBleHBvcnRlZCBgcGEkd29yZGAgbXVzdCBzdGF5IGBwYSR3b3JkYCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gZW52VmFycykpIHJlZmVyZW5jZUVudltrZXldID0gdmFsdWUucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gIH1cbiAgLy8gZG90ZW52LWV4cGFuZCByZXNvbHZlcyByZWZlcmVuY2VzIGluIGtleS1pbnNlcnRpb24gb3JkZXIsIHNvIGEgZm5veCB2YWx1ZSByZWZlcmVuY2luZyBhXG4gIC8vIG1pc2UtcHJvdmlkZWQga2V5IHdvdWxkIHNlZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIG1pc2UgZW50cmllcyBzdGF5ZWQgYXBwZW5kZWQgYWZ0ZXIgdGhlXG4gIC8vIGZub3ggZW50cmllcy4gUmVidWlsZCB0aGUgZXhwYW5zaW9uIGlucHV0IHdpdGggdGhlIGxvd2VyLXByaW9yaXR5IHNvdXJjZXMgZmlyc3Q7IHRoZSB2YWx1ZXNcbiAgLy8gdGhlbXNlbHZlcyBhbHJlYWR5IHJlZmxlY3QgdGhlIGludGVuZGVkIGZub3gtb3Zlci1taXNlIHByZWNlZGVuY2UuXG4gIGNvbnN0IG9yZGVyZWRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFsuLi5taXNlRW52VmFyTmFtZXMsIC4uLmZub3hFbnZWYXJOYW1lc10pIG9yZGVyZWRFbnZWYXJzW2tleV0gPSBlbnZWYXJzW2tleV0hO1xuICBPYmplY3QuYXNzaWduKG9yZGVyZWRFbnZWYXJzLCBlbnZWYXJzKTtcbiAgLy8gZXhwYW5kKCkgbXV0YXRlcyBCT1RIIGl0cyBwYXJzZWQgaW5wdXQgQU5EIHByb2Nlc3NFbnYgKGRvdGVudi1leHBhbmQgd3JpdGVzIGV2ZXJ5IHBhcnNlZFxuICAvLyByZXN1bHQgaW50byBwcm9jZXNzRW52KSwgc28gc25hcHNob3QgYm90aCBmb3IgdGhlIHJlLWV4cGFuc2lvbiBiZWxvdyDigJQgdGhlIHJldHJ5IG11c3Qgbm90XG4gIC8vIHNlZSB0aGUgZmlyc3QgcGFzcydzIHN0YWxlIGRlcGVuZGVudCB2YWx1ZXMuXG4gIGNvbnN0IHByZUV4cGFuc2lvbkVudlZhcnMgPSB7IC4uLm9yZGVyZWRFbnZWYXJzIH07XG4gIGNvbnN0IHByaXN0aW5lUmVmZXJlbmNlRW52ID0geyAuLi5yZWZlcmVuY2VFbnYgfTtcbiAgbGV0IGV4cGFuZGVkRW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZDogb3JkZXJlZEVudlZhcnMsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gb3JkZXJlZEVudlZhcnM7XG4gIC8vIEEgdmFsdWUgcmVmZXJlbmNpbmcgJHtXQl9FTlZ9IG11c3QgZXhwYW5kIHRvIHdoYXQgdGhlIGNoaWxkIHdpbGwgYWN0dWFsbHkgc2VlOiB3aGVuIHRoZVxuICAvLyBFRkZFQ1RJVkUgV0JfRU5WIGVuZHMgdXAgZW1wdHkg4oCUIHdoZXRoZXIgaXQgd2FzIG5ldmVyIGRlZmluZWQsIGRlZmluZWQgZW1wdHksIG9yIGVtcHRpZWQgYnlcbiAgLy8gdGhlIGV4cGFuc2lvbiBpdHNlbGYgKGUuZy4gYFdCX0VOVj0ke01JU1NJTkdfTU9ERX1gKSDigJQgd2IncyBQcm9qZWN0LmVudiBsYXRlciBmaWxscyBpdCB3aXRoXG4gIC8vIHRoZSBmYWxsYmFjayBtb2RlLCBzbyByZS1leHBhbmQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVzIHdpdGggdGhhdCBmYWxsYmFjayBhdmFpbGFibGUuXG4gIC8vIE9wdC1pbiB2aWEgdGhlIG9wdGlvbjogYSBkaXJlY3QgcmVhZEVudmlyb25tZW50VmFyaWFibGVzL3JlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzXG4gIC8vIGNhbGxlciBuZXZlciByZWNlaXZlcyB0aGUgY29tcGxldGVkIFdCX0VOViwgYW5kIGV4cGFuZGluZyByZWZlcmVuY2VzIGFnYWluc3QgYSB2YWx1ZSB0aGF0IGlzXG4gIC8vIG5vdCBhY3R1YWxseSBhcHBsaWVkIHdvdWxkIG1ha2UgdGhlIHBhaXIgaW5jb25zaXN0ZW50LlxuICAvLyBUaGUgbG9hZGVkIGtleSBtYXNrcyB0aGUgYW1iaWVudCB2YWx1ZSwgc28gYSBsb2FkZWQtYnV0LWVtcHRpZWQgV0JfRU5WIG5lZWRzIHRoZSByZXRyeSBldmVuXG4gIC8vIHdoZW4gYW4gZXhwb3J0ZWQgV0JfRU5WIGV4aXN0cyAoYSBmb3JjZWQgbW9kZSBmaWxlIG92ZXJyaWRlcyB0aGUgZXhwb3J0IGxvY2FsbHkpOiByZXRyeSB3aXRoXG4gIC8vIHRoZSB2YWx1ZSB0aGUgbWVyZ2VkIGVudmlyb25tZW50IHdpbGwgdWx0aW1hdGVseSByZXRhaW4uXG4gIGNvbnN0IGVmZmVjdGl2ZVdiRW52ID0gZXhwYW5kZWRFbnZWYXJzLldCX0VOViA/PyBydW50aW1lRW52LldCX0VOVjtcbiAgaWYgKG9wdGlvbnM/LmV4cGFuZEZhbGxiYWNrV2JFbnYgJiYgIWVmZmVjdGl2ZVdiRW52KSB7XG4gICAgY29uc3QgcmVFeHBhbnNpb25JbnB1dCA9IHsgLi4ucHJlRXhwYW5zaW9uRW52VmFycyB9O1xuICAgIGRlbGV0ZSByZUV4cGFuc2lvbklucHV0LldCX0VOVjtcbiAgICBjb25zdCByZXRyeVJlZmVyZW5jZUVudiA9IHsgLi4ucHJpc3RpbmVSZWZlcmVuY2VFbnYsIFdCX0VOVjogcnVudGltZUVudi5XQl9FTlYgfHwgcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndikgfTtcbiAgICBleHBhbmRlZEVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQ6IHJlRXhwYW5zaW9uSW5wdXQsIHByb2Nlc3NFbnY6IHJldHJ5UmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyByZUV4cGFuc2lvbklucHV0O1xuICB9XG4gIHJldHVybiBbZXhwYW5kZWRFbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIHJlcG9zaXRvcnkncyBmbm94IGNvbmZpZ3VyYXRpb24gKGBmbm94LnRvbWxgKS5cbiAqIFRoZSBiYXNlIGBbc2VjcmV0c11gIHRhYmxlIGNhcnJpZXMgdGhlIGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGBbcHJvZmlsZXMuPGNhc2NhZGU+LnNlY3JldHNdYFxuICogb3ZlcmxheXMgaXQ7IGFuIHVua25vd24gcHJvZmlsZSBmYWxscyBiYWNrIHRvIHRoZSBiYXNlIHNlY3JldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzoge1xuICAgIGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuO1xuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0Vudj86IGJvb2xlYW47XG4gICAgLyoqIFByZWNvbXB1dGVkIGhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkgcmVzdWx0LCB0byBhdm9pZCByZS13YWxraW5nIHRoZSBhbmNlc3RvciBkaXJlY3Rvcmllcy4gKi9cbiAgICBoYXNGbm94Q29uZmlnPzogYm9vbGVhbjtcbiAgfVxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIHN0cmluZ1tdXSB7XG4gIGlmICghKG9wdGlvbnM/Lmhhc0Zub3hDb25maWcgPz8gaGFzUHJvamVjdEZub3hDb25maWcoY3dkKSkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBzZWNyZXRzID0gcnVuRm5veEV4cG9ydChjd2QsIGNhc2NhZGUsIHsgcXVpZXQ6IGZhbHNlIH0pO1xuICBpZiAoIXNlY3JldHMpIHJldHVybiBbe30sIFtdXTtcbiAgLy8gYFtwcm9maWxlcy48Y2FzY2FkZT4uc2VjcmV0c11gIGlzIHRoZSBmbm94IGFuYWxvZ3VlIG9mIGAuZW52LjxjYXNjYWRlPmA6IHdoZW4gdGhlIGNhbGxlclxuICAvLyBmb3JjZXMgYSBtb2RlIG9mZiBDSSwgcHJvZmlsZS1zcGVjaWZpYyB2YWx1ZXMgbXVzdCBvdmVycmlkZSBpbmhlcml0ZWQgc2hlbGwgdmFyaWFibGVzIGp1c3RcbiAgLy8gbGlrZSBgLmVudi48bW9kZT5gIHZhbHVlcyBkbywgd2hpbGUgYmFzZSBgW3NlY3JldHNdYCB2YWx1ZXMga2VlcCBsb3NpbmcgdG8gcHJvY2Vzcy5lbnYuIEEga2V5XG4gIC8vIGlzIHByb2ZpbGUtc3BlY2lmaWMgd2hlbiB0aGUgcHJvZmlsZSBleHBvcnQncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2UgZXhwb3J0J3M7IHdoZW4gdGhlXG4gIC8vIGJhc2UgZXhwb3J0IGZhaWxzLCBubyBvdmVycmlkZSBpcyBhcHBsaWVkIChjb25zZXJ2YXRpdmUpLiBUaGUgYmFzZSBleHBvcnQgcnVucyBMQVpJTFksIG9ubHlcbiAgLy8gd2hlbiBhIHByb2Nlc3MuZW52IGNvbGxpc2lvbiBhY3R1YWxseSBuZWVkcyBhZGp1ZGljYXRpbmcg4oCUIGl0IHdvdWxkIG90aGVyd2lzZSBhZGQgYVxuICAvLyBzdWJwcm9jZXNzIChpbmNsdWRpbmcgYWdlIGRlY3J5cHRpb24pIHRvIGV2ZXJ5IGZvcmNlZC1tb2RlIGludm9jYXRpb24gZm9yIG5vdGhpbmcuXG4gIGxldCBjYWNoZWRCYXNlU2VjcmV0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgfCBmYWxzZSA9IGZhbHNlO1xuICBjb25zdCBnZXRCYXNlU2VjcmV0cyA9ICgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKGNhY2hlZEJhc2VTZWNyZXRzID09PSBmYWxzZSkge1xuICAgICAgY2FjaGVkQmFzZVNlY3JldHMgPSBydW5Gbm94RXhwb3J0KGN3ZCwgdW5kZWZpbmVkLCB7IHF1aWV0OiB0cnVlLCBpZ25vcmVQcm9maWxlRW52VmFyOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkQmFzZVNlY3JldHM7XG4gIH07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZWNyZXRzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aW4gb3ZlciBmbm94IGJhc2UgdmFsdWVzLlxuICAgIC8vIChUaGUgbWlzZSByZWFkZXIgYmVsb3cgaW50ZW50aW9uYWxseSB1c2VzIGEgdmFsdWUtZXF1YWxpdHkgY2hlY2sgaW5zdGVhZDogYG1pc2UgZW52YCBlY2hvZXNcbiAgICAvLyBiYWNrIHZhcmlhYmxlcyB0aGUgYW1iaWVudCBtaXNlIGFjdGl2YXRpb24gYWxyZWFkeSBleHBvcnRlZCwgYW5kIGEgZGlmZmVyaW5nIHZhbHVlIG1lYW5zIHRoZVxuICAgIC8vIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGUgc2hvdWxkIHdpbiBvdmVyIHRoZSBzdGFsZSBhY3RpdmF0aW9uLilcbiAgICBpZiAoIW9wdGlvbnM/Lmlnbm9yZVByb2Nlc3NFbnYgJiYga2V5IGluIHByb2Nlc3MuZW52KSB7XG4gICAgICBjb25zdCBiYXNlU2VjcmV0cyA9IG9wdGlvbnM/Lm1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiBjYXNjYWRlID8gZ2V0QmFzZVNlY3JldHMoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBiYXNlU2VjcmV0cyAhPT0gdW5kZWZpbmVkICYmIGJhc2VTZWNyZXRzW2tleV0gIT09IHZhbHVlO1xuICAgICAgaWYgKCFvdmVycmlkZXNQcm9jZXNzRW52KSBjb250aW51ZTtcbiAgICB9XG4gICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcnVuRm5veEV4cG9ydChcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyBxdWlldDogYm9vbGVhbjsgaWdub3JlUHJvZmlsZUVudlZhcj86IGJvb2xlYW4gfVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAvLyBgLS1pZi1taXNzaW5nIGVycm9yYCAoZGVmYXVsdCk6IGZub3ggb3RoZXJ3aXNlIGV4aXRzIDAgYW5kIHNpbGVudGx5IG9taXRzIHNlY3JldHMgaXQgZmFpbHMgdG9cbiAgLy8gcmVzb2x2ZSAoZS5nLiBhIG1pc3NpbmcgYWdlIGtleSksIHdoaWNoIHdvdWxkIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdW5kZWNsYXJlZCBzZWNyZXRzLlxuICAvLyBPcHQtaW4gZXNjYXBlIGhhdGNoIGBXQl9BTExPV19NSVNTSU5HX1NFQ1JFVFM9MWA6IHN3aXRjaCB0byBgd2FybmAgc28gYSBrZXlsZXNzIGNvbnRleHQg4oCUIGUuZy4gYVxuICAvLyBEb2NrZXIvUmFpbHdheSBpbWFnZSBidWlsZCB0aGF0IG9ubHkgaW5saW5lcyBub24tc2VjcmV0IHB1YmxpYyB2YWx1ZXMgKGBBUFBfVElUTEVgLFxuICAvLyBgTkVYVF9QVUJMSUNfKmApIHdoaWxlIHRoZSBhZ2Uga2V5IGlzIGRlbGliZXJhdGVseSBhYnNlbnQg4oCUIHN0aWxsIGxvYWRzIHRoZSByZXNvbHZhYmxlIHZhbHVlc1xuICAvLyAocGxhaW50ZXh0IGRlZmF1bHRzIHBsdXMgYW55IHNlY3JldCB0aGF0IERJRCBkZWNyeXB0KSBpbnN0ZWFkIG9mIGZhaWxpbmcgb3V0cmlnaHQuIGB3YXJuYCwgbm90XG4gIC8vIGBpZ25vcmVgLCBrZWVwcyBmbm94IHJlcG9ydGluZyB0aGUgc2tpcHBlZCBzZWNyZXQgbmFtZXMgb24gc3RkZXJyIChzdXJmYWNlZCBiZWxvdyksIHNvIHJlbGF4aW5nXG4gIC8vIHRoZSBjaGVjayBzdGF5cyBhdWRpdGFibGUgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgZGVjbGFyZWQgc2VjcmV0cy5cbiAgLy8gYC0tbm9uLWludGVyYWN0aXZlYDogcHJvbXB0cyBvciBicm93c2VyIGF1dGggZmxvd3Mgd291bGQgaGFuZyBmb3JldmVyIGJlY2F1c2Ugc3RkaW4gaXMgaWdub3JlZC5cbiAgY29uc3QgYWxsb3dNaXNzaW5nU2VjcmV0cyA9XG4gICAgcHJvY2Vzcy5lbnYuV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTID09PSAnMScgfHwgcHJvY2Vzcy5lbnYuV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTID09PSAndHJ1ZSc7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2V4cG9ydCcsXG4gICAgJy0tZm9ybWF0JyxcbiAgICAnanNvbicsXG4gICAgJy0tbm8tY29sb3InLFxuICAgICctLWlmLW1pc3NpbmcnLFxuICAgIGFsbG93TWlzc2luZ1NlY3JldHMgPyAnd2FybicgOiAnZXJyb3InLFxuICAgICctLW5vbi1pbnRlcmFjdGl2ZScsXG4gIF07XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tcHJvZmlsZScsIGNhc2NhZGUpO1xuICB9XG4gIGlmIChvcHRpb25zLmlnbm9yZVByb2ZpbGVFbnZWYXIpIHtcbiAgICAvLyBXaXRob3V0IGAtLXByb2ZpbGVgLCBmbm94IGZhbGxzIGJhY2sgdG8gRk5PWF9QUk9GSUxFOyB0aGUgYmFzZS1hZGp1ZGljYXRpb24gZXhwb3J0IG11c3RcbiAgICAvLyByZWFkIHRoZSBCQVNFIHNlY3JldHMsIHNvIHRoZSBpbmhlcml0ZWQgcHJvZmlsZSBzZWxlY3Rpb24gaXMgY2xlYXJlZCBmb3IgaXQg4oCUIGFuZCBvbmx5IGZvclxuICAgIC8vIGl0LiBBIFBSSU1BUlkgZXhwb3J0IHN0aWxsIGhvbm9ycyBGTk9YX1BST0ZJTEU6IGl0IGVpdGhlciBzdGF5cyBwcm9maWxlLWxlc3MgKGZub3ggcmVhZHMgdGhlXG4gICAgLy8gdmFyaWFibGUpIG9yIGZvbGRzIGl0IGludG8gdGhlIGAtLXByb2ZpbGVgIGl0IHBhc3NlcyAoc2VlIHdiIGRvdGVudidzIGNhc2NhZGUpLlxuICAgIGRlbGV0ZSBlbnYuRk5PWF9QUk9GSUxFO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ2Zub3gnLCBhcmdzLCB7XG4gICAgY3dkLFxuICAgIGVudixcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSB7XG4gICAgLy8gVGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMgZm5veC1tYW5hZ2VkIHNlY3JldHMgKGZub3gudG9tbCBleGlzdHMpLCBzbyBhIGZhaWxpbmcgZXhwb3J0IG11c3QgYmVcbiAgICAvLyBzdXJmYWNlZDogc3dhbGxvd2luZyBpdCB3b3VsZCBtYWtlIGRlY2xhcmVkIHNlY3JldHMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIG9uZXMuXG4gICAgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBmbm94IHNlY3JldHM6ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlIHx8IHJlc3VsdC5zdGRlcnI/LnRyaW0oKSB8fCBgZm5veCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtyZXN1bHQuc3RhdHVzfWB9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFsbG93TWlzc2luZ1NlY3JldHMgJiYgIW9wdGlvbnMucXVpZXQgJiYgcmVzdWx0LnN0ZGVycj8udHJpbSgpKSB7XG4gICAgLy8gV2l0aCBgLS1pZi1taXNzaW5nIHdhcm5gLCBmbm94IGV4aXRzIDAgYnV0IHJlcG9ydHMgdGhlIHNlY3JldHMgaXQgY291bGQgbm90IHJlc29sdmUgb24gc3RkZXJyLlxuICAgIC8vIFN1cmZhY2UgdGhlbSBzbyByZWxheGluZyB0aGUgY2hlY2sgdmlhIFdCX0FMTE9XX01JU1NJTkdfU0VDUkVUUyBkb2VzIG5vdCBoaWRlIGEgcmVhbCBnYXAuXG4gICAgY29uc29sZS53YXJuKGBXQl9BTExPV19NSVNTSU5HX1NFQ1JFVFM6IGNvbnRpbnVpbmcgd2l0aG91dCB1bnJlc29sdmVkIGZub3ggc2VjcmV0cy5cXG4ke3Jlc3VsdC5zdGRlcnIudHJpbSgpfWApO1xuICB9XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc2VjcmV0cyA9IChwYXJzZWQgYXMgeyBzZWNyZXRzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uc2VjcmV0cztcbiAgaWYgKCFzZWNyZXRzIHx8IHR5cGVvZiBzZWNyZXRzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNlY3JldHMpKSByZXR1cm47XG4gIHJldHVybiBzZWNyZXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvamVjdEZub3hDb25maWcoY3dkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc0FuY2VzdG9yQ29udGFpbmluZyhjd2QsIFsnZm5veC50b21sJ10pO1xufVxuXG5mdW5jdGlvbiBmbm94RW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYGZub3ggZXhwb3J0IC0tcHJvZmlsZSAke2Nhc2NhZGV9YCA6ICdmbm94IGV4cG9ydCc7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgYXJncyA9IFsnZW52JywgJy0tanNvbicsICctLWNkJywgY3dkXTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tZW52JywgY2FzY2FkZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnbWlzZScsIGFyZ3MsIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW3t9LCBbXV07XG4gIH1cbiAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICBpZiAob3B0aW9ucz8uaWdub3JlUHJvY2Vzc0Vudikge1xuICAgICAgLy8gYG1pc2UgZW52YCBhbHdheXMgZW1pdHMgUEFUSCBkdWUgdG8gdG9vbCBzaGltczsgY29uc3VtZXJzIG9mIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXNcbiAgICAgIC8vIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKSBtdXN0IG5vdCBwcm9wYWdhdGUgaXQuXG4gICAgICBpZiAoa2V5ID09PSAnUEFUSCcpIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZCwgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddKTtcbn1cblxuZnVuY3Rpb24gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZDogc3RyaW5nLCBmaWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgaWYgKGZpbGVOYW1lcy5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsIGZpbGVOYW1lKSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKHBhcmVudFBhdGggPT09IGN1cnJlbnRQYXRoKSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gY2FzY2FkZSA/IGBtaXNlIGVudiAtLWVudiAke2Nhc2NhZGV9YCA6ICdtaXNlIGVudic7XG59XG5cbmZ1bmN0aW9uIGlzQ0lFbnZpcm9ubWVudChjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qgb3V0cHV0T3B0aW9ucyA9IGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgcXVpZXRFbnY/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBvdXRwdXRPcHRpb25zLnF1aWV0RW52ID09PSB0cnVlIHx8IChvdXRwdXRPcHRpb25zLnF1aWV0RW52ICE9PSBmYWxzZSAmJiBvdXRwdXRPcHRpb25zLnNpbGVudCA9PT0gdHJ1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBmbm94L21pc2UgYW5kIGFzc2lnbnMgdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICAvLyBFeGlzdGluZyBwcm9jZXNzLmVudiBrZXlzIGFyZSBrZXB0OiBlbnZWYXJzIG1heSBkZWxpYmVyYXRlbHkgY29udGFpbiBkaWZmZXJpbmcgdmFsdWVzIHRoYXRcbiAgICAvLyBtdXN0IHdpbiBvbmx5IGluIHRoZSByZXR1cm5lZCByZWNvcmQgKG1pc2UgY2FzY2FkZS1wcm9maWxlIHZhbHVlcywgZm9yY2VkLW1vZGUgb3ZlcnJpZGVzXG4gICAgLy8gY29uc3VtZWQgdmlhIGBwcm9qZWN0LmVudmApLCBuZXZlciBjbG9iYmVyIHRoZSBjYWxsZXIncyBvd24gcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCJjb25zdCBib29sZWFuT3B0aW9uTmFtZXMgPSBuZXcgU2V0KFtcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnLFxuICAnY2FzY2FkZS1ub2RlLWVudicsXG4gICdkcnktcnVuJyxcbiAgJ2RyeScsXG4gICdkJyxcbiAgJ2hlbHAnLFxuICAnaCcsXG4gICdxdWlldC1lbnYnLFxuICAndmVyYm9zZScsXG4gICd2JyxcbiAgJ3ZlcnNpb24nLFxuXSk7XG5jb25zdCB2YWx1ZU9wdGlvbk5hbWVzID0gbmV3IFNldChbJ2Nhc2NhZGUtZW52JywgJ3dvcmtpbmctZGlyJywgJ3cnXSk7XG5jb25zdCBib3VuZGFyeU1hcmtlckVudk5hbWUgPSAnV0JfSU5URVJOQUxfUlVOX0JPVU5EQVJZX01BUktFUic7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm90ZWN0UnVuU2NyaXB0QXJncyhhcmd2KSB7XG4gIGNvbnN0IHJ1bkluZGV4ID0gZmluZFRvcExldmVsUnVuSW5kZXgoYXJndik7XG4gIGlmIChydW5JbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRJbmRleCA9IGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBydW5JbmRleCArIDEpO1xuICBpZiAoc2NyaXB0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBhcmd2W3NjcmlwdEluZGV4IC0gMV0gPT09ICctLScpIHJldHVybjtcblxuICBjb25zdCBleGlzdGluZ01hcmtlciA9IHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV07XG4gIGlmIChhcmd2W3NjcmlwdEluZGV4ICsgMV0gPT09ICctLScpIHtcbiAgICBpZiAoZXhpc3RpbmdNYXJrZXIgJiYgYXJndltzY3JpcHRJbmRleCArIDJdID09PSBleGlzdGluZ01hcmtlcikgcmV0dXJuO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBtYXJrZXI7XG4gIGRvIG1hcmtlciA9IGBfX1dCX1JVTl9TQ1JJUFRfQVJHU18ke3JhbmRvbVVVSUQoKX1fX2A7XG4gIHdoaWxlIChhcmd2LmluY2x1ZGVzKG1hcmtlcikpO1xuICBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdID0gbWFya2VyO1xuICBhcmd2LnNwbGljZShzY3JpcHRJbmRleCArIDEsIDAsICctLScsIG1hcmtlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5TY3JpcHRBcmdzKGFyZ3YpIHtcbiAgY29uc3QgcnVuSW5kZXggPSBmaW5kVG9wTGV2ZWxSdW5JbmRleChhcmd2KTtcbiAgaWYgKHJ1bkluZGV4ID09PSAtMSkgcmV0dXJuIFtdO1xuICBjb25zdCBzY3JpcHRJbmRleCA9IGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBydW5JbmRleCArIDEpO1xuICBpZiAoc2NyaXB0SW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGFyZ3MgPSBhcmd2LnNsaWNlKHNjcmlwdEluZGV4KTtcbiAgY29uc3QgbWFya2VyID0gcHJvY2Vzcy5lbnZbYm91bmRhcnlNYXJrZXJFbnZOYW1lXTtcbiAgaWYgKG1hcmtlciAmJiBhcmdzWzFdID09PSAnLS0nICYmIGFyZ3NbMl0gPT09IG1hcmtlcikgYXJncy5zcGxpY2UoMSwgMik7XG4gIGRlbGV0ZSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZmluZFRvcExldmVsUnVuSW5kZXgoYXJndikge1xuICBmb3IgKGxldCBpbmRleCA9IDI7IGluZGV4IDwgYXJndi5sZW5ndGg7ICkge1xuICAgIGNvbnN0IGNvbnN1bWVkID0gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpO1xuICAgIGlmIChjb25zdW1lZCA9PT0gMCkgcmV0dXJuIGFyZ3ZbaW5kZXhdID09PSAncnVuJyA/IGluZGV4IDogLTE7XG4gICAgaW5kZXggKz0gY29uc3VtZWQ7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBmaW5kUnVuU2NyaXB0SW5kZXgoYXJndiwgc3RhcnRJbmRleCkge1xuICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgYXJndi5sZW5ndGg7ICkge1xuICAgIGlmIChhcmd2W2luZGV4XSA9PT0gJy0tJykgcmV0dXJuIGFyZ3ZbaW5kZXggKyAxXSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaW5kZXggKyAxO1xuICAgIGNvbnN0IGNvbnN1bWVkID0gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpO1xuICAgIGlmIChjb25zdW1lZCA9PT0gMCkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4ICs9IGNvbnN1bWVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvdW50T3B0aW9uVG9rZW5zKGFyZ3YsIGluZGV4KSB7XG4gIGNvbnN0IGFyZyA9IGFyZ3ZbaW5kZXhdO1xuICBpZiAoIWFyZz8uc3RhcnRzV2l0aCgnLScpIHx8IGFyZyA9PT0gJy0nKSByZXR1cm4gMDtcbiAgaWYgKGFyZy5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgY29uc3Qgb3B0aW9uVGV4dCA9IGFyZy5zbGljZSgyKTtcbiAgICBjb25zdCBlcXVhbHNJbmRleCA9IG9wdGlvblRleHQuaW5kZXhPZignPScpO1xuICAgIGNvbnN0IHJhd05hbWUgPSBlcXVhbHNJbmRleCA9PT0gLTEgPyBvcHRpb25UZXh0IDogb3B0aW9uVGV4dC5zbGljZSgwLCBlcXVhbHNJbmRleCk7XG4gICAgY29uc3QgbmFtZSA9IHJhd05hbWUuc3RhcnRzV2l0aCgnbm8tJykgPyByYXdOYW1lLnNsaWNlKDMpIDogcmF3TmFtZTtcbiAgICBpZiAoYm9vbGVhbk9wdGlvbk5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIGVxdWFsc0luZGV4ID09PSAtMSAmJiBpc0Jvb2xlYW5MaXRlcmFsKGFyZ3ZbaW5kZXggKyAxXSkgPyAyIDogMTtcbiAgICB9XG4gICAgaWYgKCF2YWx1ZU9wdGlvbk5hbWVzLmhhcyhuYW1lKSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGVxdWFsc0luZGV4ID09PSAtMSA/IDIgOiAxO1xuICB9XG5cbiAgY29uc3Qgc2hvcnRPcHRpb25zID0gYXJnLnNsaWNlKDEpO1xuICBpZiAoL15bZGh2XT0oZmFsc2V8dHJ1ZSkkLy50ZXN0KHNob3J0T3B0aW9ucykpIHJldHVybiAxO1xuICBpZiAoL15bZGh2XSQvLnRlc3Qoc2hvcnRPcHRpb25zKSAmJiBpc0Jvb2xlYW5MaXRlcmFsKGFyZ3ZbaW5kZXggKyAxXSkpIHJldHVybiAyO1xuICBmb3IgKGxldCBvcHRpb25JbmRleCA9IDA7IG9wdGlvbkluZGV4IDwgc2hvcnRPcHRpb25zLmxlbmd0aDsgb3B0aW9uSW5kZXgrKykge1xuICAgIGNvbnN0IG5hbWUgPSBzaG9ydE9wdGlvbnNbb3B0aW9uSW5kZXhdO1xuICAgIGlmIChib29sZWFuT3B0aW9uTmFtZXMuaGFzKG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAodmFsdWVPcHRpb25OYW1lcy5oYXMobmFtZSkpIHJldHVybiBvcHRpb25JbmRleCArIDEgPCBzaG9ydE9wdGlvbnMubGVuZ3RoID8gMSA6IDI7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbkxpdGVyYWwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZSc7XG59XG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuKiBBIFNIQTMtNTEyIGltcGxlbWVudGF0aW9uIHNwZWNpYWxpemVkIGFuZCBvcHRpbWl6ZWQgZnJvbVxuKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfSAodmVyc2lvbiAwLjkuMykuXG4qXG4qIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4qIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4qIEBsaWNlbnNlIE1JVFxuKi9cbmNvbnN0IGU9QXJyYXkuZnJvbSh7bGVuZ3RoOjI1Nn0sKGUsdCk9PnQudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsYDBgKSksdD1uZXcgSW50MzJBcnJheShbMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF0pLG49bmV3IEludDMyQXJyYXkoNTApLHI9bmV3IEludDMyQXJyYXkoMTgpLGk9bmV3IFRleHRFbmNvZGVyO2xldCBhPW5ldyBVaW50OEFycmF5KDQwOTYpLG89bmV3IFVpbnQzMkFycmF5KGEuYnVmZmVyKTtjb25zdCBlZT1uZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoWzFdKS5idWZmZXIpWzBdPT09MTtmdW5jdGlvbiBzKHQpe2xldCBzPXQubGVuZ3RoKjMsbD1hLHU9bztpZihsLmxlbmd0aDxzKXtsZXQgZT1sLmxlbmd0aCoyO2Zvcig7ZTxzOyllKj0yO2w9bmV3IFVpbnQ4QXJyYXkoZSksdT1uZXcgVWludDMyQXJyYXkobC5idWZmZXIpLGU8PTEwNDg1NzYmJihhPWwsbz11KX1sZXQgZD1pLmVuY29kZUludG8odCxsKS53cml0dGVuLGY9bjtmLmZpbGwoMCk7bGV0IHA9MDtpZihlZSl7bGV0IGU9MDtmb3IoO2QtcD49NzI7KXtmb3IobGV0IHQ9MDt0PDE4O3QrKylmW3RdPWZbdF1edVtlK3RdO2MoZiksZSs9MTgscCs9NzJ9fWVsc2UgZm9yKDtkLXA+PTcyOyl7Zm9yKGxldCBlPTA7ZTwxODtlKyspe2xldCB0PXArKGU8PDIpO2ZbZV09ZltlXV4obFt0XXxsW3QrMV08PDh8bFt0KzJdPDwxNnxsW3QrM108PDI0KX1jKGYpLHArPTcyfWxldCBtPXI7bS5maWxsKDApO2ZvcihsZXQgZT1wO2U8ZDtlKyspe2xldCB0PWUtcDttW3Q+PjJdPW1bdD4+Ml18bFtlXTw8KCh0JjMpPDwzKX1sZXQgaD1kLXA7bVtoPj4yXT1tW2g+PjJdfDY8PCgoaCYzKTw8MyksbVsxN118PTIxNDc0ODM2NDg7Zm9yKGxldCBlPTA7ZTwxODtlKyspZltlXT1mW2VdXm1bZV07YyhmKTtsZXQgZz1gYDtmb3IobGV0IHQ9MDt0PDE2O3QrPTQpe2xldCBuPWZbdF0scj1mW3QrMV0saT1mW3QrMl0sYT1mW3QrM107Zys9ZVtuJjI1NV0rZVtuPj44JjI1NV0rZVtuPj4xNiYyNTVdK2Vbbj4+PjI0XStlW3ImMjU1XStlW3I+PjgmMjU1XStlW3I+PjE2JjI1NV0rZVtyPj4+MjRdK2VbaSYyNTVdK2VbaT4+OCYyNTVdK2VbaT4+MTYmMjU1XStlW2k+Pj4yNF0rZVthJjI1NV0rZVthPj44JjI1NV0rZVthPj4xNiYyNTVdK2VbYT4+PjI0XX1yZXR1cm4gZ31mdW5jdGlvbiBjKGUpe2xldCBuLHIsaSxhLG8sZWUscyxjLGwsdSxkLGYscCxtLGgsZyx0ZSxuZSxyZSxpZSxhZSxvZSxzZSxjZSxsZSx1ZSxkZSxmZSxwZSxtZSxoZSxnZSxfZSx2ZSx5ZSxiZSx4ZSxTZSxDZSx3ZSxUZSxFZSxEZSxPZSxrZSxBZSxqZSxNZSxOZSxQZSxGZSxJZSxMZSxSZSx6ZSxCZSxWZSxIZSxVZSxXZSxHZSxLZSxxZSxfPWVbMF0sdj1lWzFdLHk9ZVsyXSxKZT1lWzNdLGI9ZVs0XSx4PWVbNV0sUz1lWzZdLEM9ZVs3XSx3PWVbOF0sVD1lWzldLEU9ZVsxMF0sRD1lWzExXSxPPWVbMTJdLGs9ZVsxM10sQT1lWzE0XSxqPWVbMTVdLE09ZVsxNl0sTj1lWzE3XSxQPWVbMThdLEY9ZVsxOV0sST1lWzIwXSxMPWVbMjFdLFI9ZVsyMl0sej1lWzIzXSxCPWVbMjRdLFY9ZVsyNV0sSD1lWzI2XSxVPWVbMjddLFc9ZVsyOF0sRz1lWzI5XSxLPWVbMzBdLHE9ZVszMV0sSj1lWzMyXSxZPWVbMzNdLFg9ZVszNF0sWj1lWzM1XSxRPWVbMzZdLCQ9ZVszN10sWWU9ZVszOF0sWGU9ZVszOV0sWmU9ZVs0MF0sUWU9ZVs0MV0sJGU9ZVs0Ml0sZXQ9ZVs0M10sdHQ9ZVs0NF0sbnQ9ZVs0NV0scnQ9ZVs0Nl0saXQ9ZVs0N10sYXQ9ZVs0OF0sb3Q9ZVs0OV07Zm9yKGk9MDtpPDQ4O2krPTIpYT1fXkVeSV5LXlplLG89dl5EXkxecV5RZSxlZT15Xk9eUl5KXiRlLHM9SmVea156XlleZXQsYz1iXkFeQl5YXnR0LGw9eF5qXlZeWl5udCx1PVNeTV5IXlFecnQsZD1DXk5eVV4kXml0LGY9d15QXldeWWVeYXQscD1UXkZeR15YZV5vdCxuPWZeKGVlPDwxfHM+Pj4zMSkscj1wXihzPDwxfGVlPj4+MzEpLF9ePW4sdl49cixFXj1uLERePXIsSV49bixMXj1yLEtePW4scV49cixaZV49bixRZV49cixuPWFeKGM8PDF8bD4+PjMxKSxyPW9eKGw8PDF8Yz4+PjMxKSx5Xj1uLEplXj1yLE9ePW4sa149cixSXj1uLHpePXIsSl49bixZXj1yLCRlXj1uLGV0Xj1yLG49ZWVeKHU8PDF8ZD4+PjMxKSxyPXNeKGQ8PDF8dT4+PjMxKSxiXj1uLHhePXIsQV49bixqXj1yLEJePW4sVl49cixYXj1uLFpePXIsdHRePW4sbnRePXIsbj1jXihmPDwxfHA+Pj4zMSkscj1sXihwPDwxfGY+Pj4zMSksU149bixDXj1yLE1ePW4sTl49cixIXj1uLFVePXIsUV49biwkXj1yLHJ0Xj1uLGl0Xj1yLG49dV4oYTw8MXxvPj4+MzEpLHI9ZF4obzw8MXxhPj4+MzEpLHdePW4sVF49cixQXj1uLEZePXIsV149bixHXj1yLFllXj1uLFhlXj1yLGF0Xj1uLG90Xj1yLG09XyxoPXYsQWU9RDw8NHxFPj4+MjgsamU9RTw8NHxEPj4+MjgsZmU9STw8M3xMPj4+MjkscGU9TDw8M3xJPj4+MjksV2U9cTw8OXxLPj4+MjMsR2U9Szw8OXxxPj4+MjMsRWU9WmU8PDE4fFFlPj4+MTQsRGU9UWU8PDE4fFplPj4+MTQsdmU9eTw8MXxKZT4+PjMxLHllPUplPDwxfHk+Pj4zMSxnPWs8PDEyfE8+Pj4yMCx0ZT1PPDwxMnxrPj4+MjAsTWU9Ujw8MTB8ej4+PjIyLE5lPXo8PDEwfFI+Pj4yMixtZT1ZPDwxM3xKPj4+MTksaGU9Sjw8MTN8WT4+PjE5LEtlPSRlPDwyfGV0Pj4+MzAscWU9ZXQ8PDJ8JGU+Pj4zMCxSZT14PDwzMHxiPj4+Mix6ZT1iPDwzMHx4Pj4+MixiZT1BPDw2fGo+Pj4yNix4ZT1qPDw2fEE+Pj4yNixuZT1WPDwxMXxCPj4+MjEscmU9Qjw8MTF8Vj4+PjIxLFBlPVg8PDE1fFo+Pj4xNyxGZT1aPDwxNXxYPj4+MTcsZ2U9bnQ8PDI5fHR0Pj4+MyxfZT10dDw8Mjl8bnQ+Pj4zLGNlPVM8PDI4fEM+Pj40LGxlPUM8PDI4fFM+Pj40LEJlPU48PDIzfE0+Pj45LFZlPU08PDIzfE4+Pj45LFNlPUg8PDI1fFU+Pj43LENlPVU8PDI1fEg+Pj43LGllPVE8PDIxfCQ+Pj4xMSxhZT0kPDwyMXxRPj4+MTEsSWU9aXQ8PDI0fHJ0Pj4+OCxMZT1ydDw8MjR8aXQ+Pj44LE9lPXc8PDI3fFQ+Pj41LGtlPVQ8PDI3fHc+Pj41LHVlPVA8PDIwfEY+Pj4xMixkZT1GPDwyMHxQPj4+MTIsSGU9Rzw8N3xXPj4+MjUsVWU9Vzw8N3xHPj4+MjUsd2U9WWU8PDh8WGU+Pj4yNCxUZT1YZTw8OHxZZT4+PjI0LG9lPWF0PDwxNHxvdD4+PjE4LHNlPW90PDwxNHxhdD4+PjE4LF89bV5+ZyZuZSx2PWhefnRlJnJlLEU9Y2VefnVlJmZlLEQ9bGVefmRlJnBlLEk9dmVefmJlJlNlLEw9eWVefnhlJkNlLEs9T2VefkFlJk1lLHE9a2VefmplJk5lLFplPVJlXn5CZSZIZSxRZT16ZV5+VmUmVWUseT1nXn5uZSZpZSxKZT10ZV5+cmUmYWUsTz11ZV5+ZmUmbWUsaz1kZV5+cGUmaGUsUj1iZV5+U2Umd2Usej14ZV5+Q2UmVGUsSj1BZV5+TWUmUGUsWT1qZV5+TmUmRmUsJGU9QmVefkhlJldlLGV0PVZlXn5VZSZHZSxiPW5lXn5pZSZvZSx4PXJlXn5hZSZzZSxBPWZlXn5tZSZnZSxqPXBlXn5oZSZfZSxCPVNlXn53ZSZFZSxWPUNlXn5UZSZEZSxYPU1lXn5QZSZJZSxaPU5lXn5GZSZMZSx0dD1IZV5+V2UmS2UsbnQ9VWVefkdlJnFlLFM9aWVefm9lJm0sQz1hZV5+c2UmaCxNPW1lXn5nZSZjZSxOPWhlXn5fZSZsZSxIPXdlXn5FZSZ2ZSxVPVRlXn5EZSZ5ZSxRPVBlXn5JZSZPZSwkPUZlXn5MZSZrZSxydD1XZV5+S2UmUmUsaXQ9R2VefnFlJnplLHc9b2Vefm0mZyxUPXNlXn5oJnRlLFA9Z2VefmNlJnVlLEY9X2VefmxlJmRlLFc9RWVefnZlJmJlLEc9RGVefnllJnhlLFllPUllXn5PZSZBZSxYZT1MZV5+a2UmamUsYXQ9S2VeflJlJkJlLG90PXFlXn56ZSZWZSxfXj10W2ldLHZePXRbaSsxXTtlWzBdPV8sZVsxXT12LGVbMl09eSxlWzNdPUplLGVbNF09YixlWzVdPXgsZVs2XT1TLGVbN109QyxlWzhdPXcsZVs5XT1ULGVbMTBdPUUsZVsxMV09RCxlWzEyXT1PLGVbMTNdPWssZVsxNF09QSxlWzE1XT1qLGVbMTZdPU0sZVsxN109TixlWzE4XT1QLGVbMTldPUYsZVsyMF09SSxlWzIxXT1MLGVbMjJdPVIsZVsyM109eixlWzI0XT1CLGVbMjVdPVYsZVsyNl09SCxlWzI3XT1VLGVbMjhdPVcsZVsyOV09RyxlWzMwXT1LLGVbMzFdPXEsZVszMl09SixlWzMzXT1ZLGVbMzRdPVgsZVszNV09WixlWzM2XT1RLGVbMzddPSQsZVszOF09WWUsZVszOV09WGUsZVs0MF09WmUsZVs0MV09UWUsZVs0Ml09JGUsZVs0M109ZXQsZVs0NF09dHQsZVs0NV09bnQsZVs0Nl09cnQsZVs0N109aXQsZVs0OF09YXQsZVs0OV09b3R9ZXhwb3J0e3MgYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXAiLCJjb25zdCBlPXIoKSx0PW5ldyBUZXh0RW5jb2RlcixuPW5ldyBUZXh0RGVjb2RlcihgdXRmLThgKTtmdW5jdGlvbiByKCl7cmV0dXJuIG5ldyBNYXAoW3tpbnN0YW5jZTpFcnJvcixmcm9tOmU9PntsZXQgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIGUuc3RhY2shPT12b2lkIDAmJnQucHVzaChlLnN0YWNrKSxlLmNhdXNlIT09dm9pZCAwJiYoZS5zdGFjaz09PXZvaWQgMCYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5FcnJvcigpLGh5ZHJhdGU6KGUsW3QsbixyLGldKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHI9PT12b2lkIDA/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1yLGkhPT12b2lkIDAmJihlLmNhdXNlPWkpfX0se2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShuLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+dC5lbmNvZGUoYXRvYihlKSl9LHtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2ZvcihsZXRbbixyXW9mIHQpZS5zZXQobixyKX19LHtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGxldCBuIG9mIHQpZS5hZGQobil9fSx7aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSx7aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LHtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9XS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfWV4cG9ydHtlIGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcCIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIGV9ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtmdW5jdGlvbiB0KHQsbj1lKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocih0LG4pKX1mdW5jdGlvbiBuKGUpe2lmKGU9PT12b2lkIDApcmV0dXJuLTE7aWYodHlwZW9mIGU9PWBudW1iZXJgKXtpZihOdW1iZXIuaXNOYU4oZSkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZShlKSlyZXR1cm4gZTwwPy01Oi00fXJldHVybiBudWxsfWZ1bmN0aW9uIHIodCxyPWUpe2xldCBpPW4odCk7aWYoaSE9PW51bGwpcmV0dXJuIGk7bGV0IGE9W10sbz1uZXcgTWFwO3JldHVybiBzKHQpLGE7ZnVuY3Rpb24gcyhlKXtsZXQgdD1uKGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2xldCBpPW8uZ2V0KGUpO2lmKGkhPT12b2lkIDApcmV0dXJuIGk7c3dpdGNoKGk9YS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VgbnVtYmVyYDpjYXNlYHN0cmluZ2A6Y2FzZWBib29sZWFuYDphW2ldPWUsby5zZXQoZSxpKTticmVhaztjYXNlYGJpZ2ludGA6YVtpXT1bLTYsZS50b1N0cmluZygxNildLG8uc2V0KGUsaSk7YnJlYWs7Y2FzZWBvYmplY3RgOmlmKGU9PT1udWxsKWFbaV09ZSxvLnNldChlLGkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7bGV0IHQ9ZS5sZW5ndGgsbj1BcnJheSh0KTthW2ldPW4sby5zZXQoZSxpKTtmb3IobGV0IHI9MDtyPHQ7cisrKW5bcl09cyhlW3JdKX1lbHNle2xldCB0PWUuY29uc3RydWN0b3Isbj10eXBlb2YgdD09YGZ1bmN0aW9uYD9yLmdldCh0Lm5hbWUpOnZvaWQgMDtpZihuPT09dm9pZCAwKXtsZXQgdD1PYmplY3Qua2V5cyhlKSxuPXQubGVuZ3RoLHI9QXJyYXkobituKzEpO3JbMF09YGAsYVtpXT1yLG8uc2V0KGUsaSk7Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49dFtpXSxhPWkraTtyW2ErMV09cyhuKSxyW2ErMl09cyhlW25dKX19ZWxzZXtsZXQgcj1uLmZyb20oZSksYz1yLmxlbmd0aCxsPUFycmF5KGMrMSk7bFswXT10Lm5hbWUsYVtpXT1sLG8uc2V0KGUsaSk7Zm9yKGxldCBlPTA7ZTxjO2UrKylsW2UrMV09cyhyW2VdKX19fXJldHVybiBpfX1leHBvcnR7dCBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcCIsImltcG9ydHtzaGEzXzUxMiBhcyBlfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgdH1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbihuLHIpe3JldHVybiBlKHQoW24scl0pKX1mdW5jdGlvbiByKGUsbil7cmV0dXJuIHQoW2Usbl0pfWZ1bmN0aW9uIGkoKXtyZXR1cm5gYH1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbiBhcyBnZXRDYWNoZUtleU9mSGFzaCxyIGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXAiLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGUsZ2V0Q2FjaGVLZXlPZkhhc2ggYXMgdH1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1pKHtnZXRDYWNoZUtleTp0fSkscj1pKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gaSh7Y2FjaGVEdXJhdGlvbjplPTEvMCxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxyKXtsZXQgaSxhLG87cmV0dXJuIHI/LmtpbmQ9PT1gZ2V0dGVyYD9mdW5jdGlvbigpe2xldCByPW4odGhpcyxbXSkscz1EYXRlLm5vdygpO3JldHVybihvIT09cnx8cy1hPmUpJiYobz1yLGk9dC5jYWxsKHRoaXMpLGE9cyksaX06ZnVuY3Rpb24oLi4ucyl7bGV0IGM9bih0aGlzLHMpLGw9RGF0ZS5ub3coKTtyZXR1cm4obyE9PWN8fGwtYT5lKSYmKG89YyxpPVJlZmxlY3QuYXBwbHkodCxyP3RoaXM6dm9pZCAwLHMpLGE9bCksaX19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsaSBhcyBtZW1vaXplT25lRmFjdG9yeSxyIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBQcmVwZW5kIGV2ZXJ5IGV4aXN0aW5nIGBub2RlX21vZHVsZXMvLmJpbmAgZGlyZWN0b3J5IGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeSB1cCB0byB0aGVcbiAqIHJlcG9zaXRvcnkgcm9vdCAob3IgZmlsZXN5c3RlbSByb290KSB0byB0aGUgZW52aXJvbm1lbnQncyBQQVRILCBuZWFyZXN0IGRpcmVjdG9yeSBmaXJzdCBzb1xuICogYSB3b3Jrc3BhY2UtbG9jYWwgZGVwZW5kZW5jeSB3aW5zIG92ZXIgYSByZXBvc2l0b3J5LXJvb3Qgb25lLiBOZWVkZWQgd2hlcmV2ZXIgd2Igc3RyaXBzXG4gKiB5YXJuJ3MgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgZnJvbSBQQVRIICh5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyBvbmx5XG4gKiB0aHJvdWdoIHRoYXQgZm9sZGVyLCBuZXZlciB0aHJvdWdoIGBub2RlX21vZHVsZXMvLmJpbmAgb24gUEFUSCksIHNvIHRoYXQgYmFyZSBiaW5hcnkgbmFtZXNcbiAqIGluIHdyYXBwZWQgY29tbWFuZHMga2VlcCByZXNvbHZpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgoZGlyUGF0aDogc3RyaW5nLCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBib29sZWFuIHtcbiAgY29uc3QgYmluUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICBiaW5QYXRocy5wdXNoKGJpblBhdGgpO1xuICAgIH1cblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gIH1cbiAgaWYgKGJpblBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBlbnYuUEFUSCA9IGVudi5QQVRIID8gYCR7YmluUGF0aHMuam9pbignOicpfToke2Vudi5QQVRIfWAgOiBiaW5QYXRocy5qb2luKCc6Jyk7XG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHJ1dGh5RW52VmFsdWUoY2lFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1RydXRoeUVudlZhbHVlKHByb2plY3QuZW52LldCX0RPQ0tFUik7XG59XG5cbmZ1bmN0aW9uIGlzVHJ1dGh5RW52VmFsdWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF2YWx1ZSAmJiB2YWx1ZSAhPT0gJzAnICYmIHZhbHVlICE9PSAnZmFsc2UnO1xufVxuIiwiLyoqXG4gKiBUaGUga2V5cyBhY3R1YWxseSBkZWNsYXJlZCBpbiB0aGUgcHJvamVjdCdzIGZub3ggc291cmNlcy4gYG1pc2UgZW52YCBpcyByZXBvcnRlZCBhcyBhXG4gKiBwc2V1ZG8tc291cmNlIHRoYXQgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyAoUEFUSCwgQ0FSR09fSE9NRSwgUlVTVFVQXyosIC4uLik7IHRob3NlIG11c3RcbiAqIG5ldmVyIGJlIHRyZWF0ZWQgYXMgdGhlIHByb2plY3QncyBvd24gdmFyaWFibGVzLCBzbyB0aGV5IGFyZSBleGNsdWRlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgcmVhZG9ubHkgc3RyaW5nW11dPik6IFNldDxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBTZXQoZW52U291cmNlcy5maWx0ZXIoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpLmZsYXRNYXAoKFssIGtleXNdKSA9PiBrZXlzKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlc0J1blJ1bnRpbWUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIE1pcnJvcnMgUHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXI6IHRoZSBvdXRlcm1vc3QgcGFja2FnZU1hbmFnZXIgZGVjbGFyYXRpb24gKHRoZVxuICAvLyB3b3Jrc3BhY2Ugcm9vdCdzKSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbmVzdGVkIG9uZXMsIGFuZCBhbiBleHBsaWNpdCBub24tQnVuIGRlY2xhcmF0aW9uXG4gIC8vIHdpbnMgb3ZlciB0aGUgZGlyZWN0b3J5IG1hcmtlcnMuIFRoZSB3YWxrIHRoZXJlZm9yZSBjb2xsZWN0cyBzaWduYWxzIHVwIHRvIHRoZSByZXBvc2l0b3J5XG4gIC8vIHJvb3QgaW5zdGVhZCBvZiBkZWNpZGluZyBhdCB0aGUgZmlyc3QgaGl0LCBzbyBhIGNoaWxkIHdvcmtzcGFjZSBjYW5ub3Qgb3ZlcnJpZGUgdGhlIHJvb3QuXG4gIGxldCBvdXRlcm1vc3RQYWNrYWdlTWFuYWdlcjogdW5rbm93bjtcbiAgbGV0IGhhc1NvbWVCdW5EaXJlY3RvcnlNYXJrZXIgPSBmYWxzZTtcbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByZWFkUGFja2FnZU1hbmFnZXJGaWVsZChwYXRoLmpvaW4oY3VycmVudFBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgaWYgKHBhY2thZ2VNYW5hZ2VyICE9PSB1bmRlZmluZWQpIG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyID0gcGFja2FnZU1hbmFnZXI7XG4gICAgaGFzU29tZUJ1bkRpcmVjdG9yeU1hcmtlciB8fD0gaGFzQnVuRGlyZWN0b3J5TWFya2VyKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpIHx8IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkgPT09IGN1cnJlbnRQYXRoKSB7XG4gICAgICBpZiAoaXNFeHBsaWNpdE5vbkJ1blBhY2thZ2VNYW5hZ2VyKG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGhhc1NvbWVCdW5EaXJlY3RvcnlNYXJrZXIgfHwgaXNCdW5QYWNrYWdlTWFuYWdlcihvdXRlcm1vc3RQYWNrYWdlTWFuYWdlcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZGlyZWN0b3J5IGNhcnJpZXMgYSBidW4gbWFya2VyOiBhIGJ1biBsb2NrZmlsZSwgYSBtaXNlLXBpbm5lZCBidW4sIG9yIGFcbiAqIGAudG9vbC12ZXJzaW9uc2AgYnVuIGVudHJ5LiB3YmZ5IG1pZ3JhdGVzIC50b29sLXZlcnNpb25zIGludG8gbWlzZS50b21sLCBzbyBhIG1pc2UtcGlubmVkIGJ1blxuICogbXVzdCBjb3VudCBhcyB3ZWxsOiByZXBvcyB0aGF0IGdpdGlnbm9yZSBidW4ubG9jayBhbmQgaGF2ZSBubyBwYWNrYWdlTWFuYWdlciBmaWVsZCByZWx5IG9uIHRoZVxuICogdG9vbCBtYW5pZmVzdC4gVGhpcyBpcyB0aGUgc2luZ2xlIHNpZ25hbCBsaXN0IGRlY2lkaW5nIGJ1bi12cy15YXJuOyBgUHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXJgXG4gKiBhbmQgYHVzZXNCdW5SdW50aW1lYCBzaGFyZSBpdCDigJQgYW5kIGJvdGggZ2l2ZSBhbiBleHBsaWNpdCBub24tQnVuIHBhY2thZ2VNYW5hZ2VyIGRlY2xhcmF0aW9uXG4gKiBwcmVjZWRlbmNlIG92ZXIgaXQgKHNlZSBpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIpIOKAlCBzbyB0aGUgdHdvIGRldGVjdGlvbnMgY2Fubm90IGRyaWZ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQnVuRGlyZWN0b3J5TWFya2VyKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10uc29tZSgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSkpIHx8XG4gICAgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgdGVzdEZpbGVDb250ZW50KHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSksIC9eXFxzKig/OlwiYnVuXCJ8YnVuKVxccyo9L20pXG4gICAgKSB8fFxuICAgIHRlc3RGaWxlQ29udGVudChwYXRoLmpvaW4oZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksIC8oXnxcXG4pYnVuXFxzLylcbiAgKTtcbn1cblxuLyoqXG4gKiBBbiBleHBsaWNpdCBub24tQnVuIHBhY2thZ2VNYW5hZ2VyIGRlY2xhcmF0aW9uIChlLmcuIGB5YXJuQDQuMTcuMGApIG92ZXJyaWRlcyB0aGUgZGlyZWN0b3J5XG4gKiBtYXJrZXJzOiB5YXJuLWVyYSByZXBvc2l0b3JpZXMgbWF5IHBpbiBidW4gaW4gbWlzZS50b21sIHNvbGVseSBmb3IgYGJ1bnhgLWJhc2VkIGhlbHBlcnNcbiAqIChlLmcuIGB3YiByYWlsd2F5LWVudmApLCBhbmQgQnVuLW1hbmFnZWQgcmVwb3NpdG9yaWVzIG5ldmVyIGRlY2xhcmUgYSBub24tQnVuIHBhY2thZ2VNYW5hZ2VyXG4gKiAod2JmeSBkZWxldGVzIHRoZSBmaWVsZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIocGFja2FnZU1hbmFnZXI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgISFwYWNrYWdlTWFuYWdlci50cmltKCkgJiYgIWlzQnVuUGFja2FnZU1hbmFnZXIocGFja2FnZU1hbmFnZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJyAmJiBwYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCdidW5AJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlTWFuYWdlckZpZWxkKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgcGFja2FnZU1hbmFnZXI/OiB1bmtub3duIH0pLnBhY2thZ2VNYW5hZ2VyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEFMTE9XRURfVEVTVF9ESVJFQ1RPUllfTkFNRVMgPSBuZXcgU2V0KFsndW5pdCcsICdlMmUnLCAnZGVidWcnLCAnaGVscGVycycsICdmaXh0dXJlcyddKTtcbmNvbnN0IFJVTk5BQkxFX1RFU1RfRElSRUNUT1JZX05BTUVTID0gbmV3IFNldChbJ3VuaXQnLCAnZTJlJywgJ2RlYnVnJ10pO1xuY29uc3QgVEVTVF9GSUxFX05BTUVfUkVHRVhQID0gL1xcLig/OnRlc3R8c3BlYylcXC5bY21dP1tqdF1zeD8kLztcblxuLyoqXG4gKiBFbmZvcmNlcyB0aGUgdGVzdC1sYXlvdXQgY29udmVudGlvbiB3aXRoIG5vIGZhbGxiYWNrOiBgdGVzdC9gIG1heSBjb250YWluIG9ubHkgdGhlIGB1bml0YCwgYGUyZWAsXG4gKiBgZGVidWdgLCBgaGVscGVyc2AsIGFuZCBgZml4dHVyZXNgIGRpcmVjdG9yaWVzLCBhbmQgdGVzdCBmaWxlcyBtYXkgZXhpc3Qgb25seSB1bmRlciBgdGVzdC91bml0L2AsXG4gKiBgdGVzdC9lMmUvYCwgYW5kIGB0ZXN0L2RlYnVnL2Ag4oCUIGFueXdoZXJlIGVsc2UgaW4gdGhlIHByb2plY3QgKGUuZy4gYHRlc3QvaGVscGVycy9gLCBgc3JjL2AsIG9yIHRoZVxuICogcHJvamVjdCByb290KSwgd2Igd291bGQgc2lsZW50bHkgc2tpcCB0aGVtLiBBIHByb2plY3QncyBvd24gUGxheXdyaWdodCBjb25maWcgYWxzbyByZXF1aXJlc1xuICogYHRlc3QvZTJlYCBmb3IgdGhlIHNhbWUgcmVhc29uLiBgdGVzdC9maXh0dXJlcy9gIGlzIGV4ZW1wdCBmcm9tIHRoZSB0ZXN0LWZpbGUgY2hlY2sgYmVjYXVzZVxuICogZml4dHVyZXMgbWF5IGNvbnRhaW4gdGVzdCBmaWxlcyBhcyBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRlc3REaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnKTtcbiAgY29uc3QgdmlvbGF0aW9ucyA9IFsuLi5maW5kRmlsZVN5c3RlbVZpb2xhdGlvbnMocHJvamVjdC5kaXJQYXRoKV07XG4gIC8vIE9ubHkgYSBwcm9qZWN0J3MgT1dOIFBsYXl3cmlnaHQgY29uZmlnIGNvdW50czogYSB3b3Jrc3BhY2Ugcm9vdCBsZWdpdGltYXRlbHkgc2hhcmVzIGEgcm9vdC1sZXZlbFxuICAvLyBwbGF5d3JpZ2h0LmNvbmZpZy50cyB3aGlsZSBrZWVwaW5nIGUyZSBzcGVjcyBpbiBhIHNpbmdsZSBhcHAgcGFja2FnZS4gQ2hlY2tlZCBvdXRzaWRlIHRoZVxuICAvLyBtZW1vaXplZCB3YWxrIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgY2FsbGVyLXN1cHBsaWVkIHBhY2thZ2VKc29uLCBub3Qgb25seSB0aGUgZGlyZWN0b3J5LlxuICBpZiAoXG4gICAgIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3BsYXl3cmlnaHQuY29uZmlnLnRzJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRlc3REaXJQYXRoLCAnZTJlJykpXG4gICkge1xuICAgIHZpb2xhdGlvbnMucHVzaCgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gdmlvbGF0aW9ucztcbn1cblxuLy8gVGhlIHJlY3Vyc2l2ZSB3YWxrIGlzIHRoZSBleHBlbnNpdmUgcGFydCBhbmQgcnVucyBmb3IgdGhlIHNhbWUgZGlyZWN0b3JpZXMgZnJvbSBib3RoIGB3YiBsaW50YFxuLy8gYW5kIGB3YiB0ZXN0YCB3aXRoaW4gb25lIGB3YiB2ZXJpZnlgLCBzbyBpdHMgcmVzdWx0IGlzIHNoYXJlZCBwZXIgcHJvamVjdCBkaXJlY3RvcnkuXG5jb25zdCBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUZXN0U3RydWN0dXJlQ2FjaGUoKTogdm9pZCB7XG4gIGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUuY2xlYXIoKTtcbn1cblxuZnVuY3Rpb24gZmluZEZpbGVTeXN0ZW1WaW9sYXRpb25zKHByb2plY3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNhY2hlZFZpb2xhdGlvbnMgPSBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlLmdldChwcm9qZWN0RGlyUGF0aCk7XG4gIGlmIChjYWNoZWRWaW9sYXRpb25zKSByZXR1cm4gY2FjaGVkVmlvbGF0aW9ucztcblxuICBjb25zdCB2aW9sYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0ZXN0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgJ3Rlc3QnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmModGVzdERpclBhdGgpKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyh0ZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICAvLyBPUyBhbmQgZWRpdG9yIGFydGlmYWN0cyBzdWNoIGFzIC5EU19TdG9yZSBhcmUgZW52aXJvbm1lbnQgbm9pc2UsIG5vdCBsYXlvdXQgbWlzdGFrZXMuXG4gICAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCcuJykpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpIHx8ICFBTExPV0VEX1RFU1RfRElSRUNUT1JZX05BTUVTLmhhcyhlbnRyeS5uYW1lKSkge1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goYHRlc3QvJHtlbnRyeS5uYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGgsICcnLCB2aW9sYXRpb25zKTtcbiAgLy8gQSB0ZXN0IGZpbGUgZGlyZWN0bHkgdW5kZXIgdGVzdC8gaXMgcmVwb3J0ZWQgYnkgYm90aCB0aGUgdG9wLWxldmVsIGNoZWNrIGFuZCB0aGUgc3RyYXktZmlsZSB3YWxrLlxuICBjb25zdCB1bmlxdWVWaW9sYXRpb25zID0gWy4uLm5ldyBTZXQodmlvbGF0aW9ucyldO1xuICBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlLnNldChwcm9qZWN0RGlyUGF0aCwgdW5pcXVlVmlvbGF0aW9ucyk7XG4gIHJldHVybiB1bmlxdWVWaW9sYXRpb25zO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGg6IHN0cmluZywgcmVsYXRpdmVEaXJQYXRoOiBzdHJpbmcsIHZpb2xhdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZnMucmVhZGRpclN5bmMocGF0aC5qb2luKHByb2plY3REaXJQYXRoLCByZWxhdGl2ZURpclBhdGgpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAvLyBIaWRkZW4gZW50cmllcyAoLmdpdCwgLnRtcCwgLm5leHQsIC4uLikgYW5kIGRlcGVuZGVuY2llcyBhcmUgbm90IHByb2plY3QtYXV0aG9yZWQgdGVzdCBsb2NhdGlvbnM6XG4gICAgLy8gdGhlIGNvbnZlbnRpb24gcGxhY2VzIHRlc3RzIG9ubHkgdW5kZXIgdGVzdC8sIHNvIGEgdGVzdCBmaWxlIGluIGEgaGlkZGVuIGRpcmVjdG9yeSAoZS5nLlxuICAgIC8vIC5zdG9yeWJvb2spIGlzIG91dHNpZGUgdGhlIGlucHV0IGNvbnRyYWN0LCBhbmQgZW51bWVyYXRpbmcgZW52aXJvbm1lbnRhbCBoaWRkZW4gZGlyZWN0b3JpZXNcbiAgICAvLyBpbnN0ZWFkIHdvdWxkIGZhbHNlLXBvc2l0aXZlIG9uIGFueSB1bmxpc3RlZCBnZW5lcmF0ZWQgb25lICgudHVyYm8sIC53cmFuZ2xlciwgLi4uKS4gVmlzaWJsZVxuICAgIC8vIGJ1aWxkIG91dHB1dHMgc3VjaCBhcyBkaXN0LyBhcmUgZGVsaWJlcmF0ZWx5IE5PVCBza2lwcGVkOiB3YmZ5LW1hbmFnZWQgYnVpbGRzIG5ldmVyIGVtaXRcbiAgICAvLyB0ZXN0LXBhdHRlcm4gZmlsZXMgdGhlcmUsIHNvIGFueSBtYXRjaCBpcyBhbiBhdXRob3JlZCBmaWxlIHdvcnRoIGZsYWdnaW5nLlxuICAgIC8vIFN5bWxpbmtzIGZhaWwgYGlzRGlyZWN0b3J5KClgIG9uIGEgRGlyZW50LCBzbyBjeWNsZXMgYXJlIGltcG9zc2libGUuXG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnLicpIHx8IGVudHJ5Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnKSBjb250aW51ZTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZURpclBhdGggPyBgJHtyZWxhdGl2ZURpclBhdGh9LyR7ZW50cnkubmFtZX1gIDogZW50cnkubmFtZTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgLy8gdGVzdC91bml0LCB0ZXN0L2UyZSwgYW5kIHRlc3QvZGVidWcgaG9sZCB0aGUgcnVubmFibGUgdGVzdHM7IHRlc3QvZml4dHVyZXMgbWF5IGNvbnRhaW5cbiAgICAgIC8vIHRlc3QgZmlsZXMgYXMgZGF0YS5cbiAgICAgIGlmIChyZWxhdGl2ZURpclBhdGggPT09ICd0ZXN0JyAmJiAoUlVOTkFCTEVfVEVTVF9ESVJFQ1RPUllfTkFNRVMuaGFzKGVudHJ5Lm5hbWUpIHx8IGVudHJ5Lm5hbWUgPT09ICdmaXh0dXJlcycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQSBuZXN0ZWQgcGFja2FnZSAoZS5nLiBhIHdvcmtzcGFjZSBtZW1iZXIpIGlzIHZhbGlkYXRlZCBhcyBpdHMgb3duIHByb2plY3QuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsIHJlbGF0aXZlUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG4gICAgICBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGgsIHJlbGF0aXZlUGF0aCwgdmlvbGF0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChURVNUX0ZJTEVfTkFNRV9SRUdFWFAudGVzdChlbnRyeS5uYW1lKSkge1xuICAgICAgdmlvbGF0aW9ucy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3ROYW1lOiBzdHJpbmcsIHZpb2xhdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgY2hhbGsucmVkKFxuICAgICAgYEludmFsaWQgdGVzdCBsYXlvdXQgaW4gJHtwcm9qZWN0TmFtZX0uIHRlc3QvIG1heSBjb250YWluIG9ubHkgdGhlIHVuaXQsIGUyZSwgZGVidWcsIGhlbHBlcnMsIGFuZCBmaXh0dXJlcyBkaXJlY3RvcmllcywgdGVzdCBmaWxlcyBtYXkgZXhpc3Qgb25seSB1bmRlciB0ZXN0L3VuaXQvLCB0ZXN0L2UyZS8sIGFuZCB0ZXN0L2RlYnVnLywgYW5kIGEgUGxheXdyaWdodCBjb25maWcgcmVxdWlyZXMgdGVzdC9lMmUvOlxcbmAgK1xuICAgICAgICB2aW9sYXRpb25zLm1hcCgodmlvbGF0aW9uKSA9PiBgICAke3Zpb2xhdGlvbn1gKS5qb2luKCdcXG4nKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIGV2ZXJ5IHByb2plY3QncyBsYXlvdXQgdmlvbGF0aW9ucyBhbmQgdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIGFueSBwcm9qZWN0IHZpb2xhdGVkIHRoZVxuICogY29udmVudGlvbiwgc28gYSBzaW5nbGUgcnVuIHN1cmZhY2VzIGFsbCBvZiB0aGVtIGluc3RlYWQgb2Ygb25seSB0aGUgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnbmFtZScgfCAncGFja2FnZUpzb24nPltdKTogYm9vbGVhbiB7XG4gIGxldCB2aW9sYXRlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QpO1xuICAgIGlmICh2aW9sYXRpb25zLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QubmFtZSwgdmlvbGF0aW9ucyk7XG4gICAgdmlvbGF0ZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiB2aW9sYXRlZDtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHNpbGVudD86IGJvb2xlYW4gfSkuc2lsZW50ID09PSB0cnVlICYmXG4gICAgZ2V0T3B0aW9uVmFsdWUoYXJndiwgJ3F1aWV0LWVudicpID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgYXJncy5wdXNoKCctLXF1aWV0LWVudicpO1xuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4vc2hlbGwuanMnO1xuXG5jb25zdCB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcyA9IFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ107XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGdlbmVyYXRpbmcgYSAuZGV2LnZhcnMgZmlsZSAodmlhIGB3YiBnZW4tZGV2LXZhcnNgKSBzbyB0aGF0XG4gKiBgd3JhbmdsZXIgZGV2YCBjYW4gc2VlIHRoZSB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndjogU2NyaXB0QXJndiwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICd3YicsICdnZW4tZGV2LXZhcnMnLCAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksIG91dHB1dFBhdGhdKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGB3cmFuZ2xlciBkZXZgLXN0eWxlIGNvbW1hbmQuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlZgIG1ha2VzIHdyYW5nbGVyIHNlcnZlIHRoZSB0b3AtbGV2ZWxcbiAqIChub24tZGVwbG95KSBjb25maWcuIHdyYW5nbGVyIChsaWtlIHZpbmV4dCkgcmVxdWlyZXMgcmVhbCBOb2RlLmpzIOKAlCBgYnVuIHJ1bmAgcmVzcGVjdHMgdGhlIGJpbidzXG4gKiBub2RlIHNoZWJhbmcsIGFuZCB3YiBuZXZlciBjb21wb3NlcyBgLS1idW5gICh3aG9zZSBub2RlLT5idW4gUEFUSCBzaGltIGJyZWFrcyBib3RoIHRvb2xzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKGFyZ3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZW52IC11IENMT1VERkxBUkVfRU5WIFlBUk4gd3JhbmdsZXIgJHthcmdzfWAudHJpbSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBhcHBseWluZyB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyB0byB0aGUgbG9jYWwgZGF0YWJhc2UsIG9yIHVuZGVmaW5lZFxuICogaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIG9yIG5vIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGRpcmVjdG9yeS5cbiAqIENJPXRydWUgc3VwcHJlc3NlcyB3cmFuZ2xlcidzIGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbiBwcm9tcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSB8fCAhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCkpIHJldHVybjtcblxuICByZXR1cm4gYENJPXRydWUgWUFSTiB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5ICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYDtcbn1cblxuLyoqXG4gKiBQcmVmaXggdGhlIGdpdmVuIHNjcmlwdCB3aXRoIGNvbW1hbmRzIGV4cG9ydGluZyBEQVRBQkFTRV9VUkwgcG9pbnRpbmcgdG8gdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZSxcbiAqIHNvIHRoYXQgZHJpenpsZS1raXQgYW5kIHNlZWQgc2NyaXB0cyBjYW4gb3BlcmF0ZSBvbiB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgYXBwLlxuICogRG8gbm90aGluZyBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2UgaW4gaXRzIHdyYW5nbGVyIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSkgcmV0dXJuIHNjcmlwdDtcblxuICAvLyBFeGNsdWRpbmcgbWluaWZsYXJlJ3MgbWV0YWRhdGEuc3FsaXRlLCB3aGljaCBsaXZlcyBuZXh0IHRvIHRoZSBoYXNoLW5hbWVkIGRhdGFiYXNlIGZpbGUuXG4gIC8vIEFuIHVubWF0Y2hlZCBnbG9iIGNhbm5vdCBoYXBwZW4gaGVyZTogdGhlIHNjcmlwdCBydW5zIHVuZGVyIC9iaW4vc2ggKHZpYSBOb2RlJ3MgYHNoZWxsOiB0cnVlYCksXG4gIC8vIGFuZCB0aGUgcHJlY2VkaW5nIG1hdGVyaWFsaXphdGlvbiBjb21tYW5kIGd1YXJhbnRlZXMgdGhlIFNRTGl0ZSBmaWxlIGV4aXN0cy5cbiAgLy8gUHJvamVjdHMgd2l0aCBtdWx0aXBsZSBEMSBkYXRhYmFzZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IHRoZSBoYXNoLW5hbWVkIGZpbGVzIGNhbm5vdCBiZVxuICAvLyBkaXN0aW5ndWlzaGVkIGNoZWFwbHkgKG1hdGVyaWFsaXphdGlvbiBkb2VzIG5vdCBldmVuIHVwZGF0ZSB0aGUgdGFyZ2V0IGZpbGUncyBtdGltZSkuXG4gIC8vIFRoZSBzdGF0ZSBkaXJlY3RvcnkgbXVzdCBiZSBhYnNvbHV0ZSBiZWNhdXNlIHRoZSB3cmFwcGVkIHNjcmlwdCBtYXkgYGNkYCB0byB0aGUgbW9ub3JlcG8gcm9vdC5cbiAgY29uc3Qgc3RhdGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpKTtcbiAgY29uc3QgZXhwb3J0Q29tbWFuZCA9IGBleHBvcnQgREFUQUJBU0VfVVJMPVwiZmlsZTokKGxzIFwiJHtzdGF0ZURpclBhdGh9XCIvdjMvZDEvbWluaWZsYXJlLUQxRGF0YWJhc2VPYmplY3QvKi5zcWxpdGUgfCBncmVwIC12IG1ldGFkYXRhIHwgaGVhZCAtMSlcImA7XG4gIHJldHVybiBgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZGF0YWJhc2VOYW1lKX0gJiYgJHtleHBvcnRDb21tYW5kfSAmJiAke3NjcmlwdH1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgRDEgZGF0YWJhc2UgZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoLCAnZGF0YWJhc2VfbmFtZScpO1xufVxuXG4vLyBMb29rZWQgdXAgZnJvbSBtYW55IGNhbGwgc2l0ZXMgKGZyYW1ld29yayBkZXRlY3Rpb24sIHdvcmtlci10eXBlcyBnZW5lcmF0aW9uLCBkZXBsb3ksIHRlc3QpLCBzb1xuLy8gdGhlIGV4aXN0ZW5jZSBwcm9iZXMgYXJlIHNoYXJlZC4gS2V5ZWQgb24gdGhlIHByb2plY3QgT0JKRUNUIChub3QgaXRzIGRpcmVjdG9yeSBwYXRoKTogdGhlIHNhbWVcbi8vIHNoYXJlZCBQcm9qZWN0IGluc3RhbmNlIGZsb3dzIHRocm91Z2ggZXZlcnkgY2FsbCBzaXRlIHdpdGhpbiBvbmUgaW52b2NhdGlvbiwgd2hpbGUgY2FsbGVycyB0aGF0XG4vLyByZXdyaXRlIGNvbmZpZ3MgYW5kIHBhc3MgZnJlc2ggcGFydGlhbCBvYmplY3RzIG11c3Qgb2JzZXJ2ZSB0aGUgY3VycmVudCBkaXNrIHN0YXRlLlxuY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHsgY29uZmlnUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkIH0+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIFRlc3RzIG1heSBwYXNzIHBhcnRpYWwgUHJvamVjdCBvYmplY3RzIHdpdGhvdXQgZGlyUGF0aC5cbiAgaWYgKCFwcm9qZWN0LmRpclBhdGgpIHJldHVybjtcbiAgY29uc3QgY2FjaGVkID0gd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUuZ2V0KHByb2plY3QpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkLmNvbmZpZ1BhdGg7XG5cbiAgY29uc3QgY29uZmlnUGF0aCA9IHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzXG4gICAgLm1hcCgoZmlsZU5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVOYW1lKSlcbiAgICAuZmluZCgoZmlsZVBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKTtcbiAgd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUuc2V0KHByb2plY3QsIHsgY29uZmlnUGF0aCB9KTtcbiAgcmV0dXJuIGNvbmZpZ1BhdGg7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIG9mIHRoZSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyBkaXJlY3RvcnkgKGBtaWdyYXRpb25zX2RpcmAgaW4gdGhlIHdyYW5nbGVyXG4gKiBjb25maWcsIGRlZmF1bHRpbmcgdG8gYG1pZ3JhdGlvbnNgKSBpZiBpdCBleGlzdHMgb24gZGlzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGguam9pbihcbiAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgc2NhbldyYW5nbGVyQ29uZmlnVmFsdWUoY29uZmlnUGF0aCwgJ21pZ3JhdGlvbnNfZGlyJykgPz8gJ21pZ3JhdGlvbnMnXG4gICk7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSA/IG1pZ3JhdGlvbnNEaXJQYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBmaXJzdCB2YWx1ZSBkZWNsYXJlZCBmb3IgdGhlIGtleSBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLCBjb3ZlcmluZyBKU09OKEMpXG4gKiAoYFwia2V5XCI6IFwiLi4uXCJgKSBhbmQgVE9NTCwgaW5jbHVkaW5nIGl0cyBpbmxpbmUtdGFibGUgZm9ybSAoYGQxX2RhdGFiYXNlcyA9IFt7IC4uLiwga2V5ID0gXCIuLi5cIiB9XWApLFxuICogd2l0aG91dCBmdWxsIHBhcnNlcnMuIENvbW1lbnRlZC1vdXQgbGluZXMgYXJlIHNraXBwZWQgc28gdGhhdCB0aGV5IGNhbm5vdCBzaGFkb3cgdGhlIGFjdGl2ZVxuICogdmFsdWUsIGFuZCB0aGUga2V5IG11c3QgZm9sbG93IGEgbGluZSBzdGFydCwgYHtgIG9yIGAsYCBzbyB0aGF0IHByb3NlIG1lbnRpb25pbmcgaXQgY2Fubm90IG1hdGNoLlxuICovXG5mdW5jdGlvbiBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoOiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5VmFsdWVQYXR0ZXJuID0gbmV3IFJlZ0V4cChgKD86XnxbLHtdKVxcXFxzKltcIiddPyR7a2V5fVtcIiddP1xcXFxzKls6PV1cXFxccypbXCInXShbXlwiJ10rKVtcIiddYCwgJ3UnKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0ga2V5VmFsdWVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBtYXRlcmlhbGl6aW5nIHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKiBBIG5vLW9wIHF1ZXJ5IGZvcmNlcyBtaW5pZmxhcmUgdG8gY3JlYXRlIHRoZSBTUUxpdGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC5cbiAqIE9ubHkgc3Rkb3V0IGlzIHN1cHByZXNzZWQ7IHdyYW5nbGVyIHJlcG9ydHMgZXJyb3JzIG9uIHN0ZGVyciwgd2hpY2ggbXVzdCBzdGF5IHZpc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4sIGRhdGFiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBZQVJOIHdyYW5nbGVyIGQxIGV4ZWN1dGUgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1jb21tYW5kIFwiU0VMRUNUIDFcIiA+IC9kZXYvbnVsbGA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBsb2NhbCB3cmFuZ2xlci9taW5pZmxhcmUgc3RhdGUgZGlyZWN0b3J5LlxuICogRGV2ZWxvcG1lbnQgZm9sbG93cyB3cmFuZ2xlcidzIGRlZmF1bHQgZGlyZWN0b3J5IHNvIHRoYXQgcGxhaW4gYHdyYW5nbGVyIGRldmAgLyBgdmluZXh0IGRldmBcbiAqICh3aXRob3V0IGEgcGVyc2lzdC1wYXRoIG92ZXJyaWRlKSBzaGFyZXMgdGhlIHNhbWUgZGF0YWJhc2UgYXMgd2ItbWFuYWdlZCBkYiBjb21tYW5kcy5cbiAqIE90aGVyIGVudmlyb25tZW50cyAoZS5nLiB0ZXN0KSBnZXQgdGhlaXIgb3duIGRpcmVjdG9yeSBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc2V0XG4gKiB3aXRob3V0IGRlc3Ryb3lpbmcgZGV2ZWxvcG1lbnQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4pOiBzdHJpbmcge1xuICAvLyBEZXN0cnVjdGl2ZSB0ZXN0IHJlc2V0cyBhcmUgZ2F0ZWQgb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSwgd2hpY2ggYWNjZXB0c1xuICAvLyBlaXRoZXIgV0JfRU5WIG9yIE1JU0VfRU5WOyByZXNvbHZlIHRvIHRoZSB0ZXN0IGRpcmVjdG9yeSB3aGVuZXZlciBlaXRoZXIgc2F5cyAndGVzdCcgc29cbiAgLy8gdGhhdCBzdWNoIHJlc2V0cyBjYW4gbmV2ZXIgdGFyZ2V0IHRoZSBkZXZlbG9wbWVudCBzdGF0ZS5cbiAgY29uc3Qgd2JFbnYgPSBbcHJvamVjdC5lbnYuV0JfRU5WLCBwcm9qZWN0LmVudi5NSVNFX0VOVl0uaW5jbHVkZXMoJ3Rlc3QnKVxuICAgID8gJ3Rlc3QnXG4gICAgOiBwcm9qZWN0LmVudi5XQl9FTlYgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlY7XG4gIHJldHVybiAhd2JFbnYgfHwgd2JFbnYgPT09ICdkZXZlbG9wbWVudCcgPyAnLndyYW5nbGVyL3N0YXRlJyA6IGAud3JhbmdsZXIvc3RhdGUtJHt3YkVudn1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuLFxuICByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsXG4gIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxuICByZXNvbHZlRmFsbGJhY2tXYkVudixcbiAgc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IHNlbGVjdEZub3hTb3VyY2VkS2V5cyB9IGZyb20gJy4vdXRpbHMvZW52U291cmNlcy5qcyc7XG5pbXBvcnQgeyBoYXNCdW5EaXJlY3RvcnlNYXJrZXIsIGlzQnVuUGFja2FnZU1hbmFnZXIsIGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlciB9IGZyb20gJy4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgeyBjbGVhclRlc3RTdHJ1Y3R1cmVDYWNoZSB9IGZyb20gJy4vdXRpbHMvdGVzdFN0cnVjdHVyZS5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbi8qKiBUaGUgZmlsZSBgd3JhbmdsZXIgdHlwZXNgIHdyaXRlcyBieSBkZWZhdWx0LiAqL1xuY29uc3QgV09SS0VSX1RZUEVTX0ZJTEVfTkFNRSA9ICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgLy8gVGhlIHBhY2thZ2UgbWFuYWdlciBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiOlxuICAvLyBgbm9kZSB3YiAuLi5gIGFnYWluc3QgYSBCdW4gcmVwbyBtdXN0IHN0aWxsIHJ1biBgYnVuIGluc3RhbGxgLCBhbmQgdmljZSB2ZXJzYS5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCgpOiAnYnVuJyB8ICd5YXJuJyB7XG4gICAgcmV0dXJuIHRoaXMuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIGdldCBwYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKTogJ2J1biBydW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIC8vIEEgc2luZ2xlIHNpZ25hbCBkZWNpZGVzIGV2ZXJ5IGJ1bi12cy15YXJuIGJyYW5jaCBpbiB3YiAoc2NyaXB0IG5vcm1hbGl6YXRpb24gaW5jbHVkZWQpOlxuICAvLyBzcGxpdHRpbmcgdGhlIHRvb2wtbWFuaWZlc3Qgc2lnbmFsIGZyb20gdGhlIGxvY2tmaWxlIHNpZ25hbCBvbmNlIHByb2R1Y2VkIGNvbW1hbmRzIG1peGluZ1xuICAvLyBgYnVuIGluc3RhbGxgIHdpdGggYHlhcm4gcHJpc21hIC4uLmAgaW4gbWlzZS1waW5uZWQgcmVwb3Mgd2hvc2UgYnVuLmxvY2sgaXMgZ2l0aWdub3JlZC5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICAvLyBTb21lIHJlcG9zaXRvcmllcyByZWx5IG9uIHRoZSBsb2NrZmlsZSBvciBwYWNrYWdlTWFuYWdlciBmaWVsZCBpbnN0ZWFkIG9mIG1pc2UuXG4gICAgLy8gRG9ja2VyIG9wdGltaXphdGlvbiBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiLlxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgaWYgKGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaGFzQnVuRGlyZWN0b3J5TWFya2VyKHRoaXMucm9vdERpclBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgLyoqIEEgd29ya3NwYWNlIHJvb3Qgd2l0aG91dCBzb3VyY2VzIG9mIGl0cyBvd24gcnVucyBuZWl0aGVyIGxpbnQgbm9yIHR5cGVjaGVjayBjb21tYW5kcy4gKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc093blNvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgdGhpcy5oYXNTb3VyY2VDb2RlO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNsYXJlZEVudktleUNhY2hlOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG5hbWVzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhlIFBST0pFQ1QgZGVjbGFyZXMgKGl0cyBmbm94Ly5lbnYgc291cmNlcyksIGV4Y2x1ZGluZ1xuICAgKiBib3RoIHRoZSBhbWJpZW50IHByb2Nlc3MgZW52aXJvbm1lbnQgYW5kIHRoZSBgbWlzZSBlbnZgIHBzZXVkby1zb3VyY2UgdGhhdCByZXBvcnRzIGhvc3QvdG9vbFxuICAgKiB2YXJpYWJsZXMgc3VjaCBhcyBQQVRILiBgZW52YCBjYW5ub3QgYW5zd2VyIHRoaXM6IGl0IG1lcmdlcyBwcm9jZXNzLmVudiwgc28gYSBwcm9qZWN0IHZhcmlhYmxlXG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gaW5oZXJpdGVkIG9uZSB0aGVyZS5cbiAgICovXG4gIGdldCBkZWNsYXJlZEVudktleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGUpIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZSA9IG5ldyBTZXQoKTtcbiAgICAgIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IFssIGVudlNvdXJjZXNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgdGhpcy5kZWNsYXJlZEVudktleUNhY2hlID0gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXMpO1xuICAgIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gIH1cblxuICAvLyBDYWNoZWQgaW4gYSBwbGFpbiBmaWVsZCByYXRoZXIgdGhhbiB3aXRoIEBtZW1vaXplT25lOiB0aGF0IGRlY29yYXRvciBrZXlzIGl0cyBjYWNoZSBvbiBhIGhhc2hcbiAgLy8gb2YgdGhlIGluc3RhbmNlLCB3aGljaCBjaGFuZ2VzIGFzIG90aGVyIG1lbW9pemVkIGdldHRlcnMgcG9wdWxhdGUgdGhlIGluc3RhbmNlLCBzbyBgZW52YCBjb3VsZFxuICAvLyBzaWxlbnRseSBiZSByZWNvbXB1dGVkIOKAlCBkcm9wcGluZyBpbi1wbGFjZSBtdXRhdGlvbnMgKGUuZy4gYHByb2plY3QuZW52LlBPUlQgfHw9IOKApmAsIG9yIHRoZVxuICAvLyBzZWNyZXRzIGB3YiBkZXBsb3lgIG1lcmdlcyBmcm9tIC5lbnYuY2xvdWRmbGFyZSkgdGhhdCBjYWxsZXJzIHJlbHkgb24gZm9yIHNwYXduZWQgY29tbWFuZHMuXG4gIHByaXZhdGUgZW52Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5lbnZDYWNoZSkgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZW52Q2FjaGUgPSBwcm9jZXNzLmVudjtcbiAgICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICAgIH1cblxuICAgIGNvbnN0IFttZXJnZWRFbnYsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnNdID0gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIHRoaXMuZW52Q2FjaGUgPSBtZXJnZWRFbnY7XG4gICAgLy8gYG1pc2UgZW52YCBpcyBleGNsdWRlZDogaXQgcmVwb3J0cyB0b29sLWFjdGl2YXRpb24gb3V0cHV0IChlLmcuIFBBVEgpIGV2ZW4gaW4gcmVwb3MgdGhhdFxuICAgIC8vIGRlY2xhcmUgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGF0IGFsbCwgd2hpY2ggbXVzdCBub3QgdHJpZ2dlciB0aGUgQ0kgc3RyaWN0bmVzcyBiZWxvdy5cbiAgICB0aGlzLmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzLnNvbWUoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpKTtcbiAgICByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuICAvKipcbiAgICogQ29tcGxldGVzIGFuZCB2YWxpZGF0ZXMgdGhlIHJlc29sdmVkIGBXQl9FTlZgIHBlciB0aGUgb3JnIHN0YW5kYXJkIChzZWUgdGhlXG4gICAqIGd1aWRlbGluZXMtZm9yLW1pc2UtZm5veCBza2lsbCk6XG4gICAqIC0gTG9jYWxseSwgYW4gdW5zZXQgYFdCX0VOVmAgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0ZWQgY2FzY2FkZSBtb2RlIChkZXZlbG9wbWVudCB1bmxlc3MgYVxuICAgKiAgIGNvbW1hbmQgZm9yY2VzIGFub3RoZXIsIGUuZy4gYHdiIHRlc3RgIGZvcmNlcyB0ZXN0KSwgc28gY2FzdWFsIGBidW4gd2IgLi4uYCBpbnZvY2F0aW9uc1xuICAgKiAgIHdvcmsgaW4gcmVwb3NpdG9yaWVzIHRoYXQgZGVmaW5lIG5vIFdCX0VOViBhdCBhbGwuXG4gICAqIC0gT24gQ0ksIGFuIHVuc2V0IGBXQl9FTlZgIGlzIGEgaGFyZCBlcnJvciB3aGVuIGVudiBzb3VyY2VzIGV4aXN0OiB3b3JrZmxvd3MgbXVzdCBleHBvcnQgdGhlXG4gICAqICAgZW52aXJvbm1lbnQgZXhwbGljaXRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHJ1bm5pbmcgaW4gYW4gYW1iaWd1b3VzIG1vZGUuXG4gICAqIC0gVGhlIHZhbHVlIG11c3QgbmFtZSBhIHN0YW5kYXJkIG1vZGU7IGFuIHVua25vd24gdmFsdWUgKGUuZy4gYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gKSB3b3VsZFxuICAgKiAgIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGRldmVsb3BtZW50IGNhc2NhZGUsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIHRoaXMgZ3VhcmRzIGFnYWluc3QuXG4gICAqIC0gYE5FWFRfUFVCTElDX1dCX0VOVmAgaXMgZGVyaXZlZCBmcm9tIGBXQl9FTlZgIGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzIHdoZW4gbWlzc2luZywgc28gYVxuICAgKiAgIHByb2R1Y3Rpb24gYnVpbGQgY2FuIG5vIGxvbmdlciBiYWtlIGEgc3RhbGUgZGV2ZWxvcG1lbnQgdmFsdWUgaW50byB0aGUgY2xpZW50IGJ1bmRsZS5cbiAgICogU2tpcHBlZCB3aGVuIGBXQl9TS0lQX0VOVl9DSEVDSz0xYCBpcyBzZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihoYXNFbnZpcm9ubWVudFNvdXJjZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudkNhY2hlO1xuICAgIGlmICghZW52KSByZXR1cm47XG4gICAgaWYgKGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8IGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnKSByZXR1cm47XG5cbiAgICAvLyBPbiBDSSwgV0JfRU5WIG11c3QgYmUgRVhQT1JURUQgYnkgdGhlIHdvcmtmbG93IOKAlCBjaGVja2VkIGFnYWluc3QgcHJvY2Vzcy5lbnYsIG5vdCB0aGVcbiAgICAvLyBtZXJnZWQgZW52aXJvbm1lbnQ6IGEgY29tbWl0dGVkIGJhc2UgZGVmYXVsdCAoZS5nLiBmbm94J3MgZGV2ZWxvcG1lbnQgZW50cnkpIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNhdGlzZnkgdGhlIGNoZWNrIGFuZCBzaWxlbnRseSBydW4gQ0kgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cbiAgICBpZiAoaXNDSShlbnYuQ0kpICYmICFwcm9jZXNzLmVudi5XQl9FTlYgJiYgaGFzRW52aXJvbm1lbnRTb3VyY2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgJ1dCX0VOViBpcyBub3QgZXhwb3J0ZWQgb24gQ0kuIEV4cG9ydCBXQl9FTlYgZXhwbGljaXRseSAodGhlIHJldXNhYmxlIHdvcmtmbG93cyBwYXNzIGl0IHZpYSB0aGUgXCJlbnZpcm9ubWVudFwiIGlucHV0KSwgJyArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFlbnYuV0JfRU5WKSB7XG4gICAgICAvLyBUaGUgc2hhcmVkIHJlc29sdmVyIGtlZXBzIHRoaXMgZmFsbGJhY2sgY29uc2lzdGVudCB3aXRoIHRoZSBjYXNjYWRlIHNlbGVjdGlvbiBBTkQgd2l0aFxuICAgICAgLy8gdGhlICR7V0JfRU5WfSBleHBhbnNpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzIGFscmVhZHkgcGVyZm9ybWVkOiB0aGUgZm9yY2VkIGNhc2NhZGVcbiAgICAgIC8vIChlLmcuIGB3YiB0ZXN0YCksIHRoZW4gdGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCwgdGhlbiB0aGUgQU1CSUVOVC1OT0RFX0VOVi1kcml2ZW4gYXV0b1xuICAgICAgLy8gY2FzY2FkZSBjbGFtcGVkIHRvIGEgc3RhbmRhcmQgbW9kZSAoYW4gZXhwbGljaXQgLS1jYXNjYWRlLWVudiBrZWVwcyBpdHMgdmFsdWUgYW5kIGlzXG4gICAgICAvLyB2YWxpZGF0ZWQgYmVsb3cgbGlrZSBhbnkgb3RoZXIgV0JfRU5WKS5cbiAgICAgIGNvbnN0IG1vZGUgPSByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpO1xuICAgICAgZW52LldCX0VOViA9IG1vZGU7XG4gICAgICBpZiAoaGFzRW52aXJvbm1lbnRTb3VyY2VzICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBXQl9FTlYgaXMgbm90IGRlZmluZWQ7IGRlZmF1bHRpbmcgdG8gXCIke21vZGV9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViBtdXN0IGJlIG9uZSBvZiBkZXZlbG9wbWVudCwgdGVzdCwgc3RhZ2luZywgb3IgcHJvZHVjdGlvbiwgYnV0IGlzIFwiJHtlbnYuV0JfRU5WfVwiLiBgICtcbiAgICAgICAgICAgICdGaXggdGhlIHZhbHVlIGluIHRoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZSwgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gQSBmb3JjZWQgbW9kZSAoYW4gZXhwbGljaXQvY29tbWFuZC1kZWZhdWx0IC0tY2FzY2FkZS1lbnYsIG9yIGFuIGV4cG9ydGVkIFdCX0VOViB3aG9zZVxuICAgIC8vIHByb2ZpbGUgdmFsdWVzIG1heSBvdmVycmlkZSBpdCBsb2NhbGx5IHBlciBpc3N1ZSAjOTMwKSBtdXN0IG5vdCBiZSBzaWxlbnRseSByZXBsYWNlZCBieVxuICAgIC8vIGFub3RoZXIgbW9kZSBhbiBlbnYgc291cmNlIGRlZmluZXM6IGB3YiB0ZXN0YCByZXNvbHZpbmcgV0JfRU5WPWRldmVsb3BtZW50IGZyb20gdGhlIGJhc2VcbiAgICAvLyBmbm94IHNlY3JldHMgd291bGQgcnVuIHRoZSB0ZXN0cyBhZ2FpbnN0IGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGFuIGV4cG9ydGVkXG4gICAgLy8gV0JfRU5WPXByb2R1Y3Rpb24gb3ZlcnJpZGRlbiB0byBkZXZlbG9wbWVudCBieSB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdvdWxkIGJ1aWxkL2RlcGxveVxuICAgIC8vIHRoZSB3cm9uZyBlbnZpcm9ubWVudCB3aGlsZSBsb29raW5nIHN1Y2Nlc3NmdWwuXG4gICAgLy8gLS1jYXNjYWRlLW5vZGUtZW52IGZvcmNlcyA8Tk9ERV9FTlYgfHwgZGV2ZWxvcG1lbnQ+IChwZXIgaXRzIG93biBkb2N1bWVudGF0aW9uKSwgcmVhZCBmcm9tXG4gICAgLy8gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgbGlrZSB0aGUgY2FzY2FkZSBzZWxlY3Rpb24uIE9ubHkgYSBTVEFOREFSRCBmb3JjZWQgbW9kZSBpcyBlbmZvcmNlZDpcbiAgICAvLyBhIG5vbi1zdGFuZGFyZCBvbmUgKGUuZy4gTk9ERV9FTlY9cWEpIGFscmVhZHkgaGFkIGl0cyBmYWxsYmFjayBjbGFtcGVkIHRvIGRldmVsb3BtZW50IGFib3ZlLFxuICAgIC8vIGFuZCBlcnJvcmluZyBvbiB0aGF0IGNsYW1wIHdvdWxkIGNvbnRyYWRpY3QgaXQuXG4gICAgY29uc3QgZm9yY2VkTW9kZSA9XG4gICAgICB0aGlzLmFyZ3YuY2FzY2FkZUVudiA/P1xuICAgICAgKHRoaXMuYXJndi5jYXNjYWRlTm9kZUVudiA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCcgOiBwcm9jZXNzLmVudi5XQl9FTlYgfHwgdW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgQVVUTy1zZWxlY3RlZCBtb2RlIGNvdW50cyBhcyB0aGUgZXhwZWN0YXRpb24gdG9vOiB3aXRoIG5vdGhpbmcgc2V0IGFueXdoZXJlLCB0aGVcbiAgICAvLyBkZXZlbG9wbWVudCB2YWx1ZXMgYXJlIGxvYWRlZCwgc28gYW4gZW52IHNvdXJjZSBkZWNsYXJpbmcgV0JfRU5WPXByb2R1Y3Rpb24gd291bGRcbiAgICAvLyBvdGhlcndpc2UgcnVuIGRldmVsb3BtZW50IHNvdXJjZXMgbGFiZWxlZCBhcyBwcm9kdWN0aW9uLlxuICAgIGNvbnN0IGV4cGVjdGVkTW9kZSA9XG4gICAgICBmb3JjZWRNb2RlID8/ICh0aGlzLmFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYodGhpcy5hcmd2KSA6IHVuZGVmaW5lZCk7XG4gICAgLy8gVGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCBpcyBhIGxlZ2l0aW1hdGUgc2Vjb25kIGV4cGVjdGF0aW9uOiBgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgXG4gICAgLy8gbG9hZHMgdGhlIHN0YWdpbmcgZmlsZXMgd2hpbGUgdGhlIGZhbGxiYWNrIGNvcnJlY3RseSBmaWxscyBXQl9FTlY9dGVzdC5cbiAgICBpZiAoXG4gICAgICBleHBlY3RlZE1vZGUgJiZcbiAgICAgIFByb2plY3Quc3RhbmRhcmRXYkVudk1vZGVzLmhhcyhleHBlY3RlZE1vZGUpICYmXG4gICAgICBlbnYuV0JfRU5WICE9PSBleHBlY3RlZE1vZGUgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IHRoaXMuYXJndi5jb21tYW5kRGVmYXVsdFdiRW52XG4gICAgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke2V4cGVjdGVkTW9kZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAgICAgYEZpeCB0aGUgV0JfRU5WIGRlZmluZWQgaW4gdGhlIG1vZGUncyBlbnYgc291cmNlIChlLmcuIHRoZSBmbm94IFwiJHtleHBlY3RlZE1vZGV9XCIgcHJvZmlsZSksIGAgK1xuICAgICAgICAgICAgJ29yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcXVpcmVzTmV4dFB1YmxpY1diRW52ICYmIGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgIT09IGVudi5XQl9FTlYpIHtcbiAgICAgIC8vIEFzc2lnbiB1bmNvbmRpdGlvbmFsbHksIG5vdCBgfHw9YDogdGhlIHBhaXIgbXVzdCBhZ3JlZSBieSBjb252ZW50aW9uLCBhbmQgYSBzdGFsZSB2YWx1ZVxuICAgICAgLy8gKGUuZy4gdGhlIGZub3ggYmFzZSBkZXZlbG9wbWVudCBkZWZhdWx0IHdoaWxlIENJIGV4cG9ydHMgV0JfRU5WPXRlc3QpIHdvdWxkIG90aGVyd2lzZVxuICAgICAgLy8gYmUgYmFrZWQgaW50byB0aGUgY2xpZW50IGJ1bmRsZSBldmVuIHRob3VnaCB0aGUgc2VydmVyIHNpZGUgcnVucyB3aXRoIHRoZSBjb3JyZWN0IFdCX0VOVi5cbiAgICAgIGlmIChlbnYuTkVYVF9QVUJMSUNfV0JfRU5WICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBPdmVycmlkaW5nIE5FWFRfUFVCTElDX1dCX0VOViAoXCIke2Vudi5ORVhUX1BVQkxJQ19XQl9FTlZ9XCIpIHdpdGggV0JfRU5WIChcIiR7ZW52LldCX0VOVn1cIikuYCk7XG4gICAgICB9XG4gICAgICBlbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gZW52LldCX0VOVjtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByZXF1aXJlc05leHRQdWJsaWNXYkVudigpOiBib29sZWFuIHtcbiAgICAvLyBPV04gZGVwZW5kZW5jaWVzIG9ubHk6IGEgcm9vdC1sZXZlbCBuZXh0L3ZpbmV4dCBkZXZEZXBlbmRlbmN5IGluIGEgbWl4ZWQgbW9ub3JlcG8gbXVzdCBub3RcbiAgICAvLyBmb3JjZSBORVhUX1BVQkxJQ19XQl9FTlYgb250byBldmVyeSBub24tTmV4dCB3b3Jrc3BhY2UgcGFja2FnZS5cbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCduZXh0JykgfHwgISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCd2aW5leHQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYHdyYW5nbGVyIHR5cGVzYCBzaG91bGQgZ2VuZXJhdGUgYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGhlcmUuIEEgd3JhbmdsZXIgY29uZmlnXG4gICAqIGFuZCBhbiBvd24gd3JhbmdsZXIgZGVwZW5kZW5jeSBhcmUgYm90aCByZXF1aXJlZCDigJQgd3JhbmdsZXIgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBhIGNvbmZpZyxcbiAgICogYW5kIGluIGEgbWl4ZWQgbW9ub3JlcG8gYSByb290LWxldmVsIHdyYW5nbGVyIGRldkRlcGVuZGVuY3kgbXVzdCBub3QgbWFrZSBldmVyeSB3b3Jrc3BhY2VcbiAgICogcGFja2FnZSBlbWl0IHR5cGVzIGl0IG5ldmVyIGNvbnN1bWVzLlxuICAgKlxuICAgKiBUaGUgcGFja2FnZSdzIG93biBjb21taXR0ZWQgZ2l0aWdub3JlIHJ1bGUgaXMgdGhlIHRoaXJkIHNpZ25hbCwgYW5kIHRoZSBvbmUgdGhhdCBzYXlzIHRoZVxuICAgKiBwYWNrYWdlIGFjdHVhbGx5IENPTlNVTUVTIHRoZSBmaWxlOiB3YmZ5IHdyaXRlcyB0aGF0IHJ1bGUgb25seSBmb3IgcGFja2FnZXMgd2hvc2Ugb3duIHRzY29uZmlnXG4gICAqIGNhbiByZWZlcmVuY2UgYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgLCBhbmQgZGVsaWJlcmF0ZWx5IGxlYXZlcyBhbG9uZSBwYWNrYWdlcyB0aGF0XG4gICAqIGhhbmQtbWFpbnRhaW4gdGhlaXIgYEVudmAgaW5zdGVhZC4gV2l0aG91dCB0aGlzIGNoZWNrLCBzdWNoIGEgcGFja2FnZSB3b3VsZCBnYWluIGFuIHVudHJhY2tlZFxuICAgKiB+NTAwS0IgZ2VuZXJhdGVkIGZpbGUgb24gZXZlcnkgaW5zdGFsbC5cbiAgICovXG4gIEBtZW1vaXplT25lXG4gIGdldCBnZW5lcmF0ZXNXb3JrZXJUeXBlcygpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgodGhpcykgfHwgIXRoaXMuaGFzT3duRGVwZW5kZW5jeSgnd3JhbmdsZXInKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIERlZmVuc2UgaW4gZGVwdGggYWdhaW5zdCB3YmZ5J3MgZ2l0aWdub3JlIHJ1bGUgYW5kIHRoaXMgcHJlZGljYXRlIGRyaWZ0aW5nIGFwYXJ0OiBpZiB0aGUgcGFja2FnZSBzdGlsbFxuICAgIC8vIHJ1bnMgaXRzIG93biBvdXRwdXQtY2hhbmdpbmcgYHdyYW5nbGVyIHR5cGVzYCAoZS5nLiBgLS1zdHJpY3QtdmFycz1mYWxzZWApLCB0aGUgYmFyZSBpbnZvY2F0aW9uIGhlcmUgd291bGRcbiAgICAvLyBvdmVyd3JpdGUgdGhhdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgYEVudmAuXG4gICAgaWYgKGhhc091dHB1dENoYW5naW5nV3JhbmdsZXJUeXBlcyh0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30sIHRoaXMuZGlyUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaGFzTWFuYWdlZEdpdGlnbm9yZVJ1bGUodGhpcy5kaXJQYXRoLCBXT1JLRVJfVFlQRVNfRklMRV9OQU1FKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICAvKiogQmxpdHogcmVwb3NpdG9yaWVzIGtlZXAgdGhlaXIgUHJpc21hIHNjaGVtYSBhbmQgU1FMaXRlIGRhdGFiYXNlcyB1bmRlciBkYi8gaW5zdGVhZCBvZiBwcmlzbWEvLiAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJpc21hRGlyTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdkYicsICdzY2hlbWEucHJpc21hJykpID8gJ2RiJyA6ICdwcmlzbWEnO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBQbGF5d3JpZ2h0IGNvbmZpZyBkZWNsYXJlcyBhIGB3ZWJTZXJ2ZXJgIGJsb2NrLCBpLmUuIFBsYXl3cmlnaHQgaXRzZWxmIGJ1aWxkcyBhbmRcbiAgICogc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC4gVW5saWtlIHtAbGluayBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodH0gdGhpcyBpZ25vcmVzIENJLCBzb1xuICAgKiBpdCBhbHNvIGhvbGRzIGZvciBsaWJyYXJ5IGZpeHR1cmVzIHdob3NlIG9ubHkgc2VydmVyIGlzIHRoZSBvbmUgUGxheXdyaWdodCBtYW5hZ2VzLlxuICAgKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICAvLyBPbiBDSSB3YiBsYXVuY2hlcyB0aGUgYXBwIGl0c2VsZiBzbyB0aGUgcnVuIGRvZXMgbm90IGRlcGVuZCBvbiBQbGF5d3JpZ2h0J3MgYHJldXNlRXhpc3RpbmdTZXJ2ZXJgXG4gICAgLy8gKHdoaWNoIGlzIGRpc2FibGVkIG9uIENJKTsgbG9jYWxseSwgYSBgd2ViU2VydmVyYCBibG9jayBtZWFucyBQbGF5d3JpZ2h0IGFscmVhZHkgb3ducyB0aGUgc2VydmVyLlxuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWc7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSk7XG4gICAgcmV0dXJuIGRvY2tlcmZpbGVEaXJQYXRoID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRvY2tlcmZpbGVEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCh0aGlzLmRpclBhdGgsIHRoaXMuZW52KTtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd1BhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKCcvLycpID8gcmF3UGF0aC5zbGljZSgyKSA6IHJhd1BhdGg7XG4gIHJldHVybiBub3JtYWxpemVkUGF0aCB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+ICYgUGFydGlhbDxQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdyb290RGlyUGF0aCc+PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBpZiAocGF0aC5pc0Fic29sdXRlKGRiUGF0aCkpIHJldHVybiBkYlBhdGg7XG5cbiAgY29uc3QgYmFzZURpclBhdGggPSBwcm9qZWN0LnJvb3REaXJQYXRoID8/IHByb2plY3QuZGlyUGF0aDtcbiAgcmV0dXJuIGJhc2VEaXJQYXRoID8gcGF0aC5yZXNvbHZlKGJhc2VEaXJQYXRoLCBkYlBhdGgpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBwcm9qZWN0J3MgZW52IHNvdXJjZXMgYW5kIG1lcmdlcyB0aGVtIG92ZXIgcHJvY2Vzcy5lbnYsIHJlcG9ydGluZyBlYWNoIGxvYWRlZCBzb3VyY2UuXG4gKiBTaGFyZWQgYnkgUHJvamVjdC5lbnYgYW5kIGB3YiBydW5gJ3Mgc3RhbmRhbG9uZSAobWFuaWZlc3QtbGVzcykgZW52aXJvbm1lbnQgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRNZXJnZUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgZGlyUGF0aCwge1xuICAgIC8vIENhbGxlcnMgZmlsbCBhbiB1bnNldCBXQl9FTlYgd2l0aCB0aGUgc2FtZSBmYWxsYmFjayBhZnRlcndhcmRzLCBzbyBleHBhbmRpbmcgJHtXQl9FTlZ9XG4gICAgLy8gcmVmZXJlbmNlcyBhZ2FpbnN0IGl0IGtlZXBzIHRoZSBwYWlyIGNvbnNpc3RlbnQuXG4gICAgZXhwYW5kRmFsbGJhY2tXYkVudjogdHJ1ZSxcbiAgfSk7XG4gIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KSkge1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIG5hbWVzXSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke25hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICAvLyBTcHJlYWRpbmcgZW52VmFycyBsYXN0IGlzIHNhZmUgZm9yIGV4cG9ydGVkLXZhcmlhYmxlIHByZWNlZGVuY2U6IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlc1xuICAvLyBhbHJlYWR5IGV4Y2x1ZGVzIGtleXMgcHJlc2VudCBpbiBwcm9jZXNzLmVudiBmcm9tIC5lbnYvZm5veCBzb3VyY2VzIChyZXR1cm5pbmcgYSBrZXkgdGhhdFxuICAvLyBleGlzdHMgaW4gcHJvY2Vzcy5lbnYgb25seSBmb3IgZGVsaWJlcmF0ZSBmb3JjZWQtbW9kZSBvdmVycmlkZXMpLiBNaXNlIHZhbHVlcyB0aGF0XG4gIC8vIGRpZmZlciBmcm9tIHRoZSBhbWJpZW50IGFjdGl2YXRpb24gYXJlIGRlbGliZXJhdGVseSBrZXB0IHNvIHRoZSByZXF1ZXN0ZWQgY2FzY2FkZSBwcm9maWxlXG4gIC8vIChlLmcuIGAtLWNhc2NhZGUtZW52PXRlc3RgKSB3aW5zIG92ZXIgYSBzdGFsZSBgbWlzZSBhY3RpdmF0ZWAgZW52aXJvbm1lbnQuXG4gIHJldHVybiBbeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9LCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuLy8gUHJvamVjdCBjb25zdHJ1Y3Rpb24gcmUtcmVhZHMgbWFuaWZlc3RzIGFuZCBlbnYgc291cmNlcywgYW5kIGB3YiB2ZXJpZnlgIGNvbXBvc2VzIGNvbW1hbmRzXG4vLyAobGludCwgdHlwZWNoZWNrLCB0ZXN0KSB0aGF0IGVhY2ggcmVidWlsZCB0aGUgZ3JhcGgg4oCUIHNvIGluc3RhbmNlcyBhcmUgc2hhcmVkIHBlclxuLy8gKGRpcmVjdG9yeSwgbG9hZEVudiwgZW52LXJlbGV2YW50IGFyZ3YpIHdpdGhpbiBvbmUgaW52b2NhdGlvbi4gU2hhcmluZyBpcyBzYWZlIGJlY2F1c2UgYVxuLy8gUHJvamVjdCBpcyBpbW11dGFibGUgZXhjZXB0IGZvciBlbnYgbXV0YXRpb25zIChlLmcuIGBwcm9qZWN0LmVudi5QT1JUIHx8PSAuLi5gKSwgd2hpY2ggY2FsbGVyc1xuLy8gZGVsaWJlcmF0ZWx5IHJlbHkgb24gc3RheWluZyB2aXNpYmxlIHRvIGxhdGVyIHN0ZXBzLiBUaGUgY2FjaGVzIGxpdmUgZm9yIHRoZSB3aG9sZSBwcm9jZXNzIGFuZFxuLy8gbmV2ZXIgb2JzZXJ2ZSBsYXRlciBmaWxlc3lzdGVtIG11dGF0aW9ucywgc28gY29kZSB0aGF0IHJld3JpdGVzIGEgcHJvamVjdCBkaXJlY3RvcnkgYW5kIG5lZWRzIGFcbi8vIGZyZXNoIHZpZXcgKHRvZGF5IG9ubHkgdGVzdHMpIG11c3QgY2FsbCBjbGVhclByb2plY3RDYWNoZXMgZmlyc3QuXG5jb25zdCBzZWxmUHJvamVjdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb2plY3Q+KCk7XG5jb25zdCBkZXNjZW5kYW50UHJvamVjdHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFByb2plY3RbXT4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclByb2plY3RDYWNoZXMoKTogdm9pZCB7XG4gIHNlbGZQcm9qZWN0Q2FjaGUuY2xlYXIoKTtcbiAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuY2xlYXIoKTtcbiAgY2xlYXJUZXN0U3RydWN0dXJlQ2FjaGUoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9qZWN0Q2FjaGVLZXkoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbiwgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gT25seSB0aGUgaW5wdXRzIGEgUHJvamVjdCBhY3R1YWxseSByZWFkcyBwYXJ0aWNpcGF0ZTogdGhlIGVudiBjYXNjYWRlIHNlbGVjdGlvblxuICAvLyAocmVhZEVudmlyb25tZW50VmFyaWFibGVzIC8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYgLyBjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpIGFuZCB0aGUgb3V0cHV0XG4gIC8vIHN3aXRjaGVzIChzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0LCBidWlsZENvbW1hbmQncyAtLXZlcmJvc2UpLiBUaGUgYW1iaWVudFxuICAvLyBXQl9FTlYgLyBOT0RFX0VOViAvIENJIHZhbHVlcyBmZWVkIHRoZSBzYW1lIGNhc2NhZGUgc2VsZWN0aW9uIGFuZCBhcmUgbXV0YXRlZCBtaWQtcnVuIGJ5XG4gIC8vIGNvbW1hbmRzIHN1Y2ggYXMgYHdiIGRiIHJlc2V0YCAod2hpY2ggZm9yY2VzIFdCX0VOVj10ZXN0IGFuZCByZS1yZXNvbHZlcyBwcm9qZWN0cyksIHNvIHRoZXlcbiAgLy8gbXVzdCBwYXJ0aWNpcGF0ZSB0b28gb3IgdGhlIHNlY29uZCByZXNvbHV0aW9uIHdvdWxkIHJldXNlIGEgUHJvamVjdCB3aXRoIHRoZSB3cm9uZyBlbnYuXG4gIGNvbnN0IHsgYXV0b0Nhc2NhZGVFbnYsIGNhc2NhZGVFbnYsIGNhc2NhZGVOb2RlRW52LCBjb21tYW5kRGVmYXVsdFdiRW52LCBxdWlldEVudiwgdmVyYm9zZSB9ID0gYXJndjtcbiAgY29uc3QgeyBzaWxlbnQgfSA9IGFyZ3YgYXMgeyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgpLFxuICAgIGxvYWRFbnYsXG4gICAgYXV0b0Nhc2NhZGVFbnYsXG4gICAgY2FzY2FkZUVudixcbiAgICBjYXNjYWRlTm9kZUVudixcbiAgICBjb21tYW5kRGVmYXVsdFdiRW52LFxuICAgIHF1aWV0RW52LFxuICAgIHZlcmJvc2UsXG4gICAgc2lsZW50LFxuICAgIHByb2Nlc3MuZW52LldCX0VOVixcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOVixcbiAgICBwcm9jZXNzLmVudi5DSSxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgY2FjaGVLZXkgPSBidWlsZFByb2plY3RDYWNoZUtleShhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgbGV0IHByb2plY3QgPSBzZWxmUHJvamVjdENhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIHByb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICBzZWxmUHJvamVjdENhY2hlLnNldChjYWNoZUtleSwgcHJvamVjdCk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0LCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2plY3QuZW52LldCX0VOViA9PT0gbmFtZSB8fCBwcm9qZWN0LmVudi5NSVNFX0VOViA9PT0gbmFtZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcbiAgaWYgKHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCAhPT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmKSB7XG4gICAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdIH07XG4gIH1cblxuICBjb25zdCBjYWNoZUtleSA9IGJ1aWxkUHJvamVjdENhY2hlS2V5KGFyZ3YsIGxvYWRFbnYsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgbGV0IGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFkZXNjZW5kYW50cykge1xuICAgIGRlc2NlbmRhbnRzID0gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudik7XG4gICAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuc2V0KGNhY2hlS2V5LCBkZXNjZW5kYW50cyk7XG4gIH1cbiAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IGF3YWl0IGRlc2NlbmRhbnRzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0aGlzUHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCF0aGlzUHJvamVjdCkgcmV0dXJuO1xuXG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIHJvb3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIGxvYWRFbnYsIHJvb3REaXJQYXRoKSA/PyB0aGlzUHJvamVjdDtcbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBwcm9qZWN0IGZvbGxvd2VkIGJ5IG9uZSBQcm9qZWN0IHBlciB3b3Jrc3BhY2UgZGlyZWN0b3J5IHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzXG4gKiBwYWNrYWdlIG1hbmFnZXIgd291bGQgbGluayAoaXNzdWUgIzEwMDgpOiBCdW4gcmVwb3MgdXNlIHRoZSBzaGFyZWQgQnVuLWV4YWN0IHJlc29sdmVyXG4gKiAobmVnYXRpb25zLCBwaW5uZWQgcG9zaXRpdmVzLCBhbmQgYmFzZWxpbmUtc2VlZGluZyBuZWdhdGlvbnMgaW5jbHVkZWQpLCB3aGlsZSBZYXJuIHJlcG9zIGtlZXBcbiAqIGdsb2Igc2VtYW50aWNzIOKAlCBCdW4tb25seSBydWxlcyBzdWNoIGFzIHRoZSBpbXBsaWNpdCBiYXNlbGluZSB3b3VsZCBpbnZlbnQgd29ya3NwYWNlcyBZYXJuXG4gKiBuZXZlciBsaW5rcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocm9vdFByb2plY3QpO1xuICByZXR1cm4gW1xuICAgIHJvb3RQcm9qZWN0LFxuICAgIC4uLndvcmtzcGFjZURpclBhdGhzLm1hcChcbiAgICAgIC8vIFRoZSBmYWxsYmFjayBrZWVwcyBhIHdvcmtzcGFjZSB3aG9zZSBtYW5pZmVzdCB2YW5pc2hlZCBhZnRlciB0aGUgZ2xvYiAoZmluZFNlbGZQcm9qZWN0XG4gICAgICAvLyB3b3VsZCBkcm9wIGl0KSBkaXNjb3ZlcmVkLCBtYXRjaGluZyB0aGUgbG9uZy1zdGFuZGluZyBkaXJlY3QgY29uc3RydWN0aW9uLlxuICAgICAgKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCB3b3Jrc3BhY2VEaXJQYXRoKSA/PyBuZXcgUHJvamVjdCh3b3Jrc3BhY2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KVxuICAgICksXG4gIF07XG59XG5cbi8qKlxuICogVGhlIGFic29sdXRlIGRpcmVjdG9yeSBvZiBldmVyeSB3b3Jrc3BhY2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyIHdvdWxkIGxpbmssXG4gKiBtYXRjaGluZyB0aGUgbWFuYWdlciB0aGUgd2F5IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyBkZXNjcmliZXMuIEV4cG9ydGVkIGZvciB3YiByZWxlYXNlLCB3aG9zZVxuICogcGx1Z2luIGluc3BlY3Rpb24sIG5vZGVfbW9kdWxlcyBjbGVhbnVwLCBhbmQgbWFuaWZlc3QgcmV3cml0aW5nIG11c3Qgc2VlIHRoZSBzYW1lIHdvcmtzcGFjZSBzZXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUJ1bldvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzLCBwcm9qZWN0LmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgKTtcbiAgfVxuICAvLyBZYXJuIDEuMjIuMjIgcmVzb2x2ZXMgZWFjaCBkZWNsYXJlZCBwYXR0ZXJuIChhcnJheSBvciBgeyBwYWNrYWdlczogW+KApl0gfWAgZm9ybSkgaW5kZXBlbmRlbnRseVxuICAvLyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLCBzbyBhIGxlYWRpbmctYCFgIHBhdHRlcm4gaXMgbm90IGFuIGV4Y2x1c2lvbiDigJQgYFtcInBhY2thZ2VzLypcIixcbiAgLy8gXCIhcGFja2FnZXMvYVwiXWAgc3RpbGwgbGlua3MgcGFja2FnZXMvYS4gWWFybiBhZGRpdGlvbmFsbHkgaWdub3JlcyBtYW5pZmVzdHMgbWlzc2luZyBhIG5hbWUgb3JcbiAgLy8gdmVyc2lvbiAoXCJNaXNzaW5nIHZlcnNpb24gaW4gd29ya3NwYWNlIOKApiwgaWdub3JpbmcuXCIpLCBidXQgdGhhdCBpcyBkZWxpYmVyYXRlbHkgTk9UIG1pcnJvcmVkOlxuICAvLyB3YidzIGRlc2NlbmRhbnQgZGlzY292ZXJ5IGV4aXN0cyB0byBydW4gY29tbWFuZHMgKGxpbnQsIHRlc3QsIHR5cGVjaGVjaywg4oCmKSBpbiBzdWItcGFja2FnZXMsXG4gIC8vIGFuZCB2ZXJzaW9uLWxlc3MgcHJpdmF0ZSBwYWNrYWdlcyBtdXN0IHN0YXkgZGlzY292ZXJlZCDigJQgdGhlIGxvbmctc3RhbmRpbmcgYmVoYXZpb3Igd2Inc1xuICAvLyBtb25vcmVwbyBmaXh0dXJlcyBlbmNvZGUuIEdsb2IgZm9yIHRoZSBtYW5pZmVzdHMgdGhlbXNlbHZlczogZ2xvYmJ5J3MgYG9ubHlEaXJlY3Rvcmllc2BcbiAgLy8gd291bGQgcmV0dXJuIGEgbGl0ZXJhbCBkaXJlY3RvcnkgcGF0dGVybidzIENISUxEUkVOIGluc3RlYWQgb2YgdGhlIGRpcmVjdG9yeS4gVGhlIHJlYWxwYXRoXG4gIC8vIGNvbnRhaW5tZW50IG1pcnJvcnMgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHM6IGEgd29ya3NwYWNlIHN5bWxpbmsgZXNjYXBpbmcgdGhlXG4gIC8vIHJlcG9zaXRvcnkgbXVzdCBub3QgbGV0IGNvbnN1bWVycyB0b3VjaCBhbm90aGVyIGNoZWNrb3V0LlxuICBjb25zdCBwb3NpdGl2ZVBhdHRlcm5zID0gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpLmZpbHRlcihcbiAgICAocGF0dGVybikgPT4gIXBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybihwYXR0ZXJuKVxuICApO1xuICBpZiAocG9zaXRpdmVQYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgLy8gZXhwYW5kRGlyZWN0b3JpZXM6IGZhbHNlIOKAlCBnbG9iYnkgd291bGQgb3RoZXJ3aXNlIGV4cGFuZCBhIGxpdGVyYWwgZGlyZWN0b3J5IHBhdHRlcm4gdG8gaXRzXG4gIC8vIENISUxEUkVOLCB0dXJuaW5nIGUuZy4gYHBhY2thZ2VzYCBpbnRvIG1hdGNoZXMgZm9yIGV2ZXJ5IHBhY2thZ2VzLyogc3ViZGlyZWN0b3J5LlxuICBjb25zdCBnbG9iYnlPcHRpb25zID0ge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGV4cGFuZERpcmVjdG9yaWVzOiBmYWxzZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gIH07XG4gIC8vIGZhc3QtZ2xvYiAoZ2xvYmJ5J3MgZW5naW5lKSByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCkgYWx0aG91Z2ggWWFybiBsaW5rcyBzdWNoIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnNcbiAgLy8gb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnkgZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmdcbiAgLy8gdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpciBtYW5pZmVzdHMgY29tcGxlbWVudHMgdGhlIG1hbmlmZXN0IGdsb2IuXG4gIGNvbnN0IGdsb2JiZWRNYW5pZmVzdFBhdGhzID0gYXdhaXQgZ2xvYmJ5KFxuICAgIHBvc2l0aXZlUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICBnbG9iYnlPcHRpb25zXG4gICk7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aFNldCA9IG5ldyBTZXQoZ2xvYmJlZE1hbmlmZXN0UGF0aHMpO1xuICBjb25zdCBxdWVzdGlvbk1hcmtQYXR0ZXJucyA9IHBvc2l0aXZlUGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCc/JykpO1xuICBpZiAocXVlc3Rpb25NYXJrUGF0dGVybnMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBhd2FpdCBnbG9iYnkocXVlc3Rpb25NYXJrUGF0dGVybnMsIHsgLi4uZ2xvYmJ5T3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWFuaWZlc3RQYXRoKSkpIG1hbmlmZXN0UGF0aFNldC5hZGQobWFuaWZlc3RQYXRoKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWFuaWZlc3RQYXRocyA9IFsuLi5tYW5pZmVzdFBhdGhTZXRdO1xuICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocHJvamVjdC5kaXJQYXRoKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBtYW5pZmVzdFBhdGhzXG4gICAgLy8gQSBgKipgIHBhdHRlcm4gcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCBhbmQgaW5zdGFsbGVkIHBhY2thZ2VzLCBidXQgbmVpdGhlciBpcyBhXG4gICAgLy8gd29ya3NwYWNlIHRvIFlhcm4gKHdoaWNoIG5ldmVyIGRlc2NlbmRzIGludG8gbm9kZV9tb2R1bGVzKS5cbiAgICAuZmlsdGVyKChtYW5pZmVzdFBhdGgpID0+IHtcbiAgICAgIGlmIChtYW5pZmVzdFBhdGggPT09ICdwYWNrYWdlLmpzb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG1hbmlmZXN0UGF0aCkpKTtcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgbWFuaWZlc3QgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGw6IG5vdCBhIHdvcmtzcGFjZS5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pXG4gICAgLm1hcCgobWFuaWZlc3RQYXRoKSA9PiBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUobWFuaWZlc3RQYXRoKSkpO1xuICByZXR1cm4gWy4uLm5ldyBTZXQod29ya3NwYWNlRGlyUGF0aHMpXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHBhY2thZ2UncyBvd24gY29tbWl0dGVkIC5naXRpZ25vcmUgY2FycmllcyB3YmZ5J3MgbWFuYWdlZCBydWxlIGZvciB0aGUgZmlsZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGBnaXQgY2hlY2staWdub3JlYDogdGhhdCBhbHNvIGhvbm9ycyBgLmdpdC9pbmZvL2V4Y2x1ZGVgIGFuZCB0aGUgdXNlcidzIGdsb2JhbFxuICogZXhjbHVkZXMsIHdoaWNoIGEgZnJlc2ggY2xvbmUgYW5kIENJIGRvIG5vdCBoYXZlLiBBIGRldmVsb3BlciB3aXRoIGEgcGVyc29uYWxcbiAqIGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBleGNsdWRlIHdvdWxkIG90aGVyd2lzZSB0dXJuIGdlbmVyYXRpb24gb24gZm9yIGEgcGFja2FnZSB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0aGUgcmVzdWx0aW5nIGZpbGUgd291bGQgYmUgaW52aXNpYmxlIGluIGBnaXQgc3RhdHVzYC5cbiAqIGBwYWNrYWdlcy93YmZ5L3NyYy9maXhlcnMvd29ya2VyVHlwZXMudHNgIGdhdGVzIG9uIHRoZSBzYW1lIGNvbW1pdHRlZCBydWxlLlxuICovXG5mdW5jdGlvbiBoYXNNYW5hZ2VkR2l0aWdub3JlUnVsZShkaXJQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICcuZ2l0aWdub3JlJyksICd1dGY4JylcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW0oKSA9PT0gYC8ke2ZpbGVOYW1lfWApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcGFja2FnZSBzY3JpcHQgcnVucyBhIGB3cmFuZ2xlciB0eXBlc2AgdGhhdCB3b3VsZCB3cml0ZSBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0IHRoZSBiYXJlXG4gKiBpbnZvY2F0aW9uIHdyaXRlcy4gYC0tY2hlY2tgL2AtLWhlbHBgIHZhbGlkYXRlIG9yIHByaW50IGFuZCB3cml0ZSBub3RoaW5nLCBzbyB0aGV5IGRvIG5vdCBjb3VudC4gYC0tZW52LWZpbGVgXG4gKiBjb3VudHMgd2hlbmV2ZXIgYSBmaWxlIGl0IG5hbWVzIEVYSVNUUzogdGhlIGZsYWcgc2VsZWN0cyB3aGF0IHdyYW5nbGVyIHJlYWRzIHRvIGluZmVyIGxvY2FsIHZhcnMgYW5kIHNlY3JldHMsXG4gKiBzbyB0aGUgYmFyZSBpbnZvY2F0aW9uIGhlcmUgd291bGQgcmVnZW5lcmF0ZSBhIHNtYWxsZXIgYEVudmAuIE1pcnJvcnMgd2JmeSdzIGBoYXNDdXN0b21XcmFuZ2xlclR5cGVzSW52b2NhdGlvbmBcbiAqIChpbmNsdWRpbmcgaXRzIGBuYW1lc09ubHlNaXNzaW5nRW52RmlsZXNgIHJ1bGUpOyB0aGUgdHdvIG11c3QgYWdyZWUsIHNpbmNlIHdiZnkncyBhbnN3ZXIgZGVjaWRlcyB0aGVcbiAqIGdpdGlnbm9yZSBydWxlIHRoaXMgcHJlZGljYXRlIGtleXMgb24uXG4gKi9cbmZ1bmN0aW9uIGhhc091dHB1dENoYW5naW5nV3JhbmdsZXJUeXBlcyhzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgd3JhbmdsZXJUeXBlc1BhdHRlcm4gPSAvKD86XnxcXHMpd3JhbmdsZXJcXHMrdHlwZXMoPzpcXHN8JCkvdTtcbiAgY29uc3QgZW52RmlsZU9ubHlQYXR0ZXJuID0gL14oPzooPzpidW54fG5weClcXHMrfCg/Onlhcm58cG5wbSlcXHMrZGx4XFxzKyk/d3JhbmdsZXJcXHMrdHlwZXMoPzpcXHMrLS1lbnYtZmlsZVxccytcXFMrKSokL3U7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4ge1xuICAgIGlmICghc2NyaXB0IHx8ICF3cmFuZ2xlclR5cGVzUGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBDaGVja2VkIG9uIHRoZSBXSE9MRSBzY3JpcHQsIGJlZm9yZSBzcGxpdHRpbmc6IGBjZCBzdWIgJiYgd3JhbmdsZXIgdHlwZXNgIHJ1bnMgdGhlIGdlbmVyYXRvciBpbiBhbm90aGVyXG4gICAgLy8gZGlyZWN0b3J5IGFnYWluc3QgYW5vdGhlciBjb25maWcsIGJ1dCBpdHMgc2Vjb25kIHNlZ21lbnQgYWxvbmUgbG9va3MgbGlrZSBhIHBsYWluIGludm9jYXRpb24uIHdiZnlcbiAgICAvLyBjbGFzc2lmaWVzIGFueSBzY3JpcHQgY2FycnlpbmcgdGhpcyBzeW50YXggYXMgY3VzdG9tLCBhbmQgdGhlIHR3byBwcmVkaWNhdGVzIG11c3QgYWdyZWUuXG4gICAgaWYgKC9bO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3UudGVzdChzY3JpcHQpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gc2NyaXB0XG4gICAgICAuc3BsaXQoJyYmJylcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJykpXG4gICAgICAuc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgICBpZiAoIXdyYW5nbGVyVHlwZXNQYXR0ZXJuLnRlc3Qoc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKC8oPzpefFxccykoPzotLWhlbHB8LWgpKD86XFxzfD18JCkvdS50ZXN0KHNlZ21lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIGAtLWNoZWNrYCBjb21wYXJlcyB0aGUgcmVzdWx0IEZPUiBUSEUgU1VQUExJRUQgT1BUSU9OUywgc28gaXQgaXMgb25seSBoYXJtbGVzcyB3aGVuIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAvLyBpbnZvY2F0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJhcmUgb25lLlxuICAgICAgICBjb25zdCB3aXRob3V0Q2hlY2sgPSBzZWdtZW50XG4gICAgICAgICAgLnJlcGxhY2UoLyg/Ol58XFxzKS0tY2hlY2soPzpcXHN8PXwkKS91LCAnICcpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJylcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB3aXRob3V0Q2hlY2sgPT09IHNlZ21lbnQgPyBzZWdtZW50IDogd2l0aG91dENoZWNrO1xuICAgICAgICAvLyBOb3QgZXF1aXZhbGVudCB0byB0aGUgYmFyZSBpbnZvY2F0aW9uLCB3aXRoIG9yIHdpdGhvdXQgYC0tY2hlY2tgOiBgLS1jaGVja2AgY29tcGFyZXMgdGhlIHJlc3VsdCBGT1JcbiAgICAgICAgLy8gVEhFIFNVUFBMSUVEIE9QVElPTlMsIHNvIGAtLWNoZWNrIC0tc3RyaWN0LXZhcnM9ZmFsc2VgIHN0aWxsIGRlc2NyaWJlcyBhIGRpZmZlcmVudCBmaWxlLlxuICAgICAgICBpZiAoIWVudkZpbGVPbmx5UGF0dGVybi50ZXN0KGNhbmRpZGF0ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gWy4uLmNhbmRpZGF0ZS5tYXRjaEFsbCgvLS1lbnYtZmlsZVxccysoXFxTKykvZ3UpXS5zb21lKFxuICAgICAgICAgIChtYXRjaCkgPT4gISFtYXRjaFsxXSAmJiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBtYXRjaFsxXSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBvdXRwdXQgcGF0aHMgKHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSkgdGhhdCBtdXN0IGV4aXN0IGZvciB0aGUgY2FjaGUgdG8gYmUgdmFsaWQgKGRlZmF1bHQ6IGF1dG8tZGV0ZWN0ZWQgY29tbW9uIG91dHB1dCBkaXJlY3RvcmllcyknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRDb21tYW5kID1cbiAgICBhcmd2LmNvbW1hbmQgPz8gKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZH0gYnVpbGRgIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICAvLyBUaGUgY2FjaGUgcmVxdWlyZXMgdGhlIGdpdCByZXBvc2l0b3J5IHJvb3QgdG8gQkUgcm9vdERpclBhdGg6IHBvcmNlbGFpbiBwYXRocyBhbmQgZGlmZlxuICAvLyBwYXRoc3BlY3MgYmVsb3cgYXJlIGpvaW5lZC9leGVjdXRlZCBhZ2FpbnN0IHJvb3REaXJQYXRoLiBXaGVuIHRoZSByZXBvIHJvb3QgaXMgZWxzZXdoZXJlXG4gIC8vIChlLmcuIGEgc3VicHJvamVjdCBvZiBhIGxhcmdlciByZXBvc2l0b3J5KSwgYWx3YXlzIGJ1aWxkIGluc3RlYWQgb2YgbWlzLXJlc29sdmluZyBwYXRocy5cbiAgLy8gQSBmcmVzaGx5IGluaXRpYWxpemVkIHJlcG8gd2l0aG91dCBjb21taXRzICh1bmJvcm4gSEVBRCkgbGlrZXdpc2UgYnVpbGRzIHdpdGhvdXQgY2FjaGluZzpcbiAgLy8gcmVzb2x2aW5nIEhFQUQgd291bGQgZmFpbC5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpID8gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YsIGNvbW1pdEhhc2gpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0KTtcbiAgICBpZiAob3V0cHV0UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBXaXRoIG5vIHJlY29yZGVkIG91dHB1dHMsIGEgZGVsZXRlZCBidWlsZCBkaXJlY3RvcnkgY2FuIG5ldmVyIGludmFsaWRhdGUgdGhlIGNhY2hlOyBtYWtlXG4gICAgICAvLyB0aGUgaW5hY3RpdmUgcHJvdGVjdGlvbiB2aXNpYmxlIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseSAoY2YuIGlzc3VlICM5ODEpLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coJ05vIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgZGV0ZWN0ZWQ7IHBhc3MgLS1vdXRwdXQgdG8gZW5hYmxlIG1pc3Npbmctb3V0cHV0IGNhY2hlIGludmFsaWRhdGlvbi4nKVxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHsgaGFzaDogY29udGVudEhhc2gsIG91dHB1dFBhdGhzIH0pLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBDb21tb24gYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzIHVzZWQgYWNyb3NzIG9yZyBwcm9qZWN0cyAodmluZXh0L2J1aWxkLXRzIGVtaXQgZGlzdCxcbi8vIE5leHQuanMgZW1pdHMgLm5leHQsIENSQS1zdHlsZSBhcHBzIGVtaXQgYnVpbGQsIGBuZXh0IGV4cG9ydGAgZW1pdHMgb3V0KS5cbmNvbnN0IGRlZmF1bHRPdXRwdXRDYW5kaWRhdGVzID0gWydkaXN0JywgJ2J1aWxkJywgJy5uZXh0JywgJ291dCddO1xuXG5mdW5jdGlvbiBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcmd2Lm91dHB1dD8ubGVuZ3RoID8gYXJndi5vdXRwdXQubWFwKFN0cmluZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRldGVjdEV4aXN0aW5nRGVmYXVsdE91dHB1dFBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcy5maWx0ZXIoKG91dHB1dFBhdGgpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpKTtcbn1cblxuLyoqIEFuIGAtLW91dHB1dGAgdmFsdWUgbWF5IG5hbWUgYSBmaWxlLCBzbyBtYXRjaCB0aGUgZXhhY3QgcGF0aCBhcyB3ZWxsIGFzIGRlc2NlbmRhbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc091dHB1dFBhdGgob3V0cHV0UGF0aHM6IHN0cmluZ1tdLCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXRQYXRocy5zb21lKChvdXRwdXRQYXRoKSA9PiBmaWxlUGF0aCA9PT0gb3V0cHV0UGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke291dHB1dFBhdGh9L2ApKTtcbn1cblxuLyoqIFRoZSBIRUFEIGNvbW1pdCBoYXNoLCBvciB1bmRlZmluZWQgb24gYW4gdW5ib3JuIEhFQUQgKGEgcmVwbyB3aXRob3V0IGNvbW1pdHMpLiAqL1xuZnVuY3Rpb24gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgJ0hFQUQnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgfSk7XG4gIHJldHVybiByZXQuc3RhdHVzID09PSAwID8gcmV0LnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgY29tbWl0SGFzaDogc3RyaW5nXG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICAvLyBUaGUgaW52b2tlZCBidWlsZCBjb21tYW5kIGlzIHBhcnQgb2YgdGhlIGNhY2hlIGlkZW50aXR5OiBgLWMgY29tbWFuZEJgIG11c3Qgbm90IHJldXNlIGFcbiAgLy8gY2FjaGUgcmVjb3JkZWQgZm9yIGNvbW1hbmRBIHdpdGggb3RoZXJ3aXNlIHVuY2hhbmdlZCBpbnB1dHMuXG4gIGhhc2gudXBkYXRlKGFyZ3YuY29tbWFuZCA/PyAnJyk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIGNvbnN0IGNhY2hlID0gcGFyc2VCdWlsZENhY2hlKGNhY2hlZENvbnRlbnQpO1xuICBpZiAoY2FjaGU/Lmhhc2ggIT09IGNvbnRlbnRIYXNoKSByZXR1cm4gW2ZhbHNlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG5cbiAgLy8gVGhlIGNhY2hlIGlzIHZhbGlkIG9ubHkgd2hpbGUgdGhlIHJlY29yZGVkIChvciBleHBsaWNpdGx5IHJlcXVlc3RlZCkgYnVpbGQgb3V0cHV0cyBzdGlsbFxuICAvLyBleGlzdDogYSBkZWxldGVkIG91dHB1dCBkaXJlY3RvcnkgKGUuZy4gYHJtIC1yZiBkaXN0YCkgbXVzdCB0cmlnZ2VyIGEgcmVidWlsZCBldmVuIHdoZW4gdGhlXG4gIC8vIGlucHV0cyBhcmUgdW5jaGFuZ2VkIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85ODEpLlxuICBjb25zdCByZXF1aXJlZE91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBjYWNoZS5vdXRwdXRQYXRocztcbiAgY29uc3QgbWlzc2luZ091dHB1dFBhdGhzID0gcmVxdWlyZWRPdXRwdXRQYXRocy5maWx0ZXIoXG4gICAgKG91dHB1dFBhdGgpID0+ICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIG91dHB1dFBhdGgpKVxuICApO1xuICBpZiAobWlzc2luZ091dHB1dFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KGBSZWJ1aWxkaW5nIGJlY2F1c2UgYnVpbGQgb3V0cHV0cyBhcmUgbWlzc2luZzogJHttaXNzaW5nT3V0cHV0UGF0aHMuam9pbignLCAnKX1gKSk7XG4gICAgcmV0dXJuIFtmYWxzZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xuICB9XG4gIHJldHVybiBbdHJ1ZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJ1aWxkQ2FjaGUoY2FjaGVkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBoYXNoOiBzdHJpbmc7IG91dHB1dFBhdGhzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWRDb250ZW50KSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjYWNoZWRDb250ZW50KSBhcyB7IGhhc2g/OiB1bmtub3duOyBvdXRwdXRQYXRocz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHBhcnNlZD8uaGFzaCAhPT0gJ3N0cmluZycpIHJldHVybjtcbiAgICBjb25zdCBvdXRwdXRQYXRocyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLm91dHB1dFBhdGhzKVxuICAgICAgPyBwYXJzZWQub3V0cHV0UGF0aHMuZmlsdGVyKChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICA6IFtdO1xuICAgIHJldHVybiB7IGhhc2g6IHBhcnNlZC5oYXNoLCBvdXRwdXRQYXRocyB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBBIGxlZ2FjeSBjYWNoZSBmaWxlIGNvbnRhaW5zIGEgcmF3IGNvbnRlbnQgaGFzaCB3aXRob3V0IG91dHB1dCByZWNvcmRzLiBUcmVhdCBpdCBhcyBhIG1pc3M6XG4gICAgLy8gaG9ub3JpbmcgaXQgd291bGQgbGV0IGEgbWF0Y2hpbmcgaGFzaCBza2lwIGEgYnVpbGQgd2hvc2Ugb3V0cHV0cyB3ZXJlIGRlbGV0ZWQsIGFuZCBvbmVcbiAgICAvLyByZWJ1aWxkIHVwZ3JhZGVzIHRoZSByZWNvcmQgdG8gdGhlIEpTT04gZm9ybWF0LlxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vLyBNYXRjaGVkIGFzIGNvbXBsZXRlIHBhdGggU0VHTUVOVFMgKG5vdCBzdWJzdHJpbmdzKTogYHNyYy9jb250ZXN0L2AgbXVzdCBub3QgYmUgZXhjbHVkZWQgYnlcbi8vIGB0ZXN0YCwgYW5kIGBteXNyYy9gIG11c3Qgbm90IGJlIGluY2x1ZGVkIGJ5IGBzcmNgLlxuY29uc3QgaW5jbHVkZURpck5hbWVzID0gbmV3IFNldChbJ3NyYycsICdwdWJsaWMnXSk7XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG4gICdidW4ubG9jaycsXG4gICdidW4ubG9ja2InLFxuXTtcbmNvbnN0IGV4Y2x1ZGVEaXJOYW1lcyA9IG5ldyBTZXQoWyd0ZXN0JywgJ3Rlc3RzJywgJ19fdGVzdHNfXycsICd0ZXN0LWZpeHR1cmVzJ10pO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAvLyBgLXVhbGxgIGxpc3RzIHVudHJhY2tlZCBmaWxlcyBpbmRpdmlkdWFsbHkgKG5vdCBqdXN0IHRoZWlyIGRpcmVjdG9yeSksIHNvIG5ldyBmaWxlcyBpbiBhXG4gICAgLy8gYnJhbmQtbmV3IHNvdXJjZSBkaXJlY3RvcnkgcGFydGljaXBhdGUgaW4gdGhlIGhhc2ggYmVsb3cuIGAtemAgeWllbGRzIE5VTC1kZWxpbWl0ZWQsXG4gICAgLy8gVU5RVU9URUQgcmVjb3Jkczogd2l0aG91dCBpdCBnaXQgQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzLCB3aGljaCB3b3VsZCBzaWxlbnRseSBkcm9wIHRob3NlXG4gICAgLy8gZmlsZXMgZnJvbSBib3RoIHRoZSB1bnRyYWNrZWQgaGFzaGluZyBhbmQgdGhlIGBnaXQgZGlmZmAgcGF0aHNwZWNzLlxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbicsICctdWFsbCcsICcteiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCB0b2tlbnMgPSByZXQuc3Rkb3V0LnNwbGl0KCdcXDAnKS5maWx0ZXIoKHRva2VuKSA9PiB0b2tlbi5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBzdGF0dXNFbnRyaWVzOiB7IHVudHJhY2tlZDogYm9vbGVhbjsgZmlsZVBhdGg6IHN0cmluZyB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRva2VuLnNsaWNlKDAsIDIpO1xuICAgICAgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBzdGF0dXMgPT09ICc/PycsIGZpbGVQYXRoOiB0b2tlbi5zbGljZSgzKSB9KTtcbiAgICAgIC8vIFJlbmFtZS9jb3B5IHJlY29yZHMgY2FycnkgdGhlIE9SSUdJTkFMIHBhdGggYXMgYW4gZXh0cmEgTlVMLWRlbGltaXRlZCBmaWVsZDsgaW5jbHVkZSBpdFxuICAgICAgLy8gc28gYSBmaWxlIHJlbmFtZWQgb3V0IG9mIHRoZSBidWlsZCBpbnB1dHMgc3RpbGwgaW52YWxpZGF0ZXMgdGhlIGNhY2hlLlxuICAgICAgaWYgKHN0YXR1cy5pbmNsdWRlcygnUicpIHx8IHN0YXR1cy5pbmNsdWRlcygnQycpKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUGF0aCA9IHRva2Vuc1srK2luZGV4XTtcbiAgICAgICAgaWYgKG9yaWdpbmFsUGF0aCkgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBmYWxzZSwgZmlsZVBhdGg6IG9yaWdpbmFsUGF0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZEVudHJpZXMgPSBzdGF0dXNFbnRyaWVzLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIGhhc2hQYXRoOlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0J1xuICAgICAgICAgID8gZW50cnkuZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpXG4gICAgICAgICAgOiBlbnRyeS5maWxlUGF0aCxcbiAgICB9KSk7XG4gICAgLy8gQnVpbGQgT1VUUFVUUyBtdXN0IG5ldmVyIGNvdW50IGFzIGJ1aWxkIGlucHV0czogaGFzaGluZyBlLmcuIGFuIHVudHJhY2tlZCBkaXN0LyBmaWxlIHdvdWxkXG4gICAgLy8gY2hhbmdlIHRoZSBoYXNoIG9uIGV2ZXJ5IGJ1aWxkIGFuZCBkaXNhYmxlIHRoZSBjYWNoZSBwZXJtYW5lbnRseS5cbiAgICBjb25zdCBwcm9qZWN0UmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LnJvb3REaXJQYXRoLCBwcm9qZWN0LmRpclBhdGgpO1xuICAgIGNvbnN0IGV4cGxpY2l0T3V0cHV0UGF0aHMgPSAoZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBbXSkubWFwKChvdXRwdXRQYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3RSZWxhdGl2ZURpclBhdGgsIG91dHB1dFBhdGgpXG4gICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEVudHJpZXMgPSBub3JtYWxpemVkRW50cmllcy5maWx0ZXIoKHsgZmlsZVBhdGgsIGhhc2hQYXRoIH0pID0+IHtcbiAgICAgIGNvbnN0IGRpcmVjdG9yeVNlZ21lbnRzID0gaGFzaFBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAtMSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZGlyZWN0b3J5U2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gaW5jbHVkZURpck5hbWVzLmhhcyhzZWdtZW50KSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gaGFzaFBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFkaXJlY3RvcnlTZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBleGNsdWRlRGlyTmFtZXMuaGFzKHNlZ21lbnQpKSAmJlxuICAgICAgICAvLyBPbmx5IEVYUExJQ0lUTFkgZGVjbGFyZWQgb3V0cHV0cyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgaW5wdXQgaGFzaC4gRGVmYXVsdCBjYW5kaWRhdGVzXG4gICAgICAgIC8vIChkaXN0L2J1aWxkLy5uZXh0L291dCkgYXJlIE5PVDogZ2l0aWdub3JlZCBhcnRpZmFjdHMgbmV2ZXIgYXBwZWFyIGluIGBnaXQgc3RhdHVzYFxuICAgICAgICAvLyBhbnl3YXksIGFuZCBhIG5vbi1pZ25vcmVkIGZpbGUgdGhlcmUgbWF5IGJlIGdlbnVpbmUgc291cmNlIChlLmcuIGJ1aWxkLyBzY3JpcHRzKSwgd2hvc2VcbiAgICAgICAgLy8gY2hhbmdlcyBtdXN0IGludmFsaWRhdGUgdGhlIGNhY2hlIOKAlCBjb3JyZWN0bmVzcyBvdmVyIGNhY2hlIGhpdHMuIFByb2plY3RzIGtlZXBpbmdcbiAgICAgICAgLy8gbm9uLWlnbm9yZWQgYXJ0aWZhY3RzIGluIHRob3NlIGRpcmVjdG9yaWVzIHNob3VsZCBnaXRpZ25vcmUgdGhlbSBvciBwYXNzIC0tb3V0cHV0LlxuICAgICAgICAhbWF0Y2hlc091dHB1dFBhdGgoZXhwbGljaXRPdXRwdXRQYXRocywgZmlsZVBhdGgpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkuaGFzaFBhdGgpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gVW50cmFja2VkIGZpbGVzIG5ldmVyIGFwcGVhciBpbiBgZ2l0IGRpZmZgLCBzbyBoYXNoIHRoZWlyIGNvbnRlbnRzIGRpcmVjdGx5LlxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmlsdGVyZWRFbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnVudHJhY2tlZCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhc2gudXBkYXRlKGVudHJ5Lmhhc2hQYXRoKTtcbiAgICAgICAgaGFzaC51cGRhdGUoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCBlbnRyeS5maWxlUGF0aCkpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgZmlsZSBtYXkgdmFuaXNoIGNvbmN1cnJlbnRseTsgdGhlIHRyYWNrZWQtc3RhdGUgZGlmZiBiZWxvdyBpcyB1bmFmZmVjdGVkLlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrZWRQYXRocyA9IGZpbHRlcmVkRW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAhZW50cnkudW50cmFja2VkKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5oYXNoUGF0aCk7XG4gICAgaWYgKHRyYWNrZWRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIGBnaXQgZGlmZiBIRUFEIC0tYCB3aXRoIG5vIHBhdGhzcGVjIHdvdWxkIGRpZmYgRVZFUlkgZmlsZSwgbGV0dGluZyBleGNsdWRlZCBjaGFuZ2VzXG4gICAgICAvLyAoZG9jcywgdGVzdHMpIGludmFsaWRhdGUgdGhlIGNhY2hlLlxuICAgICAgcmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgZ2l0IGRpZmYgSEVBRGAgKG5vdCBwbGFpbiBgZ2l0IGRpZmZgKSBzbyBzdGFnZWQtb25seSBjaGFuZ2VzIGludmFsaWRhdGUgdGhlIGNhY2hlIHRvbztcbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGguXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICdIRUFEJywgJy0tJywgLi4udHJhY2tlZFBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIG9taXRTaWxlbnRTdGFydD86IGJvb2xlYW47XG4gIHByZXNlcnZlQ29sb3I/OiBib29sZWFuO1xuICBwcm9jZXNzU2lsZW50T3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHByaW50UmF3T3V0cHV0PzogYm9vbGVhbjtcbiAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5PzogYm9vbGVhbjtcbiAgc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBzaWxlbnRTdWNjZXNzTWVzc2FnZT86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSdW5SZXN1bHQge1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBvdXRwdXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYgeyBzaWxlbnQ/OiBib29sZWFuIH0sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBpZiAoIShhcmd2LnNpbGVudCAmJiBvcHRzLm9taXRTaWxlbnRTdGFydCAmJiAhYXJndi5kcnlSdW4pKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgYXJndi5zaWxlbnQgPyAnQ29tbWFuZCcgOiAnU3RhcnQnKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCA9IEJvb2xlYW4oXG4gICAgYXJndi5zaWxlbnQgJiYgKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/PyBvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSlcbiAgKTtcbiAgbGV0IHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3Jlc3NUaW1lciA9XG4gICAgYXJndi5zaWxlbnQgJiYgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXNcbiAgICAgID8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuJyk7XG4gICAgICAgICAgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0sIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IChhcmd2LnNpbGVudCA/IHRydWUgOiB1bmRlZmluZWQpIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBhcmd2LnNpbGVudCA/ICdwaXBlJyA6ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChwcm9ncmVzc1RpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAod3JvdGVTaWxlbnRQcm9ncmVzcykge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxuICBpZiAoc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCAmJiAoIW9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5IHx8IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPyBvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQocmV0LnN0ZG91dCkgOiByZXQuc3Rkb3V0KS50cmltKCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFyZ3Yuc2lsZW50ICYmIGV4aXRDb2RlID09PSAwICYmIG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4ob3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkpO1xuICB9XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgZXhpdENvZGUsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0ICYmICFvcHRzLnByaW50UmF3T3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8QnVmZmVyZWRSdW5SZXN1bHQ+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIG91dHB1dDogJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzIHJlcXVpcmluZ1xuICAvLyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICBjb25zdCBwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVuID0gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKC9QUklTTUEgZ2VuZXJhdGUoPyFcXHMrLS1uby1oaW50cykoPz1cXHN8JCkvZ3UsICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cycpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiBydW4gJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1bikgcnVuYC5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ3lhcm4gcnVuICcpO1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gcnVuIGJ1biBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IG5ld1NjcmlwdFxuICAgIC8vIEtlZXAgUGxheXdyaWdodCBhcyBhIHBhY2thZ2UtbWFuYWdlciBjb21tYW5kIGluc3RlYWQgb2YgcmVzb2x2aW5nIGl0IHRocm91Z2ggbm9kZV9tb2R1bGVzLy5iaW4uXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGNvbmZpZ3VyZUNvbG9yRW52KG5ld0Vudiwgb3B0cy5wcmVzZXJ2ZUNvbG9yKTtcbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGNoaWxkLXByb2Nlc3MgY29sb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB3Yi1tYW5hZ2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjaGlsZC1wcm9jZXNzIGVudmlyb25tZW50IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSBwcmVzZXJ2ZUNvbG9yIFdoZXRoZXIgd2Igc2hvdWxkIHByZXNlcnZlIGNvbG9ycyBmb3Igb3V0cHV0IHRoYXQgaXQgY2FwdHVyZXMgYW5kIHJlcHJpbnRzIHRvIGFuIGludGVyYWN0aXZlIFRUWS5cbiAqL1xuZnVuY3Rpb24gY29uZmlndXJlQ29sb3JFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoZW52Lk5PX0NPTE9SICE9PSB1bmRlZmluZWQgfHwgcHJlc2VydmVDb2xvciA9PT0gZmFsc2UpIHtcbiAgICAvLyBOT19DT0xPUiBhbmQgcHJlc2VydmVDb2xvcj1mYWxzZSBhcmUgZXhwbGljaXQgbm8tY29sb3IgY2hvaWNlcywgc28gaW5oZXJpdGVkIEZPUkNFX0NPTE9SIG11c3Qgbm90IGxlYWsgdGhyb3VnaC5cbiAgICBkZWxldGUgZW52LkZPUkNFX0NPTE9SO1xuICB9IGVsc2UgaWYgKHByZXNlcnZlQ29sb3IgJiYgcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICBlbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGNoZWNrRW52QnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgY2hlY2tFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBjaGVja0VudkJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY2hlY2stZW52JyxcbiAgZGVzY3JpYmU6XG4gICAgJ1ZlcmlmeSB0aGF0IGV2ZXJ5IGZub3gtZGVjbGFyZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHNlY3JldCByZXNvbHZlcyBmb3IgdGhlIGN1cnJlbnQgV0JfRU5WLiBQcmVmaXggc2NyaXB0cyB0aGF0IHdyaXRlIHRvIHJlbW90ZSBlbnZpcm9ubWVudHMgd2l0aCB0aGlzIGNvbW1hbmQgdG8gZmFpbCBmYXN0IG9uIG1pc3Npbmcgc2VjcmV0cy4nLFxuICBidWlsZGVyOiBjaGVja0VudkJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGNoZWNrRW52KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrRW52KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY2hlY2tFbnZCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICBjb25zb2xlLmluZm8oJ05vIGZub3gudG9tbCBmb3VuZDsgbm90aGluZyB0byBjaGVjay4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWFkaW5nIHByb2plY3QuZW52IHJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgV0JfRU5WIChjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpLCBzbyB0aGUgcHJvZmlsZVxuICAvLyBiZWxvdyBpcyB0aGUgc2FtZSBvbmUgZXZlcnkgb3RoZXIgd2IgY29tbWFuZCB3b3VsZCBsb2FkLlxuICBjb25zdCBwcm9maWxlID0gcHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG4gIC8vIGAtLWlmLW1pc3NpbmcgZXJyb3JgIG1ha2VzIHVucmVzb2x2YWJsZSBzZWNyZXRzIChlLmcuIGEgbWlzc2luZyBhZ2UgaWRlbnRpdHkpIGEgaGFyZCBmYWlsdXJlLFxuICAvLyB1bmxpa2UgdGhlIHRvbGVyYW50IGRlZmF1bHQgdXNlZCBmb3Igb3JkaW5hcnkgZW52IGxvYWRpbmcuXG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGBmbm94IGV4cG9ydCAtLWFsbCAtLWZvcm1hdCBqc29uIC0tbm8tZGFlbW9uIC0taWYtbWlzc2luZyBlcnJvciAtLXByb2ZpbGUgJHtwcm9maWxlfSA+IC9kZXYvbnVsbGAsXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gcmVzb2x2ZSBmbm94LWRlY2xhcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgcHJvZmlsZSBcIiR7cHJvZmlsZX1cIi5gKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEFsbCBmbm94LWRlY2xhcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyByZXNvbHZlIGZvciBwcm9maWxlIFwiJHtwcm9maWxlfVwiLmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBGT1JDRV9LSUxMX0RFTEFZX01TID0gNTAwMDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZm9yY2VLaWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCAnU0lHVEVSTScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBzaWduYWwpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGZvcmNlS2lsbFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb3JjZUtpbGxQaWRzID0gc2lnbmFsUGlkcyh0b0NoaWxkUGlkcyhjaGlsZHJlbiksIHNpZ25hbCk7XG4gIGlmIChmb3JjZUtpbGxQaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmIChhd2FpdCB3YWl0Rm9yRm9yY2VLaWxsKGZvcmNlS2lsbFBpZHMpKSB7XG4gICAgc2lnbmFsUGlkcyhmb3JjZUtpbGxQaWRzLCAnU0lHS0lMTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRQaWRzKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gY2hpbGRyZW4uZmxhdE1hcCgoY2hpbGQpID0+IChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2NoaWxkLnBpZF0pKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsUGlkcyhwaWRzOiByZWFkb25seSBudW1iZXJbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IG51bWJlcltdIHtcbiAgY29uc3Qgc2lnbmFsZWRQaWRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBpZCBvZiBwaWRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgha2lsbFByb2Nlc3NHcm91cChwaWQsIHNpZ25hbCkpIGNvbnRpbnVlO1xuXG4gICAgICBzaWduYWxlZFBpZHMucHVzaChwaWQpO1xuICAgICAgdHJlZUtpbGwocGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmFsZWRQaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRm9yY2VLaWxsKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEZPUkNFX0tJTExfREVMQVlfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocGlkcy5ldmVyeShpc1Byb2Nlc3NHcm91cEdvbmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBzbGVlcChNYXRoLm1pbigxMDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NHcm91cEdvbmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgMCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCwgaXNQcm9qZWN0RW52aXJvbm1lbnQsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQsIGdldEQxRGF0YWJhc2VOYW1lLCBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgeyBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uIH0gZnJvbSAnLi9saXRlc3RyZWFtLmpzJztcblxuY2xhc3MgRHJpenpsZVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnY2xlYW51cC1saXRlc3RyZWFtJyk7XG4gICAgY29uc3Qgd2FsQ2hlY2twb2ludENvbW1hbmQgPSBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF0gJiYgY29tbWFuZCAtdiBzcWxpdGUzID4vZGV2L251bGw7IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBzcWxpdGUzIFwiJHtkYlBhdGh9XCI7IGZpYDtcbiAgICByZXR1cm4gYCR7d2FsQ2hlY2twb2ludENvbW1hbmR9OyBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qOyBybSAtUmYgXCIke3BhdGguZGlybmFtZShkYlBhdGgpfS8uJHtwYXRoLmJhc2VuYW1lKGRiUGF0aCl9XCIqIHx8IHRydWVgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgZDFEYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgICBpZiAoZDFEYXRhYmFzZU5hbWUpIHtcbiAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBEMSBzdWJ0cmVlIHNvIHRoYXQgb3RoZXIgbG9jYWxseS1wZXJzaXN0ZWQgYmluZGluZ3MgKEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKSBzdXJ2aXZlLFxuICAgICAgLy8gdGhlbiByZS1tYXRlcmlhbGl6ZSB0aGUgRDEgU1FMaXRlIGZpbGUuIEl0cyBwYXRoIGlzIGRldGVybWluaXN0aWMsIHNvIGEgREFUQUJBU0VfVVJMIGV4cG9ydGVkXG4gICAgICAvLyBiZWZvcmUgdGhlIHJlbW92YWwgc3RheXMgdmFsaWQuXG4gICAgICByZXR1cm4gYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfS92My9kMVwiICYmICR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGQxRGF0YWJhc2VOYW1lKX0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBtaWdyYXRlRm9yU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgKGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpIHx8IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgbWlncmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdkZXBsb3ktZm9yY2UnKTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGgpO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIFRoZSBlbnZpcm9ubWVudCBhc3NpZ25tZW50IG11c3QgZ28gdGhyb3VnaCBidWlsZERyaXp6bGVLaXRDb21tYW5kOiBwcmVmaXhpbmcgaXRzXG4gICAgLy8gcG9zc2libHktcGFyZW50aGVzaXplZCByZXN1bHQgd2l0aCBgQUxMT1dfVE9fU0tJUF9TRUVEPTBgIHdvdWxkIGJlIGEgc2hlbGwgc3ludGF4IGVycm9yLlxuICAgIGNvbnN0IG1pZ3JhdGVXaXRoU2VlZENvbW1hbmQgPSBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsICdtaWdyYXRlJywgJ0FMTE9XX1RPX1NLSVBfU0VFRD0wJyk7XG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07ICR7dGhpcy5kZXBsb3kocHJvamVjdCl9ICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofVwiICYmIGxzIC1haGwgXCIke2RiUGF0aH1cIiAmJiAke21pZ3JhdGVXaXRoU2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdsaXN0LWJhY2t1cHMnKTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ3Jlc3RvcmUnKTtcbiAgICByZXR1cm4gYCR7YnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKG91dHB1dFBhdGgpfTsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gXCIke291dHB1dFBhdGh9XCIgXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICBnZW5lcmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBtaWdyYXRlRGV2KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIGNvbnN0IGRlZmF1bHRTZWVkUGF0aCA9IHBhdGguam9pbignZGInLCAnc2VlZC50cycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRlZmF1bHRTZWVkUGF0aCkpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgQlVOICR7ZGVmYXVsdFNlZWRQYXRofWAgOiBgQlVOIGJ1aWxkLXRzIHJ1biAke2RlZmF1bHRTZWVkUGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmdzOiBzdHJpbmcsIGVudmlyb25tZW50QXNzaWdubWVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZCA9IGAke2Vudmlyb25tZW50QXNzaWdubWVudCAmJiBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnR9IGB9WUFSTiBkcml6emxlLWtpdCAke2FyZ3N9YDtcbiAgLy8gQSBjYWxsZXItc3VwcGxpZWQgLS1jb25maWcgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHNvIHRoZSBjd2QgbXVzdCBzdGF5IHRoZXJlLlxuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1jb25maWcnKSA/IGNvbW1hbmQgOiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgY29tbWFuZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdDogUHJvamVjdCwgY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIC8vIGRyaXp6bGUta2l0IHJlc29sdmVzIHJlbGF0aXZlIHBhdGhzIGluIGl0cyBjb25maWcgYWdhaW5zdCB0aGUgY3dkLCBzbyB0aGUgY29tbWFuZCBtdXN0IHJ1blxuICAvLyBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZHJpenpsZS5jb25maWcuKiBldmVuIHdoZW4gbW9ub3JlcG8gcGFja2FnZXMgc2hhcmUgaXQgYXQgdGhlIHJvb3QuXG4gIHJldHVybiBjb25maWcgJiYgY29uZmlnLmRpclBhdGggIT09IHByb2plY3QuZGlyUGF0aFxuICAgID8gYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBjb25maWcuZGlyUGF0aF0pfSAmJiAke2NvbW1hbmR9KWBcbiAgICA6IGNvbW1hbmQ7XG59XG5cbi8qKlxuICogV2hldGhlciBkcml6emxlLWtpdCBpcyB0aGUgcHJvamVjdCdzIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20uIEEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBpc1xuICogbm90IGEgcmVsaWFibGUgbWFya2VyOiBhIFdvcmtlciBtYXkgdXNlIEQxIG9ubHkgZm9yIGNhY2hpbmcgd2hpbGUgaXRzIGRyaXp6bGUgY29uZmlnIHRhcmdldHMgYW5cbiAqIHVucmVsYXRlZCBkYXRhYmFzZSAoZS5nLiBQb3N0Z3JlU1FMIHZpYSBIeXBlcmRyaXZlKSwgYW5kIHJ1bm5pbmcgYGRyaXp6bGUta2l0IG1pZ3JhdGVgIGFnYWluc3RcbiAqIHRoYXQgZGF0YWJhc2UgZHVyaW5nIGEgRDEgZGVwbG95IHdvdWxkIGJlIHdyb25nIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NDIpLlxuICogU28gcmVxdWlyZSBhbiBleHBsaWNpdCBtYXJrZXI6IGEgZHJpenpsZSBjb25maWcgd2hvc2UgZGlhbGVjdC9kcml2ZXIgdGFyZ2V0cyBzcWxpdGUsIGQxLWh0dHAsIG9yXG4gKiBkdXJhYmxlLXNxbGl0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXNEcml6emxlS2l0Rm9yRDEocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHN0cmlwSnNDb21tZW50cyhmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBjb25maWcuZmlsZU5hbWUpLCAndXRmOCcpKTtcbiAgICAvLyBTY2FuIG9ubHkgdGhlIGV4cG9ydGVkIGNvbmZpZydzIG9iamVjdCBsaXRlcmFsOiBkcml6emxlLWtpdCBjb25zdW1lcyB0aGUgZGVmYXVsdCBleHBvcnQsXG4gICAgLy8gYW5kIG1hdGNoaW5nIG90aGVyIHRleHQgKGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50IGFib3ZlIHRoZSBleHBvcnQsIG9yIG1hcmtlci1saWtlXG4gICAgLy8gc3RyaW5nIGNvbnRlbnQgaW4gc3RhdGVtZW50cyBhZnRlciBpdCkgd291bGQgc2VsZWN0IHRoZSB3cm9uZyBtaWdyYXRpb24gbWVjaGFuaXNtLlxuICAgIC8vIFBPU0lUSU9OUyAoZXhwb3J0IG1hcmtlcnMsIGRlY2xhcmF0aW9ucykgYXJlIGxvY2F0ZWQgb24gYSBzdHJpbmctbWFza2VkIHZpZXcgb2YgdGhlIHNhbWVcbiAgICAvLyBsZW5ndGgsIHNvIGBleHBvcnQgZGVmYXVsdGAgaW5zaWRlIGEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IG1pc2xlYWQgdGhlIHNlYXJjaC5cbiAgICBjb25zdCBtYXNrZWRDb250ZW50ID0gbWFza1N0cmluZ0NvbnRlbnRzKGNvbnRlbnQpO1xuICAgIGNvbnN0IGV4cG9ydEluZGljZXMgPSBbJ2V4cG9ydCBkZWZhdWx0JywgJ21vZHVsZS5leHBvcnRzJ11cbiAgICAgIC5tYXAoKG1hcmtlcikgPT4gbWFza2VkQ29udGVudC5pbmRleE9mKG1hcmtlcikpXG4gICAgICAuZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKTtcbiAgICBjb25zdCBleHBvcnRTdGFydEluZGV4ID0gZXhwb3J0SW5kaWNlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4uZXhwb3J0SW5kaWNlcykgOiAwO1xuICAgIGNvbnN0IG9iamVjdFNwYW4gPSBleHRyYWN0RXhwb3J0ZWRDb25maWdPYmplY3QoY29udGVudCwgbWFza2VkQ29udGVudCwgZXhwb3J0U3RhcnRJbmRleCk7XG4gICAgcmV0dXJuIG9iamVjdFNwYW4gIT09IHVuZGVmaW5lZCAmJiBkZWNsYXJlc1NxbGl0ZVRhcmdldChvYmplY3RTcGFuKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG9iamVjdCBsaXRlcmFsIHRoZSBleHBvcnQgYWN0dWFsbHkgZXZhbHVhdGVzIHRvOiBmb3IgYGV4cG9ydCBkZWZhdWx0IHsuLi59YCBvclxuICogYGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7Li4ufSlgIHRoZSBmaXJzdCBiYWxhbmNlZCBvYmplY3QgYWZ0ZXIgdGhlIG1hcmtlciwgYW5kIGZvclxuICogYGV4cG9ydCBkZWZhdWx0IGNvbmZpZztgIHRoZSBpbml0aWFsaXplciBvZiB0aGF0IGlkZW50aWZpZXIncyBkZWNsYXJhdGlvbiDigJQgbmV2ZXIgdGhlIHdob2xlXG4gKiBmaWxlLCBzaW5jZSBhbiB1bnJlbGF0ZWQgb2JqZWN0IChlLmcuIGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50KSBtdXN0IG5vdCBiZSBzZWxlY3RlZC5cbiAqIFVuZGVmaW5lZCB3aGVuIHRoZSBleHByZXNzaW9uIGNhbm5vdCBiZSByZXNvbHZlZDsgd2IgZGVwbG95J3MgdW5tYW5hZ2VkLUQxIHdhcm5pbmcgY292ZXJzIHRoYXQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRlZENvbmZpZ09iamVjdChcbiAgY29udGVudDogc3RyaW5nLFxuICBtYXNrZWRDb250ZW50OiBzdHJpbmcsXG4gIGV4cG9ydFN0YXJ0SW5kZXg6IG51bWJlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhwb3J0ZWRFeHByZXNzaW9uID0gbWFza2VkQ29udGVudFxuICAgIC5zbGljZShleHBvcnRTdGFydEluZGV4KVxuICAgIC5yZXBsYWNlKC9eKD86ZXhwb3J0XFxzK2RlZmF1bHR8bW9kdWxlXFwuZXhwb3J0c1xccyo9KVxccyovLCAnJyk7XG4gIC8vIEFuIGlkZW50aWZpZXIgZXhwb3J0IG1heSBjYXJyeSBhIFR5cGVTY3JpcHQgdHlwZSBwb3N0Zml4IChgY29uZmlnIHNhdGlzZmllcyBDb25maWc7YCAvXG4gIC8vIGBjb25maWcgYXMgQ29uZmlnO2ApOyB0aGUgaWRlbnRpZmllciBpcyByZWNvZ25pemVkIEZJUlNUIHNvIGEgcG9zdGZpeCBjb250YWluaW5nIGEgVFlQRVxuICAvLyBsaXRlcmFsIChgc2F0aXNmaWVzIHsgZGlhbGVjdDogJ3NxbGl0ZScgfCAuLi4gfWApIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcnVudGltZSBjb25maWcuXG4gIGNvbnN0IGlkZW50aWZpZXJNYXRjaCA9IC9eKFtBLVphLXpfJF1bXFx3JF0qKVxccyooPzpzYXRpc2ZpZXNcXGJ8YXNcXGJ8O3xcXG58JCkvLmV4ZWMoZXhwb3J0ZWRFeHByZXNzaW9uKTtcbiAgaWYgKCFpZGVudGlmaWVyTWF0Y2gpIHtcbiAgICBjb25zdCBicmFjZU9mZnNldCA9IG1hc2tlZENvbnRlbnQuc2xpY2UoZXhwb3J0U3RhcnRJbmRleCkuaW5kZXhPZigneycpO1xuICAgIGlmIChicmFjZU9mZnNldCA9PT0gLTEpIHJldHVybjtcbiAgICByZXR1cm4gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudC5zbGljZShleHBvcnRTdGFydEluZGV4ICsgYnJhY2VPZmZzZXQpKTtcbiAgfVxuXG4gIC8vIGAkYCBpcyBsZWdhbCBpbiBpZGVudGlmaWVycyBidXQgYSByZWdleCBhbmNob3IsIHNvIGl0IG11c3QgYmUgZXNjYXBlZCBiZWZvcmUgaW50ZXJwb2xhdGlvbjtcbiAgLy8gYCg/IVtcXHckXSlgIChub3QgYFxcYmApIGVuZHMgdGhlIG1hdGNoIGJlY2F1c2UgYFxcYmAgbmV2ZXIgZmlyZXMgYWZ0ZXIgYSB0cmFpbGluZyBgJGAuXG4gIGNvbnN0IGVzY2FwZWRJZGVudGlmaWVyID0gaWRlbnRpZmllck1hdGNoWzFdIS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgY29uc3QgZGVjbGFyYXRpb25FbmRJbmRleCA9IGZpbmRNb2R1bGVTY29wZURlY2xhcmF0aW9uRW5kKG1hc2tlZENvbnRlbnQsIGVzY2FwZWRJZGVudGlmaWVyKTtcbiAgaWYgKGRlY2xhcmF0aW9uRW5kSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAvLyBUaGUgaW5pdGlhbGl6ZXIgbXVzdCBiZWxvbmcgdG8gVEhJUyBkZWNsYXJhdGlvbiAoYSB0eXBlIGFubm90YXRpb24gbWF5IHByZWNlZGUgdGhlIGA9YCk7IGFuXG4gIC8vIHVuaW5pdGlhbGl6ZWQgYGxldCBjb25maWc7YCBzdGF5cyB1bnJlc29sdmVkIGluc3RlYWQgb2YgZ3JhYmJpbmcgYSBsYXRlciBzdGF0ZW1lbnQncyBgPWAuXG4gIGNvbnN0IGFzc2lnbm1lbnRNYXRjaCA9IC9eXFxzKig/OjpbXj07XFxuXSopPz0vLmV4ZWMobWFza2VkQ29udGVudC5zbGljZShkZWNsYXJhdGlvbkVuZEluZGV4KSk7XG4gIGlmICghYXNzaWdubWVudE1hdGNoKSByZXR1cm47XG4gIHJldHVybiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50LnNsaWNlKGRlY2xhcmF0aW9uRW5kSW5kZXggKyBhc3NpZ25tZW50TWF0Y2hbMF0ubGVuZ3RoKSk7XG59XG5cbi8qKlxuICogVGhlIGVuZCBpbmRleCBvZiB0aGUgaWRlbnRpZmllcidzIGRlY2xhcmF0aW9uIGF0IGJyYWNlIGRlcHRoIFpFUk8gKG1vZHVsZSBzY29wZSk6IGEgc2FtZS1uYW1lZFxuICogZGVjbGFyYXRpb24gaW5zaWRlIGEgZnVuY3Rpb24gYm9keSBtdXN0IG5vdCBzaGFkb3cgdGhlIGJpbmRpbmcgdGhlIGV4cG9ydCByZWZlcmVuY2VzLCBhbmRcbiAqIGluZGVudGF0aW9uIGlzIG5vIHNjb3BlIHNpZ25hbCDigJQgZGVwdGggb3ZlciB0aGUgc3RyaW5nLW1hc2tlZCBjb250ZW50IGlzLlxuICovXG5mdW5jdGlvbiBmaW5kTW9kdWxlU2NvcGVEZWNsYXJhdGlvbkVuZChtYXNrZWRDb250ZW50OiBzdHJpbmcsIGVzY2FwZWRJZGVudGlmaWVyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNsYXJhdGlvblJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YCg/PCFbXFx3JF0pKD86ZXhwb3J0XFxzKyk/KD86Y29uc3R8bGV0fHZhcilcXHMrJHtlc2NhcGVkSWRlbnRpZmllcn0oPyFbXFx3JF0pYCxcbiAgICAnZydcbiAgKTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHNjYW5JbmRleCA9IDA7XG4gIGZvciAobGV0IG1hdGNoID0gZGVjbGFyYXRpb25SZWdleC5leGVjKG1hc2tlZENvbnRlbnQpOyBtYXRjaDsgbWF0Y2ggPSBkZWNsYXJhdGlvblJlZ2V4LmV4ZWMobWFza2VkQ29udGVudCkpIHtcbiAgICBmb3IgKDsgc2NhbkluZGV4IDwgbWF0Y2guaW5kZXg7IHNjYW5JbmRleCsrKSB7XG4gICAgICBjb25zdCBjaGFyID0gbWFza2VkQ29udGVudFtzY2FuSW5kZXhdO1xuICAgICAgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09ICd9JykgZGVwdGgtLTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIENPTlRFTlRTIG9mIHN0cmluZyBsaXRlcmFscyB3aXRoIHNwYWNlcyAoc2FtZSBsZW5ndGgsIG5ld2xpbmVzIGtlcHQpLCBzbyBwb3NpdGlvblxuICogc2VhcmNoZXMgb3ZlciB0aGUgcmVzdWx0IGNhbm5vdCBtYXRjaCB0ZXh0IGluc2lkZSBzdHJpbmdzIHdoaWxlIGFsbCBpbmRleGVzIHN0aWxsIG1hcCAxOjEgdG9cbiAqIHRoZSBvcmlnaW5hbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBtYXNrU3RyaW5nQ29udGVudHMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICByZXN1bHQgKz0gJyAgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHtcbiAgICAgICAgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhciA9PT0gJ1xcbicgPyAnXFxuJyA6ICcgJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmctYXdhcmUgc2NhbiBmb3IgdGhlIG1hcmtlcnMgaW5kaWNhdGluZyB0aGUgY29uZmlnIG1hbmFnZXMgYSAoQ2xvdWRmbGFyZSBEMSBjb21wYXRpYmxlKVxuICogU1FMaXRlIGRhdGFiYXNlIOKAlCBhIGBkaWFsZWN0OiAnc3FsaXRlJ2AsIGBkcml2ZXI6ICdkMS1odHRwJ2AsIG9yIGBkcml2ZXI6ICdkdXJhYmxlLXNxbGl0ZSdgXG4gKiBQUk9QRVJUWSAocGxhaW4gb3IgcXVvdGVkIGtleSkuIEtleXMgYXJlIG9ubHkgcmVjb2duaXplZCBpbiBjb2RlIHBvc2l0aW9uLCBzbyBtYXJrZXItbGlrZSB0ZXh0XG4gKiBlbWJlZGRlZCBpbiB1bnJlbGF0ZWQgc3RyaW5nIHZhbHVlcyAoZS5nLiBhIHNjaGVtYSBwYXRoKSBjYW5ub3QgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzU3FsaXRlVGFyZ2V0KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZ3MoY29udGVudCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHZhbHVlVG9rZW5JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnY29kZScpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58W1xcc3ssKF0pKGRpYWxlY3R8ZHJpdmVyKVxccyo6XFxzKiQvLmV4ZWModG9rZW4udmFsdWUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGtleSA9IG1hdGNoWzFdO1xuICAgICAgICB2YWx1ZVRva2VuSW5kZXggPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ2RpYWxlY3QnIHx8IHRva2VuLnZhbHVlID09PSAnZHJpdmVyJykge1xuICAgICAgLy8gQSBxdW90ZWQga2V5OiB0aGUgc3Vycm91bmRpbmcgY29kZSB0b2tlbnMgbXVzdCBmb3JtIGEgcHJvcGVydHkgcG9zaXRpb24gKGB7YC9gLGAgYmVmb3JlLFxuICAgICAgLy8gYDpgIGFmdGVyKS5cbiAgICAgIGNvbnN0IHByZXZpb3VzVG9rZW4gPSB0b2tlbnNbaW5kZXggLSAxXTtcbiAgICAgIGNvbnN0IG5leHRUb2tlbiA9IHRva2Vuc1tpbmRleCArIDFdO1xuICAgICAgaWYgKFxuICAgICAgICBwcmV2aW91c1Rva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL1t7LChdXFxzKiQvLnRlc3QocHJldmlvdXNUb2tlbi52YWx1ZSkgJiZcbiAgICAgICAgbmV4dFRva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL15cXHMqOlxccyokLy50ZXN0KG5leHRUb2tlbi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBrZXkgPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgdmFsdWVUb2tlbkluZGV4ID0gaW5kZXggKyAyO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgdmFsdWVUb2tlbkluZGV4ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdmFsdWVUb2tlbiA9IHRva2Vuc1t2YWx1ZVRva2VuSW5kZXhdO1xuICAgIGlmICh2YWx1ZVRva2VuPy50eXBlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgaWYgKGtleSA9PT0gJ2RpYWxlY3QnICYmIHZhbHVlVG9rZW4udmFsdWUgPT09ICdzcWxpdGUnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoa2V5ID09PSAnZHJpdmVyJyAmJiAodmFsdWVUb2tlbi52YWx1ZSA9PT0gJ2QxLWh0dHAnIHx8IHZhbHVlVG9rZW4udmFsdWUgPT09ICdkdXJhYmxlLXNxbGl0ZScpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXQgaW50byBhbHRlcm5hdGluZyBjb2RlIGFuZCBzdHJpbmctbGl0ZXJhbC1jb250ZW50IHRva2VucyAocXVvdGVzIGV4Y2x1ZGVkKS4gVGhlIGlucHV0IGlzXG4gKiBhbHJlYWR5IGNvbW1lbnQtZnJlZSDigJQgdXNlc0RyaXp6bGVLaXRGb3JEMSBydW5zIHN0cmlwSnNDb21tZW50cyBiZWZvcmUgYW55IHNjYW5uaW5nIOKAlCBzb1xuICogY29tbWVudCBkZWxpbWl0ZXJzIG5lZWQgbm8gaGFuZGxpbmcgaGVyZSAoYSBjb21tZW50ZWQtb3V0IGAvLyBkaWFsZWN0OiAnc3FsaXRlJ2AgY2FuIG5ldmVyXG4gKiByZWFjaCB0aGlzIHRva2VuaXplcikuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU3RyaW5ncyhjb250ZW50OiBzdHJpbmcpOiB7IHR5cGU6ICdjb2RlJyB8ICdzdHJpbmcnOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IHRva2VuczogeyB0eXBlOiAnY29kZScgfCAnc3RyaW5nJzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgbGV0IGNvZGUgPSAnJztcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ2NvZGUnLCB2YWx1ZTogY29kZSB9KTtcbiAgICAgIGNvZGUgPSAnJztcbiAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSBjaGFyKSB7XG4gICAgICAgIGlmIChjb250ZW50W2luZGV4XSA9PT0gJ1xcXFwnKSBpbmRleCsrO1xuICAgICAgICB2YWx1ZSArPSBjb250ZW50W2luZGV4XSA/PyAnJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ3N0cmluZycsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvZGUgKz0gY2hhcjtcbiAgfVxuICB0b2tlbnMucHVzaCh7IHR5cGU6ICdjb2RlJywgdmFsdWU6IGNvZGUgfSk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBUaGUgZmlyc3QgYHsgLi4uIH1gIHNwYW4gKHN0cmluZy1hd2FyZSBicmFjZSBtYXRjaGluZyksIG9yIHVuZGVmaW5lZCB3aGVuIG5vbmUgZXhpc3RzLiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZigneycpO1xuICBpZiAoc3RhcnRJbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykgaW5kZXgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgIGVsc2UgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICBlbHNlIGlmIChjaGFyID09PSAnfScgJiYgLS1kZXB0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQuc2xpY2Uoc3RhcnRJbmRleCwgaW5kZXggKyAxKTtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmVtb3ZlIGJsb2NrIGFuZCBsaW5lIGNvbW1lbnRzIHNvIGNvbW1lbnRlZC1vdXQgbWFya2VycyAoZS5nLiBgLy8gZGlhbGVjdDogJ3NxbGl0ZSdgIGluIGFcbiAqIFBvc3RncmVTUUwgY29uZmlnKSBjYW5ub3QgbWlzY2xhc3NpZnkgdGhlIGNvbmZpZy4gVGhlIHNjYW5uZXIgdHJhY2tzIHN0cmluZyBzdGF0ZSwgc28gYC8vYFxuICogaW5zaWRlIHN0cmluZyBsaXRlcmFscyAoVVJMcyBzdWNoIGFzIGBodHRwczovLy4uLmAgaW4gY29ubmVjdGlvbiBzdHJpbmdzKSBzdXJ2aXZlcyB3aGlsZVxuICogY29tbWVudHMgZGlyZWN0bHkgYWZ0ZXIgYSBzdHJpbmcgbGl0ZXJhbCBhcmUgc3RpbGwgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBKc0NvbW1lbnRzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGNvbnN0IG5leHRDaGFyID0gY29udGVudFtpbmRleCArIDFdO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXIgKyAobmV4dENoYXIgPz8gJycpO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkge1xuICAgICAgICBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnLycpIHtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnKicpIHtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiAhKGNvbnRlbnRbaW5kZXhdID09PSAnKicgJiYgY29udGVudFtpbmRleCArIDFdID09PSAnLycpKSBpbmRleCsrO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZERyaXp6bGVDb25maWcocHJvamVjdDogUHJvamVjdCk6IHsgZGlyUGF0aDogc3RyaW5nOyBmaWxlTmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWydkcml6emxlLmNvbmZpZy50cycsICdkcml6emxlLmNvbmZpZy5tdHMnLCAnZHJpenpsZS5jb25maWcuanMnLCAnZHJpenpsZS5jb25maWcubWpzJ107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBbcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnJvb3REaXJQYXRoXSkge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gY2FuZGlkYXRlcy5maW5kKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gICAgaWYgKGZpbGVOYW1lKSByZXR1cm4geyBkaXJQYXRoLCBmaWxlTmFtZSB9O1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG4gIHJldHVybiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoYWJzb2x1dGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtZiBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9LXdhbFwiIFwiJHtkYlBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkZhbWlseUNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdiIGRiICR7Y29tbWFuZE5hbWV9IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuYCk7XG4gIH1cbiAgcmV0dXJuIGRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdCwgY29tbWFuZE5hbWUpO1xuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3dyYW5nbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXcmFuZ2xlckQxRGF0YWJhc2Uge1xuICBiaW5kaW5nPzogc3RyaW5nO1xuICBkYXRhYmFzZV9uYW1lPzogc3RyaW5nO1xuICBkYXRhYmFzZV9pZD86IHN0cmluZztcbiAgbWlncmF0aW9uc19kaXI/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfcGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBEMSBiaW5kaW5nIHVzZXMgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgdGhhdCBgd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseWBcbiAqIHdvdWxkIGFjdHVhbGx5IGRpc2NvdmVyOiBhbiBleHBsaWNpdCBgbWlncmF0aW9uc19wYXR0ZXJuYCBvcHRzIGluLCBvdGhlcndpc2UgdGhlIG1pZ3JhdGlvbnNcbiAqIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gZmxhdCBgKi5zcWxgIGZpbGVzICh3cmFuZ2xlcidzIGRlZmF1bHQgcGF0dGVybikuIEEgZHJpenpsZS1raXQgYG91dGBcbiAqIGRpcmVjdG9yeSB3aXRoIG5lc3RlZCBgPG5hbWU+L21pZ3JhdGlvbi5zcWxgIGZpbGVzIGFuZCBubyBwYXR0ZXJuIHdvdWxkIG1hdGNoIG5vdGhpbmcgYW5kXG4gKiBzaWxlbnRseSBhcHBseSB6ZXJvIG1pZ3JhdGlvbnMsIHNvIGl0IG11c3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBkcml6emxlLWtpdCBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPiwgZGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSk6IGJvb2xlYW4ge1xuICAvLyBBbiBleHBsaWNpdCBwYXR0ZXJuIG9wdHMgaW50byB0aGUgd3JhbmdsZXItbmF0aXZlIG1lY2hhbmlzbSBldmVuIGJlZm9yZSB0aGUgZGlyZWN0b3J5XG4gIC8vIGV4aXN0czsgd3JhbmdsZXIgdGhlbiBmYWlscyBzYWZlbHkgd2l0aCBcIk5vIG1pZ3JhdGlvbnMgZm9sZGVyIGZvdW5kXCIgaW5zdGVhZCBvZiB3YlxuICAvLyBzaWxlbnRseSBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgbWlncmF0aW9uIGVuZ2luZS5cbiAgaWYgKGRhdGFiYXNlLm1pZ3JhdGlvbnNfcGF0dGVybikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGF0YWJhc2UubWlncmF0aW9uc19kaXIgPz8gJ21pZ3JhdGlvbnMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZnMucmVhZGRpclN5bmMobWlncmF0aW9uc0RpclBhdGgpLnNvbWUoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5lbmRzV2l0aCgnLnNxbCcpKTtcbn1cblxuY29uc3QgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMgPSBuZXcgU2V0KFsnYmluZGluZ3MnLCAnc2VuZF9lbWFpbCcsICdyYXRlbGltaXRzJ10pO1xuY29uc3QgUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUyA9IG5ldyBTZXQoWyd3YXNtX21vZHVsZXMnLCAndGV4dF9ibG9icycsICdkYXRhX2Jsb2JzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgYmluZGluZyBuYW1lIGRlY2xhcmVkIGluIHRoZSAoZW52aXJvbm1lbnQtcmVzb2x2ZWQpIGNvbmZpZyBzdWJ0cmVlOiBgYmluZGluZ2BcbiAqIHByb3BlcnRpZXMgYW55d2hlcmUgKEQxLCBLViwgUjIsIHNlcnZpY2VzLCBhc3NldHMsIHF1ZXVlcywgZXRjLiksIHRoZSBgbmFtZWAta2V5ZWQgYmluZGluZ3NcbiAqIChgZHVyYWJsZV9vYmplY3RzLmJpbmRpbmdzYCwgYGxvZ2Z3ZHIuYmluZGluZ3NgLCBgc2VuZF9lbWFpbGAsIGByYXRlbGltaXRzYCksIGFuZCB0aGVcbiAqIHJlY29yZC1rZXllZCBsZWdhY3kgbW9kdWxlIGJpbmRpbmdzIChgd2FzbV9tb2R1bGVzYCwgYHRleHRfYmxvYnNgLCBgZGF0YV9ibG9ic2ApLiBBIHNlY3JldFxuICogc2hhcmluZyBhIGJpbmRpbmcncyBuYW1lIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhhdCBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcgb24gZGVwbG95LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyh2YWx1ZTogdW5rbm93biwgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKSwgcGFyZW50S2V5ID0gJycpOiBTZXQ8c3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgY29sbGVjdEJpbmRpbmdOYW1lcyhpdGVtLCBuYW1lcywgcGFyZW50S2V5KTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbmFtZXM7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChrZXkgPT09ICdiaW5kaW5nJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbmFtZScgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyAmJiBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUy5oYXMocGFyZW50S2V5KSkge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMuaGFzKGtleSkgJiYgY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmluZGluZ05hbWUgb2YgT2JqZWN0LmtleXMoY2hpbGQpKSBuYW1lcy5hZGQoYmluZGluZ05hbWUpO1xuICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnZW52JyAmJiBrZXkgIT09ICd2YXJzJyAmJiBrZXkgIT09ICdtZXRhZGF0YScgJiYga2V5ICE9PSAnb3B0aW9ucycpIHtcbiAgICAgIC8vIE5lc3RlZCBgZW52YCBzdWJ0cmVlcyBiZWxvbmcgdG8gb3RoZXIgZW52aXJvbm1lbnRzOyBgdmFyc2AgdmFsdWVzLCBgdW5zYWZlLm1ldGFkYXRhYCxcbiAgICAgIC8vIGFuZCBgdW5zYWZlLmJpbmRpbmdzW10uZGV2Lm9wdGlvbnNgIGFyZSBhcmJpdHJhcnkgSlNPTiB3aG9zZSBwcm9wZXJ0aWVzIChlLmcuIGFcbiAgICAgIC8vIFwiYmluZGluZ1wiIGZpZWxkKSBhcmUgZGF0YSwgbm90IFdvcmtlciBiaW5kaW5ncy5cbiAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoY2hpbGQsIG5hbWVzLCBrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB7XG4gIC8qKiBUaGUgV29ya2VyIG5hbWUgZm9yIHRoZSBkZXBsb3kgZW52aXJvbm1lbnQgKHdyYW5nbGVyIGFwcGVuZHMgYC08ZW52PmAgd2hlbiB0aGUgZW52IHNlY3Rpb24gaGFzIG5vIG93biBuYW1lKS4gKi9cbiAgd29ya2VyTmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB2YXJLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBlbnZpcm9ubWVudCdzIGB2YXJzYCB2YWx1ZXMgKG5lZWRlZCBmb3IgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIGNvdW50L3NpemUgbGltaXRzKS4gKi9cbiAgdmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTZWNyZXRzIGRlY2xhcmVkIGFzIHJlcXVpcmVkIHZpYSB3cmFuZ2xlcidzIGBzZWNyZXRzLnJlcXVpcmVkYCAodmFsaWRhdGVkIGF0IGRlcGxveSB0aW1lKS4gKi9cbiAgcmVxdWlyZWRTZWNyZXROYW1lczogc3RyaW5nW107XG4gIC8qKiBOYW1lcyBvZiBhbGwgbm9uLXZhciBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzLCBzZW5kX2VtYWlsLCBzZXJ2aWNlcywgLi4uKS4gKi9cbiAgYmluZGluZ05hbWVzOiBzdHJpbmdbXTtcbiAgZDFEYXRhYmFzZXM6IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZW52aXJvbm1lbnQgY29tZXMgZnJvbSBhbiBgZW52LjxuYW1lPmAgc2VjdGlvbiAodGhlbiB3cmFuZ2xlciBjb21tYW5kcyBuZWVkXG4gICAqIGAtLWVudiA8bmFtZT5gIC8gYENMT1VERkxBUkVfRU5WPTxuYW1lPmApLiBgcHJvZHVjdGlvbmAgbWF5IGJlIGVpdGhlciB0aGUgdG9wIGxldmVsIG9yIGFcbiAgICogbmFtZWQgYGVudi5wcm9kdWN0aW9uYCBzZWN0aW9uOyB0aGUgc2VjdGlvbiB3aW5zIHdoZW4gaXQgZXhpc3RzLlxuICAgKi9cbiAgdXNlc0VudlNlY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSYXdXcmFuZ2xlckNvbmZpZyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZDFfZGF0YWJhc2VzPzogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIGFzc2V0cz86IHVua25vd247XG4gIGxvZ2Z3ZHI/OiB1bmtub3duO1xuICB3YXNtX21vZHVsZXM/OiB1bmtub3duO1xuICB0ZXh0X2Jsb2JzPzogdW5rbm93bjtcbiAgZGF0YV9ibG9icz86IHVua25vd247XG4gIHNpdGU/OiB1bmtub3duO1xuICBzZWNyZXRzPzogeyByZXF1aXJlZD86IHN0cmluZ1tdIH07XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIFJhd1dyYW5nbGVyQ29uZmlnPjtcbn1cblxuLy8gV29ya2VycyBTaXRlcyBpbXBsaWNpdGx5IGJpbmRzIGl0cyBLViBuYW1lc3BhY2UgYXMgX19TVEFUSUNfQ09OVEVOVC5cbmZ1bmN0aW9uIHNpdGVCaW5kaW5nTmFtZXMoY29uZmlnOiBSYXdXcmFuZ2xlckNvbmZpZywgZW52Q29uZmlnPzogUmF3V3JhbmdsZXJDb25maWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoZW52Q29uZmlnPy5zaXRlID8/IGNvbmZpZy5zaXRlKSA/IFsnX19TVEFUSUNfQ09OVEVOVCddIDogW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JhbmdsZXIgY29uZmlnIHZhbHVlcyBuZWVkZWQgZm9yIGRlcGxveWluZyB0byB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gKiBGb2xsb3dzIHdyYW5nbGVyJ3MgaW5oZXJpdGFuY2UgcnVsZXM6IGBhY2NvdW50X2lkYCBpcyBpbmhlcml0ZWQgYnkgbmFtZWQgZW52aXJvbm1lbnRzLFxuICogd2hpbGUgYHZhcnNgIGFuZCBgZDFfZGF0YWJhc2VzYCBhcmUgbm90IGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcbiAgaWYgKHBhdGguZXh0bmFtZShjb25maWdQYXRoKSA9PT0gJy50b21sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGVwbG95IHN1cHBvcnRzIHdyYW5nbGVyLmpzb25jL3dyYW5nbGVyLmpzb24gY29uZmlncyBvbmx5OyBtaWdyYXRlIHdyYW5nbGVyLnRvbWwgZmlyc3QuJyk7XG4gIH1cblxuICAvLyBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHdvdWxkIHJldHVybiBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsXG4gIC8vIHdoaWNoIGNvdWxkIG1pZ3JhdGUgYSByZW1vdGUgZGF0YWJhc2UgZnJvbSBhIGhhbGYtcmVhZCBjb25maWc7IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IuXG4gIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgY29uc3QgY29uZmlnID0gcGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7XG4gICAgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlLFxuICB9KSBhcyBSYXdXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2NvbmZpZ1BhdGh9OiAke3BhcnNlRXJyb3JzLmxlbmd0aH0gSlNPTkMgc3ludGF4IGVycm9yKHMpLmApO1xuICB9XG4gIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgY29uc3QgZW52Q29uZmlnID0gY29uZmlnLmVudj8uW2Vudk5hbWVdO1xuICBpZiAoIWVudkNvbmZpZyAmJiBlbnZOYW1lICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB3cmFuZ2xlciBjb25maWcgaGFzIG5vIFwiZW52XCI6IHsgXCIke2Vudk5hbWV9XCI6IC4uLiB9IHNlY3Rpb24uYCk7XG4gIH1cbiAgcmV0dXJuIGVudkNvbmZpZ1xuICAgID8ge1xuICAgICAgICB3b3JrZXJOYW1lOiBlbnZDb25maWcubmFtZSA/PyAoY29uZmlnLm5hbWUgPyBgJHtjb25maWcubmFtZX0tJHtlbnZOYW1lfWAgOiB1bmRlZmluZWQpLFxuICAgICAgICBhY2NvdW50SWQ6IGVudkNvbmZpZy5hY2NvdW50X2lkID8/IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhlbnZDb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGVudkNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICAvLyBNb3N0IGJpbmRpbmdzIGFyZSBub24taW5oZXJpdGFibGUgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQsIHNvIG9ubHkgdGhlXG4gICAgICAgIC8vIGVudmlyb25tZW50J3Mgb3duIG5hbWVzIGNvdW50IOKAlCBwbHVzIHRoZSBnZW51aW5lbHkgaW5oZXJpdGVkIHNoYXBlcyAoYXNzZXRzLCBsb2dmd2RyKSxcbiAgICAgICAgLy8gd2hpY2ggd3JhbmdsZXIgcmVzb2x2ZXMgYXMgd2hvbGUgZmllbGRzOiB0aGUgZW52aXJvbm1lbnQncyBvd24gZmllbGQgb3ZlcnJpZGVzIHRoZVxuICAgICAgICAvLyB0b3AgbGV2ZWwgZW50aXJlbHksIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSdzIG5hbWVzIGNvdW50LlxuICAgICAgICBiaW5kaW5nTmFtZXM6IFtcbiAgICAgICAgICAuLi5jb2xsZWN0QmluZGluZ05hbWVzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhc3NldHM6IGVudkNvbmZpZy5hc3NldHMgPz8gY29uZmlnLmFzc2V0cyxcbiAgICAgICAgICAgICAgbG9nZndkcjogZW52Q29uZmlnLmxvZ2Z3ZHIgPz8gY29uZmlnLmxvZ2Z3ZHIsXG4gICAgICAgICAgICAgIHdhc21fbW9kdWxlczogZW52Q29uZmlnLndhc21fbW9kdWxlcyA/PyBjb25maWcud2FzbV9tb2R1bGVzLFxuICAgICAgICAgICAgICB0ZXh0X2Jsb2JzOiBlbnZDb25maWcudGV4dF9ibG9icyA/PyBjb25maWcudGV4dF9ibG9icyxcbiAgICAgICAgICAgICAgZGF0YV9ibG9iczogZW52Q29uZmlnLmRhdGFfYmxvYnMgPz8gY29uZmlnLmRhdGFfYmxvYnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhlbnZDb25maWcpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZywgZW52Q29uZmlnKSxcbiAgICAgICAgXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGVudkNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIC8vIGBzZWNyZXRzYCBpcyBub24taW5oZXJpdGFibGU6IGEgdG9wLWxldmVsIHJlcXVpcmVtZW50IG11c3Qgbm90IGZvcmNlIChvciB1cGxvYWQpXG4gICAgICAgIC8vIGEgc2VjcmV0IGludG8gYSBuYW1lZCBlbnZpcm9ubWVudC5cbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogZW52Q29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogdHJ1ZSxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgd29ya2VyTmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgIGFjY291bnRJZDogY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogY29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIGJpbmRpbmdOYW1lczogWy4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoY29uZmlnKSwgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcpXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IGZhbHNlLFxuICAgICAgfTtcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kLCB1c2VzRHJpenpsZUtpdEZvckQxIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQsIHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnLCBXcmFuZ2xlckQxRGF0YWJhc2UgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYsIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5cbi8qKlxuICogS2V5cyB0aGF0IGRyaXZlIHRoZSBkZXBsb3kgaXRzZWxmIChvciBhcmUgbWVhbmluZ2Z1bCBvbmx5IGxvY2FsbHkpIGFuZCB0aHVzIG11c3QgbmV2ZXIgYmVcbiAqIHB1c2hlZCB0byB0aGUgV29ya2VyIGFzIHNlY3JldHMuIGBXQl9FTlZgIC8gYE5FWFRfUFVCTElDX1dCX0VOVmAgYmVsb25nIGluIHdyYW5nbGVyIGB2YXJzYC5cbiAqL1xuY29uc3QgTk9OX1NFQ1JFVF9LRVlTID0gbmV3IFNldChbXG4gICdDSScsXG4gIC8vIFdyYW5nbGVyIHN5c3RlbS9hdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3dyYW5nbGVyL3N5c3RlbS1lbnZpcm9ubWVudC12YXJpYWJsZXMvKSxcbiAgLy8gaW5jbHVkaW5nIGxlZ2FjeSBhbGlhc2VzOyBhcHAtc3BlY2lmaWMgbmFtZXMgc3VjaCBhcyBDTE9VREZMQVJFX1IyX0FDQ0VTU19LRVlfSUQgc3RheSBlbGlnaWJsZS5cbiAgJ0NGX0FDQ09VTlRfSUQnLFxuICAnQ0ZfQVBJX0JBU0VfVVJMJyxcbiAgJ0NGX0FQSV9FTUFJTCcsXG4gICdDRl9BUElfS0VZJyxcbiAgJ0NGX0FQSV9UT0tFTicsXG4gICdDRl9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX1NFQ1JFVCcsXG4gICdDTE9VREZMQVJFX0FDQ09VTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BUElfQkFTRV9VUkwnLFxuICAnQ0xPVURGTEFSRV9BUElfS0VZJyxcbiAgJ0NMT1VERkxBUkVfQVBJX1RPS0VOJyxcbiAgJ0NMT1VERkxBUkVfQVVUSF9VU0VfS0VZUklORycsXG4gICdDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEJyxcbiAgJ0NMT1VERkxBUkVfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9FTlYnLFxuICAnQ0xPVURGTEFSRV9JTkNMVURFX1BST0NFU1NfRU5WJyxcbiAgJ0NMT1VERkxBUkVfTE9BRF9ERVZfVkFSU19GUk9NX0RPVF9FTlYnLFxuICAnRE9DS0VSX0hPU1QnLFxuICAnSFRUUF9QUk9YWScsXG4gICdIVFRQU19QUk9YWScsXG4gICdodHRwX3Byb3h5JyxcbiAgJ2h0dHBzX3Byb3h5JyxcbiAgJ0ZPUkNFX0NPTE9SJyxcbiAgJ01JTklGTEFSRV9DQUNIRV9ESVInLFxuICAnTUlTRV9FTlYnLFxuICAnTk9fQ09MT1InLFxuICAnTkVYVF9QVUJMSUNfV0JfRU5WJyxcbiAgJ05FWFRfUFVCTElDX1dCX1ZFUlNJT04nLFxuICAnTk9ERV9FTlYnLFxuICAnUE9SVCcsXG4gICdXQl9FTlYnLFxuICAnV0JfVkVSU0lPTicsXG5dKTtcblxuY29uc3QgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMgPSBbJ1dSQU5HTEVSXycsICdDTE9VREZMQVJFX0hZUEVSRFJJVkVfTE9DQUxfQ09OTkVDVElPTl9TVFJJTkdfJywgJ0NMT1VERkxBUkVfQ0ZfRkVUQ0hfJ107XG5cbmZ1bmN0aW9uIGlzTm9uU2VjcmV0S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fU0VDUkVUX0tFWVMuaGFzKGtleSkgfHwgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIERlcGxveUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIERlcGxveUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPERlcGxveUNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgRGVwbG95Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6XG4gICAgJ0RlcGxveSBhIENsb3VkZmxhcmUgV29ya2VycyBhcHAgKHZpbmV4dCBvciBwbGFpbiBXb3JrZXIpIHRvIHRoZSBXQl9FTlYgZW52aXJvbm1lbnQ6IHZhbGlkYXRlIHNlY3JldHMsIGJ1aWxkLCBhcHBseSByZW1vdGUgRDEgbWlncmF0aW9ucywgdGhlbiBkZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5LicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PERlcGxveUNvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBEZXBsb3lDb21tYW5kQXJndikge1xuICAgIC8vIEEgc3RyYXkgZXhwb3J0ZWQgQ0xPVURGTEFSRV9FTlYgd291bGQgYmFrZSB0aGUgd3JvbmcgZW52aXJvbm1lbnQgaW50byB0aGUgYnVpbGQgYW5kXG4gICAgLy8gYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeCB0d2ljZSBvbiBkZXBsb3k7IGl0IGlzIHJlLXNldCBleHBsaWNpdGx5IHdoZXJlIG5lZWRlZC5cbiAgICAvLyBBIGRvdGVudiBmaWxlIGRlZmluaW5nIGl0IHN0aWxsIHN1cmZhY2VzIHRocm91Z2ggcHJvamVjdC5lbnYsIHdoaWNoIHRoZSBleHBsaWNpdCBgLS1lbnZgXG4gICAgLy8gZmxhZ3MgYmVsb3cgb3ZlcnJpZGUuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNMT1VERkxBUkVfRU5WO1xuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBpZiAoIXdyYW5nbGVyQ29uZmlnUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ3diIGRlcGxveSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAobm8gd3JhbmdsZXIgY29uZmlnIGZvdW5kKS4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGVudk5hbWUgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgaWYgKCFlbnZOYW1lIHx8IGVudk5hbWUgPT09ICdkZXZlbG9wbWVudCcgfHwgZW52TmFtZSA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYFdCX0VOViBtdXN0IG5hbWUgYSBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gc3RhZ2luZyBvciBwcm9kdWN0aW9uKSwgYnV0IGlzICR7ZW52TmFtZX0uYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHZhbHVlcyBnbyBpbnRvIGJvdGggcHJvY2Vzcy5lbnYgKGluaGVyaXRlZCBieSBldmVyeXRoaW5nIHdiIHNwYXducykgYW5kIHByb2plY3QuZW52XG4gICAgLy8gKHRoZSBlbnZpcm9ubWVudCB3YiBpdHNlbGYgcmVhZHMgYW5kIHBhc3NlcyBleHBsaWNpdGx5KTsgdGhlIGxhdHRlciBpcyBhIGNhY2hlZCBzbmFwc2hvdFxuICAgIC8vIHRha2VuIGJlZm9yZSB0aGlzIHBvaW50LCBzbyB3cml0aW5nIG9ubHkgdG8gcHJvY2Vzcy5lbnYgd291bGQgbGVhdmUgd2IncyBvd24gcHJlZmxpZ2h0IOKAlFxuICAgIC8vIGFuZCBhbnkgY29tbWFuZCBzcGF3bmVkIHdpdGggcHJvamVjdC5lbnYg4oCUIHdpdGhvdXQgdGhlIHRva2VuLlxuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZWYXJzID0gcmVhZENsb3VkZmxhcmVFbnZGaWxlcyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNsb3VkZmxhcmVFbnZWYXJzKSkge1xuICAgICAgLy8gPz89IHNvIHRoYXQgYW4gZXhwbGljaXRseSBleHBvcnRlZCBlbXB0eSB2YWx1ZSBzdGlsbCB3aW5zIG92ZXIgdGhlIGZpbGUuXG4gICAgICBwcm9jZXNzLmVudltrZXldID8/PSB2YWx1ZTtcbiAgICAgIHByb2plY3QuZW52W2tleV0gPz89IHZhbHVlO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRDb25maWcgPSByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYocHJvamVjdCwgZW52TmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIXJlc29sdmVkQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHBhcnNlICR7d3JhbmdsZXJDb25maWdQYXRofS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGFjY291bnRJZCA9IHJlc29sdmVkQ29uZmlnLmFjY291bnRJZCA/PyBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQ7XG4gICAgLy8gUHJlZmVyIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHdoZW5ldmVyIHRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCdzIEQxIGJpbmRpbmdzIGhhdmUgYW5cbiAgICAvLyBleGlzdGluZyBtaWdyYXRpb25zIGRpcmVjdG9yeS4gQSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGRvZXMgbm90IGltcGx5IHRoZSBwcm9qZWN0XG4gICAgLy8gbWlncmF0ZXMgRDEgd2l0aCBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyOiB0aGUgZXhwbGljaXQgbWFya2VyIGlzIGEgZHJpenpsZSBjb25maWdcbiAgICAvLyB3aG9zZSBkaWFsZWN0L2RyaXZlciB0YXJnZXRzIHNxbGl0ZSAvIGQxLWh0dHAgLyBkdXJhYmxlLXNxbGl0ZSAoc2VlIHVzZXNEcml6emxlS2l0Rm9yRDE7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTQyKS4gQSBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgYW5vdGhlclxuICAgIC8vIGRhdGFiYXNlIChlLmcuIFBvc3RncmVTUUwgdmlhIEh5cGVyZHJpdmUpIGxlYXZlcyB0aGUgRDEgYmluZGluZ3MgdW5tYW5hZ2VkIGJ5IHdiIGRlcGxveS5cbiAgICBjb25zdCB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT5cbiAgICAgIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdCwgZGF0YWJhc2UpXG4gICAgKTtcbiAgICBjb25zdCBkcml6emxlS2l0TWFuYWdlc0QxID0gdXNlc0RyaXp6bGVLaXRGb3JEMShwcm9qZWN0KTtcbiAgICBpZiAoXG4gICAgICBkcml6emxlS2l0TWFuYWdlc0QxICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoIDwgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAvLyBNaWdyYXRpbmcgb25seSB0aGUgd3JhbmdsZXItbmF0aXZlIHN1YnNldCB3b3VsZCBzaWxlbnRseSBkZXBsb3kgY29kZSBhZ2FpbnN0IHRoZVxuICAgICAgLy8gb3RoZXIsIHVubWlncmF0ZWQgZGF0YWJhc2VzLlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgZG9lcyBub3Qgc3VwcG9ydCBtaXhpbmcgd3JhbmdsZXItbmF0aXZlIGFuZCBub24tbmF0aXZlIEQxIG1pZ3JhdGlvbiBsYXlvdXRzLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBkcml6emxlRDFEYXRhYmFzZSA9XG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBkcml6emxlS2l0TWFuYWdlc0QxID8gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIGRyaXp6bGVLaXRNYW5hZ2VzRDEgJiYgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgc3VwcG9ydHMgZHJpenpsZS1raXQgbWlncmF0aW9ucyBvbmx5IGZvciBhIHNpbmdsZSBEMSBiaW5kaW5nOyBmb3VuZCBtdWx0aXBsZS4nKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlZEQxRGF0YWJhc2VzID0gbmV3IFNldCh3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKTtcbiAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UpIG1hbmFnZWREMURhdGFiYXNlcy5hZGQoZHJpenpsZUQxRGF0YWJhc2UpO1xuICAgIGNvbnN0IHVubWFuYWdlZEQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT4gIW1hbmFnZWREMURhdGFiYXNlcy5oYXMoZGF0YWJhc2UpKTtcbiAgICBpZiAodW5tYW5hZ2VkRDFEYXRhYmFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU2F5IHNvIG91dCBsb3VkIGluc3RlYWQgb2Ygc2lsZW50bHkgZGVwbG95aW5nIGNvZGUgYWdhaW5zdCB1bm1pZ3JhdGVkIGRhdGFiYXNlczogdGhlXG4gICAgICAvLyBkcml6emxlIG1hcmtlciBkZXRlY3Rpb24gaXMgaGV1cmlzdGljICh0ZXh0IHNjYW4gb2YgZHJpenpsZS5jb25maWcuKiksIHNvIGEgcHJvamVjdCB0aGF0XG4gICAgICAvLyBnZW51aW5lbHkgbWlncmF0ZXMgRDEgbXVzdCBiZSBhYmxlIHRvIG5vdGljZSB3aGVuIG5vIG1lY2hhbmlzbSB3YXMgc2VsZWN0ZWQuIFRoaXMgYWxzb1xuICAgICAgLy8gY292ZXJzIHBhcnRpYWwgbGF5b3V0cyAoc29tZSBiaW5kaW5ncyB3cmFuZ2xlci1uYXRpdmUsIG90aGVycyB1bm1hbmFnZWQpLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYE5vIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20gZGV0ZWN0ZWQgZm9yICR7dW5tYW5hZ2VkRDFEYXRhYmFzZXNcbiAgICAgICAgICAgIC5tYXAoKGRhdGFiYXNlKSA9PiBkYXRhYmFzZS5iaW5kaW5nID8/IGRhdGFiYXNlLmRhdGFiYXNlX25hbWUgPz8gJ3VubmFtZWQgYmluZGluZycpXG4gICAgICAgICAgICAuam9pbignLCAnKX0gYCArXG4gICAgICAgICAgICAnKG5vIHdyYW5nbGVyIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGFuZCBubyBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgc3FsaXRlL2QxLWh0dHAvZHVyYWJsZS1zcWxpdGUpOyB3YiBkZXBsb3kgd2lsbCBub3QgcnVuIEQxIG1pZ3JhdGlvbnMgZm9yIHRoZW0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBEcnkgcnVucyBleGVjdXRlIG5vdGhpbmcgYXV0aGVudGljYXRlZCwgc28gdGhleSBza2lwIHRoZSBjcmVkZW50aWFsIHByZWZsaWdodCBlbnRpcmVseS5cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICAvLyBBIGRyaXp6bGUtc2VsZWN0ZWQgRDEgZGF0YWJhc2Ugcm91dGVzIGJvdGggdGhlIG1pZ3JhdGlvbiBpbiBzdGVwIDMgYW5kIGFueSBkZXBsb3kvcG9zdFxuICAgICAgLy8gaG9vayB0aHJvdWdoIGRyaXp6bGUta2l0J3MgZDEtaHR0cCBkcml2ZXIsIHdoaWNoIG5lZWRzIENMT1VERkxBUkVfQVBJX1RPS0VOIGV2ZW4gZm9yXG4gICAgICAvLyBsb2NhbCwgd3JhbmdsZXItT0F1dGggZGVwbG95cy4gRmFpbGluZyBoZXJlIGtlZXBzIHRoZSBmYWlsLWZhc3Qgb3JkZXJpbmc6IGEgbWlzc2luZyB0b2tlblxuICAgICAgLy8gbXVzdCBhYm9ydCBiZWZvcmUgdGhlIGRlcGxveSBnb2VzIGxpdmUsIG5vdCBkdXJpbmcgbWlncmF0aW9uIG9yIGRlcGxveS9wb3N0XG4gICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTU2KS4gV3JhbmdsZXItbmF0aXZlIHByb2plY3RzICh3aXRoIG9yXG4gICAgICAvLyB3aXRob3V0IGhvb2tzKSBtdXN0IG5vdCByZXF1aXJlIHRoZSB0b2tlbjogYSBsb2NhbCB3cmFuZ2xlciBPQXV0aCBsb2dpbiBzdWZmaWNlcyB0aGVyZSxcbiAgICAgIC8vIGV2ZW4gdGhvdWdoIHN0ZXAgNSBzdGlsbCBleHBvcnRzIENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgdG8gdGhlaXIgaG9va3MuXG4gICAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UgJiYgIXByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX1RPS0VOKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdDTE9VREZMQVJFX0FQSV9UT0tFTiBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uID1cbiAgICAgICAgISFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIXByb2plY3QuZW52LkNGX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9FTUFJTCkgfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0ZfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DRl9FTUFJTCk7XG4gICAgICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgIWhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dyYW5nbGVyIGF1dGhlbnRpY2F0aW9uIChlLmcuIENMT1VERkxBUkVfQVBJX1RPS0VOKSBpcyByZXF1aXJlZCB0byBkZXBsb3kgb24gQ0kuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwLXNwZWNpZmljIHZhbGlkYXRpb24gaG9vayAoZS5nLiBzZWNyZXQgcGFpcnMgdGhhdCBtdXN0IGJlIGJvdGgtc2V0LW9yLWJvdGgtZW1wdHkpLlxuICAgIC8vIFRoZSByZXVzYWJsZSBkZXBsb3kueW1sIGFscmVhZHkgcnVucyBpdCBvbiBDSTsgcnVuIGl0IGhlcmUgZm9yIGxvY2FsIGRlcGxveXMuXG4gICAgaWYgKCFpc0NJKHByb2plY3QuZW52LkNJKSAmJiBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGVwbG95L2NpLXNldHVwJ10pIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L2NpLXNldHVwJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgLy8gMS4gUmVzb2x2ZSBhbmQgdmFsaWRhdGUgYWxsIHNlY3JldHMgYmVmb3JlIGFueSBidWlsZCBvciByZW1vdGUgbXV0YXRpb24sIHNvIGEgbWlzc2luZ1xuICAgIC8vICAgIHNlY3JldCBhYm9ydHMgdGhlIGRlcGxveSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBtaWdyYXRlZCBkYXRhYmFzZSBiZWhpbmQgYW4gb2xkIFdvcmtlci5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gUmVzdHJpY3QgdGhlIHNlY3JldHMgZG9tYWluIHRvIGtleXMgdGhlIHByb2plY3QncyBmbm94IGNvbmZpZ3VyYXRpb24gZGVjbGFyZXM6IGBtaXNlIGVudmBcbiAgICAvLyBvdXRwdXQgKHJlcG9ydGVkIGFzIGEgcHNldWRvLXNvdXJjZSkgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyBzdWNoIGFzIENBUkdPX0hPTUUsXG4gICAgLy8gd2hpY2ggbXVzdCBuZXZlciBiZSB1cGxvYWRlZCBhcyBXb3JrZXIgc2VjcmV0cy5cbiAgICBjb25zdCBmbm94S2V5cyA9IG5ldyBTZXQoXG4gICAgICBlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgaWYgKCFmbm94S2V5cy5oYXMoa2V5KSkgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gICAgLy8gTmFtZXMgZGVjbGFyZWQgdmlhIHdyYW5nbGVyIGBzZWNyZXRzLnJlcXVpcmVkYCBtYXkgbGlrZXdpc2UgYmUgc3VwcGxpZWQgcHVyZWx5IGFzXG4gICAgLy8gZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuIENJIHdvcmtmbG93IGVudikgaW5zdGVhZCBvZiBmbm94IHZhbHVlcy5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzKSB7XG4gICAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGV4cG9ydGVkVmFsdWU7XG4gICAgfVxuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZG90ZW52IHZhbHVlcyAocHJvamVjdC5lbnYgYWxyZWFkeVxuICAgIC8vIGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBkZXBsb3lgIHdvdWxkIHB1c2ggdGhlIHN0YWxlIGZpbGUgdmFsdWUuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0cyA9IHNlbGVjdFdvcmtlclNlY3JldHMoZW52VmFycywgWy4uLnJlc29sdmVkQ29uZmlnLnZhcktleXMsIC4uLnJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc10pO1xuICAgIC8vIGAtLXZhciBXQl9WRVJTSU9OOi4uLmAgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIG9uIGRlcGxveSwgc28gYVxuICAgIC8vIHJlc291cmNlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIHdvdWxkIHNpbGVudGx5IGJlY29tZSBhIHN0cmluZyB2YXJpYWJsZS5cbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTiAmJiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoJ1dCX1ZFUlNJT04nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dCX1ZFUlNJT04gY29sbGlkZXMgd2l0aCBhIFdvcmtlciBiaW5kaW5nIG5hbWU7IHJlbmFtZSB0aGUgYmluZGluZy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGJpbmRpbmdDb2xsaXNpb25zID0gT2JqZWN0LmtleXMoZW52VmFycykuZmlsdGVyKChrZXkpID0+IHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhrZXkpKTtcbiAgICBpZiAoYmluZGluZ0NvbGxpc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVXBsb2FkaW5nIGEgc2VjcmV0IG5hbWVkIGxpa2UgYSBiaW5kaW5nIHdvdWxkIHJlcGxhY2UgdGhlIGJpbmRpbmcgd2l0aCBhIHBsYWluIHN0cmluZy5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyBlbnYga2V5cyB0aGF0IGNvbGxpZGUgd2l0aCBXb3JrZXIgYmluZGluZyBuYW1lczogJHtiaW5kaW5nQ29sbGlzaW9ucy5qb2luKCcsICcpfWApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgYHNlY3JldHMucmVxdWlyZWRgIG9ubHkgZHVyaW5nIHRoZSByZWFsIHVwbG9hZCDigJQgYWZ0ZXIgbWlncmF0aW9ucyDigJRcbiAgICAvLyBzbyB3YiBjaGVja3MgdXBmcm9udDogZWFjaCByZXF1aXJlZCBuYW1lIG11c3QgYmUgYSBrZXkgaW4gdGhlIG91dGdvaW5nIHBheWxvYWQgKHByZXNlbmNlLFxuICAgIC8vIG5vdCB0cnV0aGluZXNzIOKAlCBhbiBleHBsaWNpdCBlbXB0eSBjbGVhcnMgYSBzdGFsZSB2YWx1ZSkgb3IgYW4gZWZmZWN0aXZlIHZhci9iaW5kaW5nLlxuICAgIGNvbnN0IHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcyA9IHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMuZmlsdGVyKFxuICAgICAgKG5hbWUpID0+XG4gICAgICAgICFPYmplY3QuaGFzT3duKHNlY3JldHMsIG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy52YXJLZXlzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMobmFtZSlcbiAgICApO1xuICAgIGlmICh1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBTZWNyZXRzIHJlcXVpcmVkIGJ5IHRoZSB3cmFuZ2xlciBjb25maWcgYXJlIG5vdCBwcm92aWRlZDogJHt1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHNlY3JldEtleXMgPSBPYmplY3Qua2V5cyhzZWNyZXRzKS50b1NvcnRlZCgpO1xuICAgIC8vIENsb3VkZmxhcmUgbGltaXRzIGEgYnVsayB1cGxvYWQgdG8gMTAwIHNlY3JldHMsIGVhY2ggdmFyaWFibGUvc2VjcmV0IHZhbHVlIHRvIDUgS0IsIGFuZFxuICAgIC8vIHRoZSBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgY291bnQgdG8gMTI4ICg2NCBvbiB0aGUgRnJlZSBwbGFuLCB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWRcbiAgICAvLyBoZXJlIOKAlCBoZW5jZSBhIHdhcm5pbmcpLiBGYWlsaW5nIGJlZm9yZSBhbnkgYnVpbGQgb3IgbWlncmF0aW9uIGtlZXBzIGFuIG92ZXJzaXplZCBwYXlsb2FkXG4gICAgLy8gZnJvbSBhYm9ydGluZyB0aGUgZGVwbG95IGFmdGVyIHJlbW90ZSBtaWdyYXRpb25zIGFscmVhZHkgcmFuLlxuICAgIGlmIChzZWNyZXRLZXlzLmxlbmd0aCA+IDEwMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBDbG91ZGZsYXJlIGFjY2VwdHMgYXQgbW9zdCAxMDAgc2VjcmV0cyBwZXIgZGVwbG95LCBidXQgJHtzZWNyZXRLZXlzLmxlbmd0aH0gd2VyZSBzZWxlY3RlZC5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gVGhlIENMSS1wcm92aWRlZCBXQl9WRVJTSU9OIG92ZXJsYXlzIGEgY29uZmlndXJlZCB2YXIgb2YgdGhlIHNhbWUgbmFtZSBvbiBkZXBsb3ksXG4gICAgLy8gc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlIHBhcnRpY2lwYXRlcyBpbiB0aGUgbGltaXQgY2hlY2tzLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVZhcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzPHVua25vd24+KHJlc29sdmVkQ29uZmlnLnZhcnMpKTtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikgZWZmZWN0aXZlVmFycy5zZXQoJ1dCX1ZFUlNJT04nLCBwcm9qZWN0LmVudi5XQl9WRVJTSU9OKTtcbiAgICBjb25zdCB2YXJFbnRyaWVzID0gWy4uLmVmZmVjdGl2ZVZhcnNdO1xuICAgIGNvbnN0IG92ZXJzaXplZEtleXMgPSBbXG4gICAgICAuLi5zZWNyZXRLZXlzLmZpbHRlcigoa2V5KSA9PiBCdWZmZXIuYnl0ZUxlbmd0aChzZWNyZXRzW2tleV0gPz8gJycsICd1dGY4JykgPiA1ICogMTAyNCksXG4gICAgICAuLi52YXJFbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFssIHZhbHVlXSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAndXRmOCcpID4gNSAqIDEwMjRcbiAgICAgICAgKVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICBdO1xuICAgIGlmIChvdmVyc2l6ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBWYXJpYWJsZSBvciBzZWNyZXQgdmFsdWVzIGV4Y2VlZCBDbG91ZGZsYXJlJ3MgNSBLQiBsaW1pdDogJHtvdmVyc2l6ZWRLZXlzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlOiByZW1vdGUgc2VjcmV0cyBhYnNlbnQgZnJvbSB0aGUgcGF5bG9hZCBzdGF5IGF0dGFjaGVkIHRvIHRoZVxuICAgIC8vIG5ldyB2ZXJzaW9uLCBzbyB0aGV5IGNvdW50IGFnYWluc3QgdGhlIGNvbWJpbmVkIGxpbWl0IHRvby4gTGlzdGluZyB0aGVtIG5lZWRzIGFuXG4gICAgLy8gYXV0aGVudGljYXRlZCByZW1vdGUgcm91bmQtdHJpcCwgd2hpY2ggZHJ5IHJ1bnMgc2tpcDsgd2hlbiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55XG4gICAgLy8gcmVhc29uIG90aGVyIHRoYW4gYSBub3QteWV0LWNyZWF0ZWQgV29ya2VyLCBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGNvdW50IGluc3RlYWQgb2ZcbiAgICAvLyBibG9ja2luZyBhIGRlcGxveSB0aGF0IHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuXG4gICAgY29uc3QgcmVtb3RlU2VjcmV0TmFtZXMgPSBhcmd2LmRyeVJ1blxuICAgICAgPyBbXVxuICAgICAgOiBhd2FpdCBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMocHJvamVjdCwgYXJndiwgd3JhbmdsZXJDb25maWdQYXRoLCByZXNvbHZlZENvbmZpZywgZW52TmFtZSk7XG4gICAgY29uc3QgaW5oZXJpdGVkU2VjcmV0TmFtZXMgPSBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgICAgIHJlbW90ZVNlY3JldE5hbWVzID8/IFtdLFxuICAgICAgc2VjcmV0cyxcbiAgICAgIHZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICAgIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc1xuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRDb3VudCA9XG4gICAgICBuZXcgU2V0KFsuLi5zZWNyZXRLZXlzLCAuLi52YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSldKS5zaXplICsgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IGluaGVyaXRlZE5vdGUgPVxuICAgICAgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKGluY2x1ZGluZyAke2luaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aH0gcmVtb3RlIHNlY3JldHMga2VwdCBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uOiAke2luaGVyaXRlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9KWBcbiAgICAgICAgOiAnJztcbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDEyOCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBDbG91ZGZsYXJlIGFsbG93cyBhdCBtb3N0IDEyOCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgY29tYmluZWQsIGJ1dCAke2NvbWJpbmVkQ291bnR9IHdlcmUgc2VsZWN0ZWQke2luaGVyaXRlZE5vdGV9LmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiA2NCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYCR7Y29tYmluZWRDb3VudH0gdmFyaWFibGVzIGFuZCBzZWNyZXRzJHtpbmhlcml0ZWROb3RlfSBleGNlZWQgdGhlIEZyZWUgcGxhbidzIGxpbWl0IG9mIDY0LmApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5jeWFuKFxuICAgICAgICBgRGVwbG95aW5nICR7cmVzb2x2ZWRDb25maWcud29ya2VyTmFtZSA/PyBwcm9qZWN0Lm5hbWV9ICgke2Vudk5hbWV9KSB3aXRoICR7c2VjcmV0S2V5cy5sZW5ndGh9IHNlY3JldHM6ICR7c2VjcmV0S2V5cy5qb2luKCcsICcpfWBcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gMi4gQnVpbGQgKHZpbmV4dCBlbWJlZHMgdGhlIGVudmlyb25tZW50LWFwcGxpZWQgd3JhbmdsZXIgY29uZmlnIGludG8gZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbikuXG4gICAgLy8gICAgQnVpbGRpbmcgYmVmb3JlIG1pZ3JhdGluZyBrZWVwcyBhIGJ1aWxkIGZhaWx1cmUgZnJvbSBsZWF2aW5nIGEgbWlncmF0ZWQgc2NoZW1hIGJlaGluZFxuICAgIC8vICAgIHRoZSBvbGQgV29ya2VyLiBQbGFpbiBXb3JrZXJzIGhhdmUgbm8gYnVpbGQgc3RlcDsgd3JhbmdsZXIgYnVuZGxlcyB0aGUgZW50cnkgaXRzZWxmLlxuICAgIGNvbnN0IGlzVmluZXh0ID0gISEocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpbmV4dCA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udmluZXh0KTtcbiAgICBjb25zdCBkZXBsb3lDb25maWdQYXRoID0gaXNWaW5leHQgPyBwYXRoLmpvaW4oJ2Rpc3QnLCAnc2VydmVyJywgJ3dyYW5nbGVyLmpzb24nKSA6IHdyYW5nbGVyQ29uZmlnUGF0aDtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52QXNzaWdubWVudCA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uXG4gICAgICA/IGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ0NMT1VERkxBUkVfRU5WJywgZW52TmFtZSl9IGBcbiAgICAgIDogJyc7XG4gICAgaWYgKGlzVmluZXh0KSB7XG4gICAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikge1xuICAgICAgICBwcm9qZWN0LmVudi5ORVhUX1BVQkxJQ19XQl9WRVJTSU9OIHx8PSBwcm9qZWN0LmVudi5XQl9WRVJTSU9OO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZ2VuLWNvZGUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtjbG91ZGZsYXJlRW52QXNzaWdubWVudH1ZQVJOIHZpbmV4dCBidWlsZGAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgLy8gT24gZHJ5IHJ1bnMgdGhlIHZpbmV4dCBidWlsZCBhYm92ZSBpcyBhIHByaW50ZWQgbm8tb3AsIHNvIHRoZSBidWlsdCBjb25maWcgaXNcbiAgICAgIC8vIGxlZ2l0aW1hdGVseSBhYnNlbnQgYW5kIG11c3Qgbm90IGFib3J0IHRoZSBydW4uXG4gICAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRlcGxveUNvbmZpZ1BhdGgpKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgJHtkZXBsb3lDb25maWdQYXRofSBub3QgZm91bmQ7IHRoZSB2aW5leHQgYnVpbGQgZGlkIG5vdCBwcm9kdWNlIGEgZGVwbG95IGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBpdHMgY29uZmlnIHNjaGVtYSBvbmx5IHdoZW4gaXQgcnVucywgc28gYSBkcnkgcnVuIG9mIHRoZSBidWlsdFxuICAgICAgLy8gY29uZmlnIHN1cmZhY2VzIGNvbmZpZyBhbmQgYnVuZGxlIGVycm9ycyBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zIGJlbG93IG11dGF0ZVxuICAgICAgLy8gdGhlIGRhdGFiYXNlLCBtaXJyb3JpbmcgdGhlIHBsYWluLVdvcmtlciBkcnkgcnVuLiBObyAtLWVudjogdGhlIGJ1aWx0IGNvbmZpZyBhbHJlYWR5XG4gICAgICAvLyBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRlcGxveUNvbmZpZ1BhdGgpfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBsYWluIFdvcmtlcnMgYXJlIGZpcnN0IGNvbXBpbGVkIGJ5IHdyYW5nbGVyIGR1cmluZyB0aGUgZGVwbG95IGl0c2VsZjsgYSBkcnkgcnVuXG4gICAgICAvLyBzdXJmYWNlcyBjb21waWxlIGVycm9ycyAoZS5nLiBhIG1pc3NpbmcgZW50cnkgcG9pbnQpIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnNcbiAgICAgIC8vIGJlbG93IG11dGF0ZSB0aGUgZGF0YWJhc2UuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJ31gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEFwcGx5IEQxIG1pZ3JhdGlvbnMgdG8gdGhlIHJlbW90ZSBkYXRhYmFzZSB3aXRoIHRoZSBwcm9qZWN0J3Mgc2luZ2xlIG1pZ3JhdGlvblxuICAgIC8vICAgIG1lY2hhbmlzbSAod3JhbmdsZXItbmF0aXZlIHdoZW4gYSBtaWdyYXRpb25zIGRpcmVjdG9yeSBleGlzdHMsIGVsc2UgZHJpenpsZS1raXQgd2hlblxuICAgIC8vICAgIHRoZSBkcml6emxlIGNvbmZpZyB0YXJnZXRzIHNxbGl0ZS9kMS1odHRwL2R1cmFibGUtc3FsaXRlKS4gTWlncmF0aW9ucyBtdXN0IGJlIGJhY2t3YXJkXG4gICAgLy8gICAgY29tcGF0aWJsZTogdGhlIG9sZCBXb3JrZXIgc2VydmVzXG4gICAgLy8gICAgdHJhZmZpYyB1bnRpbCB0aGUgZGVwbG95IGJlbG93LlxuICAgIGNvbnN0IGVudk9wdGlvbiA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnO1xuICAgIGZvciAoY29uc3QgZGF0YWJhc2Ugb2Ygd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcykge1xuICAgICAgY29uc3QgZGF0YWJhc2VOYW1lID0gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyBkYXRhYmFzZS5iaW5kaW5nO1xuICAgICAgaWYgKCFkYXRhYmFzZU5hbWUpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRhdGFiYXNlTmFtZSl9IC0tcmVtb3RlIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7ZW52T3B0aW9ufWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkge1xuICAgICAgaWYgKCFkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVGhlICR7ZW52TmFtZX0gRDEgYmluZGluZyBoYXMgbm8gZGF0YWJhc2VfaWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGlmICghYWNjb3VudElkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCAob3IgYWNjb3VudF9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnKSBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBidWlsZERyaXp6bGVLaXRDb21tYW5kKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgJ21pZ3JhdGUnLFxuICAgICAgICAgIGBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEPSR7ZHJpenpsZUQxRGF0YWJhc2UuZGF0YWJhc2VfaWR9IENMT1VERkxBUkVfQUNDT1VOVF9JRD0ke2FjY291bnRJZH1gXG4gICAgICAgICksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNC4gRGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseSAobm8gcG9zdC1kZXBsb3kgc2VjcmV0IHB1c2ggdGhhdCBjb3VsZCBsZWF2ZSB0aGVcbiAgICAvLyAgICBuZXcgdmVyc2lvbiBydW5uaW5nIHdpdGhvdXQg4oCUIG9yIHdpdGggc3RhbGUg4oCUIHNlY3JldHMpLiBUaGUgc2VjcmV0cyBKU09OIGdvZXMgdGhyb3VnaFxuICAgIC8vICAgIGEgbW9kZS0wNjAwIGZpbGUgaW4gYSBwcml2YXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZGVsZXRlZCByaWdodCBhZnRlciB0aGUgZGVwbG95OlxuICAgIC8vICAgIC9kZXYvc3RkaW4gaXMgTk9UIHJlbGlhYmxlIGhlcmUgYmVjYXVzZSB3cmFuZ2xlciByZWFkcyB0aGUgc2VjcmV0cyBmaWxlIG9ubHkgYWZ0ZXJcbiAgICAvLyAgICB1cGxvYWRpbmcgYXNzZXRzLCBieSB3aGljaCBwb2ludCB0aGUgcGlwZWQgc3RkaW4gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNvbnN1bWVkIOKAlFxuICAgIC8vICAgIG9ic2VydmVkIGFzIGEgZmxha3kgYENvdWxkIG5vdCByZWFkIGZpbGU6IC9kZXYvc3RkaW5gIG9uIENJLiBFeHBsaWNpdGx5IGVtcHR5IHZhbHVlc1xuICAgIC8vICAgIHN0YXkgaW4gdGhlIHBheWxvYWQ6IC0tc2VjcmV0cy1maWxlIGlzIGFkZGl0aXZlLCBzbyBwdXNoaW5nICcnIGlzIHRoZSBvbmx5IHdheSB0b1xuICAgIC8vICAgIGNsZWFyIGEgc3RhbGUgc2VjcmV0LlxuICAgIGNvbnN0IGRlcGxveUFyZ3MgPSBbXG4gICAgICAnZGVwbG95JyxcbiAgICAgICctLWNvbmZpZycsXG4gICAgICBkZXBsb3lDb25maWdQYXRoLFxuICAgICAgLy8gdmluZXh0J3MgYnVpbHQgY29uZmlnIGFscmVhZHkgaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkOyBwYXNzaW5nIC0tZW52IHRoZXJlIHdvdWxkXG4gICAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlLlxuICAgICAgLi4uKCFpc1ZpbmV4dCAmJiByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0LmVudi5XQl9WRVJTSU9OID8gWyctLXZhcicsIGBXQl9WRVJTSU9OOiR7cHJvamVjdC5lbnYuV0JfVkVSU0lPTn1gXSA6IFtdKSxcbiAgICAgICctLXNlY3JldHMtZmlsZScsXG4gICAgXTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtkZXBsb3lBcmdzLmpvaW4oJyAnKX0gPHRlbXBvcmFyeSBzZWNyZXRzIGZpbGU+YCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gICAgICBjb25zdCBkZXBsb3lFbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gICAgICBkZWxldGUgZGVwbG95RW52LkNMT1VERkxBUkVfRU5WO1xuICAgICAgLy8gMG83MDAgZGlyZWN0b3J5ICsgMG82MDAgZmlsZTogcmVhZGFibGUgb25seSBieSB0aGUgZGVwbG95aW5nIHVzZXIsIGxpa2UgdGhlIGRvdGVudlxuICAgICAgLy8gZmlsZXMgdGhlIENJIHdvcmtmbG93IGFscmVhZHkgd3JpdGVzIG5leHQgdG8gaXQuIHdyYW5nbGVyIHJ1bnMgdGhyb3VnaCBhbiBhc3luYyBzcGF3blxuICAgICAgLy8gKHNwYXduU3luYyB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gYSBzaHV0ZG93biBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2Vzc1xuICAgICAgLy8gYmVmb3JlIGFueSBjbGVhbnVwKSBhbmQgdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIGluIGEgZmluYWxseSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgICAgIC8vIGRlcGxveSBjYW5ub3QgbGVhdmUgdGhlIHBsYWludGV4dCBzZWNyZXRzIGJlaGluZC4gU2h1dGRvd24gaGFuZGxpbmcgZGV0YWlsczpcbiAgICAgIC8vIC0gSGFuZGxlcnMgKGluY2x1ZGluZyBTSUdIVVAsIG9uIHdoaWNoIE5vZGUgYWxzbyB0ZXJtaW5hdGVzIGJ5IGRlZmF1bHQpIGFyZSBpbnN0YWxsZWRcbiAgICAgIC8vICAgQkVGT1JFIHRoZSBmaWxlIGlzIHdyaXR0ZW4gYW5kIHVzZSBwcm9jZXNzLm9uLCBub3Qgb25jZSwgc28gYSByZXBlYXRlZCBzaWduYWwgY2Fubm90XG4gICAgICAvLyAgIGZhbGwgYmFjayB0byBkZWZhdWx0IHRlcm1pbmF0aW9uIGFuZCBieXBhc3MgdGhlIGZpbmFsbHkgY2xlYW51cC5cbiAgICAgIC8vIC0gU0lHSFVQL1NJR1FVSVQgYXJlIGZvcndhcmRlZCB0byB3cmFuZ2xlciBhcyBTSUdURVJNOiB3cmFuZ2xlcidzIGxhdW5jaGVyIHJlbGF5cyBvbmx5XG4gICAgICAvLyAgIFNJR0lOVC9TSUdURVJNIHRvIGl0cyBpbm5lciBOb2RlIHByb2Nlc3MsIGFuZCBhbnl0aGluZyBlbHNlIHdvdWxkIG9ycGhhbiBhIGRlcGxveW1lbnRcbiAgICAgIC8vICAgdGhhdCBrZWVwcyBtdXRhdGluZyB0aGUgcmVtb3RlIFdvcmtlciBhZnRlciB3YiBleGl0cy5cbiAgICAgIC8vIC0gVGhlIHJlLXJhaXNlIGJlbG93IHVzZXMgdGhlIHNpZ25hbCB3YiBpdHNlbGYgcmVjZWl2ZWQ6IHdyYW5nbGVyIGNhdGNoZXMgU0lHSU5UIGFuZFxuICAgICAgLy8gICBleGl0cyBudW1lcmljYWxseSAoZS5nLiAxNDMpLCB3aGljaCBtdXN0IG5vdCBtYXNxdWVyYWRlIGFzIGFuIG9yZGluYXJ5IGZhaWx1cmUuXG4gICAgICBjb25zdCBzZWNyZXRzRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLWRlcGxveS0nKSk7XG4gICAgICBjb25zdCBzaHV0ZG93blNpZ25hbHMgPSBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBsZXQgd3JhbmdsZXJQcm9jZXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWNlaXZlZFNodXRkb3duU2lnbmFsID8/PSBzaWduYWw7XG4gICAgICAgICAgaWYgKHdyYW5nbGVyUHJvY2Vzcykge1xuICAgICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLmtpbGwoc2lnbmFsID09PSAnU0lHSU5UJyB8fCBzaWduYWwgPT09ICdTSUdURVJNJyA/IHNpZ25hbCA6ICdTSUdURVJNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIFdpdGggdGhlIGhhbmRsZXJzIHJlbW92ZWQsIHJlLXJhaXNpbmcgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbGV0IGRlcGxveVN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VjcmV0c0ZpbGVQYXRoID0gcGF0aC5qb2luKHNlY3JldHNEaXJQYXRoLCAnc2VjcmV0cy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2VjcmV0c0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZWNyZXRzKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICAgICAgZGVwbG95U3RhdHVzID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2VzcyA9IHNwYXduKCd3cmFuZ2xlcicsIFsuLi5kZXBsb3lBcmdzLCBzZWNyZXRzRmlsZVBhdGhdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGVudjogZGVwbG95RW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHNpZ25hbCA/IDEgOiAoY29kZSA/PyB1bmRlZmluZWQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBwcm9jZXNzLmV4aXQgc2tpcHMgZmluYWxseSBibG9ja3MsIHNvIHRoZSBleGl0LW9uLWZhaWx1cmUgYmVsb3cgc3RheXMgb3V0c2lkZS5cbiAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2VpdmVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIGNhbGxlciBvYnNlcnZlcyB0aGUgc2FtZSBzaWduYWwtZGVyaXZlZCBleGl0IHN0YXR1cy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNodXRkb3duU2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRlcGxveVN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgd3JhbmdsZXIgZGVwbG95IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2RlcGxveVN0YXR1cyA/PyAndW5rbm93bid9LmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGRlcGxveVN0YXR1cyA/PyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LiBPcHRpb25hbCBwb3N0LWRlcGxveSBob29rIChlLmcuIHNlZWRpbmcgdGhlIHJlbW90ZSBEMSB2aWEgZHJpenpsZSdzIGQxLWh0dHAgZHJpdmVyKS5cbiAgICAvLyAgICBBc3NpZ24gdGhlIHJlc29sdmVkIGlkcyB1bmNvbmRpdGlvbmFsbHk6IGEgc3RhbGUgZXhwb3J0ZWQgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRFxuICAgIC8vICAgIG11c3Qgbm90IHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvcG9zdCddKSB7XG4gICAgICAvLyBUaGUgaWQgaXMgdW5hbWJpZ3VvdXMgb25seSB3aXRoIGEgc2luZ2xlIEQxIGJpbmRpbmc7IHdpdGggbXVsdGlwbGUsIHRoZSBob29rIG11c3RcbiAgICAgIC8vIHJlc29sdmUgaXRzIHRhcmdldCBpdHNlbGYuIENsZWFyIGZpcnN0IGVpdGhlciB3YXk6IGEgc3RhbGUgaW5oZXJpdGVkIGlkIG11c3Qgbm90XG4gICAgICAvLyByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgICAgY29uc3QgaG9va0QxRGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ7XG4gICAgICBpZiAocmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdNdWx0aXBsZSBEMSBiaW5kaW5ncyBleGlzdDsgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCBpcyBub3Qgc2V0IGZvciBkZXBsb3kvcG9zdC4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoaG9va0QxRGF0YWJhc2U/LmRhdGFiYXNlX2lkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEID0gaG9va0QxRGF0YWJhc2UuZGF0YWJhc2VfaWQ7XG4gICAgICBpZiAoYWNjb3VudElkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQgPSBhY2NvdW50SWQ7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9wb3N0JywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIHRoZSBDbG91ZGZsYXJlIEFQSSB0b2tlbiB0aGF0IENJIGRyb3BzIGluIGEgYC5lbnYuY2xvdWRmbGFyZWAgZmlsZSAoZS5nLiB0aGUgcmV1c2FibGVcbiAqIGRlcGxveSB3b3JrZmxvdydzIGBmaWxlX3BhdGhfMWApLCBsb29raW5nIGJlc2lkZSB0aGUgV29ya2VyJ3Mgd3JhbmdsZXIgY29uZmlnIGFuZCBhdCB0aGVcbiAqIG1vbm9yZXBvIHJvb3Qg4oCUIGBmaWxlX3BhdGhfMWAgaXMgcmVwby1yZWxhdGl2ZSwgc28gYm90aCBzcGVsbGluZ3Mgb2NjdXIgaW4gcHJhY3RpY2UuXG4gKiBOZWFyZXIgZmlsZXMgd2luOiBhIHdvcmtzcGFjZSBtYXkgb3ZlcnJpZGUgdGhlIHJvb3QgdG9rZW4sIG5ldmVyIHRoZSByZXZlcnNlLlxuICogYENMT1VERkxBUkVfRU5WYCBpcyBkcm9wcGVkOyBpdCB3b3VsZCBkb3VibGUtYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDbG91ZGZsYXJlRW52RmlsZXMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBjdXJyZW50RGlyUGF0aCBvZiBuZXcgU2V0KHJvb3REaXJQYXRoID8gW2RpclBhdGgsIHJvb3REaXJQYXRoXSA6IFtkaXJQYXRoXSkpIHtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJy5lbnYuY2xvdWRmbGFyZScpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjbG91ZGZsYXJlRW52UGF0aCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IGNsb3VkZmxhcmVFbnZQYXRoLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdDTE9VREZMQVJFX0VOVicpIGNvbnRpbnVlO1xuICAgICAgZW52VmFyc1trZXldID8/PSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogU2VsZWN0IHRoZSBzZWNyZXRzIHRvIHB1c2ggdG8gdGhlIFdvcmtlciBmcm9tIHRoZSBkb3RlbnYtbG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIGV2ZXJ5IGV4cGxpY2l0bHkgc2V0IHZhbHVlIOKAlCBpbmNsdWRpbmcgZW1wdHkgc3RyaW5ncywgd2hpY2ggY2xlYXIgc3RhbGUgcmVtb3RlIHNlY3JldHNcbiAqIHNpbmNlIGB3cmFuZ2xlciBkZXBsb3kgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlIOKAlCBleGNlcHQgd3JhbmdsZXIgYHZhcnNgIChhIHNlY3JldCBtYXlcbiAqIG5vdCBzaGFyZSBhIG5hbWUgd2l0aCBhIHZhciksIGRlcGxveS1jb250cm9sIGtleXMsIGFuZCBsb2NhbCBgZmlsZTpgIERBVEFCQVNFX1VSTHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RXb3JrZXJTZWNyZXRzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGNvbmZpZ1ZhcktleXM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNvbmZpZ0tleXMgPSBuZXcgU2V0KGNvbmZpZ1ZhcktleXMpO1xuICBjb25zdCBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8vIE5vIHJ1bnRpbWUgdW5kZWZpbmVkIGNoZWNrIG9uIGB2YWx1ZWA6IGVudlZhcnMgaXMgYnVpbHQgZXhjbHVzaXZlbHkgZnJvbSBkb3RlbnYtcGFyc2VkXG4gIC8vIHN0cmluZ3MsIGFuZCBldmVyeSBjYWxsZXItc2lkZSBtZXJnZSBlaXRoZXIgY29hbGVzY2VzIHdpdGggYD8/ICcnYCBvciBndWFyZHMgYWdhaW5zdFxuICAvLyB1bmRlZmluZWQgYmVmb3JlIGFzc2lnbmluZywgc28gdGhlIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gdHlwZSBob2xkcyBhdCBydW50aW1lIHRvby5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoY29uZmlnS2V5cy5oYXMoa2V5KSB8fCBpc05vblNlY3JldEtleShrZXkpKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnREFUQUJBU0VfVVJMJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdmaWxlOicpKSBjb250aW51ZTtcbiAgICBzZWNyZXRzW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gc2VjcmV0cztcbn1cblxuLyoqXG4gKiBMaXN0IHRoZSBzZWNyZXQgbmFtZXMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSBkZXBsb3kgdGFyZ2V0IFdvcmtlci4gUmV0dXJucyB1bmRlZmluZWQgd2hlblxuICogdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiB0aGUgV29ya2VyIG5vdCBleGlzdGluZyB5ZXQgKGZpcnN0IGRlcGxveSksIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGxpbWl0IGNoZWNrcyBpbnN0ZWFkIG9mIGJsb2NraW5nIGEgZGVwbG95IHRoYXRcbiAqIHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuIEZhaWxpbmcgY2xvc2VkIGluc3RlYWQgd291bGQgdHVybiBldmVyeSB0cmFuc2llbnQgbGlzdGluZ1xuICogZmFpbHVyZSAobmV0d29yaywgYSB0b2tlbiB3aXRob3V0IHNlY3JldC1yZWFkIHBlcm1pc3Npb24pIGludG8gYSBkZXBsb3kgYmxvY2tlciwgYW5kIOKAlCBzaW5jZVxuICogd3JhbmdsZXIgNC54IHJlcG9ydHMgYSBtaXNzaW5nIFdvcmtlciBvbmx5IHZpYSBhbiBlcnJvci1tZXNzYWdlIGhpbnQg4oCUIGFueSB1bnJlY29nbml6ZWRcbiAqIG5vdC1mb3VuZCBzaGFwZSB3b3VsZCB0aGVuIGJsb2NrIGZpcnN0IGRlcGxveXMgZW50aXJlbHk7IHRoaXMgcHJlZmxpZ2h0IG11c3Qgb25seSBldmVyIGFkZFxuICogZmFpbHVyZXMgdGhhdCB3cmFuZ2xlciBpdHNlbGYgd291bGQgcmFpc2UgYWZ0ZXIgdGhlIG1pZ3JhdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogRGVwbG95Q29tbWFuZEFyZ3YsXG4gIHdyYW5nbGVyQ29uZmlnUGF0aDogc3RyaW5nLFxuICByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyxcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gIGNvbnN0IGxpc3RBcmdzID0gW1xuICAgICdzZWNyZXQnLFxuICAgICdsaXN0JyxcbiAgICAnLS1mb3JtYXQnLFxuICAgICdqc29uJyxcbiAgICAnLS1jb25maWcnLFxuICAgIHdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgICAuLi4ocmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBbJy0tZW52JywgZW52TmFtZV0gOiBbXSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2xpc3RBcmdzLmpvaW4oJyAnKX1gKSk7XG4gIGxldCByZXQ7XG4gIHRyeSB7XG4gICAgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYygnd3JhbmdsZXInLCBsaXN0QXJncywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBgRmFpbGVkIHRvIHJ1biB3cmFuZ2xlciB0byBsaXN0IHJlbW90ZSBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChyZXQuc3RhdHVzID09PSAwKSB7XG4gICAgLy8gQ3V0IHRoZSBKU09OIGFycmF5IG91dCBvZiB0aGUgc3Vycm91bmRpbmcgb3V0cHV0OiB3cmFuZ2xlciBtYXkgcHJpbnQgaXRzIGJhbm5lciBhbmRcbiAgICAvLyBcIk11bHRpcGxlIGVudmlyb25tZW50c1wiIHdhcm5pbmdzIGFyb3VuZCB0aGUgcGF5bG9hZC5cbiAgICBjb25zdCBqc29uU3RhcnQgPSByZXQuc3Rkb3V0LmluZGV4T2YoJ1snKTtcbiAgICBjb25zdCBqc29uRW5kID0gcmV0LnN0ZG91dC5sYXN0SW5kZXhPZignXScpO1xuICAgIGlmIChqc29uU3RhcnQgIT09IC0xICYmIGpzb25FbmQgIT09IC0xICYmIGpzb25TdGFydCA8IGpzb25FbmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmV0LnN0ZG91dC5zbGljZShqc29uU3RhcnQsIGpzb25FbmQgKyAxKSkgYXMgeyBuYW1lPzogdW5rbm93biB9W107XG4gICAgICAgIHJldHVybiBwYXJzZWQubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkuZmlsdGVyKChuYW1lKTogbmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHdhcm5pbmcgYmVsb3cuXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKC9cXFtjb2RlOiAxMDAoMDd8OTApXFxdfElmIHRoaXMgaXMgYSBuZXcgV29ya2VyLy50ZXN0KHJldC5zdGRvdXQgKyByZXQuc3RkZXJyKSkge1xuICAgIC8vIFRoZSBXb3JrZXIgZG9lcyBub3QgZXhpc3QgeWV0LCBzbyBhIGZpcnN0IGRlcGxveSBpbmhlcml0cyBub3RoaW5nLiBXcmFuZ2xlciA0LnggY2F0Y2hlc1xuICAgIC8vIHRoZSBDbG91ZGZsYXJlIEFQSSBlcnJvcnMgMTAwMDcgKHdvcmtlcnMuYXBpLmVycm9yLnNlcnZpY2Vfbm90X2ZvdW5kKSBhbmQgMTAwOTBcbiAgICAvLyAod29ya2Vycy5hcGkuZXJyb3Iuc2NyaXB0X25vdF9mb3VuZCkgYW5kIHJldGhyb3dzIHRoZW0gYXMgYSBVc2VyRXJyb3IgY29udGFpbmluZyB0aGVcbiAgICAvLyAnSWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIsIHJ1biBgd3JhbmdsZXIgZGVwbG95YCBmaXJzdCcgaGludCB3aXRob3V0IHRoZSBudW1lcmljIGNvZGUsXG4gICAgLy8gc28gbWF0Y2ggYm90aCBzaGFwZXMuXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBjaGFsay55ZWxsb3coXG4gICAgICBgRmFpbGVkIHRvIGxpc3QgdGhlIHJlbW90ZSBXb3JrZXIgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHsocmV0LnN0ZGVyciB8fCByZXQuc3Rkb3V0KS50cmltKCl9YFxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdGUgc2VjcmV0cyB0aGF0IHN0YXkgYXR0YWNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uOiBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpc1xuICogYWRkaXRpdmUsIHNvIGV2ZXJ5IHJlbW90ZSBzZWNyZXQgdGhlIG91dGdvaW5nIHBheWxvYWQgZG9lcyBub3Qgb3ZlcndyaXRlIGtlZXBzIGNvdW50aW5nXG4gKiBhZ2FpbnN0IENsb3VkZmxhcmUncyBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgbGltaXQg4oCUIGV4Y2VwdCBuYW1lcyB0aGF0IGFuIGVmZmVjdGl2ZSB2YXIgb3JcbiAqIGJpbmRpbmcgcmVwbGFjZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgcmVtb3RlU2VjcmV0TmFtZXM6IHN0cmluZ1tdLFxuICBvdXRnb2luZ1NlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGVmZmVjdGl2ZVZhcktleXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBiaW5kaW5nTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlcGxhY2VkTmFtZXMgPSBuZXcgU2V0KFsuLi5lZmZlY3RpdmVWYXJLZXlzLCAuLi5iaW5kaW5nTmFtZXNdKTtcbiAgcmV0dXJuIHJlbW90ZVNlY3JldE5hbWVzLmZpbHRlcigobmFtZSkgPT4gIU9iamVjdC5oYXNPd24ob3V0Z29pbmdTZWNyZXRzLCBuYW1lKSAmJiAhcmVwbGFjZWROYW1lcy5oYXMobmFtZSkpO1xufVxuXG4vKipcbiAqIFJlYWRpbmcgYmluRXhpc3RzIHByZXBlbmRzIG5vZGVfbW9kdWxlcy8uYmluIGRpcmVjdG9yaWVzIHRvIHByb2plY3QuZW52LlBBVEgsXG4gKiBzbyB0aGUgZGlyZWN0IChub24tc2hlbGwpIHdyYW5nbGVyIHNwYXducyByZXNvbHZlIHRoZSBsb2NhbCBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIXByb2plY3QuYmluRXhpc3RzKSB7XG4gICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnbm9kZV9tb2R1bGVzLy5iaW4gbm90IGZvdW5kOyByZWx5aW5nIG9uIFBBVEggdG8gcmVzb2x2ZSB3cmFuZ2xlci4nKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMsIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuaW50ZXJmYWNlIFBhcnNlZERvdGVudkFyZ3Mge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRFbnZpcm9ubWVudCB7XG4gIGN3ZDogc3RyaW5nO1xuICBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52O1xufVxuXG5jb25zdCBzaHV0ZG93blNpZ25hbHMgPSBuZXcgU2V0PE5vZGVKUy5TaWduYWxzPihbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSk7XG5cbmV4cG9ydCBjb25zdCBkb3RlbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZG90ZW52IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGZub3ggYW5kIHJ1biBhIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBydW5QYXJzZWREb3RlbnZDb21tYW5kKGdldFBhcnNlZERvdGVudkFyZ3NGcm9tWWFyZ3MoYXJndikpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFyc2VkRG90ZW52Q29tbWFuZCh7IGNvbW1hbmQgfTogUGFyc2VkRG90ZW52QXJncyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5Db21tYW5kV2l0aEVudmlyb25tZW50KGNvbW1hbmQsICd3YiBkb3RlbnYgLS0gPGNvbW1hbmQ+IFthcmdzLi4uXScpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudChcbiAgY29tbWFuZDogc3RyaW5nW10sXG4gIHVzYWdlOiBzdHJpbmcsXG4gIGNvbW1hbmRFbnZpcm9ubWVudD86IENvbW1hbmRFbnZpcm9ubWVudFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb21tYW5kLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFVzYWdlOiAke3VzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShjb21tYW5kRW52aXJvbm1lbnQ/LmN3ZCA/PyBwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgZW52ID0gY29tbWFuZEVudmlyb25tZW50Py5lbnYgPz8gcHJvY2Vzcy5lbnY7XG4gIGlmICghY29tbWFuZEVudmlyb25tZW50KSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QpO1xuICBjb25zdCBiZXJyeUJpbkZvbGRlclBhdGggPSBlbnYuQkVSUllfQklOX0ZPTERFUjtcbiAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudik7XG4gIC8vIFN0cmlwcGluZyB5YXJuJ3MgZW52aXJvbm1lbnQgYWxzbyByZW1vdmVzIGl0cyB0ZW1wb3JhcnkgYmluIGZvbGRlciDigJQgdGhlIE9OTFkgcGxhY2VcbiAgLy8geWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMg4oCUIHNvIHJlc3RvcmUgdGhlIHByb2plY3QncyBvd25cbiAgLy8gbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8ga2VlcCBiYXJlIGJpbmFyeSBuYW1lcyByZXNvbHZhYmxlLiBQbHVnJ24nUGxheSBpbnN0YWxsc1xuICAvLyBjcmVhdGUgbm8gbm9kZV9tb2R1bGVzIGF0IGFsbDsgdGhlIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGlzIHRoZW4gdGhlIHNvbGUgc291cmNlIG9mXG4gIC8vIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMsIHNvIHJlc3RvcmUgaXQgaW5zdGVhZC5cbiAgLy8gVGhlIHRlbXBvcmFyeSBmb2xkZXIgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZXN0b3JlZCB3aGVuIC5iaW4gZGlyZWN0b3JpZXMgZXhpc3Q6IGl0IGFsc29cbiAgLy8gY29udGFpbnMgbm9kZS95YXJuIHNoaW1zLCBhbmQgYSBsZWFrZWQgbm9kZSBzaGltIHdvdWxkIHZpb2xhdGUgd2IncyByZWFsLU5vZGUgZ3VhcmFudGVlXG4gIC8vIGZvciB0b29scyBsaWtlIHdyYW5nbGVyL3ZpbmV4dC4gQ2hpbGQgYHlhcm5gIGludm9jYXRpb25zIHN0YXkgcmVzb2x2YWJsZSB0aHJvdWdoIHRoZVxuICAvLyBsYXVuY2hlciBvbiB0aGUgYmFzZSBQQVRIIChtaXNlL2NvcmVwYWNrKSwgd2hpY2ggZXZlcnkgc3VwcG9ydGVkIGVudmlyb25tZW50IGhhcyDigJRcbiAgLy8gbm90aGluZyBjb3VsZCBoYXZlIHN0YXJ0ZWQgYHlhcm4gcnVuYC9gd2IgZG90ZW52YCB3aXRob3V0IGl0LlxuICBpZiAoIXByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChjd2QsIGVudikgJiYgYmVycnlCaW5Gb2xkZXJQYXRoKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSCA/IGAke2JlcnJ5QmluRm9sZGVyUGF0aH06JHtlbnYuUEFUSH1gIDogYmVycnlCaW5Gb2xkZXJQYXRoO1xuICB9XG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNodXRkb3duU2lnbmFscykge1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2hpbGQua2lsbChzaWduYWwpO1xuICAgICAgfTtcbiAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgfVxuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgIHByb2Nlc3Mub2ZmKHNodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2UgZXZlbiBmb3IgZm9yd2FyZGVkIHNodXRkb3duIHNpZ25hbHMgc28gY2FsbGVycyBvYnNlcnZlIHRoZSBjb252ZW50aW9uYWxcbiAgICAgICAgLy8gc2lnbmFsIGV4aXQgc3RhdHVzIChlLmcuIDEzMCBmb3IgU0lHSU5UKSBpbnN0ZWFkIG9mIGEgbWlzbGVhZGluZyBzdWNjZXNzLlxuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBjb2RlID8/IDE7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZWREb3RlbnZBcmdzRnJvbVlhcmdzKGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSk6IFBhcnNlZERvdGVudkFyZ3Mge1xuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IFtcbiAgICAgIC4uLigoYXJndi5hcmdzIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZCkgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICAgLi4uKChhcmd2WyctLSddIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZCkgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgIF0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhcmRXYkVudih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmaXhUYXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoXG4gICAgIXZhbHVlIHx8XG4gICAgWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddLmluY2x1ZGVzKHZhbHVlKSB8fFxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHxcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmVycm9yKFxuICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7dmFsdWV9XCIuIGAgK1xuICAgICAgYEZpeCAke2ZpeFRhcmdldH0sIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuLy8gTk9URTogYHdiIGRvdGVudmAgZGVsaWJlcmF0ZWx5IHNraXBzIFByb2plY3QuZW52J3MgZnVsbCB2YWxpZGF0aW9uOiBpdCBpcyBhIGdlbmVyaWMgcnVubmVyIGFsc29cbi8vIHVzZWQgYmVmb3JlIGVudiBzb3VyY2VzIGV4aXN0IChib290c3RyYXApIGFuZCBtdXN0IG5vdCBmYWlsIGZhc3QgZm9yIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgbm90XG4vLyBhZG9wdGVkIHRoZSBvcmcgZW52IHN0YW5kYXJkLiBBIE5PTi1FTVBUWSBXQl9FTlYgaXMgc3RpbGwgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHN0YW5kYXJkIG1vZGVzLFxuLy8gdGhvdWdoIOKAlCBhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgd291bGQgb3RoZXJ3aXNlIHNpbGVudGx5IHNlbGVjdCB0aGUgYmFzZSAoZGV2ZWxvcG1lbnQpIHZhbHVlcy5cbmZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIFRoZSBtb2RlIGlzIEZPUkNFRCBvbmx5IHdoZW4gV0JfRU5WIGlzIGV4cGxpY2l0bHkgZXhwb3J0ZWQ7IGl0IGRyaXZlcyB0aGUgZm9yY2VkLW1vZGUgb3ZlcnJpZGVcbiAgLy8gYmVsb3cgYW5kIHRoZSB2YWxpZGF0aW9uIGF0IHRoZSBlbmQuXG4gIGNvbnN0IG1vZGUgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gIC8vIFRoZSBmbm94IGAtLXByb2ZpbGVgIHNlbGVjdG9yLCBkZWZhdWx0aW5nIHRvIGRldmVsb3BtZW50IGxpa2Ugd2IncyBtYWluIGxvYWRlciAoYFdCX0VOViB8fFxuICAvLyBOT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnYCwgc2VlIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcykgc28gYSByZXBvIGtlZXBpbmcgZGV2LW9ubHkgc2VjcmV0c1xuICAvLyBpbiBgW3Byb2ZpbGVzLmRldmVsb3BtZW50LnNlY3JldHNdYCBsb2FkcyB0aGVtIHdoZW4gV0JfRU5WIGlzIHVuc2V0IGluc3RlYWQgb2Ygb25seSB0aGUgYmFzZVxuICAvLyB0YWJsZS4gSXQgYWRkaXRpb25hbGx5IGhvbm9ycyBhbiBleHBsaWNpdCBGTk9YX1BST0ZJTEUsIGJlY2F1c2UgZm5veCBob25vcnMgaXQgYW5kIGB3YiBkb3RlbnZgXG4gIC8vIHdpdGhvdXQgV0JfRU5WIGlzIGRvY3VtZW50ZWQgdG8gYXMgd2VsbCAoc2VlIHJ1bkZub3hFeHBvcnQncyBpZ25vcmVQcm9maWxlRW52VmFyIG5vdGUpLlxuICAvLyBOT0RFX0VOViBpcyByZWFkIHRocm91Z2ggdGhlIGBydW50aW1lRW52YCBhbGlhcywgbmV2ZXIgYXMgdGhlIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgbWVtYmVyXG4gIC8vIGV4cHJlc3Npb24gdGhhdCB0aGUgYnVuZGxlciBpbmxpbmVzIHRvICdwcm9kdWN0aW9uJyAod2hpY2ggd291bGQgd3JvbmdseSBzZWxlY3QgcHJvZHVjdGlvbikuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgZm5veENhc2NhZGUgPSBtb2RlIHx8IHJ1bnRpbWVFbnYuRk5PWF9QUk9GSUxFIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JztcbiAgLy8gV0JfRU5WIGluIHByb2Nlc3MuZW52IG1lYW5zIHRoZSBtb2RlIGlzIGV4cGxpY2l0bHkgZm9yY2VkLCBzbyB2YWx1ZXMgZnJvbSB0aGUgbW9kZSdzIG93biBmbm94XG4gIC8vIHByb2ZpbGUgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgc2hlbGwg4oCUIGV4Y2VwdCBvbiBDSSwgd2hlcmUgaW5qZWN0ZWQgZW52XG4gIC8vIHZhcnMgbXVzdCBrZWVwIG92ZXJyaWRpbmcgY29tbWl0dGVkIHZhbHVlc1xuICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuXG4gIGNvbnN0IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiA9ICEhbW9kZSAmJiAhaXNDSShwcm9jZXNzLmVudi5DSSk7XG4gIGNvbnN0IFtwYXJzZWRdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGZub3hDYXNjYWRlLCB7IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiB9KTtcbiAgLy8gRXhwYW5kICR7Li4ufSByZWZlcmVuY2VzIGFnYWluc3QgZXhwb3J0ZWQgdmFyaWFibGVzIHdob3NlIGZub3ggdmFsdWUgbG9zZXMgdG8gdGhlIHNoZWxsXG4gIC8vIChtaXJyb3JpbmcgcmVhZEVudmlyb25tZW50VmFyaWFibGVzJyBlZmZlY3RpdmUtdmFsdWUgc2VtYW50aWNzKTogYSByZWZlcmVuY2UgbXVzdCByZXNvbHZlIHRvXG4gIC8vIHRoZSB2YWx1ZSB0aGUgY2hpbGQgd2lsbCBhY3R1YWxseSBzZWUuIHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMgcmV0dXJucyBhXG4gIC8vIHByb2Nlc3MuZW52LXNoYWRvd2VkIGtleSBvbmx5IHdoZW4gdGhlIGZvcmNlZCBwcm9maWxlIG92ZXJyaWRlcyBpdCwgc28gZXZlcnkgcGFyc2VkIGtleSdzIG93blxuICAvLyB2YWx1ZSB3aW5zIGFuZCBpcyBleGNsdWRlZCBmcm9tIHRoZSByZWZlcmVuY2Ugc2V0LlxuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBleHBvcnRlZCB2YWx1ZXMgc3Vic3RpdHV0ZSBsaXRlcmFsbHkgKHBhJHdvcmQgc3RheXMgcGEkd29yZCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gcGFyc2VkKSkge1xuICAgICAgcmVmZXJlbmNlRW52W2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZCwgcHJvY2Vzc0VudjogcmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyBwYXJzZWQ7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkgY29udGludWU7XG4gICAgLy8gQSBwcm9jZXNzLmVudi1zaGFkb3dlZCBrZXkgcmVhY2hlcyBoZXJlIG9ubHkgd2hlbiB0aGUgZm9yY2VkIHByb2ZpbGUgb3ZlcnJpZGVzIGl0IChzZWVcbiAgICAvLyByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKTsgb24gQ0kgc3VjaCBrZXlzIGFyZSBuZXZlciByZXR1cm5lZCwgc28gbm8gYnJhbmNoIGlzIG5lZWRlZC5cbiAgICBpZiAobW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiAke2tleX0gaW4gdGhlIFwiJHttb2RlfVwiIG1vZGUncyBlbnYgc291cmNlcyBvdmVycmlkZXMgdGhlIHZhbHVlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgYmVjYXVzZSBXQl9FTlYgaXMgZXhwbGljaXRseSBzZXQuYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLy8gVmFsaWRhdGUgb25seSBBRlRFUiBhcHBseWluZyB0aGUgc291cmNlcywgc28gYSBXQl9TS0lQX0VOVl9DSEVDSyBkZWZpbmVkIGluIGFuIGVudiBTT1VSQ0UgaXNcbiAgLy8gaG9ub3JlZDogYm90aCB0aGUgY2FwdHVyZWQgZXhwb3J0ZWQgbW9kZSAoaXQgc2VsZWN0ZWQgdGhlIHByb2ZpbGUpIGFuZCB0aGUgRklOQUwgdmFsdWUgdGhlXG4gIC8vIGNoaWxkIHdpbGwgc2VlIOKAlCB0aGUgZm5veCBwcm9maWxlIG1heSBkZWZpbmUgYSBicm9rZW4gV0JfRU5WIChlLmcuIGBwcm9kY3V0aW9uYCksIGFuZCBhIGZvcmNlZFxuICAvLyBtb2RlJ3MgcHJvZmlsZSBtYXkgZXZlbiBvdmVycmlkZSBhIFZBTElEIGV4cG9ydGVkIHZhbHVlLlxuICB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYobW9kZSwgJ3RoZSBleHBvcnRlZCB2YXJpYWJsZScpO1xuICB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYocHJvY2Vzcy5lbnYuV0JfRU5WLCAndGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlJyk7XG4gIC8vIFRoZSBzZWxlY3RlZCBlbnZpcm9ubWVudCBpcyB3aGF0IGFuIGVudiBzb3VyY2Ugc2lsZW50bHkgcmVzb2x2aW5nIFdCX0VOViB0byBhIERJRkZFUkVOVCB2YWx1ZVxuICAvLyBtdXN0IGFncmVlIHdpdGgsIGVsc2UgdGhlIGNoaWxkIHJ1bnMgbGFiZWxlZCBvbmUgZW52aXJvbm1lbnQgd2hpbGUgY2FycnlpbmcgYW5vdGhlcidzIHNlY3JldHMuXG4gIC8vIE9ubHkgYSBTVEFOREFSRCBjYXNjYWRlIGlzIGVuZm9yY2VkIChtaXJyb3JpbmcgUHJvamVjdC5jb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpOiBhIGN1c3RvbVxuICAvLyBzZWxlY3RvciBzdWNoIGFzIGBOT0RFX0VOVj1xYWAgbGVnaXRpbWF0ZWx5IHNlbGVjdHMgdGhlIGBxYWAgcHJvZmlsZSB3aGlsZSBXQl9FTlYgc3RheXMgYVxuICAvLyBzdGFuZGFyZCBtb2RlLlxuICBjb25zdCBleHBlY3RlZENhc2NhZGUgPSBmbm94Q2FzY2FkZTtcbiAgaWYgKFxuICAgIHByb2Nlc3MuZW52LldCX0VOViAmJlxuICAgIFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXS5pbmNsdWRlcyhleHBlY3RlZENhc2NhZGUpICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfRU5WICE9PSBleHBlY3RlZENhc2NhZGUgJiZcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyAhPT0gJzEnICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgIT09ICd0cnVlJ1xuICApIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7cHJvY2Vzcy5lbnYuV0JfRU5WfVwiIGFsdGhvdWdoIHRoZSBcIiR7ZXhwZWN0ZWRDYXNjYWRlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgIGBGaXggdGhlIFdCX0VOViBkZWZpbmVkIGluIHRoZSBlbnYgc291cmNlcywgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLmBcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBGSUxFX1NDSEVNQSwgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiB9IGZyb20gJy4vbGl0ZXN0cmVhbS5qcyc7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNsZWFuVXBDb21tYW5kID0gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgJHtjbGVhblVwQ29tbWFuZH07IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGdlbmVyYXRlKF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBbJ1BSSVNNQSBnZW5lcmF0ZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldE1vdW50RGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnT3B0aW9uID0gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KTtcbiAgICAvLyBgcHJpc21hIG1pZ3JhdGUgcmVzZXRgIGNhbiBmYWlsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFiYXNlLCBzbyB3ZSByZW1vdmUgaXQgZmlyc3QuXG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmICR7dGhpcy5nZW5lcmF0ZShwcm9qZWN0KX0gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2xlYW51cENvbW1hbmQgPSBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0KTtcbiAgICBpZiAoY2xlYW51cENvbW1hbmQpIHN0ZXBzLnB1c2goY2xlYW51cENvbW1hbmQpO1xuICAgIGNvbnN0IHJlc2V0Q29tbWFuZCA9IFsnUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIHN0ZXBzLnB1c2gocmVzZXRDb21tYW5kKTtcbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gQmxpdHogc2VlZCBtb2R1bGVzIGRlZmF1bHQtZXhwb3J0IHRoZSBzZWVkIGZ1bmN0aW9uIHdpdGhvdXQgY2FsbGluZyBpdCwgc28gb25seVxuICAgIC8vIGBibGl0eiBkYiBzZWVkYCAod2hvc2UgbG9hZGVyIGludm9rZXMgdGhlIGV4cG9ydCkgYWN0dWFsbHkgcG9wdWxhdGVzIHRoZSBkYXRhYmFzZS5cbiAgICAvLyBCdW4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBkZWNsYXJlIHByaXNtYS5zZWVkIGluc3RlYWQgYW5kIG11c3QgYXZvaWQgdGhlIGJsaXR6IENMSSxcbiAgICAvLyB3aGljaCBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluc2lkZSBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlLlxuICAgIGlmICghcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpKSB7XG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIH1cbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgY29uc3Qgc2VlZHNQYXRoID0gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9zZWVkcy50c2A7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwiJHtzZWVkc1BhdGh9XCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuICR7c2VlZHNQYXRofTsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG4vKiogV2hlcmUgdGhlIExpdGVzdHJlYW0tcmVwbGljYXRlZCBTUUxpdGUgZGF0YWJhc2UgaXMgbW91bnRlZCwgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0TW91bnREaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9tb3VudGA7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3RGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgYXMgbm9ybWFsaXplU2hhcmVkQnVuTG9ja2ZpbGUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG4vKipcbiAqIFN0cmlwIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGBidW4ubG9ja2AgYW5kIHJlcG9ydCBhIGNoYW5nZS5cbiAqXG4gKiBidW4gcmVjb3JkcyBhbiBhYnNvbHV0ZSBgcmVzb2x2ZWRgIFVSTCBmb3IgYW4gYWxyZWFkeS1sb2NrZWQgcGFja2FnZSB3aGVuZXZlciB0aGUgY29uZmlndXJlZFxuICogcmVnaXN0cnkgZG9lcyBub3Qgc2VydmUgdGhlIHRhcmJhbGwgaG9zdCBuYW1lZCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0XG4gKiB0aGUgVGFrdW1pIEd1YXJkIHByb3h5IGRvZXMuIFNvIGFueSBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBERUZBVUxUIHJlZ2lzdHJ5IChDSSwgb3IgYVxuICogZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50byB0aGUgbG9ja2ZpbGUsIGFuZCBjb21taXR0aW5nXG4gKiB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeSBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoXG4gKiB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYVxuICogcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGUgZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3RcbiAqIHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lcyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuXG4gKiBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbSB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gdGhleSBhcmUgcHVyZSBkYW1hZ2UuXG4gKlxuICogd2JmeSBnZW5lcmF0ZXMgYSBwcmUtY29tbWl0IGhvb2sgdGhhdCBzdHJpcHMgdGhlIHNhbWUgVVJMcywgYnV0IHRoYXQgb25seSBmaXJlcyBhdCBgZ2l0IGNvbW1pdGAuXG4gKiBSdW5uaW5nIHRoaXMgcmlnaHQgYWZ0ZXIgYW4gaW5zdGFsbCBjbG9zZXMgdGhlIHdpbmRvdyBpbiBiZXR3ZWVuLCB3aGVyZSB0aGUgcmV3cml0dGVuIGxvY2tmaWxlIGlzXG4gKiBzaW1wbHkgdGhlIHdvcmtpbmcgdHJlZSdzIHN0YXRlOiBhIGJ5cGFzc2VkIGhvb2ssIGEgY29tbWl0IGZyb20gYSB0b29sIHRoYXQgZG9lcyBub3QgcnVuIGhvb2tzLFxuICogb3IgYSBkaWZmIHJlYWQgYnkgYSBodW1hbiBvciBhbiBhZ2VudCBhbGwgc2VlIGl0LiBPbmx5IHRoZSBHdWFyZCBob3N0IGlzIHN0cmlwcGVkOyBhIHNjb3BlZFxuICogcmVnaXN0cnkgc3VjaCBhcyBWZXJkYWNjaW8gbGVnaXRpbWF0ZWx5IHJlY29yZHMgaXRzIG93biBVUkwgZm9yIHByaXZhdGUgcGFja2FnZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZVNoYXJlZEJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtsb2NrZmlsZVBhdGh9IHRvIGtlZXAgaXQgcmVnaXN0cnktYWdub3N0aWMuYCkpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlVG9tbCB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbi8qKlxuICogV3JpdGUgdGhlIGtleS1vbmx5IHN0dWIgdGhhdCBgd3JhbmdsZXIgdHlwZXMgLS1lbnYtZmlsZWAgcmVhZHMgdG8gdHlwZSB0aGUgQ2xvdWRmbGFyZSBgRW52YC5cbiAqXG4gKiBgd3JhbmdsZXIgdHlwZXNgIGRlcml2ZXMgZWFjaCBgRW52YCBtZW1iZXIgZnJvbSBhIGtleSdzIG1lcmUgcHJlc2VuY2UgaW4gdGhlIGZpbGUg4oCUIG5ldmVyIGZyb20gaXRzXG4gKiB2YWx1ZSwgYW5kIG5ldmVyIGZyb20gcHJvY2Vzcy5lbnYg4oCUIGFuZCBgLS1lbnYtZmlsZWAgUkVQTEFDRVMgd3JhbmdsZXIncyBuYXRpdmUgYC5lbnZgL2AuZGV2LnZhcnNgXG4gKiByZWFkaW5nLiBUaGUgc3R1YiB0aGVyZWZvcmUgY2FycmllcyBldmVyeSBkZWNsYXJlZCBiaW5kaW5nIGtleSB3aXRoIGEgY29uc3RhbnQgcGxhY2Vob2xkZXIgdmFsdWVcbiAqIChgMWAsIG5vdCBlbXB0eSwgc28gaXQgY2Fubm90IG92ZXJyaWRlIGEgd3JhbmdsZXIgYHZhcnNgIGJpbmRpbmcgd2l0aCBhbiBlbXB0eSBzdHJpbmcpLiBJdCB3cml0ZXMgbm9cbiAqIHJlYWwgc2VjcmV0IGFuZCBuZWVkcyBubyBkZWNyeXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIocHJvamVjdERpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGtleU5hbWVzID0gY29sbGVjdFdvcmtlckJpbmRpbmdLZXlOYW1lcyhwcm9qZWN0RGlyUGF0aCwgcm9vdERpclBhdGgpO1xuICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvdXRwdXRQYXRoLFxuICAgIGtleU5hbWVzLm1hcCgoa2V5TmFtZSkgPT4gYCR7a2V5TmFtZX09MWApLmpvaW4oJ1xcbicpICsgKGtleU5hbWVzLmxlbmd0aCA+IDAgPyAnXFxuJyA6ICcnKVxuICApO1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtrZXlOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLmApKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSBkZWNsYXJlZCBXb3JrZXIgYmluZGluZyBrZXkgTkFNRVMgZnJvbSB0aGUgY29tbWl0dGVkIGBmbm94LnRvbWxgIGZpbGVzIHdpdGhvdXRcbiAqIGRlY3J5cHRpbmcgYW55dGhpbmcgb3IgaW52b2tpbmcgdGhlIGVudmlyb25tZW50IHJlYWRlci4gVGhpcyBkZWxpYmVyYXRlbHkgYXZvaWRzIHByb2Nlc3MuZW52LFxuICogYG1pc2UgZW52YCBob3N0L3Rvb2wgdmFyaWFibGVzLCBhbmQgY2FzY2FkZS9wcm9maWxlIHNlbGVjdGlvbiwgYWxsIG9mIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogcG9sbHV0ZSBvciBuYXJyb3cgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RXb3JrZXJCaW5kaW5nS2V5TmFtZXMocHJvamVjdERpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5TmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gZm5veCBtZXJnZXMgdGhlIHdob2xlIGFuY2VzdG9yIGNvbmZpZyBjaGFpbiAoYSBuZXN0ZWQgV29ya2VyIGluaGVyaXRzIHRoZSBtb25vcmVwbyByb290J3NcbiAgLy8gc2VjcmV0cyksIHNvIHVuaW9uIGV2ZXJ5IGZub3gudG9tbCBmcm9tIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSB1cCB0byB0aGUgcmVwb3NpdG9yeSByb290LlxuICBmb3IgKGNvbnN0IGNvbmZpZ1BhdGggb2YgZmluZEFuY2VzdG9yRm5veENvbmZpZ1BhdGhzKHByb2plY3REaXJQYXRoLCByb290RGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgcGFyc2VGbm94U2VjcmV0S2V5TmFtZXMoY29uZmlnUGF0aCkpIGtleU5hbWVzLmFkZChrZXlOYW1lKTtcbiAgfVxuICByZXR1cm4gWy4uLmtleU5hbWVzXS50b1NvcnRlZCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuLyoqIEV2ZXJ5IGBmbm94LnRvbWxgIGZyb20gYHByb2plY3REaXJQYXRoYCB1cCB0byAoYW5kIGluY2x1ZGluZykgYHJvb3REaXJQYXRoYCwgbmVhcmVzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGZpbmRBbmNlc3RvckZub3hDb25maWdQYXRocyhwcm9qZWN0RGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb25maWdQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpO1xuICBmb3IgKGxldCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3REaXJQYXRoKTsgOyBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpKSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIGNvbmZpZ1BhdGhzLnB1c2goY29uZmlnUGF0aCk7XG4gICAgLy8gU3RvcCBhdCB0aGUgcmVwb3NpdG9yeSByb290IChpdHMgcGFyZW50J3Mgc2VjcmV0cyBhcmUgbm90IHBhcnQgb2YgdGhpcyByZXBvKSBvciwgZGVmZW5zaXZlbHksXG4gICAgLy8gYXQgdGhlIGZpbGVzeXN0ZW0gcm9vdCB3aGVuIHJvb3REaXJQYXRoIGlzIG5vdCBhY3R1YWxseSBhbiBhbmNlc3Rvci5cbiAgICBpZiAoZGlyUGF0aCA9PT0gcm9vdFBhdGggfHwgcGF0aC5kaXJuYW1lKGRpclBhdGgpID09PSBkaXJQYXRoKSBicmVhaztcbiAgfVxuICByZXR1cm4gY29uZmlnUGF0aHM7XG59XG5cbmludGVyZmFjZSBGbm94U2VjcmV0c1RhYmxlIHtcbiAgW2tleU5hbWU6IHN0cmluZ106IHVua25vd247XG59XG5pbnRlcmZhY2UgRm5veENvbmZpZyB7XG4gIHNlY3JldHM/OiBGbm94U2VjcmV0c1RhYmxlO1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIHsgc2VjcmV0cz86IEZub3hTZWNyZXRzVGFibGUgfSB8IHVuZGVmaW5lZD47XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGtleSBuYW1lcyB1bmRlciBgZm5veC50b21sYCdzIGBbc2VjcmV0c11gIGFuZCBldmVyeSBgW3Byb2ZpbGVzLjxuYW1lPi5zZWNyZXRzXWAgdGFibGUuXG4gKiBmbm94IHN0b3JlcyBrZXkgbmFtZXMgaW4gcGxhaW50ZXh0IChvbmx5IHZhbHVlcyBhcmUgZW5jcnlwdGVkKSwgc28gdGhpcyBuZWVkcyBubyBhZ2Uga2V5LiBFdmVyeVxuICogcHJvZmlsZSdzIHNlY3JldHMgYXJlIHVuaW9uZWQgc28gdGhlIEVudiBpcyBhIGRldGVybWluaXN0aWMgc3VwZXJzZXQgY292ZXJpbmcgYWxsIGVudmlyb25tZW50c1xuICogKGxpa2UgdGhlIGZvcm1lciBjb21taXR0ZWQgLmVudi5leGFtcGxlKSwgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2ZpbGUgYSBnaXZlbiBydW4gcmVzb2x2ZXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRm5veFNlY3JldEtleU5hbWVzKGNvbmZpZ1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29uZmlnID0gcGFyc2VUb21sKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKSBhcyBGbm94Q29uZmlnO1xuICBjb25zdCBrZXlOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY29sbGVjdCA9IChzZWNyZXRzOiBGbm94U2VjcmV0c1RhYmxlIHwgdW5kZWZpbmVkKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBba2V5TmFtZSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHMgPz8ge30pKSB7XG4gICAgICAvLyBTa2lwIHNlY3JldHMgZm5veCBkb2VzIG5vdCBleHBvcnQgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIChgZW52ID0gZmFsc2VgIC8gYFwiZXhlY1wiYCk6IHRoZXlcbiAgICAgIC8vIGFyZSBuZXZlciBXb3JrZXIgYmluZGluZ3MsIG1hdGNoaW5nIGBmbm94IGV4cG9ydGAncyBkZWZhdWx0LlxuICAgICAgY29uc3QgZW52ID0gdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJiBlbnRyeSAhPT0gbnVsbCA/IChlbnRyeSBhcyB7IGVudj86IHVua25vd24gfSkuZW52IDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGVudiA9PT0gZmFsc2UgfHwgZW52ID09PSAnZXhlYycpIGNvbnRpbnVlO1xuICAgICAga2V5TmFtZXMucHVzaChrZXlOYW1lKTtcbiAgICB9XG4gIH07XG4gIGNvbGxlY3QoY29uZmlnLnNlY3JldHMpO1xuICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgT2JqZWN0LnZhbHVlcyhjb25maWcucHJvZmlsZXMgPz8ge30pKSBjb2xsZWN0KHByb2ZpbGU/LnNlY3JldHMpO1xuICByZXR1cm4ga2V5TmFtZXM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREcml6emxlQ29uZmlnLCB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICcuLi91dGlscy9idW5Mb2NrZmlsZS5qcyc7XG5pbXBvcnQgeyB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiB9IGZyb20gJy4uL3V0aWxzL3dvcmtlclR5cGVzRW52LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG4vLyBgd3JhbmdsZXIgdHlwZXNgIGRlcml2ZXMgdGhlIENsb3VkZmxhcmUgYEVudmAncyBzZWNyZXQvdmFyIG1lbWJlcnMgb25seSBmcm9tIHRoZSBLRVkgTkFNRVMgaW4gYVxuLy8gLmRldi52YXJzLy5lbnYgZmlsZSAobmV2ZXIgZnJvbSBwcm9jZXNzLmVudiksIGFuZCBgLS1lbnYtZmlsZWAgUkVQTEFDRVMgdGhhdCBkZWZhdWx0IGZpbGUgc2V0LiBTb1xuLy8gZ2VuLWNvZGUgdHlwZXMgYSBXb3JrZXIgYWdhaW5zdCBhIHRocm93YXdheSBrZXktb25seSBzdHViIHdyaXR0ZW4gaGVyZSBmcm9tIGNvbW1pdHRlZCBzb3VyY2VzLlxuY29uc3Qgd29ya2VyVHlwZXNFbnZQYXRoID0gcGF0aC5qb2luKCcud3JhbmdsZXInLCAnd29ya2VyLXR5cGVzLmVudicpO1xuXG5leHBvcnQgY29uc3QgZ2VuQ29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdnZW4tY29kZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgY29kZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gQmVmb3JlIHRoZSBlYXJseSByZXR1cm4gYmVsb3c6IGBnZW4tY29kZWAgaXMgdGhlIGBwb3N0aW5zdGFsbGAgc2NyaXB0IHdiZnkgZ2VuZXJhdGVzLCBtYWtpbmdcbiAgICAvLyB0aGlzIHRoZSBmaXJzdCB3YiBjb2RlIHRoYXQgcnVucyBhZnRlciBidW4gbWF5IGhhdmUgcmV3cml0dGVuIHRoZSBsb2NrZmlsZSwgYW5kIGEgcmVwb3NpdG9yeVxuICAgIC8vIHdpdGggbm90aGluZyB0byBnZW5lcmF0ZSBuZWVkcyB0aGUgbm9ybWFsaXphdGlvbiBqdXN0IGFzIG11Y2guIGByb290RGlyUGF0aGAgcmF0aGVyIHRoYW5cbiAgICAvLyBgcHJvamVjdHMucm9vdC5kaXJQYXRoYDogYnVuIHJ1bnMgYSB3b3Jrc3BhY2UgcGFja2FnZSdzIHBvc3RpbnN0YWxsIGZyb20gdGhhdCBwYWNrYWdlJ3NcbiAgICAvLyBkaXJlY3RvcnksIGFuZCBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyBvbmx5IGNsaW1icyBvdXQgb2YgYHBhY2thZ2VzLypgLCBzbyBhIHdvcmtzcGFjZSBzdWNoXG4gICAgLy8gYXMgYGFwcHMvd2ViYCB3b3VsZCBvdGhlcndpc2UgbG9vayBmb3IgYGFwcHMvd2ViL2J1bi5sb2NrYCBpbnN0ZWFkIG9mIHRoZSByZXBvc2l0b3J5J3MuXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgbm9ybWFsaXplQnVuTG9ja2ZpbGUocHJvamVjdHMuc2VsZi5yb290RGlyUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuQ29kZVRhcmdldHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgICAgLm1hcCgocHJvamVjdCkgPT4gKHsgcHJvamVjdCwgc2NyaXB0czogZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdCkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHNjcmlwdHMgfSkgPT4gc2NyaXB0cy5sZW5ndGggPiAwKTtcbiAgICBpZiAoZ2VuQ29kZVRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCwgc2NyaXB0cyB9IG9mIGdlbkNvZGVUYXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJnZW4tY29kZVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG4gICAgICAvLyBXcml0ZSB0aGUga2V5IHN0dWIgdGhlIGZpcnN0IHNjcmlwdCdzIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCBjb25zdW1lcy4gSXQgaXMgZGVyaXZlZCBmcm9tXG4gICAgICAvLyBjb21taXR0ZWQgc291cmNlcyAoZm5veC50b21sIGtleSBuYW1lcyksIHNvIGl0IG5lZWRzIG5vIGFnZSBrZXksIG5ldmVyIHB1bGxzIGluXG4gICAgICAvLyBwcm9jZXNzLmVudiAvIGBtaXNlIGVudmAgaG9zdCB2YXJpYWJsZXMsIGFuZCBkb2VzIG5vdCBkZXBlbmQgb24gd2hpY2ggcHJvZmlsZSBhIHJ1biByZXNvbHZlcy5cbiAgICAgIGlmICghYXJndi5kcnlSdW4gJiYgZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KSkge1xuICAgICAgICB3cml0ZVdvcmtlclR5cGVzRW52U3R1YihcbiAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgcHJvamVjdC5yb290RGlyUGF0aCxcbiAgICAgICAgICBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCB3b3JrZXJUeXBlc0VudlBhdGgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICAvLyBGaXJzdDogYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGlzIGdpdGlnbm9yZWQsIHNvIG9uIGEgZnJlc2ggY2hlY2tvdXQgaXQgZG9lcyBub3QgZXhpc3QgeWV0LFxuICAvLyBhbmQgdGhlIGdlbmVyYXRvcnMgYmVsb3cgdHlwZS1jaGVjayBhZ2FpbnN0IHRoZSBDbG91ZGZsYXJlIGBFbnZgIGl0IGRlY2xhcmVzLlxuICBjb25zdCB3cmFuZ2xlclR5cGVzU2NyaXB0ID0gZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHdyYW5nbGVyVHlwZXNTY3JpcHQpIHtcbiAgICAvLyBgLS1lbnYtZmlsZWAgcG9pbnRzIHdyYW5nbGVyIGF0IHRoZSBrZXkgc3R1YiB0aGUgaGFuZGxlciB3cml0ZXMgKHNlZSB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiksXG4gICAgLy8gc28gYSBmcmVzaCBjaGVja291dCB3aXRoIG5vIHJ1bnRpbWUgLmRldi52YXJzIChlLmcuIENJKSBzdGlsbCB0eXBlcyBldmVyeSBzZWNyZXQuIFdpdGhvdXQgaXQgYVxuICAgIC8vIGJhcmUgYHdyYW5nbGVyIHR5cGVzYCB5aWVsZHMgYW4gYEVudmAgbWlzc2luZyBldmVyeSBzZWNyZXQgYW5kIHRoZSB0eXBlLWF3YXJlIGdlbmVyYXRvcnMvbGludGVyc1xuICAgIC8vIGJlbG93IGZhaWwgKGUuZy4gXCJQcm9wZXJ0eSAnQVVUSF9TRUNSRVQnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0VudidcIikuXG4gICAgc2NyaXB0cy5wdXNoKGAke3dyYW5nbGVyVHlwZXNTY3JpcHR9IC0tZW52LWZpbGUgJHt3b3JrZXJUeXBlc0VudlBhdGh9YCk7XG4gIH1cbiAgLy8gWWFybi1lcmEgQmxpdHogcmVwb3NpdG9yaWVzIG5lZWQgYGJsaXR6IGNvZGVnZW5gIGZvciB0aGUgcm91dGUgbWFuaWZlc3QgKG5vZGVfbW9kdWxlcy8uYmxpdHopXG4gIC8vIHRoYXQgQGJsaXR6anMvbmV4dCdzIHR5cGUgZGVjbGFyYXRpb25zIHJlLWV4cG9ydDsgaW5zdGFsbCBzY3JpcHRzIGRvIG5vdCBydW4gaXRcbiAgLy8gKGVuYWJsZVNjcmlwdHM6IGZhbHNlKS4gTmV2ZXIgdW5kZXIgQnVuOiB0aGUgYmxpdHogQ0xJIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW5cbiAgLy8gcGxhY2UsIHdoaWNoIG11c3Qgbm90IGhhcHBlbiBpbiBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlIChCdW4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBnZW5lcmF0ZVxuICAvLyB0aGUgbWFuaWZlc3Qgd2l0aCB0aGVpciBvd24gc2NyaXB0cyBpbnN0ZWFkKS4gT24gYSBmcmVzaCBpbnN0YWxsIGBibGl0eiBjb2RlZ2VuYCBhbHNvXG4gIC8vIGdlbmVyYXRlcyB0aGUgUHJpc21hIGNsaWVudCBpdHNlbGYsIG1ha2luZyB0aGUgUFJJU01BIGdlbmVyYXRlIHN0ZXAgYmVsb3cgcmVkdW5kYW50IG9uY2Ug4oCUXG4gIC8vIGtlZXBpbmcgYm90aCBpcyBkZWxpYmVyYXRlOiBhZnRlciBzY2hlbWEtb25seSBjaGFuZ2VzIGJsaXR6J3MgYWxyZWFkeS1nZW5lcmF0ZWQgZ3VhcmQgc2tpcHNcbiAgLy8gaXRzIGludGVybmFsIGdlbmVyYXRlLCBzbyB0aGUgZXhwbGljaXQgc3RlcCBpcyBzdGlsbCB3aGF0IHJlZ2VuZXJhdGVzIHRoZSBjbGllbnQuXG4gIGlmICghcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpICYmIHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgIHNjcmlwdHMucHVzaCgnWUFSTiBibGl0eiBjb2RlZ2VuJyk7XG4gIH1cbiAgY29uc3QgcHJpc21hR2VuZXJhdGVTY3JpcHQgPSBnZXRQcmlzbWFHZW5lcmF0ZVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHByaXNtYUdlbmVyYXRlU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKHByaXNtYUdlbmVyYXRlU2NyaXB0KTtcbiAgfVxuICBjb25zdCBjaGFrcmFUeXBlZ2VuU2NyaXB0ID0gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3QpO1xuICBpZiAoY2hha3JhVHlwZWdlblNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChjaGFrcmFUeXBlZ2VuU2NyaXB0KTtcbiAgfVxuICBjb25zdCBkcml6emxlQ2hlY2tTY3JpcHQgPSBnZXREcml6emxlQ2hlY2tTY3JpcHQocHJvamVjdCk7XG4gIGlmIChkcml6emxlQ2hlY2tTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZHJpenpsZUNoZWNrU2NyaXB0KTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNTY3JpcHQgPSBnZXRHZW5JMThuVHNTY3JpcHQocHJvamVjdCk7XG4gIGlmIChnZW5JMThuVHNTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZ2VuSTE4blRzU2NyaXB0KTtcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLyoqXG4gKiBgWUFSTiB3cmFuZ2xlcmAgcmF0aGVyIHRoYW4gYGJ1bnggd3JhbmdsZXJgOiB3cmFuZ2xlciBuZWVkcyByZWFsIE5vZGUuanMsIGFuZCBgYnVueGAgbWF5IHJlc29sdmVcbiAqIGEgdmVyc2lvbiBvdGhlciB0aGFuIHRoZSBsb2NrZmlsZSdzLiBSZXR1cm5zIHRoZSBiYXNlIGNvbW1hbmQ7IHRoZSBjYWxsZXIgYXBwZW5kcyBgLS1lbnYtZmlsZWBcbiAqIHBvaW50aW5nIGF0IGEgZ2VuZXJhdGVkIGtleS1vbmx5IHN0dWIgKHNlZSBnZXRHZW5Db2RlU2NyaXB0cykgYmVjYXVzZSBmbm94IHJlcG9zaXRvcmllcyBoYXZlIG5vXG4gKiBgLmVudmAgZmlsZSBmb3Igd3JhbmdsZXIgdG8gaW5mZXIgdGhlIHNlY3JldCBiaW5kaW5ncyBmcm9tLiBgLS1zdHJpY3QtdmFyc2AgaXMgZGVsaWJlcmF0ZWx5IGxlZnRcbiAqIG91dCDigJQgaXQgaXMgYSBwZXItcmVwb3NpdG9yeSB0eXBlLXN0cmljdG5lc3MgY2hvaWNlIHRoYXQgYmVsb25ncyBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLlxuICovXG5mdW5jdGlvbiBnZXRXcmFuZ2xlclR5cGVzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuZ2VuZXJhdGVzV29ya2VyVHlwZXMpIHJldHVybjtcbiAgcmV0dXJuICdZQVJOIHdyYW5nbGVyIHR5cGVzJztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHtcbiAgICBpZiAoIXByb2plY3QuaGFzU291cmNlQ29kZSkgcmV0dXJuO1xuICAgIHJldHVybiAnWUFSTiBydW4gZ2VuLWkxOG4tdHMnO1xuICB9XG4gIGlmIChcbiAgICBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2dlbi1pMThuLXRzJykgJiZcbiAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdpMThuJykpXG4gICkge1xuICAgIHJldHVybiAnWUFSTiBnZW4taTE4bi10cyAtaSBpMThuIC1vIHNyYy9fX2dlbmVyYXRlZF9fL2kxOG4udHMgLWQgamEtSlAnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNQcmlzbWEpIHJldHVybjtcbiAgaWYgKCFoYXNQcmlzbWFTY2hlbWEocHJvamVjdCkpIHJldHVybjtcbiAgcmV0dXJuIHByaXNtYVNjcmlwdHMuZ2VuZXJhdGUocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGdldENoYWtyYVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0BjaGFrcmEtdWkvY2xpJykpIHJldHVybjtcbiAgaWYgKCFmaWxlRXhpc3RzKHByb2plY3QsICdzcmMvdGhlbWUudHMnKSkgcmV0dXJuO1xuICByZXR1cm4gJ1lBUk4gY2hha3JhIHR5cGVnZW4gc3JjL3RoZW1lLnRzIC0tc3RyaWN0Jztcbn1cblxuZnVuY3Rpb24gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuO1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgLy8gS2VlcCB0aGUgZXhwbGljaXQgLS1jb25maWcgYmVjYXVzZSBkcml6emxlLWtpdCdzIGRlZmF1bHQgbG9va3VwIG1pc3NlcyBzb21lIGV4dGVuc2lvbnMgKGUuZy4gLm10cykuXG4gIHJldHVybiBgJHt3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgYFlBUk4gZHJpenpsZS1raXQgY2hlY2sgLS1jb25maWcgJHtjb25maWcuZmlsZU5hbWV9YCl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaGFzUHJpc21hU2NoZW1hKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsncHJpc21hL3NjaGVtYS5wcmlzbWEnLCAncHJpc21hL3NjaGVtYScsICdkYi9zY2hlbWEucHJpc21hJ10uc29tZSgoZmlsZVBhdGgpID0+XG4gICAgZmlsZUV4aXN0cyhwcm9qZWN0LCBmaWxlUGF0aClcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZURvdGVudiB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBDbG91ZGZsYXJlIFdvcmtlcnMgZG9uJ3Qgc2VlIHRoZSBwcm9jZXNzIGVudmlyb25tZW50OyB3cmFuZ2xlciBkZXYgcmVhZHMgdmFycyBmcm9tIGEgLmRldi52YXJzXG4vLyBmaWxlIG5leHQgdG8gaXRzIGNvbmZpZyBmaWxlIGluc3RlYWQuIFRoaXMgY29tbWFuZCBicmlkZ2VzIHRoZSBmbm94LW1hbmFnZWQgdmFsdWVzIHRvIHRoYXQgZmlsZS5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyAmIHsgcGF0aD86IHN0cmluZyB9PjtcblxuZXhwb3J0IGNvbnN0IGdlbkRldlZhcnNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdnZW4tZGV2LXZhcnMgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRldi52YXJzIGZpbGUgZm9yIGB3cmFuZ2xlciBkZXZgIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQgZnJvbSBmbm94IChwbHVzIFdCX0VOViBhbmQgTkVYVF9QVUJMSUNfV0JfRU5WKS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+XG4gICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIGdlbmVyYXRlZCAuZGV2LnZhcnMgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRldi52YXJzJyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFJlc3RyaWN0IHRvIHZhcmlhYmxlcyBsb2FkZWQgZnJvbSB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGVudmlyb25tZW50IHNvdXJjZXMgc28gdGhhdFxuICAgIC8vIHVucmVsYXRlZCBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZXZlciBsZWFrIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBJZ25vcmVcbiAgICAvLyBwcm9jZXNzLmVudiBiZWNhdXNlIHRoZSBwYXJlbnQgd2IgcHJvY2VzcyBpbmplY3RzIHRoZSBmbm94IHZhbHVlcyBpbnRvIGl0LCB3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBsb2FkaW5nIHRoZW0gaGVyZS4gd2JmeSBkZWNsYXJlcyB0aGUgV0JfRU5WLWZhbWlseSBrZXlzIGluIGZub3gsIHNvXG4gICAgLy8gdGhleSBhcmUgYWxyZWFkeSBpbmNsdWRlZDsgcHJvY2Vzcy1vbmx5IGtleXMgYXJlIGludGVudGlvbmFsbHkgb3V0c2lkZSB0aGlzIGFsbG93bGlzdC5cbiAgICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBmbm94IHZhbHVlcyBmb3IgY29uZmlndXJlZCBrZXlzXG4gICAgLy8gKHByb2plY3QuZW52IGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBzdGFydGAgd291bGQgc2VydmUgdGhlXG4gICAgLy8gc3RhbGUgY29uZmlndXJlZCB2YWx1ZS4gQW4gZXhwb3J0IHRoYXQgZW1wdGllcyBhIG5vbi1lbXB0eSBjb25maWd1cmVkIHZhbHVlIGlzIGRlbGliZXJhdGVcbiAgICAvLyBhbmQgbXVzdCBzdXJ2aXZlIHRoZSBlbXB0eS12YWx1ZSBmaWx0ZXIgYmVsb3cgKHVubGlrZSBgS0VZPWAgcGxhY2Vob2xkZXJzLCB3aGljaCBzdGF5XG4gICAgLy8gb21pdHRlZCBzbyB0aGV5IGNhbm5vdCBvdmVycmlkZSB3cmFuZ2xlciBgdmFyc2Agd2l0aCBlbXB0eSBzdHJpbmdzKS5cbiAgICBjb25zdCBleHBsaWNpdGx5RW1wdGllZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSAnJyAmJiBlbnZWYXJzW2tleV0gIT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gJycgfHwgZXhwbGljaXRseUVtcHRpZWRLZXlzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7cXVvdGVEb3RlbnZWYWx1ZShrZXksIHZhbHVlKX1gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZGV2LnZhcnMnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gIH0sXG59O1xuXG4vKipcbiAqIFF1b3RlIGEgdmFsdWUgZm9yIGRvdGVudiAod2hpY2ggd3JhbmdsZXIgdXNlcyBmb3IgLmRldi52YXJzKS4gRXZlcnkgY2FuZGlkYXRlIHJlcHJlc2VudGF0aW9uXG4gKiBpcyB2ZXJpZmllZCBieSBhY3R1YWxseSBwYXJzaW5nIGl0IGJhY2sgKG91ciBkb3RlbnYgcGFyc2VyIG1hdGNoZXMgd3JhbmdsZXIncyBidW5kbGVkIGRvdGVudlxuICogMTYgZm9yIHRoZXNlIGNvbnN0cnVjdHMpLCBzbyBhIHZhbHVlIGlzIGVpdGhlciBzZXJpYWxpemVkIGxvc3NsZXNzbHkgb3IgcmVqZWN0ZWQg4oCUIG5ldmVyXG4gKiBzaWxlbnRseSBjb3JydXB0ZWQuIENhbmRpZGF0ZXM6IHNpbmdsZSBxdW90ZXMgKGxpdGVyYWwgc3BhbjsgY2xvc2VkIGVhcmx5IGJ5IGFuIGFwb3N0cm9waGUpLFxuICogYmFja3RpY2tzIChlcXVhbGx5IGxpdGVyYWwpLCB0aGVuIGRvdWJsZSBxdW90ZXMgd2l0aCBlc2NhcGVkIG5ld2xpbmVzL0NScyAoZG90ZW52IGRvZXMgbm90XG4gKiB1bmVzY2FwZSBpbm5lciBcXFwiIOKAlCBhIGAjYCBhZnRlciBhbiBlbWJlZGRlZCBxdW90ZSBzdGFydHMgYSBjb21tZW50LCB3aGljaCB0aGUgcm91bmQtdHJpcFxuICogY2hlY2sgY2F0Y2hlcyBhbmQgcmVqZWN0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZURvdGVudlZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZG91YmxlUXVvdGVkQm9keSA9IHZhbHVlLnJlcGxhY2VBbGwoJ1xcbicsIFN0cmluZy5yYXdgXFxuYCkucmVwbGFjZUFsbCgnXFxyJywgU3RyaW5nLnJhd2BcXHJgKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtgJyR7dmFsdWV9J2AsIGBcXGAke3ZhbHVlfVxcYGAsIGBcIiR7ZG91YmxlUXVvdGVkQm9keX1cImBdO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHBhcnNlRG90ZW52KGAke2tleX09JHtjYW5kaWRhdGV9YClba2V5XSA9PT0gdmFsdWUpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdmFsdWUgb2YgJHtrZXl9IGNhbm5vdCBiZSBsb3NzbGVzc2x5IHNlcmlhbGl6ZWQgaW50byAuZGV2LnZhcnM7IHNpbXBsaWZ5IGl0cyBxdW90aW5nLmApO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3V0cHV0LnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzV2FybmluZ091dHB1dChvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndhcm4oPzppbmcpP3M/XFxiL2kudGVzdChvdXRwdXQucmVwbGFjZUFsbCgvXFxiKD86MHxubykgd2FybmluZ3M/XFxiL2dpLCAnJykpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0LCBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgcmVwb3J0VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMgfSBmcm9tICcuLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3QgcnVzdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncnMnXSk7XG5jb25zdCBveGZtdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgLi4ub3hsaW50RXh0ZW5zaW9ucyxcbiAgJ2NzcycsXG4gICdncWwnLFxuICAnZ3JhcGhxbCcsXG4gICdoYnMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdsZXNzJyxcbiAgJ21kJyxcbiAgJ21keCcsXG4gICdzY3NzJyxcbiAgJ3RvbWwnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjc3MnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2phdmEnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIW94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuY29uc3QgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiA9ICchKiovdGVzdHstLC99Zml4dHVyZXMvKionO1xuXG50eXBlIEJ1ZmZlcmVkTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkUnVuUmVzdWx0ICYgeyBjb21tYW5kOiBzdHJpbmc7IGN3ZDogc3RyaW5nIH07XG50eXBlIExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgfCB7IGV4aXRDb2RlOiBudW1iZXIgfTtcbmludGVyZmFjZSBMaW50UnVuQ29tbWFuZCB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgcHJvamVjdDogUHJvamVjdDtcbn1cblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIExpbnRDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgbGludChhcmd2IGFzIExpbnRDb21tYW5kQXJndik7XG4gICAgaWYgKGV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbnQoYXJndjogTGludENvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndik7XG4gIGNvbnN0IHNob3VsZFJ1bkZvcm1hdHRlcnMgPSBCb29sZWFuKGFyZ3YuZm9ybWF0KTtcbiAgY29uc3Qgc2hvdWxkUnVuTGludGVycyA9ICFhcmd2LmZvcm1hdCB8fCBhcmd2LmZpeDtcbiAgLy8gVGhlIHRlc3QgbGF5b3V0IGlzIGEgc3RhdGljIHN0cnVjdHVyYWwgcnVsZSwgc28gYHdiIGxpbnRgIGlzIGl0cyBob21lOiBgd2IgdmVyaWZ5YCAodmlhIGl0c1xuICAvLyBjbGVhbnVwIHN0ZXApIGFuZCBDSSdzIGxpbnQgam9iIHRoZW4gZW5mb3JjZSBpdCB3aXRoIG5vIGV4dHJhIHdpcmluZywgYW5kIGEgc3RyYXkgdGVzdCBmaWxlXG4gIC8vIHN1cmZhY2VzIGhlcmUgaW5zdGVhZCBvZiBhdCBgd2IgdGVzdGAsIHdoZXJlIGAtLXBhc3NXaXRoTm9UZXN0c2Agd291bGQgb3RoZXJ3aXNlIGxldCB0aGUgc3VpdGVcbiAgLy8gcGFzcyB3aGlsZSBzaWxlbnRseSBydW5uaW5nIG5vbmUgb2YgaXQuIFJlcG9ydGVkIGJlZm9yZSB0aGUgbGludGVycyBydW4gc28gdGhlIGRpYWdub3NpcyBsZWFkc1xuICAvLyB0aGUgb3V0cHV0LCBidXQgbmV2ZXIgc2hvcnQtY2lyY3VpdHMgdGhlbTogYC0tZml4IC0tZm9ybWF0YCBtdXN0IHN0aWxsIGNsZWFuIHVwIHdoYXQgaXQgY2FuLFxuICAvLyBiZWNhdXNlIGEgbGF5b3V0IHZpb2xhdGlvbiBpcyBub3QgYXV0by1maXhhYmxlIGFuZCB3b3VsZCBvdGhlcndpc2UgYmxvY2sgZXZlcnkgb3RoZXIgZml4LlxuICAvLyBUaHJlZSBydW4gc2hhcGVzIG9wdCBvdXQuIEV4cGxpY2l0LXBhdGggcnVucyAoZS5nLiB0aGUgbGVmdGhvb2sgcHJlLWNvbW1pdCBob29rKSBza2lwIGl0IHNvIGFcbiAgLy8gcHJlLWV4aXN0aW5nIHZpb2xhdGlvbiBpbiBhbiB1bnRvdWNoZWQgcGFja2FnZSBjYW5ub3QgYmxvY2sgYW4gdW5yZWxhdGVkIGNvbW1pdC4gYC0tZHJ5LXJ1bmBcbiAgLy8gc2tpcHMgaXQgc28gdGhpcyBzdGF5cyB0aGUgb25lIHN0ZXAgdGhhdCBjb3VsZCBmYWlsIGEgcnVuIHdob3NlIHdob2xlIGNvbnRyYWN0IGlzIHRvIGV4ZWN1dGVcbiAgLy8gbm90aGluZy4gRm9ybWF0dGVyLW9ubHkgcnVucyAoYC0tZm9ybWF0YCB3aXRob3V0IGAtLWZpeGApIHNraXAgaXQgYmVjYXVzZSB0aGV5IGxpbnQgbm90aGluZyBhdFxuICAvLyBhbGwsIGFuZCB3YmZ5IGNoYWlucyB0aGF0IHNjcmlwdCBhcyBgYnVuIHdiIGxpbnQgLS1mb3JtYXQgJiYgYnVuIHJ1biBmb3JtYXQtY29kZWAgZm9yIERhcnQgYW5kXG4gIC8vIFB5dGhvbiByZXBvc2l0b3JpZXMg4oCUIGZhaWxpbmcgaXQgdGhlcmUgd291bGQgc2lsZW50bHkgc3RyaXAgdGhlaXIgb25seSBmb3JtYXR0aW5nIHBhc3MuXG4gIGNvbnN0IHZpb2xhdGVzVGVzdFN0cnVjdHVyZSA9XG4gICAgc2hvdWxkUnVuTGludGVycyAmJiAhYXJndi5kcnlSdW4gJiYgZmlsZXMubGVuZ3RoID09PSAwICYmIHJlcG9ydFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIC8vIGBjYXJnbyBmbXQgLS1hbGxgIGFsd2F5cyBmb3JtYXRzIHRoZSB3aG9sZSB3b3Jrc3BhY2UsIHNvIHdlIHRyYWNrIHRhcmdldFxuICAvLyBwcm9qZWN0cyByYXRoZXIgdGhhbiBpbmRpdmlkdWFsIGZpbGUgcGF0aHMuIEV2ZXJ5IHByb2plY3Qgd2l0aCBpdHMgb3duXG4gIC8vIGBDYXJnby50b21sYCBydW5zIGl0cyBvd24gYGNhcmdvIGZtdCAtLWFsbGA7IHdlIGludGVudGlvbmFsbHkgZG8gbm90IGRlZHVwXG4gIC8vIGJ5IGRpcmVjdG9yeS4gQSBuZXN0ZWQgb3Igc2libGluZyBjcmF0ZSBjYW4gYmUgYW4gaW5kZXBlbmRlbnQgQ2FyZ29cbiAgLy8gd29ya3NwYWNlIHRoYXQgYSBwYXJlbnQncyBgY2FyZ28gZm10IC0tYWxsYCBuZXZlciByZWFjaGVzLCBzbyBza2lwcGluZyBpdFxuICAvLyB3b3VsZCBsZWF2ZSBpdCB1bmZvcm1hdHRlZCwgd2hpbGUgYW55IGdlbnVpbmVseSBvdmVybGFwcGluZyBydW5zIGFyZVxuICAvLyBoYXJtbGVzcyBiZWNhdXNlIHJ1c3RmbXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgaWRlbXBvdGVudC4gRGVkdXBpbmcgYnkgcmVhbFxuICAvLyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCB3b3VsZCByZXF1aXJlIGludm9raW5nIGBjYXJnbyBsb2NhdGUtcHJvamVjdGAuXG4gIGNvbnN0IGNhcmdvRm9ybWF0UHJvamVjdHMgPSBuZXcgU2V0PFByb2plY3Q+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzQ2FyZ29Ub21sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcnVzdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY2FyZ29Gb3JtYXRQcm9qZWN0cy5hZGQocHJvamVjdCk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIHByZXNlcnZlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGxpbnRGaWxlUGF0aHNdIG9mIGxpbnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2LCBweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzXSBvZiBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBjYXJnb0Zvcm1hdFByb2plY3RzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgb3hmbXRGaWxlUGF0aHNdIG9mIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3duU291cmNlQ29kZSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBpZiAobGludENvbW1hbmQpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2KSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNDYXJnb1RvbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBsaW50RXhpdENvZGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhmb3JtYXR0ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMoZm9ybWF0dGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmZvcm1hdHRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgaWYgKHByZXR0aWVyQXJncy5sZW5ndGggPiAwICYmIHByb2plY3RzLnNlbGYuaGFzUHJldHRpZXIpIHtcbiAgICAgIGNvbnN0IHByZXR0aWVyUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgJ3ByZXR0aWVyJyxcbiAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICctLXdyaXRlJyxcbiAgICAgICAgICAnLS0nLFxuICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbcHJldHRpZXJSZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChwcmV0dGllclJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvcnRQYWNrYWdlSnNvblJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnLS0nLCAuLi5zb3J0UGFja2FnZUpzb25BcmdzXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbc29ydFBhY2thZ2VKc29uUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2goc29ydFBhY2thZ2VKc29uUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgIGNvbnN0IGxpbnRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMobGludGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGxpbnRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5saW50ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcbiAgfVxuXG4gIHJldHVybiBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkgfHwgdmlvbGF0ZXNUZXN0U3RydWN0dXJlID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kcyhcbiAgY29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10sXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdFtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChjb21tYW5kcy5tYXAoKHsgY29tbWFuZCwgcHJvamVjdCB9KSA9PiBydW5MaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKSkpO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdCkgPT4gKHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKGV4aXRDb2RlKSA9PiAoeyBleGl0Q29kZSB9KSk7XG59XG5cbmZ1bmN0aW9uIHByaW50U2lsZW50TGludE91dHB1dHMoXG4gIHJlc3VsdHM6IExpbnRSdW5SZXN1bHRbXSxcbiAgYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICdwcmludEFsbE91dHB1dCcgfCAnc2lsZW50Jz5cbik6IHZvaWQge1xuICBjb25zdCBwcmludGFibGVSZXN1bHRzID1cbiAgICBhcmd2LnNpbGVudCAmJiAhYXJndi5wcmludEFsbE91dHB1dFxuICAgICAgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiAnb3V0cHV0JyBpbiByZXN1bHQgJiYgc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpKVxuICAgICAgOiByZXN1bHRzO1xuICBpZiAocHJpbnRhYmxlUmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBwcmludGFibGVSZXN1bHRzKSB7XG4gICAgaWYgKCEoJ291dHB1dCcgaW4gcmVzdWx0KSkgY29udGludWU7XG5cbiAgICBpZiAoYXJndi5wcmludEFsbE91dHB1dCkge1xuICAgICAgcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmd2LnNpbGVudCkge1xuICAgICAgICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuICAgICAgfVxuICAgICAgcHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0OiBCdWZmZXJlZExpbnRSdW5SZXN1bHQpOiB2b2lkIHtcbiAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcblxuICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChyZXN1bHQuY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dC50cmltKCk7XG4gIGlmIChvdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRIZWFkZXIoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnIG94Zm10ICcpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJyBzb3J0LXBhY2thZ2UtanNvbiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzVHlwZUF3YXJlT3hsaW50Jz4sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgIC8vIFR5cGUtYXdhcmUgbW9kZSBtYWtlcyBveGxpbnQgcmVwb3J0IHR5cGUtY2hlY2sgZGlhZ25vc3RpY3MuIFBhc3MgdGhlIGZsYWdzIGV4cGxpY2l0bHlcbiAgICAgIC8vIGJlY2F1c2Ugb3hsaW50IHJlamVjdHMgdGhlIGVxdWl2YWxlbnQgb3B0aW9ucyBpbiBub24tcm9vdCBjb25maWdzLCBzbyBwZXItcGFja2FnZSBydW5zXG4gICAgICAvLyBpbiBtb25vcmVwb3Mgd291bGQgb3RoZXJ3aXNlIG1pc3MgdHlwZSBlcnJvcnMuXG4gICAgICAuLi4ocHJvamVjdC5oYXNUeXBlQXdhcmVPeGxpbnQgPyBbJy0tdHlwZS1hd2FyZScsICctLXR5cGUtY2hlY2snXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLXF1aWV0J10gOiBbXSksXG4gICAgICAuLi4oYXJndi5maXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3hmbXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICdZQVJOJyxcbiAgICAnb3hmbXQnLFxuICAgICctLXdyaXRlJyxcbiAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICAnISoqL3BhY2thZ2UuanNvbicsXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gdG9MaW50VGFyZ2V0cyhmaWxlcyk7XG4gIHJldHVybiBbXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2lzb3J0JywgJy0tcHJvZmlsZScsICdibGFjaycsICctLWZpbHRlci1maWxlcycsIC4uLnRhcmdldHNdKSxcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnYmxhY2snLCAuLi50YXJnZXRzXSksXG4gIF0uam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2OiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sIGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50b0xpbnRUYXJnZXRzKGZpbGVzKV0pO1xufVxuXG5mdW5jdGlvbiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpOiBzdHJpbmcge1xuICAvLyBGb3JtYXR0aW5nIG11c3QgZ28gdGhyb3VnaCBjYXJnbyAobm90IHJ1c3RmbXQgb24gaW5kaXZpZHVhbCBmaWxlcykgc28gZWFjaFxuICAvLyBjcmF0ZSdzIGVkaXRpb24gYW5kIHJ1c3RmbXQgY29uZmlndXJhdGlvbiBhcmUgcmVzcGVjdGVkOyBgLS1hbGxgIGNvdmVyc1xuICAvLyBldmVyeSB3b3Jrc3BhY2UgbWVtYmVyIGFuZCBpcyBhIG5vLW9wIHN1ZmZpeCBmb3Igc2luZ2xlLWNyYXRlIHByb2plY3RzLlxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydjYXJnbycsICdmbXQnLCAnLS1hbGwnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRvTGludFRhcmdldHMoZmlsZXMpXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRMaW50Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udG9MaW50VGFyZ2V0cyhmaWxlcyldKTtcbn1cblxuZnVuY3Rpb24gdG9MaW50VGFyZ2V0cyhmaWxlczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5jb25zdCBzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyA9IDEwMDtcbmNvbnN0IHN0YWxlUHJvY2Vzc01heFBvbGxzID0gMTA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpO1xuICBpZiAoIWF2YWlsYWJsZSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0KTtcbn1cblxuZnVuY3Rpb24ga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBwaWQgb2YgbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydCkpIHtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydDogbnVtYmVyKTogbnVtYmVyW10ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YCwgJy1zVENQOkxJU1RFTiddLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICAgIHJldHVybiBzdGRvdXRcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKChwaWQpID0+IE51bWJlcihwaWQudHJpbSgpKSlcbiAgICAgIC5maWx0ZXIoKHBpZCkgPT4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlU3RhbGVQcm9jZXNzKHBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhbGVQcm9jZXNzTWF4UG9sbHM7IGkrKykge1xuICAgIGF3YWl0IHNldFRpbWVvdXQoc3RhbGVQcm9jZXNzUG9sbEludGVydmFsTXMpO1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFU1JDSCcpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzLCByZW1vdmVTdGFsZVByb2Nlc3MgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2RlbGF5LW1zJzoge1xuICAgIGRlZmF1bHQ6IDUwMDAsXG4gICAgZGVzY3JpYmU6ICdEZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xudHlwZSBNYWludGVuYW5jZUFyZ3YgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPiAmIHtcbiAgYWN0aW9uOiAnc3RhcnQnIHwgJ3N0b3AnO1xufTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMgPSA1O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMgPSAxMDA7XG5jb25zdCBtYXhUaW1lb3V0RGVsYXlNcyA9IDJfMTQ3XzQ4M182NDc7XG5jb25zdCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUgPSAnLndiJztcbmNvbnN0IG1haW50ZW5hbmNlSHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJqYVwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj5cbiAgICA8dGl0bGU+44Oh44Oz44OG44OK44Oz44K55LitPC90aXRsZT5cbiAgICA8c3R5bGU+XG4gICAgICBib2R5IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgICB9XG5cbiAgICAgIG1haW4ge1xuICAgICAgICBwYWRkaW5nOiAyNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAyOHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xuICAgICAgfVxuXG4gICAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS44O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bWFpbj5cbiAgICAgIDxoMT7nj77lnKjjg6Hjg7Pjg4bjg4rjg7PjgrnkuK3jgafjgZk8L2gxPlxuICAgICAgPHA+55qG5qeY44Gr44Gv44GU5LiN5L6/44KS44GK44GL44GR44GX44G+44GZ44GM44CB44Oh44Oz44OG44OK44Oz44K557WC5LqG44G+44Gn44GX44Gw44KJ44GP44GK5b6F44Gh44GP44Gg44GV44GE44CCPC9wPlxuICAgIDwvbWFpbj5cbiAgPC9ib2R5PlxuPC9odG1sPmA7XG5cbmV4cG9ydCBjb25zdCBtYWludGVuYW5jZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTWFpbnRlbmFuY2VBcmd2PiA9IHtcbiAgY29tbWFuZDogJ21haW50ZW5hbmNlIDxhY3Rpb24+JyxcbiAgZGVzY3JpYmU6ICdTdGFydCBvciBzdG9wIGEgbGlnaHR3ZWlnaHQgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuIEV4YW1wbGU6IHdiIG1haW50ZW5hbmNlIHN0YXJ0JyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzXG4gICAgICAucG9zaXRpb25hbCgnYWN0aW9uJywge1xuICAgICAgICBjaG9pY2VzOiBbJ3N0YXJ0JywgJ3N0b3AnXSBhcyBjb25zdCxcbiAgICAgICAgZGVzY3JpYmU6ICdNYWludGVuYW5jZSBzZXJ2ZXIgYWN0aW9uJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcikgYXMgdW5rbm93biBhcyBBcmd2PE1haW50ZW5hbmNlQXJndj4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gYXJndi5hY3Rpb247XG4gICAgaWYgKHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2UgJHthY3Rpb259IGJlY2F1c2UgV0JfRU5WIGlzIHRlc3QuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChwcm9qZWN0LmVudi5QT1JUKTtcbiAgICBpZiAoYWN0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgICBhd2FpdCBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQsIGFyZ3YuZGVsYXlNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgYXdhaXQgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGFzc2VydC5vayhOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpICYmIHBvcnQgPiAwLCBgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlciwgZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFzc2VydC5vayhcbiAgICBOdW1iZXIuaXNGaW5pdGUoZGVsYXlNcykgJiYgZGVsYXlNcyA+PSAwICYmIGRlbGF5TXMgPD0gbWF4VGltZW91dERlbGF5TXMsXG4gICAgYGRlbGF5LW1zIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke21heFRpbWVvdXREZWxheU1zfTogJHtkZWxheU1zfWBcbiAgKTtcblxuICBjb25zdCBwaWRGaWxlUGF0aCA9IGF3YWl0IHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwcm9jZXNzLnBpZCk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU2lnbmFsSGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KGRlbGF5TXMsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0KTtcbiAgICBpZiAoIXNlcnZlcikgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBTdGFydGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgYXdhaXQgd2FpdEZvclNodXRkb3duKHNlcnZlcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGF3YWl0IGNsZWFudXAoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgdW5kZWZpbmVkPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHNlcnZlciwgcG9ydCwgaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IpO1xuICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScgJiYgYXR0ZW1wdCA8IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlIHNlcnZlciBiZWNhdXNlIHBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQsIGVycik7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBtYWludGVuYW5jZSBzZXJ2ZXIgc3RhcnR1cCBzdGF0ZS4nKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydDogbnVtYmVyLCBlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKTogbmV2ZXIge1xuICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICBjb25zb2xlLmluZm8oYFN0b3BwZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTogaHR0cC5TZXJ2ZXIge1xuICByZXR1cm4gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLXN0b3JlJyxcbiAgICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgICB9KTtcbiAgICByZXNwb25zZS5lbmQobWFpbnRlbmFuY2VIdG1sKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKFxuICBzZXJ2ZXI6IGh0dHAuU2VydmVyLFxuICBwb3J0OiBudW1iZXIsXG4gIG9uUnVudGltZUVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uU3RhcnR1cEVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgICBzZXJ2ZXIub24oJ2Vycm9yJywgb25SdW50aW1lRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMC4wLjAuMCcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclNodXRkb3duKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzaHV0ZG93biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIGNsb3NlIG1haW50ZW5hbmNlIHNlcnZlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9O1xuICAgIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VSUl9TRVJWRVJfTk9UX1JVTk5JTkcnKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLmNsb3NlQWxsQ29ubmVjdGlvbnMoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHBpZEZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShwaWRGaWxlUGF0aCwgYCR7cHJvY2Vzcy5waWR9XFxuYCwgJ3V0ZjgnKTtcbiAgcmV0dXJuIHBpZEZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICBpZiAocGlkICE9PSB1bmRlZmluZWQgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCkge1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwaWQsICdTSUdURVJNJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQpO1xuICB9XG4gIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcGlkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkUGlkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleHBlY3RlZFBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gICAgaWYgKHBpZCAhPT0gZXhwZWN0ZWRQaWQpIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy5ybShwaWRGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaWRUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUocGlkRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKHBpZFRleHQudHJpbSgpKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgPyBwaWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LnJvb3REaXJQYXRoLCBwb3J0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocm9vdERpclBhdGg6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyb290RGlyUGF0aCwgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lLCBgbWFpbnRlbmFuY2UtJHtwb3J0fS5waWRgKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbi8qKlxuICogTWF0ZXJpYWxpemF0aW9uIG9mIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCByZWdpc3RyeSAoVmVyZGFjY2lvKSBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHM6XG4gKiB0aGUgcGFja2FnZXMgYXJlIGRvd25sb2FkZWQgb24gdGhlIGhvc3QgKGF1dGggdmlhIH4vLm5wbXJjIGxvY2FsbHksIG9yIGEgdGVtcG9yYXJ5IC5ucG1yYyBwbHVzXG4gKiBWRVJEQUNDSU9fVE9LRU4gb24gQ0kpIGFuZCBleHRyYWN0ZWQgbmV4dCB0byB0aGUgcmVwb3NpdG9yeSBzbyBpbWFnZSBidWlsZHMgbmVlZCBubyByZWdpc3RyeSBjcmVkZW50aWFsc1xuICogKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15Ad2lsbGJvb3N0ZXIoPzotcHJpdmF0ZSk/XFwvLywgJycpO1xufVxuXG4vLyBgZ2l0OmAvYGdpdCtgL2BnaXRAYCAobm90IHRoZSBiYXJlIHdvcmQgYGdpdGApOiBucG0gYWxsb3dzIGFyYml0cmFyeSBkaXN0LXRhZ3MsIHNvIGEgdGFnIG5hbWVkXG4vLyBgZ2l0YCBvciBgZ2l0LW5leHRgIG11c3Qgc3RpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ2lzdHJ5IHNwZWNpZmllci5cbmNvbnN0IG5vblJlZ2lzdHJ5U3BlY2lmaWVyUHJlZml4ZXMgPSBbXG4gICdnaXQ6JyxcbiAgJ2dpdCsnLFxuICAnZ2l0QCcsXG4gICdmaWxlOicsXG4gICdsaW5rOicsXG4gICd3b3Jrc3BhY2U6JyxcbiAgJ2h0dHA6JyxcbiAgJ2h0dHBzOicsXG4gICdwb3J0YWw6JyxcbiAgJ3BhdGNoOicsXG5dO1xuXG4vLyBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igd2hpY2ggZ2l0IHNwZWNpZmllcnMgdGhlIHByaXZhdGUtcGFja2FnZSB0b29saW5nIHN1cHBvcnRzOlxuLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcyBleGFjdGx5IHRoZXNlLCBhbmQgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgIG11c3Rcbi8vIHJld3JpdGUgZXhhY3RseSB0aGVzZSAocmV3cml0aW5nIG90aGVyIG9yZ3MnIFNTSCBVUkxzIHdvdWxkIHBvaW50IGF0IG5ldmVyLW1hdGVyaWFsaXplZCBwYXRocykuXG5jb25zdCBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4gPSAvXmdpdEBnaXRodWJcXC5jb206KD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpXFwvW14vI10rKD86XFwuZ2l0KT8oPzojLiopPyQvO1xuXG4vLyBSZXR1cm5zIGJvb2xlYW4gKG5vdCBhIGB2YWx1ZSBpcyBzdHJpbmdgIHByZWRpY2F0ZSk6IGEgcHJlZGljYXRlIHdvdWxkIG5hcnJvdyB0aGUgbmVnYXRpdmVcbi8vIGJyYW5jaCB0byBgdW5kZWZpbmVkYCBhbmQgYnJlYWsgYGVsc2UgaWZgIGNoYWlucyBvdmVyIGBzdHJpbmcgfCB1bmRlZmluZWRgIGRlcGVuZGVuY3kgdmFsdWVzLlxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgcHJpdmF0ZUdpdERlcGVuZGVuY3lQYXR0ZXJuLnRlc3QodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIG5hbWUuc3RhcnRzV2l0aChgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS9gKSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAhbm9uUmVnaXN0cnlTcGVjaWZpZXJQcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IHZhbHVlLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlUmVnaXN0cnlBdXRoIHtcbiAgcmVnaXN0cnlVcmw6IHN0cmluZztcbiAgYXV0aFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcmVnaXN0cnkgVVJMIGFuZCBhdXRoIHRva2VuIGZvciB0aGUgcHJpdmF0ZSBzY29wZSBmcm9tIH4vLm5wbXJjIGxvY2FsbHkuIENJIG1heSBhbHNvXG4gKiBzdXBwbHkgYSB0ZW1wb3JhcnkgcHJvamVjdCAubnBtcmM7IFZFUkRBQ0NJT19UT0tFTiBzZXJ2ZXMgYXMgaXRzIGZhbGxiYWNrIHRva2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocm9vdERpclBhdGg6IHN0cmluZyk6IFByaXZhdGVSZWdpc3RyeUF1dGggfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IG5wbXJjUGF0aHMgPSBbcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5ucG1yYycpXTtcbiAgaWYgKHByb2Nlc3MuZW52LkNJKSBucG1yY1BhdGhzLnB1c2gocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnLm5wbXJjJykpO1xuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSB7XG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW50cmllcywgcGFyc2VOcG1yYyhmcy5yZWFkRmlsZVN5bmMobnBtcmNQYXRoLCAndXRmOCcpKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG5wbXJjIGZpbGVzIGFyZSBmaW5lOyB0aGUgb3RoZXIgZmlsZSBvciBWRVJEQUNDSU9fVE9LRU4gbWF5IHN0aWxsIHByb3ZpZGUgYXV0aC5cbiAgICB9XG4gIH1cblxuICBjb25zdCByZWdpc3RyeVVybCA9IGVudHJpZXNbYCR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX06cmVnaXN0cnlgXT8ucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gIGlmICghcmVnaXN0cnlVcmwpIHJldHVybjtcblxuICAvLyBucG0tc3R5bGUgVVJJIG1hdGNoaW5nOiBub3JtYWxpemUgYm90aCBzaWRlcyB0byBhIHRyYWlsaW5nIHNsYXNoIHNvIGEgdG9rZW4gZm9yXG4gIC8vIGAvL3ZlcmRhY2Npby5leGFtcGxlLmNvbS9gIGNhbiBuZXZlciBtYXRjaCBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20tb3RoZXIub3JnL2AsIGFuZCBwaWNrIHRoZVxuICAvLyBNT1NUIFNQRUNJRklDIChsb25nZXN0KSBtYXRjaGluZyBwcmVmaXggc28gYC8vaG9zdC9wcml2YXRlL2AgYmVhdHMgYC8vaG9zdC9gLlxuICBjb25zdCBub3JtYWxpemVkUmVnaXN0cnlVcmwgPSBgJHtyZWdpc3RyeVVybC5yZXBsYWNlKC9eaHR0cHM/Oi8sICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgbGV0IG1hdGNoZWRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgbWF0Y2hlZFByZWZpeExlbmd0aCA9IC0xO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIC8vIFNraXAgZW1wdHkgdG9rZW5zIChhbiB1bnNldCBgJHtWQVJ9YCBleHBhbmRzIHRvICcnKTogYW4gZW1wdHkgbWF0Y2ggbXVzdCBub3QgZGVmZWF0IHRoZVxuICAgIC8vIFZFUkRBQ0NJT19UT0tFTiBmYWxsYmFjayBiZWxvdy5cbiAgICBpZiAoIWtleS5lbmRzV2l0aCgnOl9hdXRoVG9rZW4nKSB8fCAhdmFsdWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHByZWZpeCA9IGAke2tleS5zbGljZSgwLCAtJzpfYXV0aFRva2VuJy5sZW5ndGgpLnJlcGxhY2UoL1xcLyskLywgJycpfS9gO1xuICAgIGlmIChub3JtYWxpemVkUmVnaXN0cnlVcmwuc3RhcnRzV2l0aChwcmVmaXgpICYmIHByZWZpeC5sZW5ndGggPiBtYXRjaGVkUHJlZml4TGVuZ3RoKSB7XG4gICAgICBtYXRjaGVkUHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDtcbiAgICAgIG1hdGNoZWRUb2tlbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvLyBObyBQcm9qZWN0IGluc3RhbmNlIGV4aXN0cyBhdCB0aGlzIGxheWVyLCBzbyBwcm9jZXNzLmVudiBpcyB0aGUgb25seSBzb3VyY2UgZm9yIHRoZVxuICAvLyBDSS1pbmplY3RlZCBmYWxsYmFjayB0b2tlbi5cbiAgY29uc3QgYXV0aFRva2VuID0gbWF0Y2hlZFRva2VuID8/IHByb2Nlc3MuZW52LlZFUkRBQ0NJT19UT0tFTjtcbiAgcmV0dXJuIHsgcmVnaXN0cnlVcmwsIGF1dGhUb2tlbiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOcG1yYyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBsaW5lID0gcmF3TGluZS50cmltKCk7XG4gICAgaWYgKCFsaW5lIHx8IGxpbmUuc3RhcnRzV2l0aCgnIycpIHx8IGxpbmUuc3RhcnRzV2l0aCgnOycpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4IDw9IDApIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkudHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gbGluZVxuICAgICAgLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSlcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlQWxsKC9cXCRcXHsoW159XSspXFx9L2csIChfLCB2YXJpYWJsZU5hbWU6IHN0cmluZykgPT4gcHJvY2Vzcy5lbnZbdmFyaWFibGVOYW1lXSA/PyAnJyk7XG4gICAgZW50cmllc1trZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogRG93bmxvYWQgYW5kIGV4dHJhY3Qgb25lIHJlZ2lzdHJ5IHBhY2thZ2UgaW50byBgdGFyZ2V0RGlyUGF0aGAuIFRoZSBzcGVjaWZpZXIgbWF5IGJlIGFuIGV4YWN0XG4gKiBzZW12ZXIgdmVyc2lvbiAodGhlIG9yZydzIGNvbW1vbiBjYXNlIHZpYSBidW5maWcgYGV4YWN0ID0gdHJ1ZWApLCBhbnkgc2VtdmVyIHJhbmdlIChyZXNvbHZlZFxuICogbWF4LXNhdGlzZnlpbmcgYWdhaW5zdCB0aGUgcmVnaXN0cnkncyBwdWJsaXNoZWQgdmVyc2lvbnMsIG1hdGNoaW5nIGBucG0gaW5zdGFsbGApLCBvciBhXG4gKiBkaXN0LXRhZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nLFxuICB0YXJnZXREaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcmVzb2x2ZVZlcnNpb24oYXV0aCwgcGFja2FnZU5hbWUsIHZlcnNpb25TcGVjaWZpZXIpO1xuICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGZldGNoUmVnaXN0cnlKc29uPHsgZGlzdD86IHsgdGFyYmFsbD86IHN0cmluZyB9IH0+KFxuICAgIGF1dGgsXG4gICAgYCR7YXV0aC5yZWdpc3RyeVVybH0vJHtlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSl9LyR7dmVyc2lvbn1gXG4gICk7XG4gIGNvbnN0IHRhcmJhbGxVcmwgPSBtZXRhZGF0YS5kaXN0Py50YXJiYWxsO1xuICBpZiAoIXRhcmJhbGxVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmJhbGwgVVJMIGZvciAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259IGluICR7YXV0aC5yZWdpc3RyeVVybH0uYCk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHRhcmJhbGxVcmwpO1xuICBjb25zdCB0YXJiYWxsUGF0aCA9IHBhdGguam9pbihcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLXByaXZhdGUtcGFja2FnZS0nKSksXG4gICAgJ3BhY2thZ2UudGd6J1xuICApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh0YXJiYWxsUGF0aCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0YXJnZXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBucG0gdGFyYmFsbHMgcGxhY2UgdGhlIGNvbnRlbnQgdW5kZXIgYSB0b3AtbGV2ZWwgYHBhY2thZ2UvYCBkaXJlY3RvcnkuXG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ3RhcicsIFsnLXh6ZicsIHRhcmJhbGxQYXRoLCAnLUMnLCB0YXJnZXREaXJQYXRoLCAnLS1zdHJpcC1jb21wb25lbnRzPTEnXSwge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259ICgke3RhcmJhbGxVcmx9KS5gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5kaXJuYW1lKHRhcmJhbGxQYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVWZXJzaW9uKFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFByZXJlbGVhc2UgYW5kIGArYnVpbGRgIG1ldGFkYXRhIGFyZSBib3RoIHBhcnQgb2YgdmFsaWQgZXhhY3QgU2VtVmVyIHZlcnNpb25zLCBzbyBhbiBleGFjdFxuICAvLyBzcGVjaWZpZXIgcmVzb2x2ZXMgdG8gaXRzZWxmIHdpdGhvdXQgYSBwYWNrdW1lbnQgZmV0Y2guXG4gIGlmIChpc0V4YWN0VmVyc2lvbih2ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuIHZlcnNpb25TcGVjaWZpZXI7XG5cbiAgY29uc3QgcGFja3VtZW50ID0gYXdhaXQgZmV0Y2hSZWdpc3RyeUpzb248UGFja3VtZW50PihhdXRoLCBgJHthdXRoLnJlZ2lzdHJ5VXJsfS8ke2VuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKX1gKTtcbiAgY29uc3QgdmVyc2lvbiA9IHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KHZlcnNpb25TcGVjaWZpZXIsIHBhY2t1bWVudCk7XG4gIGlmICghdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgcmVzb2x2ZSAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb25TcGVjaWZpZXJ9IGFnYWluc3QgJHthdXRoLnJlZ2lzdHJ5VXJsfTsgdXNlIGFuIGV4YWN0IHZlcnNpb24sIGEgc2VtdmVyIHJhbmdlLCBvciBhIGRpc3QtdGFnLmBcbiAgICApO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5pbnRlcmZhY2UgUGFja3VtZW50IHtcbiAgJ2Rpc3QtdGFncyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB2ZXJzaW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIG5wbSdzIHNwZWNpZmllciBjbGFzc2lmaWNhdGlvbjogYCpgIGFuZCBkaXN0LXRhZyBuYW1lcyByZXNvbHZlIHZpYSBkaXN0LXRhZ3MgKG5wbSByZXNvbHZlcyBgKmBcbiAqIHRvIHRoZSBgbGF0ZXN0YCB0YWcpLCB3aGlsZSBhbnkgb3RoZXIgdmFsaWQgc2VtdmVyIHJhbmdlIHJlc29sdmVzIHRvIHRoZSBoaWdoZXN0IHB1Ymxpc2hlZFxuICogdmVyc2lvbiBzYXRpc2Z5aW5nIGl0LCBtYXRjaGluZyBgbnBtIGluc3RhbGxgJ3MgbWF4LXNhdGlzZnlpbmcgc2VtYW50aWNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0VmVyc2lvbkZyb21QYWNrdW1lbnQodmVyc2lvblNwZWNpZmllcjogc3RyaW5nLCBwYWNrdW1lbnQ6IFBhY2t1bWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2ZXJzaW9uU3BlY2lmaWVyICE9PSAnKicgJiYgc2VtdmVyLnZhbGlkUmFuZ2UodmVyc2lvblNwZWNpZmllcikpIHtcbiAgICByZXR1cm4gc2VtdmVyLm1heFNhdGlzZnlpbmcoT2JqZWN0LmtleXMocGFja3VtZW50LnZlcnNpb25zID8/IHt9KSwgdmVyc2lvblNwZWNpZmllcikgPz8gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBwYWNrdW1lbnRbJ2Rpc3QtdGFncyddPy5bdmVyc2lvblNwZWNpZmllciA9PT0gJyonID8gJ2xhdGVzdCcgOiB2ZXJzaW9uU3BlY2lmaWVyXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWdpc3RyeUpzb248VD4oYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCwgdXJsOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZyb21SZWdpc3RyeShhdXRoLCB1cmwpO1xuICByZXR1cm4gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgVDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hGcm9tUmVnaXN0cnkoYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCwgdXJsOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIC8vIFRhcmJhbGwgVVJMcyBjb21lIGZyb20gcmVnaXN0cnktY29udHJvbGxlZCBtZXRhZGF0YTsgYXR0YWNoIHRoZSB0b2tlbiBvbmx5IHRvIHRoZSBjb25maWd1cmVkXG4gIC8vIHJlZ2lzdHJ5J3Mgb3duIG9yaWdpbiBzbyBhIG1hbGljaW91cyBvciBtaXNjb25maWd1cmVkIHJlZ2lzdHJ5IGNhbm5vdCByZWRpcmVjdCB0aGUgY3JlZGVudGlhbFxuICAvLyB0byBhIHRoaXJkLXBhcnR5IGhvc3QuXG4gIGNvbnN0IHNlbmRBdXRoVG9rZW4gPSAhIWF1dGguYXV0aFRva2VuICYmIGlzU2FtZU9yaWdpbih1cmwsIGF1dGgucmVnaXN0cnlVcmwpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHNlbmRBdXRoVG9rZW4gPyB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoLmF1dGhUb2tlbn1gIH0gOiB7fSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW4odXJsOiBzdHJpbmcsIHJlZ2lzdHJ5VXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwpLm9yaWdpbiA9PT0gbmV3IFVSTChyZWdpc3RyeVVybCkub3JpZ2luO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYWNrYWdlTmFtZS5yZXBsYWNlKCcvJywgJyUyRicpO1xufVxuXG4vLyBUaGUgb2ZmaWNpYWwgU2VtVmVyIDIuMC4wIGdyYW1tYXIgKHNlbXZlci5vcmcpLCBhbmNob3JlZDogbnVtZXJpYy1sb29raW5nIGRpc3QtdGFncyBzdWNoIGFzXG4vLyBgMS4yLjNsYXRlc3RgLCBsZWFkaW5nLXplcm8gdmVyc2lvbnMgKGAwMS4yLjNgKSwgYW5kIHVuZGVyc2NvcmUgaWRlbnRpZmllcnMgYXJlIE5PVCB2ZXJzaW9ucyDigJRcbi8vIHJlc29sdmVWZXJzaW9uIHRyZWF0cyB0aGVtIGFzIHRhZ3MsIG1hdGNoaW5nIG5vZGUtc2VtdmVyJ3MgY2xhc3NpZmljYXRpb24uXG5jb25zdCBleGFjdFNlbXZlclBhdHRlcm4gPVxuICAvXig/OjB8WzEtOV1cXGQqKVxcLig/OjB8WzEtOV1cXGQqKVxcLig/OjB8WzEtOV1cXGQqKSg/Oi0oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikoPzpcXC4oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikpKik/KD86XFwrWzAtOWEtekEtWi1dKyg/OlxcLlswLTlhLXpBLVotXSspKik/JC87XG5cbi8qKiBXaGV0aGVyIHRoZSBzcGVjaWZpZXIgaXMgYW4gZXhhY3QgU2VtVmVyIHZlcnNpb24gKG5vdCBhIHJhbmdlLCB0YWcsIG9yIGdpdCBVUkwpLiAqL1xuZnVuY3Rpb24gaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc3BlY2lmaWVyICYmIGV4YWN0U2VtdmVyUGF0dGVybi50ZXN0KHNwZWNpZmllcik7XG59XG5cbi8qKlxuICogV2hldGhlciBFVkVSWSB2ZXJzaW9uIGBzcGVjaWZpZXJgIGNhbiByZXNvbHZlIHRvIGFsc28gc2F0aXNmaWVzIGByZXF1aXJlbWVudGAgKGV4YWN0IHZlcnNpb25zXG4gKiBjb3VudCBhcyBzaW5nbGUtdmVyc2lvbiByYW5nZXMpLiBDb25mbGljdCBjaGVja3MgdXNlIHRoaXMgYmVjYXVzZSB0aGUgYWN0dWFsbHkgcmVzb2x2ZWQgdmVyc2lvblxuICogaXMgdW5rbm93biBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGlzIGNvbnN1bHRlZDogYSBzdWJzZXQgc3BlY2lmaWVyJ3MgbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBpc1xuICogZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSB3aWRlciByZXF1aXJlbWVudC4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMpIGFyZSBub3RcbiAqIGNvbXBhcmFibGUgYW5kIHJldHVybiBmYWxzZSDigJQgY2FsbGVycyBhY2NlcHQgdGhvc2Ugb25seSBvbiBleGFjdCBzdHJpbmcgZXF1YWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGVjaWZpZXJTdWJzZXQoc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJlcXVpcmVtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKHNwZWNpZmllciA9PT0gdW5kZWZpbmVkIHx8IHJlcXVpcmVtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgLy8gYCpgIHJlc29sdmVzIHRocm91Z2ggdGhlIGBsYXRlc3RgIGRpc3QtdGFnIChzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCksIG5vdCBhcyBhIHJhbmdlLCBzb1xuICAvLyBpdCBpcyBub3Qgc3RhdGljYWxseSBjb21wYXJhYmxlIGluIGVpdGhlciBwb3NpdGlvbi5cbiAgaWYgKHNwZWNpZmllciA9PT0gJyonIHx8IHJlcXVpcmVtZW50ID09PSAnKicpIHJldHVybiBmYWxzZTtcbiAgLy8gQnVpbGQgbWV0YWRhdGEgZGlzdGluZ3Vpc2hlcyByZWdpc3RyeSBhcnRpZmFjdHMgKHJlc29sdmVWZXJzaW9uIGZldGNoZXMgYW4gZXhhY3Qgc3BlY2lmaWVyXG4gIC8vIHZlcmJhdGltKSBidXQgc2VtdmVyIGNvbXBhcmlzb25zIGlnbm9yZSBpdCwgc28gdHdvIGV4YWN0IHZlcnNpb25zIG11c3QgbWF0Y2ggYXMgc3RyaW5ncy5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikgJiYgaXNFeGFjdFZlcnNpb24ocmVxdWlyZW1lbnQpKSByZXR1cm4gc3BlY2lmaWVyID09PSByZXF1aXJlbWVudDtcbiAgaWYgKCFzZW12ZXIudmFsaWRSYW5nZShzcGVjaWZpZXIpIHx8ICFzZW12ZXIudmFsaWRSYW5nZShyZXF1aXJlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHNlbXZlci5zdWJzZXQoc3BlY2lmaWVyLCByZXF1aXJlbWVudCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbWF0ZXJpYWxpemVkIGB2ZXJzaW9uYCBjYW4gYmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIHJlZ2lzdHJ5IGBzcGVjaWZpZXJgLlxuICogRGlzdC10YWdzIChpbnZhbGlkIHJhbmdlcykgYXJlIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhbmQgcGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBCdWlsZCBtZXRhZGF0YSBkaXN0aW5ndWlzaGVzIHJlZ2lzdHJ5IGFydGlmYWN0cywgc28gYW4gZXhhY3Qgc3BlY2lmaWVyIGFkbWl0cyBvbmx5IHRoZVxuICAvLyBpZGVudGljYWwgdmVyc2lvbiBzdHJpbmcuXG4gIGlmIChpc0V4YWN0VmVyc2lvbihzcGVjaWZpZXIpKSByZXR1cm4gc3BlY2lmaWVyID09PSB2ZXJzaW9uO1xuICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikpIHJldHVybiB0cnVlO1xuICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGluc3RhbGxlZCBgdmVyc2lvbmAgaXMgc3RhdGljYWxseSBLTk9XTiB0byBzYXRpc2Z5IHRoZSByZWdpc3RyeSBgc3BlY2lmaWVyYC5cbiAqIERpc3QtdGFncyAoaW52YWxpZCByYW5nZXMpIGFyZSBub3Qgc3RhdGljYWxseSBjaGVja2FibGUgYW5kIHJldHVybiBmYWxzZSDigJQgdW5saWtlXG4gKiBtYXRlcmlhbGl6ZWRWZXJzaW9uU2F0aXNmaWVzLCBjYWxsZXJzIHVzZSB0aGlzIHRvIGRlY2lkZSB3aGV0aGVyIGFuIGluc3RhbGxlZCBjb3B5IGNhbiByZXBsYWNlXG4gKiBhIHJlZ2lzdHJ5IGRvd25sb2FkLCBzbyB1bmNlcnRhaW50eSBtdXN0IGZhbGwgYmFjayB0byBkb3dubG9hZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgKmAgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgYGxhdGVzdGAgZGlzdC10YWcgKHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KSwgc28gbGlrZSBhbnkgb3RoZXJcbiAgLy8gZGlzdC10YWcgaXQgaXMgbm90IHN0YXRpY2FsbHkgY2hlY2thYmxlIGFnYWluc3QgYW4gaW5zdGFsbGVkIHZlcnNpb24uXG4gIGlmIChzcGVjaWZpZXIgPT09ICcqJykgcmV0dXJuIGZhbHNlO1xuICAvLyByZXNvbHZlVmVyc2lvbiBmZXRjaGVzIGFuIGV4YWN0IHNwZWNpZmllciB2ZXJiYXRpbSAoYnVpbGQgbWV0YWRhdGEgaW5jbHVkZWQpLCBzbyBhbiBpbnN0YWxsZWRcbiAgLy8gY29weSBtYXkgcmVwbGFjZSB0aGUgZG93bmxvYWQgb25seSB3aGVuIHRoZSB2ZXJzaW9uIHN0cmluZ3MgbWF0Y2ggZXhhY3RseS5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikpIHJldHVybiBzcGVjaWZpZXIgPT09IHZlcnNpb247XG4gIHJldHVybiAhIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikgJiYgc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGZpbmRSb290QW5kU2VsZlByb2plY3RzLCB0eXBlIEZvdW5kUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJpdmF0ZVJlZ2lzdHJ5QXV0aCB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVSZWdpc3RyeS5qcyc7XG5pbXBvcnQge1xuICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UsXG4gIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIHNwZWNpZmllclN1YnNldCxcbiAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbnRlcmZhY2UgUHJpdmF0ZVBhY2thZ2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6ICdnaXQnIHwgJ3JlZ2lzdHJ5JztcbiAgLyoqXG4gICAqIFVuZGVmaW5lZCBmb3IgcmVnaXN0cnkgcGFja2FnZXMgdGhhdCBtdXN0IGJlIGRvd25sb2FkZWQ7IHNldCBmb3IgZ2l0IHBhY2thZ2VzIGFuZCBmb3JcbiAgICogcmVnaXN0cnkgcGFja2FnZXMgd2hvc2UgaW5zdGFsbGVkIGNvcHkgaW4gbm9kZV9tb2R1bGVzIGFscmVhZHkgc2F0aXNmaWVzIHRoZSBzcGVjaWZpZXJcbiAgICogKHNvIENJIHN0ZXBzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMgY2FuIHN0aWxsIG1hdGVyaWFsaXplIHRoZW0pLlxuICAgKi9cbiAgc291cmNlRGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0YXJnZXREaXJQYXRoOiBzdHJpbmc7XG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBvbmNlIGFuIGluc3RhbGxlZCBjb3B5IGlzIHNlbGVjdGVkIG9yIGEgZG93bmxvYWQgaXMgZXh0cmFjdGVkLiAqL1xuICByZXNvbHZlZFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgZGVwZW5kZW5jeUtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAnb3V0LWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RpcmVjdG9yeSB0byBjb3B5IHByaXZhdGUgcGFja2FnZXMgaW50bycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ0B3aWxsYm9vc3RlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHsgZHJ5UnVuPzogYm9vbGVhbiB9LCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cC1wcml2YXRlLXBhY2thZ2VzJyxcbiAgZGVzY3JpYmU6XG4gICAgJ01hdGVyaWFsaXplIHByaXZhdGUgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOiBjb3B5IGdpdCBkZXBlbmRlbmNpZXMsIHJldXNlIGluc3RhbGxlZCBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIHJlZ2lzdHJ5IHBhY2thZ2VzIHdob3NlIGV4YWN0LXZlcnNpb24gb3Igc2VtdmVyLXJhbmdlIHNwZWNpZmllciB0aGUgaW5zdGFsbGVkIGNvcHkgc2F0aXNmaWVzLCBhbmQgZG93bmxvYWQgdGhlIHJlc3QgKGF1dGggdmlhIC5ucG1yYyAvIH4vLm5wbXJjIGxvY2FsbHksIG9yIFZFUkRBQ0NJT19UT0tFTiBvbiBDSTsgZGlzdC10YWcgc3BlY2lmaWVycyBzdWNoIGFzIGBsYXRlc3RgIGFsd2F5cyBkb3dubG9hZCkuICcgK1xuICAgICdUaGUgRG9ja2VyZmlsZSBtdXN0IENPUFkgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyAoZS5nLiBgQ09QWSBAd2lsbGJvb3N0ZXIvIEB3aWxsYm9vc3Rlci9gIGFuZCBgQ09QWSBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8gQHdpbGxib29zdGVyLXByaXZhdGUvYCkgc28gdGhlIGluLWltYWdlIGluc3RhbGwgcmVzb2x2ZXMgdGhlIHJld3JpdHRlbiBmaWxlOiBwYXRocy4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCByb290QW5kU2VsZiA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXJvb3RBbmRTZWxmKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFJlc29sdmUgdGhlIGRlc2NlbmRhbnQgc2V0IGZyb20gdGhlIHJlcG9zaXRvcnkgUk9PVCAobm90IHRoZSBjdXJyZW50IGRpcmVjdG9yeSkgc28gdGhlXG4gICAgLy8gY29tbWFuZCBzY2FucyB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0IHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaXQgcnVuczpcbiAgICAvLyBmaW5kRGVzY2VuZGFudFByb2plY3RzIHJldHVybnMgb25seSB0aGUgY3VycmVudCBwcm9qZWN0IHdoZW4gaW52b2tlZCBmcm9tIGEgd29ya3NwYWNlLlxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcm9vdEFuZFNlbGYucm9vdC5kaXJQYXRoKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gU2NhbiB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0OiBhIHByaXZhdGUgZGVwZW5kZW5jeSBtYXkgYmUgZGVjbGFyZWQgaW5cbiAgICAvLyBhIHN1Yi1wYWNrYWdlIChlLmcuIHBhY2thZ2VzL3NlcnZlcikgcmF0aGVyIHRoYW4gdGhlIHJvb3QsIHlldCBpdCBzdGlsbCBtYXRlcmlhbGl6ZXMgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290IHNvIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYCByZXNvbHZlcyBpdCB1bmlmb3JtbHkuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0cyksIHtcbiAgICAgICAgb3V0RGlyOiBhcmd2Lm91dERpcixcbiAgICAgICAgZHJ5UnVuOiBCb29sZWFuKGFyZ3YuZHJ5UnVuKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgTWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXNPcHRpb25zIHtcbiAgLyoqIERpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCkgdGhhdCBnaXQgZGVwZW5kZW5jaWVzIGFyZSBjb3BpZWQgaW50by4gKi9cbiAgb3V0RGlyPzogc3RyaW5nO1xuICBkcnlSdW4/OiBib29sZWFuO1xufVxuXG4vKiogVGhlIHJvb3QgbWFuaWZlc3QgZm9sbG93ZWQgYnkgZWFjaCBkaXN0aW5jdCB3b3Jrc3BhY2UgbWFuaWZlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0czogRm91bmRQcm9qZWN0cyk6IFBhY2thZ2VKc29uW10ge1xuICBjb25zdCBtYW5pZmVzdHNCeURpclBhdGggPSBuZXcgTWFwPHN0cmluZywgUGFja2FnZUpzb24+KCk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBbcHJvamVjdHMucm9vdCwgLi4ucHJvamVjdHMuZGVzY2VuZGFudHNdKSB7XG4gICAgaWYgKCFtYW5pZmVzdHNCeURpclBhdGguaGFzKHByb2plY3QuZGlyUGF0aCkpIG1hbmlmZXN0c0J5RGlyUGF0aC5zZXQocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnBhY2thZ2VKc29uKTtcbiAgfVxuICByZXR1cm4gWy4uLm1hbmlmZXN0c0J5RGlyUGF0aC52YWx1ZXMoKV07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdFByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0UGFja2FnZUpzb25zOiBQYWNrYWdlSnNvbltdLFxuICBvcHRpb25zOiBNYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgb3V0RGlyID0gJ0B3aWxsYm9vc3RlcicsIGRyeVJ1biA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gIC8vIE91dHB1dCBwYXRocyBhcmUgcmVjdXJzaXZlbHkgREVMRVRFRCBiZWZvcmUgYmVpbmcgcmVjcmVhdGVkLCBzbyBub25lIG9mIHRoZW0gbWF5IGNvbnRhaW4gYVxuICAvLyBzeW1saW5rIGNvbXBvbmVudDogYSBzeW1saW5rIChlLmcuIGBlc2NhcGUgLT4gbm9kZV9tb2R1bGVzYCwgb3IgYEB3aWxsYm9vc3Rlci1wcml2YXRlYFxuICAvLyBpdHNlbGYgbGlua2luZyBlbHNld2hlcmUpIHdvdWxkIGVpdGhlciBzbXVnZ2xlIHRoZSBkZWxldGUgcGFzdCB0aGUgbGV4aWNhbCBvdmVybGFwIGd1YXJkc1xuICAvLyBvciBkZXN0cm95IHRoZSBzeW1saW5rJ3MgdGFyZ2V0LiBSZWplY3RpbmcgY2Fub25pY2FsL2xleGljYWwgbWlzbWF0Y2hlcyBrZWVwcyBldmVyeVxuICAvLyBkZXN0cnVjdGl2ZSBvcGVyYXRpb24gb24gdGhlIGludGVuZGVkIGxleGljYWwgbG9jYXRpb24uIFRoZXNlIGd1YXJkcyBUSFJPVyAobm90IHByb2Nlc3MuZXhpdClcbiAgLy8gc28gdGhlIGF1dG9tYXRpYyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVgIGNhbGxlciBjYW4gY2F0Y2ggdGhlbSBhbmQgY29udGludWVcbiAgLy8gbm9uLWZhdGFsbHk7IHRoZSBleHBsaWNpdCBjb21tYW5kJ3MgaGFuZGxlciBjYXRjaGVzIGFuZCBleGl0cy5cbiAgY29uc3Qgcm9vdERpclBhdGggPSBjYW5vbmljYWxpemVQYXRoKHJvb3RQcm9qZWN0RGlyUGF0aCk7XG4gIGNvbnN0IHJlc29sdmVPdXRwdXREaXJQYXRoID0gKHJlbGF0aXZlT3JBYnNvbHV0ZVBhdGg6IHN0cmluZywgbGFiZWw6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgbGV4aWNhbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIHJlbGF0aXZlT3JBYnNvbHV0ZVBhdGgpO1xuICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSBjYW5vbmljYWxpemVQYXRoKGxleGljYWxQYXRoKTtcbiAgICBpZiAoY2Fub25pY2FsUGF0aCAhPT0gbGV4aWNhbFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtsYWJlbH0gbXVzdCBub3QgY29udGFpbiBzeW1saW5rcyAoJHtsZXhpY2FsUGF0aH0gcmVzb2x2ZXMgdG8gJHtjYW5vbmljYWxQYXRofSkuYCk7XG4gICAgfVxuICAgIHJldHVybiBsZXhpY2FsUGF0aDtcbiAgfTtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKG91dERpciwgJy0tb3V0LWRpcicpO1xuICBhc3NlcnRTdWJkaXJlY3Rvcnkocm9vdERpclBhdGgsIG91dERpclBhdGgpO1xuICAvLyBSZWdpc3RyeSBwYWNrYWdlcyBhbHdheXMgbWF0ZXJpYWxpemUgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdDogYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgXG4gIC8vIHJlc29sdmVzIHRoZW0gZnJvbSBgPHJvb3Q+L0B3aWxsYm9vc3Rlci1wcml2YXRlYCByZWdhcmRsZXNzIG9mIGAtLW91dC1kaXJgLlxuICBjb25zdCByZWdpc3RyeU91dERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIGBUaGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSBvdXRwdXQgZGlyZWN0b3J5YFxuICApO1xuICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCkpIHtcbiAgICAvLyBlLmcuIGAtLW91dC1kaXIgQHdpbGxib29zdGVyLXByaXZhdGVgIG9yIGAtLW91dC1kaXIgQHdpbGxib29zdGVyLXByaXZhdGUvc3ViYDogdGhlXG4gICAgLy8gcmVnaXN0cnkgc3RlcCByZWN1cnNpdmVseSBkZWxldGVzIHJlZ2lzdHJ5T3V0RGlyUGF0aCwgd2hpY2ggd291bGQgZGVzdHJveSB0aGUgZ2l0XG4gICAgLy8gcGFja2FnZXMgY29waWVkIGludG8gYW4gZXF1YWwgb3IgTkVTVEVEIGRpcmVjdG9yeSBtb21lbnRzIGVhcmxpZXIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGAtLW91dC1kaXIgbXVzdCBub3Qgb3ZlcmxhcCB0aGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSByZWdpc3RyeSBvdXRwdXQgZGlyZWN0b3J5LmApO1xuICB9XG4gIGNvbnN0IHN0YWdpbmdSb290RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLXN0YWdpbmcnKSwgJ1RoZSBzdGFnaW5nIGRpcmVjdG9yeScpO1xuICBjb25zdCBiYWNrdXBSb290RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLWJhY2t1cCcpLCAnVGhlIGJhY2t1cCBkaXJlY3RvcnknKTtcbiAgaWYgKHBhdGhzT3ZlcmxhcChvdXREaXJQYXRoLCBjYW5vbmljYWxpemVQYXRoKHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpKSkpIHtcbiAgICAvLyBUaGUgcmVjdXJzaXZlIGRlbGV0ZSBvZiBvdXREaXJQYXRoIHdvdWxkIGRlc3Ryb3kgdGhlIGluc3RhbGxlZCBzb3VyY2VzIHRoZSBjb3BpZXMgcmVhZC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJy0tb3V0LWRpciBtdXN0IG5vdCBvdmVybGFwIG5vZGVfbW9kdWxlcy4nKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtsYWJlbCwgdGVtcG9yYXJ5RGlyUGF0aF0gb2YgW1xuICAgIFsnc3RhZ2luZycsIHN0YWdpbmdSb290RGlyUGF0aF0sXG4gICAgWydiYWNrdXAnLCBiYWNrdXBSb290RGlyUGF0aF0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHRlbXBvcmFyeURpclBhdGgpIHx8IHBhdGhzT3ZlcmxhcChyZWdpc3RyeU91dERpclBhdGgsIHRlbXBvcmFyeURpclBhdGgpKSB7XG4gICAgICAvLyBCb3RoIGRpcmVjdG9yaWVzIGFyZSByZWN1cnNpdmVseSByZWNyZWF0ZWQsIHNpbGVudGx5IGRpc2NhcmRpbmcgYW55dGhpbmcgbWF0ZXJpYWxpemVkIGludG9cbiAgICAgIC8vIGFuIGVxdWFsIG9yIG5lc3RlZCBvdXRwdXQgZGlyZWN0b3J5IG1vbWVudHMgZWFybGllci5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0cHV0IGRpcmVjdG9yaWVzIG11c3Qgbm90IG92ZXJsYXAgdGhlICR7bGFiZWx9IGRpcmVjdG9yeSAoJHt0ZW1wb3JhcnlEaXJQYXRofSkuYCk7XG4gICAgfVxuICB9XG4gIC8vIFN0YWdpbmcgTUlSUk9SUyBlYWNoIG91dHB1dCB0cmVlJ3MgcmVwb3NpdG9yeS1yb290LXJlbGF0aXZlIGxvY2F0aW9uIChlLmcuXG4gIC8vIGA8cm9vdD4vQHdpbGxib29zdGVyLXByaXZhdGUvYWAgc3RhZ2VzIGF0IGA8c3RhZ2luZz4vQHdpbGxib29zdGVyLXByaXZhdGUvYWApLCBzbyB0aGUgcmVsYXRpdmVcbiAgLy8gZGlzdGFuY2UgYmV0d2VlbiBhbnkgdHdvIHN0YWdlZCB0cmVlcyBlcXVhbHMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlaXIgZmluYWwgbG9jYXRpb25zLiBUaGF0XG4gIC8vIG1ha2VzIGNyb3NzLXRyZWUgYGZpbGU6YCByZXdyaXRlcyAoZS5nLiBgLi4vLi4vQHdpbGxib29zdGVyLzxuYW1lPmApIGNvbXB1dGVkIGFnYWluc3Qgc3RhZ2luZ1xuICAvLyBjb3JyZWN0IGFmdGVyIHRoZSBzd2FwLCB3aGljaCBsZXRzIGV2ZXJ5IGZhaWx1cmUtcHJvbmUgc3RlcCDigJQgZG93bmxvYWQsIGV4dHJhY3Rpb24sIG5lc3RlZFxuICAvLyBkaXNjb3ZlcnksIHJld3JpdGluZyDigJQgZmluaXNoIGJlZm9yZSBlaXRoZXIgbGl2ZSB0cmVlIGlzIHRvdWNoZWQuXG4gIGNvbnN0IHRvU3RhZ2VkUGF0aCA9IChmaW5hbFBhdGg6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIHBhdGguam9pbihzdGFnaW5nUm9vdERpclBhdGgsIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGZpbmFsUGF0aCkpO1xuICBpZiAocGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCkgIT09ICdAd2lsbGJvb3N0ZXInKSB7XG4gICAgLy8gUHJlLWV4aXN0aW5nIGxpbWl0YXRpb24gb2YgdGhlIG9wdGlvbjogdGhlIERvY2tlciBtYW5pZmVzdCByZXdyaXRlIGhhcyBubyBhY2Nlc3MgdG8gaXQuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAnTm90ZTogd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCByZXdyaXRlcyBnaXQgZGVwZW5kZW5jaWVzIHRvIDxyb290Pi9Ad2lsbGJvb3N0ZXI7IGEgY3VzdG9tIC0tb3V0LWRpciByZXF1aXJlcyBhIG1hdGNoaW5nIERvY2tlcmZpbGUgbGF5b3V0LidcbiAgICAgIClcbiAgICApO1xuICB9XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IGF3YWl0IGNvbGxlY3RQcml2YXRlUGFja2FnZXMoXG4gICAgcm9vdERpclBhdGgsXG4gICAgbWFuaWZlc3RQYWNrYWdlSnNvbnMsXG4gICAgb3V0RGlyUGF0aCxcbiAgICByZWdpc3RyeU91dERpclBhdGhcbiAgKTtcblxuICBpZiAoZHJ5UnVuKSB7XG4gICAgcHJpbnREcnlSdW5SZXN1bHQob3V0RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWdpc3RyeSBwYWNrYWdlcyB3aG9zZSBpbnN0YWxsZWQgY29weSBzYXRpc2ZpZXMgdGhlIHNwZWNpZmllciBhcmUgY29waWVkIGZyb21cbiAgLy8gbm9kZV9tb2R1bGVzOyBvbmx5IHRoZSByZXN0IGFyZSBkb3dubG9hZGVkLCBzbyByZWdpc3RyeSBjcmVkZW50aWFscyBhcmUgbmVlZGVkIG9ubHkgd2hlbiBhXG4gIC8vIGRvd25sb2FkIGFjdHVhbGx5IGhhcHBlbnMgKENJIHRlc3Qgc3RlcHMgZGVsaWJlcmF0ZWx5IHJlY2VpdmUgbm8gVmVyZGFjY2lvIHRva2VuKS5cbiAgY29uc3QgZG93bmxvYWRlZFBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIXAuc291cmNlRGlyUGF0aCk7XG4gIC8vIFJlc29sdmUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBCRUZPUkUgZGVsZXRpbmcgdGhlIGV4aXN0aW5nIG1hdGVyaWFsaXphdGlvbnMsIHNvIGEgbWlzc2luZ1xuICAvLyByZWdpc3RyeSBjb25maWd1cmF0aW9uIGNhbm5vdCBkZXN0cm95IGEgcHJldmlvdXNseSB1c2FibGUgb3V0cHV0IHRyZWUuIFRocm93IChyYXRoZXIgdGhhblxuICAvLyBleGl0KSBzbyBjYWxsZXJzIGNhbiBkZWNpZGU6IGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCByZXBvcnRzIGl0IGFuZCBleGl0cywgd2hpbGUgdGhlXG4gIC8vIGF1dG9tYXRpYyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVgIHN0ZXAgY2F0Y2hlcyBpdCBhbmQgY29udGludWVzLCBsZWF2aW5nIHRoZVxuICAvLyBleGlzdGluZyBvdXRwdXQgdW50b3VjaGVkIChub3RoaW5nIGhhcyBiZWVuIGRlbGV0ZWQgeWV0IGF0IHRoaXMgcG9pbnQpLlxuICBjb25zdCBhdXRoID0gZG93bmxvYWRlZFBhY2thZ2VzLmxlbmd0aCA+IDAgPyByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aChyb290RGlyUGF0aCkgOiB1bmRlZmluZWQ7XG4gIGlmIChkb3dubG9hZGVkUGFja2FnZXMubGVuZ3RoID4gMCAmJiAhYXV0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZG93bmxvYWQgJHtkb3dubG9hZGVkUGFja2FnZXMubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oJywgJyl9OiBubyByZWdpc3RyeSBjb25maWd1cmVkIGZvciB0aGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSBzY29wZTsgYCArXG4gICAgICAgIGBhZGQgXCIke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9OnJlZ2lzdHJ5PS4uLlwiIHRvIH4vLm5wbXJjLiBPbmx5IGluc3RhbGxlZCBjb3BpZXMgc2F0aXNmeWluZyBhbiBleGFjdCB2ZXJzaW9uIG9yIGAgK1xuICAgICAgICAnc2VtdmVyIHJhbmdlIGFyZSByZXVzZWQgd2l0aG91dCByZWdpc3RyeSBhY2Nlc3M7IGRpc3QtdGFnIHNwZWNpZmllcnMgKGUuZy4gYGxhdGVzdGApIGFsd2F5cyByZXF1aXJlIGl0LidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29waWVkUGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ2dpdCcpO1xuICBjb25zdCByZWdpc3RyeVBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScpO1xuXG4gIC8vIE1hdGVyaWFsaXplIEJPVEggdHJlZXMgaW50byBzdGFnaW5nIGFuZCBzd2FwIHRoZW0gaW4gb25seSBhZnRlciBldmVyeSBmYWlsdXJlLXByb25lIHN0ZXBcbiAgLy8gc3VjY2VlZGVkOiBhIHJlZ2lzdHJ5IGZldGNoL2V4dHJhY3Rpb24vbmVzdGVkLWRpc2NvdmVyeS9yZXdyaXRlIGZhaWx1cmUgbXVzdCBsZWF2ZSBib3RoIGxpdmVcbiAgLy8gdHJlZXMgZXhhY3RseSBhcyB0aGV5IHdlcmUuIE90aGVyd2lzZSB0aGUgYXV0b21hdGljIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZWBcbiAgLy8gY2FsbGVyIOKAlCB3aGljaCBjYXRjaGVzIHRoZSBmYWlsdXJlIGFuZCBjb250aW51ZXMg4oCUIHdvdWxkIHJld3JpdGUgZGVwZW5kZW5jaWVzIGFnYWluc3RcbiAgLy8gaW5jb25zaXN0ZW50IHRyZWVzIChlLmcuIGEgcmVnaXN0cnkgbWFuaWZlc3QgcG9pbnRpbmcgYXQgYSBkZWxldGVkIGBAd2lsbGJvb3N0ZXIvPG5hbWU+YCkuXG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdSb290RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB0cnkge1xuICAgIC8vIEJvdGggb3V0cHV0IGRpcmVjdG9yaWVzIGFsd2F5cyBleGlzdCBhZnRlcndhcmRzOiBEb2NrZXJmaWxlcyBDT1BZIHRoZW0gdW5jb25kaXRpb25hbGx5LCBhbmRcbiAgICAvLyBhIG1pc3Npbmcgc291cmNlIHBhdGggZmFpbHMgdGhlIGJ1aWxkLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRvU3RhZ2VkUGF0aChvdXREaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodG9TdGFnZWRQYXRoKHJlZ2lzdHJ5T3V0RGlyUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZSwgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiByZWdpc3RyeVBhY2thZ2VzKSB7XG4gICAgICBpZiAocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkge1xuICAgICAgICBhd2FpdCBjb3B5SW5zdGFsbGVkUGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UsIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAvLyBkb3dubG9hZGVkUGFja2FnZXMgaXMgbm9uLWVtcHR5IG9uIHRoaXMgcGF0aCwgc28gdGhlIGF1dGggY2hlY2sgYWJvdmUgcGFzc2VkLlxuICAgICAgICBhdXRoISxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpXG4gICAgICApO1xuICAgICAgcHJpdmF0ZVBhY2thZ2UucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oXG4gICAgICAgIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZVxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCl9YCk7XG4gICAgICAvLyBBIGRvd25sb2FkZWQgcGFja2FnZSBtYXkgaXRzZWxmIGRlcGVuZCBvbiBwcml2YXRlIHBhY2thZ2VzIHRoYXQgd2VyZSBub3QgdmlzaWJsZSBiZWZvcmVcbiAgICAgIC8vIGV4dHJhY3Rpb247IG1hdGVyaWFsaXplIHRoZW0gdG9vLiBJbnN0YWxsZWQgY29waWVzIHdlcmUgYWxyZWFkeSBkZWVwLXNjYW5uZWQgYnlcbiAgICAgIC8vIGNvbGxlY3RQcml2YXRlUGFja2FnZXMuXG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCEsXG4gICAgICAgIHByaXZhdGVQYWNrYWdlLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKHN0YWdpbmdSb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpO1xuICAgIGF3YWl0IHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhbb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoXSwgdG9TdGFnZWRQYXRoLCBiYWNrdXBSb290RGlyUGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3RhZ2luZ1Jvb3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKFxuICAgIGBFbnN1cmUgdGhlIERvY2tlcmZpbGUgQ09QWXMgJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKX0vIGFuZCAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9LyBpbnRvIHRoZSBpbWFnZSBiZWZvcmUgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuYFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBtYW5pZmVzdFBhY2thZ2VKc29uczogUGFja2FnZUpzb25bXSxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4+IHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICAvLyBTZWVkIGZyb20gZXZlcnkgbWFuaWZlc3QgKHJvb3QgKyB3b3Jrc3BhY2VzKTsgb25lIHByaXZhdGUgcGFja2FnZSBtYXkgYmUgcmVxdWVzdGVkIGJ5IHNldmVyYWxcbiAgLy8gbWFuaWZlc3RzLCBzbyBtZXJnZSBkdXBsaWNhdGVzIHRoZSBzYW1lIHdheSBuZXN0ZWQgZGlzY292ZXJ5IGRvZXMg4oCUIGtlZXAgdGhlIG5hcnJvd2VyXG4gIC8vIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQgYW5kIGZhaWwgbG91ZGx5IG9uIGEgZ2VudWluZSBjb25mbGljdC5cbiAgY29uc3QgcGFja2FnZXNUb1Byb2Nlc3M6IFByaXZhdGVQYWNrYWdlW10gPSBbXTtcbiAgY29uc3QgcXVldWVkUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb24gb2YgbWFuaWZlc3RQYWNrYWdlSnNvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhwYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KHJlcXVlc3RlZC5uYW1lKTtcbiAgICAgIGlmICghcXVldWVkKSB7XG4gICAgICAgIHF1ZXVlZFBhY2thZ2VzLnNldChyZXF1ZXN0ZWQubmFtZSwgcmVxdWVzdGVkKTtcbiAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChyZXF1ZXN0ZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCByZXF1ZXN0ZWQpO1xuICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCByZXF1ZXN0ZWQsIHBhY2thZ2VKc29uLm5hbWUgPz8gJ2Egd29ya3NwYWNlIG1hbmlmZXN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZWQudmVyc2lvblNwZWNpZmllciA9IG5hcnJvd2VyLnZlcnNpb25TcGVjaWZpZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhY2thZ2VzVG9Qcm9jZXNzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHByaXZhdGVQYWNrYWdlID0gcGFja2FnZXNUb1Byb2Nlc3NbaW5kZXhdO1xuICAgIGlmICghcHJpdmF0ZVBhY2thZ2UpIGNvbnRpbnVlO1xuICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKHByaXZhdGVQYWNrYWdlLm5hbWUpKSBjb250aW51ZTtcblxuICAgIGlmIChwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0Jykge1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5zdGFsbGVkID0gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICB9XG4gICAgLy8gU2VsZWN0ZWQgQkVGT1JFIHRoZSBkZWVwIHNjYW46IGEgbWFuaWZlc3QgaW5zaWRlIHRoZSBwYWNrYWdlIG1heSByZWZlciBiYWNrIHRvIHRoZSBwYWNrYWdlXG4gICAgLy8gaXRzZWxmLCBhbmQgdGhhdCByZXF1aXJlbWVudCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gKGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0XG4gICAgLy8gYmVsb3cpLCBuZXZlciBuYXJyb3cgdGhlIGFscmVhZHktc2VsZWN0ZWQgc3BlY2lmaWVyLlxuICAgIHByaXZhdGVQYWNrYWdlcy5zZXQocHJpdmF0ZVBhY2thZ2UubmFtZSwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgIC8vIE5lc3RlZCBwcml2YXRlIGRlcGVuZGVuY2llcyBvZiBhbiBpbnN0YWxsZWQgcGFja2FnZSBhcmUgZGlzY292ZXJhYmxlIHJpZ2h0IGF3YXk7IHJlZ2lzdHJ5XG4gICAgLy8gcGFja2FnZXMgd2l0aG91dCBhIHVzYWJsZSBpbnN0YWxsZWQgY29weSBhcmUgaW5zcGVjdGVkIGFmdGVyIGRvd25sb2FkIGluc3RlYWRcbiAgICAvLyAoY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcykuXG4gICAgaWYgKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KG5lc3RlZC5uYW1lKTtcbiAgICAgICAgICBpZiAoIXF1ZXVlZCkge1xuICAgICAgICAgICAgcXVldWVkUGFja2FnZXMuc2V0KG5lc3RlZC5uYW1lLCBuZXN0ZWQpO1xuICAgICAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChuZXN0ZWQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKG5lc3RlZC5uYW1lKSkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBtYXRlcmlhbGl6ZWQgKG9yIHNlbGVjdGVkKTogdGhlIHJlcXVpcmVtZW50IG11c3QgYWRtaXQgdGhhdCBzZWxlY3Rpb24uXG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIG5lc3RlZCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0aWxsIHF1ZXVlZDoga2VlcCB0aGUgTkFSUk9XRVIgY29tcGF0aWJsZSByZXF1aXJlbWVudCBzbyBkaXNjb3Zlcnkgb3JkZXIgY2Fubm90XG4gICAgICAgICAgICAvLyB0dXJuIGNvbXBhdGlibGUgY29uc3RyYWludHMgKGUuZy4gYF4xLjAuMGAgYW5kIGAxLjIuM2ApIGludG8gYSBzcHVyaW91cyBjb25mbGljdC5cbiAgICAgICAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCBuZXN0ZWQpO1xuICAgICAgICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCBuZXN0ZWQsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcXVldWVkLnZlcnNpb25TcGVjaWZpZXIgPSBuYXJyb3dlci52ZXJzaW9uU3BlY2lmaWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcml2YXRlUGFja2FnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIGV4dHJhY3RlZFBhY2thZ2U6IFByaXZhdGVQYWNrYWdlLFxuICBwcml2YXRlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZyxcbiAgdG9TdGFnZWRQYXRoOiAodGFyZ2V0RGlyUGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBFdmVyeSBtYXRlcmlhbGl6ZWQgcGFja2FnZSDigJQgaW5jbHVkaW5nIGEgbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBnaXQgZGVwZW5kZW5jeSDigJQgbGl2ZXMgaW5cbiAgLy8gc3RhZ2luZyB1bnRpbCB0aGUgYXRvbWljIHN3YXAsIHNvIGl0cyBtYW5pZmVzdHMgbXVzdCBiZSByZWFkIHRoZXJlLlxuICBjb25zdCBleHRyYWN0ZWREaXJQYXRoID0gdG9TdGFnZWRQYXRoKGV4dHJhY3RlZFBhY2thZ2UudGFyZ2V0RGlyUGF0aCk7XG4gIC8vIFNjYW4gRVZFUlkgbWFuaWZlc3Qgb2YgdGhlIG1hdGVyaWFsaXplZCBwYWNrYWdlIChvcmcgZ2l0IGRlcGVuZGVuY2llcyBhcmUgd2hvbGUgbW9ub3JlcG9cbiAgLy8gY2hlY2tvdXRzIHdpdGggcGFja2FnZXMvKi9wYWNrYWdlLmpzb24pLCBtaXJyb3JpbmcgY29sbGVjdFByaXZhdGVQYWNrYWdlcycgZGVlcCBzY2FuIOKAlCB0aGVcbiAgLy8gZGVwZW5kZW5jeS1yZXdyaXRlIHN0ZXAgd2Fsa3MgdGhlIHNhbWUgc2V0LCBzbyBhbnl0aGluZyBkZWNsYXJlZCB0aGVyZSBtdXN0IGJlIG1hdGVyaWFsaXplZC5cbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoZXh0cmFjdGVkRGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgICAgIGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIWV4aXN0aW5nLnNvdXJjZURpclBhdGggJiYgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTdGlsbCBhd2FpdGluZyBpdHMgZG93bmxvYWQgKG5vIGluc3RhbGxlZCBjb3B5IHNlbGVjdGVkLCBub3RoaW5nIGV4dHJhY3RlZCB5ZXQpOiBrZWVwXG4gICAgICAgICAgLy8gdGhlIE5BUlJPV0VSIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQsIGV4YWN0bHkgYXMgY29sbGVjdFByaXZhdGVQYWNrYWdlcyBkb2VzIGZvclxuICAgICAgICAgIC8vIHF1ZXVlZCBwYWNrYWdlcywgc28gbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBjb25zdHJhaW50cyBjYW5ub3QgZmFicmljYXRlIGNvbmZsaWN0cy5cbiAgICAgICAgICBjb25zdCBuYXJyb3dlciA9IG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KGV4aXN0aW5nLCBuZXN0ZWQpO1xuICAgICAgICAgIGlmIChuYXJyb3dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID0gbmFycm93ZXIudmVyc2lvblNwZWNpZmllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ29sbGFwc2luZyBkaWZmZXJlbnQgcmVxdWVzdGVkIHZlcnNpb25zIGludG8gb25lIG1hdGVyaWFsaXphdGlvbiB3b3VsZCBzaWxlbnRseVxuICAgICAgICAgIC8vIHZpb2xhdGUgdGhlIGRlcGVuZGVudCdzIHJlcXVpcmVtZW50LCBzbyBjb25mbGljdHMgbXVzdCBmYWlsIGxvdWRseS5cbiAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICAgIG5lc3RlZC5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnN0YWxsZWQgPSBmaW5kSW5zdGFsbGVkUmVnaXN0cnlQYWNrYWdlKHJvb3REaXJQYXRoLCBuZXN0ZWQpO1xuICAgICAgICBuZXN0ZWQuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgICAgbmVzdGVkLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICAgICAgaWYgKG5lc3RlZC5zb3VyY2VEaXJQYXRoKSB7XG4gICAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIG5lc3RlZC5uYW1lLFxuICAgICAgICAgICAgbmVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gJ2xhdGVzdCcsXG4gICAgICAgICAgICB0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXN0ZWQucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24odG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSwgbmVzdGVkLm5hbWUpO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke25lc3RlZC5uYW1lfSAobmVzdGVkIGRlcGVuZGVuY3kpIHRvICR7bmVzdGVkLnRhcmdldERpclBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByaXZhdGVQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgbmVzdGVkLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogYGRlc3RpbmF0aW9uRGlyUGF0aGAgbWF5IGRpZmZlciBmcm9tIGB0YXJnZXREaXJQYXRoYCB3aGlsZSByZWdpc3RyeSBwYWNrYWdlcyBzdGFnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlJbnN0YWxsZWRQYWNrYWdlKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwcml2YXRlUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UsXG4gIGRlc3RpbmF0aW9uRGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSByZWdpc3RyeSBwYWNrYWdlJ3MgdGFyYmFsbCBtYXkgbGVnaXRpbWF0ZWx5IGNvbnRhaW4gbm9kZV9tb2R1bGVzLyBjb250ZW50IHZpYVxuICAvLyBidW5kbGVkRGVwZW5kZW5jaWVzOyB0aG9zZSBmaWxlcyBhcmUgcGFydCBvZiB0aGUgYXJ0aWZhY3QgYW5kIG11c3Qgc3Vydml2ZSB0aGUgY29weS4gR2l0XG4gIC8vIGNoZWNrb3V0cyAoYW5kIG5vbi1idW5kbGVkIG5hbWVzKSBzdGlsbCBleGNsdWRlIG5vZGVfbW9kdWxlcywgd2hpY2ggaG9sZHMgbG9jYWxseSBpbnN0YWxsZWRcbiAgLy8gZGVwZW5kZW5jaWVzIHRoZXJlLlxuICBjb25zdCBidW5kbGVkRGVwZW5kZW5jeU5hbWVzID1cbiAgICBwcml2YXRlUGFja2FnZS5raW5kID09PSAncmVnaXN0cnknID8gcmVhZEJ1bmRsZWREZXBlbmRlbmN5TmFtZXMocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCEpIDogW107XG4gIGF3YWl0IGZzLnByb21pc2VzLmNwKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBkZXN0aW5hdGlvbkRpclBhdGgsIHtcbiAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgZm9yY2U6IHRydWUsXG4gICAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIGV4cG9zZXMgaW5zdGFsbGVkIHBhY2thZ2VzIHRocm91Z2ggc3ltbGlua3M7IHRoZSBtYXRlcmlhbGl6ZWQgdHJlZVxuICAgIC8vIG11c3QgY29udGFpbiByZWFsIGZpbGVzIChhIGNvcGllZCBhYnNvbHV0ZSBzeW1saW5rIHdvdWxkIGRhbmdsZSBpbnNpZGUgdGhlIERvY2tlciBpbWFnZSxcbiAgICAvLyBhbmQgbGF0ZXIgZGVwZW5kZW5jeSByZXdyaXRpbmcgd291bGQgd3JpdGUgdGhyb3VnaCBpdCBpbnRvIHRoZSBzaGFyZWQgc3RvcmUpLlxuICAgIGRlcmVmZXJlbmNlOiB0cnVlLFxuICAgIGZpbHRlcjogKHNyYykgPT4ge1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnJlbGF0aXZlKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBzcmMpLnNwbGl0KHBhdGguc2VwKTtcbiAgICAgIGlmIChzZWdtZW50cy5pbmNsdWRlcygnLmdpdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBub2RlTW9kdWxlc0luZGV4ID0gc2VnbWVudHMuaW5kZXhPZignbm9kZV9tb2R1bGVzJyk7XG4gICAgICBpZiAobm9kZU1vZHVsZXNJbmRleCA9PT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBUaGUgbm9kZV9tb2R1bGVzIChhbmQgQHNjb3BlKSBkaXJlY3RvcmllcyB0aGVtc2VsdmVzIG11c3QgY29weSBzbyBidW5kbGVkIHN1YnRyZWVzIGNhbjtcbiAgICAgIC8vIG9ubHkgdGhlIGZpcnN0IG5vZGVfbW9kdWxlcyBsZXZlbCBmaWx0ZXJzIOKAlCBhbnl0aGluZyBpbnNpZGUgYSBidW5kbGVkIHN1YnRyZWUgYmVsb25ncyB0b1xuICAgICAgLy8gdGhlIGFydGlmYWN0LCBpbmNsdWRpbmcgaXRzIG93biBuZXN0ZWQgbm9kZV9tb2R1bGVzLlxuICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gc2VnbWVudHMuc2xpY2Uobm9kZU1vZHVsZXNJbmRleCArIDEpO1xuICAgICAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoJ0AnKSAmJiBzZWNvbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYnVuZGxlZERlcGVuZGVuY3lOYW1lcy5zb21lKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7Zmlyc3R9L2ApKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZmlyc3Quc3RhcnRzV2l0aCgnQCcpID8gYCR7Zmlyc3R9LyR7c2Vjb25kfWAgOiBmaXJzdDtcbiAgICAgIHJldHVybiBidW5kbGVkRGVwZW5kZW5jeU5hbWVzLmluY2x1ZGVzKHBhY2thZ2VOYW1lKTtcbiAgICB9LFxuICB9KTtcbiAgY29uc29sZS5pbmZvKGBDb3BpZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWApO1xufVxuXG4vKiogRGVjbGFyZWQgYnVuZGxlZCBkZXBlbmRlbmN5IG5hbWVzIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZTsgYHRydWVgIGJ1bmRsZXMgZXZlcnkgZGVwZW5kZW5jeS4gKi9cbmZ1bmN0aW9uIHJlYWRCdW5kbGVkRGVwZW5kZW5jeU5hbWVzKHNvdXJjZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHwgdHJ1ZSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgICBidW5kbGVEZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB8IGJvb2xlYW47XG4gICAgICBidW5kbGVkRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfCBib29sZWFuO1xuICAgIH07XG4gICAgY29uc3QgYnVuZGxlZCA9IHBhY2thZ2VKc29uLmJ1bmRsZURlcGVuZGVuY2llcyA/PyBwYWNrYWdlSnNvbi5idW5kbGVkRGVwZW5kZW5jaWVzO1xuICAgIGlmIChidW5kbGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShidW5kbGVkKSA/IGJ1bmRsZWQuZmlsdGVyKChuYW1lKSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIDogW107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBtYXRlcmlhbGl6YXRpb24gZm9yIGBleGlzdGluZ2AgaXMgYWxyZWFkeSBzZWxlY3RlZCAoYSByYW5nZSByZXNvbHZlcyBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0XG4gKiB0aGUgcmVnaXN0cnkg4oCUIHNlZSBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UpLCBzbyBhY2NlcHQgYHJlcXVlc3RlZGAgb25seSB3aGVuIGl0IGlzXG4gKiBndWFyYW50ZWVkIHNhdGlzZmllZDogYGV4aXN0aW5nYCBtdXN0IGJlIGEgc3Vic2V0IG9mIGl0IChldmVyeSBwb3NzaWJsZSByZXNvbHV0aW9uIG9mIGBleGlzdGluZ2BcbiAqIHRoZW4gc2F0aXNmaWVzIGByZXF1ZXN0ZWRgKS4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMvcmV2aXNpb25zKSBtdXN0IG1hdGNoXG4gKiBleGFjdGx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UsIGRlcGVuZGVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpc3Rpbmcua2luZCA9PT0gcmVxdWVzdGVkLmtpbmQpIHtcbiAgICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybjtcbiAgICBpZiAoc3BlY2lmaWVyU3Vic2V0KGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIsIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuO1xuICAgIC8vIE9uY2UgdGhlIGNvbmNyZXRlIG1hdGVyaWFsaXplZCB2ZXJzaW9uIGlzIGtub3duIChpbnN0YWxsZWQgY29weSBvciBleHRyYWN0ZWQgZG93bmxvYWQpLCBhXG4gICAgLy8gcmVxdWlyZW1lbnQgaXQgc2F0aXNmaWVzIGlzIGNvbXBhdGlibGUgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbCBzcGVjaWZpZXJzIGFyZSBub3Qgc3Vic2V0c1xuICAgIC8vIChlLmcuIGBeMS4wLjBgIHJlc29sdmVkIHRvIDEuMi4zIGFsc28gc2F0aXNmaWVzIGEgbGF0ZXIgZXhhY3QgYDEuMi4zYCkuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMocmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIsIGV4aXN0aW5nLnJlc29sdmVkVmVyc2lvbilcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfTogYCArXG4gICAgICBgJHtleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID8/IGV4aXN0aW5nLmtpbmR9IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGJ1dCAke2RlcGVuZGVudE5hbWV9IHJlcXVpcmVzIGAgK1xuICAgICAgYCR7cmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gcmVxdWVzdGVkLmtpbmR9LiBPbmx5IGEgc2luZ2xlIHZlcnNpb24gcGVyIHByaXZhdGUgcGFja2FnZSBpcyBzdXBwb3J0ZWQuYFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHN5bWxpbmtzIGluIHRoZSBkZWVwZXN0IEVYSVNUSU5HIGFuY2VzdG9yIG9mIHRoZSBwYXRoIGFuZCByZWF0dGFjaGVzIHRoZSBub3QteWV0XG4gKiBleGlzdGluZyByZW1haW5kZXIsIHNvIGxleGljYWwgY29udGFpbm1lbnQvb3ZlcmxhcCBjaGVja3Mgb3BlcmF0ZSBvbiBwaHlzaWNhbCBsb2NhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVBhdGgodGFyZ2V0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGV4aXN0aW5nUGF0aCA9IHBhdGgucmVzb2x2ZSh0YXJnZXRQYXRoKTtcbiAgY29uc3QgcmVtYWluZGVyU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhleGlzdGluZ1BhdGgpKSB7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShleGlzdGluZ1BhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBleGlzdGluZ1BhdGgpIGJyZWFrO1xuICAgIHJlbWFpbmRlclNlZ21lbnRzLnVuc2hpZnQocGF0aC5iYXNlbmFtZShleGlzdGluZ1BhdGgpKTtcbiAgICBleGlzdGluZ1BhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMoZXhpc3RpbmdQYXRoKSwgLi4ucmVtYWluZGVyU2VnbWVudHMpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRhcmdldFBhdGgpO1xuICB9XG59XG5cbi8qKiBXaGV0aGVyIHRoZSB0d28gcGF0aHMgYXJlIGVxdWFsIG9yIG9uZSBjb250YWlucyB0aGUgb3RoZXIuICovXG5mdW5jdGlvbiBwYXRoc092ZXJsYXAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhLCBiKSB8fCBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYiwgYSk7XG59XG5cbmZ1bmN0aW9uIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhbmNlc3RvclBhdGg6IHN0cmluZywgZGVzY2VuZGFudFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGFuY2VzdG9yUGF0aCwgZGVzY2VuZGFudFBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFN1YmRpcmVjdG9yeShyb290RGlyUGF0aDogc3RyaW5nLCBvdXREaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gIGlmIChyZWxhdGl2ZVBhdGggJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihgT3V0cHV0IGRpcmVjdG9yeSBtdXN0IGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IHJvb3Q6ICR7b3V0RGlyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7XG4gIC8vIHJlYWxwYXRoU3luYyByZXNvbHZlcyB0aGUgaXNvbGF0ZWQgbGlua2VyJ3Mgc3ltbGluayBzbyBjb3BpZXMgcmVhZCAoYW5kIHRoZSBjb3B5IGZpbHRlclxuICAvLyBjb21wdXRlcyByZWxhdGl2ZSBwYXRocyBhZ2FpbnN0KSB0aGUgYWN0dWFsIHBhY2thZ2UgZGlyZWN0b3J5LlxuICBjb25zdCBkaXJlY3REaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJlY3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhkaXJlY3REaXJQYXRoKTtcbiAgfVxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIga2VlcHMgdHJhbnNpdGl2ZS1vbmx5IGRlcGVuZGVuY2llcyBvdXQgb2YgdGhlIHJvb3Qgbm9kZV9tb2R1bGVzO1xuICAvLyBzZWFyY2ggdGhlIC5idW4gc3RvcmUgZm9yIHRoZSBwYWNrYWdlIGJlZm9yZSBnaXZpbmcgdXAuIFRoZSBzdG9yZSBtYXkgbGVnaXRpbWF0ZWx5IGhvbGRcbiAgLy8gTVVMVElQTEUgcmVzb2x1dGlvbnMgb2Ygb25lIHBhY2thZ2UgKGRpZmZlcmVudCB2ZXJzaW9ucy9yZXZpc2lvbnMpLCBhbmQgcGlja2luZyBhbiBhcmJpdHJhcnlcbiAgLy8gb25lIGNvdWxkIHNpbGVudGx5IG1hdGVyaWFsaXplIHRoZSB3cm9uZyBjb250ZW50IOKAlCBzbyBhbWJpZ3VpdHkgZmFpbHMgbG91ZGx5LlxuICBjb25zdCBidW5TdG9yZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpO1xuICBjb25zdCBjYW5kaWRhdGVEaXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGZzLnJlYWRkaXJTeW5jKGJ1blN0b3JlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVEaXJQYXRoID0gcGF0aC5qb2luKGJ1blN0b3JlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWROYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjYW5kaWRhdGVEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgIGNhbmRpZGF0ZURpclBhdGhzLmFkZChmcy5yZWFscGF0aFN5bmMoY2FuZGlkYXRlRGlyUGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCB0aHJvdWdoIHRvIHRoZSBlcnJvciBiZWxvdy5cbiAgfVxuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA9PT0gMSkgcmV0dXJuIFsuLi5jYW5kaWRhdGVEaXJQYXRoc11bMF0hO1xuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgaW5zdGFsbGVkIHJlc29sdXRpb25zIGZvdW5kIGZvciAke3BhY2thZ2VOYW1lfTogJHtbLi4uY2FuZGlkYXRlRGlyUGF0aHNdLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgJ0RlZHVwbGljYXRlIHRoZSBkZXBlbmRlbmN5IHNvIGEgc2luZ2xlIHJlc29sdXRpb24gcmVtYWlucy4nXG4gICAgKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAke3BhY2thZ2VOYW1lfSAoJHtkaXJlY3REaXJQYXRofSlgKTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbGVkIG1hdGVyaWFsaXphdGlvbiBvZiBhIHJlZ2lzdHJ5IHBhY2thZ2UsIHdoZW4gaXRzIHZlcnNpb24gaXMgc3RhdGljYWxseSBrbm93biB0b1xuICogc2F0aXNmeSB0aGUgc3BlY2lmaWVyIOKAlCBzdGVwcyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIChlLmcuIENJIHRlc3Qgc3RlcHMsIHdoaWNoXG4gKiBkZWxpYmVyYXRlbHkgcmVjZWl2ZSBubyBWZXJkYWNjaW8gdG9rZW4pIHJldXNlIGl0IGluc3RlYWQgb2YgZG93bmxvYWRpbmcuIFJldHVybnMgdW5kZWZpbmVkXG4gKiAoZmFsbGluZyBiYWNrIHRvIGEgZG93bmxvYWQpIHdoZW4gbm8gdW5hbWJpZ3VvdXNseSBjb3JyZWN0IGluc3RhbGxlZCBjb3B5IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2U6IFByaXZhdGVQYWNrYWdlXG4pOiB7IGRpclBhdGg6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBzcGVjaWZpZXIgPSBwcml2YXRlUGFja2FnZS52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnO1xuICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLmpvaW4oJ25vZGVfbW9kdWxlcycsIC4uLnByaXZhdGVQYWNrYWdlLm5hbWUuc3BsaXQoJy8nKSk7XG4gIGNvbnN0IGFkZENhbmRpZGF0ZSA9IChjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oZGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgaWYgKHZlcnNpb24gJiYgaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXIsIHZlcnNpb24pKSBjYW5kaWRhdGVzLnNldChmcy5yZWFscGF0aFN5bmMoZGlyUGF0aCksIHZlcnNpb24pO1xuICB9O1xuICAvLyBBIHJvb3QtbGV2ZWwgaW5zdGFsbGF0aW9uIGlzIFRIRSBsb2NrZmlsZSByZXNvbHV0aW9uIGZvciB0aGUgcm9vdCBkZXBlbmRlbmN5OyB0aGUgLmJ1biBzdG9yZVxuICAvLyBpcyBjb25zdWx0ZWQgb25seSBmb3IgdHJhbnNpdGl2ZS1vbmx5IHBhY2thZ2VzLCB3aGVyZSBtdWx0aXBsZSBzYXRpc2Z5aW5nIHJlc29sdXRpb25zIG1heVxuICAvLyBjb2V4aXN0IGFuZCBwaWNraW5nIG9uZSBhcmJpdHJhcmlseSBjb3VsZCBtYXRlcmlhbGl6ZSB0aGUgd3JvbmcgY29udGVudC5cbiAgY29uc3QgZGlyZWN0Q2FuZGlkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGFkZENhbmRpZGF0ZShkaXJlY3RDYW5kaWRhdGVzLCBwYXRoLmpvaW4ocm9vdERpclBhdGgsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICBpZiAoZGlyZWN0Q2FuZGlkYXRlcy5zaXplID09PSAxKSByZXR1cm4gdG9TaW5nbGVDYW5kaWRhdGUoZGlyZWN0Q2FuZGlkYXRlcyk7XG5cbiAgY29uc3Qgc3RvcmVDYW5kaWRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBmcy5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGFkZENhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMsIHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYnVuJywgZGlyZW50Lm5hbWUsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nLlxuICB9XG4gIHJldHVybiB0b1NpbmdsZUNhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMpO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUNhbmRpZGF0ZShjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogeyBkaXJQYXRoOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgW2VudHJ5XSA9IGNhbmRpZGF0ZXM7XG4gIHJldHVybiBjYW5kaWRhdGVzLnNpemUgPT09IDEgJiYgZW50cnkgPyB7IGRpclBhdGg6IGVudHJ5WzBdLCB2ZXJzaW9uOiBlbnRyeVsxXSB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWFkSW5zdGFsbGVkVmVyc2lvbihkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09IHBhY2thZ2VOYW1lICYmIHR5cGVvZiBwYWNrYWdlSnNvbi52ZXJzaW9uID09PSAnc3RyaW5nJ1xuICAgICAgPyBwYWNrYWdlSnNvbi52ZXJzaW9uXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcml2YXRlUGFja2FnZVtdIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5S2V5cykge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uW2tleV07XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGNvbnN0IGlzR2l0ID0gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSk7XG4gICAgICBpZiAoIWlzR2l0ICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0dpdCAmJiAhbmFtZS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIGdpdCBkZXBlbmRlbmN5IG11c3QgYmUgYW4gQHdpbGxib29zdGVyIHBhY2thZ2U6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShuYW1lKTtcbiAgICAgIC8vIERlcGVuZGVuY3kgbmFtZXMgYmVjb21lIGV4dGVybmFsIGRhdGEgb25jZSBuZXN0ZWQgbWFuaWZlc3RzIGNvbWUgZnJvbSBkb3dubG9hZGVkXG4gICAgICAvLyB0YXJiYWxsczsgcmVqZWN0IGFueXRoaW5nIChwYXRoIHNlcGFyYXRvcnMsIGAuLmAsIGhpZGRlbi1maWxlIHByZWZpeGVzKSB0aGF0IGNvdWxkXG4gICAgICAvLyBlc2NhcGUgdGhlIG91dHB1dCBkaXJlY3RvcnkgdGhlIG5hbWUgaXMgam9pbmVkIGludG8gYmVmb3JlIGl0IGlzIHJlY3Vyc2l2ZWx5IGRlbGV0ZWQuXG4gICAgICBpZiAoIS9eW1xcdy4tXSskLy50ZXN0KHVuc2NvcGVkTmFtZSkgfHwgdW5zY29wZWROYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpdmF0ZSBwYWNrYWdlIG5hbWU6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGtpbmQ6IGlzR2l0ID8gJ2dpdCcgOiAncmVnaXN0cnknLFxuICAgICAgICBzb3VyY2VEaXJQYXRoOiB1bmRlZmluZWQsXG4gICAgICAgIHJlc29sdmVkVmVyc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICB0YXJnZXREaXJQYXRoOiBwYXRoLmpvaW4oaXNHaXQgPyBvdXREaXJQYXRoIDogcmVnaXN0cnlPdXREaXJQYXRoLCB1bnNjb3BlZE5hbWUpLFxuICAgICAgICAvLyBUaGUgZnVsbCBnaXQgc3BlY2lmaWVyIGlzIHByZXNlcnZlZCBzbyBkaXZlcmdlbnQgVVJMcy9yZXZpc2lvbnMgKCNhYmMgdnMgI2RlZikgYXJlXG4gICAgICAgIC8vIGRldGVjdGVkIGFzIGNvbmZsaWN0cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGNvbGxhcHNpbmcgaW50byBvbmUgY29waWVkIHBhY2thZ2UuXG4gICAgICAgIHZlcnNpb25TcGVjaWZpZXI6IHZhbHVlIGFzIHN0cmluZyxcbiAgICAgIH07XG4gICAgICBjb25zdCBleGlzdGluZyA9IHByaXZhdGVQYWNrYWdlcy5nZXQobmFtZSk7XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5hbWUsIGV4aXN0aW5nID8gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKSA6IHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXTtcbn1cblxuLyoqXG4gKiBBIG1hbmlmZXN0IG1heSBsZWdpdGltYXRlbHkgcmVxdWVzdCBvbmUgcGFja2FnZSBmcm9tIHNldmVyYWwgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBhbiBleGFjdFxuICogZGV2RGVwZW5kZW5jaWVzIHBpbiBhbG9uZ3NpZGUgYSBwZWVyRGVwZW5kZW5jaWVzIHJhbmdlKS4gS2VlcCB0aGUgTkFSUk9XRVIgcmVxdWlyZW1lbnQg4oCUIGl0c1xuICogbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBzYXRpc2ZpZXMgdGhlIHdpZGVyIG9uZSBieSBkZWZpbml0aW9uIChhbiBleGFjdCBwaW4gaXMgdGhlIG5hcnJvd2VzdFxuICogcmFuZ2UpIOKAlCBhbmQgZmFpbCBsb3VkbHkgd2hlbiB0aGUgcmVxdWlyZW1lbnRzIGdlbnVpbmVseSBkaXZlcmdlLlxuICovXG5mdW5jdGlvbiBtZXJnZVNhbWVNYW5pZmVzdFJlcXVpcmVtZW50KGV4aXN0aW5nOiBQcml2YXRlUGFja2FnZSwgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSk6IFByaXZhdGVQYWNrYWdlIHtcbiAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKTtcbiAgaWYgKG5hcnJvd2VyKSByZXR1cm4gbmFycm93ZXI7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQ29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzIGZvciAke2V4aXN0aW5nLm5hbWV9IHdpdGhpbiBvbmUgbWFuaWZlc3Q6IGAgK1xuICAgICAgYCR7ZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA/PyBleGlzdGluZy5raW5kfSB2cyAke3JlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/IHJlcXVlc3RlZC5raW5kfS5gXG4gICk7XG59XG5cbi8qKlxuICogVGhlIHJlcXVpcmVtZW50IHdob3NlIG1heC1zYXRpc2Z5aW5nIHJlc29sdXRpb24gaXMgZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSBvdGhlciAoYW4gZXhhY3RcbiAqIHBpbiBpcyB0aGUgbmFycm93ZXN0IHJhbmdlKSwgb3IgdW5kZWZpbmVkIHdoZW4gbmVpdGhlciBzdWJzdW1lcyB0aGUgb3RoZXIuXG4gKi9cbmZ1bmN0aW9uIG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KFxuICBleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsXG4gIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2Vcbik6IFByaXZhdGVQYWNrYWdlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4aXN0aW5nLmtpbmQgIT09IHJlcXVlc3RlZC5raW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyLCByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciwgZXhpc3RpbmcudmVyc2lvblNwZWNpZmllcikpIHJldHVybiByZXF1ZXN0ZWQ7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKFxuICBzdGFnaW5nUm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBwcml2YXRlUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyh0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgaWYgKCFyZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25QYXRoLCBwYWNrYWdlSnNvbiwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpKSBjb250aW51ZTtcblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMil9XFxuYCwgJ3V0ZjgnKTtcbiAgICAgIC8vIFN0YWdpbmcgbWlycm9ycyB0aGUgcm9vdC1yZWxhdGl2ZSBsYXlvdXQsIHNvIHRoaXMgaXMgdGhlIG1hbmlmZXN0J3MgcG9zdC1zd2FwIGxvY2F0aW9uLlxuICAgICAgY29uc29sZS5pbmZvKGBSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzIGluICR7cGF0aC5yZWxhdGl2ZShzdGFnaW5nUm9vdERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25QYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBpZiAoIWlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRhcmdldFBhY2thZ2UgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCF0YXJnZXRQYWNrYWdlKSBjb250aW51ZTtcblxuICAgICAgLy8gQm90aCBzaWRlcyBhcmUgc3RhZ2VkIHBhdGhzOiBzdGFnaW5nIG1pcnJvcnMgdGhlIHJvb3QtcmVsYXRpdmUgbGF5b3V0LCBzbyB0aGUgcmVsYXRpdmVcbiAgICAgIC8vIHNwZWNpZmllciBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB0aGUgZmluYWwgbG9jYXRpb25zIHdvdWxkIHByb2R1Y2UuXG4gICAgICBkZXBlbmRlbmNpZXNbbmFtZV0gPVxuICAgICAgICBgZmlsZToke3BhdGgucmVsYXRpdmUocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksIHRvU3RhZ2VkUGF0aCh0YXJnZXRQYWNrYWdlLnRhcmdldERpclBhdGgpKX1gO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG4vKipcbiAqIE1vdmUgZXZlcnkgc3RhZ2VkIHRyZWUgb250byBpdHMgZmluYWwgbG9jYXRpb24gYXMgb25lIHRyYW5zYWN0aW9uOiBlYWNoIGxpdmUgdHJlZSBpcyBzZXQgYXNpZGVcbiAqIGZpcnN0IHNvIGEgZmFpbGluZyByZW5hbWUgY2FuIHJlc3RvcmUgdGhlIHByZXZpb3VzIHN0YXRlIGluc3RlYWQgb2YgbGVhdmluZyBvbmUgdHJlZSByZXBsYWNlZFxuICogYW5kIHRoZSBvdGhlciBzdGFsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhcbiAgb3V0RGlyUGF0aHM6IHN0cmluZ1tdLFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZyxcbiAgYmFja3VwUm9vdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgVU5JUVVFIGRpcmVjdG9yeSBwZXIgaW52b2NhdGlvbjogd2hlbiBhIHJvbGxiYWNrIGZhaWxzIGl0cyBiYWNrdXAgaXMgcmV0YWluZWQgZm9yIG1hbnVhbFxuICAvLyByZWNvdmVyeSwgYW5kIGEgZml4ZWQgcGF0aCB3b3VsZCBsZXQgdGhlIG5leHQgcnVuIGRlbGV0ZSB0aGUgb25seSByZW1haW5pbmcgY29weS5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGJhY2t1cFJvb3REaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGJhY2t1cERpclJvb3QgPSBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKGAke2JhY2t1cFJvb3REaXJQYXRofS1gKTtcbiAgLy8gUmVjb3JkZWQgQkVGT1JFIHRoZSBzdGFnZWQgdHJlZSBpcyByZW5hbWVkIGluOiBiZXR3ZWVuIHNldHRpbmcgdGhlIGxpdmUgdHJlZSBhc2lkZSBhbmRcbiAgLy8gaW5zdGFsbGluZyBpdHMgcmVwbGFjZW1lbnQgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbiBleGlzdHMgb25seSBpbiB0aGUgYmFja3VwLCBhbmQgYSByZWNvcmRcbiAgLy8gYWRkZWQgYWZ0ZXIgdGhlIHJlbmFtZSB3b3VsZCBsZWF2ZSB0aGF0IHdpbmRvdyB1bnJlY292ZXJhYmxlLlxuICBjb25zdCBzd2FwcGVkRGlyczogeyBvdXREaXJQYXRoOiBzdHJpbmc7IGJhY2t1cERpclBhdGg6IHN0cmluZzsgaGFkUHJldmlvdXNUcmVlOiBib29sZWFuIH1bXSA9IFtdO1xuICBsZXQgcmVzdG9yZUZhaWxlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBvdXREaXJQYXRoXSBvZiBvdXREaXJQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgIC8vIEluZGV4ZWQgKG5vdCBuYW1lZCBhZnRlciB0aGUgZGlyZWN0b3J5KSBzbyB0d28gb3V0cHV0IHRyZWVzIHNoYXJpbmcgYSBiYXNlbmFtZSBjYW5ub3RcbiAgICAgIC8vIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgYmFja3VwLlxuICAgICAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguam9pbihiYWNrdXBEaXJSb290LCBTdHJpbmcoaW5kZXgpKTtcbiAgICAgIGNvbnN0IGhhZFByZXZpb3VzVHJlZSA9IGZzLmV4aXN0c1N5bmMob3V0RGlyUGF0aCk7XG4gICAgICBpZiAoaGFkUHJldmlvdXNUcmVlKSBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCk7XG4gICAgICBzd2FwcGVkRGlycy5wdXNoKHsgb3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCwgaGFkUHJldmlvdXNUcmVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKG91dERpclBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZSh0b1N0YWdlZFBhdGgob3V0RGlyUGF0aCksIG91dERpclBhdGgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBSZXZlcnNlIG9yZGVyOiB1bmRvIHRoZSBtb3N0IHJlY2VudCBzd2FwIGZpcnN0LlxuICAgIGZvciAoY29uc3Qgc3dhcHBlZCBvZiBzd2FwcGVkRGlycy50b1JldmVyc2VkKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN3YXBwZWQub3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoc3dhcHBlZC5oYWRQcmV2aW91c1RyZWUpIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShzd2FwcGVkLmJhY2t1cERpclBhdGgsIHN3YXBwZWQub3V0RGlyUGF0aCk7XG4gICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7XG4gICAgICAgIC8vIFJlcG9ydGluZyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBtYXR0ZXJzIG1vcmUsIGJ1dCBhIGZhaWxlZCByb2xsYmFjayBsZWF2ZXMgdGhlIHRyZWVcbiAgICAgICAgLy8gbWlzc2luZywgc28gaXQgbXVzdCBub3QgcGFzcyBzaWxlbnRseSDigJQgYW5kIGl0cyBiYWNrdXAgaXMgdGhlbiB0aGUgT05MWSByZW1haW5pbmcgY29weS5cbiAgICAgICAgcmVzdG9yZUZhaWxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZXN0b3JlICR7c3dhcHBlZC5vdXREaXJQYXRofTogJHtTdHJpbmcocm9sbGJhY2tFcnJvcil9XFxuYCArXG4gICAgICAgICAgICAgIGBUaGUgcHJldmlvdXMgbWF0ZXJpYWxpemF0aW9uIGlzIGtlcHQgYXQgJHtzd2FwcGVkLmJhY2t1cERpclBhdGh9OyBtb3ZlIGl0IGJhY2sgYnkgaGFuZC5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBPbmx5IHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvIHJlY292ZXI6IGRlbGV0aW5nIHRoZSBiYWNrdXBzIGFmdGVyIGEgZmFpbGVkIHJlc3RvcmUgd291bGRcbiAgICAvLyBkZXN0cm95IHRoZSBsYXN0IGNvcHkgb2YgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbi4gQW5kIGJ5IHRoaXMgcG9pbnQgYm90aCB0cmVlcyBhcmVcbiAgICAvLyBhbHJlYWR5IGNvbW1pdHRlZCwgc28gYSBjbGVhbnVwIGZhaWx1cmUgKGUuZy4gYSByZWFkLW9ubHkgZGlyZWN0b3J5IGBmcy5jcGAgcHJlc2VydmVkKSBtdXN0XG4gICAgLy8gbm90IHR1cm4gYSBzdWNjZXNzZnVsIG1hdGVyaWFsaXphdGlvbiBpbnRvIGEgcmVwb3J0ZWQgZmFpbHVyZS5cbiAgICBpZiAoIXJlc3RvcmVGYWlsZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGJhY2t1cERpclJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBGYWlsZWQgdG8gcmVtb3ZlICR7YmFja3VwRGlyUm9vdH06ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25QYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGRpcmVudC5uYW1lID09PSAnbm9kZV9tb2R1bGVzJyB8fCBkaXJlbnQubmFtZSA9PT0gJy5naXQnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goLi4uKGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKGNoaWxkUGF0aCkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lID09PSAncGFja2FnZS5qc29uJykge1xuICAgICAgcGFja2FnZUpzb25QYXRocy5wdXNoKGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4pOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmVjcmVhdGUgJHtvdXREaXJQYXRofWApO1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGhcbiAgICAgICAgPyBgW2RyeS1ydW5dIFdvdWxkIGNvcHkgJHtwcml2YXRlUGFja2FnZS5uYW1lfTogJHtwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRofWBcbiAgICAgICAgOiBwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0J1xuICAgICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06IChpbnN0YWxsZWQgdW5kZXIgbm9kZV9tb2R1bGVzKWBcbiAgICAgICAgICA6IGBbZHJ5LXJ1bl0gV291bGQgZG93bmxvYWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfUAke3ByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXJ9IHRvICR7cHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGRlcGVuZGVuY2llcyB0byBmaWxlOi4uLzxuYW1lPmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQge1xuICBmaW5kRGVzY2VuZGFudFByb2plY3RzLFxuICBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIGdldEZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIHR5cGUgUHJvamVjdCxcbn0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyxcbiAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5pbXBvcnQgeyBjb2xsZWN0TWFuaWZlc3RzLCBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4vc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3Qgc3FsaXRlRmlsZVBhdHRlcm4gPSAvXFwuKD86c3FsaXRlMz98ZGIpKD86Wy0uXSg/OmpvdXJuYWx8c2htfHdhbCkpPyQvaTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXRocyA9IFtcbiAgJy5jYWNoZScsXG4gICcubXlweV9jYWNoZScsXG4gICcubmV4dC9jYWNoZScsXG4gICcucGFyY2VsLWNhY2hlJyxcbiAgJy5weXRlc3RfY2FjaGUnLFxuICAnLnJ1ZmZfY2FjaGUnLFxuICAnLnRveCcsXG4gICcudHVyYm8nLFxuICAnLnZlbnYnLFxuICAnLnlhcm4vY2FjaGUnLFxuICAnLnlhcm4vaW5zdGFsbC1zdGF0ZS5neicsXG4gICdfX3B5Y2FjaGVfXycsXG4gICdjb3ZlcmFnZScsXG4gICdub2RlX21vZHVsZXMvLmNhY2hlJyxcbiAgJ3BsYXl3cmlnaHQtcmVwb3J0JyxcbiAgJ3N0b3J5Ym9vay1zdGF0aWMnLFxuICAndGFyZ2V0JyxcbiAgJ3Rlc3QtcmVzdWx0cycsXG5dO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zID0gWycqKi8qLnB5YycsICcqKi8qLnRzYnVpbGRpbmZvJywgJyoqL19fcHljYWNoZV9fJ107XG5jb25zdCBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcyA9IFsncHJpc21hJywgJ2RiJywgJ2RyaXp6bGUnXSBhcyBjb25zdDtcbmNvbnN0IGRvY2tlckdlbmVyYXRlZERhdGFEaXJQYXRocyA9IFsnL2RhdGEnXSBhcyBjb25zdDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBNYXRlcmlhbGl6ZSBwcml2YXRlIGRlcGVuZGVuY2llcyBvbiB0aGUgaG9zdCBmaXJzdCBzbyB0aGUgcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyByZXNvbHZlc1xuICAgIC8vIHRoZW0gdG8gZmlsZTogcGF0aHMgYW5kIHRoZSBEb2NrZXIgYnVpbGQgbmVlZHMgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHMuIE9ubHkgaW4gLS1vdXRzaWRlXG4gICAgLy8gbW9kZSAodGhlIGluLWltYWdlIHNlY29uZCBwYXNzIGhhcyBubyBub2RlX21vZHVsZXMvcmVnaXN0cnkgdG8gbWF0ZXJpYWxpemUgZnJvbSkgYW5kIG9ubHlcbiAgICAvLyB3aGVuIGEgcHJpdmF0ZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IGRlY2xhcmVkLCBzbyByZXBvcyB3aXRob3V0IG9uZSBhcmUgdW50b3VjaGVkIOKAlCBubyBlbXB0eVxuICAgIC8vIG91dHB1dCBkaXJlY3Rvcmllcywgbm8gc3B1cmlvdXMgXCJDT1BZXCIgaGludC4gRmFpbHVyZXMgYXJlIG5vbi1mYXRhbCBhbmQgbm9uLWRlc3RydWN0aXZlOlxuICAgIC8vIG1hdGVyaWFsaXplIHRocm93cyBiZWZvcmUgZGVsZXRpbmcgYW55IGV4aXN0aW5nIG91dHB1dCAoYW5kIGNsZWFucyB1cCBpdHMgc3RhZ2luZyBvbiBhIGZhaWxlZFxuICAgIC8vIGRvd25sb2FkKSwgc28gYSByZXBvIGxhY2tpbmcgcmVnaXN0cnkgY3JlZGVudGlhbHMga2VlcHMgYnVpbGRpbmcgZXhhY3RseSBhcyBiZWZvcmUsIHdpdGggdGhlXG4gICAgLy8gcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyBlbWl0dGluZyB0aGUgZXhpc3RpbmcgXCJydW4gd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1wiIGhpbnQuIFRoaXNcbiAgICAvLyBrZWVwcyB0aGUgc3RlcCBhIHB1cmUgY29udmVuaWVuY2UgdGhhdCBsZXRzIHJlcG9zaXRvcmllcyBkcm9wIHRoZSBleHBsaWNpdCBjb21tYW5kLlxuICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgd29ya3NwYWNlIHNldCBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3Qgc28gYSBwcml2YXRlIGRlcGVuZGVuY3kgZGVjbGFyZWQgaW5cbiAgICAgIC8vIGFueSBzaWJsaW5nIHdvcmtzcGFjZSBpcyBtYXRlcmlhbGl6ZWQgZXZlbiB3aGVuIG9wdGltaXplIHJ1bnMgZnJvbSBhIHN1YnBhY2thZ2UgZGlyZWN0b3J5LlxuICAgICAgY29uc3Qgcm9vdFByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0cyA9IGNvbGxlY3RNYW5pZmVzdHMocm9vdFByb2plY3RzID8/IHByb2plY3RzKTtcbiAgICAgIGlmIChtYW5pZmVzdHMuc29tZShkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgbWFuaWZlc3RzLCB7IGRyeVJ1bjogQm9vbGVhbihhcmd2LmRyeVJ1bikgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgQ291bGQgbm90IGF1dG8tbWF0ZXJpYWxpemUgcHJpdmF0ZSBwYWNrYWdlcyAoJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9KTsgYCArXG4gICAgICAgICAgICAgICAgJ3J1biBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgaWYgdGhlIERvY2tlciBidWlsZCBuZWVkcyB0aGVtLiBDb250aW51aW5nLidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW1pemVkUHJvamVjdHM6IFByb2plY3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0LCBwYWNrYWdlSnNvbik7XG4gICAgICBjb25zdCByZW1vdmVkRGV2RGVwZW5kZW5jaWVzID0gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24sIHtcbiAgICAgICAgcmVtb3ZlV2JQb3N0aW5zdGFsbDogIWFyZ3Yub3V0c2lkZSAmJiByZW1vdmVkRGV2RGVwZW5kZW5jaWVzLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvd2InKSxcbiAgICAgIH0pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgICAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgICAgICBhd2FpdCB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhwYXRoLmpvaW4oZGlzdERpclBhdGgsICdiYXNoJykpO1xuICAgICAgfVxuICAgICAgb3B0aW1pemVkUHJvamVjdHMucHVzaChwcm9qZWN0KTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwcm9qZWN0cy5yb290LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZCwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgICAgYXdhaXQgY2xlYW51cERvY2tlckJ1aWxkQXJ0aWZhY3RzKG9wdGltaXplZFByb2plY3RzKTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKiogV2hldGhlciBhbnkgZGVwZW5kZW5jeSBzZWN0aW9uIGRlY2xhcmVzIGEgcHJpdmF0ZSBnaXQgb3IgYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHJlZ2lzdHJ5IGRlcGVuZGVuY3kuICovXG5mdW5jdGlvbiBkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzLnNvbWUoKGtleSkgPT4ge1xuICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIHJldHVybiAoXG4gICAgICBkZXBzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIE9iamVjdC5lbnRyaWVzKGRlcHMpLnNvbWUoXG4gICAgICAgIChbbmFtZSwgdmFsdWVdKSA9PiBpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSB8fCBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKHByb2plY3Qucm9vdERpclBhdGgsIHByb2plY3QuZGlyUGF0aCwgcGFja2FnZUpzb24pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJld3JpdHRlbkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICBpZiAoaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gRG9ja2VyIGJ1aWxkcyBjYW5ub3QgYWNjZXNzIHByaXZhdGUgU1NIIFVSTHMgdW5sZXNzIGNyZWRlbnRpYWxzIGFyZSBmb3J3YXJkZWQuXG4gICAgICAgIC8vIFRoZSBEb2NrZXJmaWxlIGNvcGllcyB0aG9zZSB3b3Jrc3BhY2UgcGFja2FnZXMgaW50byB0aGUgaW1hZ2UgaW5zdGVhZC4gT25seSB0aGUgb3JnJ3NcbiAgICAgICAgLy8gb3duIGdpdCBkZXBlbmRlbmNpZXMgYXJlIHJld3JpdHRlbiDigJQgdGhlIHNoYXJlZCBwcmVkaWNhdGUgbWF0Y2hlcyBleGFjdGx5IHdoYXRcbiAgICAgICAgLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcywgc28gb3RoZXIgU1NIIFVSTHMgYXJlIGxlZnQgdW5jaGFuZ2VkIGluc3RlYWRcbiAgICAgICAgLy8gb2YgYmVpbmcgcG9pbnRlZCBhdCBuZXZlci1tYXRlcmlhbGl6ZWQgbG9jYWwgcGF0aHMuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsICdAd2lsbGJvb3N0ZXInLCBuYW1lKTtcbiAgICAgICAgcmV3cml0dGVuRGVwZW5kZW5jaWVzLnB1c2goYCR7a2V5fS4ke25hbWV9YCk7XG4gICAgICB9IGVsc2UgaWYgKGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxpemVkVmVyc2lvbiA9IHJlYWRNYXRlcmlhbGl6ZWRQYWNrYWdlVmVyc2lvbihyb290RGlyUGF0aCwgbmFtZSk7XG4gICAgICAgIGlmIChtYXRlcmlhbGl6ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBMZWF2aW5nIHRoZSByZWdpc3RyeSBzcGVjaWZpZXIgbWVhbnMgdGhlIGluLWltYWdlIGluc3RhbGwgbmVlZHMgVmVyZGFjY2lvXG4gICAgICAgICAgLy8gY3JlZGVudGlhbHMg4oCUIHRoZSBmYWlsdXJlIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gYXZvaWQg4oCUIHNvIHNheSBzbyBvdXQgbG91ZC5cbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGAke25hbWV9IGlzIG5vdCBtYXRlcmlhbGl6ZWQgdW5kZXIgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS87IHJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgIHNvIHRoZSBEb2NrZXIgYnVpbGQgZG9lcyBub3QgbmVlZCByZWdpc3RyeSBjcmVkZW50aWFscy5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgbWF0ZXJpYWxpemVkIHZlcnNpb24gaXMgc3RhbGUgd2hlbiB0aGUgc3BlY2lmaWVyIChhbiBleGFjdCB2ZXJzaW9uIG9yIGFueSBzZW12ZXJcbiAgICAgICAgLy8gcmFuZ2UgYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIHJlc29sdmVzIG1heC1zYXRpc2Z5aW5nIGFnYWluc3QgdGhlIHJlZ2lzdHJ5KSBkb2VzXG4gICAgICAgIC8vIG5vdCBhZG1pdCBpdC4gRGlzdC10YWcgc3BlY2lmaWVycyAoZS5nLiBgMjAyNi1zdGFibGVgKSBza2lwIHRoZSBzdGFsZW5lc3MgY2hlY2suXG4gICAgICAgIGlmICghbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyh2YWx1ZSwgbWF0ZXJpYWxpemVkVmVyc2lvbikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgICBgTWF0ZXJpYWxpemVkICR7bmFtZX0gaXMgJHttYXRlcmlhbGl6ZWRWZXJzaW9ufSBidXQgcGFja2FnZS5qc29uIHJlcXVpcmVzICR7dmFsdWV9OyByZXJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWdpc3RyeSBwYWNrYWdlcyB0aGF0IGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZWQgb24gdGhlIGhvc3QgYXJlIHVzZWQgYXNcbiAgICAgICAgLy8gbG9jYWwgcGF0aHMgc28gaW1hZ2UgYnVpbGRzIG5lZWQgbm8gVmVyZGFjY2lvIGNyZWRlbnRpYWxzOyB0aGUgQ09NTUlUVEVEIHBhY2thZ2UuanNvblxuICAgICAgICAvLyBrZWVwcyB0aGUgcmVnaXN0cnkgc3BlY2lmaWVyIOKAlCBvbmx5IHRoZSBnZW5lcmF0ZWQgKGRpc3QvKXBhY2thZ2UuanNvbiBpcyByZXdyaXR0ZW5cbiAgICAgICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsIG5hbWUpO1xuICAgICAgICByZXdyaXR0ZW5EZXBlbmRlbmNpZXMucHVzaChgJHtrZXl9LiR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzOicsIHJld3JpdHRlbkRlcGVuZGVuY2llcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZXdyaXR0ZW5EZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBzY29wZURpck5hbWU6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCBzY29wZURpck5hbWUsIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwcml2YXRlUGFja2FnZURpclBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbi8qKiBVbmRlZmluZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBub3QgbWF0ZXJpYWxpemVkIChvciBpdHMgbWFuaWZlc3QgaXMgdW5yZWFkYWJsZS92ZXJzaW9ubGVzcykuICovXG5mdW5jdGlvbiByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihcbiAgICByb290RGlyUGF0aCxcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSksXG4gICAgJ3BhY2thZ2UuanNvbidcbiAgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24pLnZlcnNpb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgLy8gT3V0c2lkZSBvcHRpbWl6YXRpb24gd3JpdGVzIGRpc3QvcGFja2FnZS5qc29uIGJlZm9yZSBEb2NrZXIgYnVpbGRzIHRoZSBhcHAuXG4gICAgLy8gS2VlcCBidWlsZC10aW1lIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgY29uc3QgcmVtb3ZlZERlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICByZXR1cm4gcmVtb3ZlZERlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAnb3hmbXQnLFxuICAgICdveGxpbnQnLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZW1vdmVkRGVwcztcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgb3B0aW9uczogeyByZW1vdmVXYlBvc3RpbnN0YWxsOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMucmVtb3ZlV2JQb3N0aW5zdGFsbCAmJiBuYW1lID09PSAncG9zdGluc3RhbGwnICYmIGNvbnRlbnQudHJpbSgpID09PSAnd2IgZ2VuLWNvZGUnKSB8fFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBhd2FpdCByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3QpO1xuICAgIGF3YWl0IHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0KTtcbiAgICBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3QpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gW1xuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdCkpLFxuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdCkpLFxuICBdO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgRG9ja2VyIGJ1aWxkIGNhY2hlczonLCByZWxhdGl2ZVBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgZG9ja2VyQnVpbGRDYWNoZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYmJ5KGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucywge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzJywgJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ueWFybicsICcqKi8ueWFybi8qKicsICcqKi8uZ2l0JywgJyoqLy5naXQvKionXSxcbiAgICBvbmx5RmlsZXM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoKHJlbGF0aXZlUGF0aCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoR3JvdXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0KSwgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCldKTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gcmVtb3ZlZFBhdGhHcm91cHMuZmxhdCgpO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZ2VuZXJhdGVkIGxvY2FsIGRhdGE6JywgcmVtb3ZlZFBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHJlbGF0aXZlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkZWZhdWx0UGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihkaXJOYW1lLCAnbW91bnQnKSk7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRiUGF0aCk7XG4gIGlmIChwYXRoLmJhc2VuYW1lKGFic29sdXRlRGlyUGF0aCkgIT09ICdtb3VudCcgfHwgIWlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgYWJzb2x1dGVEaXJQYXRoKSkge1xuICAgIHJldHVybiBkZWZhdWx0UGF0aHM7XG4gIH1cbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGFic29sdXRlRGlyUGF0aCk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVmYXVsdFBhdGhzLCByZWxhdGl2ZVBhdGhdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdCksXG4gICAgcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCksXG4gIF0pO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gYXdhaXQgZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0LCBkaXJQYXRoKSkpO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUpKTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gaXNEaXJlY3RvcnkoZGlyUGF0aCkpKTtcbiAgcmV0dXJuIGRpclBhdGhzLmZpbHRlcigoXywgaW5kZXgpID0+IHJlc3VsdHNbaW5kZXhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGJGaWxlUGF0aHMgPSBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkYkZpbGVQYXRoIG9mIGRiRmlsZVBhdGhzKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIG9mIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgaXNGaWxlKHRhcmdldFBhdGgpKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICByZW1vdmVkUGF0aHMucHVzaChwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVEYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoIHx8ICFhYnNvbHV0ZURiUGF0aCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpXG4gICAgPyBbZGJQYXRoXVxuICAgIDogW2Fic29sdXRlRGJQYXRoLCAuLi5nZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUsIGRiUGF0aCkpXTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVQYXRocyldLmZpbHRlcigoZmlsZVBhdGgpID0+IGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgZmlsZVBhdGgpIHx8IGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMuc29tZSgoZGlyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcnICYmIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBkYkZpbGVQYXRoLFxuICAgIGAke2RiRmlsZVBhdGh9LWpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LXNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0td2FsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LndhbGAsXG4gIF07XG59XG5cbmZ1bmN0aW9uIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdDogUHJvamVjdCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKTtcbiAgLy8gYHN0YXJ0c1dpdGgoJy4uJylgIHdvdWxkIHJlamVjdCBwcm9qZWN0LWxvY2FsIG5hbWVzIHN1Y2ggYXMgYC4uY2FjaGVgLlxuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAocmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3BhdGguc2VwfWApKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChkaXJQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0OiBQcm9qZWN0LCBkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgc3FsaXRlRmlsZU5hbWVzID0gZGlyZW50c1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIHNxbGl0ZUZpbGVQYXR0ZXJuLnRlc3QoZGlyZW50Lm5hbWUpKVxuICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuXG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKTtcbiAgcmV0dXJuIHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBmaWxlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Jhc2gnLCAnY2xlYW51cC5zaCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnYmFzaCcsIFtzY3JpcHRQYXRoLCAnLS1rZWVwLXNjcmlwdHMnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBzY3JpcHRQYXRoKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZU9ybSwgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCwgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBhbGlhc2VzOiBbJ2RiJ10sXG4gIGRlc2NyaWJlOlxuICAgIFwiUnVuIGRhdGFiYXNlIGNvbW1hbmRzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIFByaXNtYS4gRHJpenpsZSBwcm9qZWN0cyB1c2UgZHJpenpsZS1raXQuIEV4YW1wbGU6IHdiIHByaXNtYSBtaWdyYXRlLWRldiAtLSAtLW5hbWUgaW5pdFwiLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChnZW5lcmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnL2V0Yy9saXRlc3RyZWFtLnltbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyOiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoYWxsUHJvamVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ3JlYXRpbmcgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZvciBtdWx0aXBsZSBwcm9qZWN0cyBhdCBvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0aGV5IHdvdWxkIG92ZXJ3cml0ZSBlYWNoIG90aGVyLidcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QsIG9ybSwgYXJndi5vdXRwdXQpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZ2VuZXJhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2dlbmVyYXRlJyxcbiAgZGVzY3JpYmU6ICdHZW5lcmF0ZSBPUk0gY2xpZW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZ2VuZXJhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5nZW5lcmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBjb25maWc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBsaXN0QmFja3Vwc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyOiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGxpc3QtYmFja3VwcycsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmxpc3RCYWNrdXBzKHByb2plY3QsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24od2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMubWlncmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3QsIGFyZ3YuY2hlY2tJZGVtcG90ZW5jeSkpIHtcbiAgICAgICAgaWYgKGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3QpKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgaWRlbXBvdGVuY3kgY2hlY2sgZm9yICR7cHJvamVjdC5uYW1lfSBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50LmApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdDogUHJvamVjdCwgY2hlY2tJZGVtcG90ZW5jeTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tJZGVtcG90ZW5jeSA/PyBpc0RvY2tlckVuYWJsZWQocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICdwcm9kdWN0aW9uJyk7XG59XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4ubGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxkcml6emxlfHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZScsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXJndi5vdXRwdXQgPz8gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdCwgb3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXN0b3JlKHByb2plY3QsIG91dHB1dCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSkpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICAvLyBSZXNvbHZlZCBhZ2FpbnN0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBiZWNhdXNlIHByaXNtYVNjcmlwdHMuc3R1ZGlvIHJlc29sdmVzIGEgcmVsYXRpdmVcbiAgICAgIC8vIHBhdGggYWdhaW5zdCB0aGUgQ0xJIHByb2Nlc3MgZGlyZWN0b3J5LCB3aGljaCBkaWZmZXJzIGZvciB3b3Jrc3BhY2UgZGVzY2VuZGFudHMuXG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnByaXNtYURpck5hbWUsICdyZXN0b3JlZC5zcWxpdGUzJylcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgZnVsbENvbW1hbmQpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBjb21tYW5kKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBNYWtlIERyaXp6bGUgY29tbWFuZHMgd29yayBvbiBDbG91ZGZsYXJlIEQxIHByb2plY3RzIGJ5IHBvaW50aW5nIERBVEFCQVNFX1VSTFxuICogYXQgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqL1xuZnVuY3Rpb24gd2l0aExvY2FsRDFJZk5lZWRlZChvcm06IERhdGFiYXNlT3JtLCBwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvcm0gPT09ICdkcml6emxlJyA/IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3QsIHNjcmlwdCkgOiBzY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSwgY29uZmlnUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldExpdGVzdHJlYW1EYlBhdGgocHJvamVjdCwgb3JtKTtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgc25hcHNob3Q6XG4gIGludGVydmFsOiAyNGggICMgQ3JlYXRlIGEgYmFja3VwIHBlciBkYXlcbiAgcmV0ZW50aW9uOiA3MmggIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSk6IHN0cmluZyB7XG4gIGlmIChvcm0gPT09ICdwcmlzbWEnKSByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzYDtcbiAgcmV0dXJuICdkcml6emxlL3Jlc3RvcmVkLnNxbGl0ZTMnO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LnByaXNtYURpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcgZm9yIERyaXp6bGUgcmVxdWlyZXMgZmlsZTogREFUQUJBU0VfVVJMLicpO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmludGVyZmFjZSBEYXRhYmFzZU9ybVByb2plY3Qge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBvcm06IERhdGFiYXNlT3JtO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcm0/OiBEYXRhYmFzZU9ybSk6IFByb21pc2U8RGF0YWJhc2VPcm1Qcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAubWFwKChwcm9qZWN0KSA9PiAocHJvamVjdC5kYXRhYmFzZU9ybSA/IHsgcHJvamVjdCwgb3JtOiBwcm9qZWN0LmRhdGFiYXNlT3JtIH0gOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKHByb2plY3QpOiBwcm9qZWN0IGlzIERhdGFiYXNlT3JtUHJvamVjdCA9PiAhIXByb2plY3QgJiYgKCFvcm0gfHwgcHJvamVjdC5vcm0gPT09IG9ybSkpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQob3JtID8gYE5vICR7b3JtfSBwcm9qZWN0IGZvdW5kLmAgOiAnTm8gc3VwcG9ydGVkIGRhdGFiYXNlIE9STSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtOiBEYXRhYmFzZU9ybSk6IHR5cGVvZiBwcmlzbWFTY3JpcHRzIHwgdHlwZW9mIGRyaXp6bGVTY3JpcHRzIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ3ByaXNtYScgPyBwcmlzbWFTY3JpcHRzIDogZHJpenpsZVNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgcHJvamVjdHM6IERhdGFiYXNlT3JtUHJvamVjdFtdXG4pOiBHZW5lcmF0b3I8RGF0YWJhc2VPcm1Qcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IG9ybVByb2plY3RCeVByb2plY3QgPSBuZXcgTWFwKHByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gW3Byb2plY3QucHJvamVjdCwgcHJvamVjdF0pKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChcbiAgICBjb21tYW5kTmFtZSxcbiAgICBwcm9qZWN0cy5tYXAoKHsgcHJvamVjdCB9KSA9PiBwcm9qZWN0KVxuICApKSB7XG4gICAgY29uc3Qgb3JtUHJvamVjdCA9IG9ybVByb2plY3RCeVByb2plY3QuZ2V0KHByb2plY3QpO1xuICAgIGlmICghb3JtUHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGV0ZWN0IGRhdGFiYXNlIE9STSBmb3IgJHtwcm9qZWN0Lm5hbWV9LmApO1xuXG4gICAgeWllbGQgb3JtUHJvamVjdDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIE9STSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc2VsZWN0Rm5veFNvdXJjZWRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvZW52U291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBSYWlsd2F5IGluamVjdHMgaXRzIG93biBzeXN0ZW0gdmFyaWFibGVzIGFuZCBwbGF0Zm9ybS1tYW5hZ2VkIHZhbHVlczsgbmV2ZXIgbWlycm9yIHRob3NlIGJhY2ssXG4vLyBhbmQgc2tpcCBsb2NhbC1vbmx5IGtleXMuIEFwcCB2YXJpYWJsZXMgKGluY2x1ZGluZyBEQVRBQkFTRV9VUkwsIFBPUlQpIHN0YXkgZWxpZ2libGUgYmVjYXVzZVxuLy8gZm5veCBpcyB0aGUgc291cmNlIG9mIHRydXRoIOKAlCBhIHJlcG8gdGhhdCBtdXN0IE5PVCBvd24gYSB2YWx1ZSAoZS5nLiBhIFJhaWx3YXkgcmVmZXJlbmNlXG4vLyB2YXJpYWJsZSBwb2ludGluZyBhdCBhIGxpbmtlZCBkYXRhYmFzZSBzZXJ2aWNlKSBzaW1wbHkga2VlcHMgaXQgb3V0IG9mIGZub3guXG5jb25zdCBOT05fUkFJTFdBWV9LRVlTID0gbmV3IFNldChbJ0NJJ10pO1xuY29uc3QgTk9OX1JBSUxXQVlfS0VZX1BSRUZJWEVTID0gWydSQUlMV0FZXycsICdOSVhQQUNLU18nXTtcblxuZnVuY3Rpb24gaXNOb25SYWlsd2F5S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fUkFJTFdBWV9LRVlTLmhhcyhrZXkpIHx8IE5PTl9SQUlMV0FZX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHZhcmlhYmxlcyB0byBwdXNoIHRvIFJhaWx3YXkgZnJvbSBhIHJlc29sdmVkIGVudmlyb25tZW50OiBkcm9wIGVtcHR5L3VuZGVmaW5lZCB2YWx1ZXNcbiAqIChzbyBhIGBLRVk9YCBwbGFjZWhvbGRlciBuZXZlciBibGFua3MgYSByZWFsIFJhaWx3YXkgdmFyaWFibGUpIGFuZCBSYWlsd2F5LW1hbmFnZWQga2V5cywgc29ydGVkXG4gKiBmb3IgYSBzdGFibGUgY29tbWFuZCBhbmQgbG9nIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBbc3RyaW5nLCBzdHJpbmddW10ge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIHN0cmluZ10gPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycgJiYgIWlzTm9uUmFpbHdheUtleShrZXkpO1xuICAgIH0pXG4gICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBSYWlsd2F5RW52Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8UmFpbHdheUVudkNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHJhaWx3YXlFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdyYWlsd2F5LWVudicsXG4gIGRlc2NyaWJlOlxuICAgICdTeW5jIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVjbGFyZWQgZm9yIHRoZSBjdXJyZW50IFdCX0VOViAocmVzb2x2ZWQgZnJvbSBmbm94KSB0byB0aGUgUmFpbHdheSBzZXJ2aWNlLCBrZWVwaW5nIGZub3ggdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFJhaWx3YXktbWFuYWdlZCBrZXlzIChSQUlMV0FZXyosIE5JWFBBQ0tTXyosIENJKSBhcmUgbmV2ZXIgcHVzaGVkLicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogUmFpbHdheUVudkNvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHByb2plY3QncyBmbm94IHNvdXJjZXM7IGlnbm9yZSBwcm9jZXNzLmVudiBzb1xuICAgIC8vIFJhaWx3YXkncyBvd24gaW5qZWN0ZWQgdmFyaWFibGVzIG5ldmVyIGxlYWsgaW4uIFRoZSBlZmZlY3RpdmUgdmFsdWVzIGNvbWUgZnJvbSBwcm9qZWN0LmVudlxuICAgIC8vIChmbm94LXJlc29sdmVkIGZvciBXQl9FTlYpLiBNaXJyb3JzIHdiIGRlcGxveS5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gYG1pc2UgZW52YCBpcyByZXBvcnRlZCBhcyBhIHBzZXVkby1zb3VyY2UgdGhhdCBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIHN1Y2ggYXMgUEFUSCBhbmRcbiAgICAvLyBDQVJHT19IT01FOyB0aG9zZSBtdXN0IG5ldmVyIGJlIHB1c2hlZCB0byBSYWlsd2F5LCBzbyBrZWVwIG9ubHkgZm5veC1kZWNsYXJlZCBrZXlzLlxuICAgIGNvbnN0IGZub3hLZXlzID0gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBpZiAoIWZub3hLZXlzLmhhcyhrZXkpKSBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgICAvLyBFeHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2luIG92ZXIgY29uZmlndXJlZCB2YWx1ZXMgKG1hdGNoZXMgd2IgZGVwbG95IC8gZ2VuLWRldi12YXJzKS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHN5bmMgdG8gUmFpbHdheS4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5TmFtZXMgPSBlbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oYFdvdWxkIHN5bmMgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgUmFpbHdheSBDTEkgcmVhZHMgYXV0aCAoUkFJTFdBWV9BUElfVE9LRU4pIGFuZCBkZWZhdWx0cyBmcm9tIHRoZSBlbnZpcm9ubWVudDsgcGFzcyB0aGVcbiAgICAvLyBwcm9qZWN0L3NlcnZpY2UvZW52aXJvbm1lbnQgZXhwbGljaXRseSB3aGVuIGF2YWlsYWJsZSBzbyB0aGUgY29tbWFuZCB3b3JrcyB1bmF0dGVuZGVkIGluIENJLlxuICAgIGNvbnN0IGNvbnRleHRBcmdzOiBzdHJpbmdbXSA9IFsnLS1za2lwLWRlcGxveXMnXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuUkFJTFdBWV9QUk9KRUNUX0lEKSBjb250ZXh0QXJncy5wdXNoKGAtLXByb2plY3Q9JHtwcm9jZXNzLmVudi5SQUlMV0FZX1BST0pFQ1RfSUR9YCk7XG4gICAgaWYgKHByb2Nlc3MuZW52LlJBSUxXQVlfU0VSVklDRV9JRCkgY29udGV4dEFyZ3MucHVzaChgLS1zZXJ2aWNlPSR7cHJvY2Vzcy5lbnYuUkFJTFdBWV9TRVJWSUNFX0lEfWApO1xuICAgIGNvbnRleHRBcmdzLnB1c2goYC0tZW52aXJvbm1lbnQ9JHtlbnZOYW1lfWApO1xuICAgIGNvbnN0IHNldEFyZ3MgPSBlbnRyaWVzLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4gWyctLXNldCcsIGAke2tleX09JHt2YWx1ZX1gXSk7XG5cbiAgICAvLyBzdGRpbzogJ3BpcGUnIGtlZXBzIHRoZSBSYWlsd2F5IENMSSdzIHZhcmlhYmxlIGxpc3RpbmcgKHdoaWNoIGVjaG9lcyB2YWx1ZXMpIG91dCBvZiBDSSBsb2dzO1xuICAgIC8vIHRoaXMgY29tbWFuZCBvbmx5IGV2ZXIgcHJpbnRzIGtleSBuYW1lcywgbmV2ZXIgdmFsdWVzLlxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoJ2J1bngnLCBbJ0ByYWlsd2F5L2NsaScsICd2YXJpYWJsZXMnLCAuLi5jb250ZXh0QXJncywgLi4uc2V0QXJnc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYEZhaWxlZCB0byBzeW5jIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBSYWlsd2F5IChleGl0ICR7cmV0LnN0YXR1c30pLiBLZXlzOiAke2tleU5hbWVzLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTeW5jZWQgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG50eXBlIFJlbGVhc2VBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIGFyZ3M/OiB1bmtub3duW107XG4gICctLSc/OiB1bmtub3duW107XG59O1xuXG5leHBvcnQgY29uc3QgcmVsZWFzZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdyZWxlYXNlIFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgJ1J1biBzZW1hbnRpYy1yZWxlYXNlIChvciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlKSBzbyB0aGF0IHJlcG9zaXRvcmllcyB1c2luZyBCdW4gaXNvbGF0ZWQgaW5zdGFsbHMgY2FuIHB1Ymxpc2ggdG8gbnBtOiAnICtcbiAgICBcInJlaW5zdGFsbCB3aXRoIHRoZSBob2lzdGVkIGxpbmtlciAobnBtIGNhbm5vdCB3YWxrIEJ1bidzIGlzb2xhdGVkIG5vZGVfbW9kdWxlcyBsYXlvdXQpLCBcIiArXG4gICAgJ3Jld3JpdGUgYHdvcmtzcGFjZTpgIHJhbmdlcyBucG0gY2Fubm90IHBhcnNlLCBydW4gdGhlIHJlbGVhc2UsIHRoZW4gcmVzdG9yZSB0aGUgbW9kaWZpZWQgZmlsZXMuICcgK1xuICAgICdFeHRyYSBhcmd1bWVudHMgKGUuZy4gYC0tZGVidWdgLCBhZnRlciBgLS1gKSBhcmUgZm9yd2FyZGVkIHRvIHRoZSByZWxlYXNlIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCByZWxlYXNlKGFyZ3YgYXMgUmVsZWFzZUFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2UoYXJndjogUmVsZWFzZUFyZ3YsIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyBzZW1hbnRpYy1yZWxlYXNlIG11c3QgcnVuIGF0IHRoZSByZXBvc2l0b3J5IHJvb3Q6IGl0IHJlYWRzIHRoZSBnaXQgcmVwbyBhbmQsIGZvciBtb25vcmVwb3MsXG4gIC8vIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugd2Fsa3MgdGhlIHdvcmtzcGFjZXMgaXRzZWxmLlxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMucm9vdDtcblxuICAvLyBNYXBzIGEgbXV0YXRlZCBmaWxlIHRvIGl0cyBwcmUtcmVsZWFzZSBjb250ZW50IChyYXcgYnl0ZXMg4oCUIGJ1bi5sb2NrYiBpcyBiaW5hcnkpOyBgdW5kZWZpbmVkYFxuICAvLyBtYXJrcyBhIGZpbGUgdGhhdCBkaWQgbm90IGV4aXN0IGFuZCBtdXN0IGJlIGRlbGV0ZWQgb24gcmVzdG9yZSAoZS5nLiBhIGNyZWF0ZWQgbG9ja2ZpbGUpLlxuICBjb25zdCBtb2RpZmllZEZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4oKTtcbiAgLy8gV2l0aCBhIGhhbmRsZXIgaW5zdGFsbGVkLCBTSUdJTlQvU0lHVEVSTSBubyBsb25nZXIgdGVybWluYXRlIHRoaXMgcHJvY2Vzcywgc28gdGhlXG4gIC8vIGZpbmFsbHktcmVzdG9yZSBhbHdheXMgZXhlY3V0ZXMgYW5kIHRoZSBzaWduYWwgaXMgcmUtcmFpc2VkIGFmdGVyd2FyZHMuIFRoZSBoYW5kbGVyIGFsc29cbiAgLy8gRk9SV0FSRFMgdGhlIHNpZ25hbCB0byB0aGUgcnVubmluZyBjaGlsZDogY2hpbGRyZW4gYXJlIHNwYXduZWQgYXN5bmNocm9ub3VzbHkgKG5ldmVyXG4gIC8vIHNwYXduU3luYywgd2hpY2ggd291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AgYW5kIGRlZmVyIHRoZSBoYW5kbGVyIHVudGlsIGFmdGVyIHRoZSBjaGlsZCDigJRcbiAgLy8gYW5kIGEgcHVibGlzaCDigJQgY29tcGxldGVkKSwgc28gYSBzaWduYWwgdGFyZ2V0ZWQgYXQgdGhpcyBwcm9jZXNzIGFsb25lIHN0aWxsIGNhbmNlbHMgdGhlXG4gIC8vIGNoaWxkIHByb21wdGx5LlxuICBsZXQgcmVjZWl2ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBjb25zdCBhY3RpdmVDaGlsZDogQWN0aXZlQ2hpbGRSZWYgPSB7IGN1cnJlbnQ6IHVuZGVmaW5lZCB9O1xuICBjb25zdCBzaWduYWxIYW5kbGVyID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICByZWNlaXZlZFNpZ25hbCA9IHNpZ25hbDtcbiAgICAvLyB0cmVlS2lsbCAobm90IGNoaWxkLmtpbGwpOiBzZW1hbnRpYy1yZWxlYXNlIGFuZCBidW4gaW5zdGFsbCBzcGF3biB0aGVpciBvd24gc3VicHJvY2Vzc2VzXG4gICAgLy8gKG5wbSBwdWJsaXNoLCBnaXQgcHVzaCwgLi4uKSwgd2hpY2ggbXVzdCBub3Qga2VlcCBwdWJsaXNoaW5nIGFmdGVyIHdiIHJlcG9ydHMgY2FuY2VsbGF0aW9uLlxuICAgIC8vIHRyZWVLaWxsIFRIUk9XUyAobWlzc2luZy90aW1pbmctb3V0IGBwc2AsIEVQRVJNKSwgYW5kIGFuIGV4Y2VwdGlvbiBlc2NhcGluZyBhIHNpZ25hbFxuICAgIC8vIGxpc3RlbmVyIHdvdWxkIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyBhbmQgc2tpcCB0aGUgcmVzdG9yaW5nIGZpbmFsbHkg4oCUIHNvIGRlZ3JhZGUgdG9cbiAgICAvLyBraWxsaW5nIHRoZSBkaXJlY3QgY2hpbGQgaW5zdGVhZC5cbiAgICB0cnkge1xuICAgICAgaWYgKGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LnBpZCkgdHJlZUtpbGwoYWN0aXZlQ2hpbGQuY3VycmVudC5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gdGVybWluYXRlIHRoZSByZWxlYXNlIGNoaWxkIHByb2Nlc3MgdHJlZTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LmtpbGwoc2lnbmFsKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGd1YXJkZWRTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID0gWydTSUdJTlQnLCAnU0lHVEVSTSddO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBndWFyZGVkU2lnbmFscykgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuXG4gIGxldCBleGl0Q29kZSA9IDA7XG4gIGxldCByZWxlYXNlUmFuU3VjY2Vzc2Z1bGx5ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IHJlbGVhc2VQdWJsaXNoZXNUb05wbShwcm9qZWN0KSkge1xuICAgICAgYXdhaXQgcHJlcGFyZU5wbUNvbXBhdGlibGVMYXlvdXQocHJvamVjdCwgYXJndiwgbW9kaWZpZWRGaWxlcywgYWN0aXZlQ2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgaG9pc3RlZCByZWluc3RhbGwgYW5kIHdvcmtzcGFjZS1yYW5nZSByZXdyaXRlIGV4aXN0IHNvbGVseSBzbyBucG0gKHdoaWNoIHRoZVxuICAgICAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW4gZGlnZXN0IHRoZSBjaGVja291dDsgd2l0aG91dCB0aGF0IHBsdWdpblxuICAgICAgLy8gdGhlIHJlbGVhc2UgcnVucyBkaXJlY3RseSBvbiB0aGUgaXNvbGF0ZWQgbGF5b3V0IChpc3N1ZSAjMTAwMCkuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgJ1NraXBwaW5nIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBiZWNhdXNlIHRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgaW5jbHVkZSBAc2VtYW50aWMtcmVsZWFzZS9ucG0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBBIHNpZ25hbCBtYXkgaGF2ZSBhcnJpdmVkIGJldHdlZW4gY2hpbGRyZW4gKG5vdGhpbmcgdG8gZm9yd2FyZCB0byBhdCB0aGF0IGluc3RhbnQpLCBzbyBpdFxuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBleHBsaWNpdGx5IGJlZm9yZSBhbnl0aGluZyBwdWJsaXNoZXMuXG4gICAgaWYgKHJlY2VpdmVkU2lnbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFib3J0ZWQgYnkgJHtyZWNlaXZlZFNpZ25hbH0gYmVmb3JlIHJ1bm5pbmcgdGhlIHJlbGVhc2UuYCk7XG4gICAgfVxuICAgIGV4aXRDb2RlID0gYXdhaXQgcnVuU2VtYW50aWNSZWxlYXNlKHByb2plY3QsIGFyZ3YsIGFjdGl2ZUNoaWxkKTtcbiAgICAvLyBSZWNvcmRlZCBzZXBhcmF0ZWx5IGZyb20gcmVjZWl2ZWRTaWduYWw6IGEgc2lnbmFsIGFycml2aW5nIEFGVEVSIGEgc3VjY2Vzc2Z1bCBwdWJsaXNoIG11c3RcbiAgICAvLyBub3QgZGVtb3RlIHRoZSByZXN0b3JlIHRvIGJ5dGUtZm9yLWJ5dGUgKHRoYXQgd291bGQgcmV2ZXJ0IHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBidW1wcykuXG4gICAgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSA9IGV4aXRDb2RlID09PSAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEVycm9ycyBtdXN0IHVud2luZCB0aHJvdWdoIHRoaXMgdHJ5IChuZXZlciBgcHJvY2Vzcy5leGl0YCBpbnNpZGUgaXQpOiB0aGUgcmVzdG9yZSBiZWxvdyBpc1xuICAgIC8vIHRoZSBvbmx5IHRoaW5nIHRoYXQgdW5kb2VzIHRoZSBidW5maWcvcGFja2FnZS5qc29uIG11dGF0aW9ucy5cbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICBleGl0Q29kZSA9IDE7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gT24gZmFpbHVyZSBvciBpbnRlcnJ1cHRpb24sIHJlc3RvcmUgYnl0ZS1mb3ItYnl0ZTogc2VtYW50aWMtcmVsZWFzZSBtYXkgaGF2ZSBsZWZ0IFBBUlRJQUxcbiAgICAvLyBlZGl0cyAoZS5nLiBhIHZlcnNpb24gYnVtcCB3aXRob3V0IGEgcHVibGlzaCksIHdoaWNoIG11c3Qgbm90IHN1cnZpdmUuIFRoZSBzZW1hbnRpY1xuICAgIC8vIHdvcmtzcGFjZS1yYW5nZSByZXN0b3JlIGlzIHJlc2VydmVkIGZvciBhIHN1Y2Nlc3NmdWwgcmVsZWFzZS5cbiAgICBjb25zdCByZXN0b3JlZEZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2YgbW9kaWZpZWRGaWxlcykge1xuICAgICAgaWYgKHJlc3RvcmVNb2RpZmllZEZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkpKSByZXN0b3JlZEZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKHJlc3RvcmVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihgUmVzdG9yZWQgJHtyZXN0b3JlZEZpbGVQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBwKSkuam9pbignLCAnKX0uYClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFRoZSBoaW50IGFwcGxpZXMgb25seSB3aGVuIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBhY3R1YWxseSByYW47IGJ1bmZpZy50b21sIGlzIHNuYXBzaG90dGVkXG4gICAgLy8gZXhhY3RseSBpbiB0aGF0IGJyYW5jaC5cbiAgICBjb25zdCByZWluc3RhbGxlZFdpdGhIb2lzdGVkTGlua2VyID0gWy4uLm1vZGlmaWVkRmlsZXMua2V5cygpXS5zb21lKFxuICAgICAgKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2J1bmZpZy50b21sJ1xuICAgICk7XG4gICAgaWYgKHJlaW5zdGFsbGVkV2l0aEhvaXN0ZWRMaW5rZXIgJiYgIWlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAnbm9kZV9tb2R1bGVzIG5vdyB1c2VzIHRoZSBob2lzdGVkIGxheW91dDsgcnVuIGEgY2xlYW4gcmVpbnN0YWxsIChgcm0gLXJmIG5vZGVfbW9kdWxlcyBwYWNrYWdlcy8qL25vZGVfbW9kdWxlcyAmJiBidW4gaW5zdGFsbGApIHRvIHJlc3RvcmUgdGhlIGlzb2xhdGVkIGxheW91dC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGd1YXJkZWRTaWduYWxzKSBwcm9jZXNzLm9mZihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICB9XG4gIGlmIChyZWNlaXZlZFNpZ25hbCkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgcmVjZWl2ZWRTaWduYWwpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBBY3RpdmVDaGlsZFJlZiB7XG4gIGN1cnJlbnQ6IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNwYXduIGFzeW5jaHJvbm91c2x5IGFuZCBhd2FpdCB0aGUgZXhpdCBzdGF0dXMuIFRoZSBldmVudCBsb29wIHN0YXlzIGZyZWUsIHNvIHBhcmVudC1vbmx5XG4gKiBzaWduYWxzIGFyZSBoYW5kbGVkIHByb21wdGx5IGFuZCBmb3J3YXJkZWQgdG8gdGhlIGNoaWxkIGJ5IHJlbGVhc2UoKSdzIHNpZ25hbCBoYW5kbGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBzcGF3bkFuZFdhaXQoXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZixcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogY2hpbGRfcHJvY2Vzcy5TcGF3bk9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSBjaGlsZDtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IpKSk7XG4gICAgICByZXNvbHZlKDEpO1xuICAgIH0pO1xuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKGNvZGUgPz8gMSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbGVhc2UgY2FuIHB1Ymxpc2ggdG8gbnBtLiBUcnVlIHVubGVzcyBhIHBsdWdpbiBsaXN0IGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZFxuICogKGluIGEgSlNPTi1wYXJzZWFibGUgc291cmNlKSBhbmQgb21pdHMgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgZXZlcnl3aGVyZSBpbiBzY29wZSDigJQgdGhlIHJvb3RcbiAqIGFuZCwgZm9yIG11bHRpLXNlbWFudGljLXJlbGVhc2UgbW9ub3JlcG9zLCBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlIChhIHBhY2thZ2UtbGV2ZWwgcGx1Z2luIGxpc3RcbiAqIG92ZXJyaWRlcyB0aGUgcm9vdCdzKS4gc2VtYW50aWMtcmVsZWFzZSdzIERFRkFVTFQgcGx1Z2luIGxpc3QgaW5jbHVkZXMgdGhlIG5wbSBwbHVnaW4sIHNvIGFcbiAqIG1pc3NpbmcgcGx1Z2luIGxpc3QsIGEgbm9uLUpTT04gY29uZmlnIGZpbGUsIG9yIGFuIGBleHRlbmRzYCBwcmVzZXQgY29uc2VydmF0aXZlbHkga2VlcHMgdGhlXG4gKiBucG0gcHJlcGFyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxlYXNlUHVibGlzaGVzVG9OcG0oXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJvb3RQbHVnaW5zID0gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3QucGFja2FnZUpzb24pO1xuICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJvb3QgcGx1Z2luIGxpc3QsIHNlbWFudGljLXJlbGVhc2UncyBkZWZhdWx0IGxpc3QgKG5wbSBpbmNsdWRlZCkgYXBwbGllcy5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHJvb3RQbHVnaW5zKSB8fCBwbHVnaW5zSW5jbHVkZU5wbShyb290UGx1Z2lucykpIHJldHVybiB0cnVlO1xuXG4gIGZvciAoY29uc3QgcGFja2FnZURpclBhdGggb2YgYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMocGFja2FnZURpclBhdGgsIHVuZGVmaW5lZCk7XG4gICAgLy8gQSB3b3Jrc3BhY2UgcGFja2FnZSB3aXRob3V0IGl0cyBvd24gcGx1Z2luIGxpc3QgaW5oZXJpdHMgdGhlIHJvb3QncyAobnBtLWZyZWUpIGRlY2lzaW9uLlxuICAgIGlmIChwbHVnaW5zID09PSAndW5rbm93bicgfHwgKEFycmF5LmlzQXJyYXkocGx1Z2lucykgJiYgcGx1Z2luc0luY2x1ZGVOcG0ocGx1Z2lucykpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBsdWdpbnNJbmNsdWRlTnBtKHBsdWdpbnM6IHJlYWRvbmx5IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGx1Z2lucy5zb21lKChwbHVnaW4pID0+IChBcnJheS5pc0FycmF5KHBsdWdpbikgPyBwbHVnaW5bMF0gOiBwbHVnaW4pID09PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJyk7XG59XG5cbi8qKlxuICogY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzIG9yZGVyIGZvciBtb2R1bGUgXCJyZWxlYXNlXCIgKHdoYXQgc2VtYW50aWMtcmVsZWFzZSAyNVxuICogZGVsZWdhdGVzIHRvKSwgbWludXMgdGhlIGxlYWRpbmcgcGFja2FnZS5qc29uIGVudHJ5LCB3aGljaCB0aGUgY2FsbGVyIGNoZWNrcyBmaXJzdC4gVGhlIEZJUlNUXG4gKiBleGlzdGluZyBwbGFjZSB3aW5zOyBwbGFjZXMgd2hvc2UgZm9ybWF0IEpTT04ucGFyc2UgY2Fubm90IHJlYWQgbWFrZSB0aGUgZWZmZWN0aXZlIHBsdWdpblxuICogbGlzdCAndW5rbm93bicuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuY2pzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMueW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLm1qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5janMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmNqcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5mdW5jdGlvbiByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZFxuKTogcmVhZG9ubHkgdW5rbm93bltdIHwgdW5kZWZpbmVkIHwgJ3Vua25vd24nIHtcbiAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlOyBhIG1pc3Npbmcgb3JcbiAgLy8gdW5yZWFkYWJsZSBwYWNrYWdlLmpzb24ganVzdCBmYWxscyB0aHJvdWdoIHRvIHRoZSBmaWxlIHNlYXJjaCBwbGFjZXMuXG4gIGlmIChwYWNrYWdlSnNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCB7XG4gICAgICBwYWNrYWdlSnNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgbGV0IGNvbmZpZyA9IChwYWNrYWdlSnNvbiBhcyB7IHJlbGVhc2U/OiB7IHBsdWdpbnM/OiB1bmtub3duOyBleHRlbmRzPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZWxlYXNlO1xuICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSBjb250aW51ZTtcbiAgICAgIGlmICghanNvblBhcnNlYWJsZSkgcmV0dXJuICd1bmtub3duJztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpIGFzIHR5cGVvZiBjb25maWc7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnBsdWdpbnMpKSByZXR1cm4gY29uZmlnLnBsdWdpbnM7XG4gIC8vIEFuIGBleHRlbmRzYCBwcmVzZXQgbWF5IGNvbnRyaWJ1dGUgaXRzIG93biBwbHVnaW4gbGlzdCwgd2hpY2ggY2Fubm90IGJlIHJlc29sdmVkIHN0YXRpY2FsbHkuXG4gIHJldHVybiBjb25maWcuZXh0ZW5kcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE1ha2UgdGhlIGNoZWNrb3V0IGRpZ2VzdGlibGUgZm9yIG5wbSwgd2hpY2ggc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0byBmb3JcbiAqIGBucG0gdmVyc2lvbmAgLyBgbnBtIHB1Ymxpc2hgOlxuICogMS4gbnBtJ3MgYXJib3Jpc3QgY2Fubm90IHdhbGsgQnVuJ3MgSVNPTEFURUQgbm9kZV9tb2R1bGVzIGxheW91dCAodGhlIGAuYnVuYCBzeW1saW5rIGZhcm0pLCBzb1xuICogICAgY2xlYW4tcmVpbnN0YWxsIHdpdGggdGhlIGhvaXN0ZWQgbGlua2VyIGZpcnN0LiBBIG5vbi1jbGVhbiBsaW5rZXIgc3dpdGNoIHdvdWxkIGxlYXZlIHN0YWxlXG4gKiAgICBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVoaW5kIChwYWNrYWdlcyB0aGVuIHJlc29sdmUgZnJvbSB+Ly5idW4vaW5zdGFsbC9jYWNoZS9saW5rcyB3aGVyZVxuICogICAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgYXJlIHVucmVhY2hhYmxlKSwgc28gZXZlcnkgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBpcyB3aXBlZCBmaXJzdC5cbiAqIDIuIG5wbSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlIEJ1biBSRVFVSVJFUyB0aGUgcHJvdG9jb2wgc28gYSBjb2xkIGluc3RhbGxcbiAqICAgIGxpbmtzIHRoZSB3b3Jrc3BhY2Ug4oCUIHNvIHJld3JpdGUgdGhlIHJhbmdlcyB0byBgKmAgQUZURVIgdGhlIHJlaW5zdGFsbCAoQnVuIG11c3Qgc3RpbGwgc2VlXG4gKiAgICB0aGUgcHJvdG9jb2wgd2hpbGUgaW5zdGFsbGluZzsgbnBtIG9ubHkgbmVlZHMgdGhlIG1hbmlmZXN0IFRFWFQgdG8gYmUgcGFyc2VhYmxlKS4gVGhlXG4gKiAgICBhZmZlY3RlZCBtYW5pZmVzdHMgYXJlIHByaXZhdGUvdW5wdWJsaXNoZWQgb3IgcmV3cml0dGVuIGJ5IHRoZSBucG0gcGx1Z2luIG9uIHB1Ymxpc2guXG4gKiBBbGwgbXV0YXRpb25zIGFyZSByZXN0b3JlZCBieSB0aGUgY2FsbGVyIGFmdGVyIHRoZSByZWxlYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlTnBtQ29tcGF0aWJsZUxheW91dChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUmVsZWFzZUFyZ3YsXG4gIG1vZGlmaWVkRmlsZXM6IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4sXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJ1bmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgY29uc3QgYnVuZmlnID0gZnMuZXhpc3RzU3luYyhidW5maWdQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhidW5maWdQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICBjb25zdCBob2lzdGVkQnVuZmlnID0gYnVuZmlnID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBidWlsZEhvaXN0ZWRCdW5maWcoYnVuZmlnKTtcbiAgaWYgKGJ1bmZpZyAhPT0gdW5kZWZpbmVkICYmIGhvaXN0ZWRCdW5maWcgIT09IGJ1bmZpZykge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKCdDbGVhbi1yZWluc3RhbGxpbmcgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgc28gbnBtIGNhbiB3YWxrIG5vZGVfbW9kdWxlcy4uLicpKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBtb2RpZmllZEZpbGVzLnNldChidW5maWdQYXRoLCBCdWZmZXIuZnJvbShidW5maWcsICd1dGY4JykpO1xuICAgICAgLy8gVGhlIGhvaXN0ZWQgcmVpbnN0YWxsIG1heSByZXdyaXRlIChvciBjcmVhdGUpIHRoZSBsb2NrZmlsZTsgc25hcHNob3QgdGhlIHJhdyBieXRlcyBzbyBhXG4gICAgICAvLyBzdWNjZXNzZnVsIHJlbGVhc2UgbGVhdmVzIG5vIHRyYWNrZWQgb3IgdW50cmFja2VkIGxvY2tmaWxlIGNoYW5nZXMgYmVoaW5kLlxuICAgICAgZm9yIChjb25zdCBsb2NrRmlsZU5hbWUgb2YgWydidW4ubG9jaycsICdidW4ubG9ja2InXSkge1xuICAgICAgICBjb25zdCBsb2NrRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBsb2NrRmlsZU5hbWUpO1xuICAgICAgICBtb2RpZmllZEZpbGVzLnNldChsb2NrRmlsZVBhdGgsIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhsb2NrRmlsZVBhdGgpIDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoYnVuZmlnUGF0aCwgaG9pc3RlZEJ1bmZpZyA/PyAnJywgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBbcHJvamVjdC5kaXJQYXRoLCAuLi4oYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKV0ubWFwKChkaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLmpvaW4oZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBub2RlTW9kdWxlc0RpclBhdGggb2Ygbm9kZU1vZHVsZXNEaXJQYXRocykge1xuICAgICAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICAvLyBSZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGxpZmVjeWNsZSBzY3JpcHRzIERJU0FCTEVEIHdoaWxlIHRoZSByZWxlYXNlIGNyZWRlbnRpYWxzXG4gICAgICAvLyAoVkVSREFDQ0lPX1RPS0VOLCBOUE1fVE9LRU4sIEdJVEhVQl9UT0tFTiwgRk5PWF9BR0VfS0VZLCAuLi4pIGFyZSBpbiB0aGUgZW52aXJvbm1lbnQsXG4gICAgICAvLyBzbyByZXBvc2l0b3J5LSBvciBkZXBlbmRlbmN5LWRlZmluZWQgcHJlaW5zdGFsbC9wb3N0aW5zdGFsbCBjYW4gbmV2ZXIgcmVhZCB0aGVtIOKAlFxuICAgICAgLy8gbWlycm9yaW5nIHJldXNhYmxlLXdvcmtmbG93cycgdHdvLXN0ZXAgcmVsZWFzZSBpbnN0YWxsIChpc3N1ZSAjMTAwMykuXG4gICAgICBjb25zdCBpbnN0YWxsU3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJywgJy0taWdub3JlLXNjcmlwdHMnXSwge1xuICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgaWYgKGluc3RhbGxTdGF0dXMgIT09IDApIHtcbiAgICAgICAgLy8gVGhyb3dpbmcgKGluc3RlYWQgb2YgcHJvY2Vzcy5leGl0LCB3aGljaCB3b3VsZCBza2lwIHRoZSBjYWxsZXIncyBmaW5hbGx5KSBsZXRzIHRoZVxuICAgICAgICAvLyByZXN0b3JlIHJ1biBiZWZvcmUgdGhlIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcHJlcGFyaW5nIHRoZSByZWxlYXNlLicpO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGF5IHRoZSBza2lwcGVkIGxpZmVjeWNsZSBzY3JpcHRzIGluIGEgY3JlZGVudGlhbC1zY3J1YmJlZCBlbnZpcm9ubWVudC4gQSByZXBlYXRlZFxuICAgICAgLy8gYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgZG9lcyBub3QgcmVwbGF5IHRoZW0sIHNvIG5vZGVfbW9kdWxlcyBpcyB3aXBlZCBhZ2FpbjtcbiAgICAgIC8vIGV2ZXJ5IHBhY2thZ2UgaXMgYWxyZWFkeSBpbiBidW4ncyBjYWNoZSBmcm9tIHRoZSBjcmVkZW50aWFsZWQgc3RlcCwgc28gdGhpcyByZS1saW5rXG4gICAgICAvLyBuZWVkcyBubyByZWdpc3RyeSBjcmVkZW50aWFscy5cbiAgICAgIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRoIG9mIG5vZGVNb2R1bGVzRGlyUGF0aHMpIHtcbiAgICAgICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVwbGF5U3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgIGVudjogYnVpbGRDcmVkZW50aWFsRnJlZUVudihwcm9qZWN0LmVudiksXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXBsYXlTdGF0dXMgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcmVwbGF5aW5nIGxpZmVjeWNsZSBzY3JpcHRzIGZvciB0aGUgcmVsZWFzZS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlycyA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhwcm9qZWN0KTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgW1xuICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLFxuICAgIC4uLndvcmtzcGFjZVBhY2thZ2VEaXJzLm1hcCgoZGlyUGF0aCkgPT4gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gIF0pIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICBjb25zdCBvcmlnaW5hbCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgLy8gU25hcHNob3QgRVZFUlkgbWFuaWZlc3QgKG5vdCBvbmx5IHJld3JpdHRlbiBvbmVzKTogc2VtYW50aWMtcmVsZWFzZSBhbHNvIGVkaXRzIG1hbmlmZXN0c1xuICAgIC8vIHdpdGhvdXQgd29ya3NwYWNlOiByYW5nZXMgKHZlcnNpb24gYnVtcHMpLCBhbmQgYSBmYWlsZWQgcmVsZWFzZSBtdXN0IHJlc3RvcmUgdGhvc2UgdG9vLlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KHBhY2thZ2VKc29uUGF0aCwgQnVmZmVyLmZyb20ob3JpZ2luYWwsICd1dGY4JykpO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlV29ya3NwYWNlUmFuZ2VzKG9yaWdpbmFsKTtcbiAgICBpZiAocmV3cml0dGVuID09PSBvcmlnaW5hbCkgY29udGludWU7XG5cbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUmV3cml0aW5nIHdvcmtzcGFjZTogcmFuZ2VzIGluICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9Li4uYCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCByZXdyaXR0ZW4sICd1dGY4Jyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBjcmVkZW50aWFscyB0aGUgcmVsZWFzZSB3b3JrZmxvdyBpbmplY3RzIChjZi4gcmV1c2FibGUtd29ya2Zsb3dzJyByZWxlYXNlLnltbCBzZWNyZXRzIGFuZFxuLy8gbnBtJ3Mgb3duIHRva2VuIHZhcmlhYmxlcykuIFRoZSByZWxlYXNlIGNvbW1hbmQgbG9hZHMgdGhlIHByb2plY3Qgd2l0aCBsb2FkRW52OiBmYWxzZSwgc28gbm9cbi8vIHdiLWxvYWRlci1pbmplY3RlZCBrZXlzIGV4aXN0IHRvIHNjcnViIGJleW9uZCB0aGVzZS4gQSBkZW55bGlzdCAobm90IGFuIGFsbG93bGlzdCkgaXNcbi8vIGRlbGliZXJhdGU6IGluIHRoZSBzdXBwb3J0ZWQgZW50cnkgcG9pbnQg4oCUIHJldXNhYmxlLXdvcmtmbG93cycgcmVsZWFzZSBqb2Ig4oCUIHRoZXNlIGVudW1lcmF0ZWRcbi8vIHZhcmlhYmxlcyBhcmUgdGhlIE9OTFkgc2VjcmV0cyBpbiB0aGUgYW1iaWVudCBlbnZpcm9ubWVudCAoZm5veCBzZWNyZXRzIHN0YXkgZW5jcnlwdGVkIGJlY2F1c2Vcbi8vIEZOT1hfQUdFX0tFWSBpcyBzY3J1YmJlZCBhbmQgbmV2ZXIgZXhwb3J0ZWQgYXMgcGxhaW50ZXh0IHRoZXJlKSwgd2hpbGUgYW4gYWxsb3dsaXN0IHdvdWxkXG4vLyBicmVhayBsaWZlY3ljbGUgc2NyaXB0cyB0aGF0IGxlZ2l0aW1hdGVseSByZWFkIG9wZXJhdGlvbmFsIHZhcmlhYmxlcyAoUEFUSCwgSE9NRSwgQ0ksIC4uLikuXG4vLyBBIGxvY2FsIGB3YiByZWxlYXNlYCBpbmhlcml0cyB3aGF0ZXZlciB0aGUgZGV2ZWxvcGVyJ3Mgc2hlbGwgYWxyZWFkeSBleHBvc2VzIHRvIGV2ZXJ5XG4vLyBgYnVuIGluc3RhbGxgLCB3aGljaCB0aGlzIHJlcGxheSBkb2VzIG5vdCB3aWRlbi5cbmNvbnN0IGNyZWRlbnRpYWxFbnZWYXJOYW1lcyA9IFtcbiAgJ1ZFUkRBQ0NJT19UT0tFTicsXG4gICdOUE1fVE9LRU4nLFxuICAnTk9ERV9BVVRIX1RPS0VOJyxcbiAgJ0dJVEhVQl9UT0tFTicsXG4gICdHSF9UT0tFTicsXG4gICdHSF9QQUNLQUdFU19UT0tFTicsXG4gICdHSF9QS0dfUkVBRF9UT0tFTicsXG4gICdGTk9YX0FHRV9LRVknLFxuXTtcblxuLyoqXG4gKiBBIGNvcHkgb2YgYGVudmAgc2FmZSB0byBleHBvc2UgdG8gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cy4gQ3JlZGVudGlhbCB2YXJpYWJsZXMgYXJlXG4gKiBFTVBUSUVEIHJhdGhlciB0aGFuIGRlbGV0ZWQgc28gYCR7VkVSREFDQ0lPX1RPS0VOfWAtc3R5bGUgcmVmZXJlbmNlcyBpbiAubnBtcmMga2VlcCBleHBhbmRpbmdcbiAqIHRvICcnIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGluc3RhbGwgKHRoZSBwYXR0ZXJuIHJldXNhYmxlLXdvcmtmbG93cyByZWxpZXMgb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDcmVkZW50aWFsRnJlZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc2NydWJiZWRFbnYgPSB7IC4uLmVudiB9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgY3JlZGVudGlhbEVudlZhck5hbWVzKSB7XG4gICAgaWYgKG5hbWUgaW4gc2NydWJiZWRFbnYpIHNjcnViYmVkRW52W25hbWVdID0gJyc7XG4gIH1cbiAgcmV0dXJuIHNjcnViYmVkRW52O1xufVxuXG4vKipcbiAqIFVuZG8gdGhlIHRlbXBvcmFyeSByZWxlYXNlLXRpbWUgbXV0YXRpb25zIG9mIG9uZSBmaWxlLiBgcGFja2FnZS5qc29uYCBmaWxlcyBhcmUgcmVzdG9yZWRcbiAqIHNlbWFudGljYWxseSBpbnN0ZWFkIG9mIGJ5dGUtZm9yLWJ5dGU6IHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHdyaXRlcyB0aGUgcmVsZWFzZWRcbiAqIHZlcnNpb24gaW50byBtYW5pZmVzdHMgd2hpbGUgdGhleSBob2xkIHRoZSByZXdyaXR0ZW4gcmFuZ2VzLCBhbmQgYSBieXRlIHJlc3RvcmUgd291bGQgc2lsZW50bHlcbiAqIHJldmVydCB0aGF0IGJ1bXAg4oCUIHNvIHdoZW4gdGhlIGZpbGUgY2hhbmdlZCBkdXJpbmcgdGhlIHJlbGVhc2UsIG9ubHkgdGhlIGB3b3Jrc3BhY2U6YFxuICogc3BlY2lmaWVycyBhcmUgd3JpdHRlbiBiYWNrIGludG8gdGhlIENVUlJFTlQgY29udGVudC5cbiAqL1xuLyoqIFJldHVybnMgd2hldGhlciB0aGUgb24tZGlzayBjb250ZW50IGFjdHVhbGx5IGNoYW5nZWQgKGRyaXZlcyB0aGUgXCJSZXN0b3JlZCAuLi5cIiBtZXNzYWdlKS4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVNb2RpZmllZEZpbGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG9yaWdpbmFsQ29udGVudDogQnVmZmVyIHwgdW5kZWZpbmVkLFxuICByZWxlYXNlU3VjY2VlZGVkOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgaWYgKG9yaWdpbmFsQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpO1xuICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZXhpc3RlZDtcbiAgfVxuICBpZiAocmVsZWFzZVN1Y2NlZWRlZCAmJiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ3BhY2thZ2UuanNvbicgJiYgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBvcmlnaW5hbENvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBpZiAoY3VycmVudENvbnRlbnQgIT09IHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMob3JpZ2luYWxUZXh0KSkge1xuICAgICAgY29uc3QgcmVzdG9yZWRDb250ZW50ID0gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudCwgb3JpZ2luYWxUZXh0KTtcbiAgICAgIGlmIChyZXN0b3JlZENvbnRlbnQgPT09IGN1cnJlbnRDb250ZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCByZXN0b3JlZENvbnRlbnQsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY3VycmVudEJ1ZmZlciA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGN1cnJlbnRCdWZmZXI/LmVxdWFscyhvcmlnaW5hbENvbnRlbnQpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFdyaXRlIHRoZSBzbmFwc2hvdCBieXRlcyB2ZXJiYXRpbTogYnVuLmxvY2tiIGlzIGJpbmFyeSwgc28gYW55IHRleHQgZGVjb2RlL2VuY29kZSByb3VuZCB0cmlwXG4gIC8vIHdvdWxkIGNvcnJ1cHQgaXQuXG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIb2lzdGVkQnVuZmlnKGJ1bmZpZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1bmZpZ1xuICAgIC5yZXBsYWNlKC9eKFxccypsaW5rZXJcXHMqPVxccyopW1wiJ11pc29sYXRlZFtcIiddL211LCAnJDFcImhvaXN0ZWRcIicpXG4gICAgLnJlcGxhY2UoL15cXHMqZ2xvYmFsU3RvcmVcXHMqPVxccyp0cnVlW15cXG5dKlxcbj8vbXUsICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMocGFja2FnZUpzb25Db250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBPcGVyYXRlIG9ubHkgaW5zaWRlIHRoZSBkZXBlbmRlbmN5IHNlY3Rpb25zOiBhIGJsYW5rZXQgYFwid29ya3NwYWNlOi4uLlwiYCByZXBsYWNlbWVudCB3b3VsZFxuICAvLyBhbHNvIGNvcnJ1cHQgdW5yZWxhdGVkIHN0cmluZyB2YWx1ZXMgKGUuZy4gYSBkZXNjcmlwdGlvbiBzdGFydGluZyB3aXRoIGB3b3Jrc3BhY2U6YCksIGFuZCBhXG4gIC8vIG5hbWUta2V5ZWQgZ2xvYmFsIHJlcGxhY2VtZW50IHdvdWxkIHRvdWNoIHNhbWUtbmFtZWQga2V5cyBpbiBvdGhlciBzZWN0aW9ucyAoZS5nLiBvdmVycmlkZXMpLlxuICByZXR1cm4gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKHBhY2thZ2VKc29uQ29udGVudCwgKHNlY3Rpb24pID0+XG4gICAgc2VjdGlvbi5yZXBsYWNlQWxsKC8oXCJbXlwiXFxuXStcIlxccyo6XFxzKilcIndvcmtzcGFjZTpbXlwiXSpcIi9ndSwgJyQxXCIqXCInKVxuICApO1xufVxuXG4vKipcbiAqIFJlLWFwcGx5IHRoZSBvcmlnaW5hbCBgd29ya3NwYWNlOmAgc3BlY2lmaWVycyB0byB0aGUgQ1VSUkVOVCBtYW5pZmVzdCBjb250ZW50LiBNYXRjaGluZyBrZXlzXG4gKiBvZmYgdGhlIGRlcGVuZGVuY3kgTkFNRSAobm90IHRoZSBgXCIqXCJgIHBsYWNlaG9sZGVyKSBpcyBkZWxpYmVyYXRlOiBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ3NcbiAqIHByZXBhcmUgc3RlcCBvdmVyd3JpdGVzIGxvY2FsIGRlcGVuZGVuY3kgc3BlY2lmaWVycyB3aXRoIGNvbmNyZXRlIHJlbGVhc2VkIHZlcnNpb25zLCBhbmQgdGhlXG4gKiBjb21taXR0ZWQgbWFuaWZlc3QgbXVzdCBnZXQgaXRzIGB3b3Jrc3BhY2U6YCBwcm90b2NvbCBiYWNrIHJlZ2FyZGxlc3Mg4oCUIEJ1biByZXF1aXJlcyB0aGVcbiAqIHByb3RvY29sIHNvIGEgY29sZCBpbnN0YWxsIGxpbmtzIHRoZSB3b3Jrc3BhY2UgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSByZWdpc3RyeSBjb3B5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudDogc3RyaW5nLCBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmtzcGFjZURlcGVuZGVuY2llcyA9IGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMob3JpZ2luYWxDb250ZW50KTtcbiAgLy8gUmVzdG9yZSBwZXIgKHNlY3Rpb24sIG5hbWUpOiBhIHNhbWUtbmFtZWQgZGVwZW5kZW5jeSBpbiBhbm90aGVyIHNlY3Rpb24gbWF5IGxlZ2l0aW1hdGVseVxuICAvLyBob2xkIGEgbm9uLXdvcmtzcGFjZSByYW5nZSAoZS5nLiBhIHBlZXJEZXBlbmRlbmNpZXMgYD49MS4wLjBgIG5leHQgdG8gYSBkZXZEZXBlbmRlbmNpZXNcbiAgLy8gYHdvcmtzcGFjZToqYCkgb3IgYSBkaWZmZXJlbnQgd29ya3NwYWNlIHJhbmdlLCBhbmQgbXVzdCBrZWVwIGl0cyBvd24gdmFsdWUuXG4gIHJldHVybiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMoY3VycmVudENvbnRlbnQsIChzZWN0aW9uLCBzZWN0aW9uS2V5KSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IHNlY3Rpb247XG4gICAgZm9yIChjb25zdCB7IHNlY3Rpb246IGRlcGVuZGVuY3lTZWN0aW9uLCBuYW1lLCBzcGVjaWZpZXIgfSBvZiB3b3Jrc3BhY2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGlmIChkZXBlbmRlbmN5U2VjdGlvbiAhPT0gc2VjdGlvbktleSkgY29udGludWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChcbiAgICAgICAgbmV3IFJlZ0V4cChgKFwiJHtlc2NhcGVSZWdFeHAobmFtZSl9XCJcXFxccyo6XFxcXHMqKVwiW15cIl0qXCJgLCAnZ3UnKSxcbiAgICAgICAgLy8gQSByZXBsYWNlciBmdW5jdGlvbiwgbm90IGEgcmVwbGFjZW1lbnQgc3RyaW5nOiBzcGVjaWZpZXJzIGNvbnRhaW5pbmcgYCRgIG11c3QgYmVcbiAgICAgICAgLy8gaW5zZXJ0ZWQgbGl0ZXJhbGx5IGluc3RlYWQgb2YgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgc3Vic3RpdHV0aW9uIHBhdHRlcm5zLlxuICAgICAgICAoX21hdGNoLCBwcmVmaXg6IHN0cmluZykgPT4gYCR7cHJlZml4fSR7SlNPTi5zdHJpbmdpZnkoc3BlY2lmaWVyKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuLyoqIERlcGVuZGVuY3kgc2VjdGlvbnMgY29udGFpbiBvbmx5IGBcIm5hbWVcIjogXCJzcGVjaWZpZXJcImAgc3RyaW5nIHBhaXJzLCBzbyBgW157fV0qYCBzcGFucyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHJlcGxhY2VTZWN0aW9uOiAoc2VjdGlvbjogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAvKFwiKGRlcGVuZGVuY2llc3xkZXZEZXBlbmRlbmNpZXN8b3B0aW9uYWxEZXBlbmRlbmNpZXN8cGVlckRlcGVuZGVuY2llcylcIlxccyo6XFxzKlxceykoW157fV0qKShcXH0pL2d1LFxuICAgIChfbWF0Y2gsIHByZWZpeDogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcsIGJvZHk6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpID0+XG4gICAgICBgJHtwcmVmaXh9JHtyZXBsYWNlU2VjdGlvbihib2R5LCBzZWN0aW9uS2V5KX0ke3N1ZmZpeH1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uQ29udGVudDogc3RyaW5nXG4pOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10ge1xuICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uO1xuICB0cnkge1xuICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jaWVzOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdCkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltrZXldID8/IHt9KSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHsgc2VjdGlvbjoga2V5LCBuYW1lLCBzcGVjaWZpZXI6IHZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZW1hbnRpY1JlbGVhc2UocHJvamVjdDogUHJvamVjdCwgYXJndjogUmVsZWFzZUFyZ3YsIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGZvcndhcmRlZEFyZ3MgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV0ubWFwKFN0cmluZyk7XG4gIC8vIFRoZSBQQUNLQUdFIG5hbWUgKGZvciBgYnVueGAvYHlhcm4gZGx4YCwgd2hpY2ggZmV0Y2ggYSBwYWNrYWdlKSBhbmQgdGhlIEJJTiBuYW1lIChmb3IgdGhlXG4gIC8vIGxvY2FsIG5vZGVfbW9kdWxlcy8uYmluIGxvb2t1cCkgZGlmZmVyIGZvciB0aGUgc2NvcGVkIGZvcmtzOiBgYnVueCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlYFxuICAvLyB3b3VsZCBmZXRjaCB0aGUgdW5yZWxhdGVkIHVuc2NvcGVkIG5wbSBwYWNrYWdlIGluc3RlYWQgb2YgZS5nLiBAYW5vbGlsYWIncyBmb3JrLlxuICBjb25zdCByZWxlYXNlUGFja2FnZU5hbWUgPSAoXG4gICAgWydAYW5vbGlsYWIvbXVsdGktc2VtYW50aWMtcmVsZWFzZScsICdtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJywgJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXSBhcyBjb25zdFxuICApLmZpbmQoKHBhY2thZ2VOYW1lKSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSk7XG4gIGNvbnN0IHJlbGVhc2VCaW4gPSByZWxlYXNlUGFja2FnZU5hbWUgPyAnbXVsdGktc2VtYW50aWMtcmVsZWFzZScgOiAnc2VtYW50aWMtcmVsZWFzZSc7XG5cbiAgLy8gVGhlIHByb2plY3QgaXMgbG9hZGVkIHdpdGggbG9hZEVudjogZmFsc2UgKHNlbWFudGljLXJlbGVhc2UgcnVucyB3aXRoIHRoZSBhbWJpZW50L0NJXG4gIC8vIGVudmlyb25tZW50IGJ5IGRlc2lnbiksIHNvIHByb2plY3QuZW52IGFsaWFzZXMgcHJvY2Vzcy5lbnYgaGVyZTsgdXNpbmcgaXQga2VlcHMgdGhlXG4gIC8vIHByb2plY3QuZW52IGNvbnZlbnRpb24gYW5kIHBpY2tzIHVwIGVudiBsb2FkaW5nIGlmIHRoYXQgZGVzaWduIGV2ZXIgY2hhbmdlcy5cbiAgY29uc3QgZW52ID0geyAuLi5wcm9qZWN0LmVudiB9O1xuICBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgocHJvamVjdC5kaXJQYXRoLCBlbnYpO1xuICBjb25zdCBoYXNMb2NhbEJpbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJywgcmVsZWFzZUJpbikpO1xuICBjb25zdCBmYWxsYmFja1BhY2thZ2VOYW1lID0gcmVsZWFzZVBhY2thZ2VOYW1lID8/ICdzZW1hbnRpYy1yZWxlYXNlJztcbiAgY29uc3QgY29tbWFuZCA9IGhhc0xvY2FsQmluXG4gICAgPyBbcmVsZWFzZUJpbiwgLi4uZm9yd2FyZGVkQXJnc11cbiAgICA6IHByb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kID09PSAnYnVuJ1xuICAgICAgPyBbJ2J1bngnLCBmYWxsYmFja1BhY2thZ2VOYW1lLCAuLi5mb3J3YXJkZWRBcmdzXVxuICAgICAgOiBbJ3lhcm4nLCAnZGx4JywgZmFsbGJhY2tQYWNrYWdlTmFtZSwgLi4uZm9yd2FyZGVkQXJnc107XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiAke2NvbW1hbmQuam9pbignICcpfWApKTtcbiAgaWYgKGFyZ3YuZHJ5UnVuKSByZXR1cm4gMDtcblxuICByZXR1cm4gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCBjb21tYW5kWzBdISwgY29tbWFuZC5zbGljZSgxKSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudixcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZXNvbHZlRmFsbGJhY2tXYkVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBnZXRSdW5TY3JpcHRBcmdzIH0gZnJvbSAnLi4vLi4vYmluL3J1bkFyZ3MuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCByZWFkQW5kTWVyZ2VFbnZpcm9ubWVudFZhcmlhYmxlcywgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB1c2VzQnVuUnVudGltZSB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHsgcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCB9IGZyb20gJy4vZG90ZW52LmpzJztcblxuZXhwb3J0IGNvbnN0IHJ1bkNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdydW4gW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ0xvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBydW4gYSBzY3JpcHQgd2l0aCB0aGUgcHJvamVjdCBydW50aW1lLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHtcbiAgICAgICdwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnOiBmYWxzZSxcbiAgICAgICdwb3B1bGF0ZS0tJzogdHJ1ZSxcbiAgICAgICd1bmtub3duLW9wdGlvbnMtYXMtYXJncyc6IHRydWUsXG4gICAgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFyZ3MgPSBnZXRSdW5TY3JpcHRBcmdzKHByb2Nlc3MuYXJndik7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVc2FnZTogd2IgcnVuIDxzY3JpcHQ+IFthcmdzLi4uXScpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgY3dkKTtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0Py5lbnYgPz8gcmVhZFN0YW5kYWxvbmVFbnZpcm9ubWVudChhcmd2LCBjd2QpO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBidWlsZFJ1bkNvbW1hbmQoY3dkLCBhcmdzLCBlbnYsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGBXb3VsZCBydW46ICR7Y29tbWFuZC5qb2luKCcgJyl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHJ1bkNvbW1hbmRXaXRoRW52aXJvbm1lbnQoY29tbWFuZCwgJ3diIHJ1biA8c2NyaXB0PiBbYXJncy4uLl0nLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBidWlsZFJ1bkNvbW1hbmQoY3dkOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBwcm9qZWN0PzogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKCF1c2VzQnVuUnVudGltZShjd2QpKSByZXR1cm4gWydub2RlJywgLi4uYXJnc107XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBwYWNrYWdlLmpzb24gc2NyaXB0cyBiZWZvcmUgbG9jYWwgYmluYXJpZXMsIHNvIGEgc2NyaXB0IHRoYXQgaW52b2tlc1xuICAvLyBgd2IgcnVuIDxpdHMgb3duIG5hbWU+YCAoZS5nLiBcInZpdGVzdFwiOiBcIndiIHJ1biB2aXRlc3QgcnVuXCIpIHdvdWxkIHJlc3Bhd24gaXRzZWxmIGZvcmV2ZXIuXG4gIC8vIEJ5cGFzcyBzY3JpcHQgcmVzb2x1dGlvbiBvbmx5IGZvciBnZW51aW5lIHNlbGYtcmVjdXJzaW9uOiB0aGUgdGFyZ2V0IG5hbWVzIHRoZSBsaWZlY3ljbGVcbiAgLy8gc2NyaXB0IHRoYXQgc3Bhd25lZCB0aGlzIHByb2Nlc3MgQU5EIHRoZSBjdXJyZW50IHBhY2thZ2UgZGVjbGFyZXMgdGhhdCB2ZXJ5IHNjcmlwdCB0ZXh0IOKAlFxuICAvLyBhIGNyb3NzLXBhY2thZ2UgZGVsZWdhdGlvbiB2aWEgLS13b3JraW5nLWRpciByZWFjaGVzIGEgZGlmZmVyZW50IHNjcmlwdCB0ZXh0LCBzbyBpdCBzdGlsbFxuICAvLyBydW5zIHRoZSBkZXN0aW5hdGlvbidzIHNjcmlwdC4gcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCBwcmVwZW5kcyBub2RlX21vZHVsZXMvLmJpbiB0b1xuICAvLyBQQVRILCByZXNvbHZpbmcgdGhlIGRpcmVjdCBleGVjdXRpb24gdG8gdGhlIGxvY2FsIGJpbmFyeS5cbiAgY29uc3QgdGFyZ2V0ID0gYXJnc1swXTtcbiAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT09IGVudi5ucG1fbGlmZWN5Y2xlX2V2ZW50KSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gcHJvamVjdCA/IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uW3RhcmdldF0gOiByZWFkUGFja2FnZVNjcmlwdChjd2QsIHRhcmdldCk7XG4gICAgaWYgKHNjcmlwdCAhPT0gdW5kZWZpbmVkICYmIHNjcmlwdCA9PT0gZW52Lm5wbV9saWZlY3ljbGVfc2NyaXB0KSByZXR1cm4gWy4uLmFyZ3NdO1xuICB9XG4gIHJldHVybiBbJ2J1bicsICdydW4nLCAuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VTY3JpcHQoY3dkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBzY3JpcHRzIGZyb20gdGhlIG5lYXJlc3QgYW5jZXN0b3IgcGFja2FnZS5qc29uLCBzbyBtYXRjaCB0aGF0IHNjb3BlXG4gIC8vIChlLmcuIC0td29ya2luZy1kaXIgbWF5IHBvaW50IHRvIGEgbWFuaWZlc3QtbGVzcyBzdWJkaXJlY3Rvcnkgb2YgdGhlIHJlY3Vyc2luZyBwYWNrYWdlKS5cbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcGFja2FnZUpzb24uc2NyaXB0cz8uW25hbWVdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpID09PSBjdXJyZW50UGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkU3RhbmRhbG9uZUVudmlyb25tZW50KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgY3dkOiBzdHJpbmcpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IFtlbnZdID0gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZW52LldCX0VOViB8fD0gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndik7XG4gIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3YsIGVudik7XG4gIHJldHVybiBlbnY7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgZW52OiBOb2RlSlMuUHJvY2Vzc0Vudik6IHZvaWQge1xuICBpZiAoZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHwgZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAndHJ1ZScpIHJldHVybjtcbiAgY29uc3Qgc3RhbmRhcmRNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcbiAgaWYgKGVudi5XQl9FTlYgJiYgIXN0YW5kYXJkTW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7ZW52LldCX0VOVn1cIi4gYCArXG4gICAgICAgICdGaXggdGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlLCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBzZWxlY3RlZENhc2NhZGUgPVxuICAgIHR5cGVvZiBhcmd2LmNhc2NhZGVFbnYgPT09ICdzdHJpbmcnXG4gICAgICA/IGFyZ3YuY2FzY2FkZUVudlxuICAgICAgOiBhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2VcbiAgICAgICAgICA/IHJ1bnRpbWVFbnYuV0JfRU5WIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoZW52LldCX0VOViAmJiBzZWxlY3RlZENhc2NhZGUgJiYgc3RhbmRhcmRNb2Rlcy5oYXMoc2VsZWN0ZWRDYXNjYWRlKSAmJiBlbnYuV0JfRU5WICE9PSBzZWxlY3RlZENhc2NhZGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke3NlbGVjdGVkQ2FzY2FkZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAnRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgbG9hZGVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIChkLm5hbWUgPT09ICdtaXNlLnRvbWwnIHx8IGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignbWlzZSBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgcmVzb2x2ZXMgdGhlIHByb2plY3QncyBBQ1RJVkUgaW50ZXJwcmV0ZXIgdG8gYSBzaW5nbGUgYWJzb2x1dGUgcGF0aCxcbiAgICAgIC8vIHVubGlrZSBgbWlzZSBjdXJyZW50IHB5dGhvbmAsIHdoaWNoIHByaW50cyBldmVyeSBjb25maWd1cmVkIHZlcnNpb24gKG1pc2Ugc3VwcG9ydHNcbiAgICAgIC8vIG11bHRpLXZlcnNpb24gcGlucykgYW5kIHdvdWxkIHBhc3MgZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC5cbiAgICAgIGxldCBweXRob25QYXRoID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBweXRob25QYXRoID0gY2hpbGRfcHJvY2Vzc1xuICAgICAgICAgIC5leGVjU3luYygnbWlzZSB3aGljaCBweXRob24nLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSB9KVxuICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBtaXNlIG1pc3Npbmcgb3IgcHl0aG9uIHVuY29uZmlndXJlZDsgbGV0IHBvZXRyeSBwaWNrIGl0cyBkZWZhdWx0IGludGVycHJldGVyLlxuICAgICAgfVxuICAgICAgaWYgKHB5dGhvblBhdGgpIHtcbiAgICAgICAgLy8gVGhlIGNvbW1hbmQgcnVucyB0aHJvdWdoIGEgc2hlbGw7IFBPU0lYIHNpbmdsZSBxdW90ZXMga2VlcCB0aGUgcGF0aCBvbmUgbGl0ZXJhbCBhcmd1bWVudFxuICAgICAgICAvLyBldmVuIHdoZW4gYSByZWxvY2F0ZWQgbWlzZSBkYXRhIGRpciBwdXRzIG1ldGFjaGFyYWN0ZXJzIGludG8gaXQuXG4gICAgICAgIGNvbnN0IHF1b3RlZFB5dGhvblBhdGggPSBgJyR7cHl0aG9uUGF0aC5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7cXVvdGVkUHl0aG9uUGF0aH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkSW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgY29uc3QgbWlzZUFnZUtleVNlY3JldE9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWVxuICAgICAgPyAnXFxuICAgICAgICAtLXNlY3JldCBpZD1taXNlX2FnZV9rZXksZW52PU1JU0VfQUdFX0tFWSdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSR7bWlzZUFnZUtleVNlY3JldE9wdGlvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlFbnZPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVkgPyAnLS1lbnYgTUlTRV9BR0VfS0VZICcgOiAnJztcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9JHttaXNlQWdlS2V5RW52T3B0aW9ufSR7c2VsZWN0Q29udGFpbmVyRW52T3B0aW9ucyhwcm9qZWN0KX0tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZG9ja2VyIHJtIC1mICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ID4gL2Rldi9udWxsIDI+JjEgfHwgdHJ1ZWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG5cbi8vIFZhcmlhYmxlcyB0aGUgSU1BR0UgaXRzZWxmIG93bnM6IGEgRG9ja2VyZmlsZSBwaW5zIHRoZSBjb250YWluZXIgcG9ydCAodGhlIHB1Ymxpc2hlZCBtYXBwaW5nXG4vLyB0YXJnZXRzIDgwODAsIG5vdCB0aGUgaG9zdC1zaWRlIFBPUlQpIGFuZCB0aGUgcnVudGltZSBtb2RlIGl0IHdhcyBidWlsdCBmb3IsIGFuZCBiZWZvcmUgZm5veCB0aGVcbi8vIGJha2VkIC5lbnYgZmlsZXMgbG9zdCB0byB0aG9zZSBgRU5WYCB2YWx1ZXMgdG9vIGJlY2F1c2UgcHJvY2Vzcy5lbnYgd2lucyBvdmVyIGVudiBzb3VyY2VzLlxuY29uc3QgSU1BR0VfT1dORURfS0VZUyA9IG5ldyBTZXQoWydOT0RFX0VOVicsICdQT1JUJ10pO1xuXG4vKipcbiAqIGBkb2NrZXIgcnVuIC0tZW52IEtFWWAgb3B0aW9ucyBmb3IgZXZlcnkgdmFyaWFibGUgdGhlIHByb2plY3QgZGVjbGFyZXMsIHNvIGEgY29udGFpbmVyIGdldHMgdGhlXG4gKiBhcHAncyBlbnZpcm9ubWVudC4gU2luY2UgZm5veCByZXBsYWNlZCB0aGUgLmVudiBmaWxlcyB0aGF0IGltYWdlcyB1c2VkIHRvIGJha2UgaW4g4oCUIHRoZSBhZ2Uga2V5XG4gKiB0aGF0IGRlY3J5cHRzIHRoZW0gbXVzdCBuZXZlciBlbnRlciBhIGNvbnRhaW5lciDigJQgYSBjb250YWluZXIgd291bGQgb3RoZXJ3aXNlIHN0YXJ0IHdpdGggbm9cbiAqIGNvbmZpZ3VyYXRpb24gYXQgYWxsLiBPbmx5IE5BTUVTIGFyZSBwYXNzZWQ6IGRvY2tlciB0aGVuIGZvcndhcmRzIGVhY2ggdmFsdWUgZnJvbSB3YidzIG93blxuICogZW52aXJvbm1lbnQsIGtlZXBpbmcgc2VjcmV0cyBvdXQgb2YgdGhlIGNvbW1hbmQgbGluZSAodmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgQ0kgbG9ncykuXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdENvbnRhaW5lckVudk9wdGlvbnMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIGNvbnN0IG9wdGlvbnMgPSBzZWxlY3RDb250YWluZXJFbnZLZXlzKHByb2plY3QuZGVjbGFyZWRFbnZLZXlzLCBwcm9qZWN0LmVudikubWFwKChrZXkpID0+IGAtLWVudiAke2tleX1gKTtcbiAgcmV0dXJuIG9wdGlvbnMubGVuZ3RoID4gMCA/IGAke29wdGlvbnMuam9pbignICcpfSBgIDogJyc7XG59XG5cbi8qKiBUaGUgZGVjbGFyZWQgdmFyaWFibGVzIHRvIGZvcndhcmQgaW50byBhIGNvbnRhaW5lciwgc29ydGVkIGZvciBhIHN0YWJsZSBjb21tYW5kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdENvbnRhaW5lckVudktleXMoXG4gIGRlY2xhcmVkRW52S2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+XG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uZGVjbGFyZWRFbnZLZXlzXVxuICAgIC5maWx0ZXIoKGtleSkgPT4gIUlNQUdFX09XTkVEX0tFWVMuaGFzKGtleSkgJiYgZW52W2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQge1xuICBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aCxcbiAgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxuICB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21TdGFydFNjcmlwdFBhdGggPSBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0KTtcbiAgICBpZiAoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSB7XG4gICAgICBjb25zdCBzdGFydENvbW1hbmQgPVxuICAgICAgICBgJHtidWlsZFNoZWxsQ29tbWFuZChbJ2Jhc2gnLCBjdXN0b21TdGFydFNjcmlwdFBhdGhdKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAgIC8vIEEgc3RhcnQgc2NyaXB0IGZvdW5kIGF0IHRoZSBtb25vcmVwbyByb290IChjZi4gUHJvamVjdC5maW5kRmlsZSkgaXMgd3JpdHRlbiB0byBydW4gZnJvbVxuICAgICAgLy8gdGhlIHJvb3QsIGxpa2UgRG9ja2VyJ3MgV09SS0RJUiwgc28gaXRzIGN3ZCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzLy5cbiAgICAgIGNvbnN0IHNjcmlwdFJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShjdXN0b21TdGFydFNjcmlwdFBhdGgpKTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgc2NyaXB0Um9vdERpclBhdGggPT09IHByb2plY3QuZGlyUGF0aFxuICAgICAgICAgID8gc3RhcnRDb21tYW5kXG4gICAgICAgICAgOiBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIHNjcmlwdFJvb3REaXJQYXRoXSl9ICYmICR7c3RhcnRDb21tYW5kfSlgLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZWNvc3lzdGVtQ29uZmlnUGF0aCA9IGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gZWNvc3lzdGVtQ29uZmlnUGF0aFxuICAgICAgPyBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXVxuICAgICAgOiB0aGlzLmJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBjb21tYW5kcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kcyA9IHRoaXMuYnVpbGRNaWdyYXRpb25Db21tYW5kcyhwcm9qZWN0KTtcbiAgICAvLyBTcGxpdHRpbmcgbWF5IGN1dCB0aHJvdWdoIGEgYChjZCDigKYgJiYg4oCmKWAgc3Vic2hlbGwsIGJ1dCByZWpvaW5pbmcgd2l0aCAnICYmICcgYW5kIHBlci1waWVjZVxuICAgIC8vIHJlZGlyZWN0cyBrZWVwcyB0aGUgc2NyaXB0IHZhbGlkLCBhbmQgd2ItZ2VuZXJhdGVkIHBhdGhzIG5ldmVyIGNvbnRhaW4gJyYmJy5cbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkTWlncmF0aW9uQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgICAvLyBUZXN0LWVudmlyb25tZW50IHdyYW5nbGVyIHN0YXRlIGlzIGRpc3Bvc2FibGU7IHdpcGUgaXQgZW50aXJlbHkgKG5vdCBqdXN0IEQxKSBiZWZvcmVcbiAgICAvLyBtaWdyYXRpbmcsIHNpbmNlIHN0YWxlIEtWIGNhY2hlIGVudHJpZXMgb3IgRHVyYWJsZSBPYmplY3Qgc3RvcmFnZSBjYW4gYnJlYWsgZTJlIHRlc3RzLlxuICAgIGNvbnN0IHdyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMgPVxuICAgICAgaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpXG4gICAgICAgID8gW2BybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImBdXG4gICAgICAgIDogW107XG4gICAgLy8gQSBwcm9qZWN0IHdob3NlIEQxIGJpbmRpbmdzIGNhcnJ5IHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGFwcGxpZXMgdGhlbSB3aXRoIHdyYW5nbGVyXG4gICAgLy8gKHNlZSBXb3JrZXJzU2NyaXB0cyAvIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKS4gUnVubmluZyBkcml6emxlLWtpdCBtaWdyYXRlIGFnYWluc3RcbiAgICAvLyB0aGUgc2FtZSBsb2NhbCBEMSB3b3VsZCBhcHBseSB0aGUgc2FtZSBTUUwgdHdpY2Ug4oCUIGRyaXp6bGUncyBnZW5lcmF0ZWQgc3RhdGVtZW50cyBhcmUgbm90XG4gICAgLy8gaWRlbXBvdGVudCAoYENSRUFURSBJTkRFWGAgd2l0aG91dCBJRiBOT1QgRVhJU1RTKSDigJQgc28gZHJpenpsZSBzdGF5cyBPUk0tb25seSB0aGVyZS5cbiAgICBjb25zdCBtaWdyYXRlc0QxV2l0aFdyYW5nbGVyID0gISFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gW1xuICAgICAgLi4ud3JhbmdsZXJTdGF0ZVdpcGVDb21tYW5kcyxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuaGFzRHJpenpsZSAmJiAhbWlncmF0ZXNEMVdpdGhXcmFuZ2xlclxuICAgICAgICA/IFt3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBkcml6emxlU2NyaXB0cy5taWdyYXRlRm9yU3RhcnQocHJvamVjdCkpXVxuICAgICAgICA6IFtdKSxcbiAgICBdO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBJbiB0aGUgdGVzdCBlbnZpcm9ubWVudCB0aGUgZGV2IHNlcnZlciBydW5zIGFnYWluc3QgZnJlc2gsIGRpc3Bvc2FibGUgc3RhdGUgKGUuZy4gYW4gZW1wdHlcbiAgICAvLyBsb2NhbCBEMSksIHNvIHRoZSBzY2hlbWEgbXVzdCBiZSBtaWdyYXRlZCBmaXJzdCDigJQgYW4gYXBwIHdob3NlIHBhZ2VzIHF1ZXJ5IHRoZSBkYXRhYmFzZVxuICAgIC8vIHdvdWxkIG90aGVyd2lzZSBhbnN3ZXIgNTAwIGFuZCB0aGUgc3RhcnR1cCBjaGVjayB3b3VsZCBuZXZlciBzZWUgYSAyeHguXG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZHMgPSBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpID8gdGhpcy5idWlsZE1pZ3JhdGlvbkNvbW1hbmRzKHByb2plY3QpIDogW107XG4gICAgLy8gVXNlIGVtcHR5IE5PREVfRU5WIHRvIGF2b2lkIFwicHJvZHVjdGlvblwiIG1vZGUgaW4gc29tZSBmcmFtZXdvcmtzLlxuICAgIGNvbnN0IHN0YXJ0dXBDaGVja0NvbW1hbmQgPSBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcywgc3RhcnR1cENoZWNrQ29tbWFuZF0uam9pbignICYmICcpO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IHRoaXMuYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBwbGF5d3JpZ2h0Q29tbWFuZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwMCAtaSAyMDAwJyl9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9YCxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKdXN0IHJ1bnMgUGxheXdyaWdodCAocGx1cyB0aGUgb3B0aW9uYWwgYHRlc3QvZTJlLWFkZGl0aW9uYWxgIHNjcmlwdCksIHdpdGhvdXQgbGF1bmNoaW5nIHRoZSBhcHAuXG4gICAqIFVzZSB3aGVuIFBsYXl3cmlnaHQncyBvd24gYHdlYlNlcnZlcmAgY29uZmlnIGJ1aWxkcyBhbmQgc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC5cbiAgICovXG4gIHByb3RlY3RlZCBidWlsZFBsYXl3cmlnaHRPbmx5Q29tbWFuZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGAke2J1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cywgYXJndi5iYWlsLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyl9JHtzdWZmaXh9YDtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIHRlc3RVbml0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBpZiAocHJvamVjdC5oYXNWaXRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIHRoaXMgY29tbWFuZCBpcyByZWZlcnJlZCBmcm9tIG90aGVyIGNvbW1hbmRzLCB3ZSBoYXZlIHRvIHVzZSBcInZpdGVzdCBydW5cIiAobm9uLWludGVyYWN0aXZlIG1vZGUpLlxuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAndml0ZXN0JyxcbiAgICAgICAgJ3J1bicsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAnLS1wYXNzV2l0aE5vVGVzdHMnLFxuICAgICAgICAnLS1hbGxvd09ubHknLFxuICAgICAgICAnLS13YXRjaD1mYWxzZScsXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbD0xJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9IGVsc2UgaWYgKHByb2plY3QuaXNCdW5BdmFpbGFibGUpIHtcbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdidW4nLFxuICAgICAgICAndGVzdCcsXG4gICAgICAgIC4uLih0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L3VuaXQvJ10pLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWwnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gJ2VjaG8gXCJObyB0ZXN0cy5cIic7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAgLWkgNTAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMTAwMDAgLWkgMTAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDIwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAyMDAwMCAtaSA0MDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgNjAwMDAgLWkgNTAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDkwMDAwIC1pIDEwMDAwJyl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCl9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHdhaXQtb24gYm9vdCBjaGVjayBmb3IgYSBsaXN0ZW5pbmcgbG9vcGJhY2sgcG9ydC4gQSBUQ1AgY2hlY2sgdHJlYXRzIHJlZGlyZWN0cyBhbmRcbiAqIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlcyBhcyBhIHN1Y2Nlc3NmdWxseSBzdGFydGVkIHNlcnZlcjsgYW4gSFRUUCBzdGF0dXMgY2hlY2sgd291bGQga2VlcFxuICogd2FpdGluZyBldmVuIHRob3VnaCBQbGF5d3JpZ2h0IGNhbiBhbHJlYWR5IHVzZSB0aGUgYXBwLiBgbG9jYWxob3N0YCBsZXRzIE5vZGUgdHJ5IGJvdGggYWRkcmVzc1xuICogZmFtaWxpZXMgd2hlbiBhIGRldiBzZXJ2ZXIgYmluZHMgb25seSBJUHY0IG9yIElQdjYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsIHdhaXRPbkFyZ3M/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkIHx8IHBvcnQgPT09ICcnKSB0aHJvdyBuZXcgRXJyb3IoJ1BvcnQgaXMgcmVxdWlyZWQgZm9yIHRoZSBsb29wYmFjayByZWFkaW5lc3MgY2hlY2suJyk7XG4gIHJldHVybiBgd2FpdC1vbiAke3dhaXRPbkFyZ3MgPyBgJHt3YWl0T25BcmdzfSBgIDogJyd9dGNwOmxvY2FsaG9zdDoke3BvcnR9YDtcbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ3NjcmlwdHMvc3RhcnQtcHJvZHVjdGlvbi5zaCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMsIGJ1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kLCB0eXBlIFRlc3RFMkVPcHRpb25zIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwU2VydmVyU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChwcm9qZWN0Lmhhc1BsYXl3cmlnaHRDb25maWcpIHtcbiAgICAgIHJldHVybiBzdXBlci50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHN0YXJ0Q29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5sZW5ndGggPyB0YXJnZXRzIDogWyd0ZXN0L2UyZS8nXTtcbiAgICBjb25zdCB0ZXN0Q29tbWFuZCA9IHRoaXMudGVzdFVuaXQocHJvamVjdCwgeyAuLi5hcmd2LCB0YXJnZXRzOiBub3JtYWxpemVkVGFyZ2V0cyB9KTtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwMCAtaSAyMDAwJyl9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBTRVJWRVJfTE9HX0ZJTEUgPSAnc2VydmVyLmxvZyc7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnREZXZQcm90ZWN0ZWQoXzE6IFByb2plY3QsIF8yOiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREZXYoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biBydW4nIDogJ25vZGUnfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVdpdGhQbGF5d3JpZ2h0TWFuYWdlZFNlcnZlcihwcm9qZWN0LCBhcmd2LCBvcHRpb25zKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVXaXRoUGxheXdyaWdodE1hbmFnZWRTZXJ2ZXIocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbGlicmFyeSBoYXMgbm8gc2VydmVyIG9mIGl0cyBvd24sIGJ1dCBpdCBtYXkgc2hpcCBhIHNlbGYtY29udGFpbmVkIFBsYXl3cmlnaHQgZml4dHVyZSB3aG9zZVxuICAgKiBjb25maWcgYnVpbGRzIGFuZCBzdGFydHMgdGhlIGFwcCB1bmRlciB0ZXN0IHZpYSBhIGB3ZWJTZXJ2ZXJgIGJsb2NrIChlLmcuIGEgTmV4dC5qcyBmaXh0dXJlIHRoYXRcbiAgICogdmVyaWZpZXMgdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIGltcG9ydHMgY2xlYW5seSkuIFJ1biBQbGF5d3JpZ2h0IGRpcmVjdGx5IGluIHRoYXQgY2FzZSDigJQgaW5jbHVkaW5nXG4gICAqIG9uIENJLCB3aGVyZSBQbGF5d3JpZ2h0J3Mgb3duIGB3ZWJTZXJ2ZXJgIHN0YXJ0cyB0aGUgZml4dHVyZSDigJQgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSB0ZXN0RTJFV2l0aFBsYXl3cmlnaHRNYW5hZ2VkU2VydmVyKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgb3B0aW9uczogVGVzdEUyRU9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgcHJvamVjdC5oYXNQbGF5d3JpZ2h0V2ViU2VydmVyQ29uZmlnXG4gICAgICAgID8gdGhpcy5idWlsZFBsYXl3cmlnaHRPbmx5Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBvcHRpb25zKVxuICAgICAgICA6IGBlY2hvICdkbyBub3RoaW5nLidgXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuIiwiZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJQYWNrYWdlcyA9IFsnZXhwcmVzcycsICdmYXN0aWZ5JywgJ2VseXNpYScsICdob25vJ107XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgLy8gQmxpdHoncyB3aXRoQmxpdHogd2lyZXMgaXRzIFJQQyBsYXllciB0aHJvdWdoIGEgd2VicGFjayBsb2FkZXIsIHdoaWNoIFR1cmJvcGFjayBpZ25vcmVzLFxuICAgIC8vIHNvIEJsaXR6IGFwcHMgbXVzdCBydW4gdGhlIHdlYnBhY2sgZGV2IHNlcnZlciAoVHVyYm9wYWNrIGRpZXMgd2l0aCByZXNvbHZlIGVycm9ycykuXG4gICAgLy8gUGFzc2luZyBubyBidW5kbGVyIGZsYWcgc2VsZWN0cyB3ZWJwYWNrIG9ubHkgb24gTmV4dC5qcyAxNTsgTmV4dC5qcyAxNiBkZWZhdWx0cyB0b1xuICAgIC8vIFR1cmJvcGFjayBhbmQgbmVlZHMgYW4gZXhwbGljaXQgLS13ZWJwYWNrLCBhIGZsYWcgTmV4dC5qcyAxNSdzIENMSSByZWplY3RzIGFzIHVua25vd24uXG4gICAgbGV0IGJ1bmRsZXJPcHRpb24gPSAnLS10dXJib3BhY2sgJztcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSB7XG4gICAgICBidW5kbGVyT3B0aW9uID0gZ2V0TmV4dE1ham9yVmVyc2lvbihwcm9qZWN0KSA+PSAxNiA/ICctLXdlYnBhY2sgJyA6ICcnO1xuICAgIH1cbiAgICByZXR1cm4gYFlBUk4gbmV4dCBkZXYgJHtidW5kbGVyT3B0aW9ufSR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBZQVJOIG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG5cbi8qKlxuICogUHJlZmVycyB0aGUgaW5zdGFsbGVkIHBhY2thZ2Ugb3ZlciB0aGUgZGVjbGFyZWQgc3BlY2lmaWVyIGJlY2F1c2UgdGhlIGRlY2xhcmVkIG9uZSBtYXkgYmUgYVxuICogcmFuZ2U7IGZhbGxzIGJhY2sgdG8gMTUgKHdlYnBhY2stYnktZGVmYXVsdCBiZWhhdmlvcikgd2hlbiBuZWl0aGVyIGlzIHJlYWRhYmxlLlxuICovXG5mdW5jdGlvbiBnZXROZXh0TWFqb3JWZXJzaW9uKHByb2plY3Q6IFByb2plY3QpOiBudW1iZXIge1xuICB0cnkge1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICduZXh0JywgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfTtcbiAgICBjb25zdCBtYWpvciA9IHNlbXZlci5jb2VyY2UoaW5zdGFsbGVkLnZlcnNpb24pPy5tYWpvcjtcbiAgICBpZiAobWFqb3IgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1ham9yO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRlY2xhcmVkIHNwZWNpZmllclxuICB9XG4gIHJldHVybiBzZW12ZXIuY29lcmNlKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5uZXh0KT8ubWFqb3IgPz8gMTU7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyB2aW5leHQgKE5leHQuanMgb24gVml0ZSkgYXBwcyB0YXJnZXRpbmcgQ2xvdWRmbGFyZSBXb3JrZXJzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaW5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgLy8gVW5saWtlIGBuZXh0IGRldmAsIFZpdGUtYmFzZWQgdmluZXh0IGRvZXMgbm90IHJlYWQgdGhlIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAgY29uc3QgZGV2Q29tbWFuZCA9IGBZQVJOIHZpbmV4dCBkZXYgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAvLyBUaGUgQ2xvdWRmbGFyZSB2aXRlIHBsdWdpbiAobWluaWZsYXJlKSByZWFkcyBydW50aW1lIHZhcnMgb25seSBmcm9tIGEgLmRldi52YXJzIGZpbGUsXG4gICAgLy8gc28gaXQgbXVzdCBiZSByZWdlbmVyYXRlZCBmcm9tIHRoZSBmbm94LW1hbmFnZWQgdmFsdWVzIGJlZm9yZSBzZXJ2aW5nLlxuICAgIGNvbnN0IGNvbW1hbmRzID0gW2J1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJy5kZXYudmFycycpXTtcbiAgICAvLyBgdmluZXh0IGRldmAgKG1pbmlmbGFyZSkgc3RhcnRzIHdpdGggYW4gZW1wdHkgbG9jYWwgRDEgYW5kIGFwcGxpZXMgbm8gbWlncmF0aW9ucyBpdHNlbGY7XG4gICAgLy8gdGhlIHRlc3QgZW52aXJvbm1lbnQgd2lwZXMgaXRzIHN0YXRlIGRpcmVjdG9yeSwgc28gZXZlcnkgcGFnZSB3b3VsZCA1MDAgd2l0aG91dCB0aGlzLlxuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmQgPSBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpID8gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG1pZ3JhdGlvbkNvbW1hbmQpIGNvbW1hbmRzLnB1c2gobWlncmF0aW9uQ29tbWFuZCk7XG4gICAgcmV0dXJuIFsuLi5jb21tYW5kcywgZGV2Q29tbWFuZF0uam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIC8vIFNlcnZpbmcgdGhlIGJ1aWx0IHdvcmtlciBzdGFydHMgZnJvbSBhbiBlbXB0eSAob3Igd2lwZWQpIGxvY2FsIEQxLCBzbyB3cmFuZ2xlci1uYXRpdmVcbiAgICAvLyBtaWdyYXRpb25zIChpZiBhbnkpIG11c3QgYmUgYXBwbGllZCBmaXJzdDsgZHJpenpsZS9wcmlzbWEgbWlncmF0aW9ucyBhcmUgaGFuZGxlZCBieVxuICAgIC8vIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQuXG4gICAgY29uc3QgZDFNaWdyYXRpb25zQ29tbWFuZCA9IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpO1xuICAgIC8vIGB2aW5leHQgYnVpbGRgIGVtaXRzIGEgd29ya2VyIGJ1bmRsZSBhbmQgaXRzIHdyYW5nbGVyIGNvbmZpZyB1bmRlciBkaXN0L3NlcnZlciwgc28gdGhlXG4gICAgLy8gLmRldi52YXJzIGZpbGUgZXhwb3Npbmcgd2ItbWFuYWdlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCBiZSBnZW5lcmF0ZWQgYWZ0ZXIgYnVpbGRpbmcuXG4gICAgLy8gYC0tbG9jYWwtdXBzdHJlYW1gIGtlZXBzIHJlcXVlc3QgVVJMcyBvbiB0aGUgbG9jYWwgaG9zdDsgb3RoZXJ3aXNlLCB3cmFuZ2xlciBkZXYgc2ltdWxhdGVzXG4gICAgLy8gdGhlIHByb2R1Y3Rpb24gY3VzdG9tIGRvbWFpbiBkZWNsYXJlZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnIHJvdXRlcy5cbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICdkaXN0L3NlcnZlci8uZGV2LnZhcnMnKSxcbiAgICAgIC4uLihkMU1pZ3JhdGlvbnNDb21tYW5kID8gW2QxTWlncmF0aW9uc0NvbW1hbmRdIDogW10pLFxuICAgICAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoXG4gICAgICAgIGBkZXYgLS1jb25maWcgZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbiAtLWlwIDEyNy4wLjAuMSAtLXBvcnQgJHtwb3J0fSAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cIiAtLWxvY2FsLXVwc3RyZWFtIGxvY2FsaG9zdDoke3BvcnR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKClcbiAgICAgICksXG4gICAgXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdmluZXh0U2NyaXB0cyA9IG5ldyBWaW5leHRTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgVml0ZS1iYXNlZCBhcHBzIHdpdGggUGxheXdyaWdodCBlMmUgdGVzdHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpdGVTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gdml0ZSBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3Byb2plY3QuYnVpbGRDb21tYW5kfSAmJiBZQVJOIHZpdGUgcHJldmlldyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aXRlU2NyaXB0cyA9IG5ldyBWaXRlU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBwbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAoZGV0ZWN0ZWQgdmlhIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyBmaWxlIHdoZW4gbm8gb3RoZXIgZnJhbWV3b3JrIG1hdGNoZXM7IHZpbmV4dCBhcHBzIGhhdmUgdGhlaXIgb3duIHNjcmlwdHMpLlxuICogRXh0ZW5kcyBIdHRwU2VydmVyU2NyaXB0cyBzbyB0aGF0IGUyZSB0ZXN0cyBydW4gdmlhIHRoZSB1bml0LXRlc3QgcnVubmVyIGFnYWluc3QgdGhlIHJ1bm5pbmdcbiAqIHdvcmtlciB3aGVuIHRoZSBwcm9qZWN0IGhhcyBubyBQbGF5d3JpZ2h0IGNvbmZpZy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgV29ya2Vyc1NjcmlwdHMgZXh0ZW5kcyBIdHRwU2VydmVyU2NyaXB0cyB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdCwgYXJndikuam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgLy8gd3JhbmdsZXIgZGV2IGJ1bmRsZXMgdGhlIHdvcmtlciBpdHNlbGYsIHNvIG5vIHNlcGFyYXRlIGJ1aWxkIHN0ZXAgaXMgbmVlZGVkLlxuICAgIHJldHVybiB0aGlzLmJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0LCBhcmd2KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzg3ODcnO1xuICAgIGNvbnN0IHN0YXRlRGlyID0gZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpO1xuXG4gICAgLy8gVGhlc2UgaGVscGVycyByZWFkIHRoZSBkZWZhdWx0LW5hbWVkIHdyYW5nbGVyIGNvbmZpZzsgdGhhdCBpcyBzYWZlIGJlY2F1c2Ugd29ya2Vyc1NjcmlwdHNcbiAgICAvLyBpdHNlbGYgaXMgb25seSBzZWxlY3RlZCB3aGVuIHN1Y2ggYSBjb25maWcgZmlsZSBleGlzdHMgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5LlxuICAgIGNvbnN0IGNvbW1hbmRzID0gW2J1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJy5kZXYudmFycycpXTtcbiAgICAvLyBBcHBseSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyAoaWYgYW55KSBzbyB0aGUgbG9jYWwgZGF0YWJhc2UgbWF0Y2hlcyB0aGUgZGVwbG95ZWQgb25lLlxuICAgIGNvbnN0IGQxTWlncmF0aW9uc0NvbW1hbmQgPSBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KTtcbiAgICBpZiAoZDFNaWdyYXRpb25zQ29tbWFuZCkge1xuICAgICAgY29tbWFuZHMucHVzaChkMU1pZ3JhdGlvbnNDb21tYW5kKTtcbiAgICB9XG4gICAgY29tbWFuZHMucHVzaChcbiAgICAgIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKFxuICAgICAgICBgZGV2IC0taXAgMTI3LjAuMC4xIC0tcG9ydCAke3Byb2plY3QuZW52LlBPUlR9IC0tcGVyc2lzdC10byBcIiR7c3RhdGVEaXJ9XCIgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB3b3JrZXJzU2NyaXB0cyA9IG5ldyBXb3JrZXJzU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgaHR0cFNlcnZlclBhY2thZ2VzIH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgd29ya2Vyc1NjcmlwdHMgfSBmcm9tICcuL3dvcmtlcnNTY3JpcHRzLmpzJztcblxuLyoqIFBpY2tzIHRoZSBzY3JpcHRzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcHJvamVjdCAodGhlIHNlbGVjdGlvbiBgd2IgdGVzdGAvYHdiIHRlc3Qtb24tY2lgIHNoYXJlKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBCYXNlU2NyaXB0cyB7XG4gIHJldHVybiBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzKHByb2plY3QpID8/IChkZXBlbmRzT25IdHRwU2VydmVyUGFja2FnZShwcm9qZWN0KSA/IGh0dHBTZXJ2ZXJTY3JpcHRzIDogcGxhaW5BcHBTY3JpcHRzKTtcbn1cblxuLyoqIFRoZSBmcmFtZXdvcmstZGV0ZWN0aW9uIHByZWZpeCBldmVyeSBjb25zdW1lciBzaGFyZXM7IGB3YiBzdGFydGAgY29tcG9zZXMgaXRzIG93biB0YWlsIGFyb3VuZCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBCYXNlU2NyaXB0cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSByZXR1cm4gdmluZXh0U2NyaXB0cztcbiAgaWYgKGRlcHMubmV4dCkgcmV0dXJuIG5leHRTY3JpcHRzO1xuICBpZiAoZGV2RGVwcy52aXRlKSByZXR1cm4gdml0ZVNjcmlwdHM7XG4gIC8vIFBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHA7IHZpbmV4dCBhcHBzIGFyZSBkZXRlY3RlZCBhYm92ZS5cbiAgaWYgKGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCkpIHJldHVybiB3b3JrZXJzU2NyaXB0cztcbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwZW5kc09uSHR0cFNlcnZlclBhY2thZ2UocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRlcGVuZHNPbkh0dHBTZXJ2ZXJQYWNrYWdlLCBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vc2VsZWN0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zY3JpcHRPcHRpb25zQnVpbGRlcixcbiAgbW9kZToge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RhcnQgbW9kZTogZGV2W2Vsb3BtZW50XSAoZGVmYXVsdCkgfCBzdGFnaW5nIHwgZG9ja2VyIHwgZG9ja2VyLWRlYnVnIHwgdGVzdCcsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzdGFydENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc3RhcnQgW2FyZ3MuLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlN0YXJ0IGFwcC4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byB0aGUgdW5kZXJseWluZyBhcHAgY29tbWFuZC4gRXhhbXBsZTogd2Igc3RhcnQgLS0gLS1ob3N0IDAuMC4wLjBcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSkub3B0aW9ucyhidWlsZGVyKSBhcyBBcmd2PFxuICAgICAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbiAgICA+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBub3JtYWxpemVBcmdzKGFyZ3YpO1xuXG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cyB8IHVuZGVmaW5lZCA9IHNlbGVjdEZyYW1ld29ya1NjcmlwdHMocHJvamVjdCk7XG4gICAgICBpZiAoIXNjcmlwdHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRlcGVuZHNPbkh0dHBTZXJ2ZXJQYWNrYWdlKHByb2plY3QpIHx8XG4gICAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IHNlbGVjdFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9zZWxlY3RTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMsIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMgfSBmcm9tICcuLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuaW50ZXJmYWNlIFRlc3RSdW5PcHRpb25zIHtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IHRlc3RDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFRlc3RDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0IFt0YXJnZXRzLi4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiVGVzdCBwcm9qZWN0LiBJZiB5b3UgcGFzcyBubyBhcmd1bWVudHMsIGl0IHdpbGwgcnVuIGFsbCB0ZXN0cy4gVXNlICctLScgdG8gc3RvcCB3YiBvcHRpb24gcGFyc2luZyBhbmQgZm9yd2FyZCB0aGUgcmVtYWluaW5nIGZsYWdzIHRvIFBsYXl3cmlnaHQuIEV4YW1wbGU6IHdiIHRlc3QgLS0gLS1ncmVwICd1cGxvYWRlZCBpbWFnZSBhc3NldCdcIixcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KTogQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+ID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKVxuICAgICAgLnBvc2l0aW9uYWwoJ3RhcmdldHMnLCBhcmd1bWVudHNCdWlsZGVyLnRhcmdldHMpIGFzIEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHRlc3QoYXJndiBhcyBUZXN0Q29tbWFuZEFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0KGFyZ3Y6IFRlc3RDb21tYW5kQXJndiwgb3B0aW9uczogVGVzdFJ1bk9wdGlvbnMgPSB7fSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHRlc3RBcmd2ID0gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudihhcmd2KTtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKHRlc3RBcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8vIEdldCB0ZXN0IHRhcmdldHMgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICBjb25zdCB0ZXN0VGFyZ2V0cyA9ICh0ZXN0QXJndi50YXJnZXRzID8/IFtdKSBhcyBzdHJpbmdbXTtcbiAgY29uc3QgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSB0ZXN0QXJndlsnLS0nXSA/PyBbXTtcbiAgY29uc3QgeyBzaG91bGRSdW5FMmUsIHNob3VsZFJ1blVuaXQgfSA9IHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyh0ZXN0VGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIC8vIFJlc29sdmUgdGhlIGVudmlyb25tZW50IGVhZ2VybHk6IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgZm9yY2VzIHRoZSB0ZXN0IGNhc2NhZGUgYW5kXG4gICAgLy8gUHJvamVjdC5jb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYgZmFsbHMgYmFjayBXQl9FTlYgdG8gdGhhdCBtb2RlIOKAlCBidXQgdGhlIGVudiBnZXR0ZXIgaXNcbiAgICAvLyBsYXp5LCBzbyBhIHByb2plY3Qgd2l0aCBubyBydW5uYWJsZSB0ZXN0cyB3b3VsZCBvdGhlcndpc2Ugc2tpcCB0aGUgdmFsaWRhdGlvbiBlbnRpcmVseS5cbiAgICB2b2lkIHByb2plY3QuZW52O1xuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBzY3JpcHRzID0gc2VsZWN0U2NyaXB0cyhwcm9qZWN0KTtcblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3RcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3Qgc3RydWN0dXJlVmlvbGF0aW9ucyA9IGZpbmRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0KTtcbiAgICBpZiAoc3RydWN0dXJlVmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QubmFtZSwgc3RydWN0dXJlVmlvbGF0aW9ucyk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgY29uc3QgZXhwbGljaXRVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gICAgY29uc3QgdW5pdFRhcmdldHMgPSBleHBsaWNpdFVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBleHBsaWNpdFVuaXRUYXJnZXRzIDogZGVmYXVsdFVuaXRUYXJnZXRzO1xuICAgIGlmIChzaG91bGRSdW5Vbml0ICYmIHVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiB1bml0VGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgIHRpbWVvdXQ6IHRlc3RBcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZTJlIHRhcmdldHMgZm9yIHRoaXMgcHJvamVjdFxuICAgIGNvbnN0IGUyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMubmV4dCB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBbJ2NvZGVnZW4nLCBgaHR0cDovL2xvY2FsaG9zdDoke3Byb2plY3QuZW52LlBPUlR9YF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3Y6IFRlc3RDb21tYW5kQXJndik6IFRlc3RDb21tYW5kQXJndiB7XG4gIGlmIChhcmd2LmNhc2NhZGVFbnYgfHwgYXJndi5jYXNjYWRlTm9kZUVudiB8fCBhcmd2LmF1dG9DYXNjYWRlRW52ID09PSBmYWxzZSkge1xuICAgIC8vIEV4cGxpY2l0IGVudiBmbGFncyBrZWVwIHRoZWlyIHByb2ZpbGUtc2VsZWN0aW9uIHNlbWFudGljcywgYnV0IHRoZSBzcGF3bmVkIHRlc3RzIG11c3Qgc3RpbGxcbiAgICAvLyBydW4gYXMgYHRlc3RgIHdoZW4gdGhlIHNlbGVjdGVkIHByb2ZpbGUgZGVmaW5lcyBubyBXQl9FTlYgKHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKS5cbiAgICByZXR1cm4geyAuLi5hcmd2LCBjb21tYW5kRGVmYXVsdFdiRW52OiAndGVzdCcgfTtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuLyoqXG4gKiBVbml0IHRlc3RzIGxpdmUgb25seSB1bmRlciBgdGVzdC91bml0L2A7IGB0ZXN0L2RlYnVnL2AgcnVucyBvbmx5IHdoZW4gZXhwbGljaXRseSB0YXJnZXRlZC4gQm90aFxuICogdml0ZXN0IGFuZCBgYnVuIHRlc3RgIHRyZWF0IGEgYmFyZSBgdGVzdGAgYXMgYSBmaWxlbmFtZSBmaWx0ZXIsIHdoaWNoIGFsc28gbWF0Y2hlcyBlLmcuXG4gKiBgc3JjL2Zvby50ZXN0LnRzYCwgc28gdGhlIHRyYWlsaW5nIHNsYXNoIHRoYXQgbGltaXRzIHRoZSB0YXJnZXQgdG8gdGhlIGRpcmVjdG9yeSBpcyByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSA/IFsnLi90ZXN0L3VuaXQvJ10gOiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuLy8gTWF0Y2ggdGhlIHRlc3QvZTJlIHBhdGggc2VnbWVudCwgbm90IHRoZSAnL2UyZScgc3Vic3RyaW5nOiBhIHVuaXQgdGFyZ2V0IHN1Y2ggYXNcbi8vIHRlc3QvdW5pdC9lMmVDb25maWcudGVzdC50cyBtdXN0IG5vdCBiZSBjbGFzc2lmaWVkIGFzIGFuIGUyZSB0YXJnZXQuXG5jb25zdCBFMkVfVEFSR0VUX1JFR0VYUCA9IC8oPzpefFxcLyl0ZXN0XFwvZTJlKD86XFwvfCQpLztcblxuZnVuY3Rpb24gaXNFMmVUYXJnZXQodGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEUyRV9UQVJHRVRfUkVHRVhQLnRlc3QodGFyZ2V0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IGlzRTJlVGFyZ2V0KHRhcmdldCkpO1xuICAvLyBOb24tZTJlIHRhcmdldHMgKHRlc3QvdW5pdC8gYW5kIHRlc3QvZGVidWcvKSBydW4gdGhyb3VnaCB0aGUgdW5pdC10ZXN0IHJ1bm5lci5cbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+ICFpc0UyZVRhcmdldCh0YXJnZXQpKTtcbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSB0ZXN0VGFyZ2V0cy5sZW5ndGggPT09IDAgJiYgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID09PSAwO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdWxkUnVuVW5pdDogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHMsXG4gICAgc2hvdWxkUnVuRTJlOiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNFMmVUYXJnZXRzIHx8IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA+IDAsXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IHNlbGVjdFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9zZWxlY3RTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGZpbmRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucywgcHJpbnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUuanMnO1xuXG5pbXBvcnQgeyBnZXREZWZhdWx0VW5pdFRhcmdldHMgfSBmcm9tICcuL3Rlc3QuanMnO1xuXG5jb25zdCB0ZXN0T25DaUJ1aWxkZXIgPSB7XG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVkdWNlIHJlZHVuZGFudCBvdXRwdXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHRlc3RPbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3Qtb24tY2knLFxuICBkZXNjcmliZTogJ1Rlc3QgcHJvamVjdCBvbiBDSSB3aXRoIG5vIG9wdGlvbnMuJyxcbiAgYnVpbGRlcjogdGVzdE9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCB0ZXN0T25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0T25DaShcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gU3Bhd25lZCBjb21tYW5kcyByZS1kZXJpdmUgdGhlaXIgZW52IGNhc2NhZGUgZnJvbSB0aGUgZXhwb3J0ZWQgV0JfRU5WLCBzbyBhbiB1bmV4cG9ydGVkXG4gIC8vIFdCX0VOViB3b3VsZCBsZXQgYSBjb25maWd1cmVkIFdCX0VOViBkZWZhdWx0IChlLmcuIGRldmVsb3BtZW50KSBzZWxlY3QgdGhlIGRldmVsb3BtZW50XG4gIC8vIGVudmlyb25tZW50IOKAlCBydW5uaW5nIHRoZSBkZXN0cnVjdGl2ZSBlMmUgc3VpdGUgYWdhaW5zdCB0aGUgZGV2ZWxvcGVyJ3Mgb3duIGRhdGFiYXNlLlxuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuQ0kgfHw9ICcxJztcbiAgICAvLyBPdmVyd3JpdGUsIG5vdCB8fD06IHByb2plY3QuZW52IGFscmVhZHkgY2FycmllcyB0aGUgZG90ZW52LWRlcml2ZWQgdmFsdWUuXG4gICAgcHJvamVjdC5lbnYuV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuXG4gICAgY29uc3Qgc2NyaXB0cyA9IHNlbGVjdFNjcmlwdHMocHJvamVjdCk7XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0LW9uLWNpXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGNvbnN0IHN0cnVjdHVyZVZpb2xhdGlvbnMgPSBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdCk7XG4gICAgaWYgKHN0cnVjdHVyZVZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcHJpbnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0Lm5hbWUsIHN0cnVjdHVyZVZpb2xhdGlvbnMpO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgY29uc3QgZGVmYXVsdFVuaXRUYXJnZXRzID0gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3QpO1xuICAgIGlmIChkZWZhdWx0VW5pdFRhcmdldHMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICBjb25zdCB1bml0QXJndiA9IHsgLi4uYXJndiwgdGFyZ2V0czogZGVmYXVsdFVuaXRUYXJnZXRzIH07XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgLy8gUHJlc2VydmUgYSBub256ZXJvIGV4aXQgY29kZSBmcm9tIGFuIGVhcmxpZXIgcHJvamVjdCAoZS5nLiBhIGxheW91dCB2aW9sYXRpb24pOiBhIGxhdGVyXG4gICAgICAvLyBzdWNjZXNzZnVsIHByb2plY3QgbXVzdCBub3QgcmVzZXQgdGhlIGZhaWx1cmUuXG4gICAgICBjb25zdCBlMmVFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChlMmVFeGl0Q29kZSAhPT0gMCkge1xuICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gZTJlRXhpdENvZGU7XG4gICAgICB9XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG5leHBvcnQgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIEVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IGxvYWRlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdHlwZUNoZWNrKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlQ2hlY2soYXJndjogVHlwZUNoZWNrQ29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IHJlbW92ZWROZXh0RGlyID0gZmFsc2UgYXMgYm9vbGVhbjtcbiAgY29uc3QgcHJvbWlzZXMgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5tYXAoYXN5bmMgKHByb2plY3QpID0+IHtcbiAgICBjb25zdCBjb21tYW5kcyA9IGJ1aWxkVHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdCk7XG4gICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZUNvbG9yOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IGV4aXRDb2RlIG9mIGV4aXRDb2Rlcykge1xuICAgIGlmIChleGl0Q29kZSkgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICB9XG4gIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICApXG4gICAgKTtcbiAgcmV0dXJuIGZpbmFsRXhpdENvZGU7XG59XG5cbi8qKlxuICogRXZlcnkgdHlwZS1jaGVjayBjb21tYW5kIHRoaXMgcHJvamVjdCBydW5zLCBhcyBgQlVOYC9gWUFSTmAtcHJlZml4ZWQgc2NyaXB0cy4gRXhwb3J0ZWQgc29cbiAqIGB3YiB2ZXJpZnlgJ3Mgc3RlcCByZWNhcCBjYW4gbmFtZSB0aGUgc2FtZSB0b29scyBpbnN0ZWFkIG9mIHJlLWRlcml2aW5nIHRoZSBjb25kaXRpb25zLCB3aGljaFxuICogd291bGQgc2lsZW50bHkgZ28gc3RhbGUgdGhlIG5leHQgdGltZSB0aGlzIGxpc3QgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChwcm9qZWN0Lmhhc093blNvdXJjZUNvZGUpIHtcbiAgICBjb21tYW5kcy5wdXNoKC4uLmJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpKTtcbiAgfVxuICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3B5cmlnaHQnKSkge1xuICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICB9XG4gIHJldHVybiBjb21tYW5kcztcbn1cblxuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0VHlwZUNoZWNrQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgYHR5cGVzY3JpcHRgIChgdHNjYCk7IHdiZnkgcmVtb3ZlcyB0aGVcbiAgLy8gYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgcHJldmlldyBmcm9tIG5vbi1OZXh0LmpzIHJlcG9zIChOZXh0LmpzLWZhbWlseVxuICAvLyByZXBvcyBrZWVwIGl0IGZvciBgbmV4dCBidWlsZGApLCBzbyByZXBvcyBzdGlsbCBvbiB0aGUgcHJldmlldyBzaG91bGQgcnVuIHdiZnlcbiAgLy8gaW5zdGVhZCBvZiByZWx5aW5nIG9uIGEgdHNnbyBmYWxsYmFjayBoZXJlLlxuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCd0eXBlc2NyaXB0JykpIHtcbiAgICByZXR1cm4gWydCVU4gdHNjIC0tbm9FbWl0J107XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgY29uc3QgdGNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgLi4udHlwZUNoZWNrQ29tbWFuZCxcbiAgY29tbWFuZDogJ3RjJyxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGZpbmRSb290QW5kU2VsZlByb2plY3RzLCBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVCdW5Mb2NrZmlsZSB9IGZyb20gJy4uL3V0aWxzL2J1bkxvY2tmaWxlLmpzJztcblxuaW1wb3J0IHsgYnVpbGRMaW50Q29tbWFuZCwgbGludCwgdHlwZSBMaW50Q29tbWFuZEFyZ3YgfSBmcm9tICcuL2xpbnQuanMnO1xuaW1wb3J0IHsgdGVzdCwgdHlwZSBUZXN0Q29tbWFuZEFyZ3YsIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgfSBmcm9tICcuL3Rlc3QuanMnO1xuaW1wb3J0IHsgYnVpbGRUeXBlQ2hlY2tDb21tYW5kcywgdHlwZUNoZWNrLCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2IH0gZnJvbSAnLi90eXBlY2hlY2suanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmdWxsOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGRlc2NyaWJlOiAnUnVuIHRlc3RzIGFmdGVyIHZlcmlmeWluZyBwcm9qZWN0IGNvZGUnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz47XG50eXBlIFBhY2thZ2VDb21tYW5kQXJndiA9IFBpY2s8VmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCAnZHJ5UnVuJyB8ICd2ZXJib3NlJz47XG5cbi8qKiBBIGNvbXBsZXRlZCBgd2IgdmVyaWZ5YCBzdGVwLCByZWNvcmRlZCBzbyB0aGUgZmluYWwgc3VtbWFyeSBjYW4gcHJvdmUgZXZlcnkgc3RlcCBhY3R1YWxseSByYW4uICovXG5pbnRlcmZhY2UgVmVyaWZ5U3RlcCB7XG4gIC8qKlxuICAgKiBBIHNob3J0IGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIHN0ZXAgcmFuLCBlLmcuIGB0c2MgLS1ub0VtaXRgLiBBZ2dyZWdhdGVkIGFjcm9zcyB0aGUgZGVzY2VuZGFudFxuICAgKiBwcm9qZWN0cywgc28gYCArIGAgbWVhbnMgZWFjaCB0b29sIHJhbiBzb21ld2hlcmUsIG5vdCB0aGF0IG9uZSBjb21tYW5kIHJhbiB0aGVtIGFsbC4gT21pdHRlZCB3aGVuXG4gICAqIG5vdGhpbmcgYmV5b25kIHRoZSBzdGVwIG5hbWUgZGVzY3JpYmVzIGl0LlxuICAgKi9cbiAgZGV0YWlsPzogc3RyaW5nO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IHZlcmlmeUNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd2ZXJpZnknLFxuICBkZXNjcmliZTogJ1ZlcmlmeSBwcm9qZWN0IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcHM6IFZlcmlmeVN0ZXBbXSA9IFtdO1xuICAgIGlmIChhcmd2LmZ1bGwpIHtcbiAgICAgIGF3YWl0IHZlcmlmeUNvZGVGdWxseShwcm9qZWN0cy5zZWxmLCBhcmd2LCBzdGVwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHZlcmlmeUNvZGUocHJvamVjdHMuc2VsZiwgYXJndiwgc3RlcHMpO1xuICAgICAgcHJpbnRWZXJpZnlTdW1tYXJ5KHN0ZXBzLCBCb29sZWFuKGFyZ3YuZHJ5UnVuKSk7XG4gICAgfVxuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndiwgc3RlcHM6IFZlcmlmeVN0ZXBbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvcnRlciA9IHN0YXJ0VmVyaWZ5RnVsbFJlcG9ydGVyKHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IHZlcmlmeUNvZGUocHJvamVjdCwgYXJndiwgc3RlcHMpO1xuICAgIGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgbmFtZTogJ3Rlc3QnIH0sICgpID0+IHJ1blByb2plY3RUZXN0KHByb2plY3QsIGFyZ3YpKTtcbiAgICAvLyBQcmludGVkIGJlZm9yZSB0aGUgcmVwb3J0ZXIgZmluaXNoZXMgc28gdGhlIHN1bW1hcnkgbGFuZHMgaW4gdmVyaWZ5LWZ1bGwubG9nIHRvby5cbiAgICBwcmludFZlcmlmeVN1bW1hcnkoc3RlcHMsIEJvb2xlYW4oYXJndi5kcnlSdW4pKTtcbiAgICByZXBvcnRlci5zdWNjZWVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVwb3J0ZXIuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgcmVwb3J0ZXIuZmluaXNoKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsIHN0ZXBzOiBWZXJpZnlTdGVwW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gaW5zdGFsbGA7XG4gIC8vIGBhbGxvd0ZhaWx1cmVgIHNvIGEgZmFpbGVkIGluc3RhbGwgc3RpbGwgcmVhY2hlcyB0aGUgbm9ybWFsaXphdGlvbiBiZWxvdzogYnVuIHJld3JpdGVzIHRoZVxuICAvLyBsb2NrZmlsZSBiZWZvcmUgcnVubmluZyBsaWZlY3ljbGUgc2NyaXB0cywgc28gYSBzY3JpcHQgZmFpbHVyZSB3b3VsZCBvdGhlcndpc2UgbGVhdmUgR3VhcmRcbiAgLy8gVVJMcyBpbiB0aGUgd29ya2luZyB0cmVlLiBUaGUgZmFpbHVyZSBpcyByZXBvcnRlZCBhbmQgZXhpdHMgZXhhY3RseSBhcyBydW5QYWNrYWdlQ29tbWFuZCB3b3VsZC5cbiAgY29uc3QgaW5zdGFsbEV4aXRDb2RlID0gYXdhaXQgcnVuU3RlcChzdGVwcywgeyBkZXRhaWw6IGluc3RhbGxDb21tYW5kLCBuYW1lOiAnaW5zdGFsbCcgfSwgKCkgPT5cbiAgICBydW5QYWNrYWdlQ29tbWFuZChpbnN0YWxsQ29tbWFuZCwgcHJvamVjdCwgYXJndiwgeyBhbGxvd0ZhaWx1cmU6IHRydWUgfSlcbiAgKTtcbiAgLy8gVGhlIHJlcG9zaXRvcnkgbWF5IGhhdmUgbm8gYGdlbi1jb2RlYCBzY3JpcHQgKHdoZXJlIHRoZSBzYW1lIG5vcm1hbGl6YXRpb24gcnVucyBhdCBwb3N0aW5zdGFsbCksXG4gIC8vIGFuZCBgdmVyaWZ5YCBpcyB0aGUgY29tbWFuZCBhIGRldmVsb3BlciBydW5zIGJlZm9yZSBjb21taXR0aW5nLlxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgbm9ybWFsaXplQnVuTG9ja2ZpbGUocHJvamVjdC5yb290RGlyUGF0aCk7XG4gIH1cbiAgaWYgKGluc3RhbGxFeGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtpbnN0YWxsRXhpdENvZGV9KTpgKSwgaW5zdGFsbENvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoaW5zdGFsbEV4aXRDb2RlKTtcbiAgfVxuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICBjb25zdCBnZW5Db2RlQ29tbWFuZCA9IGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBnZW4tY29kZWA7XG4gICAgYXdhaXQgcnVuU3RlcChzdGVwcywgeyBkZXRhaWw6IGdlbkNvZGVDb21tYW5kLCBuYW1lOiAnZ2VuLWNvZGUnIH0sICgpID0+XG4gICAgICBydW5QYWNrYWdlQ29tbWFuZChnZW5Db2RlQ29tbWFuZCwgcHJvamVjdCwgYXJndilcbiAgICApO1xuICB9XG4gIC8vIFJlc29sdmVkIGFmdGVyIGBnZW4tY29kZWAgc28gYSBnZW5lcmF0ZWQgYHNyY2AgZGlyZWN0b3J5IGlzIGFscmVhZHkgdGhlcmUgZm9yIGBoYXNTb3VyY2VDb2RlYCxcbiAgLy8gd2hpY2ggaXMgYW4gZXhpc3RzU3luYyBjaGVjaywgYW5kIHJldXNlZCBieSBib3RoIHN0ZXAgZGV0YWlscyBiZWxvdy4gVGhlIHByb2plY3QgZmFjdG9yaWVzXG4gIC8vIHNoYXJlIGluc3RhbmNlcyBwZXIgKGRpcmVjdG9yeSwgbG9hZEVudiwgZW52LXJlbGV2YW50IGFyZ3YpLCBzbyBgdHlwZWNoZWNrYCByZXVzZXMgdGhpcyB2ZXJ5XG4gIC8vIGdyYXBoIHdoaWxlIGBsaW50YCAod2hpY2ggYWRkcyAtLXNpbGVudCkgcmVzb2x2ZXMgaXRzIG93bi5cbiAgY29uc3Qgc3RlcERldGFpbHMgPSBhd2FpdCBidWlsZFN0ZXBEZXRhaWxzKGFyZ3YpO1xuICAvLyBgbGludCAtLWZpeCAtLWZvcm1hdGAgcHJpbnRzIG5vdGhpbmcgb24gc3VjY2Vzcywgc28gd2l0aG91dCB0aGUgc3RlcCBzdW1tYXJ5IGEgcGFzc2luZyBgdmVyaWZ5YFxuICAvLyBsb29rcyBsaWtlIGl0IG5ldmVyIGxpbnRlZCBhdCBhbGwg4oCUIGFuZCBpdCBzaWxlbnRseSByZXdyb3RlIHRoZSB3b3JraW5nIHRyZWUgd2hpbGUgYXQgaXQuXG4gIGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgZGV0YWlsOiBzdGVwRGV0YWlscy5jbGVhbnVwLCBuYW1lOiAnY2xlYW51cCcgfSwgKCkgPT5cbiAgICBydW5JblByb2Nlc3NDb21tYW5kKCdjbGVhbnVwJywgKCkgPT5cbiAgICAgIGxpbnQoe1xuICAgICAgICAuLi5hcmd2LFxuICAgICAgICBfOiBbJ2xpbnQnXSxcbiAgICAgICAgZml4OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IHRydWUsXG4gICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBMaW50Q29tbWFuZEFyZ3YpXG4gICAgKVxuICApO1xuICAvLyBUeXBlLWF3YXJlIGxpbnQgcmVwb3J0cyBUeXBlU2NyaXB0IGRpYWdub3N0aWNzIG9ubHkgZm9yIHRoZSBmaWxlcyBveGxpbnQgYWN0dWFsbHkgbGludHMsIGFuZFxuICAvLyB0aGUgc2hhcmVkIGNvbmZpZyBpZ25vcmVzIGRpcmVjdG9yaWVzIHRzYyBzdGlsbCBjb21waWxlcyAoZS5nLiBgX19nZW5lcmF0ZWRfX2AsIGBAdHlwZXNgLFxuICAvLyBgZGlzdGApLiBLZWVwIHRoZSB0eXBlY2hlY2sgY29tbWFuZCBzbyBgdmVyaWZ5YCBzdGF5cyBlcXVpdmFsZW50IHRvIFwidGhlIHJlcG9zaXRvcnkgY29tcGlsZXNcIi5cbiAgLy8gVGhlIG92ZXJsYXAgd2l0aCBsaW50IGlzIGRlbGliZXJhdGU6IGAtLXR5cGUtYXdhcmVgIGFsc28gcG93ZXJzIHR5cGUtYXdhcmUgbGludCBydWxlcywgYW5kXG4gIC8vIGRyb3BwaW5nIG9ubHkgYC0tdHlwZS1jaGVja2AgZnJvbSBsaW50IHNhdmVzIH4wLjFzLCBmYXIgbGVzcyB0aGFuIHRoZSBjb3ZlcmFnZSBpdCB3b3VsZCBjb3N0LlxuICBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IGRldGFpbDogc3RlcERldGFpbHMudHlwZWNoZWNrLCBuYW1lOiAndHlwZWNoZWNrJyB9LCAoKSA9PlxuICAgIHJ1bkluUHJvY2Vzc0NvbW1hbmQoJ3R5cGVjaGVjaycsICgpID0+IHR5cGVDaGVjayh7IC4uLmFyZ3YsIF86IFsndHlwZWNoZWNrJ10gfSBhcyB1bmtub3duIGFzIFR5cGVDaGVja0NvbW1hbmRBcmd2KSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJvamVjdFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRlc3RBcmd2ID0gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudih7XG4gICAgLi4uYXJndixcbiAgICBfOiBbJ3Rlc3QnXSxcbiAgICBlMmU6ICdoZWFkbGVzcycsXG4gICAgc2lsZW50OiB0cnVlLFxuICB9IGFzIHVua25vd24gYXMgVGVzdENvbW1hbmRBcmd2KTtcbiAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0KHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RiLXJlc2V0J10pIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgJ3Rlc3QnKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhcbiAgICBjaGFsay55ZWxsb3coJ1Rlc3RzIGZhaWxlZC4gVGhpcyBwcm9qZWN0IGRlZmluZXMgXCJkYi1yZXNldFwiLCBzbyB3YiB3aWxsIHJlc2V0IHRoZSBkYXRhYmFzZSBvbmNlIGFuZCByZXRyeSB0ZXN0cy4nKVxuICApO1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gZGItcmVzZXRgLCBmaW5kVGVzdFByb2plY3QocHJvamVjdCwgdGVzdEFyZ3YpLCB0ZXN0QXJndiwge1xuICAgIHByaW50UmF3T3V0cHV0OiB0cnVlLFxuICB9KTtcblxuICBjb25zdCByZXRyeUV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAocmV0cnlFeGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtyZXRyeUV4aXRDb2RlfSk6YCksICd0ZXN0IGFmdGVyIGRiLXJlc2V0IHJldHJ5JykpO1xuICAgIHByb2Nlc3MuZXhpdChyZXRyeUV4aXRDb2RlKTtcbiAgfVxuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1Rlc3RzIHBhc3NlZCBhZnRlciBkYi1yZXNldCByZXRyeS4nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRUZXN0UHJvamVjdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBQcm9qZWN0IHtcbiAgY29uc3QgdGVzdFByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdC5kaXJQYXRoKTtcbiAgaWYgKCF0ZXN0UHJvamVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBub3QgZm91bmQ6ICR7cHJvamVjdC5kaXJQYXRofWApO1xuICB9XG4gIHJldHVybiB0ZXN0UHJvamVjdDtcbn1cblxuLyoqXG4gKiBOYW1lcyB0aGUgdG9vbHMgYmVoaW5kIHRoZSBgY2xlYW51cGAgYW5kIGB0eXBlY2hlY2tgIHN0ZXBzLlxuICpcbiAqIEJvdGggc3RlcHMgdHlwZS1jaGVjaywgd2hpY2ggcmVhZHMgYXMgcmVkdW5kYW50IHVudGlsIHRoZSByZWNhcCBzYXlzIGhvdyB0aGV5IGRpZmZlcjogYGNsZWFudXBgXG4gKiB0eXBlLWNoZWNrcyB0aHJvdWdoIG94bGludCwgd2hpY2ggc2VlcyBvbmx5IHRoZSBmaWxlcyBpdCBsaW50cyAodGhlIHNoYXJlZCBjb25maWcgaWdub3Jlc1xuICogYF9fZ2VuZXJhdGVkX19gLCBgQHR5cGVzYCwgYGRpc3RgLCAuLi4pLCB3aGlsZSBgdHlwZWNoZWNrYCBydW5zIHRoZSBjb21waWxlciBvdmVyIHRoZSB3aG9sZVxuICogdHNjb25maWcgcHJvZ3JhbS4gRXZlcnkgbGFiZWwgaXMgZGVyaXZlZCBmcm9tIHRoZSByZXNvbHZlZCBwcm9qZWN0cyByYXRoZXIgdGhhbiBoYXJkLWNvZGVkLCBzbyBhXG4gKiByZXBvc2l0b3J5IHdob3NlIGBjbGVhbnVwYCBydW5zIGZsYWtlOCBvciBgZGFydCBhbmFseXplYCBpcyBuZXZlciB0b2xkIGl0IHJhbiBveGxpbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkU3RlcERldGFpbHMoYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx7IGNsZWFudXA6IHN0cmluZzsgdHlwZWNoZWNrPzogc3RyaW5nIH0+IHtcbiAgY29uc3QgY2xlYW51cCA9ICdsaW50IC0tZml4IC0tZm9ybWF0JztcbiAgLy8gRGVsaWJlcmF0ZWx5IHJlc29sdmVkIHdpdGggbm8gZXhwbGljaXQgZGlyUGF0aCwgZXhhY3RseSBhcyBgbGludGAgKGxpbnQudHMpIGFuZCBgdHlwZUNoZWNrYFxuICAvLyAodHlwZWNoZWNrLnRzKSByZXNvbHZlIHRoZWlycywgc28gdGhlIGxhYmVscyBhbHdheXMgZGVzY3JpYmUgdGhlIHZlcnkgcHJvamVjdCBzZXQgdGhvc2UgY29tbWFuZHNcbiAgLy8gcHJvY2Vzcy4gVGhyZWFkaW5nIGEgZGlyUGF0aCBpbiDigJQgdGhlIHNlbGYgcHJvamVjdCdzLCBzYXkg4oCUIHdvdWxkIGxldCB0aGUgdHdvIGRpdmVyZ2UsIHdoaWNoIGlzXG4gIC8vIHRoZSBkcmlmdCB0aGlzIGZ1bmN0aW9uIGV4aXN0cyB0byBwcmV2ZW50LlxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSByZXR1cm4geyBjbGVhbnVwIH07XG5cbiAgLy8gQXNrcyB0aGUgcmVhbCBidWlsZGVycyB3aGF0IHRoZXkgd291bGQgcnVuIHJhdGhlciB0aGFuIHJlc3RhdGluZyB0aGVpciBjb25kaXRpb25zLCBzbyBhIGNoYW5nZVxuICAvLyB0byBlaXRoZXIgY29tbWFuZCBjYW5ub3QgbGVhdmUgdGhlc2UgbGFiZWxzIGRlc2NyaWJpbmcgc29tZXRoaW5nIGl0IHN0b3BwZWQgZG9pbmcuIE9ubHkgdGhlXG4gIC8vIHByb2plY3Qgc2VsZWN0aW9uIGlzIHJlc3RhdGVkOiBgbGludGAgYW5kIGB0eXBlQ2hlY2tgIGFwcGx5IGl0IGFyb3VuZCB0aGVpciBidWlsZGVycywgbm90XG4gIC8vIGluc2lkZSB0aGVtLlxuICBjb25zdCBydW5zVHlwZUF3YXJlTGludCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLnNvbWUoXG4gICAgKHByb2plY3QpID0+XG4gICAgICBwcm9qZWN0Lmhhc093blNvdXJjZUNvZGUgJiYgYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCB7IGZpeDogdHJ1ZSwgZm9ybWF0OiB0cnVlIH0pPy5pbmNsdWRlcygnLS10eXBlLWF3YXJlJylcbiAgKTtcbiAgY29uc3QgdHlwZUNoZWNrQ29tbWFuZHMgPSBbXG4gICAgLi4ubmV3IFNldChwcm9qZWN0cy5kZXNjZW5kYW50cy5mbGF0TWFwKChwcm9qZWN0KSA9PiBidWlsZFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpLm1hcCh0b0Rpc3BsYXlDb21tYW5kKSkpLFxuICBdO1xuICByZXR1cm4ge1xuICAgIGNsZWFudXA6IHJ1bnNUeXBlQXdhcmVMaW50ID8gYCR7Y2xlYW51cH0gKG94bGludCAtLXR5cGUtYXdhcmUgLS10eXBlLWNoZWNrKWAgOiBjbGVhbnVwLFxuICAgIHR5cGVjaGVjazogdHlwZUNoZWNrQ29tbWFuZHMubGVuZ3RoID4gMCA/IHR5cGVDaGVja0NvbW1hbmRzLmpvaW4oJyArICcpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKiogRHJvcHMgdGhlIHBhY2thZ2UtbWFuYWdlciBwbGFjZWhvbGRlciBgcnVuV2l0aFNwYXduYCBleHBhbmRzLCBsZWF2aW5nIHRoZSB0b29sIGNhbGwgdG8gc2hvdy4gKi9cbmZ1bmN0aW9uIHRvRGlzcGxheUNvbW1hbmQoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmQucmVwbGFjZSgvXig/OkJVTnxZQVJOKSAvdSwgJycpO1xufVxuXG4vKiogVGltZXMgYSBzdGVwIGFuZCByZWNvcmRzIGl0IGZvciB0aGUgZmluYWwgc3VtbWFyeS4gU3RlcHMgdGhhdCBmYWlsIGV4aXQgdGhlIHByb2Nlc3MgaW5zdGVhZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1blN0ZXA8VD4oXG4gIHN0ZXBzOiBWZXJpZnlTdGVwW10sXG4gIHN0ZXA6IE9taXQ8VmVyaWZ5U3RlcCwgJ2R1cmF0aW9uTXMnPixcbiAgcnVuOiAoKSA9PiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuKCk7XG4gIHN0ZXBzLnB1c2goeyAuLi5zdGVwLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0IH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJ1bnMgYSBzdGVwIHRoYXQgc3VjY2VlZHMgc2lsZW50bHk6IHRoZSByZWNhcCBpcyB0aGUgc2luZ2xlIHBsYWNlIGEgc3VjY2Vzc2Z1bCBzdGVwIGlzIGFubm91bmNlZCxcbiAqIHNvIHdyYXBwZXIgYFN0YXJ0YC9gRmluaXNoZWRgIGxpbmVzIHdvdWxkIG9ubHkgcmVwZWF0IGl0LiBGYWlsdXJlcyBzdGlsbCByZXBvcnQgYmVmb3JlIGV4aXRpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgY29tbWFuZDogKCkgPT4gUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZE5hbWUpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBSZWNhcHMgZXZlcnkgY29tcGxldGVkIHN0ZXAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIGFuZCBpdHMgcGVyLWNvbW1hbmQgb3V0cHV0IGlzIHVuZXZlbjogYVxuICogc3VjY2Vzc2Z1bCBgY2xlYW51cGAgcHJpbnRzIG5vdGhpbmcgYXQgYWxsIHdoaWxlIGB0eXBlY2hlY2tgIHByaW50cyBwZXItcGFja2FnZSBwcm9ncmVzcy4gUmVhZGluZ1xuICogYSBwYXNzaW5nIHJ1biB0aGVyZWZvcmUgZ2F2ZSBubyBldmlkZW5jZSB0aGF0IGxpbnRpbmcgaGFwcGVuZWQsIHNvIHRoZSByZWNhcCBsaXN0cyBlYWNoIHN0ZXAgdGhhdFxuICogcmFuLCB3aGF0IGl0IHJhbiwgYW5kIGhvdyBsb25nIGl0IHRvb2suXG4gKi9cbmZ1bmN0aW9uIHByaW50VmVyaWZ5U3VtbWFyeShzdGVwczogVmVyaWZ5U3RlcFtdLCBkcnlSdW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKHN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IG5hbWVXaWR0aCA9IE1hdGgubWF4KC4uLnN0ZXBzLm1hcCgoc3RlcCkgPT4gc3RlcC5uYW1lLmxlbmd0aCkpO1xuICAvLyBgLS1kcnktcnVuYCBza2lwcyBjb21tYW5kIGV4ZWN1dGlvbiwgc28gZXZlcnkgc3RlcCB0b29rIG5vIHRpbWUgYW5kIHZlcmlmaWVkIG5vdGhpbmc6IGEgZ3JlZW5cbiAgLy8gXCJWZXJpZmllZFwiIHJlY2FwIHdvdWxkIGNsYWltIGV4YWN0bHkgdGhlIHdvcmsgdGhlIGZsYWcgc3VwcHJlc3NlZC4gTGlzdCB3aGF0IHdvdWxkIHJ1biBpbnN0ZWFkLlxuICBpZiAoZHJ5UnVuKSB7XG4gICAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdEcnkgcnVuIOKAlCBub3RoaW5nIHdhcyBleGVjdXRlZC4gU3RlcHMgdGhhdCB3b3VsZCBydW46JykpKTtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICAgIC8vIFBhZCBvbmx5IHdoZW4gYSBkZXRhaWwgZm9sbG93cywgc28gYSBkZXRhaWwtbGVzcyBzdGVwIGRvZXMgbm90IGVtaXQgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAgICAgIGNvbnNvbGUuaW5mbyhgICAtICR7c3RlcC5kZXRhaWwgPyBzdGVwLm5hbWUucGFkRW5kKG5hbWVXaWR0aCkgKyBjaGFsay5ncmF5KGAgICR7c3RlcC5kZXRhaWx9YCkgOiBzdGVwLm5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGR1cmF0aW9ucyA9IHN0ZXBzLm1hcCgoc3RlcCkgPT4gZm9ybWF0U3RlcER1cmF0aW9uKHN0ZXAuZHVyYXRpb25NcykpO1xuICBjb25zdCBkdXJhdGlvbldpZHRoID0gTWF0aC5tYXgoLi4uZHVyYXRpb25zLm1hcCgoZHVyYXRpb24pID0+IGR1cmF0aW9uLmxlbmd0aCkpO1xuICBjb25zdCB0b3RhbER1cmF0aW9uTXMgPSBzdGVwcy5yZWR1Y2UoKHRvdGFsLCBzdGVwKSA9PiB0b3RhbCArIHN0ZXAuZHVyYXRpb25NcywgMCk7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoYFZlcmlmaWVkIGluICR7Zm9ybWF0U3RlcER1cmF0aW9uKHRvdGFsRHVyYXRpb25Ncyl9OmApKSk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBzdGVwXSBvZiBzdGVwcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IChkdXJhdGlvbnNbaW5kZXhdIGFzIHN0cmluZykucGFkU3RhcnQoZHVyYXRpb25XaWR0aCk7XG4gICAgY29uc3QgZGV0YWlsID0gc3RlcC5kZXRhaWwgPyBgICAke3N0ZXAuZGV0YWlsfWAgOiAnJztcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJyAg4pyUICcpICsgc3RlcC5uYW1lLnBhZEVuZChuYW1lV2lkdGgpICsgY2hhbGsuZ3JheShgICAke2R1cmF0aW9ufSR7ZGV0YWlsfWApKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYWNrYWdlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBwcmVzZXJ2ZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBQcmludHMgcGFja2FnZSBjb21tYW5kIG91dHB1dCBmb3IgYHdiIHZlcmlmeWAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIHNvIHN1Y2Nlc3NmdWwgbm9pc3lcbiAqIGNvbW1hbmRzIGFyZSBzdW1tYXJpemVkIHdoaWxlIGZhaWx1cmUgb3V0cHV0IHJlbWFpbnMgYXZhaWxhYmxlIGZvciBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgVGhlIGV4ZWN1dGVkIGNvbW1hbmQuXG4gKiBAcGFyYW0gZXhpdENvZGUgVGhlIGNvbW1hbmQgZXhpdCBjb2RlLlxuICogQHBhcmFtIG91dHB1dCBUaGUgbWVyZ2VkIHN0ZG91dCBhbmQgc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwICYmIC9eKD86YnVufHlhcm4pICg/Omluc3RhbGx8Z2VuLWNvZGUpJC91LnRlc3QoY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKG9yaWdpbmFsU3Rkb3V0V3JpdGUsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZGVycldyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0Z1bGwgbG9nOicpLCBsb2dGaWxlUGF0aCkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoZmluaXNoZWQpIHJldHVybjtcbiAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IG9yaWdpbmFsU3Rkb3V0V3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gb3JpZ2luYWxTdGRlcnJXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGZvcm1hdEVsYXBzZWRUaW1lKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWRlZCA/ICdTdWNjZWVkZWQnIDogJ0ZhaWxlZCc7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGAke3N0YXR1c30gaW4gJHtlbGFwc2VkVGltZX0uIEZ1bGwgbG9nOiAke2xvZ0ZpbGVQYXRofVxcbmA7XG4gICAgY29uc3QgY29sb3JlZFN1bW1hcnkgPSBzdWNjZWVkZWQgPyBjaGFsay5ncmVlbihzdW1tYXJ5KSA6IGNoYWxrLnJlZChzdW1tYXJ5KTtcbiAgICBvcmlnaW5hbFN0ZG91dFdyaXRlKGNvbG9yZWRTdW1tYXJ5KTtcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgc3VtbWFyeSk7XG4gICAgZnMuY2xvc2VTeW5jKGxvZ0ZpbGUpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmYWlsOiAoZXJyb3IpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmluaXNoOiAoKSA9PiB7XG4gICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdleGl0JywgZmluaXNoKTtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH0sXG4gICAgc3VjY2VlZDogKCkgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0ZWVXcml0ZShvcmlnaW5hbFdyaXRlOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUsIGxvZ0ZpbGU6IG51bWJlcik6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSB7XG4gIHJldHVybiAoKFxuICAgIGNodW5rOiBVaW50OEFycmF5IHwgc3RyaW5nLFxuICAgIGVuY29kaW5nT3JDYWxsYmFjaz86IEJ1ZmZlckVuY29kaW5nIHwgKChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCksXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWRcbiAgKSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID1cbiAgICAgIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBCdWZmZXIuZnJvbShjaHVuaywgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ3N0cmluZycgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiAndXRmOCcpXG4gICAgICAgIDogY2h1bms7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIGJ1ZmZlcik7XG4gICAgLy8gV3JpdGUgdG8gdGhlIHRlcm1pbmFsIHZpYSB0aGUgb3JpZ2luYWwgc3RyZWFtIG1ldGhvZDogYSBzeW5jaHJvbm91cyBmcy53cml0ZVN5bmMgb24gdGhlXG4gICAgLy8gc3Rkb3V0L3N0ZGVyciBmZCB0aHJvd3MgRUFHQUlOIG9uIENJJ3Mgbm9uLWJsb2NraW5nIHBpcGVzIHdoZW4gbGFyZ2Ugb3V0cHV0IGZsdXNoZXMgYXQgb25jZSxcbiAgICAvLyB3aGlsZSB0aGUgc3RyZWFtIG1ldGhvZCBidWZmZXJzIGludGVybmFsbHkgYW5kIGhhbmRsZXMgYmFja3ByZXNzdXJlLlxuICAgIHJldHVybiBvcmlnaW5hbFdyaXRlKGJ1ZmZlciwgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6IGNhbGxiYWNrKTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG4vKiogU3ViLW1pbnV0ZSBzdGVwcyBrZWVwIG9uZSBkZWNpbWFsIHNvIGEgZmFzdCBzdGVwIGlzIG5vdCBmbGF0dGVuZWQgdG8gYSBtaXNsZWFkaW5nIGAwc2AuICovXG5mdW5jdGlvbiBmb3JtYXRTdGVwRHVyYXRpb24obWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobWlsbGlzZWNvbmRzIDwgNjBfMDAwKSB7XG4gICAgcmV0dXJuIGAkeyhtaWxsaXNlY29uZHMgLyAxMDAwKS50b0ZpeGVkKDEpfXNgO1xuICB9XG4gIHJldHVybiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHMpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IHByb3RlY3RSdW5TY3JpcHRBcmdzIH0gZnJvbSAnLi4vYmluL3J1bkFyZ3MuanMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgY2hlY2tFbnZDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jaGVja0Vudi5qcyc7XG5pbXBvcnQgeyBjb25jdXJyZW50bHlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9jb25jdXJyZW50bHkuanMnO1xuaW1wb3J0IHsgZGVwbG95Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZGVwbG95LmpzJztcbmltcG9ydCB7IGRvdGVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2RvdGVudi5qcyc7XG5pbXBvcnQgeyBnZW5Db2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuQ29kZS5qcyc7XG5pbXBvcnQgeyBnZW5EZXZWYXJzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZ2VuRGV2VmFycy5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydElmTm9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9raWxsUG9ydElmTm9uQ2kuanMnO1xuaW1wb3J0IHsgbGludENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2xpbnQuanMnO1xuaW1wb3J0IHsgbWFpbnRlbmFuY2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9tYWludGVuYW5jZS5qcyc7XG5pbXBvcnQgeyBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvb3B0aW1pemVGb3JEb2NrZXJCdWlsZC5qcyc7XG5pbXBvcnQgeyBwcmlzbWFDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgcmFpbHdheUVudkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JhaWx3YXlFbnYuanMnO1xuaW1wb3J0IHsgcmVsZWFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JlbGVhc2UuanMnO1xuaW1wb3J0IHsgcmV0cnlDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZXRyeS5qcyc7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9ydW4uanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0cmVlS2lsbENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3RyZWVLaWxsLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHZlcmlmeUNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJpZnlDb2RlLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnByb3RlY3RSdW5TY3JpcHRBcmdzKHByb2Nlc3MuYXJndik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIC8vIFdhcm4gb25seSB3aGVuIGEgc2hpbSBhY3R1YWxseSB3aW5zIGBub2RlYCByZXNvbHV0aW9uOiBvdmVuL2J1biBpbWFnZXMgYXBwZW5kIGEgaGFybWxlc3NcbiAgICAvLyAvdXNyL2xvY2FsL2J1bi1ub2RlLWZhbGxiYWNrLWJpbiAobm9kZSAtPiBidW4pIGF0IHRoZSBFTkQgb2YgUEFUSCwgc28gYSBQQVRIIHN1YnN0cmluZ1xuICAgIC8vIGNoZWNrIGZhbHNlLXBvc2l0aXZlcyB3aGVuZXZlciBhIHJlYWwgbm9kZSBwcmVjZWRlcyBpdC5cbiAgICBjb25zdCBub2RlT25QYXRoID0gZmluZEZpcnN0Tm9kZU9uUGF0aCgpO1xuICAgIGlmIChub2RlT25QYXRoICYmIGlzQnVuTm9kZVNoaW0obm9kZU9uUGF0aCkpIHtcbiAgICAgIC8vIE5vdCBmaXhlZCB1cCBoZXJlOiB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KSBtYXkgaGFuZyBvclxuICAgICAgLy8gY3Jhc2ggdW5kZXIgdGhlIHNoaW0sIGFuZCBzb21lICh3cmFuZ2xlciBkZXYpIGZhaWwgc2lsZW50bHksIHNvIHN1cmZhY2UgdGhlIGNhdXNlIHVwZnJvbnQuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiBcXGBub2RlXFxgIG9uIFBBVEggaXMgYSBCdW4gc2hpbSAoJHtub2RlT25QYXRofSk7IGAgK1xuICAgICAgICAgICdydW4gd2Igd2l0aG91dCBgLS1idW5gIGFuZCByZW1vdmUgYFtydW5dIGJ1bmAgZnJvbSBidW5maWcudG9tbC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhcmd2Ll9bMF0gIT09ICdydW4nKSByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNoZWNrRW52Q29tbWFuZClcbiAgLmNvbW1hbmQoY29uY3VycmVudGx5Q29tbWFuZClcbiAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgLmNvbW1hbmQoZG90ZW52Q29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkRldlZhcnNDb21tYW5kKVxuICAuY29tbWFuZChraWxsUG9ydElmTm9uQ2lDb21tYW5kKVxuICAuY29tbWFuZChsaW50Q29tbWFuZClcbiAgLmNvbW1hbmQobWFpbnRlbmFuY2VDb21tYW5kKVxuICAuY29tbWFuZChvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZClcbiAgLmNvbW1hbmQocHJpc21hQ29tbWFuZClcbiAgLmNvbW1hbmQocmFpbHdheUVudkNvbW1hbmQpXG4gIC5jb21tYW5kKHJlbGVhc2VDb21tYW5kKVxuICAuY29tbWFuZChyZXRyeUNvbW1hbmQpXG4gIC5jb21tYW5kKHJ1bkNvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwQ29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kKVxuICAuY29tbWFuZChzdGFydENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0T25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKHRyZWVLaWxsQ29tbWFuZClcbiAgLmNvbW1hbmQodHlwZUNoZWNrQ29tbWFuZClcbiAgLmNvbW1hbmQodGNDb21tYW5kKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuLyoqIFRoZSBmaXJzdCBleGVjdXRhYmxlIGBub2RlYCBvbiBQQVRILCBpLmUuIHRoZSBvbmUgY2hpbGQgcHJvY2Vzc2VzIHdpbGwgcnVuLiAqL1xuZnVuY3Rpb24gZmluZEZpcnN0Tm9kZU9uUGF0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGRpciBvZiAocHJvY2Vzcy5lbnYuUEFUSCA/PyAnJykuc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgaWYgKCFkaXIpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgbm9kZVBhdGggPSBwYXRoLmpvaW4oZGlyLCAnbm9kZScpO1xuICAgIHRyeSB7XG4gICAgICBmcy5hY2Nlc3NTeW5jKG5vZGVQYXRoLCBmcy5jb25zdGFudHMuWF9PSyk7XG4gICAgICAvLyBYX09LIGFsc28gcGFzc2VzIGZvciBzZWFyY2hhYmxlIGRpcmVjdG9yaWVzLCB3aGljaCBleGVjdnAgc2tpcHMuXG4gICAgICBpZiAoZnMuc3RhdFN5bmMobm9kZVBhdGgpLmlzRmlsZSgpKSByZXR1cm4gbm9kZVBhdGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb3QgcHJlc2VudCBvciBub3QgZXhlY3V0YWJsZSBpbiB0aGlzIGRpcmVjdG9yeTsga2VlcCBzZWFyY2hpbmcuXG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVuTm9kZVNoaW0obm9kZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgYnVuIC0tYnVuYCBhbmQgYnVuZmlnJ3MgYHJ1bi5idW5gIHByZXBlbmQgYSBidW4tbm9kZS08dmVyc2lvbj4gZGlyZWN0b3J5IHdob3NlIGBub2RlYCBsaW5rc1xuICAvLyB0byBidW4sIGFuZCBvdmVuL2J1biBpbWFnZXMgc3ltbGluayBub2RlIC0+IGJ1biBpbiBidW4tbm9kZS1mYWxsYmFjay1iaW4sIHNvIHRoZSBnaXZlYXdheSBpc1xuICAvLyBlaXRoZXIgYSBidW4tbm9kZS0gcGF0aCBzZWdtZW50IG9yIGEgcmVzb2x1dGlvbiB0byB0aGUgYnVuIGJpbmFyeSBpdHNlbGYuXG4gIC8vIFNoaW1zIGxpdmUgZGlyZWN0bHkgaW4gYSBidW4tbm9kZS08dmVyc2lvbj4gZGlyZWN0b3J5LCBzbyBjaGVjayBvbmx5IHRoZSBpbW1lZGlhdGUgcGFyZW50XG4gIC8vIChyZWxhdGl2ZSBQQVRIIGVudHJpZXMgaW5jbHVkZWQpOiBtYXRjaGluZyBhbmNlc3RvcnMgd291bGQgZmFsc2UtcG9zaXRpdmUgb24gZS5nLiBhIHJlYWwgbm9kZVxuICAvLyBpbnNpZGUgYSBidW4tbm9kZS13b3Jrc3BhY2UgY2hlY2tvdXQuXG4gIGlmIChwYXRoLmJhc2VuYW1lKHBhdGguZGlybmFtZShub2RlUGF0aCkpLnN0YXJ0c1dpdGgoJ2J1bi1ub2RlLScpKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShmcy5yZWFscGF0aFN5bmMobm9kZVBhdGgpKSA9PT0gJ2J1bic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbOSwxMCwxMSwxMiwxM10sIm1hcHBpbmdzIjoiODJCQWVBLFNBQWdCLEVBQW9DLEVBQW1DLEVBQStCLENBQ3BILE9BQU8sR0FDTCxFQUF1QyxDQUFVLENBQUMsQ0FBQyxPQUFRLEdBQ3pELEdBQStCLENBQWdCLENBQ2pELEVBQ0EsQ0FDRixDQUNGLENBOEJBLFNBQWdCLEdBQWlDLEVBQTZCLEVBQStCLENBUzNHLElBQU0sRUFBcUIsR0FBOEIsQ0FNdkQsSUFBTSxFQUFzQixFQUFHLGlCQUFpQixDQUFPLEVBQ2pELEVBQWMsQ0FBRSxJQUFLLEVBQWEsb0JBQXFCLEdBQU8sT0FBUSxDQUFDLG9CQUFvQixDQUFFLEVBTzdGLEVBQWdCLElBQUksSUFBSSxFQUFHLFNBQVMsRUFBSyxNQUFNLEtBQUssRUFBUyxjQUFjLEVBQUcsQ0FBVyxDQUFDLEVBQ2hHLEdBQUksRUFBUSxTQUFTLEdB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V0FBVyxFQUFFLEVBQUVDLEdBQUUsSUFBSSxXQUFXLEVBQUUsRUFBRUMsR0FBRSxJQUFJLFlBQVksSUFBSSxFQUFFLElBQUksV0FBVyxJQUFJLEVBQUUsR0FBRSxJQUFJLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksV0FBVyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsRUFBRSxFQUFFLEdBQUUsRUFBRSxDQUFDLElBQUksRUFBRUEsR0FBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFRixHQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRUMsR0FBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssV0FBVyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBR0gsRUFBRSxFQUFFLEtBQUtBLEVBQUUsR0FBRyxFQUFFLEtBQUtBLEVBQUUsR0FBRyxHQUFHLEtBQUtBLEVBQUUsSUFBSSxJQUFJQSxFQUFFLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEdBQUcsS0FBS0EsRUFBRSxJQUFJLElBQUlBLEVBQUUsRUFBRSxLQUFLQSxFQUFFLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEdBQUcsR0FBRyxLQUFLQSxFQUFFLElBQUksSUFBSUEsRUFBRSxFQUFFLEtBQUtBLEVBQUUsR0FBRyxFQUFFLEtBQUtBLEVBQUUsR0FBRyxHQUFHLEtBQUtBLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsR0FBRyxFQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxHQUFHLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEdBQUUsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEVBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEVBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEVBQUcsRUFBRyxHQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUcsRUFBRSxHQUFFLEdBQUUsRUFBRSxFQUFHLEdBQUcsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUksRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFLLElBQUksSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLEdBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxHQUFJLEVBQUUsR0FBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUksR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxHQUFHLEVBQUUsSUFBRyxFQUFFLEdBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxHQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsRUFBRyxHQUFHLEVBQUUsS0FBSSxHQUFHLEVBQUcsSUFBRyxFQUFFLElBQUksR0FBRyxFQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsR0FBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsR0FBSSxHQUFHLElBQUssR0FBRyxHQUFHLEdBQUksR0FBRyxJQUFLLEdBQUcsRUFBRyxJQUFHLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLEtBQUksR0FBRyxFQUFFLElBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRyxHQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRyxHQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFHLEdBQUcsR0FBRyxLQUFJLEVBQUUsRUFBRyxJQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxLQUFJLEdBQUcsR0FBRyxHQUFJLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUssR0FBRyxFQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEdBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRyxHQUFFLEVBQUUsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxFQUFFLEVBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEVBQUUsQ0FBQyxFQUFHLEVBQUcsR0FBRyxFQUFHLENBQUMsRUFBRyxFQUFHLEVBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEdBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRSxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUUsR0FBRSxFQUFHLENBQUMsR0FBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEVBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRSxFQUFHLENBQUMsRUFBRSxFQUFHLEdBQUUsR0FBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsRUFBRSxHQUFHLENBQUMsRUFBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBR0MsR0FBRSxHQUFHLElBQUdBLEdBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLENDUnIySSxNQUFNLEdBQUVJLEdBQUUsRUFBRUMsR0FBRSxJQUFJLFlBQVlDLEdBQUUsSUFBSSxZQUFZLE9BQU8sRUFBRSxTQUFTRixJQUFHLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsSUFBSyxJQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsSUFBSyxLQUFJLEVBQUUsUUFBUSxJQUFLLElBQUcsRUFBRSxLQUFLLElBQUssRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsU0FBUyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSyxHQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSyxLQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsV0FBVyxLQUFLLEdBQUcsQ0FBQyxLQUFLRSxHQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBS0QsR0FBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxJQUFJLElBQUksU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEtBQUssS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENDQWowQixTQUFTLEdBQUUsRUFBRSxFQUFFLEdBQUUsQ0FBQyxPQUFPLEtBQUssVUFBVUUsR0FBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBU0MsR0FBRSxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUssR0FBRSxNQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsT0FBTyxNQUFNLENBQUMsRUFBRSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBU0QsR0FBRSxFQUFFLEVBQUUsR0FBRSxDQUFDLElBQUksRUFBRUMsR0FBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFQSxHQUFFLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLElBQUssR0FBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxPQUFPLEVBQXpCLENBQTRCLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLE9BQU8sR0FBRyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFLLEdBQUUsR0FBRyxJQUFJLElBQUssR0FBRSxDQUFDLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcs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
|
|
108
|
+
|| ${$(t,`-t 90000 -i 10000`)}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || ${$(t)} && open-cli http://\${HOST:-localhost}:${t}`}};function $(e,t){if(e===void 0||e===``)throw Error(`Port is required for the loopback readiness check.`);return`wait-on ${t?`${t} `:``}tcp:localhost:${e}`}function vc(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function yc(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function bc(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return xc([...i,...e,...r],n);let o=e.slice(1),s=Sc(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return xc([...i,`test`,...a,...c,...r],n)}function xc(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?U(e):U([...e,`--max-failures=1`])}function Sc(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;Cc.has(i)?t=`required`:wc.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Tc.has(e)&&(t=`required`);continue}n.push(r)}return n}const Cc=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`]),wc=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Tc=new Set([`-c`,`-g`,`-j`]);var Ec=class extends _c{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);e.env.PORT||=`3000`;let i=await na(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return U([`YARN`,`wb`,`concurrently`,...kt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`${$(i,`-t 600000 -i 2000`)} && ${c}${a}`])}};const Dc=new Ec,Oc=new class extends _c{constructor(){super(!1)}startDevProtected(e,t){throw 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} && ${e.isBunAvailable?`bun run`:`node`} 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`)} && ${pc.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(e,t,n){return this.testE2EWithoutServer(e,t,n)}testE2EProduction(e,t,n){return this.testE2EWithoutServer(e,t,n)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}runsE2eOnCi(e){return e.hasPlaywrightWebServerConfig}usesUnitRunnerForE2e(e){return!e.hasPlaywrightConfig}async testE2EWithoutServer(e,t,n){if(e.hasPlaywrightWebServerConfig)return this.buildPlaywrightOnlyCommand(e,t,n);if(e.hasPlaywrightConfig)return`echo 'do nothing.'`;let r=Ac(n.forwardedPlaywrightArgs??[]);if(r.unsupportedOption!==void 0)return U([`echo`,`Skipping test/e2e/ (cannot forward the Playwright arg to the unit-test runner: ${r.unsupportedOption}).`]);let i=[...t.targets??[],...r.targets],a=i.length>0?i:[`test/e2e/`],o=this.testUnit(e,{...t,targets:a});return r.flags.length>0?`${o} ${U(r.flags)}`:o}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},kc=/^(?:-t|-g|--grep|--test-name-pattern)(?:=(?<value>.*))?$/;function Ac(e){let t=[],n;for(let r=0;r<e.length;r++){let i=e[r];if(i===`--`){t.push(...e.slice(r+1));break}let a=kc.exec(i);if(a){let o=a.groups?.value??e[++r];if(!o)return{targets:t,flags:[],unsupportedOption:i};n=o;continue}if(i.startsWith(`-`)&&i!==`-`)return{targets:t,flags:[],unsupportedOption:i};t.push(i)}return{targets:t,flags:n===void 0?[]:[`-t=${n}`]}}const jc=[`express`,`fastify`,`elysia`,`hono`],Mc=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){let n=`--turbopack `;return e.packageJson.dependencies?.blitz&&(n=Nc(e)>=16?`--webpack `:``),`YARN next dev ${n}${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}};function Nc(n){try{let r=JSON.parse(e.readFileSync(t.join(n.dirPath,`node_modules`,`next`,`package.json`),`utf8`)),i=k.coerce(r.version)?.major;if(i!==void 0)return i}catch{}return k.coerce(n.packageJson.dependencies?.next)?.major??15}const Pc=new class extends _c{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[Nt(t,`.dev.vars`)],i=an(e,`test`)?Ft(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=Ft(e);return[e.buildCommand,Nt(t,`dist/server/.dev.vars`),...r?[r]:[],Pt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${Ut(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},Fc=new class extends _c{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()}},Ic=new class extends Ec{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=Ut(e),r=[Nt(t,`.dev.vars`)],i=Ft(e);return i&&r.push(i),r.push(Pt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}};function Lc(e){return Rc(e)??(zc(e)?Dc:Oc)}function Rc(e){let t=e.packageJson.dependencies??{},n=e.packageJson.devDependencies??{};if(t.vinext||n.vinext)return Pc;if(t.next)return Mc;if(n.vite)return Fc;if(zt(e))return Ic}function zc(e){let t=e.packageJson.dependencies??{};return jc.some(e=>t[e])&&!t[`firebase-functions`]}const Bc={...uc,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},Vc={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(Bc),async handler(e){dc(e);let t=await K(e);t||(console.error(p.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i=Rc(n);if(!i)if(zc(n)||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=Dc;else if(t[`build-ts`]||r[`build-ts`])i=Oc;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await q(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await q(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await q(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await q(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await q(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},Hc=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),Uc=.05,Wc={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`}},Gc={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},Kc={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(Wc).positional(`targets`,Gc.targets),async handler(e){process.exit(await qc(e))}};async function qc(n,r={}){let i=Jc(n),a=await K(i);if(!a)return console.error(p.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=sl(o,s);for(let n of a.descendants){n.env;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d=Lc(n);console.info(`Running "test" for ${n.name} ...`);let f=St(n);if(f.length>0)return Et(n.name,f),1;let p=Yc(n),m=o.filter(e=>!ol(e)),h=m.length>0?m:p;if(l&&h!==!1){let e={...i,targets:h},t=await Qc(d.testUnit(n,e),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(t!==0)return t}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`)))continue;let g=o.filter(e=>ol(e)),_={...i,targets:g.length>0?g:void 0},v=e=>d.usesUnitRunnerForE2e(n)&&!e.startsWith(`echo `)?Qc(e,n,i,{exitIfFailed:r.exitIfFailed,silentSuccessMessage:`E2E tests passed.`}):Zc(e,n,i,{exitIfFailed:r.exitIfFailed});switch(i.e2e){case`headless`:{let e=await v(await d.testE2EProduction(n,_,{playwrightArgs:il(g,s),forwardedPlaywrightArgs:s}));if(e!==0)return e;continue}case`headless-dev`:{let e=await v(await d.testE2EDev(n,_,{playwrightArgs:il(g,s),forwardedPlaywrightArgs:s}));if(e!==0)return e;continue}case`docker`:{let e=await Xc(n,_,d,il(g,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await Xc(n,_,d,il(g,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.next||u.vite)switch(i.e2e){case`headed`:{let e=await Zc(await d.testE2EProduction(n,_,{playwrightArgs:il(g,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await Zc(await d.testE2EDev(n,_,{playwrightArgs:il(g,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await Zc(await d.testE2EProduction(n,_,{playwrightArgs:il(g,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await Zc(await d.testE2EProduction(n,_,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await Zc(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function Jc(e){return e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?{...e,commandDefaultWbEnv:`test`}:{...e,cascadeEnv:`test`}}function Yc(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[`./test/unit/`]:!1}async function Xc(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await q(`${n.buildDocker(e,`test`)}${fc(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await Zc(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await q(pc.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function Zc(e,t,n,r={}){return q(e,t,n,{...r,processSilentOutput:$c})}function Qc(e,t,n,r={}){return q(e,t,n,{omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`,...r})}function $c(e){let t=[],n=new Set,r=[];for(let i of el(e)){let e=nl(i);n.has(e)||t.some(t=>rl(t,e))||(tl(t,n,e),r.push(i))}return r.join(`
|
|
109
|
+
`)}function*el(e){let t=0;for(;t<=e.length;){let n=e.indexOf(`
|
|
110
|
+
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function tl(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;let r=e.shift();r!==void 0&&t.delete(r)}function nl(e){return e.replaceAll(Hc,``).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 rl(e,t){let n=Math.max(e.length,t.length);return n===0?!0:Math.abs(e.length-t.length)>n*Uc?!1:A(e,t)/n<=Uc}function il(e,t=[],n=[]){let r=Sc(t).length>0;return[`test`,...e.length>0||r?[]:[`test/e2e/`],...n]}const al=/(?:^|\/)test\/e2e(?:\/|$)/;function ol(e){return al.test(e)}function sl(e,t=[]){let n=e.some(e=>ol(e)),r=e.some(e=>!ol(e)),i=e.length===0&&t.length===0;return{shouldRunUnit:i||r,shouldRunE2e:i||n||t.length>0}}const cl={command:`test-on-ci`,describe:`Test project on CI with no options.`,builder:{silent:{description:`Reduce redundant outputs`,type:`boolean`}},async handler(e){await ll(e)}};async function ll(n){process.env.WB_ENV||=`test`;let r=await K(n);r||(console.error(p.red(`No project found.`)),process.exit(1));for(let i of r.descendants){i.env.CI||=`1`,i.env.WB_ENV=process.env.WB_ENV;let r=Lc(i);console.info(`Running "test-on-ci" for ${i.name} ...`);let a=St(i);if(a.length>0){Et(i.name,a),process.exitCode=1;continue}let o=i.hasDockerfile;o&&await On(pc.stopAll(),i,n);let s=Yc(i);if(s!==!1){let e={...n,targets:s};await On(r.testUnit(i,e).replaceAll(` --allowOnly`,``),i,n)}if(e.existsSync(t.join(i.dirPath,`test`,`e2e`))){if(await On(await r.testStart(i,n),i,n),await En.promiseAll(),o&&(i.env.WB_DOCKER||=`1`,await q(`${r.buildDocker(i,`test`)}${fc(n)}`,i,n)),r.runsE2eOnCi(i)){let e=await q((o?await r.testE2EDocker(i,n,{}):await r.testE2EProduction(i,n,{})).replaceAll(` --allowOnly`,``),i,n,{exitIfFailed:!1});e!==0&&(process.exitCode=e)}o&&await q(pc.stop(i),i,n)}}}const ul={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{let t=e.signal;if(!(t in _.signals))throw Error(`Invalid signal: ${t}`);P(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},dl={command:`typecheck`,describe:`Run type checking. Environment variables are not loaded.`,builder:{},async handler(e){process.exit(await fl(e))}};async function fl(n){let r=await K(n,!1);if(!r)return console.error(p.red(`No project found.`)),1;let i=!1,a=r.descendants.map(async a=>{let o=pl(a);for(;o.length>0;){let s=await On(o.join(` && `),a,n,{ci:r.descendants.length>1,exitIfFailed:!1,preserveColor:!0}),c=t.join(a.dirPath,`.next`);if(s&&e.existsSync(c)){e.rmSync(c,{force:!0,recursive:!0}),console.info(p.yellow("Removed `.next` directory. We will re-try type checking.")),i=!0;continue}return s}}),o=await Promise.all(a),s=0;for(let e of o)e&&(s=e);return s||console.info(p.green(i?`-----
|
|
111
|
+
No type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.`:`No type errors found.`)),s}function pl(e){let t=[];return e.hasOwnSourceCode&&t.push(...ml(e)),!e.packageJson.workspaces&&e.hasOwnDependency(`pyright`)&&t.push(`YARN pyright`),t}function ml(e){return e.hasOwnDependency(`typescript`)?[`BUN tsc --noEmit`]:[]}const hl={...dl,command:`tc`},gl={command:`verify`,describe:`Verify project code`,builder:{full:{type:`boolean`,default:!1,describe:`Run tests after verifying project code`}},async handler(e){let t=on(e,!1);t||(console.error(p.red(`No project found.`)),process.exit(1));let n=[];e.full?await _l(t.self,e,n):(await vl(t.self,e,n),Tl(n,!!e.dryRun))}};async function _l(e,t,n){let r=kl(e);try{await vl(e,t,n),await Cl(n,{name:`test`},()=>yl(e,t)),Tl(n,!!t.dryRun),r.succeed()}catch(e){throw r.fail(e),e}finally{r.finish()}}async function vl(e,t,n){let r=`${e.packageManagerCommand} install`,i=await Cl(n,{detail:r,name:`install`},()=>El(r,e,t,{allowFailure:!0}));if(t.dryRun||Yr(e.rootDirPath),i!==0&&(console.info(p.red(p.bold(`Failed (exit code ${i}):`),r)),process.exit(i)),e.packageJson.scripts?.[`gen-code`]){let r=`${e.packageManagerCommand} gen-code`;await Cl(n,{detail:r,name:`gen-code`},()=>El(r,e,t))}let a=await xl(t);await Cl(n,{detail:a.cleanup,name:`cleanup`},()=>wl(`cleanup`,()=>ki({...t,_:[`lint`],fix:!0,format:!0,silent:!0}))),await Cl(n,{detail:a.typecheck,name:`typecheck`},()=>wl(`typecheck`,()=>fl({...t,_:[`typecheck`]})))}async function yl(e,t){let n=Jc({...t,_:[`test`],e2e:`headless`,silent:!0}),r=await qc(n,{exitIfFailed:!1});if(r===0)return;e.packageJson.scripts?.[`db-reset`]||(console.info(p.red(p.bold(`Failed (exit code ${r}):`),`test`)),process.exit(r)),console.info(p.yellow(`Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.`)),await El(`${e.packageManagerCommand} db-reset`,bl(e,n),n,{printRawOutput:!0});let i=await qc(n,{exitIfFailed:!1});i!==0&&(console.info(p.red(p.bold(`Failed (exit code ${i}):`),`test after db-reset retry`)),process.exit(i)),console.info(p.green(`Tests passed after db-reset retry.`))}function bl(e,t){let n=G(t,!0,e.dirPath);if(!n)throw Error(`Project not found: ${e.dirPath}`);return n}async function xl(e){let t=`lint --fix --format`,n=await K(e,!1);if(!n)return{cleanup:t};let r=n.descendants.some(e=>e.hasOwnSourceCode&&Ii(e,{fix:!0,format:!0})?.includes(`--type-aware`)),i=[...new Set(n.descendants.flatMap(e=>pl(e).map(Sl)))];return{cleanup:r?`${t} (oxlint --type-aware --type-check)`:t,typecheck:i.length>0?i.join(` + `):void 0}}function Sl(e){return e.replace(/^(?:BUN|YARN) /u,``)}async function Cl(e,t,n){let r=Date.now(),i=await n();return e.push({...t,durationMs:Date.now()-r}),i}async function wl(e,t){let n=await t()??0;return n!==0&&(console.info(p.red(p.bold(`Failed (exit code ${n}):`),e)),process.exit(n)),n}function Tl(e,t){if(e.length===0)return;let n=Math.max(...e.map(e=>e.name.length));if(t){console.info(`
|
|
112
|
+
`+p.cyan(p.bold(`Dry run — nothing was executed. Steps that would run:`)));for(let t of e)console.info(` - ${t.detail?t.name.padEnd(n)+p.gray(` ${t.detail}`):t.name}`);return}let r=e.map(e=>jl(e.durationMs)),i=Math.max(...r.map(e=>e.length)),a=e.reduce((e,t)=>e+t.durationMs,0);console.info(`
|
|
113
|
+
`+p.green(p.bold(`Verified in ${jl(a)}:`)));for(let[t,a]of e.entries()){let e=r[t].padStart(i),o=a.detail?` ${a.detail}`:``;console.info(p.green(` ✔ `)+a.name.padEnd(n)+p.gray(` ${e}${o}`))}}async function El(e,t,n,r={}){if(Ol(e,t.dirPath),n.dryRun)return 0;let i=await F(e,void 0,{cwd:t.dirPath,env:Nn(t.env,{preserveColor:!1}),shell:!0,stdio:`pipe`,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),a=i.status??1;return r.printRawOutput||Dl(e,a,i.stdout),a!==0&&!r.allowFailure&&(console.info(p.red(p.bold(`Failed (exit code ${a}):`),e)),process.exit(a)),a}function Dl(e,t,n){if(t===0&&/^(?:bun|yarn) (?:install|gen-code)$/u.test(e)){console.info(p.green(`Succeeded.`));return}let r=n.trim();r&&(process.stdout.write(r),process.stdout.write(`
|
|
114
|
+
`))}function Ol(e,t){console.info(`
|
|
115
|
+
`+p.cyan(p.bold(`Command:`),e)+p.gray(` at ${t}`))}function kl(n){let r=Date.now(),i=t.join(n.dirPath,`.wb`);e.mkdirSync(i,{recursive:!0});let a=t.join(i,`verify-full.log`),o=e.openSync(a,`w`),s=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr),l=!1,u=!1;process.stdout.write=Al(s,o),process.stderr.write=Al(c,o),console.info(p.cyan(p.bold(`Full log:`),a));let d=()=>{if(u)return;u=!0,process.stdout.write=s,process.stderr.write=c;let t=Ml(Date.now()-r),n=`${l?`Succeeded`:`Failed`} in ${t}. Full log: ${a}\n`,i=l?p.green(n):p.red(n);s(i),e.writeSync(o,n),e.closeSync(o)};return process.once(`exit`,d),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener(`exit`,d),d()},succeed:()=>{l=!0}}}function Al(t,n){return((r,i,a)=>{let o=typeof r==`string`?Buffer.from(r,typeof i==`string`?i:`utf8`):r;return e.writeSync(n,o),t(o,typeof i==`function`?i:a)})}function jl(e){return e<6e4?`${(e/1e3).toFixed(1)}s`:Ml(e)}function Ml(e){let t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}Be(process.argv),await d(f(process.argv)).scriptName(`wb`).options(Ot).middleware(e=>{let n=e[`working-dir`];if(n){let e=t.resolve(n);process.chdir(e)}let r=Nl();r&&Pl(r)&&console.warn(`Warning: \`node\` on PATH is a Bun shim (${r}); run wb without \`--bun\` and remove \`[run] bun\` from bunfig.toml.`),e._[0]!==`run`&&Se(process.env)}).command(gl).command(dn).command(Fn).command(zn).command(Or).command(Fr).command(ni).command(di).command(pi).command(Oi).command(_a).command(No).command(ds).command(Ls).command(Rs).command(nc).command(rc).command(cc).command(to).command(Vc).command(Kc).command(cl).command(ul).command(dl).command(hl).demandCommand().strict().version(Fl()).help().argv;function Nl(){for(let n of(process.env.PATH??``).split(t.delimiter)){if(!n)continue;let r=t.join(n,`node`);try{if(e.accessSync(r,e.constants.X_OK),e.statSync(r).isFile())return r}catch{}}}function Pl(n){if(t.basename(t.dirname(n)).startsWith(`bun-node-`))return!0;try{return t.basename(e.realpathSync(n))===`bun`}catch{return!1}}function Fl(){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}let Il=!1;for(let e of[`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,()=>{if(!Il){Il=!0;try{P(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
|
|
116
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJub3JtYWxpemVCdW5Mb2NrZmlsZSIsImNvbGxlY3REZXNjZW5kYW50UGlkcyIsImlzTm9TdWNoUHJvY2Vzc0Vycm9yIiwicnVuQ29tbWFuZCIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsImUiLCJ0IiwibiIsInIiLCJpIiwiciIsInQiLCJuIiwiciIsIm4iLCJuIiwiZSIsImkiLCJ0IiwiZSIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImFyZ3VtZW50c0J1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQiLCJwYXJzZSIsImRlcGxveUNvbW1hbmQiLCJub3JtYWxpemVTaGFyZWRCdW5Mb2NrZmlsZSIsInBhcnNlVG9tbCIsImJ1aWxkZXIiLCJwYXJzZURvdGVudiIsImJ1aWxkZXIiLCJmcyIsInNldFRpbWVvdXQiLCJidWlsZGVyIiwic2V0VGltZW91dCIsImZzIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJidWlsZGVyIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZGVwbG95Q29tbWFuZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuV29ya3NwYWNlcy50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvYnVuTG9ja2ZpbGUudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi9iaW4vcnVuQXJncy5qcyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL2Vycm9yLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9oYXNoLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9vc29uL2NvbnN0cnVjdG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2dldENhY2hlS2V5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9tZW1vaXplT25lLmpzIiwiLi4vc3JjL3V0aWxzL2JpblBhdGgudHMiLCIuLi9zcmMvdXRpbHMvY2kudHMiLCIuLi9zcmMvdXRpbHMvZW52U291cmNlcy50cyIsIi4uL3NyYy91dGlscy9ydW50aW1lLnRzIiwiLi4vc3JjL3V0aWxzL3Rlc3RTdHJ1Y3R1cmUudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXIudHMiLCIuLi9zcmMvcHJvamVjdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZElmTmVlZGVkLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL3NjcmlwdHMvcnVuLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NoZWNrRW52LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2NvbmN1cnJlbnRseS50cyIsIi4uL3NyYy9zY3JpcHRzL2xpdGVzdHJlYW0udHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9kZXBsb3kudHMiLCIuLi9zcmMvY29tbWFuZHMvZG90ZW52LnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9idW5Mb2NrZmlsZS50cyIsIi4uL3NyYy91dGlscy93b3JrZXJUeXBlc0Vudi50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5Db2RlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkRldlZhcnMudHMiLCIuLi9zcmMvY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLnRzIiwiLi4vc3JjL3V0aWxzL291dHB1dC50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy9jb21tYW5kcy9tYWludGVuYW5jZS50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUmVnaXN0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JhaWx3YXlFbnYudHMiLCIuLi9zcmMvY29tbWFuZHMvcmVsZWFzZS50cyIsIi4uL3NyYy9jb21tYW5kcy9yZXRyeS50cyIsIi4uL3NyYy9jb21tYW5kcy9ydW4udHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy9sb2cudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3NlbGVjdFNjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0T25DaS50cyIsIi4uL3NyYy9jb21tYW5kcy90cmVlS2lsbC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyaWZ5Q29kZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgKGZub3ggcHJvZmlsZSAvIG1pc2UgZW52KSB0byBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ3F1aWV0LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N1cHByZXNzIGVudmlyb25tZW50IHZhcmlhYmxlIGxvYWRpbmcgaW5mb3JtYXRpb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHZlcmJvc2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc2hvdyB2ZXJib3NlIGluZm9ybWF0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd2JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVudlJlYWRlck9wdGlvbnMgPSBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Pj4+ICYge1xuICAvKipcbiAgICogQ29tbWFuZC1sZXZlbCBmYWxsYmFjayBmb3IgYW4gdW5zZXQgV0JfRU5WIChlLmcuIGB3YiB0ZXN0YCBzdXBwbGllcyAndGVzdCcgd2hlbiBleHBsaWNpdCBlbnZcbiAgICogZmxhZ3Mgc3VwcHJlc3MgaXRzIGRlZmF1bHQgdGVzdCBjYXNjYWRlKS4gTm90IGEgQ0xJIGZsYWcuXG4gICAqL1xuICBjb21tYW5kRGVmYXVsdFdiRW52Pzogc3RyaW5nO1xufTtcblxuY29uc3Qgc3RhbmRhcmRXYkVudk1vZGVzID0gbmV3IFNldChbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBXQl9FTlYgdmFsdWUgd2IgZmFsbHMgYmFjayB0byB3aGVuIG5vIGVudiBzb3VyY2UgYW5kIG5vIGV4cG9ydGVkIHZhcmlhYmxlIGRlZmluZXNcbiAqIGl0OiB0aGUgY29tbWFuZC1sZXZlbCBkZWZhdWx0IGZpcnN0IChgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgIGxvYWRzIHRoZSBzdGFnaW5nIGZpbGVzXG4gKiBidXQgaXRzIHRlc3RzIG11c3Qgc3RpbGwgcnVuIGFzIGB0ZXN0YCwgbWlycm9yaW5nIHRoZSBwcmUtMTUgYHx8PSAndGVzdCdgIGJlaGF2aW9yKSwgdGhlbiB0aGVcbiAqIGZvcmNlZCBjYXNjYWRlLCB0aGVuIHRoZSBhbWJpZW50LU5PREVfRU5WLWRyaXZlbiBhdXRvIGNhc2NhZGUgY2xhbXBlZCB0byBhIHN0YW5kYXJkIG1vZGUgKGFcbiAqIG5vbi1zdGFuZGFyZCBOT0RFX0VOViBzdWNoIGFzIGBxYWAgc3RpbGwgc2VsZWN0cyB0aGUgY2FzY2FkZSBzdWZmaXgsIGJ1dCBtdXN0IG5vdCBwcm9kdWNlIGFcbiAqIG5vbi1zdGFuZGFyZCBXQl9FTlYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmIChhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnYpIHJldHVybiBhcmd2LmNvbW1hbmREZWZhdWx0V2JFbnY7XG4gIGlmIChhcmd2LmNhc2NhZGVFbnYpIHJldHVybiBhcmd2LmNhc2NhZGVFbnY7XG4gIC8vIFJlYWQgTk9ERV9FTlYgdGhyb3VnaCB0aGUgYWxpYXMgZm9yIHRoZSBzYW1lIGJ1bmRsZXItaW5saW5pbmcgcmVhc29uIGFzIGluXG4gIC8vIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgYW5kIGZyb20gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgKG5vdCBsb2FkZWQgZmlsZXMpIGJlY2F1c2UgdGhlXG4gIC8vIGNhc2NhZGUgc2VsZWN0aW9uIGJlbG93IHVzZXMgdGhlIGFtYmllbnQgdmFsdWUgYXMgd2VsbC5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBkZXJpdmVkID1cbiAgICBhcmd2LmNhc2NhZGVOb2RlRW52IHx8IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogJ2RldmVsb3BtZW50JztcbiAgcmV0dXJuIHN0YW5kYXJkV2JFbnZNb2Rlcy5oYXMoZGVyaXZlZCkgPyBkZXJpdmVkIDogJ2RldmVsb3BtZW50Jztcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRoZSByZXBvc2l0b3J5J3MgZm5veCBjb25maWd1cmF0aW9uIGFuZCBtaXNlLlxuICogTm90ZSBpdCBkb2VzIG5vdCBhc3NpZ24gdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogQHJldHVybiBbZW52VmFycywgW2VudlNvdXJjZU5hbWVzLCBlbnZWYXJOYW1lc11bXV1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICAvKipcbiAgICAgKiBMb2FkIHZhcmlhYmxlcyBldmVuIGlmIHRoZXkgYWxyZWFkeSBleGlzdCBpbiBwcm9jZXNzLmVudi5cbiAgICAgKiBVc2VmdWwgd2hlbiBhIHBhcmVudCBwcm9jZXNzIGhhcyBhbHJlYWR5IGluamVjdGVkIHRoZSBmbm94IHZhbHVlcyBpbnRvIHRoZSBlbnZpcm9ubWVudFxuICAgICAqIGFuZCB0aGUgY29uZmlndXJlZCB2YXJpYWJsZXMgdGhlbXNlbHZlcyBhcmUgbmVlZGVkIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKS5cbiAgICAgKi9cbiAgICBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBFeHBhbmQgYCR7V0JfRU5WfWAgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBmYWxsYmFjayBtb2RlIHdoZW4gbm90aGluZyBkZWZpbmVzIFdCX0VOVi5cbiAgICAgKiBPbmx5IGZvciBjYWxsZXJzIHRoYXQgc3Vic2VxdWVudGx5IENPTVBMRVRFIFdCX0VOViB3aXRoIHRoYXQgZmFsbGJhY2sgKHdiJ3MgUHJvamVjdC5lbnYpLlxuICAgICAqL1xuICAgIGV4cGFuZEZhbGxiYWNrV2JFbnY/OiBib29sZWFuO1xuICB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgW3N0cmluZywgc3RyaW5nW11dW11dIHtcbiAgLy8gUmVhZCBOT0RFX0VOViB0aHJvdWdoIGFuIGFsaWFzLCBuZXZlciBhcyB0aGUgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCBtZW1iZXIgZXhwcmVzc2lvbjpcbiAgLy8gYnVuZGxlcnMgcmVwbGFjZSB0aGF0IGV4YWN0IGV4cHJlc3Npb24gYXQgYnVpbGQgdGltZSAocm9sbGRvd24vYnVpbGQtdHMgaW5saW5lIGl0IGFzXG4gIC8vICdwcm9kdWN0aW9uJyksIHdoaWNoIGNvbnN0YW50LWZvbGRzIHRoZSBmYWxsYmFjayBiZWxvdyBhbmQgbWFkZSB0aGUgcHVibGlzaGVkIHdiIHNlbGVjdFxuICAvLyB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdoZW5ldmVyIFdCX0VOViB3YXMgdW5zZXQuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBydW50aW1lRW52LldCX0VOViB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBjb25zdCBzaG91bGRTdXBwcmVzc091dHB1dCA9IHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndik7XG4gIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cnVudGltZUVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtydW50aW1lRW52Lk5PREVfRU5WfWApO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgZm9yY2VzIGEgbW9kZSAoLS1jYXNjYWRlLWVudiAvIC0tY2FzY2FkZS1ub2RlLWVudiAvIGFuIGV4cG9ydGVkXG4gIC8vIFdCX0VOViksIHZhbHVlcyB0aGF0IHRoZSBtb2RlJ3Mgb3duIGZub3ggcHJvZmlsZSBkZWZpbmVzIG11c3Qgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZFxuICAvLyBmcm9tIHRoZSBwYXJlbnQgc2hlbGw6IGEgc3RhbGUgYGV4cG9ydCBEQVRBQkFTRV9VUkw9Li4uYCBmcm9tIGEgZGV2ZWxvcG1lbnQgc2hlbGwgbXVzdCBub3RcbiAgLy8gbGVhayBpbnRvIGB3YiB0ZXN0YCdzIHRlc3QgbW9kZSAoY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuIE9uIENJXG4gIC8vIHRoZSBpbmhlcml0ZWQgdmFyaWFibGVzIGtlZXAgd2lubmluZyDigJQgd29ya2Zsb3dzIGRlbGliZXJhdGVseSBpbmplY3QgZW52IHZhcnMgdGhhdCBvdmVycmlkZVxuICAvLyB0aGUgY29tbWl0dGVkIHZhbHVlcyDigJQgYW5kIHRoYXQgc2hhZG93aW5nIGlzIHRoZSBkZXNpZ25lZCBiZWhhdmlvci5cbiAgY29uc3QgbW9kZUlzRm9yY2VkID0gQm9vbGVhbihcbiAgICBhcmd2LmNhc2NhZGVFbnYgPz9cbiAgICAoYXJndi5jYXNjYWRlTm9kZUVudiA/IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JyA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnYgPyBydW50aW1lRW52LldCX0VOViA6IHVuZGVmaW5lZClcbiAgKTtcbiAgY29uc3QgbW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ID0gbW9kZUlzRm9yY2VkICYmICFpc0NJRW52aXJvbm1lbnQocnVudGltZUVudi5DSSk7XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IHByb2plY3RIYXNGbm94Q29uZmlnID0gaGFzUHJvamVjdEZub3hDb25maWcoY3dkKTtcbiAgY29uc3QgW2Zub3hFbnZWYXJzLCBmbm94RW52VmFyTmFtZXNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudixcbiAgICBoYXNGbm94Q29uZmlnOiBwcm9qZWN0SGFzRm5veENvbmZpZyxcbiAgfSk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgZm5veEVudlZhcnMpO1xuICAvLyBSZXBvcnQgdGhlIGZub3ggc291cmNlIHdoZW5ldmVyIGZub3gudG9tbCBleGlzdHMg4oCUIGV2ZW4gd2hlbiBpdCB5aWVsZHMgbm8ga2V5cyAoYWxsIHNoYWRvd2VkLFxuICAvLyBlbXB0eSBwcm9maWxlLCBvciBhIGZhaWxpbmcgZXhwb3J0KTogY29uc3VtZXJzIHN1Y2ggYXMgd2IncyByZXF1aXJlZC1lbnZpcm9ubWVudCB2YWxpZGF0aW9uXG4gIC8vIG11c3Qgc2VlIHRoYXQgYSBkZWNsYXJlZCBlbnYgc291cmNlIGV4aXN0cyByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nIG9wZW4uXG4gIGlmIChmbm94RW52VmFyTmFtZXMubGVuZ3RoID4gMCB8fCBwcm9qZWN0SGFzRm5veENvbmZpZykge1xuICAgIGNvbnN0IGZub3hTb3VyY2VOYW1lID0gZm5veEVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlKTtcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZm5veFNvdXJjZU5hbWUsIGZub3hFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtmbm94RW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2Zub3hTb3VyY2VOYW1lfWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWlzZUVudlZhcnMsIG1pc2VFbnZWYXJOYW1lc10gPSByZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCwgY2FzY2FkZSwgZW52VmFycywgb3B0aW9ucyk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgbWlzZUVudlZhcnMpO1xuICBpZiAobWlzZUVudlZhck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBtaXNlU291cmNlTmFtZSA9IG1pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSk7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW21pc2VTb3VyY2VOYW1lLCBtaXNlRW52VmFyTmFtZXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7bWlzZUVudlZhck5hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHttaXNlU291cmNlTmFtZX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYFJlYWQgZW52IHNvdXJjZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwYW5kIHJlZmVyZW5jZXMgYWdhaW5zdCB0aGUgbGl2ZSBlbnZpcm9ubWVudCBmb3Iga2V5cyBOT1QgbG9hZGVkIGZyb20gZmlsZXMsIHNvIHRoYXQgYVxuICAvLyByZWZlcmVuY2UgdG8gYW4gZXhwb3J0ZWQga2V5IChleGNsdWRlZCBmcm9tIGVudlZhcnMgYnkgcHJvY2Vzcy1lbnYgcHJlY2VkZW5jZSkgcmVzb2x2ZXMgdG9cbiAgLy8gdGhlIGVmZmVjdGl2ZSB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy4gTG9hZGVkIGtleXMgYXJlIGRlbGliZXJhdGVseSBhYnNlbnQgZnJvbVxuICAvLyB0aGUgcmVmZXJlbmNlIHNldDogZG90ZW52LWV4cGFuZCB3b3VsZCBvdGhlcndpc2UgcmVwbGFjZSB0aGVpciBwYXJzZWQgdmFsdWVzIHdpdGggdGhlXG4gIC8vIHByb2Nlc3MgdmFsdWVzLCBicmVha2luZyBjYWxsZXJzIHRoYXQgbmVlZCB0aGUgZmlsZS1kZWZpbmVkIHZhbHVlcyB0aGVtc2VsdmVzLlxuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBkb3RlbnYtZXhwYW5kIHN1YnN0aXR1dGVzIGV4cG9ydGVkIHZhbHVlcyBsaXRlcmFsbHkgaW5zdGVhZCBvZlxuICAgIC8vIHJlY3Vyc2l2ZWx5IHJlLWV4cGFuZGluZyB0aGVtIChhbiBleHBvcnRlZCBgcGEkd29yZGAgbXVzdCBzdGF5IGBwYSR3b3JkYCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gZW52VmFycykpIHJlZmVyZW5jZUVudltrZXldID0gdmFsdWUucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gIH1cbiAgLy8gZG90ZW52LWV4cGFuZCByZXNvbHZlcyByZWZlcmVuY2VzIGluIGtleS1pbnNlcnRpb24gb3JkZXIsIHNvIGEgZm5veCB2YWx1ZSByZWZlcmVuY2luZyBhXG4gIC8vIG1pc2UtcHJvdmlkZWQga2V5IHdvdWxkIHNlZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIG1pc2UgZW50cmllcyBzdGF5ZWQgYXBwZW5kZWQgYWZ0ZXIgdGhlXG4gIC8vIGZub3ggZW50cmllcy4gUmVidWlsZCB0aGUgZXhwYW5zaW9uIGlucHV0IHdpdGggdGhlIGxvd2VyLXByaW9yaXR5IHNvdXJjZXMgZmlyc3Q7IHRoZSB2YWx1ZXNcbiAgLy8gdGhlbXNlbHZlcyBhbHJlYWR5IHJlZmxlY3QgdGhlIGludGVuZGVkIGZub3gtb3Zlci1taXNlIHByZWNlZGVuY2UuXG4gIGNvbnN0IG9yZGVyZWRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIFsuLi5taXNlRW52VmFyTmFtZXMsIC4uLmZub3hFbnZWYXJOYW1lc10pIG9yZGVyZWRFbnZWYXJzW2tleV0gPSBlbnZWYXJzW2tleV0hO1xuICBPYmplY3QuYXNzaWduKG9yZGVyZWRFbnZWYXJzLCBlbnZWYXJzKTtcbiAgLy8gZXhwYW5kKCkgbXV0YXRlcyBCT1RIIGl0cyBwYXJzZWQgaW5wdXQgQU5EIHByb2Nlc3NFbnYgKGRvdGVudi1leHBhbmQgd3JpdGVzIGV2ZXJ5IHBhcnNlZFxuICAvLyByZXN1bHQgaW50byBwcm9jZXNzRW52KSwgc28gc25hcHNob3QgYm90aCBmb3IgdGhlIHJlLWV4cGFuc2lvbiBiZWxvdyDigJQgdGhlIHJldHJ5IG11c3Qgbm90XG4gIC8vIHNlZSB0aGUgZmlyc3QgcGFzcydzIHN0YWxlIGRlcGVuZGVudCB2YWx1ZXMuXG4gIGNvbnN0IHByZUV4cGFuc2lvbkVudlZhcnMgPSB7IC4uLm9yZGVyZWRFbnZWYXJzIH07XG4gIGNvbnN0IHByaXN0aW5lUmVmZXJlbmNlRW52ID0geyAuLi5yZWZlcmVuY2VFbnYgfTtcbiAgbGV0IGV4cGFuZGVkRW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZDogb3JkZXJlZEVudlZhcnMsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gb3JkZXJlZEVudlZhcnM7XG4gIC8vIEEgdmFsdWUgcmVmZXJlbmNpbmcgJHtXQl9FTlZ9IG11c3QgZXhwYW5kIHRvIHdoYXQgdGhlIGNoaWxkIHdpbGwgYWN0dWFsbHkgc2VlOiB3aGVuIHRoZVxuICAvLyBFRkZFQ1RJVkUgV0JfRU5WIGVuZHMgdXAgZW1wdHkg4oCUIHdoZXRoZXIgaXQgd2FzIG5ldmVyIGRlZmluZWQsIGRlZmluZWQgZW1wdHksIG9yIGVtcHRpZWQgYnlcbiAgLy8gdGhlIGV4cGFuc2lvbiBpdHNlbGYgKGUuZy4gYFdCX0VOVj0ke01JU1NJTkdfTU9ERX1gKSDigJQgd2IncyBQcm9qZWN0LmVudiBsYXRlciBmaWxscyBpdCB3aXRoXG4gIC8vIHRoZSBmYWxsYmFjayBtb2RlLCBzbyByZS1leHBhbmQgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWVzIHdpdGggdGhhdCBmYWxsYmFjayBhdmFpbGFibGUuXG4gIC8vIE9wdC1pbiB2aWEgdGhlIG9wdGlvbjogYSBkaXJlY3QgcmVhZEVudmlyb25tZW50VmFyaWFibGVzL3JlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzXG4gIC8vIGNhbGxlciBuZXZlciByZWNlaXZlcyB0aGUgY29tcGxldGVkIFdCX0VOViwgYW5kIGV4cGFuZGluZyByZWZlcmVuY2VzIGFnYWluc3QgYSB2YWx1ZSB0aGF0IGlzXG4gIC8vIG5vdCBhY3R1YWxseSBhcHBsaWVkIHdvdWxkIG1ha2UgdGhlIHBhaXIgaW5jb25zaXN0ZW50LlxuICAvLyBUaGUgbG9hZGVkIGtleSBtYXNrcyB0aGUgYW1iaWVudCB2YWx1ZSwgc28gYSBsb2FkZWQtYnV0LWVtcHRpZWQgV0JfRU5WIG5lZWRzIHRoZSByZXRyeSBldmVuXG4gIC8vIHdoZW4gYW4gZXhwb3J0ZWQgV0JfRU5WIGV4aXN0cyAoYSBmb3JjZWQgbW9kZSBmaWxlIG92ZXJyaWRlcyB0aGUgZXhwb3J0IGxvY2FsbHkpOiByZXRyeSB3aXRoXG4gIC8vIHRoZSB2YWx1ZSB0aGUgbWVyZ2VkIGVudmlyb25tZW50IHdpbGwgdWx0aW1hdGVseSByZXRhaW4uXG4gIGNvbnN0IGVmZmVjdGl2ZVdiRW52ID0gZXhwYW5kZWRFbnZWYXJzLldCX0VOViA/PyBydW50aW1lRW52LldCX0VOVjtcbiAgaWYgKG9wdGlvbnM/LmV4cGFuZEZhbGxiYWNrV2JFbnYgJiYgIWVmZmVjdGl2ZVdiRW52KSB7XG4gICAgY29uc3QgcmVFeHBhbnNpb25JbnB1dCA9IHsgLi4ucHJlRXhwYW5zaW9uRW52VmFycyB9O1xuICAgIGRlbGV0ZSByZUV4cGFuc2lvbklucHV0LldCX0VOVjtcbiAgICBjb25zdCByZXRyeVJlZmVyZW5jZUVudiA9IHsgLi4ucHJpc3RpbmVSZWZlcmVuY2VFbnYsIFdCX0VOVjogcnVudGltZUVudi5XQl9FTlYgfHwgcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndikgfTtcbiAgICBleHBhbmRlZEVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQ6IHJlRXhwYW5zaW9uSW5wdXQsIHByb2Nlc3NFbnY6IHJldHJ5UmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyByZUV4cGFuc2lvbklucHV0O1xuICB9XG4gIHJldHVybiBbZXhwYW5kZWRFbnZWYXJzLCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXNdO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIHJlcG9zaXRvcnkncyBmbm94IGNvbmZpZ3VyYXRpb24gKGBmbm94LnRvbWxgKS5cbiAqIFRoZSBiYXNlIGBbc2VjcmV0c11gIHRhYmxlIGNhcnJpZXMgdGhlIGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGBbcHJvZmlsZXMuPGNhc2NhZGU+LnNlY3JldHNdYFxuICogb3ZlcmxheXMgaXQ7IGFuIHVua25vd24gcHJvZmlsZSBmYWxscyBiYWNrIHRvIHRoZSBiYXNlIHNlY3JldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzoge1xuICAgIGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuO1xuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0Vudj86IGJvb2xlYW47XG4gICAgLyoqIFByZWNvbXB1dGVkIGhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkgcmVzdWx0LCB0byBhdm9pZCByZS13YWxraW5nIHRoZSBhbmNlc3RvciBkaXJlY3Rvcmllcy4gKi9cbiAgICBoYXNGbm94Q29uZmlnPzogYm9vbGVhbjtcbiAgfVxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIHN0cmluZ1tdXSB7XG4gIGlmICghKG9wdGlvbnM/Lmhhc0Zub3hDb25maWcgPz8gaGFzUHJvamVjdEZub3hDb25maWcoY3dkKSkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBzZWNyZXRzID0gcnVuRm5veEV4cG9ydChjd2QsIGNhc2NhZGUsIHsgcXVpZXQ6IGZhbHNlIH0pO1xuICBpZiAoIXNlY3JldHMpIHJldHVybiBbe30sIFtdXTtcbiAgLy8gYFtwcm9maWxlcy48Y2FzY2FkZT4uc2VjcmV0c11gIGlzIHRoZSBmbm94IGFuYWxvZ3VlIG9mIGAuZW52LjxjYXNjYWRlPmA6IHdoZW4gdGhlIGNhbGxlclxuICAvLyBmb3JjZXMgYSBtb2RlIG9mZiBDSSwgcHJvZmlsZS1zcGVjaWZpYyB2YWx1ZXMgbXVzdCBvdmVycmlkZSBpbmhlcml0ZWQgc2hlbGwgdmFyaWFibGVzIGp1c3RcbiAgLy8gbGlrZSBgLmVudi48bW9kZT5gIHZhbHVlcyBkbywgd2hpbGUgYmFzZSBgW3NlY3JldHNdYCB2YWx1ZXMga2VlcCBsb3NpbmcgdG8gcHJvY2Vzcy5lbnYuIEEga2V5XG4gIC8vIGlzIHByb2ZpbGUtc3BlY2lmaWMgd2hlbiB0aGUgcHJvZmlsZSBleHBvcnQncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2UgZXhwb3J0J3M7IHdoZW4gdGhlXG4gIC8vIGJhc2UgZXhwb3J0IGZhaWxzLCBubyBvdmVycmlkZSBpcyBhcHBsaWVkIChjb25zZXJ2YXRpdmUpLiBUaGUgYmFzZSBleHBvcnQgcnVucyBMQVpJTFksIG9ubHlcbiAgLy8gd2hlbiBhIHByb2Nlc3MuZW52IGNvbGxpc2lvbiBhY3R1YWxseSBuZWVkcyBhZGp1ZGljYXRpbmcg4oCUIGl0IHdvdWxkIG90aGVyd2lzZSBhZGQgYVxuICAvLyBzdWJwcm9jZXNzIChpbmNsdWRpbmcgYWdlIGRlY3J5cHRpb24pIHRvIGV2ZXJ5IGZvcmNlZC1tb2RlIGludm9jYXRpb24gZm9yIG5vdGhpbmcuXG4gIGxldCBjYWNoZWRCYXNlU2VjcmV0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgfCBmYWxzZSA9IGZhbHNlO1xuICBjb25zdCBnZXRCYXNlU2VjcmV0cyA9ICgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKGNhY2hlZEJhc2VTZWNyZXRzID09PSBmYWxzZSkge1xuICAgICAgY2FjaGVkQmFzZVNlY3JldHMgPSBydW5Gbm94RXhwb3J0KGN3ZCwgdW5kZWZpbmVkLCB7IHF1aWV0OiB0cnVlLCBpZ25vcmVQcm9maWxlRW52VmFyOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkQmFzZVNlY3JldHM7XG4gIH07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZWNyZXRzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aW4gb3ZlciBmbm94IGJhc2UgdmFsdWVzLlxuICAgIC8vIChUaGUgbWlzZSByZWFkZXIgYmVsb3cgaW50ZW50aW9uYWxseSB1c2VzIGEgdmFsdWUtZXF1YWxpdHkgY2hlY2sgaW5zdGVhZDogYG1pc2UgZW52YCBlY2hvZXNcbiAgICAvLyBiYWNrIHZhcmlhYmxlcyB0aGUgYW1iaWVudCBtaXNlIGFjdGl2YXRpb24gYWxyZWFkeSBleHBvcnRlZCwgYW5kIGEgZGlmZmVyaW5nIHZhbHVlIG1lYW5zIHRoZVxuICAgIC8vIHJlcXVlc3RlZCBjYXNjYWRlIHByb2ZpbGUgc2hvdWxkIHdpbiBvdmVyIHRoZSBzdGFsZSBhY3RpdmF0aW9uLilcbiAgICBpZiAoIW9wdGlvbnM/Lmlnbm9yZVByb2Nlc3NFbnYgJiYga2V5IGluIHByb2Nlc3MuZW52KSB7XG4gICAgICBjb25zdCBiYXNlU2VjcmV0cyA9IG9wdGlvbnM/Lm1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiBjYXNjYWRlID8gZ2V0QmFzZVNlY3JldHMoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBiYXNlU2VjcmV0cyAhPT0gdW5kZWZpbmVkICYmIGJhc2VTZWNyZXRzW2tleV0gIT09IHZhbHVlO1xuICAgICAgaWYgKCFvdmVycmlkZXNQcm9jZXNzRW52KSBjb250aW51ZTtcbiAgICB9XG4gICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcnVuRm5veEV4cG9ydChcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogeyBxdWlldDogYm9vbGVhbjsgaWdub3JlUHJvZmlsZUVudlZhcj86IGJvb2xlYW4gfVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAvLyBgLS1pZi1taXNzaW5nIGVycm9yYCAoZGVmYXVsdCk6IGZub3ggb3RoZXJ3aXNlIGV4aXRzIDAgYW5kIHNpbGVudGx5IG9taXRzIHNlY3JldHMgaXQgZmFpbHMgdG9cbiAgLy8gcmVzb2x2ZSAoZS5nLiBhIG1pc3NpbmcgYWdlIGtleSksIHdoaWNoIHdvdWxkIGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdW5kZWNsYXJlZCBzZWNyZXRzLlxuICAvLyBPcHQtaW4gZXNjYXBlIGhhdGNoIGBXQl9BTExPV19NSVNTSU5HX1NFQ1JFVFM9MWA6IHN3aXRjaCB0byBgd2FybmAgc28gYSBrZXlsZXNzIGNvbnRleHQg4oCUIGUuZy4gYVxuICAvLyBEb2NrZXIvUmFpbHdheSBpbWFnZSBidWlsZCB0aGF0IG9ubHkgaW5saW5lcyBub24tc2VjcmV0IHB1YmxpYyB2YWx1ZXMgKGBBUFBfVElUTEVgLFxuICAvLyBgTkVYVF9QVUJMSUNfKmApIHdoaWxlIHRoZSBhZ2Uga2V5IGlzIGRlbGliZXJhdGVseSBhYnNlbnQg4oCUIHN0aWxsIGxvYWRzIHRoZSByZXNvbHZhYmxlIHZhbHVlc1xuICAvLyAocGxhaW50ZXh0IGRlZmF1bHRzIHBsdXMgYW55IHNlY3JldCB0aGF0IERJRCBkZWNyeXB0KSBpbnN0ZWFkIG9mIGZhaWxpbmcgb3V0cmlnaHQuIGB3YXJuYCwgbm90XG4gIC8vIGBpZ25vcmVgLCBrZWVwcyBmbm94IHJlcG9ydGluZyB0aGUgc2tpcHBlZCBzZWNyZXQgbmFtZXMgb24gc3RkZXJyIChzdXJmYWNlZCBiZWxvdyksIHNvIHJlbGF4aW5nXG4gIC8vIHRoZSBjaGVjayBzdGF5cyBhdWRpdGFibGUgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgZGVjbGFyZWQgc2VjcmV0cy5cbiAgLy8gYC0tbm9uLWludGVyYWN0aXZlYDogcHJvbXB0cyBvciBicm93c2VyIGF1dGggZmxvd3Mgd291bGQgaGFuZyBmb3JldmVyIGJlY2F1c2Ugc3RkaW4gaXMgaWdub3JlZC5cbiAgY29uc3QgYWxsb3dNaXNzaW5nU2VjcmV0cyA9XG4gICAgcHJvY2Vzcy5lbnYuV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTID09PSAnMScgfHwgcHJvY2Vzcy5lbnYuV0JfQUxMT1dfTUlTU0lOR19TRUNSRVRTID09PSAndHJ1ZSc7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2V4cG9ydCcsXG4gICAgJy0tZm9ybWF0JyxcbiAgICAnanNvbicsXG4gICAgJy0tbm8tY29sb3InLFxuICAgICctLWlmLW1pc3NpbmcnLFxuICAgIGFsbG93TWlzc2luZ1NlY3JldHMgPyAnd2FybicgOiAnZXJyb3InLFxuICAgICctLW5vbi1pbnRlcmFjdGl2ZScsXG4gIF07XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tcHJvZmlsZScsIGNhc2NhZGUpO1xuICB9XG4gIGlmIChvcHRpb25zLmlnbm9yZVByb2ZpbGVFbnZWYXIpIHtcbiAgICAvLyBXaXRob3V0IGAtLXByb2ZpbGVgLCBmbm94IGZhbGxzIGJhY2sgdG8gRk5PWF9QUk9GSUxFOyB0aGUgYmFzZS1hZGp1ZGljYXRpb24gZXhwb3J0IG11c3RcbiAgICAvLyByZWFkIHRoZSBCQVNFIHNlY3JldHMsIHNvIHRoZSBpbmhlcml0ZWQgcHJvZmlsZSBzZWxlY3Rpb24gaXMgY2xlYXJlZCBmb3IgaXQg4oCUIGFuZCBvbmx5IGZvclxuICAgIC8vIGl0LiBBIFBSSU1BUlkgZXhwb3J0IHN0aWxsIGhvbm9ycyBGTk9YX1BST0ZJTEU6IGl0IGVpdGhlciBzdGF5cyBwcm9maWxlLWxlc3MgKGZub3ggcmVhZHMgdGhlXG4gICAgLy8gdmFyaWFibGUpIG9yIGZvbGRzIGl0IGludG8gdGhlIGAtLXByb2ZpbGVgIGl0IHBhc3NlcyAoc2VlIHdiIGRvdGVudidzIGNhc2NhZGUpLlxuICAgIGRlbGV0ZSBlbnYuRk5PWF9QUk9GSUxFO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ2Zub3gnLCBhcmdzLCB7XG4gICAgY3dkLFxuICAgIGVudixcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSB7XG4gICAgLy8gVGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMgZm5veC1tYW5hZ2VkIHNlY3JldHMgKGZub3gudG9tbCBleGlzdHMpLCBzbyBhIGZhaWxpbmcgZXhwb3J0IG11c3QgYmVcbiAgICAvLyBzdXJmYWNlZDogc3dhbGxvd2luZyBpdCB3b3VsZCBtYWtlIGRlY2xhcmVkIHNlY3JldHMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIG9uZXMuXG4gICAgaWYgKCFvcHRpb25zLnF1aWV0KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVhZCBmbm94IHNlY3JldHM6ICR7cmVzdWx0LmVycm9yPy5tZXNzYWdlIHx8IHJlc3VsdC5zdGRlcnI/LnRyaW0oKSB8fCBgZm5veCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtyZXN1bHQuc3RhdHVzfWB9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFsbG93TWlzc2luZ1NlY3JldHMgJiYgIW9wdGlvbnMucXVpZXQgJiYgcmVzdWx0LnN0ZGVycj8udHJpbSgpKSB7XG4gICAgLy8gV2l0aCBgLS1pZi1taXNzaW5nIHdhcm5gLCBmbm94IGV4aXRzIDAgYnV0IHJlcG9ydHMgdGhlIHNlY3JldHMgaXQgY291bGQgbm90IHJlc29sdmUgb24gc3RkZXJyLlxuICAgIC8vIFN1cmZhY2UgdGhlbSBzbyByZWxheGluZyB0aGUgY2hlY2sgdmlhIFdCX0FMTE9XX01JU1NJTkdfU0VDUkVUUyBkb2VzIG5vdCBoaWRlIGEgcmVhbCBnYXAuXG4gICAgY29uc29sZS53YXJuKGBXQl9BTExPV19NSVNTSU5HX1NFQ1JFVFM6IGNvbnRpbnVpbmcgd2l0aG91dCB1bnJlc29sdmVkIGZub3ggc2VjcmV0cy5cXG4ke3Jlc3VsdC5zdGRlcnIudHJpbSgpfWApO1xuICB9XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc2VjcmV0cyA9IChwYXJzZWQgYXMgeyBzZWNyZXRzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uc2VjcmV0cztcbiAgaWYgKCFzZWNyZXRzIHx8IHR5cGVvZiBzZWNyZXRzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNlY3JldHMpKSByZXR1cm47XG4gIHJldHVybiBzZWNyZXRzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvamVjdEZub3hDb25maWcoY3dkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGhhc0FuY2VzdG9yQ29udGFpbmluZyhjd2QsIFsnZm5veC50b21sJ10pO1xufVxuXG5mdW5jdGlvbiBmbm94RW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBjYXNjYWRlID8gYGZub3ggZXhwb3J0IC0tcHJvZmlsZSAke2Nhc2NhZGV9YCA6ICdmbm94IGV4cG9ydCc7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGN3ZDogc3RyaW5nLFxuICBjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvcHRpb25zPzogeyBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbiB9XG4pOiBbUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgc3RyaW5nW11dIHtcbiAgaWYgKCFoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2QpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgYXJncyA9IFsnZW52JywgJy0tanNvbicsICctLWNkJywgY3dkXTtcbiAgaWYgKGNhc2NhZGUpIHtcbiAgICBhcmdzLnB1c2goJy0tZW52JywgY2FzY2FkZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnbWlzZScsIGFyZ3MsIHtcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW3t9LCBbXV07XG4gIH1cbiAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwYXJzZWQpKSByZXR1cm4gW3t9LCBbXV07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICBpZiAob3B0aW9ucz8uaWdub3JlUHJvY2Vzc0Vudikge1xuICAgICAgLy8gYG1pc2UgZW52YCBhbHdheXMgZW1pdHMgUEFUSCBkdWUgdG8gdG9vbCBzaGltczsgY29uc3VtZXJzIG9mIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXNcbiAgICAgIC8vIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKSBtdXN0IG5vdCBwcm9wYWdhdGUgaXQuXG4gICAgICBpZiAoa2V5ID09PSAnUEFUSCcpIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnZba2V5XSA9PT0gdmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBoYXNQcm9qZWN0TWlzZUNvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZCwgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddKTtcbn1cblxuZnVuY3Rpb24gaGFzQW5jZXN0b3JDb250YWluaW5nKGN3ZDogc3RyaW5nLCBmaWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgaWYgKGZpbGVOYW1lcy5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsIGZpbGVOYW1lKSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKHBhcmVudFBhdGggPT09IGN1cnJlbnRQYXRoKSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gY2FzY2FkZSA/IGBtaXNlIGVudiAtLWVudiAke2Nhc2NhZGV9YCA6ICdtaXNlIGVudic7XG59XG5cbmZ1bmN0aW9uIGlzQ0lFbnZpcm9ubWVudChjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qgb3V0cHV0T3B0aW9ucyA9IGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgcXVpZXRFbnY/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBvdXRwdXRPcHRpb25zLnF1aWV0RW52ID09PSB0cnVlIHx8IChvdXRwdXRPcHRpb25zLnF1aWV0RW52ICE9PSBmYWxzZSAmJiBvdXRwdXRPcHRpb25zLnNpbGVudCA9PT0gdHJ1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBmbm94L21pc2UgYW5kIGFzc2lnbnMgdGhlbSBpbiBgcHJvY2Vzcy5lbnZgLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICAvLyBFeGlzdGluZyBwcm9jZXNzLmVudiBrZXlzIGFyZSBrZXB0OiBlbnZWYXJzIG1heSBkZWxpYmVyYXRlbHkgY29udGFpbiBkaWZmZXJpbmcgdmFsdWVzIHRoYXRcbiAgICAvLyBtdXN0IHdpbiBvbmx5IGluIHRoZSByZXR1cm5lZCByZWNvcmQgKG1pc2UgY2FzY2FkZS1wcm9maWxlIHZhbHVlcywgZm9yY2VkLW1vZGUgb3ZlcnJpZGVzXG4gICAgLy8gY29uc3VtZWQgdmlhIGBwcm9qZWN0LmVudmApLCBuZXZlciBjbG9iYmVyIHRoZSBjYWxsZXIncyBvd24gcHJvY2VzcyBlbnZpcm9ubWVudC5cbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsYXRlZCB0byBucG0gYW5kIHlhcm4gZnJvbSB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMoZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAvLyBSZW1vdmUgbnBtICYgeWFybiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwcm9jZXNzLmVudlxuICBpZiAoZW52VmFycy5QQVRIICYmIGVudlZhcnMuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudlZhcnMuUEFUSCA9IGVudlZhcnMuUEFUSC5yZXBsYWNlKGAke2VudlZhcnMuQkVSUllfQklOX0ZPTERFUn06YCwgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3J5IGluIG1hY09TXG4gICAgICAucmVwbGFjZUFsbCgvXFwvcHJpdmF0ZVxcL3ZhclxcL2ZvbGRlcnNcXC9bXjpdKzovZywgJycpXG4gICAgICAvLyBUZW1wb3JhcnkgZGlyZWN0b3JpZXMgaW4gTGludXhcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC92YXJcXC90bXBcXC9bXjpdKzovZywgJycpXG4gICAgICAucmVwbGFjZUFsbCgvXFwvdG1wXFwvW146XSs6L2csICcnKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgIGNvbnN0IHVwcGVyS2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnTlBNXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdZQVJOXycpIHx8XG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdCRVJSWV8nKSB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdQUk9KRUNUX0NXRCcgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnSU5JVF9DV0QnXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzRXJybm9FeGNlcHRpb24oZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAnY29kZScgaW4gZXJyb3I7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHBzT3V0cHV0OiBzdHJpbmcpOiBNYXA8bnVtYmVyLCBudW1iZXJbXT4ge1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcltdPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcHNPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IC9eXFxzKihcXGQrKVxccysoXFxkKylcXHMqJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUGlkID0gTnVtYmVyKG1hdGNoZWRbMV0pO1xuICAgIGNvbnN0IHBhcmVudFBpZCA9IE51bWJlcihtYXRjaGVkWzJdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudFBpZCk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkUGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50UGlkLCBbY2hpbGRQaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuQnlQYXJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyLCBjaGlsZHJlbkJ5UGFyZW50OiBNYXA8bnVtYmVyLCBudW1iZXJbXT4pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBxdWV1ZSA9IFsuLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocm9vdFBpZCkgPz8gW10pXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgY29uc3QgcGlkID0gcXVldWVbaW5kZXhdIGFzIG51bWJlcjtcbiAgICBpbmRleCArPSAxO1xuICAgIGRlc2NlbmRhbnRzLnB1c2gocGlkKTtcbiAgICBxdWV1ZS5wdXNoKC4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChwaWQpID8/IFtdKSk7XG4gIH1cbiAgcmV0dXJuIGRlc2NlbmRhbnRzO1xufVxuIiwiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgaXNFcnJub0V4Y2VwdGlvbiB9IGZyb20gJy4vZXJybm8uanMnO1xuaW1wb3J0IHsgYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwLCBjb2xsZWN0RGVzY2VuZGFudFBpZHMgYXMgY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcCB9IGZyb20gJy4vcHJvY2Vzc1RyZWUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZUtpbGwocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgPSAnU0lHVEVSTScpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgfHwgcGlkIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGlkOiAke3BpZH1gKTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAga2lsbFRyZWVPbldpbmRvd3MocGlkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXNjZW5kYW50cyA9IGNvbGxlY3REZXNjZW5kYW50UGlkcyhwaWQpO1xuICBjb25zdCB0YXJnZXRQaWRzID0gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQsIGRlc2NlbmRhbnRzKTtcbiAgZm9yIChjb25zdCB0YXJnZXRQaWQgb2YgdGFyZ2V0UGlkcykge1xuICAgIGtpbGxJZk5lZWRlZCh0YXJnZXRQaWQsIHNpZ25hbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbElmTmVlZGVkKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgc2lnbmFsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxUcmVlT25XaW5kb3dzKHBpZDogbnVtYmVyKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcnVuQ29tbWFuZCgndGFza2tpbGwnLCBbJy9QSUQnLCBTdHJpbmcocGlkKSwgJy9UJywgJy9GJ10sIHtcbiAgICAgIG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IHJ1bkNvbW1hbmQoXG4gICAgJ3BzJyxcbiAgICBbJy1BbycsICdwaWQ9LHBwaWQ9J10sXG4gICAgLy8gS2VlcCBjb21tYW5kIGJvdW5kZWQgc28gd2F0Y2gtbW9kZSBraWxsIGxvb3BzIGNhbm5vdCBoYW5nIHRoaXMgcGF0aC5cbiAgICB7IG1heEJ1ZmZlcjogMTAyNCAqIDEwMjQsIHRpbWVvdXQ6IDIwMDAgfVxuICApO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50ID0gYnVpbGRDaGlsZHJlbkJ5UGFyZW50TWFwKHN0ZG91dCk7XG4gIHJldHVybiBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwKHJvb3RQaWQsIGNoaWxkcmVuQnlQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZDogbnVtYmVyLCBkZXNjZW5kYW50czogcmVhZG9ubHkgbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSBkZXNjZW5kYW50cy50b1JldmVyc2VkKCk7XG4gIHRhcmdldFBpZHMucHVzaChwaWQpO1xuICByZXR1cm4gdGFyZ2V0UGlkcztcbn1cblxuZnVuY3Rpb24gcnVuQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IHsgdGltZW91dDogbnVtYmVyOyBtYXhCdWZmZXI6IG51bWJlciB9XG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoY29tbWFuZCwgWy4uLmFyZ3NdLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBvcHRpb25zPy5tYXhCdWZmZXIsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zPy50aW1lb3V0LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiAnJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHN0ZGVyciA9IGV4dHJhY3RTdGRlcnIoZXJyb3IpO1xuICAgIHRocm93IG5ldyBDb21tYW5kRXhlY3V0aW9uRXJyb3IoY29tbWFuZCwgYXJncywgc3RkZXJyLCB0b0V4aXRDb2RlKGVycm9yKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbW1hbmRFeGVjdXRpb25FcnJvcikge1xuICAgIHJldHVybiAvbm8gc3VjaCBwcm9jZXNzfG5vdCBmb3VuZHxub3QgcmVjb2duaXplZHx0aGVyZSBpcyBubyBydW5uaW5nIGluc3RhbmNlL2kudGVzdChlcnJvci5zdGRlcnIpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdG9FeGl0Q29kZShlcnJvcjogdW5rbm93bik6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5jb2RlO1xuICB9XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdzdGF0dXMnIGluIGVycm9yKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzOiB1bmtub3duIH0pLnN0YXR1cztcbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGRlcnIoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCBlcnJvciA9PT0gbnVsbCB8fCAhKCdzdGRlcnInIGluIGVycm9yKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHN0ZGVyciA9IChlcnJvciBhcyBSZWNvcmQ8J3N0ZGVycicsIHVua25vd24+KS5zdGRlcnI7XG4gIGlmICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdGRlcnI7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdGRlcnIpKSB7XG4gICAgcmV0dXJuIHN0ZGVyci50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuY2xhc3MgQ29tbWFuZEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sIHN0ZGVycjogc3RyaW5nLCBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcihgQ29tbWFuZCBmYWlsZWQ6ICR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29tbWFuZEV4ZWN1dGlvbkVycm9yJztcbiAgICB0aGlzLnN0ZGVyciA9IHN0ZGVycjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFNwYXduT3B0aW9ucyxcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZSxcbiAgU3Bhd25TeW5jUmV0dXJucyxcbiAgU3RkaW9OdWxsLFxuICBTdGRpb1BpcGUsXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnLi90cmVlS2lsbC5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGJhc2VkIG9uIFNwYXduU3luY1JldHVybnMgYnV0IHdpdGhvdXQgb3V0cHV0IGFuZCBlcnJvciBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNSZXR1cm5zID0gT21pdDxTcGF3blN5bmNSZXR1cm5zPHN0cmluZz4sICdvdXRwdXQnIHwgJ2Vycm9yJz47XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgZXh0ZW5kaW5nIHZhcmlvdXMgTm9kZS5qcyBzcGF3biBvcHRpb25zIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCB0eXBlIFNwYXduQXN5bmNPcHRpb25zID0gKFxuICB8IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpb1xuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNcbikgJiB7XG4gIC8qKiBJbnB1dCBzdHJpbmcgdG8gd3JpdGUgdG8gdGhlIHNwYXduZWQgcHJvY2VzcydzIHN0ZGluICovXG4gIGlucHV0Pzogc3RyaW5nO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIG91dHB1dCB3aWxsIGJlIG1lcmdlZCBpbnRvIHN0ZG91dCAqL1xuICBtZXJnZU91dEFuZEVycm9yPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHRoZSBzcGF3bmVkIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZXhpdHMgKi9cbiAga2lsbE9uRXhpdD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBlbmFibGVzIHZlcmJvc2UgbG9nZ2luZyBvZiBwcm9jZXNzIG9wZXJhdGlvbnMgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRvdXQgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3Rkb3V0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRlcnI/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgYmxhbmstb25seSBsaW5lcyBhcmUgc2tpcHBlZCB3aGlsZSBwcmludGluZyBzdGRvdXQvc3RkZXJyIGluIHJlYWx0aW1lICovXG4gIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIFNwYXducyBhIGNoaWxkIHByb2Nlc3MgYXN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFByb21pc2UtYmFzZWQgd3JhcHBlciBhcm91bmQgTm9kZS5qcydzIHNwYXduIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbCBmZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGVuY29kaW5nIG9mIHN0ZG91dC9zdGRlcnIgYXMgVVRGLThcbiAqIC0gT3B0aW9uIHRvIG1lcmdlIHN0ZGVyciBpbnRvIHN0ZG91dFxuICogLSBPcHRpb24gdG8gYXV0b21hdGljYWxseSBraWxsIHRoZSBwcm9jZXNzIG9uIHBhcmVudCBleGl0XG4gKiAtIE9wdGlvbiB0byBwcm92aWRlIGlucHV0IHZpYSBzdGRpblxuICogLSBWZXJib3NlIGxvZ2dpbmcgY2FwYWJpbGl0eVxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuXG4gKiBAcGFyYW0gYXJncyAtIExpc3Qgb2Ygc3RyaW5nIGFyZ3VtZW50c1xuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzcGF3bmVkIHByb2Nlc3NcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHMgaW5jbHVkaW5nIHBpZCwgc3Rkb3V0LCBzdGRlcnIsIHN0YXR1cywgYW5kIHNpZ25hbFxuICogQHRocm93cyBXaWxsIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgcHJvY2VzcyBmYWlscyB0byBzcGF3biBvciBlbmNvdW50ZXJzIGFuIGVycm9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduQXN5bmMoJ2xzJywgWyctbGEnXSwgeyB2ZXJib3NlOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNwYXduQXN5bmMoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJncz86IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogU3Bhd25Bc3luY09wdGlvbnNcbik6IFByb21pc2U8U3Bhd25Bc3luY1JldHVybnM+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MgPz8gW10sIG9wdGlvbnMgPz8ge30pO1xuICAgICAgLy8gYHNldEVuY29kaW5nYCBpcyB1bmRlZmluZWQgaW4gQnVuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRvdXQ/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZGVycj8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuXG4gICAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICBjb25zdCBzdGRvdXRQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3Rkb3V0LCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgY29uc3Qgc3RkZXJyUHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZGVyciwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZG91dCkge1xuICAgICAgICAgIHN0ZG91dFByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ubWVyZ2VPdXRBbmRFcnJvcikge1xuICAgICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ZGVyciArPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5wcmludGluZ1N0ZGVycikge1xuICAgICAgICAgIHN0ZGVyclByaW50ZXIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3RvcFByb2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzdG9wcGVkIHx8ICFwcm9jLnBpZCkgcmV0dXJuO1xuXG4gICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmVlS2lsbChwcm9jLnBpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvYy5waWR9KWAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBjbGVhbnVwU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9XG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBbJ1NJR0lOVCcsICdTSUdURVJNJ10gOiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXTtcbiAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICAgIGNvbnN0IHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBbc2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoc2lnbmFsLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWxIYW5kbGVycy5jbGVhcigpO1xuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zPy5raWxsT25FeGl0KSB7XG4gICAgICAgIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGNsZWFudXBTaWduYWxzKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgc3RvcFByb2Nlc3MoKTtcbiAgICAgICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MubGlzdGVuZXJDb3VudChzaWduYWwpID09PSAwKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIGhhbmRsZVNpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvYy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHByb2MucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBwcm9jLm9uKCdjbG9zZScsIChjb2RlOiBudW1iZXIgfCBudWxsLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgc3Rkb3V0UHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBzdGRlcnJQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIGlmIChwcm9jLnBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJvY2VzcyBoYXMgbm8gcGlkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHBpZDogcHJvYy5waWQsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucz8uaW5wdXQpIHtcbiAgICAgICAgcHJvYy5zdGRpbj8ud3JpdGUob3B0aW9ucy5pbnB1dCk7XG4gICAgICAgIHByb2Muc3RkaW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnNcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcblxuZnVuY3Rpb24gY3JlYXRlUmVhbHRpbWVQcmludGVyKFxuICBzdHJlYW06IE5vZGVKUy5Xcml0ZVN0cmVhbSxcbiAgb21pdEJsYW5rTGluZXMgPSBmYWxzZVxuKTogeyB3cml0ZTogKGRhdGE6IHN0cmluZykgPT4gdm9pZDsgZmx1c2g6ICgpID0+IHZvaWQgfSB7XG4gIGlmICghb21pdEJsYW5rTGluZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JpdGU6IChkYXRhKSA9PiBzdHJlYW0ud3JpdGUoZGF0YSksXG4gICAgICBmbHVzaDogKCkgPT4ge30sXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwZW5kaW5nID0gJyc7XG4gIHJldHVybiB7XG4gICAgd3JpdGU6IChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nICs9IGRhdGE7XG4gICAgICBjb25zdCBsaW5lcyA9IHBlbmRpbmcuc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgIHBlbmRpbmcgPSBsaW5lcy5wb3AoKSA/PyAnJztcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoIWlzQmxhbmtMaW5lKGxpbmUpKSB7XG4gICAgICAgICAgc3RyZWFtLndyaXRlKGAke2xpbmV9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoIWlzQmxhbmtMaW5lKHBlbmRpbmcpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShwZW5kaW5nKTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmcgPSAnJztcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JsYW5rTGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpbmUucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG4iLCJjb25zdCBib29sZWFuT3B0aW9uTmFtZXMgPSBuZXcgU2V0KFtcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnLFxuICAnY2FzY2FkZS1ub2RlLWVudicsXG4gICdkcnktcnVuJyxcbiAgJ2RyeScsXG4gICdkJyxcbiAgJ2hlbHAnLFxuICAnaCcsXG4gICdxdWlldC1lbnYnLFxuICAndmVyYm9zZScsXG4gICd2JyxcbiAgJ3ZlcnNpb24nLFxuXSk7XG5jb25zdCB2YWx1ZU9wdGlvbk5hbWVzID0gbmV3IFNldChbJ2Nhc2NhZGUtZW52JywgJ3dvcmtpbmctZGlyJywgJ3cnXSk7XG5jb25zdCBib3VuZGFyeU1hcmtlckVudk5hbWUgPSAnV0JfSU5URVJOQUxfUlVOX0JPVU5EQVJZX01BUktFUic7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm90ZWN0UnVuU2NyaXB0QXJncyhhcmd2KSB7XG4gIGNvbnN0IHJ1bkluZGV4ID0gZmluZFRvcExldmVsUnVuSW5kZXgoYXJndik7XG4gIGlmIChydW5JbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRJbmRleCA9IGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBydW5JbmRleCArIDEpO1xuICBpZiAoc2NyaXB0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBhcmd2W3NjcmlwdEluZGV4IC0gMV0gPT09ICctLScpIHJldHVybjtcblxuICBjb25zdCBleGlzdGluZ01hcmtlciA9IHByb2Nlc3MuZW52W2JvdW5kYXJ5TWFya2VyRW52TmFtZV07XG4gIGlmIChhcmd2W3NjcmlwdEluZGV4ICsgMV0gPT09ICctLScpIHtcbiAgICBpZiAoZXhpc3RpbmdNYXJrZXIgJiYgYXJndltzY3JpcHRJbmRleCArIDJdID09PSBleGlzdGluZ01hcmtlcikgcmV0dXJuO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBtYXJrZXI7XG4gIGRvIG1hcmtlciA9IGBfX1dCX1JVTl9TQ1JJUFRfQVJHU18ke3JhbmRvbVVVSUQoKX1fX2A7XG4gIHdoaWxlIChhcmd2LmluY2x1ZGVzKG1hcmtlcikpO1xuICBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdID0gbWFya2VyO1xuICBhcmd2LnNwbGljZShzY3JpcHRJbmRleCArIDEsIDAsICctLScsIG1hcmtlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5TY3JpcHRBcmdzKGFyZ3YpIHtcbiAgY29uc3QgcnVuSW5kZXggPSBmaW5kVG9wTGV2ZWxSdW5JbmRleChhcmd2KTtcbiAgaWYgKHJ1bkluZGV4ID09PSAtMSkgcmV0dXJuIFtdO1xuICBjb25zdCBzY3JpcHRJbmRleCA9IGZpbmRSdW5TY3JpcHRJbmRleChhcmd2LCBydW5JbmRleCArIDEpO1xuICBpZiAoc2NyaXB0SW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGFyZ3MgPSBhcmd2LnNsaWNlKHNjcmlwdEluZGV4KTtcbiAgY29uc3QgbWFya2VyID0gcHJvY2Vzcy5lbnZbYm91bmRhcnlNYXJrZXJFbnZOYW1lXTtcbiAgaWYgKG1hcmtlciAmJiBhcmdzWzFdID09PSAnLS0nICYmIGFyZ3NbMl0gPT09IG1hcmtlcikgYXJncy5zcGxpY2UoMSwgMik7XG4gIGRlbGV0ZSBwcm9jZXNzLmVudltib3VuZGFyeU1hcmtlckVudk5hbWVdO1xuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gZmluZFRvcExldmVsUnVuSW5kZXgoYXJndikge1xuICBmb3IgKGxldCBpbmRleCA9IDI7IGluZGV4IDwgYXJndi5sZW5ndGg7ICkge1xuICAgIGNvbnN0IGNvbnN1bWVkID0gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpO1xuICAgIGlmIChjb25zdW1lZCA9PT0gMCkgcmV0dXJuIGFyZ3ZbaW5kZXhdID09PSAncnVuJyA/IGluZGV4IDogLTE7XG4gICAgaW5kZXggKz0gY29uc3VtZWQ7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBmaW5kUnVuU2NyaXB0SW5kZXgoYXJndiwgc3RhcnRJbmRleCkge1xuICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgYXJndi5sZW5ndGg7ICkge1xuICAgIGlmIChhcmd2W2luZGV4XSA9PT0gJy0tJykgcmV0dXJuIGFyZ3ZbaW5kZXggKyAxXSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaW5kZXggKyAxO1xuICAgIGNvbnN0IGNvbnN1bWVkID0gY291bnRPcHRpb25Ub2tlbnMoYXJndiwgaW5kZXgpO1xuICAgIGlmIChjb25zdW1lZCA9PT0gMCkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4ICs9IGNvbnN1bWVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvdW50T3B0aW9uVG9rZW5zKGFyZ3YsIGluZGV4KSB7XG4gIGNvbnN0IGFyZyA9IGFyZ3ZbaW5kZXhdO1xuICBpZiAoIWFyZz8uc3RhcnRzV2l0aCgnLScpIHx8IGFyZyA9PT0gJy0nKSByZXR1cm4gMDtcbiAgaWYgKGFyZy5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgY29uc3Qgb3B0aW9uVGV4dCA9IGFyZy5zbGljZSgyKTtcbiAgICBjb25zdCBlcXVhbHNJbmRleCA9IG9wdGlvblRleHQuaW5kZXhPZignPScpO1xuICAgIGNvbnN0IHJhd05hbWUgPSBlcXVhbHNJbmRleCA9PT0gLTEgPyBvcHRpb25UZXh0IDogb3B0aW9uVGV4dC5zbGljZSgwLCBlcXVhbHNJbmRleCk7XG4gICAgY29uc3QgbmFtZSA9IHJhd05hbWUuc3RhcnRzV2l0aCgnbm8tJykgPyByYXdOYW1lLnNsaWNlKDMpIDogcmF3TmFtZTtcbiAgICBpZiAoYm9vbGVhbk9wdGlvbk5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIGVxdWFsc0luZGV4ID09PSAtMSAmJiBpc0Jvb2xlYW5MaXRlcmFsKGFyZ3ZbaW5kZXggKyAxXSkgPyAyIDogMTtcbiAgICB9XG4gICAgaWYgKCF2YWx1ZU9wdGlvbk5hbWVzLmhhcyhuYW1lKSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGVxdWFsc0luZGV4ID09PSAtMSA/IDIgOiAxO1xuICB9XG5cbiAgY29uc3Qgc2hvcnRPcHRpb25zID0gYXJnLnNsaWNlKDEpO1xuICBpZiAoL15bZGh2XT0oZmFsc2V8dHJ1ZSkkLy50ZXN0KHNob3J0T3B0aW9ucykpIHJldHVybiAxO1xuICBpZiAoL15bZGh2XSQvLnRlc3Qoc2hvcnRPcHRpb25zKSAmJiBpc0Jvb2xlYW5MaXRlcmFsKGFyZ3ZbaW5kZXggKyAxXSkpIHJldHVybiAyO1xuICBmb3IgKGxldCBvcHRpb25JbmRleCA9IDA7IG9wdGlvbkluZGV4IDwgc2hvcnRPcHRpb25zLmxlbmd0aDsgb3B0aW9uSW5kZXgrKykge1xuICAgIGNvbnN0IG5hbWUgPSBzaG9ydE9wdGlvbnNbb3B0aW9uSW5kZXhdO1xuICAgIGlmIChib29sZWFuT3B0aW9uTmFtZXMuaGFzKG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAodmFsdWVPcHRpb25OYW1lcy5oYXMobmFtZSkpIHJldHVybiBvcHRpb25JbmRleCArIDEgPCBzaG9ydE9wdGlvbnMubGVuZ3RoID8gMSA6IDI7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbkxpdGVyYWwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZSc7XG59XG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuKiBBIFNIQTMtNTEyIGltcGxlbWVudGF0aW9uIHNwZWNpYWxpemVkIGFuZCBvcHRpbWl6ZWQgZnJvbVxuKiBbanMtc2hhM117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2VtbjE3OC9qcy1zaGEzfSAodmVyc2lvbiAwLjkuMykuXG4qXG4qIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4qIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4qIEBsaWNlbnNlIE1JVFxuKi9cbmNvbnN0IGU9QXJyYXkuZnJvbSh7bGVuZ3RoOjI1Nn0sKGUsdCk9PnQudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsYDBgKSksdD1uZXcgSW50MzJBcnJheShbMSwwLDMyODk4LDAsMzI5MDYsMjE0NzQ4MzY0OCwyMTQ3NTE2NDE2LDIxNDc0ODM2NDgsMzI5MDcsMCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyNzc3LDIxNDc0ODM2NDgsMTM4LDAsMTM2LDAsMjE0NzUxNjQyNSwwLDIxNDc0ODM2NTgsMCwyMTQ3NTE2NTU1LDAsMTM5LDIxNDc0ODM2NDgsMzI5MDUsMjE0NzQ4MzY0OCwzMjc3MSwyMTQ3NDgzNjQ4LDMyNzcwLDIxNDc0ODM2NDgsMTI4LDIxNDc0ODM2NDgsMzI3NzgsMCwyMTQ3NDgzNjU4LDIxNDc0ODM2NDgsMjE0NzUxNjU0NSwyMTQ3NDgzNjQ4LDMyODk2LDIxNDc0ODM2NDgsMjE0NzQ4MzY0OSwwLDIxNDc1MTY0MjQsMjE0NzQ4MzY0OF0pLG49bmV3IEludDMyQXJyYXkoNTApLHI9bmV3IEludDMyQXJyYXkoMTgpLGk9bmV3IFRleHRFbmNvZGVyO2xldCBhPW5ldyBVaW50OEFycmF5KDQwOTYpLG89bmV3IFVpbnQzMkFycmF5KGEuYnVmZmVyKTtjb25zdCBlZT1uZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoWzFdKS5idWZmZXIpWzBdPT09MTtmdW5jdGlvbiBzKHQpe2xldCBzPXQubGVuZ3RoKjMsbD1hLHU9bztpZihsLmxlbmd0aDxzKXtsZXQgZT1sLmxlbmd0aCoyO2Zvcig7ZTxzOyllKj0yO2w9bmV3IFVpbnQ4QXJyYXkoZSksdT1uZXcgVWludDMyQXJyYXkobC5idWZmZXIpLGU8PTEwNDg1NzYmJihhPWwsbz11KX1sZXQgZD1pLmVuY29kZUludG8odCxsKS53cml0dGVuLGY9bjtmLmZpbGwoMCk7bGV0IHA9MDtpZihlZSl7bGV0IGU9MDtmb3IoO2QtcD49NzI7KXtmb3IobGV0IHQ9MDt0PDE4O3QrKylmW3RdPWZbdF1edVtlK3RdO2MoZiksZSs9MTgscCs9NzJ9fWVsc2UgZm9yKDtkLXA+PTcyOyl7Zm9yKGxldCBlPTA7ZTwxODtlKyspe2xldCB0PXArKGU8PDIpO2ZbZV09ZltlXV4obFt0XXxsW3QrMV08PDh8bFt0KzJdPDwxNnxsW3QrM108PDI0KX1jKGYpLHArPTcyfWxldCBtPXI7bS5maWxsKDApO2ZvcihsZXQgZT1wO2U8ZDtlKyspe2xldCB0PWUtcDttW3Q+PjJdPW1bdD4+Ml18bFtlXTw8KCh0JjMpPDwzKX1sZXQgaD1kLXA7bVtoPj4yXT1tW2g+PjJdfDY8PCgoaCYzKTw8MyksbVsxN118PTIxNDc0ODM2NDg7Zm9yKGxldCBlPTA7ZTwxODtlKyspZltlXT1mW2VdXm1bZV07YyhmKTtsZXQgZz1gYDtmb3IobGV0IHQ9MDt0PDE2O3QrPTQpe2xldCBuPWZbdF0scj1mW3QrMV0saT1mW3QrMl0sYT1mW3QrM107Zys9ZVtuJjI1NV0rZVtuPj44JjI1NV0rZVtuPj4xNiYyNTVdK2Vbbj4+PjI0XStlW3ImMjU1XStlW3I+PjgmMjU1XStlW3I+PjE2JjI1NV0rZVtyPj4+MjRdK2VbaSYyNTVdK2VbaT4+OCYyNTVdK2VbaT4+MTYmMjU1XStlW2k+Pj4yNF0rZVthJjI1NV0rZVthPj44JjI1NV0rZVthPj4xNiYyNTVdK2VbYT4+PjI0XX1yZXR1cm4gZ31mdW5jdGlvbiBjKGUpe2xldCBuLHIsaSxhLG8sZWUscyxjLGwsdSxkLGYscCxtLGgsZyx0ZSxuZSxyZSxpZSxhZSxvZSxzZSxjZSxsZSx1ZSxkZSxmZSxwZSxtZSxoZSxnZSxfZSx2ZSx5ZSxiZSx4ZSxTZSxDZSx3ZSxUZSxFZSxEZSxPZSxrZSxBZSxqZSxNZSxOZSxQZSxGZSxJZSxMZSxSZSx6ZSxCZSxWZSxIZSxVZSxXZSxHZSxLZSxxZSxfPWVbMF0sdj1lWzFdLHk9ZVsyXSxKZT1lWzNdLGI9ZVs0XSx4PWVbNV0sUz1lWzZdLEM9ZVs3XSx3PWVbOF0sVD1lWzldLEU9ZVsxMF0sRD1lWzExXSxPPWVbMTJdLGs9ZVsxM10sQT1lWzE0XSxqPWVbMTVdLE09ZVsxNl0sTj1lWzE3XSxQPWVbMThdLEY9ZVsxOV0sST1lWzIwXSxMPWVbMjFdLFI9ZVsyMl0sej1lWzIzXSxCPWVbMjRdLFY9ZVsyNV0sSD1lWzI2XSxVPWVbMjddLFc9ZVsyOF0sRz1lWzI5XSxLPWVbMzBdLHE9ZVszMV0sSj1lWzMyXSxZPWVbMzNdLFg9ZVszNF0sWj1lWzM1XSxRPWVbMzZdLCQ9ZVszN10sWWU9ZVszOF0sWGU9ZVszOV0sWmU9ZVs0MF0sUWU9ZVs0MV0sJGU9ZVs0Ml0sZXQ9ZVs0M10sdHQ9ZVs0NF0sbnQ9ZVs0NV0scnQ9ZVs0Nl0saXQ9ZVs0N10sYXQ9ZVs0OF0sb3Q9ZVs0OV07Zm9yKGk9MDtpPDQ4O2krPTIpYT1fXkVeSV5LXlplLG89dl5EXkxecV5RZSxlZT15Xk9eUl5KXiRlLHM9SmVea156XlleZXQsYz1iXkFeQl5YXnR0LGw9eF5qXlZeWl5udCx1PVNeTV5IXlFecnQsZD1DXk5eVV4kXml0LGY9d15QXldeWWVeYXQscD1UXkZeR15YZV5vdCxuPWZeKGVlPDwxfHM+Pj4zMSkscj1wXihzPDwxfGVlPj4+MzEpLF9ePW4sdl49cixFXj1uLERePXIsSV49bixMXj1yLEtePW4scV49cixaZV49bixRZV49cixuPWFeKGM8PDF8bD4+PjMxKSxyPW9eKGw8PDF8Yz4+PjMxKSx5Xj1uLEplXj1yLE9ePW4sa149cixSXj1uLHpePXIsSl49bixZXj1yLCRlXj1uLGV0Xj1yLG49ZWVeKHU8PDF8ZD4+PjMxKSxyPXNeKGQ8PDF8dT4+PjMxKSxiXj1uLHhePXIsQV49bixqXj1yLEJePW4sVl49cixYXj1uLFpePXIsdHRePW4sbnRePXIsbj1jXihmPDwxfHA+Pj4zMSkscj1sXihwPDwxfGY+Pj4zMSksU149bixDXj1yLE1ePW4sTl49cixIXj1uLFVePXIsUV49biwkXj1yLHJ0Xj1uLGl0Xj1yLG49dV4oYTw8MXxvPj4+MzEpLHI9ZF4obzw8MXxhPj4+MzEpLHdePW4sVF49cixQXj1uLEZePXIsV149bixHXj1yLFllXj1uLFhlXj1yLGF0Xj1uLG90Xj1yLG09XyxoPXYsQWU9RDw8NHxFPj4+MjgsamU9RTw8NHxEPj4+MjgsZmU9STw8M3xMPj4+MjkscGU9TDw8M3xJPj4+MjksV2U9cTw8OXxLPj4+MjMsR2U9Szw8OXxxPj4+MjMsRWU9WmU8PDE4fFFlPj4+MTQsRGU9UWU8PDE4fFplPj4+MTQsdmU9eTw8MXxKZT4+PjMxLHllPUplPDwxfHk+Pj4zMSxnPWs8PDEyfE8+Pj4yMCx0ZT1PPDwxMnxrPj4+MjAsTWU9Ujw8MTB8ej4+PjIyLE5lPXo8PDEwfFI+Pj4yMixtZT1ZPDwxM3xKPj4+MTksaGU9Sjw8MTN8WT4+PjE5LEtlPSRlPDwyfGV0Pj4+MzAscWU9ZXQ8PDJ8JGU+Pj4zMCxSZT14PDwzMHxiPj4+Mix6ZT1iPDwzMHx4Pj4+MixiZT1BPDw2fGo+Pj4yNix4ZT1qPDw2fEE+Pj4yNixuZT1WPDwxMXxCPj4+MjEscmU9Qjw8MTF8Vj4+PjIxLFBlPVg8PDE1fFo+Pj4xNyxGZT1aPDwxNXxYPj4+MTcsZ2U9bnQ8PDI5fHR0Pj4+MyxfZT10dDw8Mjl8bnQ+Pj4zLGNlPVM8PDI4fEM+Pj40LGxlPUM8PDI4fFM+Pj40LEJlPU48PDIzfE0+Pj45LFZlPU08PDIzfE4+Pj45LFNlPUg8PDI1fFU+Pj43LENlPVU8PDI1fEg+Pj43LGllPVE8PDIxfCQ+Pj4xMSxhZT0kPDwyMXxRPj4+MTEsSWU9aXQ8PDI0fHJ0Pj4+OCxMZT1ydDw8MjR8aXQ+Pj44LE9lPXc8PDI3fFQ+Pj41LGtlPVQ8PDI3fHc+Pj41LHVlPVA8PDIwfEY+Pj4xMixkZT1GPDwyMHxQPj4+MTIsSGU9Rzw8N3xXPj4+MjUsVWU9Vzw8N3xHPj4+MjUsd2U9WWU8PDh8WGU+Pj4yNCxUZT1YZTw8OHxZZT4+PjI0LG9lPWF0PDwxNHxvdD4+PjE4LHNlPW90PDwxNHxhdD4+PjE4LF89bV5+ZyZuZSx2PWhefnRlJnJlLEU9Y2VefnVlJmZlLEQ9bGVefmRlJnBlLEk9dmVefmJlJlNlLEw9eWVefnhlJkNlLEs9T2VefkFlJk1lLHE9a2VefmplJk5lLFplPVJlXn5CZSZIZSxRZT16ZV5+VmUmVWUseT1nXn5uZSZpZSxKZT10ZV5+cmUmYWUsTz11ZV5+ZmUmbWUsaz1kZV5+cGUmaGUsUj1iZV5+U2Umd2Usej14ZV5+Q2UmVGUsSj1BZV5+TWUmUGUsWT1qZV5+TmUmRmUsJGU9QmVefkhlJldlLGV0PVZlXn5VZSZHZSxiPW5lXn5pZSZvZSx4PXJlXn5hZSZzZSxBPWZlXn5tZSZnZSxqPXBlXn5oZSZfZSxCPVNlXn53ZSZFZSxWPUNlXn5UZSZEZSxYPU1lXn5QZSZJZSxaPU5lXn5GZSZMZSx0dD1IZV5+V2UmS2UsbnQ9VWVefkdlJnFlLFM9aWVefm9lJm0sQz1hZV5+c2UmaCxNPW1lXn5nZSZjZSxOPWhlXn5fZSZsZSxIPXdlXn5FZSZ2ZSxVPVRlXn5EZSZ5ZSxRPVBlXn5JZSZPZSwkPUZlXn5MZSZrZSxydD1XZV5+S2UmUmUsaXQ9R2VefnFlJnplLHc9b2Vefm0mZyxUPXNlXn5oJnRlLFA9Z2VefmNlJnVlLEY9X2VefmxlJmRlLFc9RWVefnZlJmJlLEc9RGVefnllJnhlLFllPUllXn5PZSZBZSxYZT1MZV5+a2UmamUsYXQ9S2VeflJlJkJlLG90PXFlXn56ZSZWZSxfXj10W2ldLHZePXRbaSsxXTtlWzBdPV8sZVsxXT12LGVbMl09eSxlWzNdPUplLGVbNF09YixlWzVdPXgsZVs2XT1TLGVbN109QyxlWzhdPXcsZVs5XT1ULGVbMTBdPUUsZVsxMV09RCxlWzEyXT1PLGVbMTNdPWssZVsxNF09QSxlWzE1XT1qLGVbMTZdPU0sZVsxN109TixlWzE4XT1QLGVbMTldPUYsZVsyMF09SSxlWzIxXT1MLGVbMjJdPVIsZVsyM109eixlWzI0XT1CLGVbMjVdPVYsZVsyNl09SCxlWzI3XT1VLGVbMjhdPVcsZVsyOV09RyxlWzMwXT1LLGVbMzFdPXEsZVszMl09SixlWzMzXT1ZLGVbMzRdPVgsZVszNV09WixlWzM2XT1RLGVbMzddPSQsZVszOF09WWUsZVszOV09WGUsZVs0MF09WmUsZVs0MV09UWUsZVs0Ml09JGUsZVs0M109ZXQsZVs0NF09dHQsZVs0NV09bnQsZVs0Nl09cnQsZVs0N109aXQsZVs0OF09YXQsZVs0OV09b3R9ZXhwb3J0e3MgYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXAiLCJjb25zdCBlPXIoKSx0PW5ldyBUZXh0RW5jb2RlcixuPW5ldyBUZXh0RGVjb2RlcihgdXRmLThgKTtmdW5jdGlvbiByKCl7cmV0dXJuIG5ldyBNYXAoW3tpbnN0YW5jZTpFcnJvcixmcm9tOmU9PntsZXQgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIGUuc3RhY2shPT12b2lkIDAmJnQucHVzaChlLnN0YWNrKSxlLmNhdXNlIT09dm9pZCAwJiYoZS5zdGFjaz09PXZvaWQgMCYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5FcnJvcigpLGh5ZHJhdGU6KGUsW3QsbixyLGldKT0+e2UubmFtZT10LGUubWVzc2FnZT1uLHI9PT12b2lkIDA/ZGVsZXRlIGUuc3RhY2s6ZS5zdGFjaz1yLGkhPT12b2lkIDAmJihlLmNhdXNlPWkpfX0se2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShuLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+dC5lbmNvZGUoYXRvYihlKSl9LHtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2ZvcihsZXRbbixyXW9mIHQpZS5zZXQobixyKX19LHtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGxldCBuIG9mIHQpZS5hZGQobil9fSx7aW5zdGFuY2U6RGF0ZSxmcm9tOmU9PltlLnRvSlNPTigpXSxjcmVhdGU6KFtlXSk9Pm5ldyBEYXRlKGUpfSx7aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LHtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9XS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfWV4cG9ydHtlIGFzIEdMT0JBTF9DT05TVFJVQ1RPUl9NQVB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RydWN0b3JzLmpzLm1hcCIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIGV9ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtmdW5jdGlvbiB0KHQsbj1lKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocih0LG4pKX1mdW5jdGlvbiBuKGUpe2lmKGU9PT12b2lkIDApcmV0dXJuLTE7aWYodHlwZW9mIGU9PWBudW1iZXJgKXtpZihOdW1iZXIuaXNOYU4oZSkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZShlKSlyZXR1cm4gZTwwPy01Oi00fXJldHVybiBudWxsfWZ1bmN0aW9uIHIodCxyPWUpe2xldCBpPW4odCk7aWYoaSE9PW51bGwpcmV0dXJuIGk7bGV0IGE9W10sbz1uZXcgTWFwO3JldHVybiBzKHQpLGE7ZnVuY3Rpb24gcyhlKXtsZXQgdD1uKGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2xldCBpPW8uZ2V0KGUpO2lmKGkhPT12b2lkIDApcmV0dXJuIGk7c3dpdGNoKGk9YS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VgbnVtYmVyYDpjYXNlYHN0cmluZ2A6Y2FzZWBib29sZWFuYDphW2ldPWUsby5zZXQoZSxpKTticmVhaztjYXNlYGJpZ2ludGA6YVtpXT1bLTYsZS50b1N0cmluZygxNildLG8uc2V0KGUsaSk7YnJlYWs7Y2FzZWBvYmplY3RgOmlmKGU9PT1udWxsKWFbaV09ZSxvLnNldChlLGkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7bGV0IHQ9ZS5sZW5ndGgsbj1BcnJheSh0KTthW2ldPW4sby5zZXQoZSxpKTtmb3IobGV0IHI9MDtyPHQ7cisrKW5bcl09cyhlW3JdKX1lbHNle2xldCB0PWUuY29uc3RydWN0b3Isbj10eXBlb2YgdD09YGZ1bmN0aW9uYD9yLmdldCh0Lm5hbWUpOnZvaWQgMDtpZihuPT09dm9pZCAwKXtsZXQgdD1PYmplY3Qua2V5cyhlKSxuPXQubGVuZ3RoLHI9QXJyYXkobituKzEpO3JbMF09YGAsYVtpXT1yLG8uc2V0KGUsaSk7Zm9yKGxldCBpPTA7aTxuO2krKyl7bGV0IG49dFtpXSxhPWkraTtyW2ErMV09cyhuKSxyW2ErMl09cyhlW25dKX19ZWxzZXtsZXQgcj1uLmZyb20oZSksYz1yLmxlbmd0aCxsPUFycmF5KGMrMSk7bFswXT10Lm5hbWUsYVtpXT1sLG8uc2V0KGUsaSk7Zm9yKGxldCBlPTA7ZTxjO2UrKylsW2UrMV09cyhyW2VdKX19fXJldHVybiBpfX1leHBvcnR7dCBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcCIsImltcG9ydHtzaGEzXzUxMiBhcyBlfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgdH1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbihuLHIpe3JldHVybiBlKHQoW24scl0pKX1mdW5jdGlvbiByKGUsbil7cmV0dXJuIHQoW2Usbl0pfWZ1bmN0aW9uIGkoKXtyZXR1cm5gYH1leHBvcnR7aSBhcyBnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcsbiBhcyBnZXRDYWNoZUtleU9mSGFzaCxyIGFzIGdldENhY2hlS2V5T2ZTdHJpbmdpZmllZH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRDYWNoZUtleS5qcy5tYXAiLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGUsZ2V0Q2FjaGVLZXlPZkhhc2ggYXMgdH1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1pKHtnZXRDYWNoZUtleTp0fSkscj1pKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gaSh7Y2FjaGVEdXJhdGlvbjplPTEvMCxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxyKXtsZXQgaSxhLG87cmV0dXJuIHI/LmtpbmQ9PT1gZ2V0dGVyYD9mdW5jdGlvbigpe2xldCByPW4odGhpcyxbXSkscz1EYXRlLm5vdygpO3JldHVybihvIT09cnx8cy1hPmUpJiYobz1yLGk9dC5jYWxsKHRoaXMpLGE9cyksaX06ZnVuY3Rpb24oLi4ucyl7bGV0IGM9bih0aGlzLHMpLGw9RGF0ZS5ub3coKTtyZXR1cm4obyE9PWN8fGwtYT5lKSYmKG89YyxpPVJlZmxlY3QuYXBwbHkodCxyP3RoaXM6dm9pZCAwLHMpLGE9bCksaX19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsaSBhcyBtZW1vaXplT25lRmFjdG9yeSxyIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBQcmVwZW5kIGV2ZXJ5IGV4aXN0aW5nIGBub2RlX21vZHVsZXMvLmJpbmAgZGlyZWN0b3J5IGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeSB1cCB0byB0aGVcbiAqIHJlcG9zaXRvcnkgcm9vdCAob3IgZmlsZXN5c3RlbSByb290KSB0byB0aGUgZW52aXJvbm1lbnQncyBQQVRILCBuZWFyZXN0IGRpcmVjdG9yeSBmaXJzdCBzb1xuICogYSB3b3Jrc3BhY2UtbG9jYWwgZGVwZW5kZW5jeSB3aW5zIG92ZXIgYSByZXBvc2l0b3J5LXJvb3Qgb25lLiBOZWVkZWQgd2hlcmV2ZXIgd2Igc3RyaXBzXG4gKiB5YXJuJ3MgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgZnJvbSBQQVRIICh5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyBvbmx5XG4gKiB0aHJvdWdoIHRoYXQgZm9sZGVyLCBuZXZlciB0aHJvdWdoIGBub2RlX21vZHVsZXMvLmJpbmAgb24gUEFUSCksIHNvIHRoYXQgYmFyZSBiaW5hcnkgbmFtZXNcbiAqIGluIHdyYXBwZWQgY29tbWFuZHMga2VlcCByZXNvbHZpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgoZGlyUGF0aDogc3RyaW5nLCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBib29sZWFuIHtcbiAgY29uc3QgYmluUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICBiaW5QYXRocy5wdXNoKGJpblBhdGgpO1xuICAgIH1cblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gIH1cbiAgaWYgKGJpblBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBlbnYuUEFUSCA9IGVudi5QQVRIID8gYCR7YmluUGF0aHMuam9pbignOicpfToke2Vudi5QQVRIfWAgOiBiaW5QYXRocy5qb2luKCc6Jyk7XG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NJKGNpRW52OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVHJ1dGh5RW52VmFsdWUoY2lFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1RydXRoeUVudlZhbHVlKHByb2plY3QuZW52LldCX0RPQ0tFUik7XG59XG5cbmZ1bmN0aW9uIGlzVHJ1dGh5RW52VmFsdWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF2YWx1ZSAmJiB2YWx1ZSAhPT0gJzAnICYmIHZhbHVlICE9PSAnZmFsc2UnO1xufVxuIiwiLyoqXG4gKiBUaGUga2V5cyBhY3R1YWxseSBkZWNsYXJlZCBpbiB0aGUgcHJvamVjdCdzIGZub3ggc291cmNlcy4gYG1pc2UgZW52YCBpcyByZXBvcnRlZCBhcyBhXG4gKiBwc2V1ZG8tc291cmNlIHRoYXQgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyAoUEFUSCwgQ0FSR09fSE9NRSwgUlVTVFVQXyosIC4uLik7IHRob3NlIG11c3RcbiAqIG5ldmVyIGJlIHRyZWF0ZWQgYXMgdGhlIHByb2plY3QncyBvd24gdmFyaWFibGVzLCBzbyB0aGV5IGFyZSBleGNsdWRlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXM6IFJlYWRvbmx5QXJyYXk8cmVhZG9ubHkgW3N0cmluZywgcmVhZG9ubHkgc3RyaW5nW11dPik6IFNldDxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBTZXQoZW52U291cmNlcy5maWx0ZXIoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpLmZsYXRNYXAoKFssIGtleXNdKSA9PiBrZXlzKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlc0J1blJ1bnRpbWUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIE1pcnJvcnMgUHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXI6IHRoZSBvdXRlcm1vc3QgcGFja2FnZU1hbmFnZXIgZGVjbGFyYXRpb24gKHRoZVxuICAvLyB3b3Jrc3BhY2Ugcm9vdCdzKSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbmVzdGVkIG9uZXMsIGFuZCBhbiBleHBsaWNpdCBub24tQnVuIGRlY2xhcmF0aW9uXG4gIC8vIHdpbnMgb3ZlciB0aGUgZGlyZWN0b3J5IG1hcmtlcnMuIFRoZSB3YWxrIHRoZXJlZm9yZSBjb2xsZWN0cyBzaWduYWxzIHVwIHRvIHRoZSByZXBvc2l0b3J5XG4gIC8vIHJvb3QgaW5zdGVhZCBvZiBkZWNpZGluZyBhdCB0aGUgZmlyc3QgaGl0LCBzbyBhIGNoaWxkIHdvcmtzcGFjZSBjYW5ub3Qgb3ZlcnJpZGUgdGhlIHJvb3QuXG4gIGxldCBvdXRlcm1vc3RQYWNrYWdlTWFuYWdlcjogdW5rbm93bjtcbiAgbGV0IGhhc1NvbWVCdW5EaXJlY3RvcnlNYXJrZXIgPSBmYWxzZTtcbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByZWFkUGFja2FnZU1hbmFnZXJGaWVsZChwYXRoLmpvaW4oY3VycmVudFBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgaWYgKHBhY2thZ2VNYW5hZ2VyICE9PSB1bmRlZmluZWQpIG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyID0gcGFja2FnZU1hbmFnZXI7XG4gICAgaGFzU29tZUJ1bkRpcmVjdG9yeU1hcmtlciB8fD0gaGFzQnVuRGlyZWN0b3J5TWFya2VyKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcuZ2l0JykpIHx8IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkgPT09IGN1cnJlbnRQYXRoKSB7XG4gICAgICBpZiAoaXNFeHBsaWNpdE5vbkJ1blBhY2thZ2VNYW5hZ2VyKG91dGVybW9zdFBhY2thZ2VNYW5hZ2VyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGhhc1NvbWVCdW5EaXJlY3RvcnlNYXJrZXIgfHwgaXNCdW5QYWNrYWdlTWFuYWdlcihvdXRlcm1vc3RQYWNrYWdlTWFuYWdlcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZGlyZWN0b3J5IGNhcnJpZXMgYSBidW4gbWFya2VyOiBhIGJ1biBsb2NrZmlsZSwgYSBtaXNlLXBpbm5lZCBidW4sIG9yIGFcbiAqIGAudG9vbC12ZXJzaW9uc2AgYnVuIGVudHJ5LiB3YmZ5IG1pZ3JhdGVzIC50b29sLXZlcnNpb25zIGludG8gbWlzZS50b21sLCBzbyBhIG1pc2UtcGlubmVkIGJ1blxuICogbXVzdCBjb3VudCBhcyB3ZWxsOiByZXBvcyB0aGF0IGdpdGlnbm9yZSBidW4ubG9jayBhbmQgaGF2ZSBubyBwYWNrYWdlTWFuYWdlciBmaWVsZCByZWx5IG9uIHRoZVxuICogdG9vbCBtYW5pZmVzdC4gVGhpcyBpcyB0aGUgc2luZ2xlIHNpZ25hbCBsaXN0IGRlY2lkaW5nIGJ1bi12cy15YXJuOyBgUHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXJgXG4gKiBhbmQgYHVzZXNCdW5SdW50aW1lYCBzaGFyZSBpdCDigJQgYW5kIGJvdGggZ2l2ZSBhbiBleHBsaWNpdCBub24tQnVuIHBhY2thZ2VNYW5hZ2VyIGRlY2xhcmF0aW9uXG4gKiBwcmVjZWRlbmNlIG92ZXIgaXQgKHNlZSBpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIpIOKAlCBzbyB0aGUgdHdvIGRldGVjdGlvbnMgY2Fubm90IGRyaWZ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQnVuRGlyZWN0b3J5TWFya2VyKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIFsnYnVuLmxvY2snLCAnYnVuLmxvY2tiJ10uc29tZSgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSkpIHx8XG4gICAgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgdGVzdEZpbGVDb250ZW50KHBhdGguam9pbihkaXJQYXRoLCBmaWxlTmFtZSksIC9eXFxzKig/OlwiYnVuXCJ8YnVuKVxccyo9L20pXG4gICAgKSB8fFxuICAgIHRlc3RGaWxlQ29udGVudChwYXRoLmpvaW4oZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksIC8oXnxcXG4pYnVuXFxzLylcbiAgKTtcbn1cblxuLyoqXG4gKiBBbiBleHBsaWNpdCBub24tQnVuIHBhY2thZ2VNYW5hZ2VyIGRlY2xhcmF0aW9uIChlLmcuIGB5YXJuQDQuMTcuMGApIG92ZXJyaWRlcyB0aGUgZGlyZWN0b3J5XG4gKiBtYXJrZXJzOiB5YXJuLWVyYSByZXBvc2l0b3JpZXMgbWF5IHBpbiBidW4gaW4gbWlzZS50b21sIHNvbGVseSBmb3IgYGJ1bnhgLWJhc2VkIGhlbHBlcnNcbiAqIChlLmcuIGB3YiByYWlsd2F5LWVudmApLCBhbmQgQnVuLW1hbmFnZWQgcmVwb3NpdG9yaWVzIG5ldmVyIGRlY2xhcmUgYSBub24tQnVuIHBhY2thZ2VNYW5hZ2VyXG4gKiAod2JmeSBkZWxldGVzIHRoZSBmaWVsZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cGxpY2l0Tm9uQnVuUGFja2FnZU1hbmFnZXIocGFja2FnZU1hbmFnZXI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgISFwYWNrYWdlTWFuYWdlci50cmltKCkgJiYgIWlzQnVuUGFja2FnZU1hbmFnZXIocGFja2FnZU1hbmFnZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJyAmJiBwYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCdidW5AJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrYWdlTWFuYWdlckZpZWxkKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgcGFja2FnZU1hbmFnZXI/OiB1bmtub3duIH0pLnBhY2thZ2VNYW5hZ2VyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IEFMTE9XRURfVEVTVF9ESVJFQ1RPUllfTkFNRVMgPSBuZXcgU2V0KFsndW5pdCcsICdlMmUnLCAnZGVidWcnLCAnaGVscGVycycsICdmaXh0dXJlcyddKTtcbmNvbnN0IFJVTk5BQkxFX1RFU1RfRElSRUNUT1JZX05BTUVTID0gbmV3IFNldChbJ3VuaXQnLCAnZTJlJywgJ2RlYnVnJ10pO1xuY29uc3QgVEVTVF9GSUxFX05BTUVfUkVHRVhQID0gL1xcLig/OnRlc3R8c3BlYylcXC5bY21dP1tqdF1zeD8kLztcblxuLyoqXG4gKiBFbmZvcmNlcyB0aGUgdGVzdC1sYXlvdXQgY29udmVudGlvbiB3aXRoIG5vIGZhbGxiYWNrOiBgdGVzdC9gIG1heSBjb250YWluIG9ubHkgdGhlIGB1bml0YCwgYGUyZWAsXG4gKiBgZGVidWdgLCBgaGVscGVyc2AsIGFuZCBgZml4dHVyZXNgIGRpcmVjdG9yaWVzLCBhbmQgdGVzdCBmaWxlcyBtYXkgZXhpc3Qgb25seSB1bmRlciBgdGVzdC91bml0L2AsXG4gKiBgdGVzdC9lMmUvYCwgYW5kIGB0ZXN0L2RlYnVnL2Ag4oCUIGFueXdoZXJlIGVsc2UgaW4gdGhlIHByb2plY3QgKGUuZy4gYHRlc3QvaGVscGVycy9gLCBgc3JjL2AsIG9yIHRoZVxuICogcHJvamVjdCByb290KSwgd2Igd291bGQgc2lsZW50bHkgc2tpcCB0aGVtLiBBIHByb2plY3QncyBvd24gUGxheXdyaWdodCBjb25maWcgYWxzbyByZXF1aXJlc1xuICogYHRlc3QvZTJlYCBmb3IgdGhlIHNhbWUgcmVhc29uLiBgdGVzdC9maXh0dXJlcy9gIGlzIGV4ZW1wdCBmcm9tIHRoZSB0ZXN0LWZpbGUgY2hlY2sgYmVjYXVzZVxuICogZml4dHVyZXMgbWF5IGNvbnRhaW4gdGVzdCBmaWxlcyBhcyBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRlc3REaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnKTtcbiAgY29uc3QgdmlvbGF0aW9ucyA9IFsuLi5maW5kRmlsZVN5c3RlbVZpb2xhdGlvbnMocHJvamVjdC5kaXJQYXRoKV07XG4gIC8vIE9ubHkgYSBwcm9qZWN0J3MgT1dOIFBsYXl3cmlnaHQgY29uZmlnIGNvdW50czogYSB3b3Jrc3BhY2Ugcm9vdCBsZWdpdGltYXRlbHkgc2hhcmVzIGEgcm9vdC1sZXZlbFxuICAvLyBwbGF5d3JpZ2h0LmNvbmZpZy50cyB3aGlsZSBrZWVwaW5nIGUyZSBzcGVjcyBpbiBhIHNpbmdsZSBhcHAgcGFja2FnZS4gQ2hlY2tlZCBvdXRzaWRlIHRoZVxuICAvLyBtZW1vaXplZCB3YWxrIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgY2FsbGVyLXN1cHBsaWVkIHBhY2thZ2VKc29uLCBub3Qgb25seSB0aGUgZGlyZWN0b3J5LlxuICBpZiAoXG4gICAgIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3BsYXl3cmlnaHQuY29uZmlnLnRzJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRlc3REaXJQYXRoLCAnZTJlJykpXG4gICkge1xuICAgIHZpb2xhdGlvbnMucHVzaCgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gdmlvbGF0aW9ucztcbn1cblxuLy8gVGhlIHJlY3Vyc2l2ZSB3YWxrIGlzIHRoZSBleHBlbnNpdmUgcGFydCBhbmQgcnVucyBmb3IgdGhlIHNhbWUgZGlyZWN0b3JpZXMgZnJvbSBib3RoIGB3YiBsaW50YFxuLy8gYW5kIGB3YiB0ZXN0YCB3aXRoaW4gb25lIGB3YiB2ZXJpZnlgLCBzbyBpdHMgcmVzdWx0IGlzIHNoYXJlZCBwZXIgcHJvamVjdCBkaXJlY3RvcnkuXG5jb25zdCBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUZXN0U3RydWN0dXJlQ2FjaGUoKTogdm9pZCB7XG4gIGZpbGVTeXN0ZW1WaW9sYXRpb25zQ2FjaGUuY2xlYXIoKTtcbn1cblxuZnVuY3Rpb24gZmluZEZpbGVTeXN0ZW1WaW9sYXRpb25zKHByb2plY3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNhY2hlZFZpb2xhdGlvbnMgPSBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlLmdldChwcm9qZWN0RGlyUGF0aCk7XG4gIGlmIChjYWNoZWRWaW9sYXRpb25zKSByZXR1cm4gY2FjaGVkVmlvbGF0aW9ucztcblxuICBjb25zdCB2aW9sYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0ZXN0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgJ3Rlc3QnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmModGVzdERpclBhdGgpKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyh0ZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICAvLyBPUyBhbmQgZWRpdG9yIGFydGlmYWN0cyBzdWNoIGFzIC5EU19TdG9yZSBhcmUgZW52aXJvbm1lbnQgbm9pc2UsIG5vdCBsYXlvdXQgbWlzdGFrZXMuXG4gICAgICBpZiAoZW50cnkubmFtZS5zdGFydHNXaXRoKCcuJykpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpIHx8ICFBTExPV0VEX1RFU1RfRElSRUNUT1JZX05BTUVTLmhhcyhlbnRyeS5uYW1lKSkge1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goYHRlc3QvJHtlbnRyeS5uYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGgsICcnLCB2aW9sYXRpb25zKTtcbiAgLy8gQSB0ZXN0IGZpbGUgZGlyZWN0bHkgdW5kZXIgdGVzdC8gaXMgcmVwb3J0ZWQgYnkgYm90aCB0aGUgdG9wLWxldmVsIGNoZWNrIGFuZCB0aGUgc3RyYXktZmlsZSB3YWxrLlxuICBjb25zdCB1bmlxdWVWaW9sYXRpb25zID0gWy4uLm5ldyBTZXQodmlvbGF0aW9ucyldO1xuICBmaWxlU3lzdGVtVmlvbGF0aW9uc0NhY2hlLnNldChwcm9qZWN0RGlyUGF0aCwgdW5pcXVlVmlvbGF0aW9ucyk7XG4gIHJldHVybiB1bmlxdWVWaW9sYXRpb25zO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGg6IHN0cmluZywgcmVsYXRpdmVEaXJQYXRoOiBzdHJpbmcsIHZpb2xhdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZnMucmVhZGRpclN5bmMocGF0aC5qb2luKHByb2plY3REaXJQYXRoLCByZWxhdGl2ZURpclBhdGgpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAvLyBIaWRkZW4gZW50cmllcyAoLmdpdCwgLnRtcCwgLm5leHQsIC4uLikgYW5kIGRlcGVuZGVuY2llcyBhcmUgbm90IHByb2plY3QtYXV0aG9yZWQgdGVzdCBsb2NhdGlvbnM6XG4gICAgLy8gdGhlIGNvbnZlbnRpb24gcGxhY2VzIHRlc3RzIG9ubHkgdW5kZXIgdGVzdC8sIHNvIGEgdGVzdCBmaWxlIGluIGEgaGlkZGVuIGRpcmVjdG9yeSAoZS5nLlxuICAgIC8vIC5zdG9yeWJvb2spIGlzIG91dHNpZGUgdGhlIGlucHV0IGNvbnRyYWN0LCBhbmQgZW51bWVyYXRpbmcgZW52aXJvbm1lbnRhbCBoaWRkZW4gZGlyZWN0b3JpZXNcbiAgICAvLyBpbnN0ZWFkIHdvdWxkIGZhbHNlLXBvc2l0aXZlIG9uIGFueSB1bmxpc3RlZCBnZW5lcmF0ZWQgb25lICgudHVyYm8sIC53cmFuZ2xlciwgLi4uKS4gVmlzaWJsZVxuICAgIC8vIGJ1aWxkIG91dHB1dHMgc3VjaCBhcyBkaXN0LyBhcmUgZGVsaWJlcmF0ZWx5IE5PVCBza2lwcGVkOiB3YmZ5LW1hbmFnZWQgYnVpbGRzIG5ldmVyIGVtaXRcbiAgICAvLyB0ZXN0LXBhdHRlcm4gZmlsZXMgdGhlcmUsIHNvIGFueSBtYXRjaCBpcyBhbiBhdXRob3JlZCBmaWxlIHdvcnRoIGZsYWdnaW5nLlxuICAgIC8vIFN5bWxpbmtzIGZhaWwgYGlzRGlyZWN0b3J5KClgIG9uIGEgRGlyZW50LCBzbyBjeWNsZXMgYXJlIGltcG9zc2libGUuXG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnLicpIHx8IGVudHJ5Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnKSBjb250aW51ZTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZURpclBhdGggPyBgJHtyZWxhdGl2ZURpclBhdGh9LyR7ZW50cnkubmFtZX1gIDogZW50cnkubmFtZTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgLy8gdGVzdC91bml0LCB0ZXN0L2UyZSwgYW5kIHRlc3QvZGVidWcgaG9sZCB0aGUgcnVubmFibGUgdGVzdHM7IHRlc3QvZml4dHVyZXMgbWF5IGNvbnRhaW5cbiAgICAgIC8vIHRlc3QgZmlsZXMgYXMgZGF0YS5cbiAgICAgIGlmIChyZWxhdGl2ZURpclBhdGggPT09ICd0ZXN0JyAmJiAoUlVOTkFCTEVfVEVTVF9ESVJFQ1RPUllfTkFNRVMuaGFzKGVudHJ5Lm5hbWUpIHx8IGVudHJ5Lm5hbWUgPT09ICdmaXh0dXJlcycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQSBuZXN0ZWQgcGFja2FnZSAoZS5nLiBhIHdvcmtzcGFjZSBtZW1iZXIpIGlzIHZhbGlkYXRlZCBhcyBpdHMgb3duIHByb2plY3QuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsIHJlbGF0aXZlUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG4gICAgICBjb2xsZWN0U3RyYXlUZXN0RmlsZXMocHJvamVjdERpclBhdGgsIHJlbGF0aXZlUGF0aCwgdmlvbGF0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChURVNUX0ZJTEVfTkFNRV9SRUdFWFAudGVzdChlbnRyeS5uYW1lKSkge1xuICAgICAgdmlvbGF0aW9ucy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3ROYW1lOiBzdHJpbmcsIHZpb2xhdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgY2hhbGsucmVkKFxuICAgICAgYEludmFsaWQgdGVzdCBsYXlvdXQgaW4gJHtwcm9qZWN0TmFtZX0uIHRlc3QvIG1heSBjb250YWluIG9ubHkgdGhlIHVuaXQsIGUyZSwgZGVidWcsIGhlbHBlcnMsIGFuZCBmaXh0dXJlcyBkaXJlY3RvcmllcywgdGVzdCBmaWxlcyBtYXkgZXhpc3Qgb25seSB1bmRlciB0ZXN0L3VuaXQvLCB0ZXN0L2UyZS8sIGFuZCB0ZXN0L2RlYnVnLywgYW5kIGEgUGxheXdyaWdodCBjb25maWcgcmVxdWlyZXMgdGVzdC9lMmUvOlxcbmAgK1xuICAgICAgICB2aW9sYXRpb25zLm1hcCgodmlvbGF0aW9uKSA9PiBgICAke3Zpb2xhdGlvbn1gKS5qb2luKCdcXG4nKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIGV2ZXJ5IHByb2plY3QncyBsYXlvdXQgdmlvbGF0aW9ucyBhbmQgdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIGFueSBwcm9qZWN0IHZpb2xhdGVkIHRoZVxuICogY29udmVudGlvbiwgc28gYSBzaW5nbGUgcnVuIHN1cmZhY2VzIGFsbCBvZiB0aGVtIGluc3RlYWQgb2Ygb25seSB0aGUgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnbmFtZScgfCAncGFja2FnZUpzb24nPltdKTogYm9vbGVhbiB7XG4gIGxldCB2aW9sYXRlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QpO1xuICAgIGlmICh2aW9sYXRpb25zLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QubmFtZSwgdmlvbGF0aW9ucyk7XG4gICAgdmlvbGF0ZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiB2aW9sYXRlZDtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHNpbGVudD86IGJvb2xlYW4gfSkuc2lsZW50ID09PSB0cnVlICYmXG4gICAgZ2V0T3B0aW9uVmFsdWUoYXJndiwgJ3F1aWV0LWVudicpID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgYXJncy5wdXNoKCctLXF1aWV0LWVudicpO1xuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4vc2hlbGwuanMnO1xuXG5jb25zdCB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcyA9IFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ107XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGdlbmVyYXRpbmcgYSAuZGV2LnZhcnMgZmlsZSAodmlhIGB3YiBnZW4tZGV2LXZhcnNgKSBzbyB0aGF0XG4gKiBgd3JhbmdsZXIgZGV2YCBjYW4gc2VlIHRoZSB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndjogU2NyaXB0QXJndiwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICd3YicsICdnZW4tZGV2LXZhcnMnLCAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksIG91dHB1dFBhdGhdKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGB3cmFuZ2xlciBkZXZgLXN0eWxlIGNvbW1hbmQuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlZgIG1ha2VzIHdyYW5nbGVyIHNlcnZlIHRoZSB0b3AtbGV2ZWxcbiAqIChub24tZGVwbG95KSBjb25maWcuIHdyYW5nbGVyIChsaWtlIHZpbmV4dCkgcmVxdWlyZXMgcmVhbCBOb2RlLmpzIOKAlCBgYnVuIHJ1bmAgcmVzcGVjdHMgdGhlIGJpbidzXG4gKiBub2RlIHNoZWJhbmcsIGFuZCB3YiBuZXZlciBjb21wb3NlcyBgLS1idW5gICh3aG9zZSBub2RlLT5idW4gUEFUSCBzaGltIGJyZWFrcyBib3RoIHRvb2xzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKGFyZ3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZW52IC11IENMT1VERkxBUkVfRU5WIFlBUk4gd3JhbmdsZXIgJHthcmdzfWAudHJpbSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBhcHBseWluZyB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyB0byB0aGUgbG9jYWwgZGF0YWJhc2UsIG9yIHVuZGVmaW5lZFxuICogaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIG9yIG5vIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGRpcmVjdG9yeS5cbiAqIENJPXRydWUgc3VwcHJlc3NlcyB3cmFuZ2xlcidzIGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbiBwcm9tcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSB8fCAhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCkpIHJldHVybjtcblxuICByZXR1cm4gYENJPXRydWUgWUFSTiB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5ICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYDtcbn1cblxuLyoqXG4gKiBQcmVmaXggdGhlIGdpdmVuIHNjcmlwdCB3aXRoIGNvbW1hbmRzIGV4cG9ydGluZyBEQVRBQkFTRV9VUkwgcG9pbnRpbmcgdG8gdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZSxcbiAqIHNvIHRoYXQgZHJpenpsZS1raXQgYW5kIHNlZWQgc2NyaXB0cyBjYW4gb3BlcmF0ZSBvbiB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgYXBwLlxuICogRG8gbm90aGluZyBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2UgaW4gaXRzIHdyYW5nbGVyIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSkgcmV0dXJuIHNjcmlwdDtcblxuICAvLyBFeGNsdWRpbmcgbWluaWZsYXJlJ3MgbWV0YWRhdGEuc3FsaXRlLCB3aGljaCBsaXZlcyBuZXh0IHRvIHRoZSBoYXNoLW5hbWVkIGRhdGFiYXNlIGZpbGUuXG4gIC8vIEFuIHVubWF0Y2hlZCBnbG9iIGNhbm5vdCBoYXBwZW4gaGVyZTogdGhlIHNjcmlwdCBydW5zIHVuZGVyIC9iaW4vc2ggKHZpYSBOb2RlJ3MgYHNoZWxsOiB0cnVlYCksXG4gIC8vIGFuZCB0aGUgcHJlY2VkaW5nIG1hdGVyaWFsaXphdGlvbiBjb21tYW5kIGd1YXJhbnRlZXMgdGhlIFNRTGl0ZSBmaWxlIGV4aXN0cy5cbiAgLy8gUHJvamVjdHMgd2l0aCBtdWx0aXBsZSBEMSBkYXRhYmFzZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IHRoZSBoYXNoLW5hbWVkIGZpbGVzIGNhbm5vdCBiZVxuICAvLyBkaXN0aW5ndWlzaGVkIGNoZWFwbHkgKG1hdGVyaWFsaXphdGlvbiBkb2VzIG5vdCBldmVuIHVwZGF0ZSB0aGUgdGFyZ2V0IGZpbGUncyBtdGltZSkuXG4gIC8vIFRoZSBzdGF0ZSBkaXJlY3RvcnkgbXVzdCBiZSBhYnNvbHV0ZSBiZWNhdXNlIHRoZSB3cmFwcGVkIHNjcmlwdCBtYXkgYGNkYCB0byB0aGUgbW9ub3JlcG8gcm9vdC5cbiAgY29uc3Qgc3RhdGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpKTtcbiAgY29uc3QgZXhwb3J0Q29tbWFuZCA9IGBleHBvcnQgREFUQUJBU0VfVVJMPVwiZmlsZTokKGxzIFwiJHtzdGF0ZURpclBhdGh9XCIvdjMvZDEvbWluaWZsYXJlLUQxRGF0YWJhc2VPYmplY3QvKi5zcWxpdGUgfCBncmVwIC12IG1ldGFkYXRhIHwgaGVhZCAtMSlcImA7XG4gIHJldHVybiBgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZGF0YWJhc2VOYW1lKX0gJiYgJHtleHBvcnRDb21tYW5kfSAmJiAke3NjcmlwdH1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgRDEgZGF0YWJhc2UgZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIHJldHVybiBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoLCAnZGF0YWJhc2VfbmFtZScpO1xufVxuXG4vLyBMb29rZWQgdXAgZnJvbSBtYW55IGNhbGwgc2l0ZXMgKGZyYW1ld29yayBkZXRlY3Rpb24sIHdvcmtlci10eXBlcyBnZW5lcmF0aW9uLCBkZXBsb3ksIHRlc3QpLCBzb1xuLy8gdGhlIGV4aXN0ZW5jZSBwcm9iZXMgYXJlIHNoYXJlZC4gS2V5ZWQgb24gdGhlIHByb2plY3QgT0JKRUNUIChub3QgaXRzIGRpcmVjdG9yeSBwYXRoKTogdGhlIHNhbWVcbi8vIHNoYXJlZCBQcm9qZWN0IGluc3RhbmNlIGZsb3dzIHRocm91Z2ggZXZlcnkgY2FsbCBzaXRlIHdpdGhpbiBvbmUgaW52b2NhdGlvbiwgd2hpbGUgY2FsbGVycyB0aGF0XG4vLyByZXdyaXRlIGNvbmZpZ3MgYW5kIHBhc3MgZnJlc2ggcGFydGlhbCBvYmplY3RzIG11c3Qgb2JzZXJ2ZSB0aGUgY3VycmVudCBkaXNrIHN0YXRlLlxuY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHsgY29uZmlnUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkIH0+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIFRlc3RzIG1heSBwYXNzIHBhcnRpYWwgUHJvamVjdCBvYmplY3RzIHdpdGhvdXQgZGlyUGF0aC5cbiAgaWYgKCFwcm9qZWN0LmRpclBhdGgpIHJldHVybjtcbiAgY29uc3QgY2FjaGVkID0gd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUuZ2V0KHByb2plY3QpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkLmNvbmZpZ1BhdGg7XG5cbiAgY29uc3QgY29uZmlnUGF0aCA9IHdyYW5nbGVyQ29uZmlnRmlsZU5hbWVzXG4gICAgLm1hcCgoZmlsZU5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVOYW1lKSlcbiAgICAuZmluZCgoZmlsZVBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKTtcbiAgd3JhbmdsZXJDb25maWdQYXRoQ2FjaGUuc2V0KHByb2plY3QsIHsgY29uZmlnUGF0aCB9KTtcbiAgcmV0dXJuIGNvbmZpZ1BhdGg7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIG9mIHRoZSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyBkaXJlY3RvcnkgKGBtaWdyYXRpb25zX2RpcmAgaW4gdGhlIHdyYW5nbGVyXG4gKiBjb25maWcsIGRlZmF1bHRpbmcgdG8gYG1pZ3JhdGlvbnNgKSBpZiBpdCBleGlzdHMgb24gZGlzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGguam9pbihcbiAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgc2NhbldyYW5nbGVyQ29uZmlnVmFsdWUoY29uZmlnUGF0aCwgJ21pZ3JhdGlvbnNfZGlyJykgPz8gJ21pZ3JhdGlvbnMnXG4gICk7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSA/IG1pZ3JhdGlvbnNEaXJQYXRoIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBmaXJzdCB2YWx1ZSBkZWNsYXJlZCBmb3IgdGhlIGtleSBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLCBjb3ZlcmluZyBKU09OKEMpXG4gKiAoYFwia2V5XCI6IFwiLi4uXCJgKSBhbmQgVE9NTCwgaW5jbHVkaW5nIGl0cyBpbmxpbmUtdGFibGUgZm9ybSAoYGQxX2RhdGFiYXNlcyA9IFt7IC4uLiwga2V5ID0gXCIuLi5cIiB9XWApLFxuICogd2l0aG91dCBmdWxsIHBhcnNlcnMuIENvbW1lbnRlZC1vdXQgbGluZXMgYXJlIHNraXBwZWQgc28gdGhhdCB0aGV5IGNhbm5vdCBzaGFkb3cgdGhlIGFjdGl2ZVxuICogdmFsdWUsIGFuZCB0aGUga2V5IG11c3QgZm9sbG93IGEgbGluZSBzdGFydCwgYHtgIG9yIGAsYCBzbyB0aGF0IHByb3NlIG1lbnRpb25pbmcgaXQgY2Fubm90IG1hdGNoLlxuICovXG5mdW5jdGlvbiBzY2FuV3JhbmdsZXJDb25maWdWYWx1ZShjb25maWdQYXRoOiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga2V5VmFsdWVQYXR0ZXJuID0gbmV3IFJlZ0V4cChgKD86XnxbLHtdKVxcXFxzKltcIiddPyR7a2V5fVtcIiddP1xcXFxzKls6PV1cXFxccypbXCInXShbXlwiJ10rKVtcIiddYCwgJ3UnKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0ga2V5VmFsdWVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBtYXRlcmlhbGl6aW5nIHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKiBBIG5vLW9wIHF1ZXJ5IGZvcmNlcyBtaW5pZmxhcmUgdG8gY3JlYXRlIHRoZSBTUUxpdGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldC5cbiAqIE9ubHkgc3Rkb3V0IGlzIHN1cHByZXNzZWQ7IHdyYW5nbGVyIHJlcG9ydHMgZXJyb3JzIG9uIHN0ZGVyciwgd2hpY2ggbXVzdCBzdGF5IHZpc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4sIGRhdGFiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBZQVJOIHdyYW5nbGVyIGQxIGV4ZWN1dGUgJHtkYXRhYmFzZU5hbWV9IC0tbG9jYWwgLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1jb21tYW5kIFwiU0VMRUNUIDFcIiA+IC9kZXYvbnVsbGA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBsb2NhbCB3cmFuZ2xlci9taW5pZmxhcmUgc3RhdGUgZGlyZWN0b3J5LlxuICogRGV2ZWxvcG1lbnQgZm9sbG93cyB3cmFuZ2xlcidzIGRlZmF1bHQgZGlyZWN0b3J5IHNvIHRoYXQgcGxhaW4gYHdyYW5nbGVyIGRldmAgLyBgdmluZXh0IGRldmBcbiAqICh3aXRob3V0IGEgcGVyc2lzdC1wYXRoIG92ZXJyaWRlKSBzaGFyZXMgdGhlIHNhbWUgZGF0YWJhc2UgYXMgd2ItbWFuYWdlZCBkYiBjb21tYW5kcy5cbiAqIE90aGVyIGVudmlyb25tZW50cyAoZS5nLiB0ZXN0KSBnZXQgdGhlaXIgb3duIGRpcmVjdG9yeSBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc2V0XG4gKiB3aXRob3V0IGRlc3Ryb3lpbmcgZGV2ZWxvcG1lbnQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4pOiBzdHJpbmcge1xuICAvLyBEZXN0cnVjdGl2ZSB0ZXN0IHJlc2V0cyBhcmUgZ2F0ZWQgb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSwgd2hpY2ggYWNjZXB0c1xuICAvLyBlaXRoZXIgV0JfRU5WIG9yIE1JU0VfRU5WOyByZXNvbHZlIHRvIHRoZSB0ZXN0IGRpcmVjdG9yeSB3aGVuZXZlciBlaXRoZXIgc2F5cyAndGVzdCcgc29cbiAgLy8gdGhhdCBzdWNoIHJlc2V0cyBjYW4gbmV2ZXIgdGFyZ2V0IHRoZSBkZXZlbG9wbWVudCBzdGF0ZS5cbiAgY29uc3Qgd2JFbnYgPSBbcHJvamVjdC5lbnYuV0JfRU5WLCBwcm9qZWN0LmVudi5NSVNFX0VOVl0uaW5jbHVkZXMoJ3Rlc3QnKVxuICAgID8gJ3Rlc3QnXG4gICAgOiBwcm9qZWN0LmVudi5XQl9FTlYgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlY7XG4gIHJldHVybiAhd2JFbnYgfHwgd2JFbnYgPT09ICdkZXZlbG9wbWVudCcgPyAnLndyYW5nbGVyL3N0YXRlJyA6IGAud3JhbmdsZXIvc3RhdGUtJHt3YkVudn1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuLFxuICByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsXG4gIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxuICByZXNvbHZlRmFsbGJhY2tXYkVudixcbiAgc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dCxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi91dGlscy9iaW5QYXRoLmpzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IHNlbGVjdEZub3hTb3VyY2VkS2V5cyB9IGZyb20gJy4vdXRpbHMvZW52U291cmNlcy5qcyc7XG5pbXBvcnQgeyBoYXNCdW5EaXJlY3RvcnlNYXJrZXIsIGlzQnVuUGFja2FnZU1hbmFnZXIsIGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlciB9IGZyb20gJy4vdXRpbHMvcnVudGltZS5qcyc7XG5pbXBvcnQgeyBjbGVhclRlc3RTdHJ1Y3R1cmVDYWNoZSB9IGZyb20gJy4vdXRpbHMvdGVzdFN0cnVjdHVyZS5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbi8qKiBUaGUgZmlsZSBgd3JhbmdsZXIgdHlwZXNgIHdyaXRlcyBieSBkZWZhdWx0LiAqL1xuY29uc3QgV09SS0VSX1RZUEVTX0ZJTEVfTkFNRSA9ICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJztcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcm0gPSAncHJpc21hJyB8ICdkcml6emxlJztcblxuZXhwb3J0IGNvbnN0IEZJTEVfU0NIRU1BID0gJ2ZpbGU6JztcblxuZXhwb3J0IGNsYXNzIFByb2plY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGFyZ3Y6IEVudlJlYWRlck9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEVudjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXJQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlyUGF0aDogc3RyaW5nLCBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBsb2FkRW52OiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgICB0aGlzLmFyZ3YgPSBhcmd2O1xuICAgIHRoaXMubG9hZEVudiA9IGxvYWRFbnY7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaXNCdW5BdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXNlc0J1blBhY2thZ2VNYW5hZ2VyO1xuICB9XG5cbiAgLy8gVGhlIHBhY2thZ2UgbWFuYWdlciBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiOlxuICAvLyBgbm9kZSB3YiAuLi5gIGFnYWluc3QgYSBCdW4gcmVwbyBtdXN0IHN0aWxsIHJ1biBgYnVuIGluc3RhbGxgLCBhbmQgdmljZSB2ZXJzYS5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCgpOiAnYnVuJyB8ICd5YXJuJyB7XG4gICAgcmV0dXJuIHRoaXMuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIGdldCBwYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmQoKTogJ2J1biBydW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgfVxuXG4gIC8vIEEgc2luZ2xlIHNpZ25hbCBkZWNpZGVzIGV2ZXJ5IGJ1bi12cy15YXJuIGJyYW5jaCBpbiB3YiAoc2NyaXB0IG5vcm1hbGl6YXRpb24gaW5jbHVkZWQpOlxuICAvLyBzcGxpdHRpbmcgdGhlIHRvb2wtbWFuaWZlc3Qgc2lnbmFsIGZyb20gdGhlIGxvY2tmaWxlIHNpZ25hbCBvbmNlIHByb2R1Y2VkIGNvbW1hbmRzIG1peGluZ1xuICAvLyBgYnVuIGluc3RhbGxgIHdpdGggYHlhcm4gcHJpc21hIC4uLmAgaW4gbWlzZS1waW5uZWQgcmVwb3Mgd2hvc2UgYnVuLmxvY2sgaXMgZ2l0aWdub3JlZC5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHVzZXNCdW5QYWNrYWdlTWFuYWdlcigpOiBib29sZWFuIHtcbiAgICAvLyBTb21lIHJlcG9zaXRvcmllcyByZWx5IG9uIHRoZSBsb2NrZmlsZSBvciBwYWNrYWdlTWFuYWdlciBmaWVsZCBpbnN0ZWFkIG9mIG1pc2UuXG4gICAgLy8gRG9ja2VyIG9wdGltaXphdGlvbiBtdXN0IGZvbGxvdyB0aGUgdGFyZ2V0IHByb2plY3QsIG5vdCB0aGUgcnVudGltZSB0aGF0IGxhdW5jaGVkIHdiLlxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgaWYgKGlzRXhwbGljaXROb25CdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaGFzQnVuRGlyZWN0b3J5TWFya2VyKHRoaXMucm9vdERpclBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gaXNCdW5QYWNrYWdlTWFuYWdlcihwYWNrYWdlTWFuYWdlcik7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgYnVpbGRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQ/LmluY2x1ZGVzKCdidWlsZElmTmVlZGVkJylcbiAgICAgID8gJ1lBUk4gcnVuIGJ1aWxkJ1xuICAgICAgOiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkXG4gICAgICAgID8gYFlBUk4gd2IgYnVpbGRJZk5lZWRlZCAke3RoaXMuYXJndi52ZXJib3NlID8gJy0tdmVyYm9zZScgOiAnJ31gXG4gICAgICAgIDogXCJlY2hvICdObyBidWlsZCBzY3JpcHQnXCI7XG4gIH1cblxuICBnZXQgZGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHJvb3REaXJQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgPyBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCAnLi4nLCAnLi4nKVxuICAgICAgOiB0aGlzLmRpclBhdGg7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyZmlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmModGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RvY2tlcmZpbGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzU291cmNlQ29kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnc3JjJykpO1xuICB9XG5cbiAgLyoqIEEgd29ya3NwYWNlIHJvb3Qgd2l0aG91dCBzb3VyY2VzIG9mIGl0cyBvd24gcnVucyBuZWl0aGVyIGxpbnQgbm9yIHR5cGVjaGVjayBjb21tYW5kcy4gKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc093blNvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgdGhpcy5oYXNTb3VyY2VDb2RlO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkb2NrZXJJbWFnZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wYWNrYWdlSnNvbi5uYW1lIHx8ICd1bmtub3duJztcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKCdAJywgJycpLnJlcGxhY2VBbGwoJy8nLCAnLScpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNsYXJlZEVudktleUNhY2hlOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG5hbWVzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhlIFBST0pFQ1QgZGVjbGFyZXMgKGl0cyBmbm94Ly5lbnYgc291cmNlcyksIGV4Y2x1ZGluZ1xuICAgKiBib3RoIHRoZSBhbWJpZW50IHByb2Nlc3MgZW52aXJvbm1lbnQgYW5kIHRoZSBgbWlzZSBlbnZgIHBzZXVkby1zb3VyY2UgdGhhdCByZXBvcnRzIGhvc3QvdG9vbFxuICAgKiB2YXJpYWJsZXMgc3VjaCBhcyBQQVRILiBgZW52YCBjYW5ub3QgYW5zd2VyIHRoaXM6IGl0IG1lcmdlcyBwcm9jZXNzLmVudiwgc28gYSBwcm9qZWN0IHZhcmlhYmxlXG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gaW5oZXJpdGVkIG9uZSB0aGVyZS5cbiAgICovXG4gIGdldCBkZWNsYXJlZEVudktleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGUpIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZGVjbGFyZWRFbnZLZXlDYWNoZSA9IG5ldyBTZXQoKTtcbiAgICAgIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IFssIGVudlNvdXJjZXNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgdGhpcy5kZWNsYXJlZEVudktleUNhY2hlID0gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXMpO1xuICAgIHJldHVybiB0aGlzLmRlY2xhcmVkRW52S2V5Q2FjaGU7XG4gIH1cblxuICAvLyBDYWNoZWQgaW4gYSBwbGFpbiBmaWVsZCByYXRoZXIgdGhhbiB3aXRoIEBtZW1vaXplT25lOiB0aGF0IGRlY29yYXRvciBrZXlzIGl0cyBjYWNoZSBvbiBhIGhhc2hcbiAgLy8gb2YgdGhlIGluc3RhbmNlLCB3aGljaCBjaGFuZ2VzIGFzIG90aGVyIG1lbW9pemVkIGdldHRlcnMgcG9wdWxhdGUgdGhlIGluc3RhbmNlLCBzbyBgZW52YCBjb3VsZFxuICAvLyBzaWxlbnRseSBiZSByZWNvbXB1dGVkIOKAlCBkcm9wcGluZyBpbi1wbGFjZSBtdXRhdGlvbnMgKGUuZy4gYHByb2plY3QuZW52LlBPUlQgfHw9IOKApmAsIG9yIHRoZVxuICAvLyBzZWNyZXRzIGB3YiBkZXBsb3lgIG1lcmdlcyBmcm9tIC5lbnYuY2xvdWRmbGFyZSkgdGhhdCBjYWxsZXJzIHJlbHkgb24gZm9yIHNwYXduZWQgY29tbWFuZHMuXG4gIHByaXZhdGUgZW52Q2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IGVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5lbnZDYWNoZSkgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgaWYgKCF0aGlzLmxvYWRFbnYpIHtcbiAgICAgIHRoaXMuZW52Q2FjaGUgPSBwcm9jZXNzLmVudjtcbiAgICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICAgIH1cblxuICAgIGNvbnN0IFttZXJnZWRFbnYsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnNdID0gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5hcmd2LCB0aGlzLmRpclBhdGgpO1xuICAgIHRoaXMuZW52Q2FjaGUgPSBtZXJnZWRFbnY7XG4gICAgLy8gYG1pc2UgZW52YCBpcyBleGNsdWRlZDogaXQgcmVwb3J0cyB0b29sLWFjdGl2YXRpb24gb3V0cHV0IChlLmcuIFBBVEgpIGV2ZW4gaW4gcmVwb3MgdGhhdFxuICAgIC8vIGRlY2xhcmUgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGF0IGFsbCwgd2hpY2ggbXVzdCBub3QgdHJpZ2dlciB0aGUgQ0kgc3RyaWN0bmVzcyBiZWxvdy5cbiAgICB0aGlzLmNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzLnNvbWUoKFtzb3VyY2VdKSA9PiAhc291cmNlLnN0YXJ0c1dpdGgoJ21pc2UgZW52JykpKTtcbiAgICByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHN0YW5kYXJkV2JFbnZNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcblxuICAvKipcbiAgICogQ29tcGxldGVzIGFuZCB2YWxpZGF0ZXMgdGhlIHJlc29sdmVkIGBXQl9FTlZgIHBlciB0aGUgb3JnIHN0YW5kYXJkIChzZWUgdGhlXG4gICAqIGd1aWRlbGluZXMtZm9yLW1pc2UtZm5veCBza2lsbCk6XG4gICAqIC0gTG9jYWxseSwgYW4gdW5zZXQgYFdCX0VOVmAgZmFsbHMgYmFjayB0byB0aGUgc2VsZWN0ZWQgY2FzY2FkZSBtb2RlIChkZXZlbG9wbWVudCB1bmxlc3MgYVxuICAgKiAgIGNvbW1hbmQgZm9yY2VzIGFub3RoZXIsIGUuZy4gYHdiIHRlc3RgIGZvcmNlcyB0ZXN0KSwgc28gY2FzdWFsIGBidW4gd2IgLi4uYCBpbnZvY2F0aW9uc1xuICAgKiAgIHdvcmsgaW4gcmVwb3NpdG9yaWVzIHRoYXQgZGVmaW5lIG5vIFdCX0VOViBhdCBhbGwuXG4gICAqIC0gT24gQ0ksIGFuIHVuc2V0IGBXQl9FTlZgIGlzIGEgaGFyZCBlcnJvciB3aGVuIGVudiBzb3VyY2VzIGV4aXN0OiB3b3JrZmxvd3MgbXVzdCBleHBvcnQgdGhlXG4gICAqICAgZW52aXJvbm1lbnQgZXhwbGljaXRseSBpbnN0ZWFkIG9mIHNpbGVudGx5IHJ1bm5pbmcgaW4gYW4gYW1iaWd1b3VzIG1vZGUuXG4gICAqIC0gVGhlIHZhbHVlIG11c3QgbmFtZSBhIHN0YW5kYXJkIG1vZGU7IGFuIHVua25vd24gdmFsdWUgKGUuZy4gYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gKSB3b3VsZFxuICAgKiAgIG90aGVyd2lzZSBzaWxlbnRseSBzZWxlY3QgdGhlIGRldmVsb3BtZW50IGNhc2NhZGUsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIHRoaXMgZ3VhcmRzIGFnYWluc3QuXG4gICAqIC0gYE5FWFRfUFVCTElDX1dCX0VOVmAgaXMgZGVyaXZlZCBmcm9tIGBXQl9FTlZgIGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzIHdoZW4gbWlzc2luZywgc28gYVxuICAgKiAgIHByb2R1Y3Rpb24gYnVpbGQgY2FuIG5vIGxvbmdlciBiYWtlIGEgc3RhbGUgZGV2ZWxvcG1lbnQgdmFsdWUgaW50byB0aGUgY2xpZW50IGJ1bmRsZS5cbiAgICogU2tpcHBlZCB3aGVuIGBXQl9TS0lQX0VOVl9DSEVDSz0xYCBpcyBzZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbXBsZXRlQW5kVmFsaWRhdGVXYkVudihoYXNFbnZpcm9ubWVudFNvdXJjZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudkNhY2hlO1xuICAgIGlmICghZW52KSByZXR1cm47XG4gICAgaWYgKGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJzEnIHx8IGVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnKSByZXR1cm47XG5cbiAgICAvLyBPbiBDSSwgV0JfRU5WIG11c3QgYmUgRVhQT1JURUQgYnkgdGhlIHdvcmtmbG93IOKAlCBjaGVja2VkIGFnYWluc3QgcHJvY2Vzcy5lbnYsIG5vdCB0aGVcbiAgICAvLyBtZXJnZWQgZW52aXJvbm1lbnQ6IGEgY29tbWl0dGVkIGJhc2UgZGVmYXVsdCAoZS5nLiBmbm94J3MgZGV2ZWxvcG1lbnQgZW50cnkpIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNhdGlzZnkgdGhlIGNoZWNrIGFuZCBzaWxlbnRseSBydW4gQ0kgaW4gZGV2ZWxvcG1lbnQgbW9kZS5cbiAgICBpZiAoaXNDSShlbnYuQ0kpICYmICFwcm9jZXNzLmVudi5XQl9FTlYgJiYgaGFzRW52aXJvbm1lbnRTb3VyY2VzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgJ1dCX0VOViBpcyBub3QgZXhwb3J0ZWQgb24gQ0kuIEV4cG9ydCBXQl9FTlYgZXhwbGljaXRseSAodGhlIHJldXNhYmxlIHdvcmtmbG93cyBwYXNzIGl0IHZpYSB0aGUgXCJlbnZpcm9ubWVudFwiIGlucHV0KSwgJyArXG4gICAgICAgICAgICAnb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFlbnYuV0JfRU5WKSB7XG4gICAgICAvLyBUaGUgc2hhcmVkIHJlc29sdmVyIGtlZXBzIHRoaXMgZmFsbGJhY2sgY29uc2lzdGVudCB3aXRoIHRoZSBjYXNjYWRlIHNlbGVjdGlvbiBBTkQgd2l0aFxuICAgICAgLy8gdGhlICR7V0JfRU5WfSBleHBhbnNpb24gcmVhZEVudmlyb25tZW50VmFyaWFibGVzIGFscmVhZHkgcGVyZm9ybWVkOiB0aGUgZm9yY2VkIGNhc2NhZGVcbiAgICAgIC8vIChlLmcuIGB3YiB0ZXN0YCksIHRoZW4gdGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCwgdGhlbiB0aGUgQU1CSUVOVC1OT0RFX0VOVi1kcml2ZW4gYXV0b1xuICAgICAgLy8gY2FzY2FkZSBjbGFtcGVkIHRvIGEgc3RhbmRhcmQgbW9kZSAoYW4gZXhwbGljaXQgLS1jYXNjYWRlLWVudiBrZWVwcyBpdHMgdmFsdWUgYW5kIGlzXG4gICAgICAvLyB2YWxpZGF0ZWQgYmVsb3cgbGlrZSBhbnkgb3RoZXIgV0JfRU5WKS5cbiAgICAgIGNvbnN0IG1vZGUgPSByZXNvbHZlRmFsbGJhY2tXYkVudih0aGlzLmFyZ3YpO1xuICAgICAgZW52LldCX0VOViA9IG1vZGU7XG4gICAgICBpZiAoaGFzRW52aXJvbm1lbnRTb3VyY2VzICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBXQl9FTlYgaXMgbm90IGRlZmluZWQ7IGRlZmF1bHRpbmcgdG8gXCIke21vZGV9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghUHJvamVjdC5zdGFuZGFyZFdiRW52TW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViBtdXN0IGJlIG9uZSBvZiBkZXZlbG9wbWVudCwgdGVzdCwgc3RhZ2luZywgb3IgcHJvZHVjdGlvbiwgYnV0IGlzIFwiJHtlbnYuV0JfRU5WfVwiLiBgICtcbiAgICAgICAgICAgICdGaXggdGhlIHZhbHVlIGluIHRoZSBlbnYgc291cmNlIG9yIHRoZSBleHBvcnRlZCB2YXJpYWJsZSwgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gQSBmb3JjZWQgbW9kZSAoYW4gZXhwbGljaXQvY29tbWFuZC1kZWZhdWx0IC0tY2FzY2FkZS1lbnYsIG9yIGFuIGV4cG9ydGVkIFdCX0VOViB3aG9zZVxuICAgIC8vIHByb2ZpbGUgdmFsdWVzIG1heSBvdmVycmlkZSBpdCBsb2NhbGx5IHBlciBpc3N1ZSAjOTMwKSBtdXN0IG5vdCBiZSBzaWxlbnRseSByZXBsYWNlZCBieVxuICAgIC8vIGFub3RoZXIgbW9kZSBhbiBlbnYgc291cmNlIGRlZmluZXM6IGB3YiB0ZXN0YCByZXNvbHZpbmcgV0JfRU5WPWRldmVsb3BtZW50IGZyb20gdGhlIGJhc2VcbiAgICAvLyBmbm94IHNlY3JldHMgd291bGQgcnVuIHRoZSB0ZXN0cyBhZ2FpbnN0IGRldmVsb3BtZW50IHZhbHVlcywgYW5kIGFuIGV4cG9ydGVkXG4gICAgLy8gV0JfRU5WPXByb2R1Y3Rpb24gb3ZlcnJpZGRlbiB0byBkZXZlbG9wbWVudCBieSB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdvdWxkIGJ1aWxkL2RlcGxveVxuICAgIC8vIHRoZSB3cm9uZyBlbnZpcm9ubWVudCB3aGlsZSBsb29raW5nIHN1Y2Nlc3NmdWwuXG4gICAgLy8gLS1jYXNjYWRlLW5vZGUtZW52IGZvcmNlcyA8Tk9ERV9FTlYgfHwgZGV2ZWxvcG1lbnQ+IChwZXIgaXRzIG93biBkb2N1bWVudGF0aW9uKSwgcmVhZCBmcm9tXG4gICAgLy8gdGhlIEFNQklFTlQgZW52aXJvbm1lbnQgbGlrZSB0aGUgY2FzY2FkZSBzZWxlY3Rpb24uIE9ubHkgYSBTVEFOREFSRCBmb3JjZWQgbW9kZSBpcyBlbmZvcmNlZDpcbiAgICAvLyBhIG5vbi1zdGFuZGFyZCBvbmUgKGUuZy4gTk9ERV9FTlY9cWEpIGFscmVhZHkgaGFkIGl0cyBmYWxsYmFjayBjbGFtcGVkIHRvIGRldmVsb3BtZW50IGFib3ZlLFxuICAgIC8vIGFuZCBlcnJvcmluZyBvbiB0aGF0IGNsYW1wIHdvdWxkIGNvbnRyYWRpY3QgaXQuXG4gICAgY29uc3QgZm9yY2VkTW9kZSA9XG4gICAgICB0aGlzLmFyZ3YuY2FzY2FkZUVudiA/P1xuICAgICAgKHRoaXMuYXJndi5jYXNjYWRlTm9kZUVudiA/IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCcgOiBwcm9jZXNzLmVudi5XQl9FTlYgfHwgdW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgQVVUTy1zZWxlY3RlZCBtb2RlIGNvdW50cyBhcyB0aGUgZXhwZWN0YXRpb24gdG9vOiB3aXRoIG5vdGhpbmcgc2V0IGFueXdoZXJlLCB0aGVcbiAgICAvLyBkZXZlbG9wbWVudCB2YWx1ZXMgYXJlIGxvYWRlZCwgc28gYW4gZW52IHNvdXJjZSBkZWNsYXJpbmcgV0JfRU5WPXByb2R1Y3Rpb24gd291bGRcbiAgICAvLyBvdGhlcndpc2UgcnVuIGRldmVsb3BtZW50IHNvdXJjZXMgbGFiZWxlZCBhcyBwcm9kdWN0aW9uLlxuICAgIGNvbnN0IGV4cGVjdGVkTW9kZSA9XG4gICAgICBmb3JjZWRNb2RlID8/ICh0aGlzLmFyZ3YuYXV0b0Nhc2NhZGVFbnYgIT09IGZhbHNlID8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYodGhpcy5hcmd2KSA6IHVuZGVmaW5lZCk7XG4gICAgLy8gVGhlIGNvbW1hbmQtbGV2ZWwgZGVmYXVsdCBpcyBhIGxlZ2l0aW1hdGUgc2Vjb25kIGV4cGVjdGF0aW9uOiBgd2IgdGVzdCAtLWNhc2NhZGUtZW52PXN0YWdpbmdgXG4gICAgLy8gbG9hZHMgdGhlIHN0YWdpbmcgZmlsZXMgd2hpbGUgdGhlIGZhbGxiYWNrIGNvcnJlY3RseSBmaWxscyBXQl9FTlY9dGVzdC5cbiAgICBpZiAoXG4gICAgICBleHBlY3RlZE1vZGUgJiZcbiAgICAgIFByb2plY3Quc3RhbmRhcmRXYkVudk1vZGVzLmhhcyhleHBlY3RlZE1vZGUpICYmXG4gICAgICBlbnYuV0JfRU5WICE9PSBleHBlY3RlZE1vZGUgJiZcbiAgICAgIGVudi5XQl9FTlYgIT09IHRoaXMuYXJndi5jb21tYW5kRGVmYXVsdFdiRW52XG4gICAgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke2V4cGVjdGVkTW9kZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAgICAgYEZpeCB0aGUgV0JfRU5WIGRlZmluZWQgaW4gdGhlIG1vZGUncyBlbnYgc291cmNlIChlLmcuIHRoZSBmbm94IFwiJHtleHBlY3RlZE1vZGV9XCIgcHJvZmlsZSksIGAgK1xuICAgICAgICAgICAgJ29yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcXVpcmVzTmV4dFB1YmxpY1diRW52ICYmIGVudi5ORVhUX1BVQkxJQ19XQl9FTlYgIT09IGVudi5XQl9FTlYpIHtcbiAgICAgIC8vIEFzc2lnbiB1bmNvbmRpdGlvbmFsbHksIG5vdCBgfHw9YDogdGhlIHBhaXIgbXVzdCBhZ3JlZSBieSBjb252ZW50aW9uLCBhbmQgYSBzdGFsZSB2YWx1ZVxuICAgICAgLy8gKGUuZy4gdGhlIGZub3ggYmFzZSBkZXZlbG9wbWVudCBkZWZhdWx0IHdoaWxlIENJIGV4cG9ydHMgV0JfRU5WPXRlc3QpIHdvdWxkIG90aGVyd2lzZVxuICAgICAgLy8gYmUgYmFrZWQgaW50byB0aGUgY2xpZW50IGJ1bmRsZSBldmVuIHRob3VnaCB0aGUgc2VydmVyIHNpZGUgcnVucyB3aXRoIHRoZSBjb3JyZWN0IFdCX0VOVi5cbiAgICAgIGlmIChlbnYuTkVYVF9QVUJMSUNfV0JfRU5WICYmICFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBPdmVycmlkaW5nIE5FWFRfUFVCTElDX1dCX0VOViAoXCIke2Vudi5ORVhUX1BVQkxJQ19XQl9FTlZ9XCIpIHdpdGggV0JfRU5WIChcIiR7ZW52LldCX0VOVn1cIikuYCk7XG4gICAgICB9XG4gICAgICBlbnYuTkVYVF9QVUJMSUNfV0JfRU5WID0gZW52LldCX0VOVjtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByZXF1aXJlc05leHRQdWJsaWNXYkVudigpOiBib29sZWFuIHtcbiAgICAvLyBPV04gZGVwZW5kZW5jaWVzIG9ubHk6IGEgcm9vdC1sZXZlbCBuZXh0L3ZpbmV4dCBkZXZEZXBlbmRlbmN5IGluIGEgbWl4ZWQgbW9ub3JlcG8gbXVzdCBub3RcbiAgICAvLyBmb3JjZSBORVhUX1BVQkxJQ19XQl9FTlYgb250byBldmVyeSBub24tTmV4dCB3b3Jrc3BhY2UgcGFja2FnZS5cbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCduZXh0JykgfHwgISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCd2aW5leHQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMucGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwYWNrYWdlSnNvblBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYHdyYW5nbGVyIHR5cGVzYCBzaG91bGQgZ2VuZXJhdGUgYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGhlcmUuIEEgd3JhbmdsZXIgY29uZmlnXG4gICAqIGFuZCBhbiBvd24gd3JhbmdsZXIgZGVwZW5kZW5jeSBhcmUgYm90aCByZXF1aXJlZCDigJQgd3JhbmdsZXIgZXhpdHMgbm9uLXplcm8gd2l0aG91dCBhIGNvbmZpZyxcbiAgICogYW5kIGluIGEgbWl4ZWQgbW9ub3JlcG8gYSByb290LWxldmVsIHdyYW5nbGVyIGRldkRlcGVuZGVuY3kgbXVzdCBub3QgbWFrZSBldmVyeSB3b3Jrc3BhY2VcbiAgICogcGFja2FnZSBlbWl0IHR5cGVzIGl0IG5ldmVyIGNvbnN1bWVzLlxuICAgKlxuICAgKiBUaGUgcGFja2FnZSdzIG93biBjb21taXR0ZWQgZ2l0aWdub3JlIHJ1bGUgaXMgdGhlIHRoaXJkIHNpZ25hbCwgYW5kIHRoZSBvbmUgdGhhdCBzYXlzIHRoZVxuICAgKiBwYWNrYWdlIGFjdHVhbGx5IENPTlNVTUVTIHRoZSBmaWxlOiB3YmZ5IHdyaXRlcyB0aGF0IHJ1bGUgb25seSBmb3IgcGFja2FnZXMgd2hvc2Ugb3duIHRzY29uZmlnXG4gICAqIGNhbiByZWZlcmVuY2UgYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgLCBhbmQgZGVsaWJlcmF0ZWx5IGxlYXZlcyBhbG9uZSBwYWNrYWdlcyB0aGF0XG4gICAqIGhhbmQtbWFpbnRhaW4gdGhlaXIgYEVudmAgaW5zdGVhZC4gV2l0aG91dCB0aGlzIGNoZWNrLCBzdWNoIGEgcGFja2FnZSB3b3VsZCBnYWluIGFuIHVudHJhY2tlZFxuICAgKiB+NTAwS0IgZ2VuZXJhdGVkIGZpbGUgb24gZXZlcnkgaW5zdGFsbC5cbiAgICovXG4gIEBtZW1vaXplT25lXG4gIGdldCBnZW5lcmF0ZXNXb3JrZXJUeXBlcygpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgodGhpcykgfHwgIXRoaXMuaGFzT3duRGVwZW5kZW5jeSgnd3JhbmdsZXInKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIERlZmVuc2UgaW4gZGVwdGggYWdhaW5zdCB3YmZ5J3MgZ2l0aWdub3JlIHJ1bGUgYW5kIHRoaXMgcHJlZGljYXRlIGRyaWZ0aW5nIGFwYXJ0OiBpZiB0aGUgcGFja2FnZSBzdGlsbFxuICAgIC8vIHJ1bnMgaXRzIG93biBvdXRwdXQtY2hhbmdpbmcgYHdyYW5nbGVyIHR5cGVzYCAoZS5nLiBgLS1zdHJpY3QtdmFycz1mYWxzZWApLCB0aGUgYmFyZSBpbnZvY2F0aW9uIGhlcmUgd291bGRcbiAgICAvLyBvdmVyd3JpdGUgdGhhdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgYEVudmAuXG4gICAgaWYgKGhhc091dHB1dENoYW5naW5nV3JhbmdsZXJUeXBlcyh0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge30sIHRoaXMuZGlyUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaGFzTWFuYWdlZEdpdGlnbm9yZVJ1bGUodGhpcy5kaXJQYXRoLCBXT1JLRVJfVFlQRVNfRklMRV9OQU1FKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICAvKiogQmxpdHogcmVwb3NpdG9yaWVzIGtlZXAgdGhlaXIgUHJpc21hIHNjaGVtYSBhbmQgU1FMaXRlIGRhdGFiYXNlcyB1bmRlciBkYi8gaW5zdGVhZCBvZiBwcmlzbWEvLiAqL1xuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJpc21hRGlyTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdkYicsICdzY2hlbWEucHJpc21hJykpID8gJ2RiJyA6ICdwcmlzbWEnO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBQbGF5d3JpZ2h0IGNvbmZpZyBkZWNsYXJlcyBhIGB3ZWJTZXJ2ZXJgIGJsb2NrLCBpLmUuIFBsYXl3cmlnaHQgaXRzZWxmIGJ1aWxkcyBhbmRcbiAgICogc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC4gVW5saWtlIHtAbGluayBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodH0gdGhpcyBpZ25vcmVzIENJLCBzb1xuICAgKiBpdCBhbHNvIGhvbGRzIGZvciBsaWJyYXJ5IGZpeHR1cmVzIHdob3NlIG9ubHkgc2VydmVyIGlzIHRoZSBvbmUgUGxheXdyaWdodCBtYW5hZ2VzLlxuICAgKi9cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSB0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgICAgcmV0dXJuIC9cXGJ3ZWJTZXJ2ZXJcXGIvLnRlc3QoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICAvLyBPbiBDSSB3YiBsYXVuY2hlcyB0aGUgYXBwIGl0c2VsZiBzbyB0aGUgcnVuIGRvZXMgbm90IGRlcGVuZCBvbiBQbGF5d3JpZ2h0J3MgYHJldXNlRXhpc3RpbmdTZXJ2ZXJgXG4gICAgLy8gKHdoaWNoIGlzIGRpc2FibGVkIG9uIENJKTsgbG9jYWxseSwgYSBgd2ViU2VydmVyYCBibG9jayBtZWFucyBQbGF5d3JpZ2h0IGFscmVhZHkgb3ducyB0aGUgc2VydmVyLlxuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWc7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSk7XG4gICAgcmV0dXJuIGRvY2tlcmZpbGVEaXJQYXRoID09PSB0aGlzLmRpclBhdGhcbiAgICAgID8gdGhpcy5wYWNrYWdlSnNvblxuICAgICAgOiAoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRvY2tlcmZpbGVEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCh0aGlzLmRpclBhdGgsIHRoaXMuZW52KTtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd1BhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKCcvLycpID8gcmF3UGF0aC5zbGljZSgyKSA6IHJhd1BhdGg7XG4gIHJldHVybiBub3JtYWxpemVkUGF0aCB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+ICYgUGFydGlhbDxQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdyb290RGlyUGF0aCc+PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBpZiAocGF0aC5pc0Fic29sdXRlKGRiUGF0aCkpIHJldHVybiBkYlBhdGg7XG5cbiAgY29uc3QgYmFzZURpclBhdGggPSBwcm9qZWN0LnJvb3REaXJQYXRoID8/IHByb2plY3QuZGlyUGF0aDtcbiAgcmV0dXJuIGJhc2VEaXJQYXRoID8gcGF0aC5yZXNvbHZlKGJhc2VEaXJQYXRoLCBkYlBhdGgpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBwcm9qZWN0J3MgZW52IHNvdXJjZXMgYW5kIG1lcmdlcyB0aGVtIG92ZXIgcHJvY2Vzcy5lbnYsIHJlcG9ydGluZyBlYWNoIGxvYWRlZCBzb3VyY2UuXG4gKiBTaGFyZWQgYnkgUHJvamVjdC5lbnYgYW5kIGB3YiBydW5gJ3Mgc3RhbmRhbG9uZSAobWFuaWZlc3QtbGVzcykgZW52aXJvbm1lbnQgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRNZXJnZUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBkaXJQYXRoOiBzdHJpbmdcbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBjb25zdCBbZW52VmFycywgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgZGlyUGF0aCwge1xuICAgIC8vIENhbGxlcnMgZmlsbCBhbiB1bnNldCBXQl9FTlYgd2l0aCB0aGUgc2FtZSBmYWxsYmFjayBhZnRlcndhcmRzLCBzbyBleHBhbmRpbmcgJHtXQl9FTlZ9XG4gICAgLy8gcmVmZXJlbmNlcyBhZ2FpbnN0IGl0IGtlZXBzIHRoZSBwYWlyIGNvbnNpc3RlbnQuXG4gICAgZXhwYW5kRmFsbGJhY2tXYkVudjogdHJ1ZSxcbiAgfSk7XG4gIGlmICghc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2KSkge1xuICAgIGZvciAoY29uc3QgW2VudlBhdGgsIG5hbWVzXSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke25hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHtlbnZQYXRofWApO1xuICAgIH1cbiAgfVxuICAvLyBTcHJlYWRpbmcgZW52VmFycyBsYXN0IGlzIHNhZmUgZm9yIGV4cG9ydGVkLXZhcmlhYmxlIHByZWNlZGVuY2U6IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlc1xuICAvLyBhbHJlYWR5IGV4Y2x1ZGVzIGtleXMgcHJlc2VudCBpbiBwcm9jZXNzLmVudiBmcm9tIC5lbnYvZm5veCBzb3VyY2VzIChyZXR1cm5pbmcgYSBrZXkgdGhhdFxuICAvLyBleGlzdHMgaW4gcHJvY2Vzcy5lbnYgb25seSBmb3IgZGVsaWJlcmF0ZSBmb3JjZWQtbW9kZSBvdmVycmlkZXMpLiBNaXNlIHZhbHVlcyB0aGF0XG4gIC8vIGRpZmZlciBmcm9tIHRoZSBhbWJpZW50IGFjdGl2YXRpb24gYXJlIGRlbGliZXJhdGVseSBrZXB0IHNvIHRoZSByZXF1ZXN0ZWQgY2FzY2FkZSBwcm9maWxlXG4gIC8vIChlLmcuIGAtLWNhc2NhZGUtZW52PXRlc3RgKSB3aW5zIG92ZXIgYSBzdGFsZSBgbWlzZSBhY3RpdmF0ZWAgZW52aXJvbm1lbnQuXG4gIHJldHVybiBbeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9LCBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZVBhaXJzXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3VuZFByb2plY3RzIHtcbiAgcm9vdDogUHJvamVjdDtcbiAgc2VsZjogUHJvamVjdDtcbiAgZGVzY2VuZGFudHM6IFByb2plY3RbXTtcbn1cblxuLy8gUHJvamVjdCBjb25zdHJ1Y3Rpb24gcmUtcmVhZHMgbWFuaWZlc3RzIGFuZCBlbnYgc291cmNlcywgYW5kIGB3YiB2ZXJpZnlgIGNvbXBvc2VzIGNvbW1hbmRzXG4vLyAobGludCwgdHlwZWNoZWNrLCB0ZXN0KSB0aGF0IGVhY2ggcmVidWlsZCB0aGUgZ3JhcGgg4oCUIHNvIGluc3RhbmNlcyBhcmUgc2hhcmVkIHBlclxuLy8gKGRpcmVjdG9yeSwgbG9hZEVudiwgZW52LXJlbGV2YW50IGFyZ3YpIHdpdGhpbiBvbmUgaW52b2NhdGlvbi4gU2hhcmluZyBpcyBzYWZlIGJlY2F1c2UgYVxuLy8gUHJvamVjdCBpcyBpbW11dGFibGUgZXhjZXB0IGZvciBlbnYgbXV0YXRpb25zIChlLmcuIGBwcm9qZWN0LmVudi5QT1JUIHx8PSAuLi5gKSwgd2hpY2ggY2FsbGVyc1xuLy8gZGVsaWJlcmF0ZWx5IHJlbHkgb24gc3RheWluZyB2aXNpYmxlIHRvIGxhdGVyIHN0ZXBzLiBUaGUgY2FjaGVzIGxpdmUgZm9yIHRoZSB3aG9sZSBwcm9jZXNzIGFuZFxuLy8gbmV2ZXIgb2JzZXJ2ZSBsYXRlciBmaWxlc3lzdGVtIG11dGF0aW9ucywgc28gY29kZSB0aGF0IHJld3JpdGVzIGEgcHJvamVjdCBkaXJlY3RvcnkgYW5kIG5lZWRzIGFcbi8vIGZyZXNoIHZpZXcgKHRvZGF5IG9ubHkgdGVzdHMpIG11c3QgY2FsbCBjbGVhclByb2plY3RDYWNoZXMgZmlyc3QuXG5jb25zdCBzZWxmUHJvamVjdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb2plY3Q+KCk7XG5jb25zdCBkZXNjZW5kYW50UHJvamVjdHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFByb2plY3RbXT4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclByb2plY3RDYWNoZXMoKTogdm9pZCB7XG4gIHNlbGZQcm9qZWN0Q2FjaGUuY2xlYXIoKTtcbiAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuY2xlYXIoKTtcbiAgY2xlYXJUZXN0U3RydWN0dXJlQ2FjaGUoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9qZWN0Q2FjaGVLZXkoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudjogYm9vbGVhbiwgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gT25seSB0aGUgaW5wdXRzIGEgUHJvamVjdCBhY3R1YWxseSByZWFkcyBwYXJ0aWNpcGF0ZTogdGhlIGVudiBjYXNjYWRlIHNlbGVjdGlvblxuICAvLyAocmVhZEVudmlyb25tZW50VmFyaWFibGVzIC8gcmVzb2x2ZUZhbGxiYWNrV2JFbnYgLyBjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpIGFuZCB0aGUgb3V0cHV0XG4gIC8vIHN3aXRjaGVzIChzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0LCBidWlsZENvbW1hbmQncyAtLXZlcmJvc2UpLiBUaGUgYW1iaWVudFxuICAvLyBXQl9FTlYgLyBOT0RFX0VOViAvIENJIHZhbHVlcyBmZWVkIHRoZSBzYW1lIGNhc2NhZGUgc2VsZWN0aW9uIGFuZCBhcmUgbXV0YXRlZCBtaWQtcnVuIGJ5XG4gIC8vIGNvbW1hbmRzIHN1Y2ggYXMgYHdiIGRiIHJlc2V0YCAod2hpY2ggZm9yY2VzIFdCX0VOVj10ZXN0IGFuZCByZS1yZXNvbHZlcyBwcm9qZWN0cyksIHNvIHRoZXlcbiAgLy8gbXVzdCBwYXJ0aWNpcGF0ZSB0b28gb3IgdGhlIHNlY29uZCByZXNvbHV0aW9uIHdvdWxkIHJldXNlIGEgUHJvamVjdCB3aXRoIHRoZSB3cm9uZyBlbnYuXG4gIGNvbnN0IHsgYXV0b0Nhc2NhZGVFbnYsIGNhc2NhZGVFbnYsIGNhc2NhZGVOb2RlRW52LCBjb21tYW5kRGVmYXVsdFdiRW52LCBxdWlldEVudiwgdmVyYm9zZSB9ID0gYXJndjtcbiAgY29uc3QgeyBzaWxlbnQgfSA9IGFyZ3YgYXMgeyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgpLFxuICAgIGxvYWRFbnYsXG4gICAgYXV0b0Nhc2NhZGVFbnYsXG4gICAgY2FzY2FkZUVudixcbiAgICBjYXNjYWRlTm9kZUVudixcbiAgICBjb21tYW5kRGVmYXVsdFdiRW52LFxuICAgIHF1aWV0RW52LFxuICAgIHZlcmJvc2UsXG4gICAgc2lsZW50LFxuICAgIHByb2Nlc3MuZW52LldCX0VOVixcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOVixcbiAgICBwcm9jZXNzLmVudi5DSSxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgY2FjaGVLZXkgPSBidWlsZFByb2plY3RDYWNoZUtleShhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgbGV0IHByb2plY3QgPSBzZWxmUHJvamVjdENhY2hlLmdldChjYWNoZUtleSk7XG4gIGlmICghcHJvamVjdCkge1xuICAgIHByb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICBzZWxmUHJvamVjdENhY2hlLnNldChjYWNoZUtleSwgcHJvamVjdCk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0OiBQcm9qZWN0LCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2plY3QuZW52LldCX0VOViA9PT0gbmFtZSB8fCBwcm9qZWN0LmVudi5NSVNFX0VOViA9PT0gbmFtZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmREZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBQcm9taXNlPEZvdW5kUHJvamVjdHMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgcm9vdEFuZFNlbGZQcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGxvYWRFbnYsIGRpclBhdGgpO1xuICBpZiAoIXJvb3RBbmRTZWxmUHJvamVjdHMpIHJldHVybjtcbiAgaWYgKHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCAhPT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmKSB7XG4gICAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdIH07XG4gIH1cblxuICBjb25zdCBjYWNoZUtleSA9IGJ1aWxkUHJvamVjdENhY2hlS2V5KGFyZ3YsIGxvYWRFbnYsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgbGV0IGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFkZXNjZW5kYW50cykge1xuICAgIGRlc2NlbmRhbnRzID0gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudik7XG4gICAgZGVzY2VuZGFudFByb2plY3RzQ2FjaGUuc2V0KGNhY2hlS2V5LCBkZXNjZW5kYW50cyk7XG4gIH1cbiAgcmV0dXJuIHsgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cywgZGVzY2VuZGFudHM6IGF3YWl0IGRlc2NlbmRhbnRzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IE9taXQ8Rm91bmRQcm9qZWN0cywgJ2Rlc2NlbmRhbnRzJz4gfCB1bmRlZmluZWQge1xuICBkaXJQYXRoID8/PSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0aGlzUHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCF0aGlzUHJvamVjdCkgcmV0dXJuO1xuXG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIHJvb3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIGxvYWRFbnYsIHJvb3REaXJQYXRoKSA/PyB0aGlzUHJvamVjdDtcbiAgfVxuICByZXR1cm4geyByb290OiByb290UHJvamVjdCwgc2VsZjogdGhpc1Byb2plY3QgfTtcbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBwcm9qZWN0IGZvbGxvd2VkIGJ5IG9uZSBQcm9qZWN0IHBlciB3b3Jrc3BhY2UgZGlyZWN0b3J5IHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzXG4gKiBwYWNrYWdlIG1hbmFnZXIgd291bGQgbGluayAoaXNzdWUgIzEwMDgpOiBCdW4gcmVwb3MgdXNlIHRoZSBzaGFyZWQgQnVuLWV4YWN0IHJlc29sdmVyXG4gKiAobmVnYXRpb25zLCBwaW5uZWQgcG9zaXRpdmVzLCBhbmQgYmFzZWxpbmUtc2VlZGluZyBuZWdhdGlvbnMgaW5jbHVkZWQpLCB3aGlsZSBZYXJuIHJlcG9zIGtlZXBcbiAqIGdsb2Igc2VtYW50aWNzIOKAlCBCdW4tb25seSBydWxlcyBzdWNoIGFzIHRoZSBpbXBsaWNpdCBiYXNlbGluZSB3b3VsZCBpbnZlbnQgd29ya3NwYWNlcyBZYXJuXG4gKiBuZXZlciBsaW5rcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocm9vdFByb2plY3QpO1xuICByZXR1cm4gW1xuICAgIHJvb3RQcm9qZWN0LFxuICAgIC4uLndvcmtzcGFjZURpclBhdGhzLm1hcChcbiAgICAgIC8vIFRoZSBmYWxsYmFjayBrZWVwcyBhIHdvcmtzcGFjZSB3aG9zZSBtYW5pZmVzdCB2YW5pc2hlZCBhZnRlciB0aGUgZ2xvYiAoZmluZFNlbGZQcm9qZWN0XG4gICAgICAvLyB3b3VsZCBkcm9wIGl0KSBkaXNjb3ZlcmVkLCBtYXRjaGluZyB0aGUgbG9uZy1zdGFuZGluZyBkaXJlY3QgY29uc3RydWN0aW9uLlxuICAgICAgKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIGZpbmRTZWxmUHJvamVjdChhcmd2LCBsb2FkRW52LCB3b3Jrc3BhY2VEaXJQYXRoKSA/PyBuZXcgUHJvamVjdCh3b3Jrc3BhY2VEaXJQYXRoLCBhcmd2LCBsb2FkRW52KVxuICAgICksXG4gIF07XG59XG5cbi8qKlxuICogVGhlIGFic29sdXRlIGRpcmVjdG9yeSBvZiBldmVyeSB3b3Jrc3BhY2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyIHdvdWxkIGxpbmssXG4gKiBtYXRjaGluZyB0aGUgbWFuYWdlciB0aGUgd2F5IGdldEFsbERlc2NlbmRhbnRQcm9qZWN0cyBkZXNjcmliZXMuIEV4cG9ydGVkIGZvciB3YiByZWxlYXNlLCB3aG9zZVxuICogcGx1Z2luIGluc3BlY3Rpb24sIG5vZGVfbW9kdWxlcyBjbGVhbnVwLCBhbmQgbWFuaWZlc3QgcmV3cml0aW5nIG11c3Qgc2VlIHRoZSBzYW1lIHdvcmtzcGFjZSBzZXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUJ1bldvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzLCBwcm9qZWN0LmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgKTtcbiAgfVxuICAvLyBZYXJuIDEuMjIuMjIgcmVzb2x2ZXMgZWFjaCBkZWNsYXJlZCBwYXR0ZXJuIChhcnJheSBvciBgeyBwYWNrYWdlczogW+KApl0gfWAgZm9ybSkgaW5kZXBlbmRlbnRseVxuICAvLyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLCBzbyBhIGxlYWRpbmctYCFgIHBhdHRlcm4gaXMgbm90IGFuIGV4Y2x1c2lvbiDigJQgYFtcInBhY2thZ2VzLypcIixcbiAgLy8gXCIhcGFja2FnZXMvYVwiXWAgc3RpbGwgbGlua3MgcGFja2FnZXMvYS4gWWFybiBhZGRpdGlvbmFsbHkgaWdub3JlcyBtYW5pZmVzdHMgbWlzc2luZyBhIG5hbWUgb3JcbiAgLy8gdmVyc2lvbiAoXCJNaXNzaW5nIHZlcnNpb24gaW4gd29ya3NwYWNlIOKApiwgaWdub3JpbmcuXCIpLCBidXQgdGhhdCBpcyBkZWxpYmVyYXRlbHkgTk9UIG1pcnJvcmVkOlxuICAvLyB3YidzIGRlc2NlbmRhbnQgZGlzY292ZXJ5IGV4aXN0cyB0byBydW4gY29tbWFuZHMgKGxpbnQsIHRlc3QsIHR5cGVjaGVjaywg4oCmKSBpbiBzdWItcGFja2FnZXMsXG4gIC8vIGFuZCB2ZXJzaW9uLWxlc3MgcHJpdmF0ZSBwYWNrYWdlcyBtdXN0IHN0YXkgZGlzY292ZXJlZCDigJQgdGhlIGxvbmctc3RhbmRpbmcgYmVoYXZpb3Igd2Inc1xuICAvLyBtb25vcmVwbyBmaXh0dXJlcyBlbmNvZGUuIEdsb2IgZm9yIHRoZSBtYW5pZmVzdHMgdGhlbXNlbHZlczogZ2xvYmJ5J3MgYG9ubHlEaXJlY3Rvcmllc2BcbiAgLy8gd291bGQgcmV0dXJuIGEgbGl0ZXJhbCBkaXJlY3RvcnkgcGF0dGVybidzIENISUxEUkVOIGluc3RlYWQgb2YgdGhlIGRpcmVjdG9yeS4gVGhlIHJlYWxwYXRoXG4gIC8vIGNvbnRhaW5tZW50IG1pcnJvcnMgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHM6IGEgd29ya3NwYWNlIHN5bWxpbmsgZXNjYXBpbmcgdGhlXG4gIC8vIHJlcG9zaXRvcnkgbXVzdCBub3QgbGV0IGNvbnN1bWVycyB0b3VjaCBhbm90aGVyIGNoZWNrb3V0LlxuICBjb25zdCBwb3NpdGl2ZVBhdHRlcm5zID0gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpLmZpbHRlcihcbiAgICAocGF0dGVybikgPT4gIXBhdHRlcm4uc3RhcnRzV2l0aCgnIScpICYmIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybihwYXR0ZXJuKVxuICApO1xuICBpZiAocG9zaXRpdmVQYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgLy8gZXhwYW5kRGlyZWN0b3JpZXM6IGZhbHNlIOKAlCBnbG9iYnkgd291bGQgb3RoZXJ3aXNlIGV4cGFuZCBhIGxpdGVyYWwgZGlyZWN0b3J5IHBhdHRlcm4gdG8gaXRzXG4gIC8vIENISUxEUkVOLCB0dXJuaW5nIGUuZy4gYHBhY2thZ2VzYCBpbnRvIG1hdGNoZXMgZm9yIGV2ZXJ5IHBhY2thZ2VzLyogc3ViZGlyZWN0b3J5LlxuICBjb25zdCBnbG9iYnlPcHRpb25zID0ge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGV4cGFuZERpcmVjdG9yaWVzOiBmYWxzZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gIH07XG4gIC8vIGZhc3QtZ2xvYiAoZ2xvYmJ5J3MgZW5naW5lKSByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCkgYWx0aG91Z2ggWWFybiBsaW5rcyBzdWNoIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnNcbiAgLy8gb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnkgZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmdcbiAgLy8gdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpciBtYW5pZmVzdHMgY29tcGxlbWVudHMgdGhlIG1hbmlmZXN0IGdsb2IuXG4gIGNvbnN0IGdsb2JiZWRNYW5pZmVzdFBhdGhzID0gYXdhaXQgZ2xvYmJ5KFxuICAgIHBvc2l0aXZlUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiBwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICBnbG9iYnlPcHRpb25zXG4gICk7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aFNldCA9IG5ldyBTZXQoZ2xvYmJlZE1hbmlmZXN0UGF0aHMpO1xuICBjb25zdCBxdWVzdGlvbk1hcmtQYXR0ZXJucyA9IHBvc2l0aXZlUGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLmluY2x1ZGVzKCc/JykpO1xuICBpZiAocXVlc3Rpb25NYXJrUGF0dGVybnMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBhd2FpdCBnbG9iYnkocXVlc3Rpb25NYXJrUGF0dGVybnMsIHsgLi4uZ2xvYmJ5T3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgbWFuaWZlc3RQYXRoKSkpIG1hbmlmZXN0UGF0aFNldC5hZGQobWFuaWZlc3RQYXRoKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWFuaWZlc3RQYXRocyA9IFsuLi5tYW5pZmVzdFBhdGhTZXRdO1xuICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocHJvamVjdC5kaXJQYXRoKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBtYW5pZmVzdFBhdGhzXG4gICAgLy8gQSBgKipgIHBhdHRlcm4gcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCBhbmQgaW5zdGFsbGVkIHBhY2thZ2VzLCBidXQgbmVpdGhlciBpcyBhXG4gICAgLy8gd29ya3NwYWNlIHRvIFlhcm4gKHdoaWNoIG5ldmVyIGRlc2NlbmRzIGludG8gbm9kZV9tb2R1bGVzKS5cbiAgICAuZmlsdGVyKChtYW5pZmVzdFBhdGgpID0+IHtcbiAgICAgIGlmIChtYW5pZmVzdFBhdGggPT09ICdwYWNrYWdlLmpzb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG1hbmlmZXN0UGF0aCkpKTtcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgbWFuaWZlc3QgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGw6IG5vdCBhIHdvcmtzcGFjZS5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pXG4gICAgLm1hcCgobWFuaWZlc3RQYXRoKSA9PiBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUobWFuaWZlc3RQYXRoKSkpO1xuICByZXR1cm4gWy4uLm5ldyBTZXQod29ya3NwYWNlRGlyUGF0aHMpXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHBhY2thZ2UncyBvd24gY29tbWl0dGVkIC5naXRpZ25vcmUgY2FycmllcyB3YmZ5J3MgbWFuYWdlZCBydWxlIGZvciB0aGUgZmlsZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGBnaXQgY2hlY2staWdub3JlYDogdGhhdCBhbHNvIGhvbm9ycyBgLmdpdC9pbmZvL2V4Y2x1ZGVgIGFuZCB0aGUgdXNlcidzIGdsb2JhbFxuICogZXhjbHVkZXMsIHdoaWNoIGEgZnJlc2ggY2xvbmUgYW5kIENJIGRvIG5vdCBoYXZlLiBBIGRldmVsb3BlciB3aXRoIGEgcGVyc29uYWxcbiAqIGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzYCBleGNsdWRlIHdvdWxkIG90aGVyd2lzZSB0dXJuIGdlbmVyYXRpb24gb24gZm9yIGEgcGFja2FnZSB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0aGUgcmVzdWx0aW5nIGZpbGUgd291bGQgYmUgaW52aXNpYmxlIGluIGBnaXQgc3RhdHVzYC5cbiAqIGBwYWNrYWdlcy93YmZ5L3NyYy9maXhlcnMvd29ya2VyVHlwZXMudHNgIGdhdGVzIG9uIHRoZSBzYW1lIGNvbW1pdHRlZCBydWxlLlxuICovXG5mdW5jdGlvbiBoYXNNYW5hZ2VkR2l0aWdub3JlUnVsZShkaXJQYXRoOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICcuZ2l0aWdub3JlJyksICd1dGY4JylcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW0oKSA9PT0gYC8ke2ZpbGVOYW1lfWApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcGFja2FnZSBzY3JpcHQgcnVucyBhIGB3cmFuZ2xlciB0eXBlc2AgdGhhdCB3b3VsZCB3cml0ZSBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0IHRoZSBiYXJlXG4gKiBpbnZvY2F0aW9uIHdyaXRlcy4gYC0tY2hlY2tgL2AtLWhlbHBgIHZhbGlkYXRlIG9yIHByaW50IGFuZCB3cml0ZSBub3RoaW5nLCBzbyB0aGV5IGRvIG5vdCBjb3VudC4gYC0tZW52LWZpbGVgXG4gKiBjb3VudHMgd2hlbmV2ZXIgYSBmaWxlIGl0IG5hbWVzIEVYSVNUUzogdGhlIGZsYWcgc2VsZWN0cyB3aGF0IHdyYW5nbGVyIHJlYWRzIHRvIGluZmVyIGxvY2FsIHZhcnMgYW5kIHNlY3JldHMsXG4gKiBzbyB0aGUgYmFyZSBpbnZvY2F0aW9uIGhlcmUgd291bGQgcmVnZW5lcmF0ZSBhIHNtYWxsZXIgYEVudmAuIE1pcnJvcnMgd2JmeSdzIGBoYXNDdXN0b21XcmFuZ2xlclR5cGVzSW52b2NhdGlvbmBcbiAqIChpbmNsdWRpbmcgaXRzIGBuYW1lc09ubHlNaXNzaW5nRW52RmlsZXNgIHJ1bGUpOyB0aGUgdHdvIG11c3QgYWdyZWUsIHNpbmNlIHdiZnkncyBhbnN3ZXIgZGVjaWRlcyB0aGVcbiAqIGdpdGlnbm9yZSBydWxlIHRoaXMgcHJlZGljYXRlIGtleXMgb24uXG4gKi9cbmZ1bmN0aW9uIGhhc091dHB1dENoYW5naW5nV3JhbmdsZXJUeXBlcyhzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgd3JhbmdsZXJUeXBlc1BhdHRlcm4gPSAvKD86XnxcXHMpd3JhbmdsZXJcXHMrdHlwZXMoPzpcXHN8JCkvdTtcbiAgY29uc3QgZW52RmlsZU9ubHlQYXR0ZXJuID0gL14oPzooPzpidW54fG5weClcXHMrfCg/Onlhcm58cG5wbSlcXHMrZGx4XFxzKyk/d3JhbmdsZXJcXHMrdHlwZXMoPzpcXHMrLS1lbnYtZmlsZVxccytcXFMrKSokL3U7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4ge1xuICAgIGlmICghc2NyaXB0IHx8ICF3cmFuZ2xlclR5cGVzUGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBDaGVja2VkIG9uIHRoZSBXSE9MRSBzY3JpcHQsIGJlZm9yZSBzcGxpdHRpbmc6IGBjZCBzdWIgJiYgd3JhbmdsZXIgdHlwZXNgIHJ1bnMgdGhlIGdlbmVyYXRvciBpbiBhbm90aGVyXG4gICAgLy8gZGlyZWN0b3J5IGFnYWluc3QgYW5vdGhlciBjb25maWcsIGJ1dCBpdHMgc2Vjb25kIHNlZ21lbnQgYWxvbmUgbG9va3MgbGlrZSBhIHBsYWluIGludm9jYXRpb24uIHdiZnlcbiAgICAvLyBjbGFzc2lmaWVzIGFueSBzY3JpcHQgY2FycnlpbmcgdGhpcyBzeW50YXggYXMgY3VzdG9tLCBhbmQgdGhlIHR3byBwcmVkaWNhdGVzIG11c3QgYWdyZWUuXG4gICAgaWYgKC9bO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3UudGVzdChzY3JpcHQpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gc2NyaXB0XG4gICAgICAuc3BsaXQoJyYmJylcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJykpXG4gICAgICAuc29tZSgoc2VnbWVudCkgPT4ge1xuICAgICAgICBpZiAoIXdyYW5nbGVyVHlwZXNQYXR0ZXJuLnRlc3Qoc2VnbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKC8oPzpefFxccykoPzotLWhlbHB8LWgpKD86XFxzfD18JCkvdS50ZXN0KHNlZ21lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIGAtLWNoZWNrYCBjb21wYXJlcyB0aGUgcmVzdWx0IEZPUiBUSEUgU1VQUExJRUQgT1BUSU9OUywgc28gaXQgaXMgb25seSBoYXJtbGVzcyB3aGVuIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAvLyBpbnZvY2F0aW9uIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJhcmUgb25lLlxuICAgICAgICBjb25zdCB3aXRob3V0Q2hlY2sgPSBzZWdtZW50XG4gICAgICAgICAgLnJlcGxhY2UoLyg/Ol58XFxzKS0tY2hlY2soPzpcXHN8PXwkKS91LCAnICcpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJylcbiAgICAgICAgICAudHJpbSgpO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB3aXRob3V0Q2hlY2sgPT09IHNlZ21lbnQgPyBzZWdtZW50IDogd2l0aG91dENoZWNrO1xuICAgICAgICAvLyBOb3QgZXF1aXZhbGVudCB0byB0aGUgYmFyZSBpbnZvY2F0aW9uLCB3aXRoIG9yIHdpdGhvdXQgYC0tY2hlY2tgOiBgLS1jaGVja2AgY29tcGFyZXMgdGhlIHJlc3VsdCBGT1JcbiAgICAgICAgLy8gVEhFIFNVUFBMSUVEIE9QVElPTlMsIHNvIGAtLWNoZWNrIC0tc3RyaWN0LXZhcnM9ZmFsc2VgIHN0aWxsIGRlc2NyaWJlcyBhIGRpZmZlcmVudCBmaWxlLlxuICAgICAgICBpZiAoIWVudkZpbGVPbmx5UGF0dGVybi50ZXN0KGNhbmRpZGF0ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gWy4uLmNhbmRpZGF0ZS5tYXRjaEFsbCgvLS1lbnYtZmlsZVxccysoXFxTKykvZ3UpXS5zb21lKFxuICAgICAgICAgIChtYXRjaCkgPT4gISFtYXRjaFsxXSAmJiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBtYXRjaFsxXSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdCdWlsZCBvdXRwdXQgcGF0aHMgKHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSkgdGhhdCBtdXN0IGV4aXN0IGZvciB0aGUgY2FjaGUgdG8gYmUgdmFsaWQgKGRlZmF1bHQ6IGF1dG8tZGV0ZWN0ZWQgY29tbW9uIG91dHB1dCBkaXJlY3RvcmllcyknLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBidWlsZElmTmVlZGVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdidWlsZElmTmVlZGVkJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBjb2RlIGlmIGNoYW5nZXMgYXJlIGRldGVjdGVkJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgYnVpbGRJZk5lZWRlZChhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZElmTmVlZGVkKFxuICAvLyBUZXN0IGNvZGUgcmVxdWlyZXMgUGFydGlhbDwuLi4+XG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYnVpbGRDb21tYW5kID1cbiAgICBhcmd2LmNvbW1hbmQgPz8gKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uYnVpbGQgPyBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZH0gYnVpbGRgIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFidWlsZENvbW1hbmQpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1NraXAgdG8gYnVpbGQgYmVjYXVzZSBubyBidWlsZCBjb21tYW5kIGlzIGRlZmluZWQuJykpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhcmd2ID0geyAuLi5hcmd2LCBjb21tYW5kOiBidWlsZENvbW1hbmQgfTtcblxuICAvLyBUaGUgY2FjaGUgcmVxdWlyZXMgdGhlIGdpdCByZXBvc2l0b3J5IHJvb3QgdG8gQkUgcm9vdERpclBhdGg6IHBvcmNlbGFpbiBwYXRocyBhbmQgZGlmZlxuICAvLyBwYXRoc3BlY3MgYmVsb3cgYXJlIGpvaW5lZC9leGVjdXRlZCBhZ2FpbnN0IHJvb3REaXJQYXRoLiBXaGVuIHRoZSByZXBvIHJvb3QgaXMgZWxzZXdoZXJlXG4gIC8vIChlLmcuIGEgc3VicHJvamVjdCBvZiBhIGxhcmdlciByZXBvc2l0b3J5KSwgYWx3YXlzIGJ1aWxkIGluc3RlYWQgb2YgbWlzLXJlc29sdmluZyBwYXRocy5cbiAgLy8gQSBmcmVzaGx5IGluaXRpYWxpemVkIHJlcG8gd2l0aG91dCBjb21taXRzICh1bmJvcm4gSEVBRCkgbGlrZXdpc2UgYnVpbGRzIHdpdGhvdXQgY2FjaGluZzpcbiAgLy8gcmVzb2x2aW5nIEhFQUQgd291bGQgZmFpbC5cbiAgY29uc3QgY29tbWl0SGFzaCA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3Qucm9vdERpclBhdGgsICcuZ2l0JykpID8gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YsIGNvbW1pdEhhc2gpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0KTtcbiAgICBpZiAob3V0cHV0UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBXaXRoIG5vIHJlY29yZGVkIG91dHB1dHMsIGEgZGVsZXRlZCBidWlsZCBkaXJlY3RvcnkgY2FuIG5ldmVyIGludmFsaWRhdGUgdGhlIGNhY2hlOyBtYWtlXG4gICAgICAvLyB0aGUgaW5hY3RpdmUgcHJvdGVjdGlvbiB2aXNpYmxlIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseSAoY2YuIGlzc3VlICM5ODEpLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coJ05vIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgZGV0ZWN0ZWQ7IHBhc3MgLS1vdXRwdXQgdG8gZW5hYmxlIG1pc3Npbmctb3V0cHV0IGNhY2hlIGludmFsaWRhdGlvbi4nKVxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHsgaGFzaDogY29udGVudEhhc2gsIG91dHB1dFBhdGhzIH0pLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBDb21tb24gYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzIHVzZWQgYWNyb3NzIG9yZyBwcm9qZWN0cyAodmluZXh0L2J1aWxkLXRzIGVtaXQgZGlzdCxcbi8vIE5leHQuanMgZW1pdHMgLm5leHQsIENSQS1zdHlsZSBhcHBzIGVtaXQgYnVpbGQsIGBuZXh0IGV4cG9ydGAgZW1pdHMgb3V0KS5cbmNvbnN0IGRlZmF1bHRPdXRwdXRDYW5kaWRhdGVzID0gWydkaXN0JywgJ2J1aWxkJywgJy5uZXh0JywgJ291dCddO1xuXG5mdW5jdGlvbiBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcmd2Lm91dHB1dD8ubGVuZ3RoID8gYXJndi5vdXRwdXQubWFwKFN0cmluZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRldGVjdEV4aXN0aW5nRGVmYXVsdE91dHB1dFBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcy5maWx0ZXIoKG91dHB1dFBhdGgpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpKTtcbn1cblxuLyoqIEFuIGAtLW91dHB1dGAgdmFsdWUgbWF5IG5hbWUgYSBmaWxlLCBzbyBtYXRjaCB0aGUgZXhhY3QgcGF0aCBhcyB3ZWxsIGFzIGRlc2NlbmRhbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc091dHB1dFBhdGgob3V0cHV0UGF0aHM6IHN0cmluZ1tdLCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXRQYXRocy5zb21lKChvdXRwdXRQYXRoKSA9PiBmaWxlUGF0aCA9PT0gb3V0cHV0UGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke291dHB1dFBhdGh9L2ApKTtcbn1cblxuLyoqIFRoZSBIRUFEIGNvbW1pdCBoYXNoLCBvciB1bmRlZmluZWQgb24gYW4gdW5ib3JuIEhFQUQgKGEgcmVwbyB3aXRob3V0IGNvbW1pdHMpLiAqL1xuZnVuY3Rpb24gZ2V0R2l0Q29tbWl0SGFzaChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIFsncmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgJ0hFQUQnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgfSk7XG4gIHJldHVybiByZXQuc3RhdHVzID09PSAwID8gcmV0LnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4pOiBib29sZWFuIHtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSdW4gJyR7YXJndi5jb21tYW5kfSdgKSk7XG4gIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhhcmd2LmNvbW1hbmQgPz8gJycsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IGlnbm9yaW5nRW52VmFyTmFtZXMgPSBuZXcgU2V0KFsnQ0knLCAnUFdERUJVRycsICdUTVBESVInXSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgY29tbWl0SGFzaDogc3RyaW5nXG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICAvLyBUaGUgaW52b2tlZCBidWlsZCBjb21tYW5kIGlzIHBhcnQgb2YgdGhlIGNhY2hlIGlkZW50aXR5OiBgLWMgY29tbWFuZEJgIG11c3Qgbm90IHJldXNlIGFcbiAgLy8gY2FjaGUgcmVjb3JkZWQgZm9yIGNvbW1hbmRBIHdpdGggb3RoZXJ3aXNlIHVuY2hhbmdlZCBpbnB1dHMuXG4gIGhhc2gudXBkYXRlKGFyZ3YuY29tbWFuZCA/PyAnJyk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRKc29uID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgT2JqZWN0LmVudHJpZXMocHJvamVjdC5lbnYpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWlnbm9yaW5nRW52VmFyTmFtZXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpXG4gICk7XG4gIGhhc2gudXBkYXRlKGVudmlyb25tZW50SnNvbik7XG5cbiAgYXdhaXQgdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KHByb2plY3QsIGFyZ3YsIGhhc2gpO1xuICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2guZGlnZXN0KCdoZXgnKTtcblxuICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIGNvbnN0IGNhY2hlID0gcGFyc2VCdWlsZENhY2hlKGNhY2hlZENvbnRlbnQpO1xuICBpZiAoY2FjaGU/Lmhhc2ggIT09IGNvbnRlbnRIYXNoKSByZXR1cm4gW2ZhbHNlLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG5cbiAgLy8gVGhlIGNhY2hlIGlzIHZhbGlkIG9ubHkgd2hpbGUgdGhlIHJlY29yZGVkIChvciBleHBsaWNpdGx5IHJlcXVlc3RlZCkgYnVpbGQgb3V0cHV0cyBzdGlsbFxuICAvLyBleGlzdDogYSBkZWxldGVkIG91dHB1dCBkaXJlY3RvcnkgKGUuZy4gYHJtIC1yZiBkaXN0YCkgbXVzdCB0cmlnZ2VyIGEgcmVidWlsZCBldmVuIHdoZW4gdGhlXG4gIC8vIGlucHV0cyBhcmUgdW5jaGFuZ2VkIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85ODEpLlxuICBjb25zdCByZXF1aXJlZE91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBjYWNoZS5vdXRwdXRQYXRocztcbiAgY29uc3QgbWlzc2luZ091dHB1dFBhdGhzID0gcmVxdWlyZWRPdXRwdXRQYXRocy5maWx0ZXIoXG4gICAgKG91dHB1dFBhdGgpID0+ICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIG91dHB1dFBhdGgpKVxuICApO1xuICBpZiAobWlzc2luZ091dHB1dFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KGBSZWJ1aWxkaW5nIGJlY2F1c2UgYnVpbGQgb3V0cHV0cyBhcmUgbWlzc2luZzogJHttaXNzaW5nT3V0cHV0UGF0aHMuam9pbignLCAnKX1gKSk7XG4gICAgcmV0dXJuIFtmYWxzZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xuICB9XG4gIHJldHVybiBbdHJ1ZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJ1aWxkQ2FjaGUoY2FjaGVkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBoYXNoOiBzdHJpbmc7IG91dHB1dFBhdGhzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWRDb250ZW50KSByZXR1cm47XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjYWNoZWRDb250ZW50KSBhcyB7IGhhc2g/OiB1bmtub3duOyBvdXRwdXRQYXRocz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHBhcnNlZD8uaGFzaCAhPT0gJ3N0cmluZycpIHJldHVybjtcbiAgICBjb25zdCBvdXRwdXRQYXRocyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLm91dHB1dFBhdGhzKVxuICAgICAgPyBwYXJzZWQub3V0cHV0UGF0aHMuZmlsdGVyKChwKSA9PiB0eXBlb2YgcCA9PT0gJ3N0cmluZycpXG4gICAgICA6IFtdO1xuICAgIHJldHVybiB7IGhhc2g6IHBhcnNlZC5oYXNoLCBvdXRwdXRQYXRocyB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBBIGxlZ2FjeSBjYWNoZSBmaWxlIGNvbnRhaW5zIGEgcmF3IGNvbnRlbnQgaGFzaCB3aXRob3V0IG91dHB1dCByZWNvcmRzLiBUcmVhdCBpdCBhcyBhIG1pc3M6XG4gICAgLy8gaG9ub3JpbmcgaXQgd291bGQgbGV0IGEgbWF0Y2hpbmcgaGFzaCBza2lwIGEgYnVpbGQgd2hvc2Ugb3V0cHV0cyB3ZXJlIGRlbGV0ZWQsIGFuZCBvbmVcbiAgICAvLyByZWJ1aWxkIHVwZ3JhZGVzIHRoZSByZWNvcmQgdG8gdGhlIEpTT04gZm9ybWF0LlxuICAgIHJldHVybjtcbiAgfVxufVxuXG4vLyBNYXRjaGVkIGFzIGNvbXBsZXRlIHBhdGggU0VHTUVOVFMgKG5vdCBzdWJzdHJpbmdzKTogYHNyYy9jb250ZXN0L2AgbXVzdCBub3QgYmUgZXhjbHVkZWQgYnlcbi8vIGB0ZXN0YCwgYW5kIGBteXNyYy9gIG11c3Qgbm90IGJlIGluY2x1ZGVkIGJ5IGBzcmNgLlxuY29uc3QgaW5jbHVkZURpck5hbWVzID0gbmV3IFNldChbJ3NyYycsICdwdWJsaWMnXSk7XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG4gICdidW4ubG9jaycsXG4gICdidW4ubG9ja2InLFxuXTtcbmNvbnN0IGV4Y2x1ZGVEaXJOYW1lcyA9IG5ldyBTZXQoWyd0ZXN0JywgJ3Rlc3RzJywgJ19fdGVzdHNfXycsICd0ZXN0LWZpeHR1cmVzJ10pO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAvLyBgLXVhbGxgIGxpc3RzIHVudHJhY2tlZCBmaWxlcyBpbmRpdmlkdWFsbHkgKG5vdCBqdXN0IHRoZWlyIGRpcmVjdG9yeSksIHNvIG5ldyBmaWxlcyBpbiBhXG4gICAgLy8gYnJhbmQtbmV3IHNvdXJjZSBkaXJlY3RvcnkgcGFydGljaXBhdGUgaW4gdGhlIGhhc2ggYmVsb3cuIGAtemAgeWllbGRzIE5VTC1kZWxpbWl0ZWQsXG4gICAgLy8gVU5RVU9URUQgcmVjb3Jkczogd2l0aG91dCBpdCBnaXQgQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzLCB3aGljaCB3b3VsZCBzaWxlbnRseSBkcm9wIHRob3NlXG4gICAgLy8gZmlsZXMgZnJvbSBib3RoIHRoZSB1bnRyYWNrZWQgaGFzaGluZyBhbmQgdGhlIGBnaXQgZGlmZmAgcGF0aHNwZWNzLlxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBbJ3N0YXR1cycsICctLXBvcmNlbGFpbicsICctdWFsbCcsICcteiddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICB9KTtcbiAgICBjb25zdCB0b2tlbnMgPSByZXQuc3Rkb3V0LnNwbGl0KCdcXDAnKS5maWx0ZXIoKHRva2VuKSA9PiB0b2tlbi5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBzdGF0dXNFbnRyaWVzOiB7IHVudHJhY2tlZDogYm9vbGVhbjsgZmlsZVBhdGg6IHN0cmluZyB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRva2VuLnNsaWNlKDAsIDIpO1xuICAgICAgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBzdGF0dXMgPT09ICc/PycsIGZpbGVQYXRoOiB0b2tlbi5zbGljZSgzKSB9KTtcbiAgICAgIC8vIFJlbmFtZS9jb3B5IHJlY29yZHMgY2FycnkgdGhlIE9SSUdJTkFMIHBhdGggYXMgYW4gZXh0cmEgTlVMLWRlbGltaXRlZCBmaWVsZDsgaW5jbHVkZSBpdFxuICAgICAgLy8gc28gYSBmaWxlIHJlbmFtZWQgb3V0IG9mIHRoZSBidWlsZCBpbnB1dHMgc3RpbGwgaW52YWxpZGF0ZXMgdGhlIGNhY2hlLlxuICAgICAgaWYgKHN0YXR1cy5pbmNsdWRlcygnUicpIHx8IHN0YXR1cy5pbmNsdWRlcygnQycpKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUGF0aCA9IHRva2Vuc1srK2luZGV4XTtcbiAgICAgICAgaWYgKG9yaWdpbmFsUGF0aCkgc3RhdHVzRW50cmllcy5wdXNoKHsgdW50cmFja2VkOiBmYWxzZSwgZmlsZVBhdGg6IG9yaWdpbmFsUGF0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZEVudHJpZXMgPSBzdGF0dXNFbnRyaWVzLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIGhhc2hQYXRoOlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0J1xuICAgICAgICAgID8gZW50cnkuZmlsZVBhdGgucmVwbGFjZSgvcGFja2FnZXNcXC93YlxcL3Rlc3RcXC9maXh0dXJlc1xcL1teL10rXFwvLywgJycpXG4gICAgICAgICAgOiBlbnRyeS5maWxlUGF0aCxcbiAgICB9KSk7XG4gICAgLy8gQnVpbGQgT1VUUFVUUyBtdXN0IG5ldmVyIGNvdW50IGFzIGJ1aWxkIGlucHV0czogaGFzaGluZyBlLmcuIGFuIHVudHJhY2tlZCBkaXN0LyBmaWxlIHdvdWxkXG4gICAgLy8gY2hhbmdlIHRoZSBoYXNoIG9uIGV2ZXJ5IGJ1aWxkIGFuZCBkaXNhYmxlIHRoZSBjYWNoZSBwZXJtYW5lbnRseS5cbiAgICBjb25zdCBwcm9qZWN0UmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LnJvb3REaXJQYXRoLCBwcm9qZWN0LmRpclBhdGgpO1xuICAgIGNvbnN0IGV4cGxpY2l0T3V0cHV0UGF0aHMgPSAoZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBbXSkubWFwKChvdXRwdXRQYXRoKSA9PlxuICAgICAgcGF0aC5qb2luKHByb2plY3RSZWxhdGl2ZURpclBhdGgsIG91dHB1dFBhdGgpXG4gICAgKTtcbiAgICBjb25zdCBmaWx0ZXJlZEVudHJpZXMgPSBub3JtYWxpemVkRW50cmllcy5maWx0ZXIoKHsgZmlsZVBhdGgsIGhhc2hQYXRoIH0pID0+IHtcbiAgICAgIGNvbnN0IGRpcmVjdG9yeVNlZ21lbnRzID0gaGFzaFBhdGguc3BsaXQoJy8nKS5zbGljZSgwLCAtMSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZGlyZWN0b3J5U2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gaW5jbHVkZURpck5hbWVzLmhhcyhzZWdtZW50KSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gaGFzaFBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFkaXJlY3RvcnlTZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBleGNsdWRlRGlyTmFtZXMuaGFzKHNlZ21lbnQpKSAmJlxuICAgICAgICAvLyBPbmx5IEVYUExJQ0lUTFkgZGVjbGFyZWQgb3V0cHV0cyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgaW5wdXQgaGFzaC4gRGVmYXVsdCBjYW5kaWRhdGVzXG4gICAgICAgIC8vIChkaXN0L2J1aWxkLy5uZXh0L291dCkgYXJlIE5PVDogZ2l0aWdub3JlZCBhcnRpZmFjdHMgbmV2ZXIgYXBwZWFyIGluIGBnaXQgc3RhdHVzYFxuICAgICAgICAvLyBhbnl3YXksIGFuZCBhIG5vbi1pZ25vcmVkIGZpbGUgdGhlcmUgbWF5IGJlIGdlbnVpbmUgc291cmNlIChlLmcuIGJ1aWxkLyBzY3JpcHRzKSwgd2hvc2VcbiAgICAgICAgLy8gY2hhbmdlcyBtdXN0IGludmFsaWRhdGUgdGhlIGNhY2hlIOKAlCBjb3JyZWN0bmVzcyBvdmVyIGNhY2hlIGhpdHMuIFByb2plY3RzIGtlZXBpbmdcbiAgICAgICAgLy8gbm9uLWlnbm9yZWQgYXJ0aWZhY3RzIGluIHRob3NlIGRpcmVjdG9yaWVzIHNob3VsZCBnaXRpZ25vcmUgdGhlbSBvciBwYXNzIC0tb3V0cHV0LlxuICAgICAgICAhbWF0Y2hlc091dHB1dFBhdGgoZXhwbGljaXRPdXRwdXRQYXRocywgZmlsZVBhdGgpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgQ2hhbmdlZCBmaWxlczogJHtmaWx0ZXJlZEVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkuaGFzaFBhdGgpLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gVW50cmFja2VkIGZpbGVzIG5ldmVyIGFwcGVhciBpbiBgZ2l0IGRpZmZgLCBzbyBoYXNoIHRoZWlyIGNvbnRlbnRzIGRpcmVjdGx5LlxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmlsdGVyZWRFbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnVudHJhY2tlZCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhc2gudXBkYXRlKGVudHJ5Lmhhc2hQYXRoKTtcbiAgICAgICAgaGFzaC51cGRhdGUoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCBlbnRyeS5maWxlUGF0aCkpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgZmlsZSBtYXkgdmFuaXNoIGNvbmN1cnJlbnRseTsgdGhlIHRyYWNrZWQtc3RhdGUgZGlmZiBiZWxvdyBpcyB1bmFmZmVjdGVkLlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrZWRQYXRocyA9IGZpbHRlcmVkRW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiAhZW50cnkudW50cmFja2VkKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5oYXNoUGF0aCk7XG4gICAgaWYgKHRyYWNrZWRQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIGBnaXQgZGlmZiBIRUFEIC0tYCB3aXRoIG5vIHBhdGhzcGVjIHdvdWxkIGRpZmYgRVZFUlkgZmlsZSwgbGV0dGluZyBleGNsdWRlZCBjaGFuZ2VzXG4gICAgICAvLyAoZG9jcywgdGVzdHMpIGludmFsaWRhdGUgdGhlIGNhY2hlLlxuICAgICAgcmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBgZ2l0IGRpZmYgSEVBRGAgKG5vdCBwbGFpbiBgZ2l0IGRpZmZgKSBzbyBzdGFnZWQtb25seSBjaGFuZ2VzIGludmFsaWRhdGUgdGhlIGNhY2hlIHRvbztcbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGguXG4gICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oJ2dpdCcsIFsnZGlmZicsICdIRUFEJywgJy0tJywgLi4udHJhY2tlZFBhdGhzXSwgeyBjd2Q6IHByb2plY3Qucm9vdERpclBhdGggfSk7XG4gICAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoZGF0YSk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnRGF0YTonLCBkYXRhKTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdIYXNoOicsIGhhc2guY29weSgpLmRpZ2VzdCgnaGV4JykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGNpPzogYm9vbGVhbjtcbiAgZXhpdElmRmFpbGVkPzogYm9vbGVhbjtcbiAgb25TaWduYWw/OiAoc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHZvaWQ7XG4gIG9taXRTaWxlbnRTdGFydD86IGJvb2xlYW47XG4gIHByZXNlcnZlQ29sb3I/OiBib29sZWFuO1xuICBwcm9jZXNzU2lsZW50T3V0cHV0PzogKG91dHB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHByaW50UmF3T3V0cHV0PzogYm9vbGVhbjtcbiAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5PzogYm9vbGVhbjtcbiAgc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBzaWxlbnRTdWNjZXNzTWVzc2FnZT86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gIGV4aXRJZkZhaWxlZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSdW5SZXN1bHQge1xuICBleGl0Q29kZTogbnVtYmVyO1xuICBvdXRwdXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTcGF3bihcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYgeyBzaWxlbnQ/OiBib29sZWFuIH0sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICBpZiAoIShhcmd2LnNpbGVudCAmJiBvcHRzLm9taXRTaWxlbnRTdGFydCAmJiAhYXJndi5kcnlSdW4pKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgYXJndi5zaWxlbnQgPyAnQ29tbWFuZCcgOiAnU3RhcnQnKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHJhdyknLCB0cnVlKTtcbiAgfVxuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3Qgc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCA9IEJvb2xlYW4oXG4gICAgYXJndi5zaWxlbnQgJiYgKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/PyBvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSlcbiAgKTtcbiAgbGV0IHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgY29uc3QgcHJvZ3Jlc3NUaW1lciA9XG4gICAgYXJndi5zaWxlbnQgJiYgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXNcbiAgICAgID8gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuJyk7XG4gICAgICAgICAgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0sIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IChhcmd2LnNpbGVudCA/IHRydWUgOiB1bmRlZmluZWQpIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiBhcmd2LnNpbGVudCA/ICdwaXBlJyA6ICdpbmhlcml0JyxcbiAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nOiBhcmd2LnNpbGVudCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmIChwcm9ncmVzc1RpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHByb2dyZXNzVGltZXIpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAod3JvdGVTaWxlbnRQcm9ncmVzcykge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxuICBpZiAoc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCAmJiAoIW9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5IHx8IGV4aXRDb2RlICE9PSAwKSkge1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPyBvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQocmV0LnN0ZG91dCkgOiByZXQuc3Rkb3V0KS50cmltKCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFyZ3Yuc2lsZW50ICYmIGV4aXRDb2RlID09PSAwICYmIG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4ob3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkpO1xuICB9XG4gIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgZXhpdENvZGUsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChwYXJhbGxlbCknLCB0cnVlKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydGVkIChsb2cpJyk7XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXQuc3Rkb3V0LnRyaW0oKTtcbiAgICBpZiAob3V0ICYmICFvcHRzLnByaW50UmF3T3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCByZXQuc3RhdHVzLCBvcHRzKTtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA/PyAxO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8QnVmZmVyZWRSdW5SZXN1bHQ+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICAgIG91dHB1dDogJycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXhpdENvZGU6IHJldC5zdGF0dXMgPz8gMSxcbiAgICAgIG91dHB1dDogcmV0LnN0ZG91dCxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhcGl0YWxpemVkIGNvbW1hbmRzIChlLmcuLCBZQVJOLCBQUklTTUEsIEJVTikgd2l0aCBzdWl0YWJsZSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQ6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IHsgcHJpbnRhYmxlOiBzdHJpbmc7IHJ1bm5hYmxlOiBzdHJpbmcgfSB7XG4gIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzIHJlcXVpcmluZ1xuICAvLyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICBjb25zdCBwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVuID0gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIGxldCBuZXdTY3JpcHQgPSBzY3JpcHRcbiAgICAucmVwbGFjZUFsbCgnXFxuJywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcc1xccysvZywgJyAnKVxuICAgIC5yZXBsYWNlQWxsKC9QUklTTUEgZ2VuZXJhdGUoPyFcXHMrLS1uby1oaW50cykoPz1cXHN8JCkvZ3UsICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cycpXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiBydW4gJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1bikgcnVuYC5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ3lhcm4gcnVuICcpO1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gcnVuIGJ1biBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IG5ld1NjcmlwdFxuICAgIC8vIEtlZXAgUGxheXdyaWdodCBhcyBhIHBhY2thZ2UtbWFuYWdlciBjb21tYW5kIGluc3RlYWQgb2YgcmVzb2x2aW5nIGl0IHRocm91Z2ggbm9kZV9tb2R1bGVzLy5iaW4uXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGNvbmZpZ3VyZUNvbG9yRW52KG5ld0Vudiwgb3B0cy5wcmVzZXJ2ZUNvbG9yKTtcbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGNoaWxkLXByb2Nlc3MgY29sb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB3Yi1tYW5hZ2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjaGlsZC1wcm9jZXNzIGVudmlyb25tZW50IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSBwcmVzZXJ2ZUNvbG9yIFdoZXRoZXIgd2Igc2hvdWxkIHByZXNlcnZlIGNvbG9ycyBmb3Igb3V0cHV0IHRoYXQgaXQgY2FwdHVyZXMgYW5kIHJlcHJpbnRzIHRvIGFuIGludGVyYWN0aXZlIFRUWS5cbiAqL1xuZnVuY3Rpb24gY29uZmlndXJlQ29sb3JFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoZW52Lk5PX0NPTE9SICE9PSB1bmRlZmluZWQgfHwgcHJlc2VydmVDb2xvciA9PT0gZmFsc2UpIHtcbiAgICAvLyBOT19DT0xPUiBhbmQgcHJlc2VydmVDb2xvcj1mYWxzZSBhcmUgZXhwbGljaXQgbm8tY29sb3IgY2hvaWNlcywgc28gaW5oZXJpdGVkIEZPUkNFX0NPTE9SIG11c3Qgbm90IGxlYWsgdGhyb3VnaC5cbiAgICBkZWxldGUgZW52LkZPUkNFX0NPTE9SO1xuICB9IGVsc2UgaWYgKHByZXNlcnZlQ29sb3IgJiYgcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICBlbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGNoZWNrRW52QnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgY2hlY2tFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBjaGVja0VudkJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY2hlY2stZW52JyxcbiAgZGVzY3JpYmU6XG4gICAgJ1ZlcmlmeSB0aGF0IGV2ZXJ5IGZub3gtZGVjbGFyZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHNlY3JldCByZXNvbHZlcyBmb3IgdGhlIGN1cnJlbnQgV0JfRU5WLiBQcmVmaXggc2NyaXB0cyB0aGF0IHdyaXRlIHRvIHJlbW90ZSBlbnZpcm9ubWVudHMgd2l0aCB0aGlzIGNvbW1hbmQgdG8gZmFpbCBmYXN0IG9uIG1pc3Npbmcgc2VjcmV0cy4nLFxuICBidWlsZGVyOiBjaGVja0VudkJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGNoZWNrRW52KGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrRW52KFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY2hlY2tFbnZCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICBjb25zb2xlLmluZm8oJ05vIGZub3gudG9tbCBmb3VuZDsgbm90aGluZyB0byBjaGVjay4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWFkaW5nIHByb2plY3QuZW52IHJlc29sdmVzIGFuZCB2YWxpZGF0ZXMgV0JfRU5WIChjb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpLCBzbyB0aGUgcHJvZmlsZVxuICAvLyBiZWxvdyBpcyB0aGUgc2FtZSBvbmUgZXZlcnkgb3RoZXIgd2IgY29tbWFuZCB3b3VsZCBsb2FkLlxuICBjb25zdCBwcm9maWxlID0gcHJvamVjdC5lbnYuV0JfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG4gIC8vIGAtLWlmLW1pc3NpbmcgZXJyb3JgIG1ha2VzIHVucmVzb2x2YWJsZSBzZWNyZXRzIChlLmcuIGEgbWlzc2luZyBhZ2UgaWRlbnRpdHkpIGEgaGFyZCBmYWlsdXJlLFxuICAvLyB1bmxpa2UgdGhlIHRvbGVyYW50IGRlZmF1bHQgdXNlZCBmb3Igb3JkaW5hcnkgZW52IGxvYWRpbmcuXG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgIGBmbm94IGV4cG9ydCAtLWFsbCAtLWZvcm1hdCBqc29uIC0tbm8tZGFlbW9uIC0taWYtbWlzc2luZyBlcnJvciAtLXByb2ZpbGUgJHtwcm9maWxlfSA+IC9kZXYvbnVsbGAsXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gcmVzb2x2ZSBmbm94LWRlY2xhcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgcHJvZmlsZSBcIiR7cHJvZmlsZX1cIi5gKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEFsbCBmbm94LWRlY2xhcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyByZXNvbHZlIGZvciBwcm9maWxlIFwiJHtwcm9maWxlfVwiLmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBGT1JDRV9LSUxMX0RFTEFZX01TID0gNTAwMDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZm9yY2VLaWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCAnU0lHVEVSTScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBzaWduYWwpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGZvcmNlS2lsbFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb3JjZUtpbGxQaWRzID0gc2lnbmFsUGlkcyh0b0NoaWxkUGlkcyhjaGlsZHJlbiksIHNpZ25hbCk7XG4gIGlmIChmb3JjZUtpbGxQaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmIChhd2FpdCB3YWl0Rm9yRm9yY2VLaWxsKGZvcmNlS2lsbFBpZHMpKSB7XG4gICAgc2lnbmFsUGlkcyhmb3JjZUtpbGxQaWRzLCAnU0lHS0lMTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRQaWRzKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gY2hpbGRyZW4uZmxhdE1hcCgoY2hpbGQpID0+IChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2NoaWxkLnBpZF0pKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsUGlkcyhwaWRzOiByZWFkb25seSBudW1iZXJbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IG51bWJlcltdIHtcbiAgY29uc3Qgc2lnbmFsZWRQaWRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBpZCBvZiBwaWRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgha2lsbFByb2Nlc3NHcm91cChwaWQsIHNpZ25hbCkpIGNvbnRpbnVlO1xuXG4gICAgICBzaWduYWxlZFBpZHMucHVzaChwaWQpO1xuICAgICAgdHJlZUtpbGwocGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmFsZWRQaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRm9yY2VLaWxsKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEZPUkNFX0tJTExfREVMQVlfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocGlkcy5ldmVyeShpc1Byb2Nlc3NHcm91cEdvbmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBzbGVlcChNYXRoLm1pbigxMDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NHcm91cEdvbmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgMCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCwgaXNQcm9qZWN0RW52aXJvbm1lbnQsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQsIGdldEQxRGF0YWJhc2VOYW1lLCBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgeyBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uIH0gZnJvbSAnLi9saXRlc3RyZWFtLmpzJztcblxuY2xhc3MgRHJpenpsZVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnY2xlYW51cC1saXRlc3RyZWFtJyk7XG4gICAgY29uc3Qgd2FsQ2hlY2twb2ludENvbW1hbmQgPSBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF0gJiYgY29tbWFuZCAtdiBzcWxpdGUzID4vZGV2L251bGw7IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBzcWxpdGUzIFwiJHtkYlBhdGh9XCI7IGZpYDtcbiAgICByZXR1cm4gYCR7d2FsQ2hlY2twb2ludENvbW1hbmR9OyBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qOyBybSAtUmYgXCIke3BhdGguZGlybmFtZShkYlBhdGgpfS8uJHtwYXRoLmJhc2VuYW1lKGRiUGF0aCl9XCIqIHx8IHRydWVgO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3QgZDFEYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgICBpZiAoZDFEYXRhYmFzZU5hbWUpIHtcbiAgICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBEMSBzdWJ0cmVlIHNvIHRoYXQgb3RoZXIgbG9jYWxseS1wZXJzaXN0ZWQgYmluZGluZ3MgKEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKSBzdXJ2aXZlLFxuICAgICAgLy8gdGhlbiByZS1tYXRlcmlhbGl6ZSB0aGUgRDEgU1FMaXRlIGZpbGUuIEl0cyBwYXRoIGlzIGRldGVybWluaXN0aWMsIHNvIGEgREFUQUJBU0VfVVJMIGV4cG9ydGVkXG4gICAgICAvLyBiZWZvcmUgdGhlIHJlbW92YWwgc3RheXMgdmFsaWQuXG4gICAgICByZXR1cm4gYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfS92My9kMVwiICYmICR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGQxRGF0YWJhc2VOYW1lKX0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZlQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpO1xuICAgIGlmICghcmVtb3ZlQ29tbWFuZCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgcmVzZXQgc3VwcG9ydHMgRHJpenpsZSBvbmx5IHdoZW4gZmlsZTogREFUQUJBU0VfVVJMIGlzIHNldC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtyZW1vdmVDb21tYW5kfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VlZENvbW1hbmQgPSB0aGlzLnNlZWQocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0ZUNvbW1hbmQgPSB0aGlzLmRlcGxveShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlZWRDb21tYW5kID09PSAndHJ1ZScgPyBtaWdyYXRlQ29tbWFuZCA6IGAke21pZ3JhdGVDb21tYW5kfSAmJiAke3NlZWRDb21tYW5kfWA7XG4gIH1cblxuICBtaWdyYXRlRm9yU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgKGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3QpIHx8IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzZXQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIGRlcGxveShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgbWlncmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIGRlcGxveUZvcmNlKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdkZXBsb3ktZm9yY2UnKTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiRmFtaWx5Q29tbWFuZChkYlBhdGgpO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIFRoZSBlbnZpcm9ubWVudCBhc3NpZ25tZW50IG11c3QgZ28gdGhyb3VnaCBidWlsZERyaXp6bGVLaXRDb21tYW5kOiBwcmVmaXhpbmcgaXRzXG4gICAgLy8gcG9zc2libHktcGFyZW50aGVzaXplZCByZXN1bHQgd2l0aCBgQUxMT1dfVE9fU0tJUF9TRUVEPTBgIHdvdWxkIGJlIGEgc2hlbGwgc3ludGF4IGVycm9yLlxuICAgIGNvbnN0IG1pZ3JhdGVXaXRoU2VlZENvbW1hbmQgPSBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsICdtaWdyYXRlJywgJ0FMTE9XX1RPX1NLSVBfU0VFRD0wJyk7XG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07ICR7dGhpcy5kZXBsb3kocHJvamVjdCl9ICYmICR7cmVtb3ZlRGJDb21tYW5kfVxuICAgICAgJiYgbGl0ZXN0cmVhbSByZXN0b3JlICR7bGl0ZXN0cmVhbUNvbmZpZ09wdGlvbn0gLW8gXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofVwiICYmIGxzIC1haGwgXCIke2RiUGF0aH1cIiAmJiAke21pZ3JhdGVXaXRoU2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdsaXN0LWJhY2t1cHMnKTtcbiAgICByZXR1cm4gYGxpdGVzdHJlYW0gbHR4ICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ3Jlc3RvcmUnKTtcbiAgICByZXR1cm4gYCR7YnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKG91dHB1dFBhdGgpfTsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gXCIke291dHB1dFBhdGh9XCIgXCIke2RiUGF0aH1cImA7XG4gIH1cblxuICBnZW5lcmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgZ2VuZXJhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBtaWdyYXRlRGV2KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5zZWVkKSByZXR1cm4gJ1lBUk4gcnVuIHNlZWQnO1xuICAgIGNvbnN0IGRlZmF1bHRTZWVkUGF0aCA9IHBhdGguam9pbignZGInLCAnc2VlZC50cycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRlZmF1bHRTZWVkUGF0aCkpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgQlVOICR7ZGVmYXVsdFNlZWRQYXRofWAgOiBgQlVOIGJ1aWxkLXRzIHJ1biAke2RlZmF1bHRTZWVkUGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHN0dWRpbyBmb3IgRHJpenpsZSBkb2VzIG5vdCBzdXBwb3J0IGRiLXVybC1vci1wYXRoLicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmdzOiBzdHJpbmcsIGVudmlyb25tZW50QXNzaWdubWVudCA9ICcnKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZCA9IGAke2Vudmlyb25tZW50QXNzaWdubWVudCAmJiBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnR9IGB9WUFSTiBkcml6emxlLWtpdCAke2FyZ3N9YDtcbiAgLy8gQSBjYWxsZXItc3VwcGxpZWQgLS1jb25maWcgcmVzb2x2ZXMgYWdhaW5zdCB0aGUgcHJvamVjdCBkaXJlY3RvcnksIHNvIHRoZSBjd2QgbXVzdCBzdGF5IHRoZXJlLlxuICByZXR1cm4gYXJncy5pbmNsdWRlcygnLS1jb25maWcnKSA/IGNvbW1hbmQgOiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgY29tbWFuZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdDogUHJvamVjdCwgY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIC8vIGRyaXp6bGUta2l0IHJlc29sdmVzIHJlbGF0aXZlIHBhdGhzIGluIGl0cyBjb25maWcgYWdhaW5zdCB0aGUgY3dkLCBzbyB0aGUgY29tbWFuZCBtdXN0IHJ1blxuICAvLyBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZHJpenpsZS5jb25maWcuKiBldmVuIHdoZW4gbW9ub3JlcG8gcGFja2FnZXMgc2hhcmUgaXQgYXQgdGhlIHJvb3QuXG4gIHJldHVybiBjb25maWcgJiYgY29uZmlnLmRpclBhdGggIT09IHByb2plY3QuZGlyUGF0aFxuICAgID8gYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBjb25maWcuZGlyUGF0aF0pfSAmJiAke2NvbW1hbmR9KWBcbiAgICA6IGNvbW1hbmQ7XG59XG5cbi8qKlxuICogV2hldGhlciBkcml6emxlLWtpdCBpcyB0aGUgcHJvamVjdCdzIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20uIEEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBpc1xuICogbm90IGEgcmVsaWFibGUgbWFya2VyOiBhIFdvcmtlciBtYXkgdXNlIEQxIG9ubHkgZm9yIGNhY2hpbmcgd2hpbGUgaXRzIGRyaXp6bGUgY29uZmlnIHRhcmdldHMgYW5cbiAqIHVucmVsYXRlZCBkYXRhYmFzZSAoZS5nLiBQb3N0Z3JlU1FMIHZpYSBIeXBlcmRyaXZlKSwgYW5kIHJ1bm5pbmcgYGRyaXp6bGUta2l0IG1pZ3JhdGVgIGFnYWluc3RcbiAqIHRoYXQgZGF0YWJhc2UgZHVyaW5nIGEgRDEgZGVwbG95IHdvdWxkIGJlIHdyb25nIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NDIpLlxuICogU28gcmVxdWlyZSBhbiBleHBsaWNpdCBtYXJrZXI6IGEgZHJpenpsZSBjb25maWcgd2hvc2UgZGlhbGVjdC9kcml2ZXIgdGFyZ2V0cyBzcWxpdGUsIGQxLWh0dHAsIG9yXG4gKiBkdXJhYmxlLXNxbGl0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXNEcml6emxlS2l0Rm9yRDEocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHN0cmlwSnNDb21tZW50cyhmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBjb25maWcuZmlsZU5hbWUpLCAndXRmOCcpKTtcbiAgICAvLyBTY2FuIG9ubHkgdGhlIGV4cG9ydGVkIGNvbmZpZydzIG9iamVjdCBsaXRlcmFsOiBkcml6emxlLWtpdCBjb25zdW1lcyB0aGUgZGVmYXVsdCBleHBvcnQsXG4gICAgLy8gYW5kIG1hdGNoaW5nIG90aGVyIHRleHQgKGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50IGFib3ZlIHRoZSBleHBvcnQsIG9yIG1hcmtlci1saWtlXG4gICAgLy8gc3RyaW5nIGNvbnRlbnQgaW4gc3RhdGVtZW50cyBhZnRlciBpdCkgd291bGQgc2VsZWN0IHRoZSB3cm9uZyBtaWdyYXRpb24gbWVjaGFuaXNtLlxuICAgIC8vIFBPU0lUSU9OUyAoZXhwb3J0IG1hcmtlcnMsIGRlY2xhcmF0aW9ucykgYXJlIGxvY2F0ZWQgb24gYSBzdHJpbmctbWFza2VkIHZpZXcgb2YgdGhlIHNhbWVcbiAgICAvLyBsZW5ndGgsIHNvIGBleHBvcnQgZGVmYXVsdGAgaW5zaWRlIGEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IG1pc2xlYWQgdGhlIHNlYXJjaC5cbiAgICBjb25zdCBtYXNrZWRDb250ZW50ID0gbWFza1N0cmluZ0NvbnRlbnRzKGNvbnRlbnQpO1xuICAgIGNvbnN0IGV4cG9ydEluZGljZXMgPSBbJ2V4cG9ydCBkZWZhdWx0JywgJ21vZHVsZS5leHBvcnRzJ11cbiAgICAgIC5tYXAoKG1hcmtlcikgPT4gbWFza2VkQ29udGVudC5pbmRleE9mKG1hcmtlcikpXG4gICAgICAuZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKTtcbiAgICBjb25zdCBleHBvcnRTdGFydEluZGV4ID0gZXhwb3J0SW5kaWNlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4uZXhwb3J0SW5kaWNlcykgOiAwO1xuICAgIGNvbnN0IG9iamVjdFNwYW4gPSBleHRyYWN0RXhwb3J0ZWRDb25maWdPYmplY3QoY29udGVudCwgbWFza2VkQ29udGVudCwgZXhwb3J0U3RhcnRJbmRleCk7XG4gICAgcmV0dXJuIG9iamVjdFNwYW4gIT09IHVuZGVmaW5lZCAmJiBkZWNsYXJlc1NxbGl0ZVRhcmdldChvYmplY3RTcGFuKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG9iamVjdCBsaXRlcmFsIHRoZSBleHBvcnQgYWN0dWFsbHkgZXZhbHVhdGVzIHRvOiBmb3IgYGV4cG9ydCBkZWZhdWx0IHsuLi59YCBvclxuICogYGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7Li4ufSlgIHRoZSBmaXJzdCBiYWxhbmNlZCBvYmplY3QgYWZ0ZXIgdGhlIG1hcmtlciwgYW5kIGZvclxuICogYGV4cG9ydCBkZWZhdWx0IGNvbmZpZztgIHRoZSBpbml0aWFsaXplciBvZiB0aGF0IGlkZW50aWZpZXIncyBkZWNsYXJhdGlvbiDigJQgbmV2ZXIgdGhlIHdob2xlXG4gKiBmaWxlLCBzaW5jZSBhbiB1bnJlbGF0ZWQgb2JqZWN0IChlLmcuIGFuIHVudXNlZCBzcWxpdGUtc2hhcGVkIGNvbnN0YW50KSBtdXN0IG5vdCBiZSBzZWxlY3RlZC5cbiAqIFVuZGVmaW5lZCB3aGVuIHRoZSBleHByZXNzaW9uIGNhbm5vdCBiZSByZXNvbHZlZDsgd2IgZGVwbG95J3MgdW5tYW5hZ2VkLUQxIHdhcm5pbmcgY292ZXJzIHRoYXQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRlZENvbmZpZ09iamVjdChcbiAgY29udGVudDogc3RyaW5nLFxuICBtYXNrZWRDb250ZW50OiBzdHJpbmcsXG4gIGV4cG9ydFN0YXJ0SW5kZXg6IG51bWJlclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhwb3J0ZWRFeHByZXNzaW9uID0gbWFza2VkQ29udGVudFxuICAgIC5zbGljZShleHBvcnRTdGFydEluZGV4KVxuICAgIC5yZXBsYWNlKC9eKD86ZXhwb3J0XFxzK2RlZmF1bHR8bW9kdWxlXFwuZXhwb3J0c1xccyo9KVxccyovLCAnJyk7XG4gIC8vIEFuIGlkZW50aWZpZXIgZXhwb3J0IG1heSBjYXJyeSBhIFR5cGVTY3JpcHQgdHlwZSBwb3N0Zml4IChgY29uZmlnIHNhdGlzZmllcyBDb25maWc7YCAvXG4gIC8vIGBjb25maWcgYXMgQ29uZmlnO2ApOyB0aGUgaWRlbnRpZmllciBpcyByZWNvZ25pemVkIEZJUlNUIHNvIGEgcG9zdGZpeCBjb250YWluaW5nIGEgVFlQRVxuICAvLyBsaXRlcmFsIChgc2F0aXNmaWVzIHsgZGlhbGVjdDogJ3NxbGl0ZScgfCAuLi4gfWApIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcnVudGltZSBjb25maWcuXG4gIGNvbnN0IGlkZW50aWZpZXJNYXRjaCA9IC9eKFtBLVphLXpfJF1bXFx3JF0qKVxccyooPzpzYXRpc2ZpZXNcXGJ8YXNcXGJ8O3xcXG58JCkvLmV4ZWMoZXhwb3J0ZWRFeHByZXNzaW9uKTtcbiAgaWYgKCFpZGVudGlmaWVyTWF0Y2gpIHtcbiAgICBjb25zdCBicmFjZU9mZnNldCA9IG1hc2tlZENvbnRlbnQuc2xpY2UoZXhwb3J0U3RhcnRJbmRleCkuaW5kZXhPZigneycpO1xuICAgIGlmIChicmFjZU9mZnNldCA9PT0gLTEpIHJldHVybjtcbiAgICByZXR1cm4gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudC5zbGljZShleHBvcnRTdGFydEluZGV4ICsgYnJhY2VPZmZzZXQpKTtcbiAgfVxuXG4gIC8vIGAkYCBpcyBsZWdhbCBpbiBpZGVudGlmaWVycyBidXQgYSByZWdleCBhbmNob3IsIHNvIGl0IG11c3QgYmUgZXNjYXBlZCBiZWZvcmUgaW50ZXJwb2xhdGlvbjtcbiAgLy8gYCg/IVtcXHckXSlgIChub3QgYFxcYmApIGVuZHMgdGhlIG1hdGNoIGJlY2F1c2UgYFxcYmAgbmV2ZXIgZmlyZXMgYWZ0ZXIgYSB0cmFpbGluZyBgJGAuXG4gIGNvbnN0IGVzY2FwZWRJZGVudGlmaWVyID0gaWRlbnRpZmllck1hdGNoWzFdIS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgY29uc3QgZGVjbGFyYXRpb25FbmRJbmRleCA9IGZpbmRNb2R1bGVTY29wZURlY2xhcmF0aW9uRW5kKG1hc2tlZENvbnRlbnQsIGVzY2FwZWRJZGVudGlmaWVyKTtcbiAgaWYgKGRlY2xhcmF0aW9uRW5kSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAvLyBUaGUgaW5pdGlhbGl6ZXIgbXVzdCBiZWxvbmcgdG8gVEhJUyBkZWNsYXJhdGlvbiAoYSB0eXBlIGFubm90YXRpb24gbWF5IHByZWNlZGUgdGhlIGA9YCk7IGFuXG4gIC8vIHVuaW5pdGlhbGl6ZWQgYGxldCBjb25maWc7YCBzdGF5cyB1bnJlc29sdmVkIGluc3RlYWQgb2YgZ3JhYmJpbmcgYSBsYXRlciBzdGF0ZW1lbnQncyBgPWAuXG4gIGNvbnN0IGFzc2lnbm1lbnRNYXRjaCA9IC9eXFxzKig/OjpbXj07XFxuXSopPz0vLmV4ZWMobWFza2VkQ29udGVudC5zbGljZShkZWNsYXJhdGlvbkVuZEluZGV4KSk7XG4gIGlmICghYXNzaWdubWVudE1hdGNoKSByZXR1cm47XG4gIHJldHVybiBleHRyYWN0Rmlyc3RCYWxhbmNlZE9iamVjdChjb250ZW50LnNsaWNlKGRlY2xhcmF0aW9uRW5kSW5kZXggKyBhc3NpZ25tZW50TWF0Y2hbMF0ubGVuZ3RoKSk7XG59XG5cbi8qKlxuICogVGhlIGVuZCBpbmRleCBvZiB0aGUgaWRlbnRpZmllcidzIGRlY2xhcmF0aW9uIGF0IGJyYWNlIGRlcHRoIFpFUk8gKG1vZHVsZSBzY29wZSk6IGEgc2FtZS1uYW1lZFxuICogZGVjbGFyYXRpb24gaW5zaWRlIGEgZnVuY3Rpb24gYm9keSBtdXN0IG5vdCBzaGFkb3cgdGhlIGJpbmRpbmcgdGhlIGV4cG9ydCByZWZlcmVuY2VzLCBhbmRcbiAqIGluZGVudGF0aW9uIGlzIG5vIHNjb3BlIHNpZ25hbCDigJQgZGVwdGggb3ZlciB0aGUgc3RyaW5nLW1hc2tlZCBjb250ZW50IGlzLlxuICovXG5mdW5jdGlvbiBmaW5kTW9kdWxlU2NvcGVEZWNsYXJhdGlvbkVuZChtYXNrZWRDb250ZW50OiBzdHJpbmcsIGVzY2FwZWRJZGVudGlmaWVyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNsYXJhdGlvblJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBTdHJpbmcucmF3YCg/PCFbXFx3JF0pKD86ZXhwb3J0XFxzKyk/KD86Y29uc3R8bGV0fHZhcilcXHMrJHtlc2NhcGVkSWRlbnRpZmllcn0oPyFbXFx3JF0pYCxcbiAgICAnZydcbiAgKTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHNjYW5JbmRleCA9IDA7XG4gIGZvciAobGV0IG1hdGNoID0gZGVjbGFyYXRpb25SZWdleC5leGVjKG1hc2tlZENvbnRlbnQpOyBtYXRjaDsgbWF0Y2ggPSBkZWNsYXJhdGlvblJlZ2V4LmV4ZWMobWFza2VkQ29udGVudCkpIHtcbiAgICBmb3IgKDsgc2NhbkluZGV4IDwgbWF0Y2guaW5kZXg7IHNjYW5JbmRleCsrKSB7XG4gICAgICBjb25zdCBjaGFyID0gbWFza2VkQ29udGVudFtzY2FuSW5kZXhdO1xuICAgICAgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09ICd9JykgZGVwdGgtLTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIENPTlRFTlRTIG9mIHN0cmluZyBsaXRlcmFscyB3aXRoIHNwYWNlcyAoc2FtZSBsZW5ndGgsIG5ld2xpbmVzIGtlcHQpLCBzbyBwb3NpdGlvblxuICogc2VhcmNoZXMgb3ZlciB0aGUgcmVzdWx0IGNhbm5vdCBtYXRjaCB0ZXh0IGluc2lkZSBzdHJpbmdzIHdoaWxlIGFsbCBpbmRleGVzIHN0aWxsIG1hcCAxOjEgdG9cbiAqIHRoZSBvcmlnaW5hbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBtYXNrU3RyaW5nQ29udGVudHMoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICByZXN1bHQgKz0gJyAgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHtcbiAgICAgICAgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhciA9PT0gJ1xcbicgPyAnXFxuJyA6ICcgJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmctYXdhcmUgc2NhbiBmb3IgdGhlIG1hcmtlcnMgaW5kaWNhdGluZyB0aGUgY29uZmlnIG1hbmFnZXMgYSAoQ2xvdWRmbGFyZSBEMSBjb21wYXRpYmxlKVxuICogU1FMaXRlIGRhdGFiYXNlIOKAlCBhIGBkaWFsZWN0OiAnc3FsaXRlJ2AsIGBkcml2ZXI6ICdkMS1odHRwJ2AsIG9yIGBkcml2ZXI6ICdkdXJhYmxlLXNxbGl0ZSdgXG4gKiBQUk9QRVJUWSAocGxhaW4gb3IgcXVvdGVkIGtleSkuIEtleXMgYXJlIG9ubHkgcmVjb2duaXplZCBpbiBjb2RlIHBvc2l0aW9uLCBzbyBtYXJrZXItbGlrZSB0ZXh0XG4gKiBlbWJlZGRlZCBpbiB1bnJlbGF0ZWQgc3RyaW5nIHZhbHVlcyAoZS5nLiBhIHNjaGVtYSBwYXRoKSBjYW5ub3QgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzU3FsaXRlVGFyZ2V0KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZ3MoY29udGVudCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0b2tlbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdITtcbiAgICBsZXQga2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHZhbHVlVG9rZW5JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0b2tlbi50eXBlID09PSAnY29kZScpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58W1xcc3ssKF0pKGRpYWxlY3R8ZHJpdmVyKVxccyo6XFxzKiQvLmV4ZWModG9rZW4udmFsdWUpO1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGtleSA9IG1hdGNoWzFdO1xuICAgICAgICB2YWx1ZVRva2VuSW5kZXggPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ2RpYWxlY3QnIHx8IHRva2VuLnZhbHVlID09PSAnZHJpdmVyJykge1xuICAgICAgLy8gQSBxdW90ZWQga2V5OiB0aGUgc3Vycm91bmRpbmcgY29kZSB0b2tlbnMgbXVzdCBmb3JtIGEgcHJvcGVydHkgcG9zaXRpb24gKGB7YC9gLGAgYmVmb3JlLFxuICAgICAgLy8gYDpgIGFmdGVyKS5cbiAgICAgIGNvbnN0IHByZXZpb3VzVG9rZW4gPSB0b2tlbnNbaW5kZXggLSAxXTtcbiAgICAgIGNvbnN0IG5leHRUb2tlbiA9IHRva2Vuc1tpbmRleCArIDFdO1xuICAgICAgaWYgKFxuICAgICAgICBwcmV2aW91c1Rva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL1t7LChdXFxzKiQvLnRlc3QocHJldmlvdXNUb2tlbi52YWx1ZSkgJiZcbiAgICAgICAgbmV4dFRva2VuPy50eXBlID09PSAnY29kZScgJiZcbiAgICAgICAgL15cXHMqOlxccyokLy50ZXN0KG5leHRUb2tlbi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBrZXkgPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgdmFsdWVUb2tlbkluZGV4ID0gaW5kZXggKyAyO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgdmFsdWVUb2tlbkluZGV4ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgdmFsdWVUb2tlbiA9IHRva2Vuc1t2YWx1ZVRva2VuSW5kZXhdO1xuICAgIGlmICh2YWx1ZVRva2VuPy50eXBlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgaWYgKGtleSA9PT0gJ2RpYWxlY3QnICYmIHZhbHVlVG9rZW4udmFsdWUgPT09ICdzcWxpdGUnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoa2V5ID09PSAnZHJpdmVyJyAmJiAodmFsdWVUb2tlbi52YWx1ZSA9PT0gJ2QxLWh0dHAnIHx8IHZhbHVlVG9rZW4udmFsdWUgPT09ICdkdXJhYmxlLXNxbGl0ZScpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXQgaW50byBhbHRlcm5hdGluZyBjb2RlIGFuZCBzdHJpbmctbGl0ZXJhbC1jb250ZW50IHRva2VucyAocXVvdGVzIGV4Y2x1ZGVkKS4gVGhlIGlucHV0IGlzXG4gKiBhbHJlYWR5IGNvbW1lbnQtZnJlZSDigJQgdXNlc0RyaXp6bGVLaXRGb3JEMSBydW5zIHN0cmlwSnNDb21tZW50cyBiZWZvcmUgYW55IHNjYW5uaW5nIOKAlCBzb1xuICogY29tbWVudCBkZWxpbWl0ZXJzIG5lZWQgbm8gaGFuZGxpbmcgaGVyZSAoYSBjb21tZW50ZWQtb3V0IGAvLyBkaWFsZWN0OiAnc3FsaXRlJ2AgY2FuIG5ldmVyXG4gKiByZWFjaCB0aGlzIHRva2VuaXplcikuXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU3RyaW5ncyhjb250ZW50OiBzdHJpbmcpOiB7IHR5cGU6ICdjb2RlJyB8ICdzdHJpbmcnOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IHRva2VuczogeyB0eXBlOiAnY29kZScgfCAnc3RyaW5nJzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgbGV0IGNvZGUgPSAnJztcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ2NvZGUnLCB2YWx1ZTogY29kZSB9KTtcbiAgICAgIGNvZGUgPSAnJztcbiAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSBjaGFyKSB7XG4gICAgICAgIGlmIChjb250ZW50W2luZGV4XSA9PT0gJ1xcXFwnKSBpbmRleCsrO1xuICAgICAgICB2YWx1ZSArPSBjb250ZW50W2luZGV4XSA/PyAnJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ3N0cmluZycsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvZGUgKz0gY2hhcjtcbiAgfVxuICB0b2tlbnMucHVzaCh7IHR5cGU6ICdjb2RlJywgdmFsdWU6IGNvZGUgfSk7XG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8qKiBUaGUgZmlyc3QgYHsgLi4uIH1gIHNwYW4gKHN0cmluZy1hd2FyZSBicmFjZSBtYXRjaGluZyksIG9yIHVuZGVmaW5lZCB3aGVuIG5vbmUgZXhpc3RzLiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZigneycpO1xuICBpZiAoc3RhcnRJbmRleCA9PT0gLTEpIHJldHVybjtcblxuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgc3RyaW5nRGVsaW1pdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKHN0cmluZ0RlbGltaXRlcikge1xuICAgICAgaWYgKGNoYXIgPT09ICdcXFxcJykgaW5kZXgrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgIGVsc2UgaWYgKGNoYXIgPT09ICd7JykgZGVwdGgrKztcbiAgICBlbHNlIGlmIChjaGFyID09PSAnfScgJiYgLS1kZXB0aCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQuc2xpY2Uoc3RhcnRJbmRleCwgaW5kZXggKyAxKTtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogUmVtb3ZlIGJsb2NrIGFuZCBsaW5lIGNvbW1lbnRzIHNvIGNvbW1lbnRlZC1vdXQgbWFya2VycyAoZS5nLiBgLy8gZGlhbGVjdDogJ3NxbGl0ZSdgIGluIGFcbiAqIFBvc3RncmVTUUwgY29uZmlnKSBjYW5ub3QgbWlzY2xhc3NpZnkgdGhlIGNvbmZpZy4gVGhlIHNjYW5uZXIgdHJhY2tzIHN0cmluZyBzdGF0ZSwgc28gYC8vYFxuICogaW5zaWRlIHN0cmluZyBsaXRlcmFscyAoVVJMcyBzdWNoIGFzIGBodHRwczovLy4uLmAgaW4gY29ubmVjdGlvbiBzdHJpbmdzKSBzdXJ2aXZlcyB3aGlsZVxuICogY29tbWVudHMgZGlyZWN0bHkgYWZ0ZXIgYSBzdHJpbmcgbGl0ZXJhbCBhcmUgc3RpbGwgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBKc0NvbW1lbnRzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGNvbnN0IG5leHRDaGFyID0gY29udGVudFtpbmRleCArIDFdO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXIgKyAobmV4dENoYXIgPz8gJycpO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkge1xuICAgICAgICBzdHJpbmdEZWxpbWl0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ1wiJyB8fCBjaGFyID09PSAnYCcpIHtcbiAgICAgIHN0cmluZ0RlbGltaXRlciA9IGNoYXI7XG4gICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnLycpIHtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQubGVuZ3RoICYmIGNvbnRlbnRbaW5kZXhdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHRDaGFyID09PSAnKicpIHtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiAhKGNvbnRlbnRbaW5kZXhdID09PSAnKicgJiYgY29udGVudFtpbmRleCArIDFdID09PSAnLycpKSBpbmRleCsrO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQgKz0gY2hhcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZERyaXp6bGVDb25maWcocHJvamVjdDogUHJvamVjdCk6IHsgZGlyUGF0aDogc3RyaW5nOyBmaWxlTmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWydkcml6emxlLmNvbmZpZy50cycsICdkcml6emxlLmNvbmZpZy5tdHMnLCAnZHJpenpsZS5jb25maWcuanMnLCAnZHJpenpsZS5jb25maWcubWpzJ107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBbcHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnJvb3REaXJQYXRoXSkge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gY2FuZGlkYXRlcy5maW5kKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gICAgaWYgKGZpbGVOYW1lKSByZXR1cm4geyBkaXJQYXRoLCBmaWxlTmFtZSB9O1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSA/IGRiUGF0aCA6IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRiUGF0aCk7XG4gIHJldHVybiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgoYWJzb2x1dGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtZiBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9LXdhbFwiIFwiJHtkYlBhdGh9LXNobVwiYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZW1vdmVTcWxpdGVEYkZhbWlseUNvbW1hbmQoZGJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHJtIC1SZiBcIiR7ZGJQYXRofVwiKmA7XG59XG5cbmZ1bmN0aW9uIGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdiIGRiICR7Y29tbWFuZE5hbWV9IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuYCk7XG4gIH1cbiAgcmV0dXJuIGRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCwgY29tbWFuZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldFNxbGl0ZURiUGF0aE9yRXJyb3IocHJvamVjdCwgY29tbWFuZE5hbWUpO1xuICByZXR1cm4gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVEYlBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG59XG5cbmV4cG9ydCBjb25zdCBkcml6emxlU2NyaXB0cyA9IG5ldyBEcml6emxlU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuL3dyYW5nbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBXcmFuZ2xlckQxRGF0YWJhc2Uge1xuICBiaW5kaW5nPzogc3RyaW5nO1xuICBkYXRhYmFzZV9uYW1lPzogc3RyaW5nO1xuICBkYXRhYmFzZV9pZD86IHN0cmluZztcbiAgbWlncmF0aW9uc19kaXI/OiBzdHJpbmc7XG4gIG1pZ3JhdGlvbnNfcGF0dGVybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBEMSBiaW5kaW5nIHVzZXMgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgdGhhdCBgd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseWBcbiAqIHdvdWxkIGFjdHVhbGx5IGRpc2NvdmVyOiBhbiBleHBsaWNpdCBgbWlncmF0aW9uc19wYXR0ZXJuYCBvcHRzIGluLCBvdGhlcndpc2UgdGhlIG1pZ3JhdGlvbnNcbiAqIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gZmxhdCBgKi5zcWxgIGZpbGVzICh3cmFuZ2xlcidzIGRlZmF1bHQgcGF0dGVybikuIEEgZHJpenpsZS1raXQgYG91dGBcbiAqIGRpcmVjdG9yeSB3aXRoIG5lc3RlZCBgPG5hbWU+L21pZ3JhdGlvbi5zcWxgIGZpbGVzIGFuZCBubyBwYXR0ZXJuIHdvdWxkIG1hdGNoIG5vdGhpbmcgYW5kXG4gKiBzaWxlbnRseSBhcHBseSB6ZXJvIG1pZ3JhdGlvbnMsIHNvIGl0IG11c3QgZmFsbCB0aHJvdWdoIHRvIHRoZSBkcml6emxlLWtpdCBtZWNoYW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPiwgZGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSk6IGJvb2xlYW4ge1xuICAvLyBBbiBleHBsaWNpdCBwYXR0ZXJuIG9wdHMgaW50byB0aGUgd3JhbmdsZXItbmF0aXZlIG1lY2hhbmlzbSBldmVuIGJlZm9yZSB0aGUgZGlyZWN0b3J5XG4gIC8vIGV4aXN0czsgd3JhbmdsZXIgdGhlbiBmYWlscyBzYWZlbHkgd2l0aCBcIk5vIG1pZ3JhdGlvbnMgZm9sZGVyIGZvdW5kXCIgaW5zdGVhZCBvZiB3YlxuICAvLyBzaWxlbnRseSBzd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgbWlncmF0aW9uIGVuZ2luZS5cbiAgaWYgKGRhdGFiYXNlLm1pZ3JhdGlvbnNfcGF0dGVybikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGF0YWJhc2UubWlncmF0aW9uc19kaXIgPz8gJ21pZ3JhdGlvbnMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG1pZ3JhdGlvbnNEaXJQYXRoKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZnMucmVhZGRpclN5bmMobWlncmF0aW9uc0RpclBhdGgpLnNvbWUoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5lbmRzV2l0aCgnLnNxbCcpKTtcbn1cblxuY29uc3QgTkFNRV9LRVlFRF9CSU5ESU5HX1BBUkVOVFMgPSBuZXcgU2V0KFsnYmluZGluZ3MnLCAnc2VuZF9lbWFpbCcsICdyYXRlbGltaXRzJ10pO1xuY29uc3QgUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUyA9IG5ldyBTZXQoWyd3YXNtX21vZHVsZXMnLCAndGV4dF9ibG9icycsICdkYXRhX2Jsb2JzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgYmluZGluZyBuYW1lIGRlY2xhcmVkIGluIHRoZSAoZW52aXJvbm1lbnQtcmVzb2x2ZWQpIGNvbmZpZyBzdWJ0cmVlOiBgYmluZGluZ2BcbiAqIHByb3BlcnRpZXMgYW55d2hlcmUgKEQxLCBLViwgUjIsIHNlcnZpY2VzLCBhc3NldHMsIHF1ZXVlcywgZXRjLiksIHRoZSBgbmFtZWAta2V5ZWQgYmluZGluZ3NcbiAqIChgZHVyYWJsZV9vYmplY3RzLmJpbmRpbmdzYCwgYGxvZ2Z3ZHIuYmluZGluZ3NgLCBgc2VuZF9lbWFpbGAsIGByYXRlbGltaXRzYCksIGFuZCB0aGVcbiAqIHJlY29yZC1rZXllZCBsZWdhY3kgbW9kdWxlIGJpbmRpbmdzIChgd2FzbV9tb2R1bGVzYCwgYHRleHRfYmxvYnNgLCBgZGF0YV9ibG9ic2ApLiBBIHNlY3JldFxuICogc2hhcmluZyBhIGJpbmRpbmcncyBuYW1lIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhhdCBiaW5kaW5nIHdpdGggYSBwbGFpbiBzdHJpbmcgb24gZGVwbG95LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyh2YWx1ZTogdW5rbm93biwgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKSwgcGFyZW50S2V5ID0gJycpOiBTZXQ8c3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkgY29sbGVjdEJpbmRpbmdOYW1lcyhpdGVtLCBuYW1lcywgcGFyZW50S2V5KTtcbiAgICByZXR1cm4gbmFtZXM7XG4gIH1cbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbmFtZXM7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmIChrZXkgPT09ICdiaW5kaW5nJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbmFtZScgJiYgdHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyAmJiBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUy5oYXMocGFyZW50S2V5KSkge1xuICAgICAgbmFtZXMuYWRkKGNoaWxkKTtcbiAgICB9IGVsc2UgaWYgKFJFQ09SRF9LRVlFRF9CSU5ESU5HX0tFWVMuaGFzKGtleSkgJiYgY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmluZGluZ05hbWUgb2YgT2JqZWN0LmtleXMoY2hpbGQpKSBuYW1lcy5hZGQoYmluZGluZ05hbWUpO1xuICAgIH0gZWxzZSBpZiAoa2V5ICE9PSAnZW52JyAmJiBrZXkgIT09ICd2YXJzJyAmJiBrZXkgIT09ICdtZXRhZGF0YScgJiYga2V5ICE9PSAnb3B0aW9ucycpIHtcbiAgICAgIC8vIE5lc3RlZCBgZW52YCBzdWJ0cmVlcyBiZWxvbmcgdG8gb3RoZXIgZW52aXJvbm1lbnRzOyBgdmFyc2AgdmFsdWVzLCBgdW5zYWZlLm1ldGFkYXRhYCxcbiAgICAgIC8vIGFuZCBgdW5zYWZlLmJpbmRpbmdzW10uZGV2Lm9wdGlvbnNgIGFyZSBhcmJpdHJhcnkgSlNPTiB3aG9zZSBwcm9wZXJ0aWVzIChlLmcuIGFcbiAgICAgIC8vIFwiYmluZGluZ1wiIGZpZWxkKSBhcmUgZGF0YSwgbm90IFdvcmtlciBiaW5kaW5ncy5cbiAgICAgIGNvbGxlY3RCaW5kaW5nTmFtZXMoY2hpbGQsIG5hbWVzLCBrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmFtZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB7XG4gIC8qKiBUaGUgV29ya2VyIG5hbWUgZm9yIHRoZSBkZXBsb3kgZW52aXJvbm1lbnQgKHdyYW5nbGVyIGFwcGVuZHMgYC08ZW52PmAgd2hlbiB0aGUgZW52IHNlY3Rpb24gaGFzIG5vIG93biBuYW1lKS4gKi9cbiAgd29ya2VyTmFtZT86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB2YXJLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBlbnZpcm9ubWVudCdzIGB2YXJzYCB2YWx1ZXMgKG5lZWRlZCBmb3IgQ2xvdWRmbGFyZSdzIGNvbWJpbmVkIGNvdW50L3NpemUgbGltaXRzKS4gKi9cbiAgdmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTZWNyZXRzIGRlY2xhcmVkIGFzIHJlcXVpcmVkIHZpYSB3cmFuZ2xlcidzIGBzZWNyZXRzLnJlcXVpcmVkYCAodmFsaWRhdGVkIGF0IGRlcGxveSB0aW1lKS4gKi9cbiAgcmVxdWlyZWRTZWNyZXROYW1lczogc3RyaW5nW107XG4gIC8qKiBOYW1lcyBvZiBhbGwgbm9uLXZhciBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzLCBzZW5kX2VtYWlsLCBzZXJ2aWNlcywgLi4uKS4gKi9cbiAgYmluZGluZ05hbWVzOiBzdHJpbmdbXTtcbiAgZDFEYXRhYmFzZXM6IFdyYW5nbGVyRDFEYXRhYmFzZVtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZW52aXJvbm1lbnQgY29tZXMgZnJvbSBhbiBgZW52LjxuYW1lPmAgc2VjdGlvbiAodGhlbiB3cmFuZ2xlciBjb21tYW5kcyBuZWVkXG4gICAqIGAtLWVudiA8bmFtZT5gIC8gYENMT1VERkxBUkVfRU5WPTxuYW1lPmApLiBgcHJvZHVjdGlvbmAgbWF5IGJlIGVpdGhlciB0aGUgdG9wIGxldmVsIG9yIGFcbiAgICogbmFtZWQgYGVudi5wcm9kdWN0aW9uYCBzZWN0aW9uOyB0aGUgc2VjdGlvbiB3aW5zIHdoZW4gaXQgZXhpc3RzLlxuICAgKi9cbiAgdXNlc0VudlNlY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBSYXdXcmFuZ2xlckNvbmZpZyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZDFfZGF0YWJhc2VzPzogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIGFzc2V0cz86IHVua25vd247XG4gIGxvZ2Z3ZHI/OiB1bmtub3duO1xuICB3YXNtX21vZHVsZXM/OiB1bmtub3duO1xuICB0ZXh0X2Jsb2JzPzogdW5rbm93bjtcbiAgZGF0YV9ibG9icz86IHVua25vd247XG4gIHNpdGU/OiB1bmtub3duO1xuICBzZWNyZXRzPzogeyByZXF1aXJlZD86IHN0cmluZ1tdIH07XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIFJhd1dyYW5nbGVyQ29uZmlnPjtcbn1cblxuLy8gV29ya2VycyBTaXRlcyBpbXBsaWNpdGx5IGJpbmRzIGl0cyBLViBuYW1lc3BhY2UgYXMgX19TVEFUSUNfQ09OVEVOVC5cbmZ1bmN0aW9uIHNpdGVCaW5kaW5nTmFtZXMoY29uZmlnOiBSYXdXcmFuZ2xlckNvbmZpZywgZW52Q29uZmlnPzogUmF3V3JhbmdsZXJDb25maWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoZW52Q29uZmlnPy5zaXRlID8/IGNvbmZpZy5zaXRlKSA/IFsnX19TVEFUSUNfQ09OVEVOVCddIDogW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgd3JhbmdsZXIgY29uZmlnIHZhbHVlcyBuZWVkZWQgZm9yIGRlcGxveWluZyB0byB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gKiBGb2xsb3dzIHdyYW5nbGVyJ3MgaW5oZXJpdGFuY2UgcnVsZXM6IGBhY2NvdW50X2lkYCBpcyBpbmhlcml0ZWQgYnkgbmFtZWQgZW52aXJvbm1lbnRzLFxuICogd2hpbGUgYHZhcnNgIGFuZCBgZDFfZGF0YWJhc2VzYCBhcmUgbm90IGFuZCBtdXN0IGJlIHJlZGVjbGFyZWQgcGVyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4sXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcbiAgaWYgKHBhdGguZXh0bmFtZShjb25maWdQYXRoKSA9PT0gJy50b21sJykge1xuICAgIHRocm93IG5ldyBFcnJvcignd2IgZGVwbG95IHN1cHBvcnRzIHdyYW5nbGVyLmpzb25jL3dyYW5nbGVyLmpzb24gY29uZmlncyBvbmx5OyBtaWdyYXRlIHdyYW5nbGVyLnRvbWwgZmlyc3QuJyk7XG4gIH1cblxuICAvLyBqc29uYy1wYXJzZXIgaXMgZmF1bHQgdG9sZXJhbnQgYW5kIHdvdWxkIHJldHVybiBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsXG4gIC8vIHdoaWNoIGNvdWxkIG1pZ3JhdGUgYSByZW1vdGUgZGF0YWJhc2UgZnJvbSBhIGhhbGYtcmVhZCBjb25maWc7IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IuXG4gIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgY29uc3QgY29uZmlnID0gcGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JyksIHBhcnNlRXJyb3JzLCB7XG4gICAgYWxsb3dUcmFpbGluZ0NvbW1hOiB0cnVlLFxuICB9KSBhcyBSYXdXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHBhcnNlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2NvbmZpZ1BhdGh9OiAke3BhcnNlRXJyb3JzLmxlbmd0aH0gSlNPTkMgc3ludGF4IGVycm9yKHMpLmApO1xuICB9XG4gIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgY29uc3QgZW52Q29uZmlnID0gY29uZmlnLmVudj8uW2Vudk5hbWVdO1xuICBpZiAoIWVudkNvbmZpZyAmJiBlbnZOYW1lICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB3cmFuZ2xlciBjb25maWcgaGFzIG5vIFwiZW52XCI6IHsgXCIke2Vudk5hbWV9XCI6IC4uLiB9IHNlY3Rpb24uYCk7XG4gIH1cbiAgcmV0dXJuIGVudkNvbmZpZ1xuICAgID8ge1xuICAgICAgICB3b3JrZXJOYW1lOiBlbnZDb25maWcubmFtZSA/PyAoY29uZmlnLm5hbWUgPyBgJHtjb25maWcubmFtZX0tJHtlbnZOYW1lfWAgOiB1bmRlZmluZWQpLFxuICAgICAgICBhY2NvdW50SWQ6IGVudkNvbmZpZy5hY2NvdW50X2lkID8/IGNvbmZpZy5hY2NvdW50X2lkLFxuICAgICAgICB2YXJLZXlzOiBPYmplY3Qua2V5cyhlbnZDb25maWcudmFycyA/PyB7fSksXG4gICAgICAgIHZhcnM6IGVudkNvbmZpZy52YXJzID8/IHt9LFxuICAgICAgICAvLyBNb3N0IGJpbmRpbmdzIGFyZSBub24taW5oZXJpdGFibGUgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQsIHNvIG9ubHkgdGhlXG4gICAgICAgIC8vIGVudmlyb25tZW50J3Mgb3duIG5hbWVzIGNvdW50IOKAlCBwbHVzIHRoZSBnZW51aW5lbHkgaW5oZXJpdGVkIHNoYXBlcyAoYXNzZXRzLCBsb2dmd2RyKSxcbiAgICAgICAgLy8gd2hpY2ggd3JhbmdsZXIgcmVzb2x2ZXMgYXMgd2hvbGUgZmllbGRzOiB0aGUgZW52aXJvbm1lbnQncyBvd24gZmllbGQgb3ZlcnJpZGVzIHRoZVxuICAgICAgICAvLyB0b3AgbGV2ZWwgZW50aXJlbHksIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSdzIG5hbWVzIGNvdW50LlxuICAgICAgICBiaW5kaW5nTmFtZXM6IFtcbiAgICAgICAgICAuLi5jb2xsZWN0QmluZGluZ05hbWVzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhc3NldHM6IGVudkNvbmZpZy5hc3NldHMgPz8gY29uZmlnLmFzc2V0cyxcbiAgICAgICAgICAgICAgbG9nZndkcjogZW52Q29uZmlnLmxvZ2Z3ZHIgPz8gY29uZmlnLmxvZ2Z3ZHIsXG4gICAgICAgICAgICAgIHdhc21fbW9kdWxlczogZW52Q29uZmlnLndhc21fbW9kdWxlcyA/PyBjb25maWcud2FzbV9tb2R1bGVzLFxuICAgICAgICAgICAgICB0ZXh0X2Jsb2JzOiBlbnZDb25maWcudGV4dF9ibG9icyA/PyBjb25maWcudGV4dF9ibG9icyxcbiAgICAgICAgICAgICAgZGF0YV9ibG9iczogZW52Q29uZmlnLmRhdGFfYmxvYnMgPz8gY29uZmlnLmRhdGFfYmxvYnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhlbnZDb25maWcpXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZywgZW52Q29uZmlnKSxcbiAgICAgICAgXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGVudkNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIC8vIGBzZWNyZXRzYCBpcyBub24taW5oZXJpdGFibGU6IGEgdG9wLWxldmVsIHJlcXVpcmVtZW50IG11c3Qgbm90IGZvcmNlIChvciB1cGxvYWQpXG4gICAgICAgIC8vIGEgc2VjcmV0IGludG8gYSBuYW1lZCBlbnZpcm9ubWVudC5cbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogZW52Q29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogdHJ1ZSxcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgd29ya2VyTmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgIGFjY291bnRJZDogY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogY29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIGJpbmRpbmdOYW1lczogWy4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoY29uZmlnKSwgLi4uc2l0ZUJpbmRpbmdOYW1lcyhjb25maWcpXSxcbiAgICAgICAgZDFEYXRhYmFzZXM6IGNvbmZpZy5kMV9kYXRhYmFzZXMgPz8gW10sXG4gICAgICAgIHJlcXVpcmVkU2VjcmV0TmFtZXM6IGNvbmZpZy5zZWNyZXRzPy5yZXF1aXJlZCA/PyBbXSxcbiAgICAgICAgdXNlc0VudlNlY3Rpb246IGZhbHNlLFxuICAgICAgfTtcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kLCB1c2VzRHJpenpsZUtpdEZvckQxIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQsIHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnLCBXcmFuZ2xlckQxRGF0YWJhc2UgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYsIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5cbi8qKlxuICogS2V5cyB0aGF0IGRyaXZlIHRoZSBkZXBsb3kgaXRzZWxmIChvciBhcmUgbWVhbmluZ2Z1bCBvbmx5IGxvY2FsbHkpIGFuZCB0aHVzIG11c3QgbmV2ZXIgYmVcbiAqIHB1c2hlZCB0byB0aGUgV29ya2VyIGFzIHNlY3JldHMuIGBXQl9FTlZgIC8gYE5FWFRfUFVCTElDX1dCX0VOVmAgYmVsb25nIGluIHdyYW5nbGVyIGB2YXJzYC5cbiAqL1xuY29uc3QgTk9OX1NFQ1JFVF9LRVlTID0gbmV3IFNldChbXG4gICdDSScsXG4gIC8vIFdyYW5nbGVyIHN5c3RlbS9hdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3dyYW5nbGVyL3N5c3RlbS1lbnZpcm9ubWVudC12YXJpYWJsZXMvKSxcbiAgLy8gaW5jbHVkaW5nIGxlZ2FjeSBhbGlhc2VzOyBhcHAtc3BlY2lmaWMgbmFtZXMgc3VjaCBhcyBDTE9VREZMQVJFX1IyX0FDQ0VTU19LRVlfSUQgc3RheSBlbGlnaWJsZS5cbiAgJ0NGX0FDQ09VTlRfSUQnLFxuICAnQ0ZfQVBJX0JBU0VfVVJMJyxcbiAgJ0NGX0FQSV9FTUFJTCcsXG4gICdDRl9BUElfS0VZJyxcbiAgJ0NGX0FQSV9UT0tFTicsXG4gICdDRl9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX1NFQ1JFVCcsXG4gICdDTE9VREZMQVJFX0FDQ09VTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BUElfQkFTRV9VUkwnLFxuICAnQ0xPVURGTEFSRV9BUElfS0VZJyxcbiAgJ0NMT1VERkxBUkVfQVBJX1RPS0VOJyxcbiAgJ0NMT1VERkxBUkVfQVVUSF9VU0VfS0VZUklORycsXG4gICdDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEJyxcbiAgJ0NMT1VERkxBUkVfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9FTlYnLFxuICAnQ0xPVURGTEFSRV9JTkNMVURFX1BST0NFU1NfRU5WJyxcbiAgJ0NMT1VERkxBUkVfTE9BRF9ERVZfVkFSU19GUk9NX0RPVF9FTlYnLFxuICAnRE9DS0VSX0hPU1QnLFxuICAnSFRUUF9QUk9YWScsXG4gICdIVFRQU19QUk9YWScsXG4gICdodHRwX3Byb3h5JyxcbiAgJ2h0dHBzX3Byb3h5JyxcbiAgJ0ZPUkNFX0NPTE9SJyxcbiAgJ01JTklGTEFSRV9DQUNIRV9ESVInLFxuICAnTUlTRV9FTlYnLFxuICAnTk9fQ09MT1InLFxuICAnTkVYVF9QVUJMSUNfV0JfRU5WJyxcbiAgJ05FWFRfUFVCTElDX1dCX1ZFUlNJT04nLFxuICAnTk9ERV9FTlYnLFxuICAnUE9SVCcsXG4gICdXQl9FTlYnLFxuICAnV0JfVkVSU0lPTicsXG5dKTtcblxuY29uc3QgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMgPSBbJ1dSQU5HTEVSXycsICdDTE9VREZMQVJFX0hZUEVSRFJJVkVfTE9DQUxfQ09OTkVDVElPTl9TVFJJTkdfJywgJ0NMT1VERkxBUkVfQ0ZfRkVUQ0hfJ107XG5cbmZ1bmN0aW9uIGlzTm9uU2VjcmV0S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fU0VDUkVUX0tFWVMuaGFzKGtleSkgfHwgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIERlcGxveUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIERlcGxveUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPERlcGxveUNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgRGVwbG95Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6XG4gICAgJ0RlcGxveSBhIENsb3VkZmxhcmUgV29ya2VycyBhcHAgKHZpbmV4dCBvciBwbGFpbiBXb3JrZXIpIHRvIHRoZSBXQl9FTlYgZW52aXJvbm1lbnQ6IHZhbGlkYXRlIHNlY3JldHMsIGJ1aWxkLCBhcHBseSByZW1vdGUgRDEgbWlncmF0aW9ucywgdGhlbiBkZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5LicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PERlcGxveUNvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBEZXBsb3lDb21tYW5kQXJndikge1xuICAgIC8vIEEgc3RyYXkgZXhwb3J0ZWQgQ0xPVURGTEFSRV9FTlYgd291bGQgYmFrZSB0aGUgd3JvbmcgZW52aXJvbm1lbnQgaW50byB0aGUgYnVpbGQgYW5kXG4gICAgLy8gYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeCB0d2ljZSBvbiBkZXBsb3k7IGl0IGlzIHJlLXNldCBleHBsaWNpdGx5IHdoZXJlIG5lZWRlZC5cbiAgICAvLyBBIGRvdGVudiBmaWxlIGRlZmluaW5nIGl0IHN0aWxsIHN1cmZhY2VzIHRocm91Z2ggcHJvamVjdC5lbnYsIHdoaWNoIHRoZSBleHBsaWNpdCBgLS1lbnZgXG4gICAgLy8gZmxhZ3MgYmVsb3cgb3ZlcnJpZGUuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNMT1VERkxBUkVfRU5WO1xuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBpZiAoIXdyYW5nbGVyQ29uZmlnUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ3diIGRlcGxveSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAobm8gd3JhbmdsZXIgY29uZmlnIGZvdW5kKS4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGVudk5hbWUgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgaWYgKCFlbnZOYW1lIHx8IGVudk5hbWUgPT09ICdkZXZlbG9wbWVudCcgfHwgZW52TmFtZSA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYFdCX0VOViBtdXN0IG5hbWUgYSBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gc3RhZ2luZyBvciBwcm9kdWN0aW9uKSwgYnV0IGlzICR7ZW52TmFtZX0uYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHZhbHVlcyBnbyBpbnRvIGJvdGggcHJvY2Vzcy5lbnYgKGluaGVyaXRlZCBieSBldmVyeXRoaW5nIHdiIHNwYXducykgYW5kIHByb2plY3QuZW52XG4gICAgLy8gKHRoZSBlbnZpcm9ubWVudCB3YiBpdHNlbGYgcmVhZHMgYW5kIHBhc3NlcyBleHBsaWNpdGx5KTsgdGhlIGxhdHRlciBpcyBhIGNhY2hlZCBzbmFwc2hvdFxuICAgIC8vIHRha2VuIGJlZm9yZSB0aGlzIHBvaW50LCBzbyB3cml0aW5nIG9ubHkgdG8gcHJvY2Vzcy5lbnYgd291bGQgbGVhdmUgd2IncyBvd24gcHJlZmxpZ2h0IOKAlFxuICAgIC8vIGFuZCBhbnkgY29tbWFuZCBzcGF3bmVkIHdpdGggcHJvamVjdC5lbnYg4oCUIHdpdGhvdXQgdGhlIHRva2VuLlxuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZWYXJzID0gcmVhZENsb3VkZmxhcmVFbnZGaWxlcyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3Qucm9vdERpclBhdGgpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNsb3VkZmxhcmVFbnZWYXJzKSkge1xuICAgICAgLy8gPz89IHNvIHRoYXQgYW4gZXhwbGljaXRseSBleHBvcnRlZCBlbXB0eSB2YWx1ZSBzdGlsbCB3aW5zIG92ZXIgdGhlIGZpbGUuXG4gICAgICBwcm9jZXNzLmVudltrZXldID8/PSB2YWx1ZTtcbiAgICAgIHByb2plY3QuZW52W2tleV0gPz89IHZhbHVlO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRDb25maWcgPSByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYocHJvamVjdCwgZW52TmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFN0cmluZyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBpZiAoIXJlc29sdmVkQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHBhcnNlICR7d3JhbmdsZXJDb25maWdQYXRofS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGFjY291bnRJZCA9IHJlc29sdmVkQ29uZmlnLmFjY291bnRJZCA/PyBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQ7XG4gICAgLy8gUHJlZmVyIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIHdoZW5ldmVyIHRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCdzIEQxIGJpbmRpbmdzIGhhdmUgYW5cbiAgICAvLyBleGlzdGluZyBtaWdyYXRpb25zIGRpcmVjdG9yeS4gQSBkcml6emxlLW9ybSBkZXBlbmRlbmN5IGFsb25lIGRvZXMgbm90IGltcGx5IHRoZSBwcm9qZWN0XG4gICAgLy8gbWlncmF0ZXMgRDEgd2l0aCBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyOiB0aGUgZXhwbGljaXQgbWFya2VyIGlzIGEgZHJpenpsZSBjb25maWdcbiAgICAvLyB3aG9zZSBkaWFsZWN0L2RyaXZlciB0YXJnZXRzIHNxbGl0ZSAvIGQxLWh0dHAgLyBkdXJhYmxlLXNxbGl0ZSAoc2VlIHVzZXNEcml6emxlS2l0Rm9yRDE7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTQyKS4gQSBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgYW5vdGhlclxuICAgIC8vIGRhdGFiYXNlIChlLmcuIFBvc3RncmVTUUwgdmlhIEh5cGVyZHJpdmUpIGxlYXZlcyB0aGUgRDEgYmluZGluZ3MgdW5tYW5hZ2VkIGJ5IHdiIGRlcGxveS5cbiAgICBjb25zdCB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT5cbiAgICAgIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdCwgZGF0YWJhc2UpXG4gICAgKTtcbiAgICBjb25zdCBkcml6emxlS2l0TWFuYWdlc0QxID0gdXNlc0RyaXp6bGVLaXRGb3JEMShwcm9qZWN0KTtcbiAgICBpZiAoXG4gICAgICBkcml6emxlS2l0TWFuYWdlc0QxICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoIDwgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAvLyBNaWdyYXRpbmcgb25seSB0aGUgd3JhbmdsZXItbmF0aXZlIHN1YnNldCB3b3VsZCBzaWxlbnRseSBkZXBsb3kgY29kZSBhZ2FpbnN0IHRoZVxuICAgICAgLy8gb3RoZXIsIHVubWlncmF0ZWQgZGF0YWJhc2VzLlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgZG9lcyBub3Qgc3VwcG9ydCBtaXhpbmcgd3JhbmdsZXItbmF0aXZlIGFuZCBub24tbmF0aXZlIEQxIG1pZ3JhdGlvbiBsYXlvdXRzLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBkcml6emxlRDFEYXRhYmFzZSA9XG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBkcml6emxlS2l0TWFuYWdlc0QxID8gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXNbMF0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoID09PSAwICYmIGRyaXp6bGVLaXRNYW5hZ2VzRDEgJiYgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgc3VwcG9ydHMgZHJpenpsZS1raXQgbWlncmF0aW9ucyBvbmx5IGZvciBhIHNpbmdsZSBEMSBiaW5kaW5nOyBmb3VuZCBtdWx0aXBsZS4nKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlZEQxRGF0YWJhc2VzID0gbmV3IFNldCh3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzKTtcbiAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UpIG1hbmFnZWREMURhdGFiYXNlcy5hZGQoZHJpenpsZUQxRGF0YWJhc2UpO1xuICAgIGNvbnN0IHVubWFuYWdlZEQxRGF0YWJhc2VzID0gcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMuZmlsdGVyKChkYXRhYmFzZSkgPT4gIW1hbmFnZWREMURhdGFiYXNlcy5oYXMoZGF0YWJhc2UpKTtcbiAgICBpZiAodW5tYW5hZ2VkRDFEYXRhYmFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU2F5IHNvIG91dCBsb3VkIGluc3RlYWQgb2Ygc2lsZW50bHkgZGVwbG95aW5nIGNvZGUgYWdhaW5zdCB1bm1pZ3JhdGVkIGRhdGFiYXNlczogdGhlXG4gICAgICAvLyBkcml6emxlIG1hcmtlciBkZXRlY3Rpb24gaXMgaGV1cmlzdGljICh0ZXh0IHNjYW4gb2YgZHJpenpsZS5jb25maWcuKiksIHNvIGEgcHJvamVjdCB0aGF0XG4gICAgICAvLyBnZW51aW5lbHkgbWlncmF0ZXMgRDEgbXVzdCBiZSBhYmxlIHRvIG5vdGljZSB3aGVuIG5vIG1lY2hhbmlzbSB3YXMgc2VsZWN0ZWQuIFRoaXMgYWxzb1xuICAgICAgLy8gY292ZXJzIHBhcnRpYWwgbGF5b3V0cyAoc29tZSBiaW5kaW5ncyB3cmFuZ2xlci1uYXRpdmUsIG90aGVycyB1bm1hbmFnZWQpLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYE5vIEQxIG1pZ3JhdGlvbiBtZWNoYW5pc20gZGV0ZWN0ZWQgZm9yICR7dW5tYW5hZ2VkRDFEYXRhYmFzZXNcbiAgICAgICAgICAgIC5tYXAoKGRhdGFiYXNlKSA9PiBkYXRhYmFzZS5iaW5kaW5nID8/IGRhdGFiYXNlLmRhdGFiYXNlX25hbWUgPz8gJ3VubmFtZWQgYmluZGluZycpXG4gICAgICAgICAgICAuam9pbignLCAnKX0gYCArXG4gICAgICAgICAgICAnKG5vIHdyYW5nbGVyIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IGFuZCBubyBkcml6emxlIGNvbmZpZyB0YXJnZXRpbmcgc3FsaXRlL2QxLWh0dHAvZHVyYWJsZS1zcWxpdGUpOyB3YiBkZXBsb3kgd2lsbCBub3QgcnVuIEQxIG1pZ3JhdGlvbnMgZm9yIHRoZW0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBEcnkgcnVucyBleGVjdXRlIG5vdGhpbmcgYXV0aGVudGljYXRlZCwgc28gdGhleSBza2lwIHRoZSBjcmVkZW50aWFsIHByZWZsaWdodCBlbnRpcmVseS5cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICAvLyBBIGRyaXp6bGUtc2VsZWN0ZWQgRDEgZGF0YWJhc2Ugcm91dGVzIGJvdGggdGhlIG1pZ3JhdGlvbiBpbiBzdGVwIDMgYW5kIGFueSBkZXBsb3kvcG9zdFxuICAgICAgLy8gaG9vayB0aHJvdWdoIGRyaXp6bGUta2l0J3MgZDEtaHR0cCBkcml2ZXIsIHdoaWNoIG5lZWRzIENMT1VERkxBUkVfQVBJX1RPS0VOIGV2ZW4gZm9yXG4gICAgICAvLyBsb2NhbCwgd3JhbmdsZXItT0F1dGggZGVwbG95cy4gRmFpbGluZyBoZXJlIGtlZXBzIHRoZSBmYWlsLWZhc3Qgb3JkZXJpbmc6IGEgbWlzc2luZyB0b2tlblxuICAgICAgLy8gbXVzdCBhYm9ydCBiZWZvcmUgdGhlIGRlcGxveSBnb2VzIGxpdmUsIG5vdCBkdXJpbmcgbWlncmF0aW9uIG9yIGRlcGxveS9wb3N0XG4gICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTU2KS4gV3JhbmdsZXItbmF0aXZlIHByb2plY3RzICh3aXRoIG9yXG4gICAgICAvLyB3aXRob3V0IGhvb2tzKSBtdXN0IG5vdCByZXF1aXJlIHRoZSB0b2tlbjogYSBsb2NhbCB3cmFuZ2xlciBPQXV0aCBsb2dpbiBzdWZmaWNlcyB0aGVyZSxcbiAgICAgIC8vIGV2ZW4gdGhvdWdoIHN0ZXAgNSBzdGlsbCBleHBvcnRzIENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgdG8gdGhlaXIgaG9va3MuXG4gICAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UgJiYgIXByb2plY3QuZW52LkNMT1VERkxBUkVfQVBJX1RPS0VOKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdDTE9VREZMQVJFX0FQSV9UT0tFTiBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uID1cbiAgICAgICAgISFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIXByb2plY3QuZW52LkNGX0FQSV9UT0tFTiB8fFxuICAgICAgICAhIShwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9FTUFJTCkgfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0ZfQVBJX0tFWSAmJiBwcm9qZWN0LmVudi5DRl9FTUFJTCk7XG4gICAgICBpZiAoaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgIWhhc1dyYW5nbGVyQXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dyYW5nbGVyIGF1dGhlbnRpY2F0aW9uIChlLmcuIENMT1VERkxBUkVfQVBJX1RPS0VOKSBpcyByZXF1aXJlZCB0byBkZXBsb3kgb24gQ0kuJykpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwLXNwZWNpZmljIHZhbGlkYXRpb24gaG9vayAoZS5nLiBzZWNyZXQgcGFpcnMgdGhhdCBtdXN0IGJlIGJvdGgtc2V0LW9yLWJvdGgtZW1wdHkpLlxuICAgIC8vIFRoZSByZXVzYWJsZSBkZXBsb3kueW1sIGFscmVhZHkgcnVucyBpdCBvbiBDSTsgcnVuIGl0IGhlcmUgZm9yIGxvY2FsIGRlcGxveXMuXG4gICAgaWYgKCFpc0NJKHByb2plY3QuZW52LkNJKSAmJiBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGVwbG95L2NpLXNldHVwJ10pIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZGVwbG95L2NpLXNldHVwJywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuXG4gICAgLy8gMS4gUmVzb2x2ZSBhbmQgdmFsaWRhdGUgYWxsIHNlY3JldHMgYmVmb3JlIGFueSBidWlsZCBvciByZW1vdGUgbXV0YXRpb24sIHNvIGEgbWlzc2luZ1xuICAgIC8vICAgIHNlY3JldCBhYm9ydHMgdGhlIGRlcGxveSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBtaWdyYXRlZCBkYXRhYmFzZSBiZWhpbmQgYW4gb2xkIFdvcmtlci5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gUmVzdHJpY3QgdGhlIHNlY3JldHMgZG9tYWluIHRvIGtleXMgdGhlIHByb2plY3QncyBmbm94IGNvbmZpZ3VyYXRpb24gZGVjbGFyZXM6IGBtaXNlIGVudmBcbiAgICAvLyBvdXRwdXQgKHJlcG9ydGVkIGFzIGEgcHNldWRvLXNvdXJjZSkgbWl4ZXMgaW4gaG9zdC90b29sIHZhcmlhYmxlcyBzdWNoIGFzIENBUkdPX0hPTUUsXG4gICAgLy8gd2hpY2ggbXVzdCBuZXZlciBiZSB1cGxvYWRlZCBhcyBXb3JrZXIgc2VjcmV0cy5cbiAgICBjb25zdCBmbm94S2V5cyA9IG5ldyBTZXQoXG4gICAgICBlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgaWYgKCFmbm94S2V5cy5oYXMoa2V5KSkgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gICAgLy8gTmFtZXMgZGVjbGFyZWQgdmlhIHdyYW5nbGVyIGBzZWNyZXRzLnJlcXVpcmVkYCBtYXkgbGlrZXdpc2UgYmUgc3VwcGxpZWQgcHVyZWx5IGFzXG4gICAgLy8gZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuIENJIHdvcmtmbG93IGVudikgaW5zdGVhZCBvZiBmbm94IHZhbHVlcy5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzKSB7XG4gICAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGV4cG9ydGVkVmFsdWU7XG4gICAgfVxuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZG90ZW52IHZhbHVlcyAocHJvamVjdC5lbnYgYWxyZWFkeVxuICAgIC8vIGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBkZXBsb3lgIHdvdWxkIHB1c2ggdGhlIHN0YWxlIGZpbGUgdmFsdWUuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0cyA9IHNlbGVjdFdvcmtlclNlY3JldHMoZW52VmFycywgWy4uLnJlc29sdmVkQ29uZmlnLnZhcktleXMsIC4uLnJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc10pO1xuICAgIC8vIGAtLXZhciBXQl9WRVJTSU9OOi4uLmAgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIG9uIGRlcGxveSwgc28gYVxuICAgIC8vIHJlc291cmNlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIHdvdWxkIHNpbGVudGx5IGJlY29tZSBhIHN0cmluZyB2YXJpYWJsZS5cbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTiAmJiByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMoJ1dCX1ZFUlNJT04nKSkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1dCX1ZFUlNJT04gY29sbGlkZXMgd2l0aCBhIFdvcmtlciBiaW5kaW5nIG5hbWU7IHJlbmFtZSB0aGUgYmluZGluZy4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGJpbmRpbmdDb2xsaXNpb25zID0gT2JqZWN0LmtleXMoZW52VmFycykuZmlsdGVyKChrZXkpID0+IHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcyhrZXkpKTtcbiAgICBpZiAoYmluZGluZ0NvbGxpc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVXBsb2FkaW5nIGEgc2VjcmV0IG5hbWVkIGxpa2UgYSBiaW5kaW5nIHdvdWxkIHJlcGxhY2UgdGhlIGJpbmRpbmcgd2l0aCBhIHBsYWluIHN0cmluZy5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGBTa2lwcGluZyBlbnYga2V5cyB0aGF0IGNvbGxpZGUgd2l0aCBXb3JrZXIgYmluZGluZyBuYW1lczogJHtiaW5kaW5nQ29sbGlzaW9ucy5qb2luKCcsICcpfWApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgYHNlY3JldHMucmVxdWlyZWRgIG9ubHkgZHVyaW5nIHRoZSByZWFsIHVwbG9hZCDigJQgYWZ0ZXIgbWlncmF0aW9ucyDigJRcbiAgICAvLyBzbyB3YiBjaGVja3MgdXBmcm9udDogZWFjaCByZXF1aXJlZCBuYW1lIG11c3QgYmUgYSBrZXkgaW4gdGhlIG91dGdvaW5nIHBheWxvYWQgKHByZXNlbmNlLFxuICAgIC8vIG5vdCB0cnV0aGluZXNzIOKAlCBhbiBleHBsaWNpdCBlbXB0eSBjbGVhcnMgYSBzdGFsZSB2YWx1ZSkgb3IgYW4gZWZmZWN0aXZlIHZhci9iaW5kaW5nLlxuICAgIGNvbnN0IHVuc2F0aXNmaWVkUmVxdWlyZWRTZWNyZXROYW1lcyA9IHJlc29sdmVkQ29uZmlnLnJlcXVpcmVkU2VjcmV0TmFtZXMuZmlsdGVyKFxuICAgICAgKG5hbWUpID0+XG4gICAgICAgICFPYmplY3QuaGFzT3duKHNlY3JldHMsIG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy52YXJLZXlzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgICAgICFyZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXMuaW5jbHVkZXMobmFtZSlcbiAgICApO1xuICAgIGlmICh1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBTZWNyZXRzIHJlcXVpcmVkIGJ5IHRoZSB3cmFuZ2xlciBjb25maWcgYXJlIG5vdCBwcm92aWRlZDogJHt1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHNlY3JldEtleXMgPSBPYmplY3Qua2V5cyhzZWNyZXRzKS50b1NvcnRlZCgpO1xuICAgIC8vIENsb3VkZmxhcmUgbGltaXRzIGEgYnVsayB1cGxvYWQgdG8gMTAwIHNlY3JldHMsIGVhY2ggdmFyaWFibGUvc2VjcmV0IHZhbHVlIHRvIDUgS0IsIGFuZFxuICAgIC8vIHRoZSBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgY291bnQgdG8gMTI4ICg2NCBvbiB0aGUgRnJlZSBwbGFuLCB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWRcbiAgICAvLyBoZXJlIOKAlCBoZW5jZSBhIHdhcm5pbmcpLiBGYWlsaW5nIGJlZm9yZSBhbnkgYnVpbGQgb3IgbWlncmF0aW9uIGtlZXBzIGFuIG92ZXJzaXplZCBwYXlsb2FkXG4gICAgLy8gZnJvbSBhYm9ydGluZyB0aGUgZGVwbG95IGFmdGVyIHJlbW90ZSBtaWdyYXRpb25zIGFscmVhZHkgcmFuLlxuICAgIGlmIChzZWNyZXRLZXlzLmxlbmd0aCA+IDEwMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKGBDbG91ZGZsYXJlIGFjY2VwdHMgYXQgbW9zdCAxMDAgc2VjcmV0cyBwZXIgZGVwbG95LCBidXQgJHtzZWNyZXRLZXlzLmxlbmd0aH0gd2VyZSBzZWxlY3RlZC5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gVGhlIENMSS1wcm92aWRlZCBXQl9WRVJTSU9OIG92ZXJsYXlzIGEgY29uZmlndXJlZCB2YXIgb2YgdGhlIHNhbWUgbmFtZSBvbiBkZXBsb3ksXG4gICAgLy8gc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlIHBhcnRpY2lwYXRlcyBpbiB0aGUgbGltaXQgY2hlY2tzLlxuICAgIGNvbnN0IGVmZmVjdGl2ZVZhcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzPHVua25vd24+KHJlc29sdmVkQ29uZmlnLnZhcnMpKTtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikgZWZmZWN0aXZlVmFycy5zZXQoJ1dCX1ZFUlNJT04nLCBwcm9qZWN0LmVudi5XQl9WRVJTSU9OKTtcbiAgICBjb25zdCB2YXJFbnRyaWVzID0gWy4uLmVmZmVjdGl2ZVZhcnNdO1xuICAgIGNvbnN0IG92ZXJzaXplZEtleXMgPSBbXG4gICAgICAuLi5zZWNyZXRLZXlzLmZpbHRlcigoa2V5KSA9PiBCdWZmZXIuYnl0ZUxlbmd0aChzZWNyZXRzW2tleV0gPz8gJycsICd1dGY4JykgPiA1ICogMTAyNCksXG4gICAgICAuLi52YXJFbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFssIHZhbHVlXSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAndXRmOCcpID4gNSAqIDEwMjRcbiAgICAgICAgKVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICBdO1xuICAgIGlmIChvdmVyc2l6ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBWYXJpYWJsZSBvciBzZWNyZXQgdmFsdWVzIGV4Y2VlZCBDbG91ZGZsYXJlJ3MgNSBLQiBsaW1pdDogJHtvdmVyc2l6ZWRLZXlzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICAvLyBgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlOiByZW1vdGUgc2VjcmV0cyBhYnNlbnQgZnJvbSB0aGUgcGF5bG9hZCBzdGF5IGF0dGFjaGVkIHRvIHRoZVxuICAgIC8vIG5ldyB2ZXJzaW9uLCBzbyB0aGV5IGNvdW50IGFnYWluc3QgdGhlIGNvbWJpbmVkIGxpbWl0IHRvby4gTGlzdGluZyB0aGVtIG5lZWRzIGFuXG4gICAgLy8gYXV0aGVudGljYXRlZCByZW1vdGUgcm91bmQtdHJpcCwgd2hpY2ggZHJ5IHJ1bnMgc2tpcDsgd2hlbiB0aGUgbGlzdGluZyBmYWlscyBmb3IgYW55XG4gICAgLy8gcmVhc29uIG90aGVyIHRoYW4gYSBub3QteWV0LWNyZWF0ZWQgV29ya2VyLCBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGNvdW50IGluc3RlYWQgb2ZcbiAgICAvLyBibG9ja2luZyBhIGRlcGxveSB0aGF0IHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuXG4gICAgY29uc3QgcmVtb3RlU2VjcmV0TmFtZXMgPSBhcmd2LmRyeVJ1blxuICAgICAgPyBbXVxuICAgICAgOiBhd2FpdCBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMocHJvamVjdCwgYXJndiwgd3JhbmdsZXJDb25maWdQYXRoLCByZXNvbHZlZENvbmZpZywgZW52TmFtZSk7XG4gICAgY29uc3QgaW5oZXJpdGVkU2VjcmV0TmFtZXMgPSBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgICAgIHJlbW90ZVNlY3JldE5hbWVzID8/IFtdLFxuICAgICAgc2VjcmV0cyxcbiAgICAgIHZhckVudHJpZXMubWFwKChba2V5XSkgPT4ga2V5KSxcbiAgICAgIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lc1xuICAgICk7XG4gICAgY29uc3QgY29tYmluZWRDb3VudCA9XG4gICAgICBuZXcgU2V0KFsuLi5zZWNyZXRLZXlzLCAuLi52YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSldKS5zaXplICsgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoO1xuICAgIGNvbnN0IGluaGVyaXRlZE5vdGUgPVxuICAgICAgaW5oZXJpdGVkU2VjcmV0TmFtZXMubGVuZ3RoID4gMFxuICAgICAgICA/IGAgKGluY2x1ZGluZyAke2luaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aH0gcmVtb3RlIHNlY3JldHMga2VwdCBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uOiAke2luaGVyaXRlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9KWBcbiAgICAgICAgOiAnJztcbiAgICBpZiAoY29tYmluZWRDb3VudCA+IDEyOCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGBDbG91ZGZsYXJlIGFsbG93cyBhdCBtb3N0IDEyOCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgY29tYmluZWQsIGJ1dCAke2NvbWJpbmVkQ291bnR9IHdlcmUgc2VsZWN0ZWQke2luaGVyaXRlZE5vdGV9LmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiA2NCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYCR7Y29tYmluZWRDb3VudH0gdmFyaWFibGVzIGFuZCBzZWNyZXRzJHtpbmhlcml0ZWROb3RlfSBleGNlZWQgdGhlIEZyZWUgcGxhbidzIGxpbWl0IG9mIDY0LmApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5jeWFuKFxuICAgICAgICBgRGVwbG95aW5nICR7cmVzb2x2ZWRDb25maWcud29ya2VyTmFtZSA/PyBwcm9qZWN0Lm5hbWV9ICgke2Vudk5hbWV9KSB3aXRoICR7c2VjcmV0S2V5cy5sZW5ndGh9IHNlY3JldHM6ICR7c2VjcmV0S2V5cy5qb2luKCcsICcpfWBcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gMi4gQnVpbGQgKHZpbmV4dCBlbWJlZHMgdGhlIGVudmlyb25tZW50LWFwcGxpZWQgd3JhbmdsZXIgY29uZmlnIGludG8gZGlzdC9zZXJ2ZXIvd3JhbmdsZXIuanNvbikuXG4gICAgLy8gICAgQnVpbGRpbmcgYmVmb3JlIG1pZ3JhdGluZyBrZWVwcyBhIGJ1aWxkIGZhaWx1cmUgZnJvbSBsZWF2aW5nIGEgbWlncmF0ZWQgc2NoZW1hIGJlaGluZFxuICAgIC8vICAgIHRoZSBvbGQgV29ya2VyLiBQbGFpbiBXb3JrZXJzIGhhdmUgbm8gYnVpbGQgc3RlcDsgd3JhbmdsZXIgYnVuZGxlcyB0aGUgZW50cnkgaXRzZWxmLlxuICAgIGNvbnN0IGlzVmluZXh0ID0gISEocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LnZpbmV4dCA/PyBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8udmluZXh0KTtcbiAgICBjb25zdCBkZXBsb3lDb25maWdQYXRoID0gaXNWaW5leHQgPyBwYXRoLmpvaW4oJ2Rpc3QnLCAnc2VydmVyJywgJ3dyYW5nbGVyLmpzb24nKSA6IHdyYW5nbGVyQ29uZmlnUGF0aDtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52QXNzaWdubWVudCA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uXG4gICAgICA/IGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ0NMT1VERkxBUkVfRU5WJywgZW52TmFtZSl9IGBcbiAgICAgIDogJyc7XG4gICAgaWYgKGlzVmluZXh0KSB7XG4gICAgICBpZiAocHJvamVjdC5lbnYuV0JfVkVSU0lPTikge1xuICAgICAgICBwcm9qZWN0LmVudi5ORVhUX1BVQkxJQ19XQl9WRVJTSU9OIHx8PSBwcm9qZWN0LmVudi5XQl9WRVJTSU9OO1xuICAgICAgfVxuICAgICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignWUFSTiBydW4gZ2VuLWNvZGUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtjbG91ZGZsYXJlRW52QXNzaWdubWVudH1ZQVJOIHZpbmV4dCBidWlsZGAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgLy8gT24gZHJ5IHJ1bnMgdGhlIHZpbmV4dCBidWlsZCBhYm92ZSBpcyBhIHByaW50ZWQgbm8tb3AsIHNvIHRoZSBidWlsdCBjb25maWcgaXNcbiAgICAgIC8vIGxlZ2l0aW1hdGVseSBhYnNlbnQgYW5kIG11c3Qgbm90IGFib3J0IHRoZSBydW4uXG4gICAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRlcGxveUNvbmZpZ1BhdGgpKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgJHtkZXBsb3lDb25maWdQYXRofSBub3QgZm91bmQ7IHRoZSB2aW5leHQgYnVpbGQgZGlkIG5vdCBwcm9kdWNlIGEgZGVwbG95IGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIFdyYW5nbGVyIHZhbGlkYXRlcyBpdHMgY29uZmlnIHNjaGVtYSBvbmx5IHdoZW4gaXQgcnVucywgc28gYSBkcnkgcnVuIG9mIHRoZSBidWlsdFxuICAgICAgLy8gY29uZmlnIHN1cmZhY2VzIGNvbmZpZyBhbmQgYnVuZGxlIGVycm9ycyBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zIGJlbG93IG11dGF0ZVxuICAgICAgLy8gdGhlIGRhdGFiYXNlLCBtaXJyb3JpbmcgdGhlIHBsYWluLVdvcmtlciBkcnkgcnVuLiBObyAtLWVudjogdGhlIGJ1aWx0IGNvbmZpZyBhbHJlYWR5XG4gICAgICAvLyBoYXMgdGhlIGVudmlyb25tZW50IGFwcGxpZWQuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRlcGxveUNvbmZpZ1BhdGgpfWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBsYWluIFdvcmtlcnMgYXJlIGZpcnN0IGNvbXBpbGVkIGJ5IHdyYW5nbGVyIGR1cmluZyB0aGUgZGVwbG95IGl0c2VsZjsgYSBkcnkgcnVuXG4gICAgICAvLyBzdXJmYWNlcyBjb21waWxlIGVycm9ycyAoZS5nLiBhIG1pc3NpbmcgZW50cnkgcG9pbnQpIEJFRk9SRSB0aGUgcmVtb3RlIG1pZ3JhdGlvbnNcbiAgICAgIC8vIGJlbG93IG11dGF0ZSB0aGUgZGF0YWJhc2UuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIGBZQVJOIHdyYW5nbGVyIGRlcGxveSAtLWRyeS1ydW4gLS1jb25maWcgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KHdyYW5nbGVyQ29uZmlnUGF0aCl9JHtyZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJ31gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEFwcGx5IEQxIG1pZ3JhdGlvbnMgdG8gdGhlIHJlbW90ZSBkYXRhYmFzZSB3aXRoIHRoZSBwcm9qZWN0J3Mgc2luZ2xlIG1pZ3JhdGlvblxuICAgIC8vICAgIG1lY2hhbmlzbSAod3JhbmdsZXItbmF0aXZlIHdoZW4gYSBtaWdyYXRpb25zIGRpcmVjdG9yeSBleGlzdHMsIGVsc2UgZHJpenpsZS1raXQgd2hlblxuICAgIC8vICAgIHRoZSBkcml6emxlIGNvbmZpZyB0YXJnZXRzIHNxbGl0ZS9kMS1odHRwL2R1cmFibGUtc3FsaXRlKS4gTWlncmF0aW9ucyBtdXN0IGJlIGJhY2t3YXJkXG4gICAgLy8gICAgY29tcGF0aWJsZTogdGhlIG9sZCBXb3JrZXIgc2VydmVzXG4gICAgLy8gICAgdHJhZmZpYyB1bnRpbCB0aGUgZGVwbG95IGJlbG93LlxuICAgIGNvbnN0IGVudk9wdGlvbiA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnO1xuICAgIGZvciAoY29uc3QgZGF0YWJhc2Ugb2Ygd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcykge1xuICAgICAgY29uc3QgZGF0YWJhc2VOYW1lID0gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyBkYXRhYmFzZS5iaW5kaW5nO1xuICAgICAgaWYgKCFkYXRhYmFzZU5hbWUpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRhdGFiYXNlTmFtZSl9IC0tcmVtb3RlIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7ZW52T3B0aW9ufWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkge1xuICAgICAgaWYgKCFkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVGhlICR7ZW52TmFtZX0gRDEgYmluZGluZyBoYXMgbm8gZGF0YWJhc2VfaWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGlmICghYWNjb3VudElkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCAob3IgYWNjb3VudF9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnKSBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBidWlsZERyaXp6bGVLaXRDb21tYW5kKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgJ21pZ3JhdGUnLFxuICAgICAgICAgIGBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEPSR7ZHJpenpsZUQxRGF0YWJhc2UuZGF0YWJhc2VfaWR9IENMT1VERkxBUkVfQUNDT1VOVF9JRD0ke2FjY291bnRJZH1gXG4gICAgICAgICksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNC4gRGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseSAobm8gcG9zdC1kZXBsb3kgc2VjcmV0IHB1c2ggdGhhdCBjb3VsZCBsZWF2ZSB0aGVcbiAgICAvLyAgICBuZXcgdmVyc2lvbiBydW5uaW5nIHdpdGhvdXQg4oCUIG9yIHdpdGggc3RhbGUg4oCUIHNlY3JldHMpLiBUaGUgc2VjcmV0cyBKU09OIGdvZXMgdGhyb3VnaFxuICAgIC8vICAgIGEgbW9kZS0wNjAwIGZpbGUgaW4gYSBwcml2YXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZGVsZXRlZCByaWdodCBhZnRlciB0aGUgZGVwbG95OlxuICAgIC8vICAgIC9kZXYvc3RkaW4gaXMgTk9UIHJlbGlhYmxlIGhlcmUgYmVjYXVzZSB3cmFuZ2xlciByZWFkcyB0aGUgc2VjcmV0cyBmaWxlIG9ubHkgYWZ0ZXJcbiAgICAvLyAgICB1cGxvYWRpbmcgYXNzZXRzLCBieSB3aGljaCBwb2ludCB0aGUgcGlwZWQgc3RkaW4gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNvbnN1bWVkIOKAlFxuICAgIC8vICAgIG9ic2VydmVkIGFzIGEgZmxha3kgYENvdWxkIG5vdCByZWFkIGZpbGU6IC9kZXYvc3RkaW5gIG9uIENJLiBFeHBsaWNpdGx5IGVtcHR5IHZhbHVlc1xuICAgIC8vICAgIHN0YXkgaW4gdGhlIHBheWxvYWQ6IC0tc2VjcmV0cy1maWxlIGlzIGFkZGl0aXZlLCBzbyBwdXNoaW5nICcnIGlzIHRoZSBvbmx5IHdheSB0b1xuICAgIC8vICAgIGNsZWFyIGEgc3RhbGUgc2VjcmV0LlxuICAgIGNvbnN0IGRlcGxveUFyZ3MgPSBbXG4gICAgICAnZGVwbG95JyxcbiAgICAgICctLWNvbmZpZycsXG4gICAgICBkZXBsb3lDb25maWdQYXRoLFxuICAgICAgLy8gdmluZXh0J3MgYnVpbHQgY29uZmlnIGFscmVhZHkgaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkOyBwYXNzaW5nIC0tZW52IHRoZXJlIHdvdWxkXG4gICAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlLlxuICAgICAgLi4uKCFpc1ZpbmV4dCAmJiByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0LmVudi5XQl9WRVJTSU9OID8gWyctLXZhcicsIGBXQl9WRVJTSU9OOiR7cHJvamVjdC5lbnYuV0JfVkVSU0lPTn1gXSA6IFtdKSxcbiAgICAgICctLXNlY3JldHMtZmlsZScsXG4gICAgXTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtkZXBsb3lBcmdzLmpvaW4oJyAnKX0gPHRlbXBvcmFyeSBzZWNyZXRzIGZpbGU+YCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gICAgICBjb25zdCBkZXBsb3lFbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gICAgICBkZWxldGUgZGVwbG95RW52LkNMT1VERkxBUkVfRU5WO1xuICAgICAgLy8gMG83MDAgZGlyZWN0b3J5ICsgMG82MDAgZmlsZTogcmVhZGFibGUgb25seSBieSB0aGUgZGVwbG95aW5nIHVzZXIsIGxpa2UgdGhlIGRvdGVudlxuICAgICAgLy8gZmlsZXMgdGhlIENJIHdvcmtmbG93IGFscmVhZHkgd3JpdGVzIG5leHQgdG8gaXQuIHdyYW5nbGVyIHJ1bnMgdGhyb3VnaCBhbiBhc3luYyBzcGF3blxuICAgICAgLy8gKHNwYXduU3luYyB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gYSBzaHV0ZG93biBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2Vzc1xuICAgICAgLy8gYmVmb3JlIGFueSBjbGVhbnVwKSBhbmQgdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIGluIGEgZmluYWxseSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgICAgIC8vIGRlcGxveSBjYW5ub3QgbGVhdmUgdGhlIHBsYWludGV4dCBzZWNyZXRzIGJlaGluZC4gU2h1dGRvd24gaGFuZGxpbmcgZGV0YWlsczpcbiAgICAgIC8vIC0gSGFuZGxlcnMgKGluY2x1ZGluZyBTSUdIVVAsIG9uIHdoaWNoIE5vZGUgYWxzbyB0ZXJtaW5hdGVzIGJ5IGRlZmF1bHQpIGFyZSBpbnN0YWxsZWRcbiAgICAgIC8vICAgQkVGT1JFIHRoZSBmaWxlIGlzIHdyaXR0ZW4gYW5kIHVzZSBwcm9jZXNzLm9uLCBub3Qgb25jZSwgc28gYSByZXBlYXRlZCBzaWduYWwgY2Fubm90XG4gICAgICAvLyAgIGZhbGwgYmFjayB0byBkZWZhdWx0IHRlcm1pbmF0aW9uIGFuZCBieXBhc3MgdGhlIGZpbmFsbHkgY2xlYW51cC5cbiAgICAgIC8vIC0gU0lHSFVQL1NJR1FVSVQgYXJlIGZvcndhcmRlZCB0byB3cmFuZ2xlciBhcyBTSUdURVJNOiB3cmFuZ2xlcidzIGxhdW5jaGVyIHJlbGF5cyBvbmx5XG4gICAgICAvLyAgIFNJR0lOVC9TSUdURVJNIHRvIGl0cyBpbm5lciBOb2RlIHByb2Nlc3MsIGFuZCBhbnl0aGluZyBlbHNlIHdvdWxkIG9ycGhhbiBhIGRlcGxveW1lbnRcbiAgICAgIC8vICAgdGhhdCBrZWVwcyBtdXRhdGluZyB0aGUgcmVtb3RlIFdvcmtlciBhZnRlciB3YiBleGl0cy5cbiAgICAgIC8vIC0gVGhlIHJlLXJhaXNlIGJlbG93IHVzZXMgdGhlIHNpZ25hbCB3YiBpdHNlbGYgcmVjZWl2ZWQ6IHdyYW5nbGVyIGNhdGNoZXMgU0lHSU5UIGFuZFxuICAgICAgLy8gICBleGl0cyBudW1lcmljYWxseSAoZS5nLiAxNDMpLCB3aGljaCBtdXN0IG5vdCBtYXNxdWVyYWRlIGFzIGFuIG9yZGluYXJ5IGZhaWx1cmUuXG4gICAgICBjb25zdCBzZWNyZXRzRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLWRlcGxveS0nKSk7XG4gICAgICBjb25zdCBzaHV0ZG93blNpZ25hbHMgPSBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBsZXQgd3JhbmdsZXJQcm9jZXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWNlaXZlZFNodXRkb3duU2lnbmFsID8/PSBzaWduYWw7XG4gICAgICAgICAgaWYgKHdyYW5nbGVyUHJvY2Vzcykge1xuICAgICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLmtpbGwoc2lnbmFsID09PSAnU0lHSU5UJyB8fCBzaWduYWwgPT09ICdTSUdURVJNJyA/IHNpZ25hbCA6ICdTSUdURVJNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIFdpdGggdGhlIGhhbmRsZXJzIHJlbW92ZWQsIHJlLXJhaXNpbmcgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbGV0IGRlcGxveVN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VjcmV0c0ZpbGVQYXRoID0gcGF0aC5qb2luKHNlY3JldHNEaXJQYXRoLCAnc2VjcmV0cy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2VjcmV0c0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZWNyZXRzKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICAgICAgZGVwbG95U3RhdHVzID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2VzcyA9IHNwYXduKCd3cmFuZ2xlcicsIFsuLi5kZXBsb3lBcmdzLCBzZWNyZXRzRmlsZVBhdGhdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGVudjogZGVwbG95RW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHNpZ25hbCA/IDEgOiAoY29kZSA/PyB1bmRlZmluZWQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBwcm9jZXNzLmV4aXQgc2tpcHMgZmluYWxseSBibG9ja3MsIHNvIHRoZSBleGl0LW9uLWZhaWx1cmUgYmVsb3cgc3RheXMgb3V0c2lkZS5cbiAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2VpdmVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIGNhbGxlciBvYnNlcnZlcyB0aGUgc2FtZSBzaWduYWwtZGVyaXZlZCBleGl0IHN0YXR1cy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNodXRkb3duU2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRlcGxveVN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgd3JhbmdsZXIgZGVwbG95IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2RlcGxveVN0YXR1cyA/PyAndW5rbm93bid9LmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGRlcGxveVN0YXR1cyA/PyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LiBPcHRpb25hbCBwb3N0LWRlcGxveSBob29rIChlLmcuIHNlZWRpbmcgdGhlIHJlbW90ZSBEMSB2aWEgZHJpenpsZSdzIGQxLWh0dHAgZHJpdmVyKS5cbiAgICAvLyAgICBBc3NpZ24gdGhlIHJlc29sdmVkIGlkcyB1bmNvbmRpdGlvbmFsbHk6IGEgc3RhbGUgZXhwb3J0ZWQgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRFxuICAgIC8vICAgIG11c3Qgbm90IHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvcG9zdCddKSB7XG4gICAgICAvLyBUaGUgaWQgaXMgdW5hbWJpZ3VvdXMgb25seSB3aXRoIGEgc2luZ2xlIEQxIGJpbmRpbmc7IHdpdGggbXVsdGlwbGUsIHRoZSBob29rIG11c3RcbiAgICAgIC8vIHJlc29sdmUgaXRzIHRhcmdldCBpdHNlbGYuIENsZWFyIGZpcnN0IGVpdGhlciB3YXk6IGEgc3RhbGUgaW5oZXJpdGVkIGlkIG11c3Qgbm90XG4gICAgICAvLyByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgICAgY29uc3QgaG9va0QxRGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ7XG4gICAgICBpZiAocmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdNdWx0aXBsZSBEMSBiaW5kaW5ncyBleGlzdDsgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCBpcyBub3Qgc2V0IGZvciBkZXBsb3kvcG9zdC4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoaG9va0QxRGF0YWJhc2U/LmRhdGFiYXNlX2lkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEID0gaG9va0QxRGF0YWJhc2UuZGF0YWJhc2VfaWQ7XG4gICAgICBpZiAoYWNjb3VudElkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQgPSBhY2NvdW50SWQ7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9wb3N0JywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIHRoZSBDbG91ZGZsYXJlIEFQSSB0b2tlbiB0aGF0IENJIGRyb3BzIGluIGEgYC5lbnYuY2xvdWRmbGFyZWAgZmlsZSAoZS5nLiB0aGUgcmV1c2FibGVcbiAqIGRlcGxveSB3b3JrZmxvdydzIGBmaWxlX3BhdGhfMWApLCBsb29raW5nIGJlc2lkZSB0aGUgV29ya2VyJ3Mgd3JhbmdsZXIgY29uZmlnIGFuZCBhdCB0aGVcbiAqIG1vbm9yZXBvIHJvb3Qg4oCUIGBmaWxlX3BhdGhfMWAgaXMgcmVwby1yZWxhdGl2ZSwgc28gYm90aCBzcGVsbGluZ3Mgb2NjdXIgaW4gcHJhY3RpY2UuXG4gKiBOZWFyZXIgZmlsZXMgd2luOiBhIHdvcmtzcGFjZSBtYXkgb3ZlcnJpZGUgdGhlIHJvb3QgdG9rZW4sIG5ldmVyIHRoZSByZXZlcnNlLlxuICogYENMT1VERkxBUkVfRU5WYCBpcyBkcm9wcGVkOyBpdCB3b3VsZCBkb3VibGUtYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDbG91ZGZsYXJlRW52RmlsZXMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBjdXJyZW50RGlyUGF0aCBvZiBuZXcgU2V0KHJvb3REaXJQYXRoID8gW2RpclBhdGgsIHJvb3REaXJQYXRoXSA6IFtkaXJQYXRoXSkpIHtcbiAgICBjb25zdCBjbG91ZGZsYXJlRW52UGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJy5lbnYuY2xvdWRmbGFyZScpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjbG91ZGZsYXJlRW52UGF0aCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBhcnNlZCA9IGNvbmZpZyh7IHBhdGg6IGNsb3VkZmxhcmVFbnZQYXRoLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdDTE9VREZMQVJFX0VOVicpIGNvbnRpbnVlO1xuICAgICAgZW52VmFyc1trZXldID8/PSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogU2VsZWN0IHRoZSBzZWNyZXRzIHRvIHB1c2ggdG8gdGhlIFdvcmtlciBmcm9tIHRoZSBkb3RlbnYtbG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIGV2ZXJ5IGV4cGxpY2l0bHkgc2V0IHZhbHVlIOKAlCBpbmNsdWRpbmcgZW1wdHkgc3RyaW5ncywgd2hpY2ggY2xlYXIgc3RhbGUgcmVtb3RlIHNlY3JldHNcbiAqIHNpbmNlIGB3cmFuZ2xlciBkZXBsb3kgLS1zZWNyZXRzLWZpbGVgIGlzIGFkZGl0aXZlIOKAlCBleGNlcHQgd3JhbmdsZXIgYHZhcnNgIChhIHNlY3JldCBtYXlcbiAqIG5vdCBzaGFyZSBhIG5hbWUgd2l0aCBhIHZhciksIGRlcGxveS1jb250cm9sIGtleXMsIGFuZCBsb2NhbCBgZmlsZTpgIERBVEFCQVNFX1VSTHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RXb3JrZXJTZWNyZXRzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGNvbmZpZ1ZhcktleXM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNvbmZpZ0tleXMgPSBuZXcgU2V0KGNvbmZpZ1ZhcktleXMpO1xuICBjb25zdCBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8vIE5vIHJ1bnRpbWUgdW5kZWZpbmVkIGNoZWNrIG9uIGB2YWx1ZWA6IGVudlZhcnMgaXMgYnVpbHQgZXhjbHVzaXZlbHkgZnJvbSBkb3RlbnYtcGFyc2VkXG4gIC8vIHN0cmluZ3MsIGFuZCBldmVyeSBjYWxsZXItc2lkZSBtZXJnZSBlaXRoZXIgY29hbGVzY2VzIHdpdGggYD8/ICcnYCBvciBndWFyZHMgYWdhaW5zdFxuICAvLyB1bmRlZmluZWQgYmVmb3JlIGFzc2lnbmluZywgc28gdGhlIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gdHlwZSBob2xkcyBhdCBydW50aW1lIHRvby5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoY29uZmlnS2V5cy5oYXMoa2V5KSB8fCBpc05vblNlY3JldEtleShrZXkpKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnREFUQUJBU0VfVVJMJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdmaWxlOicpKSBjb250aW51ZTtcbiAgICBzZWNyZXRzW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gc2VjcmV0cztcbn1cblxuLyoqXG4gKiBMaXN0IHRoZSBzZWNyZXQgbmFtZXMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSBkZXBsb3kgdGFyZ2V0IFdvcmtlci4gUmV0dXJucyB1bmRlZmluZWQgd2hlblxuICogdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiB0aGUgV29ya2VyIG5vdCBleGlzdGluZyB5ZXQgKGZpcnN0IGRlcGxveSksIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGxpbWl0IGNoZWNrcyBpbnN0ZWFkIG9mIGJsb2NraW5nIGEgZGVwbG95IHRoYXRcbiAqIHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuIEZhaWxpbmcgY2xvc2VkIGluc3RlYWQgd291bGQgdHVybiBldmVyeSB0cmFuc2llbnQgbGlzdGluZ1xuICogZmFpbHVyZSAobmV0d29yaywgYSB0b2tlbiB3aXRob3V0IHNlY3JldC1yZWFkIHBlcm1pc3Npb24pIGludG8gYSBkZXBsb3kgYmxvY2tlciwgYW5kIOKAlCBzaW5jZVxuICogd3JhbmdsZXIgNC54IHJlcG9ydHMgYSBtaXNzaW5nIFdvcmtlciBvbmx5IHZpYSBhbiBlcnJvci1tZXNzYWdlIGhpbnQg4oCUIGFueSB1bnJlY29nbml6ZWRcbiAqIG5vdC1mb3VuZCBzaGFwZSB3b3VsZCB0aGVuIGJsb2NrIGZpcnN0IGRlcGxveXMgZW50aXJlbHk7IHRoaXMgcHJlZmxpZ2h0IG11c3Qgb25seSBldmVyIGFkZFxuICogZmFpbHVyZXMgdGhhdCB3cmFuZ2xlciBpdHNlbGYgd291bGQgcmFpc2UgYWZ0ZXIgdGhlIG1pZ3JhdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogRGVwbG95Q29tbWFuZEFyZ3YsXG4gIHdyYW5nbGVyQ29uZmlnUGF0aDogc3RyaW5nLFxuICByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyxcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gIGNvbnN0IGxpc3RBcmdzID0gW1xuICAgICdzZWNyZXQnLFxuICAgICdsaXN0JyxcbiAgICAnLS1mb3JtYXQnLFxuICAgICdqc29uJyxcbiAgICAnLS1jb25maWcnLFxuICAgIHdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgICAuLi4ocmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBbJy0tZW52JywgZW52TmFtZV0gOiBbXSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2xpc3RBcmdzLmpvaW4oJyAnKX1gKSk7XG4gIGxldCByZXQ7XG4gIHRyeSB7XG4gICAgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYygnd3JhbmdsZXInLCBsaXN0QXJncywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBgRmFpbGVkIHRvIHJ1biB3cmFuZ2xlciB0byBsaXN0IHJlbW90ZSBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChyZXQuc3RhdHVzID09PSAwKSB7XG4gICAgLy8gQ3V0IHRoZSBKU09OIGFycmF5IG91dCBvZiB0aGUgc3Vycm91bmRpbmcgb3V0cHV0OiB3cmFuZ2xlciBtYXkgcHJpbnQgaXRzIGJhbm5lciBhbmRcbiAgICAvLyBcIk11bHRpcGxlIGVudmlyb25tZW50c1wiIHdhcm5pbmdzIGFyb3VuZCB0aGUgcGF5bG9hZC5cbiAgICBjb25zdCBqc29uU3RhcnQgPSByZXQuc3Rkb3V0LmluZGV4T2YoJ1snKTtcbiAgICBjb25zdCBqc29uRW5kID0gcmV0LnN0ZG91dC5sYXN0SW5kZXhPZignXScpO1xuICAgIGlmIChqc29uU3RhcnQgIT09IC0xICYmIGpzb25FbmQgIT09IC0xICYmIGpzb25TdGFydCA8IGpzb25FbmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmV0LnN0ZG91dC5zbGljZShqc29uU3RhcnQsIGpzb25FbmQgKyAxKSkgYXMgeyBuYW1lPzogdW5rbm93biB9W107XG4gICAgICAgIHJldHVybiBwYXJzZWQubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkuZmlsdGVyKChuYW1lKTogbmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHdhcm5pbmcgYmVsb3cuXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKC9cXFtjb2RlOiAxMDAoMDd8OTApXFxdfElmIHRoaXMgaXMgYSBuZXcgV29ya2VyLy50ZXN0KHJldC5zdGRvdXQgKyByZXQuc3RkZXJyKSkge1xuICAgIC8vIFRoZSBXb3JrZXIgZG9lcyBub3QgZXhpc3QgeWV0LCBzbyBhIGZpcnN0IGRlcGxveSBpbmhlcml0cyBub3RoaW5nLiBXcmFuZ2xlciA0LnggY2F0Y2hlc1xuICAgIC8vIHRoZSBDbG91ZGZsYXJlIEFQSSBlcnJvcnMgMTAwMDcgKHdvcmtlcnMuYXBpLmVycm9yLnNlcnZpY2Vfbm90X2ZvdW5kKSBhbmQgMTAwOTBcbiAgICAvLyAod29ya2Vycy5hcGkuZXJyb3Iuc2NyaXB0X25vdF9mb3VuZCkgYW5kIHJldGhyb3dzIHRoZW0gYXMgYSBVc2VyRXJyb3IgY29udGFpbmluZyB0aGVcbiAgICAvLyAnSWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIsIHJ1biBgd3JhbmdsZXIgZGVwbG95YCBmaXJzdCcgaGludCB3aXRob3V0IHRoZSBudW1lcmljIGNvZGUsXG4gICAgLy8gc28gbWF0Y2ggYm90aCBzaGFwZXMuXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBjaGFsay55ZWxsb3coXG4gICAgICBgRmFpbGVkIHRvIGxpc3QgdGhlIHJlbW90ZSBXb3JrZXIgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHsocmV0LnN0ZGVyciB8fCByZXQuc3Rkb3V0KS50cmltKCl9YFxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdGUgc2VjcmV0cyB0aGF0IHN0YXkgYXR0YWNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uOiBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpc1xuICogYWRkaXRpdmUsIHNvIGV2ZXJ5IHJlbW90ZSBzZWNyZXQgdGhlIG91dGdvaW5nIHBheWxvYWQgZG9lcyBub3Qgb3ZlcndyaXRlIGtlZXBzIGNvdW50aW5nXG4gKiBhZ2FpbnN0IENsb3VkZmxhcmUncyBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgbGltaXQg4oCUIGV4Y2VwdCBuYW1lcyB0aGF0IGFuIGVmZmVjdGl2ZSB2YXIgb3JcbiAqIGJpbmRpbmcgcmVwbGFjZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgcmVtb3RlU2VjcmV0TmFtZXM6IHN0cmluZ1tdLFxuICBvdXRnb2luZ1NlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGVmZmVjdGl2ZVZhcktleXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBiaW5kaW5nTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlcGxhY2VkTmFtZXMgPSBuZXcgU2V0KFsuLi5lZmZlY3RpdmVWYXJLZXlzLCAuLi5iaW5kaW5nTmFtZXNdKTtcbiAgcmV0dXJuIHJlbW90ZVNlY3JldE5hbWVzLmZpbHRlcigobmFtZSkgPT4gIU9iamVjdC5oYXNPd24ob3V0Z29pbmdTZWNyZXRzLCBuYW1lKSAmJiAhcmVwbGFjZWROYW1lcy5oYXMobmFtZSkpO1xufVxuXG4vKipcbiAqIFJlYWRpbmcgYmluRXhpc3RzIHByZXBlbmRzIG5vZGVfbW9kdWxlcy8uYmluIGRpcmVjdG9yaWVzIHRvIHByb2plY3QuZW52LlBBVEgsXG4gKiBzbyB0aGUgZGlyZWN0IChub24tc2hlbGwpIHdyYW5nbGVyIHNwYXducyByZXNvbHZlIHRoZSBsb2NhbCBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIXByb2plY3QuYmluRXhpc3RzKSB7XG4gICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnbm9kZV9tb2R1bGVzLy5iaW4gbm90IGZvdW5kOyByZWx5aW5nIG9uIFBBVEggdG8gcmVzb2x2ZSB3cmFuZ2xlci4nKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMsIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuaW50ZXJmYWNlIFBhcnNlZERvdGVudkFyZ3Mge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRFbnZpcm9ubWVudCB7XG4gIGN3ZDogc3RyaW5nO1xuICBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52O1xufVxuXG5jb25zdCBzaHV0ZG93blNpZ25hbHMgPSBuZXcgU2V0PE5vZGVKUy5TaWduYWxzPihbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSk7XG5cbmV4cG9ydCBjb25zdCBkb3RlbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZG90ZW52IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGZub3ggYW5kIHJ1biBhIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBydW5QYXJzZWREb3RlbnZDb21tYW5kKGdldFBhcnNlZERvdGVudkFyZ3NGcm9tWWFyZ3MoYXJndikpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFyc2VkRG90ZW52Q29tbWFuZCh7IGNvbW1hbmQgfTogUGFyc2VkRG90ZW52QXJncyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5Db21tYW5kV2l0aEVudmlyb25tZW50KGNvbW1hbmQsICd3YiBkb3RlbnYgLS0gPGNvbW1hbmQ+IFthcmdzLi4uXScpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudChcbiAgY29tbWFuZDogc3RyaW5nW10sXG4gIHVzYWdlOiBzdHJpbmcsXG4gIGNvbW1hbmRFbnZpcm9ubWVudD86IENvbW1hbmRFbnZpcm9ubWVudFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb21tYW5kLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFVzYWdlOiAke3VzYWdlfWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShjb21tYW5kRW52aXJvbm1lbnQ/LmN3ZCA/PyBwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgZW52ID0gY29tbWFuZEVudmlyb25tZW50Py5lbnYgPz8gcHJvY2Vzcy5lbnY7XG4gIGlmICghY29tbWFuZEVudmlyb25tZW50KSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QpO1xuICBjb25zdCBiZXJyeUJpbkZvbGRlclBhdGggPSBlbnYuQkVSUllfQklOX0ZPTERFUjtcbiAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudik7XG4gIC8vIFN0cmlwcGluZyB5YXJuJ3MgZW52aXJvbm1lbnQgYWxzbyByZW1vdmVzIGl0cyB0ZW1wb3JhcnkgYmluIGZvbGRlciDigJQgdGhlIE9OTFkgcGxhY2VcbiAgLy8geWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMg4oCUIHNvIHJlc3RvcmUgdGhlIHByb2plY3QncyBvd25cbiAgLy8gbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8ga2VlcCBiYXJlIGJpbmFyeSBuYW1lcyByZXNvbHZhYmxlLiBQbHVnJ24nUGxheSBpbnN0YWxsc1xuICAvLyBjcmVhdGUgbm8gbm9kZV9tb2R1bGVzIGF0IGFsbDsgdGhlIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGlzIHRoZW4gdGhlIHNvbGUgc291cmNlIG9mXG4gIC8vIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMsIHNvIHJlc3RvcmUgaXQgaW5zdGVhZC5cbiAgLy8gVGhlIHRlbXBvcmFyeSBmb2xkZXIgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZXN0b3JlZCB3aGVuIC5iaW4gZGlyZWN0b3JpZXMgZXhpc3Q6IGl0IGFsc29cbiAgLy8gY29udGFpbnMgbm9kZS95YXJuIHNoaW1zLCBhbmQgYSBsZWFrZWQgbm9kZSBzaGltIHdvdWxkIHZpb2xhdGUgd2IncyByZWFsLU5vZGUgZ3VhcmFudGVlXG4gIC8vIGZvciB0b29scyBsaWtlIHdyYW5nbGVyL3ZpbmV4dC4gQ2hpbGQgYHlhcm5gIGludm9jYXRpb25zIHN0YXkgcmVzb2x2YWJsZSB0aHJvdWdoIHRoZVxuICAvLyBsYXVuY2hlciBvbiB0aGUgYmFzZSBQQVRIIChtaXNlL2NvcmVwYWNrKSwgd2hpY2ggZXZlcnkgc3VwcG9ydGVkIGVudmlyb25tZW50IGhhcyDigJRcbiAgLy8gbm90aGluZyBjb3VsZCBoYXZlIHN0YXJ0ZWQgYHlhcm4gcnVuYC9gd2IgZG90ZW52YCB3aXRob3V0IGl0LlxuICBpZiAoIXByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChjd2QsIGVudikgJiYgYmVycnlCaW5Gb2xkZXJQYXRoKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSCA/IGAke2JlcnJ5QmluRm9sZGVyUGF0aH06JHtlbnYuUEFUSH1gIDogYmVycnlCaW5Gb2xkZXJQYXRoO1xuICB9XG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNodXRkb3duU2lnbmFscykge1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2hpbGQua2lsbChzaWduYWwpO1xuICAgICAgfTtcbiAgICAgIHNpZ25hbEhhbmRsZXJzLnNldChzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgfVxuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgIHByb2Nlc3Mub2ZmKHNodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2UgZXZlbiBmb3IgZm9yd2FyZGVkIHNodXRkb3duIHNpZ25hbHMgc28gY2FsbGVycyBvYnNlcnZlIHRoZSBjb252ZW50aW9uYWxcbiAgICAgICAgLy8gc2lnbmFsIGV4aXQgc3RhdHVzIChlLmcuIDEzMCBmb3IgU0lHSU5UKSBpbnN0ZWFkIG9mIGEgbWlzbGVhZGluZyBzdWNjZXNzLlxuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBjb2RlID8/IDE7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZWREb3RlbnZBcmdzRnJvbVlhcmdzKGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSk6IFBhcnNlZERvdGVudkFyZ3Mge1xuICByZXR1cm4ge1xuICAgIGNvbW1hbmQ6IFtcbiAgICAgIC4uLigoYXJndi5hcmdzIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZCkgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICAgLi4uKChhcmd2WyctLSddIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZCkgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgIF0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhcmRXYkVudih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmaXhUYXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoXG4gICAgIXZhbHVlIHx8XG4gICAgWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddLmluY2x1ZGVzKHZhbHVlKSB8fFxuICAgIHByb2Nlc3MuZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHxcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyA9PT0gJ3RydWUnXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmVycm9yKFxuICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7dmFsdWV9XCIuIGAgK1xuICAgICAgYEZpeCAke2ZpeFRhcmdldH0sIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay5gXG4gICk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuLy8gTk9URTogYHdiIGRvdGVudmAgZGVsaWJlcmF0ZWx5IHNraXBzIFByb2plY3QuZW52J3MgZnVsbCB2YWxpZGF0aW9uOiBpdCBpcyBhIGdlbmVyaWMgcnVubmVyIGFsc29cbi8vIHVzZWQgYmVmb3JlIGVudiBzb3VyY2VzIGV4aXN0IChib290c3RyYXApIGFuZCBtdXN0IG5vdCBmYWlsIGZhc3QgZm9yIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgbm90XG4vLyBhZG9wdGVkIHRoZSBvcmcgZW52IHN0YW5kYXJkLiBBIE5PTi1FTVBUWSBXQl9FTlYgaXMgc3RpbGwgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHN0YW5kYXJkIG1vZGVzLFxuLy8gdGhvdWdoIOKAlCBhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgd291bGQgb3RoZXJ3aXNlIHNpbGVudGx5IHNlbGVjdCB0aGUgYmFzZSAoZGV2ZWxvcG1lbnQpIHZhbHVlcy5cbmZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIFRoZSBtb2RlIGlzIEZPUkNFRCBvbmx5IHdoZW4gV0JfRU5WIGlzIGV4cGxpY2l0bHkgZXhwb3J0ZWQ7IGl0IGRyaXZlcyB0aGUgZm9yY2VkLW1vZGUgb3ZlcnJpZGVcbiAgLy8gYmVsb3cgYW5kIHRoZSB2YWxpZGF0aW9uIGF0IHRoZSBlbmQuXG4gIGNvbnN0IG1vZGUgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG4gIC8vIFRoZSBmbm94IGAtLXByb2ZpbGVgIHNlbGVjdG9yLCBkZWZhdWx0aW5nIHRvIGRldmVsb3BtZW50IGxpa2Ugd2IncyBtYWluIGxvYWRlciAoYFdCX0VOViB8fFxuICAvLyBOT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnYCwgc2VlIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcykgc28gYSByZXBvIGtlZXBpbmcgZGV2LW9ubHkgc2VjcmV0c1xuICAvLyBpbiBgW3Byb2ZpbGVzLmRldmVsb3BtZW50LnNlY3JldHNdYCBsb2FkcyB0aGVtIHdoZW4gV0JfRU5WIGlzIHVuc2V0IGluc3RlYWQgb2Ygb25seSB0aGUgYmFzZVxuICAvLyB0YWJsZS4gSXQgYWRkaXRpb25hbGx5IGhvbm9ycyBhbiBleHBsaWNpdCBGTk9YX1BST0ZJTEUsIGJlY2F1c2UgZm5veCBob25vcnMgaXQgYW5kIGB3YiBkb3RlbnZgXG4gIC8vIHdpdGhvdXQgV0JfRU5WIGlzIGRvY3VtZW50ZWQgdG8gYXMgd2VsbCAoc2VlIHJ1bkZub3hFeHBvcnQncyBpZ25vcmVQcm9maWxlRW52VmFyIG5vdGUpLlxuICAvLyBOT0RFX0VOViBpcyByZWFkIHRocm91Z2ggdGhlIGBydW50aW1lRW52YCBhbGlhcywgbmV2ZXIgYXMgdGhlIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgbWVtYmVyXG4gIC8vIGV4cHJlc3Npb24gdGhhdCB0aGUgYnVuZGxlciBpbmxpbmVzIHRvICdwcm9kdWN0aW9uJyAod2hpY2ggd291bGQgd3JvbmdseSBzZWxlY3QgcHJvZHVjdGlvbikuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgZm5veENhc2NhZGUgPSBtb2RlIHx8IHJ1bnRpbWVFbnYuRk5PWF9QUk9GSUxFIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JztcbiAgLy8gV0JfRU5WIGluIHByb2Nlc3MuZW52IG1lYW5zIHRoZSBtb2RlIGlzIGV4cGxpY2l0bHkgZm9yY2VkLCBzbyB2YWx1ZXMgZnJvbSB0aGUgbW9kZSdzIG93biBmbm94XG4gIC8vIHByb2ZpbGUgd2luIG92ZXIgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgc2hlbGwg4oCUIGV4Y2VwdCBvbiBDSSwgd2hlcmUgaW5qZWN0ZWQgZW52XG4gIC8vIHZhcnMgbXVzdCBrZWVwIG92ZXJyaWRpbmcgY29tbWl0dGVkIHZhbHVlc1xuICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzkzMCkuXG4gIGNvbnN0IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiA9ICEhbW9kZSAmJiAhaXNDSShwcm9jZXNzLmVudi5DSSk7XG4gIGNvbnN0IFtwYXJzZWRdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGZub3hDYXNjYWRlLCB7IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiB9KTtcbiAgLy8gRXhwYW5kICR7Li4ufSByZWZlcmVuY2VzIGFnYWluc3QgZXhwb3J0ZWQgdmFyaWFibGVzIHdob3NlIGZub3ggdmFsdWUgbG9zZXMgdG8gdGhlIHNoZWxsXG4gIC8vIChtaXJyb3JpbmcgcmVhZEVudmlyb25tZW50VmFyaWFibGVzJyBlZmZlY3RpdmUtdmFsdWUgc2VtYW50aWNzKTogYSByZWZlcmVuY2UgbXVzdCByZXNvbHZlIHRvXG4gIC8vIHRoZSB2YWx1ZSB0aGUgY2hpbGQgd2lsbCBhY3R1YWxseSBzZWUuIHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMgcmV0dXJucyBhXG4gIC8vIHByb2Nlc3MuZW52LXNoYWRvd2VkIGtleSBvbmx5IHdoZW4gdGhlIGZvcmNlZCBwcm9maWxlIG92ZXJyaWRlcyBpdCwgc28gZXZlcnkgcGFyc2VkIGtleSdzIG93blxuICAvLyB2YWx1ZSB3aW5zIGFuZCBpcyBleGNsdWRlZCBmcm9tIHRoZSByZWZlcmVuY2Ugc2V0LlxuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBleHBvcnRlZCB2YWx1ZXMgc3Vic3RpdHV0ZSBsaXRlcmFsbHkgKHBhJHdvcmQgc3RheXMgcGEkd29yZCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gcGFyc2VkKSkge1xuICAgICAgcmVmZXJlbmNlRW52W2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZCwgcHJvY2Vzc0VudjogcmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyBwYXJzZWQ7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkgY29udGludWU7XG4gICAgLy8gQSBwcm9jZXNzLmVudi1zaGFkb3dlZCBrZXkgcmVhY2hlcyBoZXJlIG9ubHkgd2hlbiB0aGUgZm9yY2VkIHByb2ZpbGUgb3ZlcnJpZGVzIGl0IChzZWVcbiAgICAvLyByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzKTsgb24gQ0kgc3VjaCBrZXlzIGFyZSBuZXZlciByZXR1cm5lZCwgc28gbm8gYnJhbmNoIGlzIG5lZWRlZC5cbiAgICBpZiAobW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiAke2tleX0gaW4gdGhlIFwiJHttb2RlfVwiIG1vZGUncyBlbnYgc291cmNlcyBvdmVycmlkZXMgdGhlIHZhbHVlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgYmVjYXVzZSBXQl9FTlYgaXMgZXhwbGljaXRseSBzZXQuYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLy8gVmFsaWRhdGUgb25seSBBRlRFUiBhcHBseWluZyB0aGUgc291cmNlcywgc28gYSBXQl9TS0lQX0VOVl9DSEVDSyBkZWZpbmVkIGluIGFuIGVudiBTT1VSQ0UgaXNcbiAgLy8gaG9ub3JlZDogYm90aCB0aGUgY2FwdHVyZWQgZXhwb3J0ZWQgbW9kZSAoaXQgc2VsZWN0ZWQgdGhlIHByb2ZpbGUpIGFuZCB0aGUgRklOQUwgdmFsdWUgdGhlXG4gIC8vIGNoaWxkIHdpbGwgc2VlIOKAlCB0aGUgZm5veCBwcm9maWxlIG1heSBkZWZpbmUgYSBicm9rZW4gV0JfRU5WIChlLmcuIGBwcm9kY3V0aW9uYCksIGFuZCBhIGZvcmNlZFxuICAvLyBtb2RlJ3MgcHJvZmlsZSBtYXkgZXZlbiBvdmVycmlkZSBhIFZBTElEIGV4cG9ydGVkIHZhbHVlLlxuICB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYobW9kZSwgJ3RoZSBleHBvcnRlZCB2YXJpYWJsZScpO1xuICB2YWxpZGF0ZVN0YW5kYXJkV2JFbnYocHJvY2Vzcy5lbnYuV0JfRU5WLCAndGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlJyk7XG4gIC8vIFRoZSBzZWxlY3RlZCBlbnZpcm9ubWVudCBpcyB3aGF0IGFuIGVudiBzb3VyY2Ugc2lsZW50bHkgcmVzb2x2aW5nIFdCX0VOViB0byBhIERJRkZFUkVOVCB2YWx1ZVxuICAvLyBtdXN0IGFncmVlIHdpdGgsIGVsc2UgdGhlIGNoaWxkIHJ1bnMgbGFiZWxlZCBvbmUgZW52aXJvbm1lbnQgd2hpbGUgY2FycnlpbmcgYW5vdGhlcidzIHNlY3JldHMuXG4gIC8vIE9ubHkgYSBTVEFOREFSRCBjYXNjYWRlIGlzIGVuZm9yY2VkIChtaXJyb3JpbmcgUHJvamVjdC5jb21wbGV0ZUFuZFZhbGlkYXRlV2JFbnYpOiBhIGN1c3RvbVxuICAvLyBzZWxlY3RvciBzdWNoIGFzIGBOT0RFX0VOVj1xYWAgbGVnaXRpbWF0ZWx5IHNlbGVjdHMgdGhlIGBxYWAgcHJvZmlsZSB3aGlsZSBXQl9FTlYgc3RheXMgYVxuICAvLyBzdGFuZGFyZCBtb2RlLlxuICBjb25zdCBleHBlY3RlZENhc2NhZGUgPSBmbm94Q2FzY2FkZTtcbiAgaWYgKFxuICAgIHByb2Nlc3MuZW52LldCX0VOViAmJlxuICAgIFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXS5pbmNsdWRlcyhleHBlY3RlZENhc2NhZGUpICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfRU5WICE9PSBleHBlY3RlZENhc2NhZGUgJiZcbiAgICBwcm9jZXNzLmVudi5XQl9TS0lQX0VOVl9DSEVDSyAhPT0gJzEnICYmXG4gICAgcHJvY2Vzcy5lbnYuV0JfU0tJUF9FTlZfQ0hFQ0sgIT09ICd0cnVlJ1xuICApIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7cHJvY2Vzcy5lbnYuV0JfRU5WfVwiIGFsdGhvdWdoIHRoZSBcIiR7ZXhwZWN0ZWRDYXNjYWRlfVwiIGVudmlyb25tZW50IHdhcyBzZWxlY3RlZC4gYCArXG4gICAgICAgIGBGaXggdGhlIFdCX0VOViBkZWZpbmVkIGluIHRoZSBlbnYgc291cmNlcywgb3Igc2V0IFdCX1NLSVBfRU5WX0NIRUNLPTEgdG8gc2tpcCB0aGlzIGNoZWNrLmBcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBGSUxFX1NDSEVNQSwgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiB9IGZyb20gJy4vbGl0ZXN0cmVhbS5qcyc7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNsZWFuVXBDb21tYW5kID0gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgJHtjbGVhblVwQ29tbWFuZH07IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGdlbmVyYXRlKF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBbJ1BSSVNNQSBnZW5lcmF0ZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldE1vdW50RGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnT3B0aW9uID0gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KTtcbiAgICAvLyBgcHJpc21hIG1pZ3JhdGUgcmVzZXRgIGNhbiBmYWlsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFiYXNlLCBzbyB3ZSByZW1vdmUgaXQgZmlyc3QuXG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmICR7dGhpcy5nZW5lcmF0ZShwcm9qZWN0KX0gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2xlYW51cENvbW1hbmQgPSBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0KTtcbiAgICBpZiAoY2xlYW51cENvbW1hbmQpIHN0ZXBzLnB1c2goY2xlYW51cENvbW1hbmQpO1xuICAgIGNvbnN0IHJlc2V0Q29tbWFuZCA9IFsnUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIHN0ZXBzLnB1c2gocmVzZXRDb21tYW5kKTtcbiAgICByZXR1cm4gc3RlcHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0TW91bnREaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgcm0gLVJmICR7b3V0cHV0UGF0aH0qOyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyAke291dHB1dFBhdGh9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIHNlZWQocHJvamVjdDogUHJvamVjdCwgc2NyaXB0UGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gQmxpdHogc2VlZCBtb2R1bGVzIGRlZmF1bHQtZXhwb3J0IHRoZSBzZWVkIGZ1bmN0aW9uIHdpdGhvdXQgY2FsbGluZyBpdCwgc28gb25seVxuICAgIC8vIGBibGl0eiBkYiBzZWVkYCAod2hvc2UgbG9hZGVyIGludm9rZXMgdGhlIGV4cG9ydCkgYWN0dWFsbHkgcG9wdWxhdGVzIHRoZSBkYXRhYmFzZS5cbiAgICAvLyBCdW4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBkZWNsYXJlIHByaXNtYS5zZWVkIGluc3RlYWQgYW5kIG11c3QgYXZvaWQgdGhlIGJsaXR6IENMSSxcbiAgICAvLyB3aGljaCBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluc2lkZSBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlLlxuICAgIGlmICghcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpKSB7XG4gICAgICByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIH1cbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmICgocHJvamVjdC5wYWNrYWdlSnNvbi5wcmlzbWEgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LnNlZWQpIHJldHVybiBgWUFSTiBwcmlzbWEgZGIgc2VlZGA7XG4gICAgY29uc3Qgc2VlZHNQYXRoID0gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9zZWVkcy50c2A7XG4gICAgcmV0dXJuIGBpZiBbIC1lIFwiJHtzZWVkc1BhdGh9XCIgXTsgdGhlbiBCVU4gYnVpbGQtdHMgcnVuICR7c2VlZHNQYXRofTsgZmlgO1xuICB9XG5cbiAgc3R1ZGlvKHByb2plY3Q6IFByb2plY3QsIGRiVXJsT3JQYXRoPzogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgcHJlZml4ID0gJyc7XG4gICAgLy8gRGVhbCB3aXRoIFByaXNtYSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3ByaXNtYS9zdHVkaW8vaXNzdWVzLzEyNzNcbiAgICBpZiAoZGJVcmxPclBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7ZGJVcmxPclBhdGh9IGA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvamVjdC5lbnYuREFUQUJBU0VfVVJMPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkge1xuICAgICAgY29uc3QgYmFzZURpciA9IGdldFByaXNtYUJhc2VEaXIocHJvamVjdCk7XG4gICAgICBpZiAoYmFzZURpcikge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyLCBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkwuc2xpY2UoRklMRV9TQ0hFTUEubGVuZ3RoKSk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1QUklTTUEgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxufVxuXG4vKiogV2hlcmUgdGhlIExpdGVzdHJlYW0tcmVwbGljYXRlZCBTUUxpdGUgZGF0YWJhc2UgaXMgbW91bnRlZCwgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0TW91bnREaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9tb3VudGA7XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUJhc2VEaXIocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBQT1NTSUJMRV9QUklTTUFfUEFUSFMuZmluZCgoeyBzY2hlbWFQYXRoIH0pID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgc2NoZW1hUGF0aCkpKVxuICAgID8uZGJQYXRoO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3RGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgYXMgbm9ybWFsaXplU2hhcmVkQnVuTG9ja2ZpbGUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG4vKipcbiAqIFN0cmlwIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGBidW4ubG9ja2AgYW5kIHJlcG9ydCBhIGNoYW5nZS5cbiAqXG4gKiBidW4gcmVjb3JkcyBhbiBhYnNvbHV0ZSBgcmVzb2x2ZWRgIFVSTCBmb3IgYW4gYWxyZWFkeS1sb2NrZWQgcGFja2FnZSB3aGVuZXZlciB0aGUgY29uZmlndXJlZFxuICogcmVnaXN0cnkgZG9lcyBub3Qgc2VydmUgdGhlIHRhcmJhbGwgaG9zdCBuYW1lZCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0XG4gKiB0aGUgVGFrdW1pIEd1YXJkIHByb3h5IGRvZXMuIFNvIGFueSBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBERUZBVUxUIHJlZ2lzdHJ5IChDSSwgb3IgYVxuICogZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50byB0aGUgbG9ja2ZpbGUsIGFuZCBjb21taXR0aW5nXG4gKiB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeSBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoXG4gKiB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYVxuICogcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGUgZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3RcbiAqIHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lcyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuXG4gKiBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbSB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gdGhleSBhcmUgcHVyZSBkYW1hZ2UuXG4gKlxuICogd2JmeSBnZW5lcmF0ZXMgYSBwcmUtY29tbWl0IGhvb2sgdGhhdCBzdHJpcHMgdGhlIHNhbWUgVVJMcywgYnV0IHRoYXQgb25seSBmaXJlcyBhdCBgZ2l0IGNvbW1pdGAuXG4gKiBSdW5uaW5nIHRoaXMgcmlnaHQgYWZ0ZXIgYW4gaW5zdGFsbCBjbG9zZXMgdGhlIHdpbmRvdyBpbiBiZXR3ZWVuLCB3aGVyZSB0aGUgcmV3cml0dGVuIGxvY2tmaWxlIGlzXG4gKiBzaW1wbHkgdGhlIHdvcmtpbmcgdHJlZSdzIHN0YXRlOiBhIGJ5cGFzc2VkIGhvb2ssIGEgY29tbWl0IGZyb20gYSB0b29sIHRoYXQgZG9lcyBub3QgcnVuIGhvb2tzLFxuICogb3IgYSBkaWZmIHJlYWQgYnkgYSBodW1hbiBvciBhbiBhZ2VudCBhbGwgc2VlIGl0LiBPbmx5IHRoZSBHdWFyZCBob3N0IGlzIHN0cmlwcGVkOyBhIHNjb3BlZFxuICogcmVnaXN0cnkgc3VjaCBhcyBWZXJkYWNjaW8gbGVnaXRpbWF0ZWx5IHJlY29yZHMgaXRzIG93biBVUkwgZm9yIHByaXZhdGUgcGFja2FnZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZVNoYXJlZEJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtsb2NrZmlsZVBhdGh9IHRvIGtlZXAgaXQgcmVnaXN0cnktYWdub3N0aWMuYCkpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlVG9tbCB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbi8qKlxuICogV3JpdGUgdGhlIGtleS1vbmx5IHN0dWIgdGhhdCBgd3JhbmdsZXIgdHlwZXMgLS1lbnYtZmlsZWAgcmVhZHMgdG8gdHlwZSB0aGUgQ2xvdWRmbGFyZSBgRW52YC5cbiAqXG4gKiBgd3JhbmdsZXIgdHlwZXNgIGRlcml2ZXMgZWFjaCBgRW52YCBtZW1iZXIgZnJvbSBhIGtleSdzIG1lcmUgcHJlc2VuY2UgaW4gdGhlIGZpbGUg4oCUIG5ldmVyIGZyb20gaXRzXG4gKiB2YWx1ZSwgYW5kIG5ldmVyIGZyb20gcHJvY2Vzcy5lbnYg4oCUIGFuZCBgLS1lbnYtZmlsZWAgUkVQTEFDRVMgd3JhbmdsZXIncyBuYXRpdmUgYC5lbnZgL2AuZGV2LnZhcnNgXG4gKiByZWFkaW5nLiBUaGUgc3R1YiB0aGVyZWZvcmUgY2FycmllcyBldmVyeSBkZWNsYXJlZCBiaW5kaW5nIGtleSB3aXRoIGEgY29uc3RhbnQgcGxhY2Vob2xkZXIgdmFsdWVcbiAqIChgMWAsIG5vdCBlbXB0eSwgc28gaXQgY2Fubm90IG92ZXJyaWRlIGEgd3JhbmdsZXIgYHZhcnNgIGJpbmRpbmcgd2l0aCBhbiBlbXB0eSBzdHJpbmcpLiBJdCB3cml0ZXMgbm9cbiAqIHJlYWwgc2VjcmV0IGFuZCBuZWVkcyBubyBkZWNyeXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIocHJvamVjdERpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGtleU5hbWVzID0gY29sbGVjdFdvcmtlckJpbmRpbmdLZXlOYW1lcyhwcm9qZWN0RGlyUGF0aCwgcm9vdERpclBhdGgpO1xuICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvdXRwdXRQYXRoLFxuICAgIGtleU5hbWVzLm1hcCgoa2V5TmFtZSkgPT4gYCR7a2V5TmFtZX09MWApLmpvaW4oJ1xcbicpICsgKGtleU5hbWVzLmxlbmd0aCA+IDAgPyAnXFxuJyA6ICcnKVxuICApO1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtrZXlOYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLmApKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSBkZWNsYXJlZCBXb3JrZXIgYmluZGluZyBrZXkgTkFNRVMgZnJvbSB0aGUgY29tbWl0dGVkIGBmbm94LnRvbWxgIGZpbGVzIHdpdGhvdXRcbiAqIGRlY3J5cHRpbmcgYW55dGhpbmcgb3IgaW52b2tpbmcgdGhlIGVudmlyb25tZW50IHJlYWRlci4gVGhpcyBkZWxpYmVyYXRlbHkgYXZvaWRzIHByb2Nlc3MuZW52LFxuICogYG1pc2UgZW52YCBob3N0L3Rvb2wgdmFyaWFibGVzLCBhbmQgY2FzY2FkZS9wcm9maWxlIHNlbGVjdGlvbiwgYWxsIG9mIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogcG9sbHV0ZSBvciBuYXJyb3cgdGhlIGdlbmVyYXRlZCBgRW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RXb3JrZXJCaW5kaW5nS2V5TmFtZXMocHJvamVjdERpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5TmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLy8gZm5veCBtZXJnZXMgdGhlIHdob2xlIGFuY2VzdG9yIGNvbmZpZyBjaGFpbiAoYSBuZXN0ZWQgV29ya2VyIGluaGVyaXRzIHRoZSBtb25vcmVwbyByb290J3NcbiAgLy8gc2VjcmV0cyksIHNvIHVuaW9uIGV2ZXJ5IGZub3gudG9tbCBmcm9tIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSB1cCB0byB0aGUgcmVwb3NpdG9yeSByb290LlxuICBmb3IgKGNvbnN0IGNvbmZpZ1BhdGggb2YgZmluZEFuY2VzdG9yRm5veENvbmZpZ1BhdGhzKHByb2plY3REaXJQYXRoLCByb290RGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgcGFyc2VGbm94U2VjcmV0S2V5TmFtZXMoY29uZmlnUGF0aCkpIGtleU5hbWVzLmFkZChrZXlOYW1lKTtcbiAgfVxuICByZXR1cm4gWy4uLmtleU5hbWVzXS50b1NvcnRlZCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuLyoqIEV2ZXJ5IGBmbm94LnRvbWxgIGZyb20gYHByb2plY3REaXJQYXRoYCB1cCB0byAoYW5kIGluY2x1ZGluZykgYHJvb3REaXJQYXRoYCwgbmVhcmVzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGZpbmRBbmNlc3RvckZub3hDb25maWdQYXRocyhwcm9qZWN0RGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjb25maWdQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgcm9vdFBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpO1xuICBmb3IgKGxldCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3REaXJQYXRoKTsgOyBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpKSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIGNvbmZpZ1BhdGhzLnB1c2goY29uZmlnUGF0aCk7XG4gICAgLy8gU3RvcCBhdCB0aGUgcmVwb3NpdG9yeSByb290IChpdHMgcGFyZW50J3Mgc2VjcmV0cyBhcmUgbm90IHBhcnQgb2YgdGhpcyByZXBvKSBvciwgZGVmZW5zaXZlbHksXG4gICAgLy8gYXQgdGhlIGZpbGVzeXN0ZW0gcm9vdCB3aGVuIHJvb3REaXJQYXRoIGlzIG5vdCBhY3R1YWxseSBhbiBhbmNlc3Rvci5cbiAgICBpZiAoZGlyUGF0aCA9PT0gcm9vdFBhdGggfHwgcGF0aC5kaXJuYW1lKGRpclBhdGgpID09PSBkaXJQYXRoKSBicmVhaztcbiAgfVxuICByZXR1cm4gY29uZmlnUGF0aHM7XG59XG5cbmludGVyZmFjZSBGbm94U2VjcmV0c1RhYmxlIHtcbiAgW2tleU5hbWU6IHN0cmluZ106IHVua25vd247XG59XG5pbnRlcmZhY2UgRm5veENvbmZpZyB7XG4gIHNlY3JldHM/OiBGbm94U2VjcmV0c1RhYmxlO1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIHsgc2VjcmV0cz86IEZub3hTZWNyZXRzVGFibGUgfSB8IHVuZGVmaW5lZD47XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIGtleSBuYW1lcyB1bmRlciBgZm5veC50b21sYCdzIGBbc2VjcmV0c11gIGFuZCBldmVyeSBgW3Byb2ZpbGVzLjxuYW1lPi5zZWNyZXRzXWAgdGFibGUuXG4gKiBmbm94IHN0b3JlcyBrZXkgbmFtZXMgaW4gcGxhaW50ZXh0IChvbmx5IHZhbHVlcyBhcmUgZW5jcnlwdGVkKSwgc28gdGhpcyBuZWVkcyBubyBhZ2Uga2V5LiBFdmVyeVxuICogcHJvZmlsZSdzIHNlY3JldHMgYXJlIHVuaW9uZWQgc28gdGhlIEVudiBpcyBhIGRldGVybWluaXN0aWMgc3VwZXJzZXQgY292ZXJpbmcgYWxsIGVudmlyb25tZW50c1xuICogKGxpa2UgdGhlIGZvcm1lciBjb21taXR0ZWQgLmVudi5leGFtcGxlKSwgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2ZpbGUgYSBnaXZlbiBydW4gcmVzb2x2ZXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRm5veFNlY3JldEtleU5hbWVzKGNvbmZpZ1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29uZmlnID0gcGFyc2VUb21sKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKSBhcyBGbm94Q29uZmlnO1xuICBjb25zdCBrZXlOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY29sbGVjdCA9IChzZWNyZXRzOiBGbm94U2VjcmV0c1RhYmxlIHwgdW5kZWZpbmVkKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBba2V5TmFtZSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHMgPz8ge30pKSB7XG4gICAgICAvLyBTa2lwIHNlY3JldHMgZm5veCBkb2VzIG5vdCBleHBvcnQgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIChgZW52ID0gZmFsc2VgIC8gYFwiZXhlY1wiYCk6IHRoZXlcbiAgICAgIC8vIGFyZSBuZXZlciBXb3JrZXIgYmluZGluZ3MsIG1hdGNoaW5nIGBmbm94IGV4cG9ydGAncyBkZWZhdWx0LlxuICAgICAgY29uc3QgZW52ID0gdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJiBlbnRyeSAhPT0gbnVsbCA/IChlbnRyeSBhcyB7IGVudj86IHVua25vd24gfSkuZW52IDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGVudiA9PT0gZmFsc2UgfHwgZW52ID09PSAnZXhlYycpIGNvbnRpbnVlO1xuICAgICAga2V5TmFtZXMucHVzaChrZXlOYW1lKTtcbiAgICB9XG4gIH07XG4gIGNvbGxlY3QoY29uZmlnLnNlY3JldHMpO1xuICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgT2JqZWN0LnZhbHVlcyhjb25maWcucHJvZmlsZXMgPz8ge30pKSBjb2xsZWN0KHByb2ZpbGU/LnNlY3JldHMpO1xuICByZXR1cm4ga2V5TmFtZXM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREcml6emxlQ29uZmlnLCB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICcuLi91dGlscy9idW5Mb2NrZmlsZS5qcyc7XG5pbXBvcnQgeyB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiB9IGZyb20gJy4uL3V0aWxzL3dvcmtlclR5cGVzRW52LmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG4vLyBgd3JhbmdsZXIgdHlwZXNgIGRlcml2ZXMgdGhlIENsb3VkZmxhcmUgYEVudmAncyBzZWNyZXQvdmFyIG1lbWJlcnMgb25seSBmcm9tIHRoZSBLRVkgTkFNRVMgaW4gYVxuLy8gLmRldi52YXJzLy5lbnYgZmlsZSAobmV2ZXIgZnJvbSBwcm9jZXNzLmVudiksIGFuZCBgLS1lbnYtZmlsZWAgUkVQTEFDRVMgdGhhdCBkZWZhdWx0IGZpbGUgc2V0LiBTb1xuLy8gZ2VuLWNvZGUgdHlwZXMgYSBXb3JrZXIgYWdhaW5zdCBhIHRocm93YXdheSBrZXktb25seSBzdHViIHdyaXR0ZW4gaGVyZSBmcm9tIGNvbW1pdHRlZCBzb3VyY2VzLlxuY29uc3Qgd29ya2VyVHlwZXNFbnZQYXRoID0gcGF0aC5qb2luKCcud3JhbmdsZXInLCAnd29ya2VyLXR5cGVzLmVudicpO1xuXG5leHBvcnQgY29uc3QgZ2VuQ29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdnZW4tY29kZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgY29kZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gQmVmb3JlIHRoZSBlYXJseSByZXR1cm4gYmVsb3c6IGBnZW4tY29kZWAgaXMgdGhlIGBwb3N0aW5zdGFsbGAgc2NyaXB0IHdiZnkgZ2VuZXJhdGVzLCBtYWtpbmdcbiAgICAvLyB0aGlzIHRoZSBmaXJzdCB3YiBjb2RlIHRoYXQgcnVucyBhZnRlciBidW4gbWF5IGhhdmUgcmV3cml0dGVuIHRoZSBsb2NrZmlsZSwgYW5kIGEgcmVwb3NpdG9yeVxuICAgIC8vIHdpdGggbm90aGluZyB0byBnZW5lcmF0ZSBuZWVkcyB0aGUgbm9ybWFsaXphdGlvbiBqdXN0IGFzIG11Y2guIGByb290RGlyUGF0aGAgcmF0aGVyIHRoYW5cbiAgICAvLyBgcHJvamVjdHMucm9vdC5kaXJQYXRoYDogYnVuIHJ1bnMgYSB3b3Jrc3BhY2UgcGFja2FnZSdzIHBvc3RpbnN0YWxsIGZyb20gdGhhdCBwYWNrYWdlJ3NcbiAgICAvLyBkaXJlY3RvcnksIGFuZCBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyBvbmx5IGNsaW1icyBvdXQgb2YgYHBhY2thZ2VzLypgLCBzbyBhIHdvcmtzcGFjZSBzdWNoXG4gICAgLy8gYXMgYGFwcHMvd2ViYCB3b3VsZCBvdGhlcndpc2UgbG9vayBmb3IgYGFwcHMvd2ViL2J1bi5sb2NrYCBpbnN0ZWFkIG9mIHRoZSByZXBvc2l0b3J5J3MuXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgbm9ybWFsaXplQnVuTG9ja2ZpbGUocHJvamVjdHMuc2VsZi5yb290RGlyUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuQ29kZVRhcmdldHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgICAgLm1hcCgocHJvamVjdCkgPT4gKHsgcHJvamVjdCwgc2NyaXB0czogZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdCkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHNjcmlwdHMgfSkgPT4gc2NyaXB0cy5sZW5ndGggPiAwKTtcbiAgICBpZiAoZ2VuQ29kZVRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCwgc2NyaXB0cyB9IG9mIGdlbkNvZGVUYXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJnZW4tY29kZVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG4gICAgICAvLyBXcml0ZSB0aGUga2V5IHN0dWIgdGhlIGZpcnN0IHNjcmlwdCdzIGB3cmFuZ2xlciB0eXBlcyAtLWVudi1maWxlYCBjb25zdW1lcy4gSXQgaXMgZGVyaXZlZCBmcm9tXG4gICAgICAvLyBjb21taXR0ZWQgc291cmNlcyAoZm5veC50b21sIGtleSBuYW1lcyksIHNvIGl0IG5lZWRzIG5vIGFnZSBrZXksIG5ldmVyIHB1bGxzIGluXG4gICAgICAvLyBwcm9jZXNzLmVudiAvIGBtaXNlIGVudmAgaG9zdCB2YXJpYWJsZXMsIGFuZCBkb2VzIG5vdCBkZXBlbmQgb24gd2hpY2ggcHJvZmlsZSBhIHJ1biByZXNvbHZlcy5cbiAgICAgIGlmICghYXJndi5kcnlSdW4gJiYgZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KSkge1xuICAgICAgICB3cml0ZVdvcmtlclR5cGVzRW52U3R1YihcbiAgICAgICAgICBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgcHJvamVjdC5yb290RGlyUGF0aCxcbiAgICAgICAgICBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCB3b3JrZXJUeXBlc0VudlBhdGgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICAvLyBGaXJzdDogYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNgIGlzIGdpdGlnbm9yZWQsIHNvIG9uIGEgZnJlc2ggY2hlY2tvdXQgaXQgZG9lcyBub3QgZXhpc3QgeWV0LFxuICAvLyBhbmQgdGhlIGdlbmVyYXRvcnMgYmVsb3cgdHlwZS1jaGVjayBhZ2FpbnN0IHRoZSBDbG91ZGZsYXJlIGBFbnZgIGl0IGRlY2xhcmVzLlxuICBjb25zdCB3cmFuZ2xlclR5cGVzU2NyaXB0ID0gZ2V0V3JhbmdsZXJUeXBlc1NjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHdyYW5nbGVyVHlwZXNTY3JpcHQpIHtcbiAgICAvLyBgLS1lbnYtZmlsZWAgcG9pbnRzIHdyYW5nbGVyIGF0IHRoZSBrZXkgc3R1YiB0aGUgaGFuZGxlciB3cml0ZXMgKHNlZSB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiksXG4gICAgLy8gc28gYSBmcmVzaCBjaGVja291dCB3aXRoIG5vIHJ1bnRpbWUgLmRldi52YXJzIChlLmcuIENJKSBzdGlsbCB0eXBlcyBldmVyeSBzZWNyZXQuIFdpdGhvdXQgaXQgYVxuICAgIC8vIGJhcmUgYHdyYW5nbGVyIHR5cGVzYCB5aWVsZHMgYW4gYEVudmAgbWlzc2luZyBldmVyeSBzZWNyZXQgYW5kIHRoZSB0eXBlLWF3YXJlIGdlbmVyYXRvcnMvbGludGVyc1xuICAgIC8vIGJlbG93IGZhaWwgKGUuZy4gXCJQcm9wZXJ0eSAnQVVUSF9TRUNSRVQnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0VudidcIikuXG4gICAgc2NyaXB0cy5wdXNoKGAke3dyYW5nbGVyVHlwZXNTY3JpcHR9IC0tZW52LWZpbGUgJHt3b3JrZXJUeXBlc0VudlBhdGh9YCk7XG4gIH1cbiAgLy8gWWFybi1lcmEgQmxpdHogcmVwb3NpdG9yaWVzIG5lZWQgYGJsaXR6IGNvZGVnZW5gIGZvciB0aGUgcm91dGUgbWFuaWZlc3QgKG5vZGVfbW9kdWxlcy8uYmxpdHopXG4gIC8vIHRoYXQgQGJsaXR6anMvbmV4dCdzIHR5cGUgZGVjbGFyYXRpb25zIHJlLWV4cG9ydDsgaW5zdGFsbCBzY3JpcHRzIGRvIG5vdCBydW4gaXRcbiAgLy8gKGVuYWJsZVNjcmlwdHM6IGZhbHNlKS4gTmV2ZXIgdW5kZXIgQnVuOiB0aGUgYmxpdHogQ0xJIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW5cbiAgLy8gcGxhY2UsIHdoaWNoIG11c3Qgbm90IGhhcHBlbiBpbiBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlIChCdW4tZXJhIEJsaXR6IHJlcG9zaXRvcmllcyBnZW5lcmF0ZVxuICAvLyB0aGUgbWFuaWZlc3Qgd2l0aCB0aGVpciBvd24gc2NyaXB0cyBpbnN0ZWFkKS4gT24gYSBmcmVzaCBpbnN0YWxsIGBibGl0eiBjb2RlZ2VuYCBhbHNvXG4gIC8vIGdlbmVyYXRlcyB0aGUgUHJpc21hIGNsaWVudCBpdHNlbGYsIG1ha2luZyB0aGUgUFJJU01BIGdlbmVyYXRlIHN0ZXAgYmVsb3cgcmVkdW5kYW50IG9uY2Ug4oCUXG4gIC8vIGtlZXBpbmcgYm90aCBpcyBkZWxpYmVyYXRlOiBhZnRlciBzY2hlbWEtb25seSBjaGFuZ2VzIGJsaXR6J3MgYWxyZWFkeS1nZW5lcmF0ZWQgZ3VhcmQgc2tpcHNcbiAgLy8gaXRzIGludGVybmFsIGdlbmVyYXRlLCBzbyB0aGUgZXhwbGljaXQgc3RlcCBpcyBzdGlsbCB3aGF0IHJlZ2VuZXJhdGVzIHRoZSBjbGllbnQuXG4gIGlmICghcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpICYmIHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgIHNjcmlwdHMucHVzaCgnWUFSTiBibGl0eiBjb2RlZ2VuJyk7XG4gIH1cbiAgY29uc3QgcHJpc21hR2VuZXJhdGVTY3JpcHQgPSBnZXRQcmlzbWFHZW5lcmF0ZVNjcmlwdChwcm9qZWN0KTtcbiAgaWYgKHByaXNtYUdlbmVyYXRlU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKHByaXNtYUdlbmVyYXRlU2NyaXB0KTtcbiAgfVxuICBjb25zdCBjaGFrcmFUeXBlZ2VuU2NyaXB0ID0gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3QpO1xuICBpZiAoY2hha3JhVHlwZWdlblNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChjaGFrcmFUeXBlZ2VuU2NyaXB0KTtcbiAgfVxuICBjb25zdCBkcml6emxlQ2hlY2tTY3JpcHQgPSBnZXREcml6emxlQ2hlY2tTY3JpcHQocHJvamVjdCk7XG4gIGlmIChkcml6emxlQ2hlY2tTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZHJpenpsZUNoZWNrU2NyaXB0KTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNTY3JpcHQgPSBnZXRHZW5JMThuVHNTY3JpcHQocHJvamVjdCk7XG4gIGlmIChnZW5JMThuVHNTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZ2VuSTE4blRzU2NyaXB0KTtcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLyoqXG4gKiBgWUFSTiB3cmFuZ2xlcmAgcmF0aGVyIHRoYW4gYGJ1bnggd3JhbmdsZXJgOiB3cmFuZ2xlciBuZWVkcyByZWFsIE5vZGUuanMsIGFuZCBgYnVueGAgbWF5IHJlc29sdmVcbiAqIGEgdmVyc2lvbiBvdGhlciB0aGFuIHRoZSBsb2NrZmlsZSdzLiBSZXR1cm5zIHRoZSBiYXNlIGNvbW1hbmQ7IHRoZSBjYWxsZXIgYXBwZW5kcyBgLS1lbnYtZmlsZWBcbiAqIHBvaW50aW5nIGF0IGEgZ2VuZXJhdGVkIGtleS1vbmx5IHN0dWIgKHNlZSBnZXRHZW5Db2RlU2NyaXB0cykgYmVjYXVzZSBmbm94IHJlcG9zaXRvcmllcyBoYXZlIG5vXG4gKiBgLmVudmAgZmlsZSBmb3Igd3JhbmdsZXIgdG8gaW5mZXIgdGhlIHNlY3JldCBiaW5kaW5ncyBmcm9tLiBgLS1zdHJpY3QtdmFyc2AgaXMgZGVsaWJlcmF0ZWx5IGxlZnRcbiAqIG91dCDigJQgaXQgaXMgYSBwZXItcmVwb3NpdG9yeSB0eXBlLXN0cmljdG5lc3MgY2hvaWNlIHRoYXQgYmVsb25ncyBpbiB0aGUgd3JhbmdsZXIgY29uZmlnLlxuICovXG5mdW5jdGlvbiBnZXRXcmFuZ2xlclR5cGVzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuZ2VuZXJhdGVzV29ya2VyVHlwZXMpIHJldHVybjtcbiAgcmV0dXJuICdZQVJOIHdyYW5nbGVyIHR5cGVzJztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHtcbiAgICBpZiAoIXByb2plY3QuaGFzU291cmNlQ29kZSkgcmV0dXJuO1xuICAgIHJldHVybiAnWUFSTiBydW4gZ2VuLWkxOG4tdHMnO1xuICB9XG4gIGlmIChcbiAgICBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2dlbi1pMThuLXRzJykgJiZcbiAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdpMThuJykpXG4gICkge1xuICAgIHJldHVybiAnWUFSTiBnZW4taTE4bi10cyAtaSBpMThuIC1vIHNyYy9fX2dlbmVyYXRlZF9fL2kxOG4udHMgLWQgamEtSlAnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNQcmlzbWEpIHJldHVybjtcbiAgaWYgKCFoYXNQcmlzbWFTY2hlbWEocHJvamVjdCkpIHJldHVybjtcbiAgcmV0dXJuIHByaXNtYVNjcmlwdHMuZ2VuZXJhdGUocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGdldENoYWtyYVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0BjaGFrcmEtdWkvY2xpJykpIHJldHVybjtcbiAgaWYgKCFmaWxlRXhpc3RzKHByb2plY3QsICdzcmMvdGhlbWUudHMnKSkgcmV0dXJuO1xuICByZXR1cm4gJ1lBUk4gY2hha3JhIHR5cGVnZW4gc3JjL3RoZW1lLnRzIC0tc3RyaWN0Jztcbn1cblxuZnVuY3Rpb24gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzRHJpenpsZSkgcmV0dXJuO1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgaWYgKCFjb25maWcpIHJldHVybjtcbiAgLy8gS2VlcCB0aGUgZXhwbGljaXQgLS1jb25maWcgYmVjYXVzZSBkcml6emxlLWtpdCdzIGRlZmF1bHQgbG9va3VwIG1pc3NlcyBzb21lIGV4dGVuc2lvbnMgKGUuZy4gLm10cykuXG4gIHJldHVybiBgJHt3cmFwV2l0aERyaXp6bGVDb25maWdEaXIocHJvamVjdCwgYFlBUk4gZHJpenpsZS1raXQgY2hlY2sgLS1jb25maWcgJHtjb25maWcuZmlsZU5hbWV9YCl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaGFzUHJpc21hU2NoZW1hKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsncHJpc21hL3NjaGVtYS5wcmlzbWEnLCAncHJpc21hL3NjaGVtYScsICdkYi9zY2hlbWEucHJpc21hJ10uc29tZSgoZmlsZVBhdGgpID0+XG4gICAgZmlsZUV4aXN0cyhwcm9qZWN0LCBmaWxlUGF0aClcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZURvdGVudiB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBDbG91ZGZsYXJlIFdvcmtlcnMgZG9uJ3Qgc2VlIHRoZSBwcm9jZXNzIGVudmlyb25tZW50OyB3cmFuZ2xlciBkZXYgcmVhZHMgdmFycyBmcm9tIGEgLmRldi52YXJzXG4vLyBmaWxlIG5leHQgdG8gaXRzIGNvbmZpZyBmaWxlIGluc3RlYWQuIFRoaXMgY29tbWFuZCBicmlkZ2VzIHRoZSBmbm94LW1hbmFnZWQgdmFsdWVzIHRvIHRoYXQgZmlsZS5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgR2VuRGV2VmFyc0NvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyAmIHsgcGF0aD86IHN0cmluZyB9PjtcblxuZXhwb3J0IGNvbnN0IGdlbkRldlZhcnNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdnZW4tZGV2LXZhcnMgW3BhdGhdJyxcbiAgZGVzY3JpYmU6XG4gICAgJ0dlbmVyYXRlIGEgLmRldi52YXJzIGZpbGUgZm9yIGB3cmFuZ2xlciBkZXZgIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsb2FkZWQgZnJvbSBmbm94IChwbHVzIFdCX0VOViBhbmQgTkVYVF9QVUJMSUNfV0JfRU5WKS4nLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+XG4gICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIGdlbmVyYXRlZCAuZGV2LnZhcnMgZmlsZS4nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0OiAnLmRldi52YXJzJyxcbiAgICB9KSBhcyB1bmtub3duIGFzIEFyZ3Y8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFJlc3RyaWN0IHRvIHZhcmlhYmxlcyBsb2FkZWQgZnJvbSB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGVudmlyb25tZW50IHNvdXJjZXMgc28gdGhhdFxuICAgIC8vIHVucmVsYXRlZCBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBuZXZlciBsZWFrIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBJZ25vcmVcbiAgICAvLyBwcm9jZXNzLmVudiBiZWNhdXNlIHRoZSBwYXJlbnQgd2IgcHJvY2VzcyBpbmplY3RzIHRoZSBmbm94IHZhbHVlcyBpbnRvIGl0LCB3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzdXBwcmVzcyBsb2FkaW5nIHRoZW0gaGVyZS4gd2JmeSBkZWNsYXJlcyB0aGUgV0JfRU5WLWZhbWlseSBrZXlzIGluIGZub3gsIHNvXG4gICAgLy8gdGhleSBhcmUgYWxyZWFkeSBpbmNsdWRlZDsgcHJvY2Vzcy1vbmx5IGtleXMgYXJlIGludGVudGlvbmFsbHkgb3V0c2lkZSB0aGlzIGFsbG93bGlzdC5cbiAgICBjb25zdCBbZW52VmFyc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCB3aW4gb3ZlciBmbm94IHZhbHVlcyBmb3IgY29uZmlndXJlZCBrZXlzXG4gICAgLy8gKHByb2plY3QuZW52IGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBzdGFydGAgd291bGQgc2VydmUgdGhlXG4gICAgLy8gc3RhbGUgY29uZmlndXJlZCB2YWx1ZS4gQW4gZXhwb3J0IHRoYXQgZW1wdGllcyBhIG5vbi1lbXB0eSBjb25maWd1cmVkIHZhbHVlIGlzIGRlbGliZXJhdGVcbiAgICAvLyBhbmQgbXVzdCBzdXJ2aXZlIHRoZSBlbXB0eS12YWx1ZSBmaWx0ZXIgYmVsb3cgKHVubGlrZSBgS0VZPWAgcGxhY2Vob2xkZXJzLCB3aGljaCBzdGF5XG4gICAgLy8gb21pdHRlZCBzbyB0aGV5IGNhbm5vdCBvdmVycmlkZSB3cmFuZ2xlciBgdmFyc2Agd2l0aCBlbXB0eSBzdHJpbmdzKS5cbiAgICBjb25zdCBleHBsaWNpdGx5RW1wdGllZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlID09PSAnJyAmJiBlbnZWYXJzW2tleV0gIT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhlbnZWYXJzKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gJycgfHwgZXhwbGljaXRseUVtcHRpZWRLZXlzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7cXVvdGVEb3RlbnZWYWx1ZShrZXksIHZhbHVlKX1gKTtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYXJndi5wYXRoID8/ICcuZGV2LnZhcnMnKTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBXb3VsZCBnZW5lcmF0ZSAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCAke291dHB1dFBhdGh9IHdpdGggJHtsaW5lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcy5gKSk7XG4gIH0sXG59O1xuXG4vKipcbiAqIFF1b3RlIGEgdmFsdWUgZm9yIGRvdGVudiAod2hpY2ggd3JhbmdsZXIgdXNlcyBmb3IgLmRldi52YXJzKS4gRXZlcnkgY2FuZGlkYXRlIHJlcHJlc2VudGF0aW9uXG4gKiBpcyB2ZXJpZmllZCBieSBhY3R1YWxseSBwYXJzaW5nIGl0IGJhY2sgKG91ciBkb3RlbnYgcGFyc2VyIG1hdGNoZXMgd3JhbmdsZXIncyBidW5kbGVkIGRvdGVudlxuICogMTYgZm9yIHRoZXNlIGNvbnN0cnVjdHMpLCBzbyBhIHZhbHVlIGlzIGVpdGhlciBzZXJpYWxpemVkIGxvc3NsZXNzbHkgb3IgcmVqZWN0ZWQg4oCUIG5ldmVyXG4gKiBzaWxlbnRseSBjb3JydXB0ZWQuIENhbmRpZGF0ZXM6IHNpbmdsZSBxdW90ZXMgKGxpdGVyYWwgc3BhbjsgY2xvc2VkIGVhcmx5IGJ5IGFuIGFwb3N0cm9waGUpLFxuICogYmFja3RpY2tzIChlcXVhbGx5IGxpdGVyYWwpLCB0aGVuIGRvdWJsZSBxdW90ZXMgd2l0aCBlc2NhcGVkIG5ld2xpbmVzL0NScyAoZG90ZW52IGRvZXMgbm90XG4gKiB1bmVzY2FwZSBpbm5lciBcXFwiIOKAlCBhIGAjYCBhZnRlciBhbiBlbWJlZGRlZCBxdW90ZSBzdGFydHMgYSBjb21tZW50LCB3aGljaCB0aGUgcm91bmQtdHJpcFxuICogY2hlY2sgY2F0Y2hlcyBhbmQgcmVqZWN0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZURvdGVudlZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZG91YmxlUXVvdGVkQm9keSA9IHZhbHVlLnJlcGxhY2VBbGwoJ1xcbicsIFN0cmluZy5yYXdgXFxuYCkucmVwbGFjZUFsbCgnXFxyJywgU3RyaW5nLnJhd2BcXHJgKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtgJyR7dmFsdWV9J2AsIGBcXGAke3ZhbHVlfVxcYGAsIGBcIiR7ZG91YmxlUXVvdGVkQm9keX1cImBdO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHBhcnNlRG90ZW52KGAke2tleX09JHtjYW5kaWRhdGV9YClba2V5XSA9PT0gdmFsdWUpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdmFsdWUgb2YgJHtrZXl9IGNhbm5vdCBiZSBsb3NzbGVzc2x5IHNlcmlhbGl6ZWQgaW50byAuZGV2LnZhcnM7IHNpbXBsaWZ5IGl0cyBxdW90aW5nLmApO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3V0cHV0LnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzV2FybmluZ091dHB1dChvdXRwdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcYndhcm4oPzppbmcpP3M/XFxiL2kudGVzdChvdXRwdXQucmVwbGFjZUFsbCgvXFxiKD86MHxubykgd2FybmluZ3M/XFxiL2dpLCAnJykpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgQnVmZmVyZWRSdW5SZXN1bHQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVTY3JpcHQsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwsIHJ1bldpdGhTcGF3bkluUGFyYWxsZWxCdWZmZXJlZCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcmludEJ1ZmZlcmVkT3V0cHV0LCBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0IH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgcmVwb3J0VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMgfSBmcm9tICcuLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBMaW50Q29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPjtcbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxMaW50Q29tbWFuZE9wdGlvbnM+ICYge1xuICAnLS0nPzogdW5rbm93bltdO1xuICBfOiB1bmtub3duW107XG4gIHByaW50QWxsT3V0cHV0PzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG94bGludEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddKTtcbmNvbnN0IHB5dGhvbkV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncHknXSk7XG5jb25zdCBkYXJ0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydkYXJ0J10pO1xuY29uc3QgcnVzdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsncnMnXSk7XG5jb25zdCBveGZtdEV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgLi4ub3hsaW50RXh0ZW5zaW9ucyxcbiAgJ2NzcycsXG4gICdncWwnLFxuICAnZ3JhcGhxbCcsXG4gICdoYnMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdsZXNzJyxcbiAgJ21kJyxcbiAgJ21keCcsXG4gICdzY3NzJyxcbiAgJ3RvbWwnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllckV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgJ2NqcycsXG4gICdjc3MnLFxuICAnY3RzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2phdmEnLFxuICAnanMnLFxuICAnanNvbicsXG4gICdqc29uNScsXG4gICdqc29uYycsXG4gICdqc3gnLFxuICAnbWQnLFxuICAnbWpzJyxcbiAgJ210cycsXG4gICdzY3NzJyxcbiAgJ3RzJyxcbiAgJ3RzeCcsXG4gICd2dWUnLFxuICAneWFtbCcsXG4gICd5bWwnLFxuXSk7XG5jb25zdCBwcmV0dGllck9ubHlFeHRlbnNpb25zID0gbmV3IFNldChbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5maWx0ZXIoKGV4dCkgPT4gIW94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0KSkpO1xuY29uc3QgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybiA9ICchKiovdGVzdHstLC99Zml4dHVyZXMvKionO1xuXG50eXBlIEJ1ZmZlcmVkTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkUnVuUmVzdWx0ICYgeyBjb21tYW5kOiBzdHJpbmc7IGN3ZDogc3RyaW5nIH07XG50eXBlIExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgfCB7IGV4aXRDb2RlOiBudW1iZXIgfTtcbmludGVyZmFjZSBMaW50UnVuQ29tbWFuZCB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgcHJvamVjdDogUHJvamVjdDtcbn1cblxuZXhwb3J0IGNvbnN0IGxpbnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIExpbnRDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdsaW50IFtmaWxlcy4uLl0nLFxuICBkZXNjcmliZTogJ0xpbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgbGludChhcmd2IGFzIExpbnRDb21tYW5kQXJndik7XG4gICAgaWYgKGV4aXRDb2RlKSBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbnQoYXJndjogTGludENvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndik7XG4gIGNvbnN0IHNob3VsZFJ1bkZvcm1hdHRlcnMgPSBCb29sZWFuKGFyZ3YuZm9ybWF0KTtcbiAgY29uc3Qgc2hvdWxkUnVuTGludGVycyA9ICFhcmd2LmZvcm1hdCB8fCBhcmd2LmZpeDtcbiAgLy8gVGhlIHRlc3QgbGF5b3V0IGlzIGEgc3RhdGljIHN0cnVjdHVyYWwgcnVsZSwgc28gYHdiIGxpbnRgIGlzIGl0cyBob21lOiBgd2IgdmVyaWZ5YCAodmlhIGl0c1xuICAvLyBjbGVhbnVwIHN0ZXApIGFuZCBDSSdzIGxpbnQgam9iIHRoZW4gZW5mb3JjZSBpdCB3aXRoIG5vIGV4dHJhIHdpcmluZywgYW5kIGEgc3RyYXkgdGVzdCBmaWxlXG4gIC8vIHN1cmZhY2VzIGhlcmUgaW5zdGVhZCBvZiBhdCBgd2IgdGVzdGAsIHdoZXJlIGAtLXBhc3NXaXRoTm9UZXN0c2Agd291bGQgb3RoZXJ3aXNlIGxldCB0aGUgc3VpdGVcbiAgLy8gcGFzcyB3aGlsZSBzaWxlbnRseSBydW5uaW5nIG5vbmUgb2YgaXQuIFJlcG9ydGVkIGJlZm9yZSB0aGUgbGludGVycyBydW4gc28gdGhlIGRpYWdub3NpcyBsZWFkc1xuICAvLyB0aGUgb3V0cHV0LCBidXQgbmV2ZXIgc2hvcnQtY2lyY3VpdHMgdGhlbTogYC0tZml4IC0tZm9ybWF0YCBtdXN0IHN0aWxsIGNsZWFuIHVwIHdoYXQgaXQgY2FuLFxuICAvLyBiZWNhdXNlIGEgbGF5b3V0IHZpb2xhdGlvbiBpcyBub3QgYXV0by1maXhhYmxlIGFuZCB3b3VsZCBvdGhlcndpc2UgYmxvY2sgZXZlcnkgb3RoZXIgZml4LlxuICAvLyBUaHJlZSBydW4gc2hhcGVzIG9wdCBvdXQuIEV4cGxpY2l0LXBhdGggcnVucyAoZS5nLiB0aGUgbGVmdGhvb2sgcHJlLWNvbW1pdCBob29rKSBza2lwIGl0IHNvIGFcbiAgLy8gcHJlLWV4aXN0aW5nIHZpb2xhdGlvbiBpbiBhbiB1bnRvdWNoZWQgcGFja2FnZSBjYW5ub3QgYmxvY2sgYW4gdW5yZWxhdGVkIGNvbW1pdC4gYC0tZHJ5LXJ1bmBcbiAgLy8gc2tpcHMgaXQgc28gdGhpcyBzdGF5cyB0aGUgb25lIHN0ZXAgdGhhdCBjb3VsZCBmYWlsIGEgcnVuIHdob3NlIHdob2xlIGNvbnRyYWN0IGlzIHRvIGV4ZWN1dGVcbiAgLy8gbm90aGluZy4gRm9ybWF0dGVyLW9ubHkgcnVucyAoYC0tZm9ybWF0YCB3aXRob3V0IGAtLWZpeGApIHNraXAgaXQgYmVjYXVzZSB0aGV5IGxpbnQgbm90aGluZyBhdFxuICAvLyBhbGwsIGFuZCB3YmZ5IGNoYWlucyB0aGF0IHNjcmlwdCBhcyBgYnVuIHdiIGxpbnQgLS1mb3JtYXQgJiYgYnVuIHJ1biBmb3JtYXQtY29kZWAgZm9yIERhcnQgYW5kXG4gIC8vIFB5dGhvbiByZXBvc2l0b3JpZXMg4oCUIGZhaWxpbmcgaXQgdGhlcmUgd291bGQgc2lsZW50bHkgc3RyaXAgdGhlaXIgb25seSBmb3JtYXR0aW5nIHBhc3MuXG4gIGNvbnN0IHZpb2xhdGVzVGVzdFN0cnVjdHVyZSA9XG4gICAgc2hvdWxkUnVuTGludGVycyAmJiAhYXJndi5kcnlSdW4gJiYgZmlsZXMubGVuZ3RoID09PSAwICYmIHJlcG9ydFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIC8vIGBjYXJnbyBmbXQgLS1hbGxgIGFsd2F5cyBmb3JtYXRzIHRoZSB3aG9sZSB3b3Jrc3BhY2UsIHNvIHdlIHRyYWNrIHRhcmdldFxuICAvLyBwcm9qZWN0cyByYXRoZXIgdGhhbiBpbmRpdmlkdWFsIGZpbGUgcGF0aHMuIEV2ZXJ5IHByb2plY3Qgd2l0aCBpdHMgb3duXG4gIC8vIGBDYXJnby50b21sYCBydW5zIGl0cyBvd24gYGNhcmdvIGZtdCAtLWFsbGA7IHdlIGludGVudGlvbmFsbHkgZG8gbm90IGRlZHVwXG4gIC8vIGJ5IGRpcmVjdG9yeS4gQSBuZXN0ZWQgb3Igc2libGluZyBjcmF0ZSBjYW4gYmUgYW4gaW5kZXBlbmRlbnQgQ2FyZ29cbiAgLy8gd29ya3NwYWNlIHRoYXQgYSBwYXJlbnQncyBgY2FyZ28gZm10IC0tYWxsYCBuZXZlciByZWFjaGVzLCBzbyBza2lwcGluZyBpdFxuICAvLyB3b3VsZCBsZWF2ZSBpdCB1bmZvcm1hdHRlZCwgd2hpbGUgYW55IGdlbnVpbmVseSBvdmVybGFwcGluZyBydW5zIGFyZVxuICAvLyBoYXJtbGVzcyBiZWNhdXNlIHJ1c3RmbXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgaWRlbXBvdGVudC4gRGVkdXBpbmcgYnkgcmVhbFxuICAvLyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCB3b3VsZCByZXF1aXJlIGludm9raW5nIGBjYXJnbyBsb2NhdGUtcHJvamVjdGAuXG4gIGNvbnN0IGNhcmdvRm9ybWF0UHJvamVjdHMgPSBuZXcgU2V0PFByb2plY3Q+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzQ2FyZ29Ub21sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcnVzdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY2FyZ29Gb3JtYXRQcm9qZWN0cy5hZGQocHJvamVjdCk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIHByZXNlcnZlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGxpbnRGaWxlUGF0aHNdIG9mIGxpbnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgY29uc3QgbGludENvbW1hbmQgPSBidWlsZExpbnRDb21tYW5kKHByb2plY3QsIGFyZ3YsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICBpZiAoIWxpbnRDb21tYW5kKSBjb250aW51ZTtcblxuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIHB5dGhvbkZpbGVQYXRoc10gb2YgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2LCBweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZChweXRob25GaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzXSBvZiBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBjYXJnb0Zvcm1hdFByb2plY3RzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgb3hmbXRGaWxlUGF0aHNdIG9mIG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZChveGZtdEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3duU291cmNlQ29kZSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBpZiAobGludENvbW1hbmQpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2KSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNDYXJnb1RvbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBsaW50RXhpdENvZGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhmb3JtYXR0ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMoZm9ybWF0dGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmZvcm1hdHRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgaWYgKHByZXR0aWVyQXJncy5sZW5ndGggPiAwICYmIHByb2plY3RzLnNlbGYuaGFzUHJldHRpZXIpIHtcbiAgICAgIGNvbnN0IHByZXR0aWVyUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgJ3ByZXR0aWVyJyxcbiAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICctLXdyaXRlJyxcbiAgICAgICAgICAnLS0nLFxuICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbcHJldHRpZXJSZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChwcmV0dGllclJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvcnRQYWNrYWdlSnNvblJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnLS0nLCAuLi5zb3J0UGFja2FnZUpzb25BcmdzXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbc29ydFBhY2thZ2VKc29uUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2goc29ydFBhY2thZ2VKc29uUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgIGNvbnN0IGxpbnRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMobGludGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGxpbnRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5saW50ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcbiAgfVxuXG4gIHJldHVybiBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkgfHwgdmlvbGF0ZXNUZXN0U3RydWN0dXJlID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kcyhcbiAgY29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10sXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdFtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChjb21tYW5kcy5tYXAoKHsgY29tbWFuZCwgcHJvamVjdCB9KSA9PiBydW5MaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKSkpO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdCkgPT4gKHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKGV4aXRDb2RlKSA9PiAoeyBleGl0Q29kZSB9KSk7XG59XG5cbmZ1bmN0aW9uIHByaW50U2lsZW50TGludE91dHB1dHMoXG4gIHJlc3VsdHM6IExpbnRSdW5SZXN1bHRbXSxcbiAgYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICdwcmludEFsbE91dHB1dCcgfCAnc2lsZW50Jz5cbik6IHZvaWQge1xuICBjb25zdCBwcmludGFibGVSZXN1bHRzID1cbiAgICBhcmd2LnNpbGVudCAmJiAhYXJndi5wcmludEFsbE91dHB1dFxuICAgICAgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiAnb3V0cHV0JyBpbiByZXN1bHQgJiYgc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpKVxuICAgICAgOiByZXN1bHRzO1xuICBpZiAocHJpbnRhYmxlUmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBwcmludGFibGVSZXN1bHRzKSB7XG4gICAgaWYgKCEoJ291dHB1dCcgaW4gcmVzdWx0KSkgY29udGludWU7XG5cbiAgICBpZiAoYXJndi5wcmludEFsbE91dHB1dCkge1xuICAgICAgcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmd2LnNpbGVudCkge1xuICAgICAgICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuICAgICAgfVxuICAgICAgcHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0OiBCdWZmZXJlZExpbnRSdW5SZXN1bHQpOiB2b2lkIHtcbiAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcblxuICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChyZXN1bHQuY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dC50cmltKCk7XG4gIGlmIChvdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRIZWFkZXIoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnIG94Zm10ICcpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJyBzb3J0LXBhY2thZ2UtanNvbiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzVHlwZUF3YXJlT3hsaW50Jz4sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgIC8vIFR5cGUtYXdhcmUgbW9kZSBtYWtlcyBveGxpbnQgcmVwb3J0IHR5cGUtY2hlY2sgZGlhZ25vc3RpY3MuIFBhc3MgdGhlIGZsYWdzIGV4cGxpY2l0bHlcbiAgICAgIC8vIGJlY2F1c2Ugb3hsaW50IHJlamVjdHMgdGhlIGVxdWl2YWxlbnQgb3B0aW9ucyBpbiBub24tcm9vdCBjb25maWdzLCBzbyBwZXItcGFja2FnZSBydW5zXG4gICAgICAvLyBpbiBtb25vcmVwb3Mgd291bGQgb3RoZXJ3aXNlIG1pc3MgdHlwZSBlcnJvcnMuXG4gICAgICAuLi4ocHJvamVjdC5oYXNUeXBlQXdhcmVPeGxpbnQgPyBbJy0tdHlwZS1hd2FyZScsICctLXR5cGUtY2hlY2snXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLXF1aWV0J10gOiBbXSksXG4gICAgICAuLi4oYXJndi5maXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3hmbXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICdZQVJOJyxcbiAgICAnb3hmbXQnLFxuICAgICctLXdyaXRlJyxcbiAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICAnISoqL3BhY2thZ2UuanNvbicsXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gdG9MaW50VGFyZ2V0cyhmaWxlcyk7XG4gIHJldHVybiBbXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2lzb3J0JywgJy0tcHJvZmlsZScsICdibGFjaycsICctLWZpbHRlci1maWxlcycsIC4uLnRhcmdldHNdKSxcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnYmxhY2snLCAuLi50YXJnZXRzXSksXG4gIF0uam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2OiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sIGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2ZsYWtlOCcsIC4uLihhcmd2LnF1aWV0ID8gWyctcSddIDogW10pLCAuLi50b0xpbnRUYXJnZXRzKGZpbGVzKV0pO1xufVxuXG5mdW5jdGlvbiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpOiBzdHJpbmcge1xuICAvLyBGb3JtYXR0aW5nIG11c3QgZ28gdGhyb3VnaCBjYXJnbyAobm90IHJ1c3RmbXQgb24gaW5kaXZpZHVhbCBmaWxlcykgc28gZWFjaFxuICAvLyBjcmF0ZSdzIGVkaXRpb24gYW5kIHJ1c3RmbXQgY29uZmlndXJhdGlvbiBhcmUgcmVzcGVjdGVkOyBgLS1hbGxgIGNvdmVyc1xuICAvLyBldmVyeSB3b3Jrc3BhY2UgbWVtYmVyIGFuZCBpcyBhIG5vLW9wIHN1ZmZpeCBmb3Igc2luZ2xlLWNyYXRlIHByb2plY3RzLlxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydjYXJnbycsICdmbXQnLCAnLS1hbGwnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRvTGludFRhcmdldHMoZmlsZXMpXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRMaW50Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdhbmFseXplJywgLi4udG9MaW50VGFyZ2V0cyhmaWxlcyldKTtcbn1cblxuZnVuY3Rpb24gdG9MaW50VGFyZ2V0cyhmaWxlczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5jb25zdCBzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyA9IDEwMDtcbmNvbnN0IHN0YWxlUHJvY2Vzc01heFBvbGxzID0gMTA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpO1xuICBpZiAoIWF2YWlsYWJsZSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0KTtcbn1cblxuZnVuY3Rpb24ga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBwaWQgb2YgbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydCkpIHtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydDogbnVtYmVyKTogbnVtYmVyW10ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YCwgJy1zVENQOkxJU1RFTiddLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICAgIHJldHVybiBzdGRvdXRcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKChwaWQpID0+IE51bWJlcihwaWQudHJpbSgpKSlcbiAgICAgIC5maWx0ZXIoKHBpZCkgPT4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlU3RhbGVQcm9jZXNzKHBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhbGVQcm9jZXNzTWF4UG9sbHM7IGkrKykge1xuICAgIGF3YWl0IHNldFRpbWVvdXQoc3RhbGVQcm9jZXNzUG9sbEludGVydmFsTXMpO1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFU1JDSCcpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzLCByZW1vdmVTdGFsZVByb2Nlc3MgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2RlbGF5LW1zJzoge1xuICAgIGRlZmF1bHQ6IDUwMDAsXG4gICAgZGVzY3JpYmU6ICdEZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xudHlwZSBNYWludGVuYW5jZUFyZ3YgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPiAmIHtcbiAgYWN0aW9uOiAnc3RhcnQnIHwgJ3N0b3AnO1xufTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMgPSA1O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMgPSAxMDA7XG5jb25zdCBtYXhUaW1lb3V0RGVsYXlNcyA9IDJfMTQ3XzQ4M182NDc7XG5jb25zdCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUgPSAnLndiJztcbmNvbnN0IG1haW50ZW5hbmNlSHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJqYVwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj5cbiAgICA8dGl0bGU+44Oh44Oz44OG44OK44Oz44K55LitPC90aXRsZT5cbiAgICA8c3R5bGU+XG4gICAgICBib2R5IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgICB9XG5cbiAgICAgIG1haW4ge1xuICAgICAgICBwYWRkaW5nOiAyNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAyOHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xuICAgICAgfVxuXG4gICAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS44O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bWFpbj5cbiAgICAgIDxoMT7nj77lnKjjg6Hjg7Pjg4bjg4rjg7PjgrnkuK3jgafjgZk8L2gxPlxuICAgICAgPHA+55qG5qeY44Gr44Gv44GU5LiN5L6/44KS44GK44GL44GR44GX44G+44GZ44GM44CB44Oh44Oz44OG44OK44Oz44K557WC5LqG44G+44Gn44GX44Gw44KJ44GP44GK5b6F44Gh44GP44Gg44GV44GE44CCPC9wPlxuICAgIDwvbWFpbj5cbiAgPC9ib2R5PlxuPC9odG1sPmA7XG5cbmV4cG9ydCBjb25zdCBtYWludGVuYW5jZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTWFpbnRlbmFuY2VBcmd2PiA9IHtcbiAgY29tbWFuZDogJ21haW50ZW5hbmNlIDxhY3Rpb24+JyxcbiAgZGVzY3JpYmU6ICdTdGFydCBvciBzdG9wIGEgbGlnaHR3ZWlnaHQgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuIEV4YW1wbGU6IHdiIG1haW50ZW5hbmNlIHN0YXJ0JyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzXG4gICAgICAucG9zaXRpb25hbCgnYWN0aW9uJywge1xuICAgICAgICBjaG9pY2VzOiBbJ3N0YXJ0JywgJ3N0b3AnXSBhcyBjb25zdCxcbiAgICAgICAgZGVzY3JpYmU6ICdNYWludGVuYW5jZSBzZXJ2ZXIgYWN0aW9uJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcikgYXMgdW5rbm93biBhcyBBcmd2PE1haW50ZW5hbmNlQXJndj4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gYXJndi5hY3Rpb247XG4gICAgaWYgKHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2UgJHthY3Rpb259IGJlY2F1c2UgV0JfRU5WIGlzIHRlc3QuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChwcm9qZWN0LmVudi5QT1JUKTtcbiAgICBpZiAoYWN0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgICBhd2FpdCBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQsIGFyZ3YuZGVsYXlNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgYXdhaXQgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGFzc2VydC5vayhOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpICYmIHBvcnQgPiAwLCBgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlciwgZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFzc2VydC5vayhcbiAgICBOdW1iZXIuaXNGaW5pdGUoZGVsYXlNcykgJiYgZGVsYXlNcyA+PSAwICYmIGRlbGF5TXMgPD0gbWF4VGltZW91dERlbGF5TXMsXG4gICAgYGRlbGF5LW1zIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke21heFRpbWVvdXREZWxheU1zfTogJHtkZWxheU1zfWBcbiAgKTtcblxuICBjb25zdCBwaWRGaWxlUGF0aCA9IGF3YWl0IHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwcm9jZXNzLnBpZCk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU2lnbmFsSGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KGRlbGF5TXMsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0KTtcbiAgICBpZiAoIXNlcnZlcikgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBTdGFydGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgYXdhaXQgd2FpdEZvclNodXRkb3duKHNlcnZlcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGF3YWl0IGNsZWFudXAoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgdW5kZWZpbmVkPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHNlcnZlciwgcG9ydCwgaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IpO1xuICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScgJiYgYXR0ZW1wdCA8IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlIHNlcnZlciBiZWNhdXNlIHBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQsIGVycik7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBtYWludGVuYW5jZSBzZXJ2ZXIgc3RhcnR1cCBzdGF0ZS4nKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydDogbnVtYmVyLCBlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKTogbmV2ZXIge1xuICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICBjb25zb2xlLmluZm8oYFN0b3BwZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTogaHR0cC5TZXJ2ZXIge1xuICByZXR1cm4gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLXN0b3JlJyxcbiAgICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgICB9KTtcbiAgICByZXNwb25zZS5lbmQobWFpbnRlbmFuY2VIdG1sKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKFxuICBzZXJ2ZXI6IGh0dHAuU2VydmVyLFxuICBwb3J0OiBudW1iZXIsXG4gIG9uUnVudGltZUVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uU3RhcnR1cEVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgICBzZXJ2ZXIub24oJ2Vycm9yJywgb25SdW50aW1lRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMC4wLjAuMCcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclNodXRkb3duKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzaHV0ZG93biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIGNsb3NlIG1haW50ZW5hbmNlIHNlcnZlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9O1xuICAgIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VSUl9TRVJWRVJfTk9UX1JVTk5JTkcnKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLmNsb3NlQWxsQ29ubmVjdGlvbnMoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHBpZEZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShwaWRGaWxlUGF0aCwgYCR7cHJvY2Vzcy5waWR9XFxuYCwgJ3V0ZjgnKTtcbiAgcmV0dXJuIHBpZEZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICBpZiAocGlkICE9PSB1bmRlZmluZWQgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCkge1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwaWQsICdTSUdURVJNJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQpO1xuICB9XG4gIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcGlkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkUGlkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleHBlY3RlZFBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gICAgaWYgKHBpZCAhPT0gZXhwZWN0ZWRQaWQpIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy5ybShwaWRGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaWRUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUocGlkRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKHBpZFRleHQudHJpbSgpKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgPyBwaWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LnJvb3REaXJQYXRoLCBwb3J0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocm9vdERpclBhdGg6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyb290RGlyUGF0aCwgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lLCBgbWFpbnRlbmFuY2UtJHtwb3J0fS5waWRgKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbi8qKlxuICogTWF0ZXJpYWxpemF0aW9uIG9mIGBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qYCByZWdpc3RyeSAoVmVyZGFjY2lvKSBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHM6XG4gKiB0aGUgcGFja2FnZXMgYXJlIGRvd25sb2FkZWQgb24gdGhlIGhvc3QgKGF1dGggdmlhIH4vLm5wbXJjIGxvY2FsbHksIG9yIGEgdGVtcG9yYXJ5IC5ucG1yYyBwbHVzXG4gKiBWRVJEQUNDSU9fVE9LRU4gb24gQ0kpIGFuZCBleHRyYWN0ZWQgbmV4dCB0byB0aGUgcmVwb3NpdG9yeSBzbyBpbWFnZSBidWlsZHMgbmVlZCBubyByZWdpc3RyeSBjcmVkZW50aWFsc1xuICogKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15Ad2lsbGJvb3N0ZXIoPzotcHJpdmF0ZSk/XFwvLywgJycpO1xufVxuXG4vLyBgZ2l0OmAvYGdpdCtgL2BnaXRAYCAobm90IHRoZSBiYXJlIHdvcmQgYGdpdGApOiBucG0gYWxsb3dzIGFyYml0cmFyeSBkaXN0LXRhZ3MsIHNvIGEgdGFnIG5hbWVkXG4vLyBgZ2l0YCBvciBgZ2l0LW5leHRgIG11c3Qgc3RpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ2lzdHJ5IHNwZWNpZmllci5cbmNvbnN0IG5vblJlZ2lzdHJ5U3BlY2lmaWVyUHJlZml4ZXMgPSBbXG4gICdnaXQ6JyxcbiAgJ2dpdCsnLFxuICAnZ2l0QCcsXG4gICdmaWxlOicsXG4gICdsaW5rOicsXG4gICd3b3Jrc3BhY2U6JyxcbiAgJ2h0dHA6JyxcbiAgJ2h0dHBzOicsXG4gICdwb3J0YWw6JyxcbiAgJ3BhdGNoOicsXG5dO1xuXG4vLyBUaGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igd2hpY2ggZ2l0IHNwZWNpZmllcnMgdGhlIHByaXZhdGUtcGFja2FnZSB0b29saW5nIHN1cHBvcnRzOlxuLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcyBleGFjdGx5IHRoZXNlLCBhbmQgYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgIG11c3Rcbi8vIHJld3JpdGUgZXhhY3RseSB0aGVzZSAocmV3cml0aW5nIG90aGVyIG9yZ3MnIFNTSCBVUkxzIHdvdWxkIHBvaW50IGF0IG5ldmVyLW1hdGVyaWFsaXplZCBwYXRocykuXG5jb25zdCBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4gPSAvXmdpdEBnaXRodWJcXC5jb206KD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpXFwvW14vI10rKD86XFwuZ2l0KT8oPzojLiopPyQvO1xuXG4vLyBSZXR1cm5zIGJvb2xlYW4gKG5vdCBhIGB2YWx1ZSBpcyBzdHJpbmdgIHByZWRpY2F0ZSk6IGEgcHJlZGljYXRlIHdvdWxkIG5hcnJvdyB0aGUgbmVnYXRpdmVcbi8vIGJyYW5jaCB0byBgdW5kZWZpbmVkYCBhbmQgYnJlYWsgYGVsc2UgaWZgIGNoYWlucyBvdmVyIGBzdHJpbmcgfCB1bmRlZmluZWRgIGRlcGVuZGVuY3kgdmFsdWVzLlxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgcHJpdmF0ZUdpdERlcGVuZGVuY3lQYXR0ZXJuLnRlc3QodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIG5hbWUuc3RhcnRzV2l0aChgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS9gKSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAhbm9uUmVnaXN0cnlTcGVjaWZpZXJQcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IHZhbHVlLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlUmVnaXN0cnlBdXRoIHtcbiAgcmVnaXN0cnlVcmw6IHN0cmluZztcbiAgYXV0aFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcmVnaXN0cnkgVVJMIGFuZCBhdXRoIHRva2VuIGZvciB0aGUgcHJpdmF0ZSBzY29wZSBmcm9tIH4vLm5wbXJjIGxvY2FsbHkuIENJIG1heSBhbHNvXG4gKiBzdXBwbHkgYSB0ZW1wb3JhcnkgcHJvamVjdCAubnBtcmM7IFZFUkRBQ0NJT19UT0tFTiBzZXJ2ZXMgYXMgaXRzIGZhbGxiYWNrIHRva2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocm9vdERpclBhdGg6IHN0cmluZyk6IFByaXZhdGVSZWdpc3RyeUF1dGggfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IG5wbXJjUGF0aHMgPSBbcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5ucG1yYycpXTtcbiAgaWYgKHByb2Nlc3MuZW52LkNJKSBucG1yY1BhdGhzLnB1c2gocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnLm5wbXJjJykpO1xuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSB7XG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZW50cmllcywgcGFyc2VOcG1yYyhmcy5yZWFkRmlsZVN5bmMobnBtcmNQYXRoLCAndXRmOCcpKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG5wbXJjIGZpbGVzIGFyZSBmaW5lOyB0aGUgb3RoZXIgZmlsZSBvciBWRVJEQUNDSU9fVE9LRU4gbWF5IHN0aWxsIHByb3ZpZGUgYXV0aC5cbiAgICB9XG4gIH1cblxuICBjb25zdCByZWdpc3RyeVVybCA9IGVudHJpZXNbYCR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX06cmVnaXN0cnlgXT8ucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gIGlmICghcmVnaXN0cnlVcmwpIHJldHVybjtcblxuICAvLyBucG0tc3R5bGUgVVJJIG1hdGNoaW5nOiBub3JtYWxpemUgYm90aCBzaWRlcyB0byBhIHRyYWlsaW5nIHNsYXNoIHNvIGEgdG9rZW4gZm9yXG4gIC8vIGAvL3ZlcmRhY2Npby5leGFtcGxlLmNvbS9gIGNhbiBuZXZlciBtYXRjaCBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20tb3RoZXIub3JnL2AsIGFuZCBwaWNrIHRoZVxuICAvLyBNT1NUIFNQRUNJRklDIChsb25nZXN0KSBtYXRjaGluZyBwcmVmaXggc28gYC8vaG9zdC9wcml2YXRlL2AgYmVhdHMgYC8vaG9zdC9gLlxuICBjb25zdCBub3JtYWxpemVkUmVnaXN0cnlVcmwgPSBgJHtyZWdpc3RyeVVybC5yZXBsYWNlKC9eaHR0cHM/Oi8sICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgbGV0IG1hdGNoZWRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgbWF0Y2hlZFByZWZpeExlbmd0aCA9IC0xO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIC8vIFNraXAgZW1wdHkgdG9rZW5zIChhbiB1bnNldCBgJHtWQVJ9YCBleHBhbmRzIHRvICcnKTogYW4gZW1wdHkgbWF0Y2ggbXVzdCBub3QgZGVmZWF0IHRoZVxuICAgIC8vIFZFUkRBQ0NJT19UT0tFTiBmYWxsYmFjayBiZWxvdy5cbiAgICBpZiAoIWtleS5lbmRzV2l0aCgnOl9hdXRoVG9rZW4nKSB8fCAhdmFsdWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHByZWZpeCA9IGAke2tleS5zbGljZSgwLCAtJzpfYXV0aFRva2VuJy5sZW5ndGgpLnJlcGxhY2UoL1xcLyskLywgJycpfS9gO1xuICAgIGlmIChub3JtYWxpemVkUmVnaXN0cnlVcmwuc3RhcnRzV2l0aChwcmVmaXgpICYmIHByZWZpeC5sZW5ndGggPiBtYXRjaGVkUHJlZml4TGVuZ3RoKSB7XG4gICAgICBtYXRjaGVkUHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDtcbiAgICAgIG1hdGNoZWRUb2tlbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvLyBObyBQcm9qZWN0IGluc3RhbmNlIGV4aXN0cyBhdCB0aGlzIGxheWVyLCBzbyBwcm9jZXNzLmVudiBpcyB0aGUgb25seSBzb3VyY2UgZm9yIHRoZVxuICAvLyBDSS1pbmplY3RlZCBmYWxsYmFjayB0b2tlbi5cbiAgY29uc3QgYXV0aFRva2VuID0gbWF0Y2hlZFRva2VuID8/IHByb2Nlc3MuZW52LlZFUkRBQ0NJT19UT0tFTjtcbiAgcmV0dXJuIHsgcmVnaXN0cnlVcmwsIGF1dGhUb2tlbiB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOcG1yYyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBsaW5lID0gcmF3TGluZS50cmltKCk7XG4gICAgaWYgKCFsaW5lIHx8IGxpbmUuc3RhcnRzV2l0aCgnIycpIHx8IGxpbmUuc3RhcnRzV2l0aCgnOycpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCc9Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4IDw9IDApIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkudHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gbGluZVxuICAgICAgLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSlcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlQWxsKC9cXCRcXHsoW159XSspXFx9L2csIChfLCB2YXJpYWJsZU5hbWU6IHN0cmluZykgPT4gcHJvY2Vzcy5lbnZbdmFyaWFibGVOYW1lXSA/PyAnJyk7XG4gICAgZW50cmllc1trZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogRG93bmxvYWQgYW5kIGV4dHJhY3Qgb25lIHJlZ2lzdHJ5IHBhY2thZ2UgaW50byBgdGFyZ2V0RGlyUGF0aGAuIFRoZSBzcGVjaWZpZXIgbWF5IGJlIGFuIGV4YWN0XG4gKiBzZW12ZXIgdmVyc2lvbiAodGhlIG9yZydzIGNvbW1vbiBjYXNlIHZpYSBidW5maWcgYGV4YWN0ID0gdHJ1ZWApLCBhbnkgc2VtdmVyIHJhbmdlIChyZXNvbHZlZFxuICogbWF4LXNhdGlzZnlpbmcgYWdhaW5zdCB0aGUgcmVnaXN0cnkncyBwdWJsaXNoZWQgdmVyc2lvbnMsIG1hdGNoaW5nIGBucG0gaW5zdGFsbGApLCBvciBhXG4gKiBkaXN0LXRhZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nLFxuICB0YXJnZXREaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcmVzb2x2ZVZlcnNpb24oYXV0aCwgcGFja2FnZU5hbWUsIHZlcnNpb25TcGVjaWZpZXIpO1xuICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGZldGNoUmVnaXN0cnlKc29uPHsgZGlzdD86IHsgdGFyYmFsbD86IHN0cmluZyB9IH0+KFxuICAgIGF1dGgsXG4gICAgYCR7YXV0aC5yZWdpc3RyeVVybH0vJHtlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSl9LyR7dmVyc2lvbn1gXG4gICk7XG4gIGNvbnN0IHRhcmJhbGxVcmwgPSBtZXRhZGF0YS5kaXN0Py50YXJiYWxsO1xuICBpZiAoIXRhcmJhbGxVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmJhbGwgVVJMIGZvciAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259IGluICR7YXV0aC5yZWdpc3RyeVVybH0uYCk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHRhcmJhbGxVcmwpO1xuICBjb25zdCB0YXJiYWxsUGF0aCA9IHBhdGguam9pbihcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLXByaXZhdGUtcGFja2FnZS0nKSksXG4gICAgJ3BhY2thZ2UudGd6J1xuICApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh0YXJiYWxsUGF0aCwgQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0YXJnZXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAvLyBucG0gdGFyYmFsbHMgcGxhY2UgdGhlIGNvbnRlbnQgdW5kZXIgYSB0b3AtbGV2ZWwgYHBhY2thZ2UvYCBkaXJlY3RvcnkuXG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ3RhcicsIFsnLXh6ZicsIHRhcmJhbGxQYXRoLCAnLUMnLCB0YXJnZXREaXJQYXRoLCAnLS1zdHJpcC1jb21wb25lbnRzPTEnXSwge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb259ICgke3RhcmJhbGxVcmx9KS5gKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5kaXJuYW1lKHRhcmJhbGxQYXRoKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVWZXJzaW9uKFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFByZXJlbGVhc2UgYW5kIGArYnVpbGRgIG1ldGFkYXRhIGFyZSBib3RoIHBhcnQgb2YgdmFsaWQgZXhhY3QgU2VtVmVyIHZlcnNpb25zLCBzbyBhbiBleGFjdFxuICAvLyBzcGVjaWZpZXIgcmVzb2x2ZXMgdG8gaXRzZWxmIHdpdGhvdXQgYSBwYWNrdW1lbnQgZmV0Y2guXG4gIGlmIChpc0V4YWN0VmVyc2lvbih2ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuIHZlcnNpb25TcGVjaWZpZXI7XG5cbiAgY29uc3QgcGFja3VtZW50ID0gYXdhaXQgZmV0Y2hSZWdpc3RyeUpzb248UGFja3VtZW50PihhdXRoLCBgJHthdXRoLnJlZ2lzdHJ5VXJsfS8ke2VuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKX1gKTtcbiAgY29uc3QgdmVyc2lvbiA9IHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KHZlcnNpb25TcGVjaWZpZXIsIHBhY2t1bWVudCk7XG4gIGlmICghdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgcmVzb2x2ZSAke3BhY2thZ2VOYW1lfUAke3ZlcnNpb25TcGVjaWZpZXJ9IGFnYWluc3QgJHthdXRoLnJlZ2lzdHJ5VXJsfTsgdXNlIGFuIGV4YWN0IHZlcnNpb24sIGEgc2VtdmVyIHJhbmdlLCBvciBhIGRpc3QtdGFnLmBcbiAgICApO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5pbnRlcmZhY2UgUGFja3VtZW50IHtcbiAgJ2Rpc3QtdGFncyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB2ZXJzaW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIG5wbSdzIHNwZWNpZmllciBjbGFzc2lmaWNhdGlvbjogYCpgIGFuZCBkaXN0LXRhZyBuYW1lcyByZXNvbHZlIHZpYSBkaXN0LXRhZ3MgKG5wbSByZXNvbHZlcyBgKmBcbiAqIHRvIHRoZSBgbGF0ZXN0YCB0YWcpLCB3aGlsZSBhbnkgb3RoZXIgdmFsaWQgc2VtdmVyIHJhbmdlIHJlc29sdmVzIHRvIHRoZSBoaWdoZXN0IHB1Ymxpc2hlZFxuICogdmVyc2lvbiBzYXRpc2Z5aW5nIGl0LCBtYXRjaGluZyBgbnBtIGluc3RhbGxgJ3MgbWF4LXNhdGlzZnlpbmcgc2VtYW50aWNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0VmVyc2lvbkZyb21QYWNrdW1lbnQodmVyc2lvblNwZWNpZmllcjogc3RyaW5nLCBwYWNrdW1lbnQ6IFBhY2t1bWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh2ZXJzaW9uU3BlY2lmaWVyICE9PSAnKicgJiYgc2VtdmVyLnZhbGlkUmFuZ2UodmVyc2lvblNwZWNpZmllcikpIHtcbiAgICByZXR1cm4gc2VtdmVyLm1heFNhdGlzZnlpbmcoT2JqZWN0LmtleXMocGFja3VtZW50LnZlcnNpb25zID8/IHt9KSwgdmVyc2lvblNwZWNpZmllcikgPz8gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBwYWNrdW1lbnRbJ2Rpc3QtdGFncyddPy5bdmVyc2lvblNwZWNpZmllciA9PT0gJyonID8gJ2xhdGVzdCcgOiB2ZXJzaW9uU3BlY2lmaWVyXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWdpc3RyeUpzb248VD4oYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCwgdXJsOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEZyb21SZWdpc3RyeShhdXRoLCB1cmwpO1xuICByZXR1cm4gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgVDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hGcm9tUmVnaXN0cnkoYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCwgdXJsOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIC8vIFRhcmJhbGwgVVJMcyBjb21lIGZyb20gcmVnaXN0cnktY29udHJvbGxlZCBtZXRhZGF0YTsgYXR0YWNoIHRoZSB0b2tlbiBvbmx5IHRvIHRoZSBjb25maWd1cmVkXG4gIC8vIHJlZ2lzdHJ5J3Mgb3duIG9yaWdpbiBzbyBhIG1hbGljaW91cyBvciBtaXNjb25maWd1cmVkIHJlZ2lzdHJ5IGNhbm5vdCByZWRpcmVjdCB0aGUgY3JlZGVudGlhbFxuICAvLyB0byBhIHRoaXJkLXBhcnR5IGhvc3QuXG4gIGNvbnN0IHNlbmRBdXRoVG9rZW4gPSAhIWF1dGguYXV0aFRva2VuICYmIGlzU2FtZU9yaWdpbih1cmwsIGF1dGgucmVnaXN0cnlVcmwpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHNlbmRBdXRoVG9rZW4gPyB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoLmF1dGhUb2tlbn1gIH0gOiB7fSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVPcmlnaW4odXJsOiBzdHJpbmcsIHJlZ2lzdHJ5VXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwpLm9yaWdpbiA9PT0gbmV3IFVSTChyZWdpc3RyeVVybCkub3JpZ2luO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlUGFja2FnZU5hbWUocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYWNrYWdlTmFtZS5yZXBsYWNlKCcvJywgJyUyRicpO1xufVxuXG4vLyBUaGUgb2ZmaWNpYWwgU2VtVmVyIDIuMC4wIGdyYW1tYXIgKHNlbXZlci5vcmcpLCBhbmNob3JlZDogbnVtZXJpYy1sb29raW5nIGRpc3QtdGFncyBzdWNoIGFzXG4vLyBgMS4yLjNsYXRlc3RgLCBsZWFkaW5nLXplcm8gdmVyc2lvbnMgKGAwMS4yLjNgKSwgYW5kIHVuZGVyc2NvcmUgaWRlbnRpZmllcnMgYXJlIE5PVCB2ZXJzaW9ucyDigJRcbi8vIHJlc29sdmVWZXJzaW9uIHRyZWF0cyB0aGVtIGFzIHRhZ3MsIG1hdGNoaW5nIG5vZGUtc2VtdmVyJ3MgY2xhc3NpZmljYXRpb24uXG5jb25zdCBleGFjdFNlbXZlclBhdHRlcm4gPVxuICAvXig/OjB8WzEtOV1cXGQqKVxcLig/OjB8WzEtOV1cXGQqKVxcLig/OjB8WzEtOV1cXGQqKSg/Oi0oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikoPzpcXC4oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikpKik/KD86XFwrWzAtOWEtekEtWi1dKyg/OlxcLlswLTlhLXpBLVotXSspKik/JC87XG5cbi8qKiBXaGV0aGVyIHRoZSBzcGVjaWZpZXIgaXMgYW4gZXhhY3QgU2VtVmVyIHZlcnNpb24gKG5vdCBhIHJhbmdlLCB0YWcsIG9yIGdpdCBVUkwpLiAqL1xuZnVuY3Rpb24gaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc3BlY2lmaWVyICYmIGV4YWN0U2VtdmVyUGF0dGVybi50ZXN0KHNwZWNpZmllcik7XG59XG5cbi8qKlxuICogV2hldGhlciBFVkVSWSB2ZXJzaW9uIGBzcGVjaWZpZXJgIGNhbiByZXNvbHZlIHRvIGFsc28gc2F0aXNmaWVzIGByZXF1aXJlbWVudGAgKGV4YWN0IHZlcnNpb25zXG4gKiBjb3VudCBhcyBzaW5nbGUtdmVyc2lvbiByYW5nZXMpLiBDb25mbGljdCBjaGVja3MgdXNlIHRoaXMgYmVjYXVzZSB0aGUgYWN0dWFsbHkgcmVzb2x2ZWQgdmVyc2lvblxuICogaXMgdW5rbm93biBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGlzIGNvbnN1bHRlZDogYSBzdWJzZXQgc3BlY2lmaWVyJ3MgbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBpc1xuICogZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSB3aWRlciByZXF1aXJlbWVudC4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMpIGFyZSBub3RcbiAqIGNvbXBhcmFibGUgYW5kIHJldHVybiBmYWxzZSDigJQgY2FsbGVycyBhY2NlcHQgdGhvc2Ugb25seSBvbiBleGFjdCBzdHJpbmcgZXF1YWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGVjaWZpZXJTdWJzZXQoc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJlcXVpcmVtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKHNwZWNpZmllciA9PT0gdW5kZWZpbmVkIHx8IHJlcXVpcmVtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgLy8gYCpgIHJlc29sdmVzIHRocm91Z2ggdGhlIGBsYXRlc3RgIGRpc3QtdGFnIChzZWxlY3RWZXJzaW9uRnJvbVBhY2t1bWVudCksIG5vdCBhcyBhIHJhbmdlLCBzb1xuICAvLyBpdCBpcyBub3Qgc3RhdGljYWxseSBjb21wYXJhYmxlIGluIGVpdGhlciBwb3NpdGlvbi5cbiAgaWYgKHNwZWNpZmllciA9PT0gJyonIHx8IHJlcXVpcmVtZW50ID09PSAnKicpIHJldHVybiBmYWxzZTtcbiAgLy8gQnVpbGQgbWV0YWRhdGEgZGlzdGluZ3Vpc2hlcyByZWdpc3RyeSBhcnRpZmFjdHMgKHJlc29sdmVWZXJzaW9uIGZldGNoZXMgYW4gZXhhY3Qgc3BlY2lmaWVyXG4gIC8vIHZlcmJhdGltKSBidXQgc2VtdmVyIGNvbXBhcmlzb25zIGlnbm9yZSBpdCwgc28gdHdvIGV4YWN0IHZlcnNpb25zIG11c3QgbWF0Y2ggYXMgc3RyaW5ncy5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikgJiYgaXNFeGFjdFZlcnNpb24ocmVxdWlyZW1lbnQpKSByZXR1cm4gc3BlY2lmaWVyID09PSByZXF1aXJlbWVudDtcbiAgaWYgKCFzZW12ZXIudmFsaWRSYW5nZShzcGVjaWZpZXIpIHx8ICFzZW12ZXIudmFsaWRSYW5nZShyZXF1aXJlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHNlbXZlci5zdWJzZXQoc3BlY2lmaWVyLCByZXF1aXJlbWVudCk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbWF0ZXJpYWxpemVkIGB2ZXJzaW9uYCBjYW4gYmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIHJlZ2lzdHJ5IGBzcGVjaWZpZXJgLlxuICogRGlzdC10YWdzIChpbnZhbGlkIHJhbmdlcykgYXJlIG5vdCBzdGF0aWNhbGx5IGNoZWNrYWJsZSBhbmQgcGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGVyaWFsaXplZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBCdWlsZCBtZXRhZGF0YSBkaXN0aW5ndWlzaGVzIHJlZ2lzdHJ5IGFydGlmYWN0cywgc28gYW4gZXhhY3Qgc3BlY2lmaWVyIGFkbWl0cyBvbmx5IHRoZVxuICAvLyBpZGVudGljYWwgdmVyc2lvbiBzdHJpbmcuXG4gIGlmIChpc0V4YWN0VmVyc2lvbihzcGVjaWZpZXIpKSByZXR1cm4gc3BlY2lmaWVyID09PSB2ZXJzaW9uO1xuICBpZiAoIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikpIHJldHVybiB0cnVlO1xuICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGluc3RhbGxlZCBgdmVyc2lvbmAgaXMgc3RhdGljYWxseSBLTk9XTiB0byBzYXRpc2Z5IHRoZSByZWdpc3RyeSBgc3BlY2lmaWVyYC5cbiAqIERpc3QtdGFncyAoaW52YWxpZCByYW5nZXMpIGFyZSBub3Qgc3RhdGljYWxseSBjaGVja2FibGUgYW5kIHJldHVybiBmYWxzZSDigJQgdW5saWtlXG4gKiBtYXRlcmlhbGl6ZWRWZXJzaW9uU2F0aXNmaWVzLCBjYWxsZXJzIHVzZSB0aGlzIHRvIGRlY2lkZSB3aGV0aGVyIGFuIGluc3RhbGxlZCBjb3B5IGNhbiByZXBsYWNlXG4gKiBhIHJlZ2lzdHJ5IGRvd25sb2FkLCBzbyB1bmNlcnRhaW50eSBtdXN0IGZhbGwgYmFjayB0byBkb3dubG9hZGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMoc3BlY2lmaWVyOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgKmAgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgYGxhdGVzdGAgZGlzdC10YWcgKHNlbGVjdFZlcnNpb25Gcm9tUGFja3VtZW50KSwgc28gbGlrZSBhbnkgb3RoZXJcbiAgLy8gZGlzdC10YWcgaXQgaXMgbm90IHN0YXRpY2FsbHkgY2hlY2thYmxlIGFnYWluc3QgYW4gaW5zdGFsbGVkIHZlcnNpb24uXG4gIGlmIChzcGVjaWZpZXIgPT09ICcqJykgcmV0dXJuIGZhbHNlO1xuICAvLyByZXNvbHZlVmVyc2lvbiBmZXRjaGVzIGFuIGV4YWN0IHNwZWNpZmllciB2ZXJiYXRpbSAoYnVpbGQgbWV0YWRhdGEgaW5jbHVkZWQpLCBzbyBhbiBpbnN0YWxsZWRcbiAgLy8gY29weSBtYXkgcmVwbGFjZSB0aGUgZG93bmxvYWQgb25seSB3aGVuIHRoZSB2ZXJzaW9uIHN0cmluZ3MgbWF0Y2ggZXhhY3RseS5cbiAgaWYgKGlzRXhhY3RWZXJzaW9uKHNwZWNpZmllcikpIHJldHVybiBzcGVjaWZpZXIgPT09IHZlcnNpb247XG4gIHJldHVybiAhIXNlbXZlci52YWxpZFJhbmdlKHNwZWNpZmllcikgJiYgc2VtdmVyLnNhdGlzZmllcyh2ZXJzaW9uLCBzcGVjaWZpZXIpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMsIGZpbmRSb290QW5kU2VsZlByb2plY3RzLCB0eXBlIEZvdW5kUHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJpdmF0ZVJlZ2lzdHJ5QXV0aCB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVSZWdpc3RyeS5qcyc7XG5pbXBvcnQge1xuICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UsXG4gIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIHNwZWNpZmllclN1YnNldCxcbiAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbnRlcmZhY2UgUHJpdmF0ZVBhY2thZ2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6ICdnaXQnIHwgJ3JlZ2lzdHJ5JztcbiAgLyoqXG4gICAqIFVuZGVmaW5lZCBmb3IgcmVnaXN0cnkgcGFja2FnZXMgdGhhdCBtdXN0IGJlIGRvd25sb2FkZWQ7IHNldCBmb3IgZ2l0IHBhY2thZ2VzIGFuZCBmb3JcbiAgICogcmVnaXN0cnkgcGFja2FnZXMgd2hvc2UgaW5zdGFsbGVkIGNvcHkgaW4gbm9kZV9tb2R1bGVzIGFscmVhZHkgc2F0aXNmaWVzIHRoZSBzcGVjaWZpZXJcbiAgICogKHNvIENJIHN0ZXBzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMgY2FuIHN0aWxsIG1hdGVyaWFsaXplIHRoZW0pLlxuICAgKi9cbiAgc291cmNlRGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0YXJnZXREaXJQYXRoOiBzdHJpbmc7XG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBvbmNlIGFuIGluc3RhbGxlZCBjb3B5IGlzIHNlbGVjdGVkIG9yIGEgZG93bmxvYWQgaXMgZXh0cmFjdGVkLiAqL1xuICByZXNvbHZlZFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgZGVwZW5kZW5jeUtleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAnb3V0LWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RpcmVjdG9yeSB0byBjb3B5IHByaXZhdGUgcGFja2FnZXMgaW50bycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJ0B3aWxsYm9vc3RlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kOiBDb21tYW5kTW9kdWxlPHsgZHJ5UnVuPzogYm9vbGVhbiB9LCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzZXR1cC1wcml2YXRlLXBhY2thZ2VzJyxcbiAgZGVzY3JpYmU6XG4gICAgJ01hdGVyaWFsaXplIHByaXZhdGUgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOiBjb3B5IGdpdCBkZXBlbmRlbmNpZXMsIHJldXNlIGluc3RhbGxlZCBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIHJlZ2lzdHJ5IHBhY2thZ2VzIHdob3NlIGV4YWN0LXZlcnNpb24gb3Igc2VtdmVyLXJhbmdlIHNwZWNpZmllciB0aGUgaW5zdGFsbGVkIGNvcHkgc2F0aXNmaWVzLCBhbmQgZG93bmxvYWQgdGhlIHJlc3QgKGF1dGggdmlhIC5ucG1yYyAvIH4vLm5wbXJjIGxvY2FsbHksIG9yIFZFUkRBQ0NJT19UT0tFTiBvbiBDSTsgZGlzdC10YWcgc3BlY2lmaWVycyBzdWNoIGFzIGBsYXRlc3RgIGFsd2F5cyBkb3dubG9hZCkuICcgK1xuICAgICdUaGUgRG9ja2VyZmlsZSBtdXN0IENPUFkgdGhlIGdlbmVyYXRlZCBkaXJlY3RvcmllcyAoZS5nLiBgQ09QWSBAd2lsbGJvb3N0ZXIvIEB3aWxsYm9vc3Rlci9gIGFuZCBgQ09QWSBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8gQHdpbGxib29zdGVyLXByaXZhdGUvYCkgc28gdGhlIGluLWltYWdlIGluc3RhbGwgcmVzb2x2ZXMgdGhlIHJld3JpdHRlbiBmaWxlOiBwYXRocy4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCByb290QW5kU2VsZiA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXJvb3RBbmRTZWxmKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFJlc29sdmUgdGhlIGRlc2NlbmRhbnQgc2V0IGZyb20gdGhlIHJlcG9zaXRvcnkgUk9PVCAobm90IHRoZSBjdXJyZW50IGRpcmVjdG9yeSkgc28gdGhlXG4gICAgLy8gY29tbWFuZCBzY2FucyB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0IHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaXQgcnVuczpcbiAgICAvLyBmaW5kRGVzY2VuZGFudFByb2plY3RzIHJldHVybnMgb25seSB0aGUgY3VycmVudCBwcm9qZWN0IHdoZW4gaW52b2tlZCBmcm9tIGEgd29ya3NwYWNlLlxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcm9vdEFuZFNlbGYucm9vdC5kaXJQYXRoKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gU2NhbiB0aGUgcm9vdCBtYW5pZmVzdCBhbmQgZXZlcnkgd29ya3NwYWNlIG1hbmlmZXN0OiBhIHByaXZhdGUgZGVwZW5kZW5jeSBtYXkgYmUgZGVjbGFyZWQgaW5cbiAgICAvLyBhIHN1Yi1wYWNrYWdlIChlLmcuIHBhY2thZ2VzL3NlcnZlcikgcmF0aGVyIHRoYW4gdGhlIHJvb3QsIHlldCBpdCBzdGlsbCBtYXRlcmlhbGl6ZXMgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290IHNvIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkYCByZXNvbHZlcyBpdCB1bmlmb3JtbHkuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0cyksIHtcbiAgICAgICAgb3V0RGlyOiBhcmd2Lm91dERpcixcbiAgICAgICAgZHJ5UnVuOiBCb29sZWFuKGFyZ3YuZHJ5UnVuKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgTWF0ZXJpYWxpemVQcml2YXRlUGFja2FnZXNPcHRpb25zIHtcbiAgLyoqIERpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCkgdGhhdCBnaXQgZGVwZW5kZW5jaWVzIGFyZSBjb3BpZWQgaW50by4gKi9cbiAgb3V0RGlyPzogc3RyaW5nO1xuICBkcnlSdW4/OiBib29sZWFuO1xufVxuXG4vKiogVGhlIHJvb3QgbWFuaWZlc3QgZm9sbG93ZWQgYnkgZWFjaCBkaXN0aW5jdCB3b3Jrc3BhY2UgbWFuaWZlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdE1hbmlmZXN0cyhwcm9qZWN0czogRm91bmRQcm9qZWN0cyk6IFBhY2thZ2VKc29uW10ge1xuICBjb25zdCBtYW5pZmVzdHNCeURpclBhdGggPSBuZXcgTWFwPHN0cmluZywgUGFja2FnZUpzb24+KCk7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBbcHJvamVjdHMucm9vdCwgLi4ucHJvamVjdHMuZGVzY2VuZGFudHNdKSB7XG4gICAgaWYgKCFtYW5pZmVzdHNCeURpclBhdGguaGFzKHByb2plY3QuZGlyUGF0aCkpIG1hbmlmZXN0c0J5RGlyUGF0aC5zZXQocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnBhY2thZ2VKc29uKTtcbiAgfVxuICByZXR1cm4gWy4uLm1hbmlmZXN0c0J5RGlyUGF0aC52YWx1ZXMoKV07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdFByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0UGFja2FnZUpzb25zOiBQYWNrYWdlSnNvbltdLFxuICBvcHRpb25zOiBNYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgb3V0RGlyID0gJ0B3aWxsYm9vc3RlcicsIGRyeVJ1biA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gIC8vIE91dHB1dCBwYXRocyBhcmUgcmVjdXJzaXZlbHkgREVMRVRFRCBiZWZvcmUgYmVpbmcgcmVjcmVhdGVkLCBzbyBub25lIG9mIHRoZW0gbWF5IGNvbnRhaW4gYVxuICAvLyBzeW1saW5rIGNvbXBvbmVudDogYSBzeW1saW5rIChlLmcuIGBlc2NhcGUgLT4gbm9kZV9tb2R1bGVzYCwgb3IgYEB3aWxsYm9vc3Rlci1wcml2YXRlYFxuICAvLyBpdHNlbGYgbGlua2luZyBlbHNld2hlcmUpIHdvdWxkIGVpdGhlciBzbXVnZ2xlIHRoZSBkZWxldGUgcGFzdCB0aGUgbGV4aWNhbCBvdmVybGFwIGd1YXJkc1xuICAvLyBvciBkZXN0cm95IHRoZSBzeW1saW5rJ3MgdGFyZ2V0LiBSZWplY3RpbmcgY2Fub25pY2FsL2xleGljYWwgbWlzbWF0Y2hlcyBrZWVwcyBldmVyeVxuICAvLyBkZXN0cnVjdGl2ZSBvcGVyYXRpb24gb24gdGhlIGludGVuZGVkIGxleGljYWwgbG9jYXRpb24uIFRoZXNlIGd1YXJkcyBUSFJPVyAobm90IHByb2Nlc3MuZXhpdClcbiAgLy8gc28gdGhlIGF1dG9tYXRpYyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVgIGNhbGxlciBjYW4gY2F0Y2ggdGhlbSBhbmQgY29udGludWVcbiAgLy8gbm9uLWZhdGFsbHk7IHRoZSBleHBsaWNpdCBjb21tYW5kJ3MgaGFuZGxlciBjYXRjaGVzIGFuZCBleGl0cy5cbiAgY29uc3Qgcm9vdERpclBhdGggPSBjYW5vbmljYWxpemVQYXRoKHJvb3RQcm9qZWN0RGlyUGF0aCk7XG4gIGNvbnN0IHJlc29sdmVPdXRwdXREaXJQYXRoID0gKHJlbGF0aXZlT3JBYnNvbHV0ZVBhdGg6IHN0cmluZywgbGFiZWw6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgbGV4aWNhbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIHJlbGF0aXZlT3JBYnNvbHV0ZVBhdGgpO1xuICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSBjYW5vbmljYWxpemVQYXRoKGxleGljYWxQYXRoKTtcbiAgICBpZiAoY2Fub25pY2FsUGF0aCAhPT0gbGV4aWNhbFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtsYWJlbH0gbXVzdCBub3QgY29udGFpbiBzeW1saW5rcyAoJHtsZXhpY2FsUGF0aH0gcmVzb2x2ZXMgdG8gJHtjYW5vbmljYWxQYXRofSkuYCk7XG4gICAgfVxuICAgIHJldHVybiBsZXhpY2FsUGF0aDtcbiAgfTtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKG91dERpciwgJy0tb3V0LWRpcicpO1xuICBhc3NlcnRTdWJkaXJlY3Rvcnkocm9vdERpclBhdGgsIG91dERpclBhdGgpO1xuICAvLyBSZWdpc3RyeSBwYWNrYWdlcyBhbHdheXMgbWF0ZXJpYWxpemUgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdDogYHdiIG9wdGltaXplRm9yRG9ja2VyQnVpbGRgXG4gIC8vIHJlc29sdmVzIHRoZW0gZnJvbSBgPHJvb3Q+L0B3aWxsYm9vc3Rlci1wcml2YXRlYCByZWdhcmRsZXNzIG9mIGAtLW91dC1kaXJgLlxuICBjb25zdCByZWdpc3RyeU91dERpclBhdGggPSByZXNvbHZlT3V0cHV0RGlyUGF0aChcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIGBUaGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSBvdXRwdXQgZGlyZWN0b3J5YFxuICApO1xuICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCkpIHtcbiAgICAvLyBlLmcuIGAtLW91dC1kaXIgQHdpbGxib29zdGVyLXByaXZhdGVgIG9yIGAtLW91dC1kaXIgQHdpbGxib29zdGVyLXByaXZhdGUvc3ViYDogdGhlXG4gICAgLy8gcmVnaXN0cnkgc3RlcCByZWN1cnNpdmVseSBkZWxldGVzIHJlZ2lzdHJ5T3V0RGlyUGF0aCwgd2hpY2ggd291bGQgZGVzdHJveSB0aGUgZ2l0XG4gICAgLy8gcGFja2FnZXMgY29waWVkIGludG8gYW4gZXF1YWwgb3IgTkVTVEVEIGRpcmVjdG9yeSBtb21lbnRzIGVhcmxpZXIuXG4gICAgdGhyb3cgbmV3IEVycm9yKGAtLW91dC1kaXIgbXVzdCBub3Qgb3ZlcmxhcCB0aGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSByZWdpc3RyeSBvdXRwdXQgZGlyZWN0b3J5LmApO1xuICB9XG4gIGNvbnN0IHN0YWdpbmdSb290RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLXN0YWdpbmcnKSwgJ1RoZSBzdGFnaW5nIGRpcmVjdG9yeScpO1xuICBjb25zdCBiYWNrdXBSb290RGlyUGF0aCA9IHJlc29sdmVPdXRwdXREaXJQYXRoKHBhdGguam9pbignLnRtcCcsICd3Yi1wcml2YXRlLWJhY2t1cCcpLCAnVGhlIGJhY2t1cCBkaXJlY3RvcnknKTtcbiAgaWYgKHBhdGhzT3ZlcmxhcChvdXREaXJQYXRoLCBjYW5vbmljYWxpemVQYXRoKHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpKSkpIHtcbiAgICAvLyBUaGUgcmVjdXJzaXZlIGRlbGV0ZSBvZiBvdXREaXJQYXRoIHdvdWxkIGRlc3Ryb3kgdGhlIGluc3RhbGxlZCBzb3VyY2VzIHRoZSBjb3BpZXMgcmVhZC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJy0tb3V0LWRpciBtdXN0IG5vdCBvdmVybGFwIG5vZGVfbW9kdWxlcy4nKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtsYWJlbCwgdGVtcG9yYXJ5RGlyUGF0aF0gb2YgW1xuICAgIFsnc3RhZ2luZycsIHN0YWdpbmdSb290RGlyUGF0aF0sXG4gICAgWydiYWNrdXAnLCBiYWNrdXBSb290RGlyUGF0aF0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHRlbXBvcmFyeURpclBhdGgpIHx8IHBhdGhzT3ZlcmxhcChyZWdpc3RyeU91dERpclBhdGgsIHRlbXBvcmFyeURpclBhdGgpKSB7XG4gICAgICAvLyBCb3RoIGRpcmVjdG9yaWVzIGFyZSByZWN1cnNpdmVseSByZWNyZWF0ZWQsIHNpbGVudGx5IGRpc2NhcmRpbmcgYW55dGhpbmcgbWF0ZXJpYWxpemVkIGludG9cbiAgICAgIC8vIGFuIGVxdWFsIG9yIG5lc3RlZCBvdXRwdXQgZGlyZWN0b3J5IG1vbWVudHMgZWFybGllci5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0cHV0IGRpcmVjdG9yaWVzIG11c3Qgbm90IG92ZXJsYXAgdGhlICR7bGFiZWx9IGRpcmVjdG9yeSAoJHt0ZW1wb3JhcnlEaXJQYXRofSkuYCk7XG4gICAgfVxuICB9XG4gIC8vIFN0YWdpbmcgTUlSUk9SUyBlYWNoIG91dHB1dCB0cmVlJ3MgcmVwb3NpdG9yeS1yb290LXJlbGF0aXZlIGxvY2F0aW9uIChlLmcuXG4gIC8vIGA8cm9vdD4vQHdpbGxib29zdGVyLXByaXZhdGUvYWAgc3RhZ2VzIGF0IGA8c3RhZ2luZz4vQHdpbGxib29zdGVyLXByaXZhdGUvYWApLCBzbyB0aGUgcmVsYXRpdmVcbiAgLy8gZGlzdGFuY2UgYmV0d2VlbiBhbnkgdHdvIHN0YWdlZCB0cmVlcyBlcXVhbHMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlaXIgZmluYWwgbG9jYXRpb25zLiBUaGF0XG4gIC8vIG1ha2VzIGNyb3NzLXRyZWUgYGZpbGU6YCByZXdyaXRlcyAoZS5nLiBgLi4vLi4vQHdpbGxib29zdGVyLzxuYW1lPmApIGNvbXB1dGVkIGFnYWluc3Qgc3RhZ2luZ1xuICAvLyBjb3JyZWN0IGFmdGVyIHRoZSBzd2FwLCB3aGljaCBsZXRzIGV2ZXJ5IGZhaWx1cmUtcHJvbmUgc3RlcCDigJQgZG93bmxvYWQsIGV4dHJhY3Rpb24sIG5lc3RlZFxuICAvLyBkaXNjb3ZlcnksIHJld3JpdGluZyDigJQgZmluaXNoIGJlZm9yZSBlaXRoZXIgbGl2ZSB0cmVlIGlzIHRvdWNoZWQuXG4gIGNvbnN0IHRvU3RhZ2VkUGF0aCA9IChmaW5hbFBhdGg6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIHBhdGguam9pbihzdGFnaW5nUm9vdERpclBhdGgsIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGZpbmFsUGF0aCkpO1xuICBpZiAocGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCkgIT09ICdAd2lsbGJvb3N0ZXInKSB7XG4gICAgLy8gUHJlLWV4aXN0aW5nIGxpbWl0YXRpb24gb2YgdGhlIG9wdGlvbjogdGhlIERvY2tlciBtYW5pZmVzdCByZXdyaXRlIGhhcyBubyBhY2Nlc3MgdG8gaXQuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAnTm90ZTogd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCByZXdyaXRlcyBnaXQgZGVwZW5kZW5jaWVzIHRvIDxyb290Pi9Ad2lsbGJvb3N0ZXI7IGEgY3VzdG9tIC0tb3V0LWRpciByZXF1aXJlcyBhIG1hdGNoaW5nIERvY2tlcmZpbGUgbGF5b3V0LidcbiAgICAgIClcbiAgICApO1xuICB9XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IGF3YWl0IGNvbGxlY3RQcml2YXRlUGFja2FnZXMoXG4gICAgcm9vdERpclBhdGgsXG4gICAgbWFuaWZlc3RQYWNrYWdlSnNvbnMsXG4gICAgb3V0RGlyUGF0aCxcbiAgICByZWdpc3RyeU91dERpclBhdGhcbiAgKTtcblxuICBpZiAoZHJ5UnVuKSB7XG4gICAgcHJpbnREcnlSdW5SZXN1bHQob3V0RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZWdpc3RyeSBwYWNrYWdlcyB3aG9zZSBpbnN0YWxsZWQgY29weSBzYXRpc2ZpZXMgdGhlIHNwZWNpZmllciBhcmUgY29waWVkIGZyb21cbiAgLy8gbm9kZV9tb2R1bGVzOyBvbmx5IHRoZSByZXN0IGFyZSBkb3dubG9hZGVkLCBzbyByZWdpc3RyeSBjcmVkZW50aWFscyBhcmUgbmVlZGVkIG9ubHkgd2hlbiBhXG4gIC8vIGRvd25sb2FkIGFjdHVhbGx5IGhhcHBlbnMgKENJIHRlc3Qgc3RlcHMgZGVsaWJlcmF0ZWx5IHJlY2VpdmUgbm8gVmVyZGFjY2lvIHRva2VuKS5cbiAgY29uc3QgZG93bmxvYWRlZFBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIXAuc291cmNlRGlyUGF0aCk7XG4gIC8vIFJlc29sdmUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBCRUZPUkUgZGVsZXRpbmcgdGhlIGV4aXN0aW5nIG1hdGVyaWFsaXphdGlvbnMsIHNvIGEgbWlzc2luZ1xuICAvLyByZWdpc3RyeSBjb25maWd1cmF0aW9uIGNhbm5vdCBkZXN0cm95IGEgcHJldmlvdXNseSB1c2FibGUgb3V0cHV0IHRyZWUuIFRocm93IChyYXRoZXIgdGhhblxuICAvLyBleGl0KSBzbyBjYWxsZXJzIGNhbiBkZWNpZGU6IGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCByZXBvcnRzIGl0IGFuZCBleGl0cywgd2hpbGUgdGhlXG4gIC8vIGF1dG9tYXRpYyBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVgIHN0ZXAgY2F0Y2hlcyBpdCBhbmQgY29udGludWVzLCBsZWF2aW5nIHRoZVxuICAvLyBleGlzdGluZyBvdXRwdXQgdW50b3VjaGVkIChub3RoaW5nIGhhcyBiZWVuIGRlbGV0ZWQgeWV0IGF0IHRoaXMgcG9pbnQpLlxuICBjb25zdCBhdXRoID0gZG93bmxvYWRlZFBhY2thZ2VzLmxlbmd0aCA+IDAgPyByZXNvbHZlUHJpdmF0ZVJlZ2lzdHJ5QXV0aChyb290RGlyUGF0aCkgOiB1bmRlZmluZWQ7XG4gIGlmIChkb3dubG9hZGVkUGFja2FnZXMubGVuZ3RoID4gMCAmJiAhYXV0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZG93bmxvYWQgJHtkb3dubG9hZGVkUGFja2FnZXMubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oJywgJyl9OiBubyByZWdpc3RyeSBjb25maWd1cmVkIGZvciB0aGUgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfSBzY29wZTsgYCArXG4gICAgICAgIGBhZGQgXCIke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9OnJlZ2lzdHJ5PS4uLlwiIHRvIH4vLm5wbXJjLiBPbmx5IGluc3RhbGxlZCBjb3BpZXMgc2F0aXNmeWluZyBhbiBleGFjdCB2ZXJzaW9uIG9yIGAgK1xuICAgICAgICAnc2VtdmVyIHJhbmdlIGFyZSByZXVzZWQgd2l0aG91dCByZWdpc3RyeSBhY2Nlc3M7IGRpc3QtdGFnIHNwZWNpZmllcnMgKGUuZy4gYGxhdGVzdGApIGFsd2F5cyByZXF1aXJlIGl0LidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29waWVkUGFja2FnZXMgPSBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXS5maWx0ZXIoKHApID0+IHAua2luZCA9PT0gJ2dpdCcpO1xuICBjb25zdCByZWdpc3RyeVBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScpO1xuXG4gIC8vIE1hdGVyaWFsaXplIEJPVEggdHJlZXMgaW50byBzdGFnaW5nIGFuZCBzd2FwIHRoZW0gaW4gb25seSBhZnRlciBldmVyeSBmYWlsdXJlLXByb25lIHN0ZXBcbiAgLy8gc3VjY2VlZGVkOiBhIHJlZ2lzdHJ5IGZldGNoL2V4dHJhY3Rpb24vbmVzdGVkLWRpc2NvdmVyeS9yZXdyaXRlIGZhaWx1cmUgbXVzdCBsZWF2ZSBib3RoIGxpdmVcbiAgLy8gdHJlZXMgZXhhY3RseSBhcyB0aGV5IHdlcmUuIE90aGVyd2lzZSB0aGUgYXV0b21hdGljIGB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZWBcbiAgLy8gY2FsbGVyIOKAlCB3aGljaCBjYXRjaGVzIHRoZSBmYWlsdXJlIGFuZCBjb250aW51ZXMg4oCUIHdvdWxkIHJld3JpdGUgZGVwZW5kZW5jaWVzIGFnYWluc3RcbiAgLy8gaW5jb25zaXN0ZW50IHRyZWVzIChlLmcuIGEgcmVnaXN0cnkgbWFuaWZlc3QgcG9pbnRpbmcgYXQgYSBkZWxldGVkIGBAd2lsbGJvb3N0ZXIvPG5hbWU+YCkuXG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdSb290RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB0cnkge1xuICAgIC8vIEJvdGggb3V0cHV0IGRpcmVjdG9yaWVzIGFsd2F5cyBleGlzdCBhZnRlcndhcmRzOiBEb2NrZXJmaWxlcyBDT1BZIHRoZW0gdW5jb25kaXRpb25hbGx5LCBhbmRcbiAgICAvLyBhIG1pc3Npbmcgc291cmNlIHBhdGggZmFpbHMgdGhlIGJ1aWxkLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRvU3RhZ2VkUGF0aChvdXREaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIodG9TdGFnZWRQYXRoKHJlZ2lzdHJ5T3V0RGlyUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGNvcHlJbnN0YWxsZWRQYWNrYWdlKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZSwgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiByZWdpc3RyeVBhY2thZ2VzKSB7XG4gICAgICBpZiAocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCkge1xuICAgICAgICBhd2FpdCBjb3B5SW5zdGFsbGVkUGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UsIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAvLyBkb3dubG9hZGVkUGFja2FnZXMgaXMgbm9uLWVtcHR5IG9uIHRoaXMgcGF0aCwgc28gdGhlIGF1dGggY2hlY2sgYWJvdmUgcGFzc2VkLlxuICAgICAgICBhdXRoISxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgdG9TdGFnZWRQYXRoKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpXG4gICAgICApO1xuICAgICAgcHJpdmF0ZVBhY2thZ2UucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oXG4gICAgICAgIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKSxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2UubmFtZVxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCl9YCk7XG4gICAgICAvLyBBIGRvd25sb2FkZWQgcGFja2FnZSBtYXkgaXRzZWxmIGRlcGVuZCBvbiBwcml2YXRlIHBhY2thZ2VzIHRoYXQgd2VyZSBub3QgdmlzaWJsZSBiZWZvcmVcbiAgICAgIC8vIGV4dHJhY3Rpb247IG1hdGVyaWFsaXplIHRoZW0gdG9vLiBJbnN0YWxsZWQgY29waWVzIHdlcmUgYWxyZWFkeSBkZWVwLXNjYW5uZWQgYnlcbiAgICAgIC8vIGNvbGxlY3RQcml2YXRlUGFja2FnZXMuXG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCEsXG4gICAgICAgIHByaXZhdGVQYWNrYWdlLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKHN0YWdpbmdSb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpO1xuICAgIGF3YWl0IHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhbb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoXSwgdG9TdGFnZWRQYXRoLCBiYWNrdXBSb290RGlyUGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3RhZ2luZ1Jvb3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKFxuICAgIGBFbnN1cmUgdGhlIERvY2tlcmZpbGUgQ09QWXMgJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoKX0vIGFuZCAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9LyBpbnRvIHRoZSBpbWFnZSBiZWZvcmUgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMuYFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBtYW5pZmVzdFBhY2thZ2VKc29uczogUGFja2FnZUpzb25bXSxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4+IHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICAvLyBTZWVkIGZyb20gZXZlcnkgbWFuaWZlc3QgKHJvb3QgKyB3b3Jrc3BhY2VzKTsgb25lIHByaXZhdGUgcGFja2FnZSBtYXkgYmUgcmVxdWVzdGVkIGJ5IHNldmVyYWxcbiAgLy8gbWFuaWZlc3RzLCBzbyBtZXJnZSBkdXBsaWNhdGVzIHRoZSBzYW1lIHdheSBuZXN0ZWQgZGlzY292ZXJ5IGRvZXMg4oCUIGtlZXAgdGhlIG5hcnJvd2VyXG4gIC8vIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQgYW5kIGZhaWwgbG91ZGx5IG9uIGEgZ2VudWluZSBjb25mbGljdC5cbiAgY29uc3QgcGFja2FnZXNUb1Byb2Nlc3M6IFByaXZhdGVQYWNrYWdlW10gPSBbXTtcbiAgY29uc3QgcXVldWVkUGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+KCk7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb24gb2YgbWFuaWZlc3RQYWNrYWdlSnNvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhwYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KHJlcXVlc3RlZC5uYW1lKTtcbiAgICAgIGlmICghcXVldWVkKSB7XG4gICAgICAgIHF1ZXVlZFBhY2thZ2VzLnNldChyZXF1ZXN0ZWQubmFtZSwgcmVxdWVzdGVkKTtcbiAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChyZXF1ZXN0ZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCByZXF1ZXN0ZWQpO1xuICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCByZXF1ZXN0ZWQsIHBhY2thZ2VKc29uLm5hbWUgPz8gJ2Egd29ya3NwYWNlIG1hbmlmZXN0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZWQudmVyc2lvblNwZWNpZmllciA9IG5hcnJvd2VyLnZlcnNpb25TcGVjaWZpZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhY2thZ2VzVG9Qcm9jZXNzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHByaXZhdGVQYWNrYWdlID0gcGFja2FnZXNUb1Byb2Nlc3NbaW5kZXhdO1xuICAgIGlmICghcHJpdmF0ZVBhY2thZ2UpIGNvbnRpbnVlO1xuICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKHByaXZhdGVQYWNrYWdlLm5hbWUpKSBjb250aW51ZTtcblxuICAgIGlmIChwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0Jykge1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGZpbmRJbnN0YWxsZWRQYWNrYWdlRGlyKHJvb3REaXJQYXRoLCBwcml2YXRlUGFja2FnZS5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5zdGFsbGVkID0gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgICAgcHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICB9XG4gICAgLy8gU2VsZWN0ZWQgQkVGT1JFIHRoZSBkZWVwIHNjYW46IGEgbWFuaWZlc3QgaW5zaWRlIHRoZSBwYWNrYWdlIG1heSByZWZlciBiYWNrIHRvIHRoZSBwYWNrYWdlXG4gICAgLy8gaXRzZWxmLCBhbmQgdGhhdCByZXF1aXJlbWVudCBtdXN0IGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gKGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0XG4gICAgLy8gYmVsb3cpLCBuZXZlciBuYXJyb3cgdGhlIGFscmVhZHktc2VsZWN0ZWQgc3BlY2lmaWVyLlxuICAgIHByaXZhdGVQYWNrYWdlcy5zZXQocHJpdmF0ZVBhY2thZ2UubmFtZSwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgIC8vIE5lc3RlZCBwcml2YXRlIGRlcGVuZGVuY2llcyBvZiBhbiBpbnN0YWxsZWQgcGFja2FnZSBhcmUgZGlzY292ZXJhYmxlIHJpZ2h0IGF3YXk7IHJlZ2lzdHJ5XG4gICAgLy8gcGFja2FnZXMgd2l0aG91dCBhIHVzYWJsZSBpbnN0YWxsZWQgY29weSBhcmUgaW5zcGVjdGVkIGFmdGVyIGRvd25sb2FkIGluc3RlYWRcbiAgICAvLyAoY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcykuXG4gICAgaWYgKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIGZpbmRQcml2YXRlRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVkID0gcXVldWVkUGFja2FnZXMuZ2V0KG5lc3RlZC5uYW1lKTtcbiAgICAgICAgICBpZiAoIXF1ZXVlZCkge1xuICAgICAgICAgICAgcXVldWVkUGFja2FnZXMuc2V0KG5lc3RlZC5uYW1lLCBuZXN0ZWQpO1xuICAgICAgICAgICAgcGFja2FnZXNUb1Byb2Nlc3MucHVzaChuZXN0ZWQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcml2YXRlUGFja2FnZXMuaGFzKG5lc3RlZC5uYW1lKSkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBtYXRlcmlhbGl6ZWQgKG9yIHNlbGVjdGVkKTogdGhlIHJlcXVpcmVtZW50IG11c3QgYWRtaXQgdGhhdCBzZWxlY3Rpb24uXG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChxdWV1ZWQsIG5lc3RlZCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0aWxsIHF1ZXVlZDoga2VlcCB0aGUgTkFSUk9XRVIgY29tcGF0aWJsZSByZXF1aXJlbWVudCBzbyBkaXNjb3Zlcnkgb3JkZXIgY2Fubm90XG4gICAgICAgICAgICAvLyB0dXJuIGNvbXBhdGlibGUgY29uc3RyYWludHMgKGUuZy4gYF4xLjAuMGAgYW5kIGAxLjIuM2ApIGludG8gYSBzcHVyaW91cyBjb25mbGljdC5cbiAgICAgICAgICAgIGNvbnN0IG5hcnJvd2VyID0gbmFycm93ZXJDb21wYXRpYmxlUmVxdWlyZW1lbnQocXVldWVkLCBuZXN0ZWQpO1xuICAgICAgICAgICAgaWYgKG5hcnJvd2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCBuZXN0ZWQsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcXVldWVkLnZlcnNpb25TcGVjaWZpZXIgPSBuYXJyb3dlci52ZXJzaW9uU3BlY2lmaWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcml2YXRlUGFja2FnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3ROZXN0ZWRQcml2YXRlUGFja2FnZXMoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIGV4dHJhY3RlZFBhY2thZ2U6IFByaXZhdGVQYWNrYWdlLFxuICBwcml2YXRlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZyxcbiAgdG9TdGFnZWRQYXRoOiAodGFyZ2V0RGlyUGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBFdmVyeSBtYXRlcmlhbGl6ZWQgcGFja2FnZSDigJQgaW5jbHVkaW5nIGEgbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBnaXQgZGVwZW5kZW5jeSDigJQgbGl2ZXMgaW5cbiAgLy8gc3RhZ2luZyB1bnRpbCB0aGUgYXRvbWljIHN3YXAsIHNvIGl0cyBtYW5pZmVzdHMgbXVzdCBiZSByZWFkIHRoZXJlLlxuICBjb25zdCBleHRyYWN0ZWREaXJQYXRoID0gdG9TdGFnZWRQYXRoKGV4dHJhY3RlZFBhY2thZ2UudGFyZ2V0RGlyUGF0aCk7XG4gIC8vIFNjYW4gRVZFUlkgbWFuaWZlc3Qgb2YgdGhlIG1hdGVyaWFsaXplZCBwYWNrYWdlIChvcmcgZ2l0IGRlcGVuZGVuY2llcyBhcmUgd2hvbGUgbW9ub3JlcG9cbiAgLy8gY2hlY2tvdXRzIHdpdGggcGFja2FnZXMvKi9wYWNrYWdlLmpzb24pLCBtaXJyb3JpbmcgY29sbGVjdFByaXZhdGVQYWNrYWdlcycgZGVlcCBzY2FuIOKAlCB0aGVcbiAgLy8gZGVwZW5kZW5jeS1yZXdyaXRlIHN0ZXAgd2Fsa3MgdGhlIHNhbWUgc2V0LCBzbyBhbnl0aGluZyBkZWNsYXJlZCB0aGVyZSBtdXN0IGJlIG1hdGVyaWFsaXplZC5cbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoZXh0cmFjdGVkRGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgICAgIGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nLmtpbmQgPT09ICdyZWdpc3RyeScgJiYgIWV4aXN0aW5nLnNvdXJjZURpclBhdGggJiYgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTdGlsbCBhd2FpdGluZyBpdHMgZG93bmxvYWQgKG5vIGluc3RhbGxlZCBjb3B5IHNlbGVjdGVkLCBub3RoaW5nIGV4dHJhY3RlZCB5ZXQpOiBrZWVwXG4gICAgICAgICAgLy8gdGhlIE5BUlJPV0VSIGNvbXBhdGlibGUgcmVxdWlyZW1lbnQsIGV4YWN0bHkgYXMgY29sbGVjdFByaXZhdGVQYWNrYWdlcyBkb2VzIGZvclxuICAgICAgICAgIC8vIHF1ZXVlZCBwYWNrYWdlcywgc28gbGF0ZS1kaXNjb3ZlcmVkIG5lc3RlZCBjb25zdHJhaW50cyBjYW5ub3QgZmFicmljYXRlIGNvbmZsaWN0cy5cbiAgICAgICAgICBjb25zdCBuYXJyb3dlciA9IG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KGV4aXN0aW5nLCBuZXN0ZWQpO1xuICAgICAgICAgIGlmIChuYXJyb3dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID0gbmFycm93ZXIudmVyc2lvblNwZWNpZmllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ29sbGFwc2luZyBkaWZmZXJlbnQgcmVxdWVzdGVkIHZlcnNpb25zIGludG8gb25lIG1hdGVyaWFsaXphdGlvbiB3b3VsZCBzaWxlbnRseVxuICAgICAgICAgIC8vIHZpb2xhdGUgdGhlIGRlcGVuZGVudCdzIHJlcXVpcmVtZW50LCBzbyBjb25mbGljdHMgbXVzdCBmYWlsIGxvdWRseS5cbiAgICAgICAgICBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZywgbmVzdGVkLCBleHRyYWN0ZWRQYWNrYWdlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICAgIG5lc3RlZC5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnN0YWxsZWQgPSBmaW5kSW5zdGFsbGVkUmVnaXN0cnlQYWNrYWdlKHJvb3REaXJQYXRoLCBuZXN0ZWQpO1xuICAgICAgICBuZXN0ZWQuc291cmNlRGlyUGF0aCA9IGluc3RhbGxlZD8uZGlyUGF0aDtcbiAgICAgICAgbmVzdGVkLnJlc29sdmVkVmVyc2lvbiA9IGluc3RhbGxlZD8udmVyc2lvbjtcbiAgICAgICAgaWYgKG5lc3RlZC5zb3VyY2VEaXJQYXRoKSB7XG4gICAgICAgICAgYXdhaXQgY29weUluc3RhbGxlZFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCwgdG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIG5lc3RlZC5uYW1lLFxuICAgICAgICAgICAgbmVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gJ2xhdGVzdCcsXG4gICAgICAgICAgICB0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXN0ZWQucmVzb2x2ZWRWZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24odG9TdGFnZWRQYXRoKG5lc3RlZC50YXJnZXREaXJQYXRoKSwgbmVzdGVkLm5hbWUpO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke25lc3RlZC5uYW1lfSAobmVzdGVkIGRlcGVuZGVuY3kpIHRvICR7bmVzdGVkLnRhcmdldERpclBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByaXZhdGVQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICByb290RGlyUGF0aCxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgbmVzdGVkLFxuICAgICAgICBwcml2YXRlUGFja2FnZXMsXG4gICAgICAgIG91dERpclBhdGgsXG4gICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgdG9TdGFnZWRQYXRoXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogYGRlc3RpbmF0aW9uRGlyUGF0aGAgbWF5IGRpZmZlciBmcm9tIGB0YXJnZXREaXJQYXRoYCB3aGlsZSByZWdpc3RyeSBwYWNrYWdlcyBzdGFnZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlJbnN0YWxsZWRQYWNrYWdlKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwcml2YXRlUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UsXG4gIGRlc3RpbmF0aW9uRGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSByZWdpc3RyeSBwYWNrYWdlJ3MgdGFyYmFsbCBtYXkgbGVnaXRpbWF0ZWx5IGNvbnRhaW4gbm9kZV9tb2R1bGVzLyBjb250ZW50IHZpYVxuICAvLyBidW5kbGVkRGVwZW5kZW5jaWVzOyB0aG9zZSBmaWxlcyBhcmUgcGFydCBvZiB0aGUgYXJ0aWZhY3QgYW5kIG11c3Qgc3Vydml2ZSB0aGUgY29weS4gR2l0XG4gIC8vIGNoZWNrb3V0cyAoYW5kIG5vbi1idW5kbGVkIG5hbWVzKSBzdGlsbCBleGNsdWRlIG5vZGVfbW9kdWxlcywgd2hpY2ggaG9sZHMgbG9jYWxseSBpbnN0YWxsZWRcbiAgLy8gZGVwZW5kZW5jaWVzIHRoZXJlLlxuICBjb25zdCBidW5kbGVkRGVwZW5kZW5jeU5hbWVzID1cbiAgICBwcml2YXRlUGFja2FnZS5raW5kID09PSAncmVnaXN0cnknID8gcmVhZEJ1bmRsZWREZXBlbmRlbmN5TmFtZXMocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCEpIDogW107XG4gIGF3YWl0IGZzLnByb21pc2VzLmNwKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBkZXN0aW5hdGlvbkRpclBhdGgsIHtcbiAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgZm9yY2U6IHRydWUsXG4gICAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIGV4cG9zZXMgaW5zdGFsbGVkIHBhY2thZ2VzIHRocm91Z2ggc3ltbGlua3M7IHRoZSBtYXRlcmlhbGl6ZWQgdHJlZVxuICAgIC8vIG11c3QgY29udGFpbiByZWFsIGZpbGVzIChhIGNvcGllZCBhYnNvbHV0ZSBzeW1saW5rIHdvdWxkIGRhbmdsZSBpbnNpZGUgdGhlIERvY2tlciBpbWFnZSxcbiAgICAvLyBhbmQgbGF0ZXIgZGVwZW5kZW5jeSByZXdyaXRpbmcgd291bGQgd3JpdGUgdGhyb3VnaCBpdCBpbnRvIHRoZSBzaGFyZWQgc3RvcmUpLlxuICAgIGRlcmVmZXJlbmNlOiB0cnVlLFxuICAgIGZpbHRlcjogKHNyYykgPT4ge1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnJlbGF0aXZlKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBzcmMpLnNwbGl0KHBhdGguc2VwKTtcbiAgICAgIGlmIChzZWdtZW50cy5pbmNsdWRlcygnLmdpdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBub2RlTW9kdWxlc0luZGV4ID0gc2VnbWVudHMuaW5kZXhPZignbm9kZV9tb2R1bGVzJyk7XG4gICAgICBpZiAobm9kZU1vZHVsZXNJbmRleCA9PT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGJ1bmRsZWREZXBlbmRlbmN5TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBUaGUgbm9kZV9tb2R1bGVzIChhbmQgQHNjb3BlKSBkaXJlY3RvcmllcyB0aGVtc2VsdmVzIG11c3QgY29weSBzbyBidW5kbGVkIHN1YnRyZWVzIGNhbjtcbiAgICAgIC8vIG9ubHkgdGhlIGZpcnN0IG5vZGVfbW9kdWxlcyBsZXZlbCBmaWx0ZXJzIOKAlCBhbnl0aGluZyBpbnNpZGUgYSBidW5kbGVkIHN1YnRyZWUgYmVsb25ncyB0b1xuICAgICAgLy8gdGhlIGFydGlmYWN0LCBpbmNsdWRpbmcgaXRzIG93biBuZXN0ZWQgbm9kZV9tb2R1bGVzLlxuICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gc2VnbWVudHMuc2xpY2Uobm9kZU1vZHVsZXNJbmRleCArIDEpO1xuICAgICAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGZpcnN0LnN0YXJ0c1dpdGgoJ0AnKSAmJiBzZWNvbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYnVuZGxlZERlcGVuZGVuY3lOYW1lcy5zb21lKChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7Zmlyc3R9L2ApKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZmlyc3Quc3RhcnRzV2l0aCgnQCcpID8gYCR7Zmlyc3R9LyR7c2Vjb25kfWAgOiBmaXJzdDtcbiAgICAgIHJldHVybiBidW5kbGVkRGVwZW5kZW5jeU5hbWVzLmluY2x1ZGVzKHBhY2thZ2VOYW1lKTtcbiAgICB9LFxuICB9KTtcbiAgY29uc29sZS5pbmZvKGBDb3BpZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWApO1xufVxuXG4vKiogRGVjbGFyZWQgYnVuZGxlZCBkZXBlbmRlbmN5IG5hbWVzIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZTsgYHRydWVgIGJ1bmRsZXMgZXZlcnkgZGVwZW5kZW5jeS4gKi9cbmZ1bmN0aW9uIHJlYWRCdW5kbGVkRGVwZW5kZW5jeU5hbWVzKHNvdXJjZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHwgdHJ1ZSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgICBidW5kbGVEZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB8IGJvb2xlYW47XG4gICAgICBidW5kbGVkRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfCBib29sZWFuO1xuICAgIH07XG4gICAgY29uc3QgYnVuZGxlZCA9IHBhY2thZ2VKc29uLmJ1bmRsZURlcGVuZGVuY2llcyA/PyBwYWNrYWdlSnNvbi5idW5kbGVkRGVwZW5kZW5jaWVzO1xuICAgIGlmIChidW5kbGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShidW5kbGVkKSA/IGJ1bmRsZWQuZmlsdGVyKChuYW1lKSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIDogW107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBtYXRlcmlhbGl6YXRpb24gZm9yIGBleGlzdGluZ2AgaXMgYWxyZWFkeSBzZWxlY3RlZCAoYSByYW5nZSByZXNvbHZlcyBtYXgtc2F0aXNmeWluZyBhZ2FpbnN0XG4gKiB0aGUgcmVnaXN0cnkg4oCUIHNlZSBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UpLCBzbyBhY2NlcHQgYHJlcXVlc3RlZGAgb25seSB3aGVuIGl0IGlzXG4gKiBndWFyYW50ZWVkIHNhdGlzZmllZDogYGV4aXN0aW5nYCBtdXN0IGJlIGEgc3Vic2V0IG9mIGl0IChldmVyeSBwb3NzaWJsZSByZXNvbHV0aW9uIG9mIGBleGlzdGluZ2BcbiAqIHRoZW4gc2F0aXNmaWVzIGByZXF1ZXN0ZWRgKS4gTm9uLXJhbmdlIHNwZWNpZmllcnMgKGRpc3QtdGFncywgZ2l0IFVSTHMvcmV2aXNpb25zKSBtdXN0IG1hdGNoXG4gKiBleGFjdGx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnROb1ZlcnNpb25Db25mbGljdChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UsIGRlcGVuZGVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpc3Rpbmcua2luZCA9PT0gcmVxdWVzdGVkLmtpbmQpIHtcbiAgICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybjtcbiAgICBpZiAoc3BlY2lmaWVyU3Vic2V0KGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIsIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSkgcmV0dXJuO1xuICAgIC8vIE9uY2UgdGhlIGNvbmNyZXRlIG1hdGVyaWFsaXplZCB2ZXJzaW9uIGlzIGtub3duIChpbnN0YWxsZWQgY29weSBvciBleHRyYWN0ZWQgZG93bmxvYWQpLCBhXG4gICAgLy8gcmVxdWlyZW1lbnQgaXQgc2F0aXNmaWVzIGlzIGNvbXBhdGlibGUgZXZlbiB3aGVuIHRoZSBvcmlnaW5hbCBzcGVjaWZpZXJzIGFyZSBub3Qgc3Vic2V0c1xuICAgIC8vIChlLmcuIGBeMS4wLjBgIHJlc29sdmVkIHRvIDEuMi4zIGFsc28gc2F0aXNmaWVzIGEgbGF0ZXIgZXhhY3QgYDEuMi4zYCkuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmcucmVzb2x2ZWRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGluc3RhbGxlZFZlcnNpb25TYXRpc2ZpZXMocmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIsIGV4aXN0aW5nLnJlc29sdmVkVmVyc2lvbilcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfTogYCArXG4gICAgICBgJHtleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID8/IGV4aXN0aW5nLmtpbmR9IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGJ1dCAke2RlcGVuZGVudE5hbWV9IHJlcXVpcmVzIGAgK1xuICAgICAgYCR7cmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gcmVxdWVzdGVkLmtpbmR9LiBPbmx5IGEgc2luZ2xlIHZlcnNpb24gcGVyIHByaXZhdGUgcGFja2FnZSBpcyBzdXBwb3J0ZWQuYFxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHN5bWxpbmtzIGluIHRoZSBkZWVwZXN0IEVYSVNUSU5HIGFuY2VzdG9yIG9mIHRoZSBwYXRoIGFuZCByZWF0dGFjaGVzIHRoZSBub3QteWV0XG4gKiBleGlzdGluZyByZW1haW5kZXIsIHNvIGxleGljYWwgY29udGFpbm1lbnQvb3ZlcmxhcCBjaGVja3Mgb3BlcmF0ZSBvbiBwaHlzaWNhbCBsb2NhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVBhdGgodGFyZ2V0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGV4aXN0aW5nUGF0aCA9IHBhdGgucmVzb2x2ZSh0YXJnZXRQYXRoKTtcbiAgY29uc3QgcmVtYWluZGVyU2VnbWVudHM6IHN0cmluZ1tdID0gW107XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhleGlzdGluZ1BhdGgpKSB7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShleGlzdGluZ1BhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBleGlzdGluZ1BhdGgpIGJyZWFrO1xuICAgIHJlbWFpbmRlclNlZ21lbnRzLnVuc2hpZnQocGF0aC5iYXNlbmFtZShleGlzdGluZ1BhdGgpKTtcbiAgICBleGlzdGluZ1BhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMoZXhpc3RpbmdQYXRoKSwgLi4ucmVtYWluZGVyU2VnbWVudHMpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRhcmdldFBhdGgpO1xuICB9XG59XG5cbi8qKiBXaGV0aGVyIHRoZSB0d28gcGF0aHMgYXJlIGVxdWFsIG9yIG9uZSBjb250YWlucyB0aGUgb3RoZXIuICovXG5mdW5jdGlvbiBwYXRoc092ZXJsYXAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhLCBiKSB8fCBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYiwgYSk7XG59XG5cbmZ1bmN0aW9uIGlzRXF1YWxPckFuY2VzdG9yUGF0aChhbmNlc3RvclBhdGg6IHN0cmluZywgZGVzY2VuZGFudFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGFuY2VzdG9yUGF0aCwgZGVzY2VuZGFudFBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFN1YmRpcmVjdG9yeShyb290RGlyUGF0aDogc3RyaW5nLCBvdXREaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gIGlmIChyZWxhdGl2ZVBhdGggJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihgT3V0cHV0IGRpcmVjdG9yeSBtdXN0IGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IHJvb3Q6ICR7b3V0RGlyUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7XG4gIC8vIHJlYWxwYXRoU3luYyByZXNvbHZlcyB0aGUgaXNvbGF0ZWQgbGlua2VyJ3Mgc3ltbGluayBzbyBjb3BpZXMgcmVhZCAoYW5kIHRoZSBjb3B5IGZpbHRlclxuICAvLyBjb21wdXRlcyByZWxhdGl2ZSBwYXRocyBhZ2FpbnN0KSB0aGUgYWN0dWFsIHBhY2thZ2UgZGlyZWN0b3J5LlxuICBjb25zdCBkaXJlY3REaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJlY3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhkaXJlY3REaXJQYXRoKTtcbiAgfVxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIga2VlcHMgdHJhbnNpdGl2ZS1vbmx5IGRlcGVuZGVuY2llcyBvdXQgb2YgdGhlIHJvb3Qgbm9kZV9tb2R1bGVzO1xuICAvLyBzZWFyY2ggdGhlIC5idW4gc3RvcmUgZm9yIHRoZSBwYWNrYWdlIGJlZm9yZSBnaXZpbmcgdXAuIFRoZSBzdG9yZSBtYXkgbGVnaXRpbWF0ZWx5IGhvbGRcbiAgLy8gTVVMVElQTEUgcmVzb2x1dGlvbnMgb2Ygb25lIHBhY2thZ2UgKGRpZmZlcmVudCB2ZXJzaW9ucy9yZXZpc2lvbnMpLCBhbmQgcGlja2luZyBhbiBhcmJpdHJhcnlcbiAgLy8gb25lIGNvdWxkIHNpbGVudGx5IG1hdGVyaWFsaXplIHRoZSB3cm9uZyBjb250ZW50IOKAlCBzbyBhbWJpZ3VpdHkgZmFpbHMgbG91ZGx5LlxuICBjb25zdCBidW5TdG9yZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpO1xuICBjb25zdCBjYW5kaWRhdGVEaXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGZzLnJlYWRkaXJTeW5jKGJ1blN0b3JlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVEaXJQYXRoID0gcGF0aC5qb2luKGJ1blN0b3JlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWROYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjYW5kaWRhdGVEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgIGNhbmRpZGF0ZURpclBhdGhzLmFkZChmcy5yZWFscGF0aFN5bmMoY2FuZGlkYXRlRGlyUGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCB0aHJvdWdoIHRvIHRoZSBlcnJvciBiZWxvdy5cbiAgfVxuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA9PT0gMSkgcmV0dXJuIFsuLi5jYW5kaWRhdGVEaXJQYXRoc11bMF0hO1xuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgaW5zdGFsbGVkIHJlc29sdXRpb25zIGZvdW5kIGZvciAke3BhY2thZ2VOYW1lfTogJHtbLi4uY2FuZGlkYXRlRGlyUGF0aHNdLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgJ0RlZHVwbGljYXRlIHRoZSBkZXBlbmRlbmN5IHNvIGEgc2luZ2xlIHJlc29sdXRpb24gcmVtYWlucy4nXG4gICAgKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAke3BhY2thZ2VOYW1lfSAoJHtkaXJlY3REaXJQYXRofSlgKTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbGVkIG1hdGVyaWFsaXphdGlvbiBvZiBhIHJlZ2lzdHJ5IHBhY2thZ2UsIHdoZW4gaXRzIHZlcnNpb24gaXMgc3RhdGljYWxseSBrbm93biB0b1xuICogc2F0aXNmeSB0aGUgc3BlY2lmaWVyIOKAlCBzdGVwcyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzIChlLmcuIENJIHRlc3Qgc3RlcHMsIHdoaWNoXG4gKiBkZWxpYmVyYXRlbHkgcmVjZWl2ZSBubyBWZXJkYWNjaW8gdG9rZW4pIHJldXNlIGl0IGluc3RlYWQgb2YgZG93bmxvYWRpbmcuIFJldHVybnMgdW5kZWZpbmVkXG4gKiAoZmFsbGluZyBiYWNrIHRvIGEgZG93bmxvYWQpIHdoZW4gbm8gdW5hbWJpZ3VvdXNseSBjb3JyZWN0IGluc3RhbGxlZCBjb3B5IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZmluZEluc3RhbGxlZFJlZ2lzdHJ5UGFja2FnZShcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2U6IFByaXZhdGVQYWNrYWdlXG4pOiB7IGRpclBhdGg6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBzcGVjaWZpZXIgPSBwcml2YXRlUGFja2FnZS52ZXJzaW9uU3BlY2lmaWVyID8/ICdsYXRlc3QnO1xuICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLmpvaW4oJ25vZGVfbW9kdWxlcycsIC4uLnByaXZhdGVQYWNrYWdlLm5hbWUuc3BsaXQoJy8nKSk7XG4gIGNvbnN0IGFkZENhbmRpZGF0ZSA9IChjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVhZEluc3RhbGxlZFZlcnNpb24oZGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgaWYgKHZlcnNpb24gJiYgaW5zdGFsbGVkVmVyc2lvblNhdGlzZmllcyhzcGVjaWZpZXIsIHZlcnNpb24pKSBjYW5kaWRhdGVzLnNldChmcy5yZWFscGF0aFN5bmMoZGlyUGF0aCksIHZlcnNpb24pO1xuICB9O1xuICAvLyBBIHJvb3QtbGV2ZWwgaW5zdGFsbGF0aW9uIGlzIFRIRSBsb2NrZmlsZSByZXNvbHV0aW9uIGZvciB0aGUgcm9vdCBkZXBlbmRlbmN5OyB0aGUgLmJ1biBzdG9yZVxuICAvLyBpcyBjb25zdWx0ZWQgb25seSBmb3IgdHJhbnNpdGl2ZS1vbmx5IHBhY2thZ2VzLCB3aGVyZSBtdWx0aXBsZSBzYXRpc2Z5aW5nIHJlc29sdXRpb25zIG1heVxuICAvLyBjb2V4aXN0IGFuZCBwaWNraW5nIG9uZSBhcmJpdHJhcmlseSBjb3VsZCBtYXRlcmlhbGl6ZSB0aGUgd3JvbmcgY29udGVudC5cbiAgY29uc3QgZGlyZWN0Q2FuZGlkYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGFkZENhbmRpZGF0ZShkaXJlY3RDYW5kaWRhdGVzLCBwYXRoLmpvaW4ocm9vdERpclBhdGgsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICBpZiAoZGlyZWN0Q2FuZGlkYXRlcy5zaXplID09PSAxKSByZXR1cm4gdG9TaW5nbGVDYW5kaWRhdGUoZGlyZWN0Q2FuZGlkYXRlcyk7XG5cbiAgY29uc3Qgc3RvcmVDYW5kaWRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBmcy5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGFkZENhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMsIHBhdGguam9pbihyb290RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYnVuJywgZGlyZW50Lm5hbWUsIHJlbGF0aXZlRGlyUGF0aCkpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nLlxuICB9XG4gIHJldHVybiB0b1NpbmdsZUNhbmRpZGF0ZShzdG9yZUNhbmRpZGF0ZXMpO1xufVxuXG5mdW5jdGlvbiB0b1NpbmdsZUNhbmRpZGF0ZShjYW5kaWRhdGVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogeyBkaXJQYXRoOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgW2VudHJ5XSA9IGNhbmRpZGF0ZXM7XG4gIHJldHVybiBjYW5kaWRhdGVzLnNpemUgPT09IDEgJiYgZW50cnkgPyB7IGRpclBhdGg6IGVudHJ5WzBdLCB2ZXJzaW9uOiBlbnRyeVsxXSB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWFkSW5zdGFsbGVkVmVyc2lvbihkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09IHBhY2thZ2VOYW1lICYmIHR5cGVvZiBwYWNrYWdlSnNvbi52ZXJzaW9uID09PSAnc3RyaW5nJ1xuICAgICAgPyBwYWNrYWdlSnNvbi52ZXJzaW9uXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcml2YXRlUGFja2FnZVtdIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5S2V5cykge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uW2tleV07XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGNvbnN0IGlzR2l0ID0gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSk7XG4gICAgICBpZiAoIWlzR2l0ICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0dpdCAmJiAhbmFtZS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIGdpdCBkZXBlbmRlbmN5IG11c3QgYmUgYW4gQHdpbGxib29zdGVyIHBhY2thZ2U6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShuYW1lKTtcbiAgICAgIC8vIERlcGVuZGVuY3kgbmFtZXMgYmVjb21lIGV4dGVybmFsIGRhdGEgb25jZSBuZXN0ZWQgbWFuaWZlc3RzIGNvbWUgZnJvbSBkb3dubG9hZGVkXG4gICAgICAvLyB0YXJiYWxsczsgcmVqZWN0IGFueXRoaW5nIChwYXRoIHNlcGFyYXRvcnMsIGAuLmAsIGhpZGRlbi1maWxlIHByZWZpeGVzKSB0aGF0IGNvdWxkXG4gICAgICAvLyBlc2NhcGUgdGhlIG91dHB1dCBkaXJlY3RvcnkgdGhlIG5hbWUgaXMgam9pbmVkIGludG8gYmVmb3JlIGl0IGlzIHJlY3Vyc2l2ZWx5IGRlbGV0ZWQuXG4gICAgICBpZiAoIS9eW1xcdy4tXSskLy50ZXN0KHVuc2NvcGVkTmFtZSkgfHwgdW5zY29wZWROYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpdmF0ZSBwYWNrYWdlIG5hbWU6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGtpbmQ6IGlzR2l0ID8gJ2dpdCcgOiAncmVnaXN0cnknLFxuICAgICAgICBzb3VyY2VEaXJQYXRoOiB1bmRlZmluZWQsXG4gICAgICAgIHJlc29sdmVkVmVyc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICB0YXJnZXREaXJQYXRoOiBwYXRoLmpvaW4oaXNHaXQgPyBvdXREaXJQYXRoIDogcmVnaXN0cnlPdXREaXJQYXRoLCB1bnNjb3BlZE5hbWUpLFxuICAgICAgICAvLyBUaGUgZnVsbCBnaXQgc3BlY2lmaWVyIGlzIHByZXNlcnZlZCBzbyBkaXZlcmdlbnQgVVJMcy9yZXZpc2lvbnMgKCNhYmMgdnMgI2RlZikgYXJlXG4gICAgICAgIC8vIGRldGVjdGVkIGFzIGNvbmZsaWN0cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGNvbGxhcHNpbmcgaW50byBvbmUgY29waWVkIHBhY2thZ2UuXG4gICAgICAgIHZlcnNpb25TcGVjaWZpZXI6IHZhbHVlIGFzIHN0cmluZyxcbiAgICAgIH07XG4gICAgICBjb25zdCBleGlzdGluZyA9IHByaXZhdGVQYWNrYWdlcy5nZXQobmFtZSk7XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5hbWUsIGV4aXN0aW5nID8gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKSA6IHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXTtcbn1cblxuLyoqXG4gKiBBIG1hbmlmZXN0IG1heSBsZWdpdGltYXRlbHkgcmVxdWVzdCBvbmUgcGFja2FnZSBmcm9tIHNldmVyYWwgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBhbiBleGFjdFxuICogZGV2RGVwZW5kZW5jaWVzIHBpbiBhbG9uZ3NpZGUgYSBwZWVyRGVwZW5kZW5jaWVzIHJhbmdlKS4gS2VlcCB0aGUgTkFSUk9XRVIgcmVxdWlyZW1lbnQg4oCUIGl0c1xuICogbWF4LXNhdGlzZnlpbmcgcmVzb2x1dGlvbiBzYXRpc2ZpZXMgdGhlIHdpZGVyIG9uZSBieSBkZWZpbml0aW9uIChhbiBleGFjdCBwaW4gaXMgdGhlIG5hcnJvd2VzdFxuICogcmFuZ2UpIOKAlCBhbmQgZmFpbCBsb3VkbHkgd2hlbiB0aGUgcmVxdWlyZW1lbnRzIGdlbnVpbmVseSBkaXZlcmdlLlxuICovXG5mdW5jdGlvbiBtZXJnZVNhbWVNYW5pZmVzdFJlcXVpcmVtZW50KGV4aXN0aW5nOiBQcml2YXRlUGFja2FnZSwgcmVxdWVzdGVkOiBQcml2YXRlUGFja2FnZSk6IFByaXZhdGVQYWNrYWdlIHtcbiAgY29uc3QgbmFycm93ZXIgPSBuYXJyb3dlckNvbXBhdGlibGVSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKTtcbiAgaWYgKG5hcnJvd2VyKSByZXR1cm4gbmFycm93ZXI7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgQ29uZmxpY3RpbmcgcmVxdWlyZW1lbnRzIGZvciAke2V4aXN0aW5nLm5hbWV9IHdpdGhpbiBvbmUgbWFuaWZlc3Q6IGAgK1xuICAgICAgYCR7ZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA/PyBleGlzdGluZy5raW5kfSB2cyAke3JlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyID8/IHJlcXVlc3RlZC5raW5kfS5gXG4gICk7XG59XG5cbi8qKlxuICogVGhlIHJlcXVpcmVtZW50IHdob3NlIG1heC1zYXRpc2Z5aW5nIHJlc29sdXRpb24gaXMgZ3VhcmFudGVlZCB0byBzYXRpc2Z5IHRoZSBvdGhlciAoYW4gZXhhY3RcbiAqIHBpbiBpcyB0aGUgbmFycm93ZXN0IHJhbmdlKSwgb3IgdW5kZWZpbmVkIHdoZW4gbmVpdGhlciBzdWJzdW1lcyB0aGUgb3RoZXIuXG4gKi9cbmZ1bmN0aW9uIG5hcnJvd2VyQ29tcGF0aWJsZVJlcXVpcmVtZW50KFxuICBleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsXG4gIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2Vcbik6IFByaXZhdGVQYWNrYWdlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4aXN0aW5nLmtpbmQgIT09IHJlcXVlc3RlZC5raW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZXhpc3RpbmcudmVyc2lvblNwZWNpZmllciA9PT0gcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyLCByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikpIHJldHVybiBleGlzdGluZztcbiAgaWYgKHNwZWNpZmllclN1YnNldChyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciwgZXhpc3RpbmcudmVyc2lvblNwZWNpZmllcikpIHJldHVybiByZXF1ZXN0ZWQ7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VQcml2YXRlRGVwZW5kZW5jaWVzKFxuICBzdGFnaW5nUm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBwcml2YXRlUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyh0b1N0YWdlZFBhdGgocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgaWYgKCFyZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25QYXRoLCBwYWNrYWdlSnNvbiwgcHJpdmF0ZVBhY2thZ2VzLCB0b1N0YWdlZFBhdGgpKSBjb250aW51ZTtcblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMil9XFxuYCwgJ3V0ZjgnKTtcbiAgICAgIC8vIFN0YWdpbmcgbWlycm9ycyB0aGUgcm9vdC1yZWxhdGl2ZSBsYXlvdXQsIHNvIHRoaXMgaXMgdGhlIG1hbmlmZXN0J3MgcG9zdC1zd2FwIGxvY2F0aW9uLlxuICAgICAgY29uc29sZS5pbmZvKGBSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzIGluICR7cGF0aC5yZWxhdGl2ZShzdGFnaW5nUm9vdERpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25QYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4sXG4gIHRvU3RhZ2VkUGF0aDogKHRhcmdldERpclBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBpZiAoIWlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRhcmdldFBhY2thZ2UgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCF0YXJnZXRQYWNrYWdlKSBjb250aW51ZTtcblxuICAgICAgLy8gQm90aCBzaWRlcyBhcmUgc3RhZ2VkIHBhdGhzOiBzdGFnaW5nIG1pcnJvcnMgdGhlIHJvb3QtcmVsYXRpdmUgbGF5b3V0LCBzbyB0aGUgcmVsYXRpdmVcbiAgICAgIC8vIHNwZWNpZmllciBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB0aGUgZmluYWwgbG9jYXRpb25zIHdvdWxkIHByb2R1Y2UuXG4gICAgICBkZXBlbmRlbmNpZXNbbmFtZV0gPVxuICAgICAgICBgZmlsZToke3BhdGgucmVsYXRpdmUocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksIHRvU3RhZ2VkUGF0aCh0YXJnZXRQYWNrYWdlLnRhcmdldERpclBhdGgpKX1gO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG4vKipcbiAqIE1vdmUgZXZlcnkgc3RhZ2VkIHRyZWUgb250byBpdHMgZmluYWwgbG9jYXRpb24gYXMgb25lIHRyYW5zYWN0aW9uOiBlYWNoIGxpdmUgdHJlZSBpcyBzZXQgYXNpZGVcbiAqIGZpcnN0IHNvIGEgZmFpbGluZyByZW5hbWUgY2FuIHJlc3RvcmUgdGhlIHByZXZpb3VzIHN0YXRlIGluc3RlYWQgb2YgbGVhdmluZyBvbmUgdHJlZSByZXBsYWNlZFxuICogYW5kIHRoZSBvdGhlciBzdGFsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN3YXBNYXRlcmlhbGl6ZWRUcmVlcyhcbiAgb3V0RGlyUGF0aHM6IHN0cmluZ1tdLFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZyxcbiAgYmFja3VwUm9vdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgVU5JUVVFIGRpcmVjdG9yeSBwZXIgaW52b2NhdGlvbjogd2hlbiBhIHJvbGxiYWNrIGZhaWxzIGl0cyBiYWNrdXAgaXMgcmV0YWluZWQgZm9yIG1hbnVhbFxuICAvLyByZWNvdmVyeSwgYW5kIGEgZml4ZWQgcGF0aCB3b3VsZCBsZXQgdGhlIG5leHQgcnVuIGRlbGV0ZSB0aGUgb25seSByZW1haW5pbmcgY29weS5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGJhY2t1cFJvb3REaXJQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGJhY2t1cERpclJvb3QgPSBhd2FpdCBmcy5wcm9taXNlcy5ta2R0ZW1wKGAke2JhY2t1cFJvb3REaXJQYXRofS1gKTtcbiAgLy8gUmVjb3JkZWQgQkVGT1JFIHRoZSBzdGFnZWQgdHJlZSBpcyByZW5hbWVkIGluOiBiZXR3ZWVuIHNldHRpbmcgdGhlIGxpdmUgdHJlZSBhc2lkZSBhbmRcbiAgLy8gaW5zdGFsbGluZyBpdHMgcmVwbGFjZW1lbnQgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbiBleGlzdHMgb25seSBpbiB0aGUgYmFja3VwLCBhbmQgYSByZWNvcmRcbiAgLy8gYWRkZWQgYWZ0ZXIgdGhlIHJlbmFtZSB3b3VsZCBsZWF2ZSB0aGF0IHdpbmRvdyB1bnJlY292ZXJhYmxlLlxuICBjb25zdCBzd2FwcGVkRGlyczogeyBvdXREaXJQYXRoOiBzdHJpbmc7IGJhY2t1cERpclBhdGg6IHN0cmluZzsgaGFkUHJldmlvdXNUcmVlOiBib29sZWFuIH1bXSA9IFtdO1xuICBsZXQgcmVzdG9yZUZhaWxlZCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBvdXREaXJQYXRoXSBvZiBvdXREaXJQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgIC8vIEluZGV4ZWQgKG5vdCBuYW1lZCBhZnRlciB0aGUgZGlyZWN0b3J5KSBzbyB0d28gb3V0cHV0IHRyZWVzIHNoYXJpbmcgYSBiYXNlbmFtZSBjYW5ub3RcbiAgICAgIC8vIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgYmFja3VwLlxuICAgICAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguam9pbihiYWNrdXBEaXJSb290LCBTdHJpbmcoaW5kZXgpKTtcbiAgICAgIGNvbnN0IGhhZFByZXZpb3VzVHJlZSA9IGZzLmV4aXN0c1N5bmMob3V0RGlyUGF0aCk7XG4gICAgICBpZiAoaGFkUHJldmlvdXNUcmVlKSBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCk7XG4gICAgICBzd2FwcGVkRGlycy5wdXNoKHsgb3V0RGlyUGF0aCwgYmFja3VwRGlyUGF0aCwgaGFkUHJldmlvdXNUcmVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKG91dERpclBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZSh0b1N0YWdlZFBhdGgob3V0RGlyUGF0aCksIG91dERpclBhdGgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBSZXZlcnNlIG9yZGVyOiB1bmRvIHRoZSBtb3N0IHJlY2VudCBzd2FwIGZpcnN0LlxuICAgIGZvciAoY29uc3Qgc3dhcHBlZCBvZiBzd2FwcGVkRGlycy50b1JldmVyc2VkKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN3YXBwZWQub3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoc3dhcHBlZC5oYWRQcmV2aW91c1RyZWUpIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShzd2FwcGVkLmJhY2t1cERpclBhdGgsIHN3YXBwZWQub3V0RGlyUGF0aCk7XG4gICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7XG4gICAgICAgIC8vIFJlcG9ydGluZyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBtYXR0ZXJzIG1vcmUsIGJ1dCBhIGZhaWxlZCByb2xsYmFjayBsZWF2ZXMgdGhlIHRyZWVcbiAgICAgICAgLy8gbWlzc2luZywgc28gaXQgbXVzdCBub3QgcGFzcyBzaWxlbnRseSDigJQgYW5kIGl0cyBiYWNrdXAgaXMgdGhlbiB0aGUgT05MWSByZW1haW5pbmcgY29weS5cbiAgICAgICAgcmVzdG9yZUZhaWxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZXN0b3JlICR7c3dhcHBlZC5vdXREaXJQYXRofTogJHtTdHJpbmcocm9sbGJhY2tFcnJvcil9XFxuYCArXG4gICAgICAgICAgICAgIGBUaGUgcHJldmlvdXMgbWF0ZXJpYWxpemF0aW9uIGlzIGtlcHQgYXQgJHtzd2FwcGVkLmJhY2t1cERpclBhdGh9OyBtb3ZlIGl0IGJhY2sgYnkgaGFuZC5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBPbmx5IHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvIHJlY292ZXI6IGRlbGV0aW5nIHRoZSBiYWNrdXBzIGFmdGVyIGEgZmFpbGVkIHJlc3RvcmUgd291bGRcbiAgICAvLyBkZXN0cm95IHRoZSBsYXN0IGNvcHkgb2YgdGhlIHByZXZpb3VzIG1hdGVyaWFsaXphdGlvbi4gQW5kIGJ5IHRoaXMgcG9pbnQgYm90aCB0cmVlcyBhcmVcbiAgICAvLyBhbHJlYWR5IGNvbW1pdHRlZCwgc28gYSBjbGVhbnVwIGZhaWx1cmUgKGUuZy4gYSByZWFkLW9ubHkgZGlyZWN0b3J5IGBmcy5jcGAgcHJlc2VydmVkKSBtdXN0XG4gICAgLy8gbm90IHR1cm4gYSBzdWNjZXNzZnVsIG1hdGVyaWFsaXphdGlvbiBpbnRvIGEgcmVwb3J0ZWQgZmFpbHVyZS5cbiAgICBpZiAoIXJlc3RvcmVGYWlsZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGJhY2t1cERpclJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBGYWlsZWQgdG8gcmVtb3ZlICR7YmFja3VwRGlyUm9vdH06ICR7U3RyaW5nKGNsZWFudXBFcnJvcil9YCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25QYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGRpcmVudC5uYW1lID09PSAnbm9kZV9tb2R1bGVzJyB8fCBkaXJlbnQubmFtZSA9PT0gJy5naXQnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goLi4uKGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKGNoaWxkUGF0aCkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lID09PSAncGFja2FnZS5qc29uJykge1xuICAgICAgcGFja2FnZUpzb25QYXRocy5wdXNoKGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4pOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmVjcmVhdGUgJHtvdXREaXJQYXRofWApO1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGhcbiAgICAgICAgPyBgW2RyeS1ydW5dIFdvdWxkIGNvcHkgJHtwcml2YXRlUGFja2FnZS5uYW1lfTogJHtwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRofWBcbiAgICAgICAgOiBwcml2YXRlUGFja2FnZS5raW5kID09PSAnZ2l0J1xuICAgICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06IChpbnN0YWxsZWQgdW5kZXIgbm9kZV9tb2R1bGVzKWBcbiAgICAgICAgICA6IGBbZHJ5LXJ1bl0gV291bGQgZG93bmxvYWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfUAke3ByaXZhdGVQYWNrYWdlLnZlcnNpb25TcGVjaWZpZXJ9IHRvICR7cHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGRlcGVuZGVuY2llcyB0byBmaWxlOi4uLzxuYW1lPmApO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQge1xuICBmaW5kRGVzY2VuZGFudFByb2plY3RzLFxuICBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIGdldEZpbGVEYXRhYmFzZVVybFBhdGgsXG4gIHR5cGUgUHJvamVjdCxcbn0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5cbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyxcbiAgdG9VbnNjb3BlZFBhY2thZ2VOYW1lLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5pbXBvcnQgeyBjb2xsZWN0TWFuaWZlc3RzLCBtYXRlcmlhbGl6ZVByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4vc2V0dXBQcml2YXRlUGFja2FnZXMuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3Qgc3FsaXRlRmlsZVBhdHRlcm4gPSAvXFwuKD86c3FsaXRlMz98ZGIpKD86Wy0uXSg/OmpvdXJuYWx8c2htfHdhbCkpPyQvaTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXRocyA9IFtcbiAgJy5jYWNoZScsXG4gICcubXlweV9jYWNoZScsXG4gICcubmV4dC9jYWNoZScsXG4gICcucGFyY2VsLWNhY2hlJyxcbiAgJy5weXRlc3RfY2FjaGUnLFxuICAnLnJ1ZmZfY2FjaGUnLFxuICAnLnRveCcsXG4gICcudHVyYm8nLFxuICAnLnZlbnYnLFxuICAnLnlhcm4vY2FjaGUnLFxuICAnLnlhcm4vaW5zdGFsbC1zdGF0ZS5neicsXG4gICdfX3B5Y2FjaGVfXycsXG4gICdjb3ZlcmFnZScsXG4gICdub2RlX21vZHVsZXMvLmNhY2hlJyxcbiAgJ3BsYXl3cmlnaHQtcmVwb3J0JyxcbiAgJ3N0b3J5Ym9vay1zdGF0aWMnLFxuICAndGFyZ2V0JyxcbiAgJ3Rlc3QtcmVzdWx0cycsXG5dO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zID0gWycqKi8qLnB5YycsICcqKi8qLnRzYnVpbGRpbmZvJywgJyoqL19fcHljYWNoZV9fJ107XG5jb25zdCBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcyA9IFsncHJpc21hJywgJ2RiJywgJ2RyaXp6bGUnXSBhcyBjb25zdDtcbmNvbnN0IGRvY2tlckdlbmVyYXRlZERhdGFEaXJQYXRocyA9IFsnL2RhdGEnXSBhcyBjb25zdDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBNYXRlcmlhbGl6ZSBwcml2YXRlIGRlcGVuZGVuY2llcyBvbiB0aGUgaG9zdCBmaXJzdCBzbyB0aGUgcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyByZXNvbHZlc1xuICAgIC8vIHRoZW0gdG8gZmlsZTogcGF0aHMgYW5kIHRoZSBEb2NrZXIgYnVpbGQgbmVlZHMgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHMuIE9ubHkgaW4gLS1vdXRzaWRlXG4gICAgLy8gbW9kZSAodGhlIGluLWltYWdlIHNlY29uZCBwYXNzIGhhcyBubyBub2RlX21vZHVsZXMvcmVnaXN0cnkgdG8gbWF0ZXJpYWxpemUgZnJvbSkgYW5kIG9ubHlcbiAgICAvLyB3aGVuIGEgcHJpdmF0ZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IGRlY2xhcmVkLCBzbyByZXBvcyB3aXRob3V0IG9uZSBhcmUgdW50b3VjaGVkIOKAlCBubyBlbXB0eVxuICAgIC8vIG91dHB1dCBkaXJlY3Rvcmllcywgbm8gc3B1cmlvdXMgXCJDT1BZXCIgaGludC4gRmFpbHVyZXMgYXJlIG5vbi1mYXRhbCBhbmQgbm9uLWRlc3RydWN0aXZlOlxuICAgIC8vIG1hdGVyaWFsaXplIHRocm93cyBiZWZvcmUgZGVsZXRpbmcgYW55IGV4aXN0aW5nIG91dHB1dCAoYW5kIGNsZWFucyB1cCBpdHMgc3RhZ2luZyBvbiBhIGZhaWxlZFxuICAgIC8vIGRvd25sb2FkKSwgc28gYSByZXBvIGxhY2tpbmcgcmVnaXN0cnkgY3JlZGVudGlhbHMga2VlcHMgYnVpbGRpbmcgZXhhY3RseSBhcyBiZWZvcmUsIHdpdGggdGhlXG4gICAgLy8gcGVyLXByb2plY3QgcmV3cml0ZSBiZWxvdyBlbWl0dGluZyB0aGUgZXhpc3RpbmcgXCJydW4gd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc1wiIGhpbnQuIFRoaXNcbiAgICAvLyBrZWVwcyB0aGUgc3RlcCBhIHB1cmUgY29udmVuaWVuY2UgdGhhdCBsZXRzIHJlcG9zaXRvcmllcyBkcm9wIHRoZSBleHBsaWNpdCBjb21tYW5kLlxuICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgd29ya3NwYWNlIHNldCBmcm9tIHRoZSByZXBvc2l0b3J5IHJvb3Qgc28gYSBwcml2YXRlIGRlcGVuZGVuY3kgZGVjbGFyZWQgaW5cbiAgICAgIC8vIGFueSBzaWJsaW5nIHdvcmtzcGFjZSBpcyBtYXRlcmlhbGl6ZWQgZXZlbiB3aGVuIG9wdGltaXplIHJ1bnMgZnJvbSBhIHN1YnBhY2thZ2UgZGlyZWN0b3J5LlxuICAgICAgY29uc3Qgcm9vdFByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdHMucm9vdC5kaXJQYXRoKTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0cyA9IGNvbGxlY3RNYW5pZmVzdHMocm9vdFByb2plY3RzID8/IHByb2plY3RzKTtcbiAgICAgIGlmIChtYW5pZmVzdHMuc29tZShkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG1hdGVyaWFsaXplUHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgbWFuaWZlc3RzLCB7IGRyeVJ1bjogQm9vbGVhbihhcmd2LmRyeVJ1bikgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgQ291bGQgbm90IGF1dG8tbWF0ZXJpYWxpemUgcHJpdmF0ZSBwYWNrYWdlcyAoJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9KTsgYCArXG4gICAgICAgICAgICAgICAgJ3J1biBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgaWYgdGhlIERvY2tlciBidWlsZCBuZWVkcyB0aGVtLiBDb250aW51aW5nLidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW1pemVkUHJvamVjdHM6IFByb2plY3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ29wdGltaXplRm9yRG9ja2VyQnVpbGQnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gICAgICByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llcyhwcm9qZWN0LCBwYWNrYWdlSnNvbik7XG4gICAgICBjb25zdCByZW1vdmVkRGV2RGVwZW5kZW5jaWVzID0gb3B0aW1pemVEZXZEZXBlbmRlbmNpZXMoYXJndiwgcGFja2FnZUpzb24pO1xuXG4gICAgICBvcHRpbWl6ZVNjcmlwdHMocGFja2FnZUpzb24sIHtcbiAgICAgICAgcmVtb3ZlV2JQb3N0aW5zdGFsbDogIWFyZ3Yub3V0c2lkZSAmJiByZW1vdmVkRGV2RGVwZW5kZW5jaWVzLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvd2InKSxcbiAgICAgIH0pO1xuXG4gICAgICBvcHRpbWl6ZVJvb3RQcm9wcyhwYWNrYWdlSnNvbik7XG5cbiAgICAgIGlmIChhcmd2LmRyeVJ1bikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGRpc3REaXJQYXRoID0gYXJndi5vdXRzaWRlID8gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Rpc3QnKSA6IHByb2plY3QuZGlyUGF0aDtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlzdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pLCAndXRmOCcpO1xuICAgICAgaWYgKGFyZ3Yub3V0c2lkZSkge1xuICAgICAgICBhd2FpdCB3cml0ZURvY2tlclNoZWxsU2NyaXB0cyhwYXRoLmpvaW4oZGlzdERpclBhdGgsICdiYXNoJykpO1xuICAgICAgfVxuICAgICAgb3B0aW1pemVkUHJvamVjdHMucHVzaChwcm9qZWN0KTtcbiAgICB9XG4gICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhYXJndi5vdXRzaWRlKSB7XG4gICAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwcm9qZWN0cy5yb290LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZCwgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5pbmZvKCdJbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpO1xuICAgICAgYXdhaXQgY2xlYW51cERvY2tlckJ1aWxkQXJ0aWZhY3RzKG9wdGltaXplZFByb2plY3RzKTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKiogV2hldGhlciBhbnkgZGVwZW5kZW5jeSBzZWN0aW9uIGRlY2xhcmVzIGEgcHJpdmF0ZSBnaXQgb3IgYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHJlZ2lzdHJ5IGRlcGVuZGVuY3kuICovXG5mdW5jdGlvbiBkZWNsYXJlc1ByaXZhdGVEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzLnNvbWUoKGtleSkgPT4ge1xuICAgIGNvbnN0IGRlcHMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIHJldHVybiAoXG4gICAgICBkZXBzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIE9iamVjdC5lbnRyaWVzKGRlcHMpLnNvbWUoXG4gICAgICAgIChbbmFtZSwgdmFsdWVdKSA9PiBpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSB8fCBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKHByb2plY3Qucm9vdERpclBhdGgsIHByb2plY3QuZGlyUGF0aCwgcGFja2FnZUpzb24pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJld3JpdHRlbkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICBpZiAoaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gRG9ja2VyIGJ1aWxkcyBjYW5ub3QgYWNjZXNzIHByaXZhdGUgU1NIIFVSTHMgdW5sZXNzIGNyZWRlbnRpYWxzIGFyZSBmb3J3YXJkZWQuXG4gICAgICAgIC8vIFRoZSBEb2NrZXJmaWxlIGNvcGllcyB0aG9zZSB3b3Jrc3BhY2UgcGFja2FnZXMgaW50byB0aGUgaW1hZ2UgaW5zdGVhZC4gT25seSB0aGUgb3JnJ3NcbiAgICAgICAgLy8gb3duIGdpdCBkZXBlbmRlbmNpZXMgYXJlIHJld3JpdHRlbiDigJQgdGhlIHNoYXJlZCBwcmVkaWNhdGUgbWF0Y2hlcyBleGFjdGx5IHdoYXRcbiAgICAgICAgLy8gYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplcywgc28gb3RoZXIgU1NIIFVSTHMgYXJlIGxlZnQgdW5jaGFuZ2VkIGluc3RlYWRcbiAgICAgICAgLy8gb2YgYmVpbmcgcG9pbnRlZCBhdCBuZXZlci1tYXRlcmlhbGl6ZWQgbG9jYWwgcGF0aHMuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsICdAd2lsbGJvb3N0ZXInLCBuYW1lKTtcbiAgICAgICAgcmV3cml0dGVuRGVwZW5kZW5jaWVzLnB1c2goYCR7a2V5fS4ke25hbWV9YCk7XG4gICAgICB9IGVsc2UgaWYgKGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeShuYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgbWF0ZXJpYWxpemVkVmVyc2lvbiA9IHJlYWRNYXRlcmlhbGl6ZWRQYWNrYWdlVmVyc2lvbihyb290RGlyUGF0aCwgbmFtZSk7XG4gICAgICAgIGlmIChtYXRlcmlhbGl6ZWRWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBMZWF2aW5nIHRoZSByZWdpc3RyeSBzcGVjaWZpZXIgbWVhbnMgdGhlIGluLWltYWdlIGluc3RhbGwgbmVlZHMgVmVyZGFjY2lvXG4gICAgICAgICAgLy8gY3JlZGVudGlhbHMg4oCUIHRoZSBmYWlsdXJlIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gYXZvaWQg4oCUIHNvIHNheSBzbyBvdXQgbG91ZC5cbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGAke25hbWV9IGlzIG5vdCBtYXRlcmlhbGl6ZWQgdW5kZXIgJHtQUklWQVRFX1JFR0lTVFJZX1NDT1BFfS87IHJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgIHNvIHRoZSBEb2NrZXIgYnVpbGQgZG9lcyBub3QgbmVlZCByZWdpc3RyeSBjcmVkZW50aWFscy5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgbWF0ZXJpYWxpemVkIHZlcnNpb24gaXMgc3RhbGUgd2hlbiB0aGUgc3BlY2lmaWVyIChhbiBleGFjdCB2ZXJzaW9uIG9yIGFueSBzZW12ZXJcbiAgICAgICAgLy8gcmFuZ2UgYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIHJlc29sdmVzIG1heC1zYXRpc2Z5aW5nIGFnYWluc3QgdGhlIHJlZ2lzdHJ5KSBkb2VzXG4gICAgICAgIC8vIG5vdCBhZG1pdCBpdC4gRGlzdC10YWcgc3BlY2lmaWVycyAoZS5nLiBgMjAyNi1zdGFibGVgKSBza2lwIHRoZSBzdGFsZW5lc3MgY2hlY2suXG4gICAgICAgIGlmICghbWF0ZXJpYWxpemVkVmVyc2lvblNhdGlzZmllcyh2YWx1ZSwgbWF0ZXJpYWxpemVkVmVyc2lvbikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgICBgTWF0ZXJpYWxpemVkICR7bmFtZX0gaXMgJHttYXRlcmlhbGl6ZWRWZXJzaW9ufSBidXQgcGFja2FnZS5qc29uIHJlcXVpcmVzICR7dmFsdWV9OyByZXJ1biBcXGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzXFxgLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWdpc3RyeSBwYWNrYWdlcyB0aGF0IGB3YiBzZXR1cC1wcml2YXRlLXBhY2thZ2VzYCBtYXRlcmlhbGl6ZWQgb24gdGhlIGhvc3QgYXJlIHVzZWQgYXNcbiAgICAgICAgLy8gbG9jYWwgcGF0aHMgc28gaW1hZ2UgYnVpbGRzIG5lZWQgbm8gVmVyZGFjY2lvIGNyZWRlbnRpYWxzOyB0aGUgQ09NTUlUVEVEIHBhY2thZ2UuanNvblxuICAgICAgICAvLyBrZWVwcyB0aGUgcmVnaXN0cnkgc3BlY2lmaWVyIOKAlCBvbmx5IHRoZSBnZW5lcmF0ZWQgKGRpc3QvKXBhY2thZ2UuanNvbiBpcyByZXdyaXR0ZW5cbiAgICAgICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk2NCkuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsIG5hbWUpO1xuICAgICAgICByZXdyaXR0ZW5EZXBlbmRlbmNpZXMucHVzaChgJHtrZXl9LiR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzOicsIHJld3JpdHRlbkRlcGVuZGVuY2llcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZXdyaXR0ZW5EZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBzY29wZURpck5hbWU6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCBzY29wZURpck5hbWUsIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwcml2YXRlUGFja2FnZURpclBhdGgpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbi8qKiBVbmRlZmluZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBub3QgbWF0ZXJpYWxpemVkIChvciBpdHMgbWFuaWZlc3QgaXMgdW5yZWFkYWJsZS92ZXJzaW9ubGVzcykuICovXG5mdW5jdGlvbiByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihcbiAgICByb290RGlyUGF0aCxcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSksXG4gICAgJ3BhY2thZ2UuanNvbidcbiAgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24pLnZlcnNpb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgLy8gT3V0c2lkZSBvcHRpbWl6YXRpb24gd3JpdGVzIGRpc3QvcGFja2FnZS5qc29uIGJlZm9yZSBEb2NrZXIgYnVpbGRzIHRoZSBhcHAuXG4gICAgLy8gS2VlcCBidWlsZC10aW1lIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgY29uc3QgcmVtb3ZlZERlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICByZXR1cm4gcmVtb3ZlZERlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAnb3hmbXQnLFxuICAgICdveGxpbnQnLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZW1vdmVkRGVwcztcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgb3B0aW9uczogeyByZW1vdmVXYlBvc3RpbnN0YWxsOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMucmVtb3ZlV2JQb3N0aW5zdGFsbCAmJiBuYW1lID09PSAncG9zdGluc3RhbGwnICYmIGNvbnRlbnQudHJpbSgpID09PSAnd2IgZ2VuLWNvZGUnKSB8fFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBhd2FpdCByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3QpO1xuICAgIGF3YWl0IHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0KTtcbiAgICBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3QpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gW1xuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdCkpLFxuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdCkpLFxuICBdO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgRG9ja2VyIGJ1aWxkIGNhY2hlczonLCByZWxhdGl2ZVBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgZG9ja2VyQnVpbGRDYWNoZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYmJ5KGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucywge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzJywgJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ueWFybicsICcqKi8ueWFybi8qKicsICcqKi8uZ2l0JywgJyoqLy5naXQvKionXSxcbiAgICBvbmx5RmlsZXM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoKHJlbGF0aXZlUGF0aCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoR3JvdXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0KSwgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCldKTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gcmVtb3ZlZFBhdGhHcm91cHMuZmxhdCgpO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZ2VuZXJhdGVkIGxvY2FsIGRhdGE6JywgcmVtb3ZlZFBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHJlbGF0aXZlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkZWZhdWx0UGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihkaXJOYW1lLCAnbW91bnQnKSk7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRiUGF0aCk7XG4gIGlmIChwYXRoLmJhc2VuYW1lKGFic29sdXRlRGlyUGF0aCkgIT09ICdtb3VudCcgfHwgIWlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgYWJzb2x1dGVEaXJQYXRoKSkge1xuICAgIHJldHVybiBkZWZhdWx0UGF0aHM7XG4gIH1cbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGFic29sdXRlRGlyUGF0aCk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVmYXVsdFBhdGhzLCByZWxhdGl2ZVBhdGhdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdCksXG4gICAgcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCksXG4gIF0pO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gYXdhaXQgZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0LCBkaXJQYXRoKSkpO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUpKTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gaXNEaXJlY3RvcnkoZGlyUGF0aCkpKTtcbiAgcmV0dXJuIGRpclBhdGhzLmZpbHRlcigoXywgaW5kZXgpID0+IHJlc3VsdHNbaW5kZXhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGJGaWxlUGF0aHMgPSBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkYkZpbGVQYXRoIG9mIGRiRmlsZVBhdGhzKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIG9mIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgaXNGaWxlKHRhcmdldFBhdGgpKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICByZW1vdmVkUGF0aHMucHVzaChwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVEYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoIHx8ICFhYnNvbHV0ZURiUGF0aCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpXG4gICAgPyBbZGJQYXRoXVxuICAgIDogW2Fic29sdXRlRGJQYXRoLCAuLi5nZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUsIGRiUGF0aCkpXTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVQYXRocyldLmZpbHRlcigoZmlsZVBhdGgpID0+IGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgZmlsZVBhdGgpIHx8IGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMuc29tZSgoZGlyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcnICYmIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBkYkZpbGVQYXRoLFxuICAgIGAke2RiRmlsZVBhdGh9LWpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LXNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0td2FsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LndhbGAsXG4gIF07XG59XG5cbmZ1bmN0aW9uIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdDogUHJvamVjdCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKTtcbiAgLy8gYHN0YXJ0c1dpdGgoJy4uJylgIHdvdWxkIHJlamVjdCBwcm9qZWN0LWxvY2FsIG5hbWVzIHN1Y2ggYXMgYC4uY2FjaGVgLlxuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAocmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3BhdGguc2VwfWApKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChkaXJQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0OiBQcm9qZWN0LCBkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgc3FsaXRlRmlsZU5hbWVzID0gZGlyZW50c1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIHNxbGl0ZUZpbGVQYXR0ZXJuLnRlc3QoZGlyZW50Lm5hbWUpKVxuICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuXG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKTtcbiAgcmV0dXJuIHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBmaWxlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Jhc2gnLCAnY2xlYW51cC5zaCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnYmFzaCcsIFtzY3JpcHRQYXRoLCAnLS1rZWVwLXNjcmlwdHMnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBzY3JpcHRQYXRoKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZU9ybSwgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cywgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLCBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGREcml6emxlS2l0Q29tbWFuZCwgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0RvY2tlckVuYWJsZWQgfSBmcm9tICcuLi91dGlscy9jaS5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHByaXNtYUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdwcmlzbWEnLFxuICBhbGlhc2VzOiBbJ2RiJ10sXG4gIGRlc2NyaWJlOlxuICAgIFwiUnVuIGRhdGFiYXNlIGNvbW1hbmRzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIFByaXNtYS4gRHJpenpsZSBwcm9qZWN0cyB1c2UgZHJpenpsZS1raXQuIEV4YW1wbGU6IHdiIHByaXNtYSBtaWdyYXRlLWRldiAtLSAtLW5hbWUgaW5pdFwiLFxuICBidWlsZGVyOiAoeWFyZ3MpID0+IHtcbiAgICByZXR1cm4geWFyZ3NcbiAgICAgIC5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pXG4gICAgICAuY29tbWFuZChjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZXBsb3lGb3JjZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChnZW5lcmF0ZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChsaXN0QmFja3Vwc0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChtaWdyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVEZXZDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzZXRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQocmVzdG9yZUNvbW1hbmQpXG4gICAgICAuY29tbWFuZChzZWVkQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHN0dWRpb0NvbW1hbmQpXG4gICAgICAuY29tbWFuZChkZWZhdWx0Q29tbWFuZClcbiAgICAgIC5kZW1hbmRDb21tYW5kKClcbiAgICAgIC5zdHJpY3QoZmFsc2UpOyAvLyBBbGxvdyB1bmtub3duIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRocm91Z2hcbiAgfSxcbiAgaGFuZGxlcigpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH0sXG59O1xuXG5jb25zdCBjbGVhblVwTGl0ZXN0cmVhbUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnY2xlYW51cC1saXRlc3RyZWFtJyxcbiAgZGVzY3JpYmU6ICdDbGVhbiB1cCB0ZW1wb3JhbCBMaXRlc3RyZWFtIGZpbGVzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGNsZWFudXAtbGl0ZXN0cmVhbScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnL2V0Yy9saXRlc3RyZWFtLnltbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgY3JlYXRlTGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAnY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUnLFxuICBidWlsZGVyOiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoYWxsUHJvamVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ3JlYXRpbmcgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZvciBtdWx0aXBsZSBwcm9qZWN0cyBhdCBvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0aGV5IHdvdWxkIG92ZXJ3cml0ZSBlYWNoIG90aGVyLidcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY3JlYXRlLWxpdGVzdHJlYW0tY29uZmlnJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3QsIG9ybSwgYXJndi5vdXRwdXQpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6ICdBcHBseSBtaWdyYXRpb24gdG8gREIgd2l0aG91dCBpbml0aWFsaXppbmcgaXQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZGVwbG95JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZXBsb3lGb3JjZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95LWZvcmNlJyxcbiAgZGVzY3JpYmU6IFwiRm9yY2UgdG8gYXBwbHkgbWlncmF0aW9uIHRvIERCIHV0aWxpemluZyBMaXRlc3RyZWFtJ3MgYmFja3VwIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGl0XCIsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3ktZm9yY2UnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5kZXBsb3lGb3JjZShwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZ2VuZXJhdGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2dlbmVyYXRlJyxcbiAgZGVzY3JpYmU6ICdHZW5lcmF0ZSBPUk0gY2xpZW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgZ2VuZXJhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5nZW5lcmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBjb25maWc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIExpdGVzdHJlYW0gY29uZmlndXJhdGlvbiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBsaXN0QmFja3Vwc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpc3QtYmFja3VwcycsXG4gIGRlc2NyaWJlOiAnTGlzdCBMaXRlc3RyZWFtIGJhY2t1cHMnLFxuICBidWlsZGVyOiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGxpc3QtYmFja3VwcycsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmxpc3RCYWNrdXBzKHByb2plY3QsIGFyZ3YuY29uZmlnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbWlncmF0ZUJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdjaGVjay1pZGVtcG90ZW5jeSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgbWlncmF0aW9uIGNvbW1hbmQgdHdpY2UgdG8gY29uZmlybSBpdCBpcyBpZGVtcG90ZW50LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgbWlncmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgbWlncmF0ZUJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUnLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRoIGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXI6IG1pZ3JhdGVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnY2hlY2staWRlbXBvdGVuY3knXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvcm1TY3JpcHRzID0gZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24od2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIG9ybVNjcmlwdHMubWlncmF0ZShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGlmIChzaG91bGRDaGVja0lkZW1wb3RlbmN5KHByb2plY3QsIGFyZ3YuY2hlY2tJZGVtcG90ZW5jeSkpIHtcbiAgICAgICAgaWYgKGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3QpKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgaWRlbXBvdGVuY3kgY2hlY2sgZm9yICR7cHJvamVjdC5uYW1lfSBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50LmApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5kZXBsb3kocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICBhcmd2XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdDogUHJvamVjdCwgY2hlY2tJZGVtcG90ZW5jeTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tJZGVtcG90ZW5jeSA/PyBpc0RvY2tlckVuYWJsZWQocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGlzUHJvZHVjdGlvbkVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICdwcm9kdWN0aW9uJyk7XG59XG5cbmNvbnN0IG1pZ3JhdGVEZXZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ21pZ3JhdGUtZGV2JyxcbiAgZGVzY3JpYmU6ICdDcmVhdGUgYSBtaWdyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBtaWdyYXRlLWRldicsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLm1pZ3JhdGVEZXYocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXNldENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzZXQnLFxuICBkZXNjcmliZTogJ1Jlc2V0IERCJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHJlc2V0JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgICAvLyBGb3JjZSB0byByZXNldCB0ZXN0IGRhdGFiYXNlXG4gICAgaWYgKHByb2Nlc3MuZW52LldCX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBwcm9jZXNzLmVudi5XQl9FTlYgPSAndGVzdCc7XG4gICAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoXG4gICAgICAgICdXQl9FTlY9dGVzdCBkYiByZXNldCcsXG4gICAgICAgIGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpXG4gICAgICApKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkucmVzZXQocHJvamVjdCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3ZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXN0b3JlQnVpbGRlciA9IHtcbiAgLi4ubGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIsXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IHBhdGggb2YgdGhlIHJlc3RvcmVkIGRhdGFiYXNlLiBEZWZhdWx0cyB0byBcIjxkYnxkcml6emxlfHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlM1wiLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCByZXN0b3JlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiByZXN0b3JlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncmVzdG9yZScsXG4gIGRlc2NyaWJlOiBcIlJlc3RvcmUgREIgZnJvbSBMaXRlc3RyZWFtJ3MgYmFja3VwXCIsXG4gIGJ1aWxkZXI6IHJlc3RvcmVCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzdG9yZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXJndi5vdXRwdXQgPz8gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdCwgb3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXN0b3JlKHByb2plY3QsIG91dHB1dCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWVkQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgZmlsZToge1xuICAgIGFsaWFzOiAnZicsXG4gICAgZGVzY3JpcHRpb246ICdQYXRoIG9mIHRoZSBzZWVkIHNjcmlwdC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc2VlZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2VlZEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NlZWQnLFxuICBkZXNjcmliZTogJ1BvcHVsYXRlIERCIHdpdGggc2VlZCBkYXRhJyxcbiAgYnVpbGRlcjogc2VlZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzZWVkJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5zZWVkKHByb2plY3QsIGFyZ3YuZmlsZSkpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHN0dWRpb0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gICdkYi11cmwtb3ItcGF0aCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1VSTCBvciBwYXRoIHRvIHRoZSBkYXRhYmFzZScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIHJlc3RvcmVkOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIG9wZW4gdGhlIGRlZmF1bHQgcmVzdG9yZWQgZGF0YWJhc2UgKDxkYnxwcmlzbWE+L3Jlc3RvcmVkLnNxbGl0ZTMpLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3Qgc3R1ZGlvQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzdHVkaW9CdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdHVkaW8gW2RiLXVybC1vci1wYXRoXScsXG4gIGRlc2NyaWJlOiAnT3BlbiBkYXRhYmFzZSBzdHVkaW8nLFxuICBidWlsZGVyOiBzdHVkaW9CdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5yZXN0b3JlZCAmJiBhcmd2LmRiVXJsT3JQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVzdG9yZWQgYW5kIC0tZGItdXJsLW9yLXBhdGguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2LCBbJ2RiLXVybC1vci1wYXRoJywgJ3Jlc3RvcmVkJ10pO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgc3R1ZGlvJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICAvLyBSZXNvbHZlZCBhZ2FpbnN0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBiZWNhdXNlIHByaXNtYVNjcmlwdHMuc3R1ZGlvIHJlc29sdmVzIGEgcmVsYXRpdmVcbiAgICAgIC8vIHBhdGggYWdhaW5zdCB0aGUgQ0xJIHByb2Nlc3MgZGlyZWN0b3J5LCB3aGljaCBkaWZmZXJzIGZvciB3b3Jrc3BhY2UgZGVzY2VuZGFudHMuXG4gICAgICBjb25zdCBkYlVybE9yUGF0aCA9IGFyZ3YucmVzdG9yZWRcbiAgICAgICAgPyBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBwcm9qZWN0LnByaXNtYURpck5hbWUsICdyZXN0b3JlZC5zcWxpdGUzJylcbiAgICAgICAgOiBhcmd2LmRiVXJsT3JQYXRoPy50b1N0cmluZygpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICB3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuc3R1ZGlvKHByb2plY3QsIGRiVXJsT3JQYXRoLCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kQnVpbGRlciA9IHsgYXJnczogeyB0eXBlOiAnYXJyYXknIH0gfSBhcyBjb25zdDtcblxuY29uc3QgZGVmYXVsdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgZGVmYXVsdENvbW1hbmRCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICckMCA8YXJncy4uPicsXG4gIGRlc2NyaWJlOlxuICAgIFwiUGFzcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHRoZSBkZXRlY3RlZCBPUk0gYXMgaXMuIEFkZGl0aW9uYWwgUHJpc21hIGZsYWdzIGNhbiBhbHNvIGJlIGZvcndhcmRlZCBhZnRlciAnLS0nLlwiLFxuICBidWlsZGVyOiBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3Qgc2NyaXB0ID0gKGFyZ3YuYXJncz8uam9pbignICcpID8/ICcnKS50cmltRW5kKCk7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydhcmdzJ10pO1xuICAgIGNvbnN0IGZ1bGxDb21tYW5kID0gW3NjcmlwdCwgdW5rbm93bk9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKGBkYiAke2Z1bGxDb21tYW5kfWAsIGFsbFByb2plY3RzKSkge1xuICAgICAgY29uc3QgY29tbWFuZCA9IG9ybSA9PT0gJ3ByaXNtYScgPyBgUFJJU01BICR7ZnVsbENvbW1hbmR9YCA6IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgZnVsbENvbW1hbmQpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBjb21tYW5kKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBNYWtlIERyaXp6bGUgY29tbWFuZHMgd29yayBvbiBDbG91ZGZsYXJlIEQxIHByb2plY3RzIGJ5IHBvaW50aW5nIERBVEFCQVNFX1VSTFxuICogYXQgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqL1xuZnVuY3Rpb24gd2l0aExvY2FsRDFJZk5lZWRlZChvcm06IERhdGFiYXNlT3JtLCBwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvcm0gPT09ICdkcml6emxlJyA/IHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3QsIHNjcmlwdCkgOiBzY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSwgY29uZmlnUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGRiUGF0aCA9IGdldExpdGVzdHJlYW1EYlBhdGgocHJvamVjdCwgb3JtKTtcbiAgY29uc3QgcmVxdWlyZWRFbnZWYXJzID0ge1xuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRCxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUU6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9CVUNLRVRfTkFNRSxcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVksXG4gIH0gYXMgY29uc3Q7XG4gIGNvbnN0IG1pc3NpbmdFbnZWYXJzID0gT2JqZWN0LmVudHJpZXMocmVxdWlyZWRFbnZWYXJzKVxuICAgIC5maWx0ZXIoKFssIHZhbHVlXSkgPT4gIXZhbHVlKVxuICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICBpZiAobWlzc2luZ0VudlZhcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIExpdGVzdHJlYW06ICR7bWlzc2luZ0VudlZhcnMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGxpdGVzdHJlYW1Db25maWcgPSBgc25hcHNob3Q6XG4gIGludGVydmFsOiAyNGggICMgQ3JlYXRlIGEgYmFja3VwIHBlciBkYXlcbiAgcmV0ZW50aW9uOiA3MmggIyBLZWVwIGJhY2t1cHMgZm9yIDMgZGF5c1xuZGJzOlxuICAtIHBhdGg6ICR7ZGJQYXRofVxuICAgIGJ1c3ktdGltZW91dDogNXNcbiAgICBjaGVja3BvaW50LWludGVydmFsOiAxbVxuICAgIHJlcGxpY2E6XG4gICAgICB0eXBlOiBzM1xuICAgICAgZW5kcG9pbnQ6IGh0dHBzOi8vJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUR9LnIyLmNsb3VkZmxhcmVzdG9yYWdlLmNvbVxuICAgICAgYnVja2V0OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUV9XG4gICAgICBhY2Nlc3Mta2V5LWlkOiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDRVNTX0tFWV9JRH1cbiAgICAgIHNlY3JldC1hY2Nlc3Mta2V5OiAke3JlcXVpcmVkRW52VmFycy5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fU0VDUkVUX0FDQ0VTU19LRVl9XG4gICAgICBzeW5jLWludGVydmFsOiAxbVxuYDtcblxuICB0cnkge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgbGl0ZXN0cmVhbUNvbmZpZyk7XG4gICAgY29uc29sZS5pbmZvKGBHZW5lcmF0ZWQgJHtjb25maWdQYXRofWApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB3cml0ZSAke2NvbmZpZ1BhdGh9OiAke3JlYXNvbn1gLCB7XG4gICAgICBjYXVzZTogZXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFJlc3RvcmVPdXRwdXQocHJvamVjdDogUHJvamVjdCwgb3JtOiBEYXRhYmFzZU9ybSk6IHN0cmluZyB7XG4gIGlmIChvcm0gPT09ICdwcmlzbWEnKSByZXR1cm4gYCR7cHJvamVjdC5wcmlzbWFEaXJOYW1lfS9yZXN0b3JlZC5zcWxpdGUzYDtcbiAgcmV0dXJuICdkcml6emxlL3Jlc3RvcmVkLnNxbGl0ZTMnO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LnByaXNtYURpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcgZm9yIERyaXp6bGUgcmVxdWlyZXMgZmlsZTogREFUQUJBU0VfVVJMLicpO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmludGVyZmFjZSBEYXRhYmFzZU9ybVByb2plY3Qge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBvcm06IERhdGFiYXNlT3JtO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcm0/OiBEYXRhYmFzZU9ybSk6IFByb21pc2U8RGF0YWJhc2VPcm1Qcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAubWFwKChwcm9qZWN0KSA9PiAocHJvamVjdC5kYXRhYmFzZU9ybSA/IHsgcHJvamVjdCwgb3JtOiBwcm9qZWN0LmRhdGFiYXNlT3JtIH0gOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKHByb2plY3QpOiBwcm9qZWN0IGlzIERhdGFiYXNlT3JtUHJvamVjdCA9PiAhIXByb2plY3QgJiYgKCFvcm0gfHwgcHJvamVjdC5vcm0gPT09IG9ybSkpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQob3JtID8gYE5vICR7b3JtfSBwcm9qZWN0IGZvdW5kLmAgOiAnTm8gc3VwcG9ydGVkIGRhdGFiYXNlIE9STSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtOiBEYXRhYmFzZU9ybSk6IHR5cGVvZiBwcmlzbWFTY3JpcHRzIHwgdHlwZW9mIGRyaXp6bGVTY3JpcHRzIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ3ByaXNtYScgPyBwcmlzbWFTY3JpcHRzIDogZHJpenpsZVNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgcHJvamVjdHM6IERhdGFiYXNlT3JtUHJvamVjdFtdXG4pOiBHZW5lcmF0b3I8RGF0YWJhc2VPcm1Qcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IG9ybVByb2plY3RCeVByb2plY3QgPSBuZXcgTWFwKHByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gW3Byb2plY3QucHJvamVjdCwgcHJvamVjdF0pKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChcbiAgICBjb21tYW5kTmFtZSxcbiAgICBwcm9qZWN0cy5tYXAoKHsgcHJvamVjdCB9KSA9PiBwcm9qZWN0KVxuICApKSB7XG4gICAgY29uc3Qgb3JtUHJvamVjdCA9IG9ybVByb2plY3RCeVByb2plY3QuZ2V0KHByb2plY3QpO1xuICAgIGlmICghb3JtUHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGV0ZWN0IGRhdGFiYXNlIE9STSBmb3IgJHtwcm9qZWN0Lm5hbWV9LmApO1xuXG4gICAgeWllbGQgb3JtUHJvamVjdDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIE9STSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgc2VsZWN0Rm5veFNvdXJjZWRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvZW52U291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG4vLyBSYWlsd2F5IGluamVjdHMgaXRzIG93biBzeXN0ZW0gdmFyaWFibGVzIGFuZCBwbGF0Zm9ybS1tYW5hZ2VkIHZhbHVlczsgbmV2ZXIgbWlycm9yIHRob3NlIGJhY2ssXG4vLyBhbmQgc2tpcCBsb2NhbC1vbmx5IGtleXMuIEFwcCB2YXJpYWJsZXMgKGluY2x1ZGluZyBEQVRBQkFTRV9VUkwsIFBPUlQpIHN0YXkgZWxpZ2libGUgYmVjYXVzZVxuLy8gZm5veCBpcyB0aGUgc291cmNlIG9mIHRydXRoIOKAlCBhIHJlcG8gdGhhdCBtdXN0IE5PVCBvd24gYSB2YWx1ZSAoZS5nLiBhIFJhaWx3YXkgcmVmZXJlbmNlXG4vLyB2YXJpYWJsZSBwb2ludGluZyBhdCBhIGxpbmtlZCBkYXRhYmFzZSBzZXJ2aWNlKSBzaW1wbHkga2VlcHMgaXQgb3V0IG9mIGZub3guXG5jb25zdCBOT05fUkFJTFdBWV9LRVlTID0gbmV3IFNldChbJ0NJJ10pO1xuY29uc3QgTk9OX1JBSUxXQVlfS0VZX1BSRUZJWEVTID0gWydSQUlMV0FZXycsICdOSVhQQUNLU18nXTtcblxuZnVuY3Rpb24gaXNOb25SYWlsd2F5S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fUkFJTFdBWV9LRVlTLmhhcyhrZXkpIHx8IE5PTl9SQUlMV0FZX0tFWV9QUkVGSVhFUy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHZhcmlhYmxlcyB0byBwdXNoIHRvIFJhaWx3YXkgZnJvbSBhIHJlc29sdmVkIGVudmlyb25tZW50OiBkcm9wIGVtcHR5L3VuZGVmaW5lZCB2YWx1ZXNcbiAqIChzbyBhIGBLRVk9YCBwbGFjZWhvbGRlciBuZXZlciBibGFua3MgYSByZWFsIFJhaWx3YXkgdmFyaWFibGUpIGFuZCBSYWlsd2F5LW1hbmFnZWQga2V5cywgc29ydGVkXG4gKiBmb3IgYSBzdGFibGUgY29tbWFuZCBhbmQgbG9nIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBbc3RyaW5nLCBzdHJpbmddW10ge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIHN0cmluZ10gPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycgJiYgIWlzTm9uUmFpbHdheUtleShrZXkpO1xuICAgIH0pXG4gICAgLnRvU29ydGVkKChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBSYWlsd2F5RW52Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8UmFpbHdheUVudkNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IHJhaWx3YXlFbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICdyYWlsd2F5LWVudicsXG4gIGRlc2NyaWJlOlxuICAgICdTeW5jIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVjbGFyZWQgZm9yIHRoZSBjdXJyZW50IFdCX0VOViAocmVzb2x2ZWQgZnJvbSBmbm94KSB0byB0aGUgUmFpbHdheSBzZXJ2aWNlLCBrZWVwaW5nIGZub3ggdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGguIFJhaWx3YXktbWFuYWdlZCBrZXlzIChSQUlMV0FZXyosIE5JWFBBQ0tTXyosIENJKSBhcmUgbmV2ZXIgcHVzaGVkLicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PFJhaWx3YXlFbnZDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndjogUmFpbHdheUVudkNvbW1hbmRBcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZW52TmFtZSA9IHByb2plY3QuZW52LldCX0VOVjtcbiAgICBpZiAoIWVudk5hbWUgfHwgZW52TmFtZSA9PT0gJ2RldmVsb3BtZW50JyB8fCBlbnZOYW1lID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgV0JfRU5WIG11c3QgbmFtZSBhIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24pLCBidXQgaXMgJHtlbnZOYW1lfS5gKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBSZXN0cmljdCB0byB2YXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhlIHByb2plY3QncyBmbm94IHNvdXJjZXM7IGlnbm9yZSBwcm9jZXNzLmVudiBzb1xuICAgIC8vIFJhaWx3YXkncyBvd24gaW5qZWN0ZWQgdmFyaWFibGVzIG5ldmVyIGxlYWsgaW4uIFRoZSBlZmZlY3RpdmUgdmFsdWVzIGNvbWUgZnJvbSBwcm9qZWN0LmVudlxuICAgIC8vIChmbm94LXJlc29sdmVkIGZvciBXQl9FTlYpLiBNaXJyb3JzIHdiIGRlcGxveS5cbiAgICBjb25zdCBbZW52VmFycywgZW52U291cmNlc10gPSByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgcHJvamVjdC5kaXJQYXRoLCB7IGlnbm9yZVByb2Nlc3NFbnY6IHRydWUgfSk7XG4gICAgLy8gYG1pc2UgZW52YCBpcyByZXBvcnRlZCBhcyBhIHBzZXVkby1zb3VyY2UgdGhhdCBtaXhlcyBpbiBob3N0L3Rvb2wgdmFyaWFibGVzIHN1Y2ggYXMgUEFUSCBhbmRcbiAgICAvLyBDQVJHT19IT01FOyB0aG9zZSBtdXN0IG5ldmVyIGJlIHB1c2hlZCB0byBSYWlsd2F5LCBzbyBrZWVwIG9ubHkgZm5veC1kZWNsYXJlZCBrZXlzLlxuICAgIGNvbnN0IGZub3hLZXlzID0gc2VsZWN0Rm5veFNvdXJjZWRLZXlzKGVudlNvdXJjZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBpZiAoIWZub3hLZXlzLmhhcyhrZXkpKSBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgICAvLyBFeHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2luIG92ZXIgY29uZmlndXJlZCB2YWx1ZXMgKG1hdGNoZXMgd2IgZGVwbG95IC8gZ2VuLWRldi12YXJzKS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSBwcm9qZWN0LmVudltrZXldO1xuICAgICAgaWYgKGVmZmVjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBzZWxlY3RSYWlsd2F5VmFyaWFibGVzKGVudlZhcnMpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnTm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHN5bmMgdG8gUmFpbHdheS4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5TmFtZXMgPSBlbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oYFdvdWxkIHN5bmMgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgUmFpbHdheSBDTEkgcmVhZHMgYXV0aCAoUkFJTFdBWV9BUElfVE9LRU4pIGFuZCBkZWZhdWx0cyBmcm9tIHRoZSBlbnZpcm9ubWVudDsgcGFzcyB0aGVcbiAgICAvLyBwcm9qZWN0L3NlcnZpY2UvZW52aXJvbm1lbnQgZXhwbGljaXRseSB3aGVuIGF2YWlsYWJsZSBzbyB0aGUgY29tbWFuZCB3b3JrcyB1bmF0dGVuZGVkIGluIENJLlxuICAgIGNvbnN0IGNvbnRleHRBcmdzOiBzdHJpbmdbXSA9IFsnLS1za2lwLWRlcGxveXMnXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuUkFJTFdBWV9QUk9KRUNUX0lEKSBjb250ZXh0QXJncy5wdXNoKGAtLXByb2plY3Q9JHtwcm9jZXNzLmVudi5SQUlMV0FZX1BST0pFQ1RfSUR9YCk7XG4gICAgaWYgKHByb2Nlc3MuZW52LlJBSUxXQVlfU0VSVklDRV9JRCkgY29udGV4dEFyZ3MucHVzaChgLS1zZXJ2aWNlPSR7cHJvY2Vzcy5lbnYuUkFJTFdBWV9TRVJWSUNFX0lEfWApO1xuICAgIGNvbnRleHRBcmdzLnB1c2goYC0tZW52aXJvbm1lbnQ9JHtlbnZOYW1lfWApO1xuICAgIGNvbnN0IHNldEFyZ3MgPSBlbnRyaWVzLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4gWyctLXNldCcsIGAke2tleX09JHt2YWx1ZX1gXSk7XG5cbiAgICAvLyBzdGRpbzogJ3BpcGUnIGtlZXBzIHRoZSBSYWlsd2F5IENMSSdzIHZhcmlhYmxlIGxpc3RpbmcgKHdoaWNoIGVjaG9lcyB2YWx1ZXMpIG91dCBvZiBDSSBsb2dzO1xuICAgIC8vIHRoaXMgY29tbWFuZCBvbmx5IGV2ZXIgcHJpbnRzIGtleSBuYW1lcywgbmV2ZXIgdmFsdWVzLlxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoJ2J1bngnLCBbJ0ByYWlsd2F5L2NsaScsICd2YXJpYWJsZXMnLCAuLi5jb250ZXh0QXJncywgLi4uc2V0QXJnc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYEZhaWxlZCB0byBzeW5jIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBSYWlsd2F5IChleGl0ICR7cmV0LnN0YXR1c30pLiBLZXlzOiAke2tleU5hbWVzLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTeW5jZWQgJHtlbnRyaWVzLmxlbmd0aH0gdmFyaWFibGUocykgdG8gUmFpbHdheSAoJHtlbnZOYW1lfSk6ICR7a2V5TmFtZXMuam9pbignLCAnKX1gKSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG50eXBlIFJlbGVhc2VBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gIGFyZ3M/OiB1bmtub3duW107XG4gICctLSc/OiB1bmtub3duW107XG59O1xuXG5leHBvcnQgY29uc3QgcmVsZWFzZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdyZWxlYXNlIFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgJ1J1biBzZW1hbnRpYy1yZWxlYXNlIChvciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlKSBzbyB0aGF0IHJlcG9zaXRvcmllcyB1c2luZyBCdW4gaXNvbGF0ZWQgaW5zdGFsbHMgY2FuIHB1Ymxpc2ggdG8gbnBtOiAnICtcbiAgICBcInJlaW5zdGFsbCB3aXRoIHRoZSBob2lzdGVkIGxpbmtlciAobnBtIGNhbm5vdCB3YWxrIEJ1bidzIGlzb2xhdGVkIG5vZGVfbW9kdWxlcyBsYXlvdXQpLCBcIiArXG4gICAgJ3Jld3JpdGUgYHdvcmtzcGFjZTpgIHJhbmdlcyBucG0gY2Fubm90IHBhcnNlLCBydW4gdGhlIHJlbGVhc2UsIHRoZW4gcmVzdG9yZSB0aGUgbW9kaWZpZWQgZmlsZXMuICcgK1xuICAgICdFeHRyYSBhcmd1bWVudHMgKGUuZy4gYC0tZGVidWdgLCBhZnRlciBgLS1gKSBhcmUgZm9yd2FyZGVkIHRvIHRoZSByZWxlYXNlIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCByZWxlYXNlKGFyZ3YgYXMgUmVsZWFzZUFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2UoYXJndjogUmVsZWFzZUFyZ3YsIHByb2plY3RQYXRoRm9yVGVzdGluZz86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyBzZW1hbnRpYy1yZWxlYXNlIG11c3QgcnVuIGF0IHRoZSByZXBvc2l0b3J5IHJvb3Q6IGl0IHJlYWRzIHRoZSBnaXQgcmVwbyBhbmQsIGZvciBtb25vcmVwb3MsXG4gIC8vIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugd2Fsa3MgdGhlIHdvcmtzcGFjZXMgaXRzZWxmLlxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdHMucm9vdDtcblxuICAvLyBNYXBzIGEgbXV0YXRlZCBmaWxlIHRvIGl0cyBwcmUtcmVsZWFzZSBjb250ZW50IChyYXcgYnl0ZXMg4oCUIGJ1bi5sb2NrYiBpcyBiaW5hcnkpOyBgdW5kZWZpbmVkYFxuICAvLyBtYXJrcyBhIGZpbGUgdGhhdCBkaWQgbm90IGV4aXN0IGFuZCBtdXN0IGJlIGRlbGV0ZWQgb24gcmVzdG9yZSAoZS5nLiBhIGNyZWF0ZWQgbG9ja2ZpbGUpLlxuICBjb25zdCBtb2RpZmllZEZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4oKTtcbiAgLy8gV2l0aCBhIGhhbmRsZXIgaW5zdGFsbGVkLCBTSUdJTlQvU0lHVEVSTSBubyBsb25nZXIgdGVybWluYXRlIHRoaXMgcHJvY2Vzcywgc28gdGhlXG4gIC8vIGZpbmFsbHktcmVzdG9yZSBhbHdheXMgZXhlY3V0ZXMgYW5kIHRoZSBzaWduYWwgaXMgcmUtcmFpc2VkIGFmdGVyd2FyZHMuIFRoZSBoYW5kbGVyIGFsc29cbiAgLy8gRk9SV0FSRFMgdGhlIHNpZ25hbCB0byB0aGUgcnVubmluZyBjaGlsZDogY2hpbGRyZW4gYXJlIHNwYXduZWQgYXN5bmNocm9ub3VzbHkgKG5ldmVyXG4gIC8vIHNwYXduU3luYywgd2hpY2ggd291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AgYW5kIGRlZmVyIHRoZSBoYW5kbGVyIHVudGlsIGFmdGVyIHRoZSBjaGlsZCDigJRcbiAgLy8gYW5kIGEgcHVibGlzaCDigJQgY29tcGxldGVkKSwgc28gYSBzaWduYWwgdGFyZ2V0ZWQgYXQgdGhpcyBwcm9jZXNzIGFsb25lIHN0aWxsIGNhbmNlbHMgdGhlXG4gIC8vIGNoaWxkIHByb21wdGx5LlxuICBsZXQgcmVjZWl2ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBjb25zdCBhY3RpdmVDaGlsZDogQWN0aXZlQ2hpbGRSZWYgPSB7IGN1cnJlbnQ6IHVuZGVmaW5lZCB9O1xuICBjb25zdCBzaWduYWxIYW5kbGVyID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICByZWNlaXZlZFNpZ25hbCA9IHNpZ25hbDtcbiAgICAvLyB0cmVlS2lsbCAobm90IGNoaWxkLmtpbGwpOiBzZW1hbnRpYy1yZWxlYXNlIGFuZCBidW4gaW5zdGFsbCBzcGF3biB0aGVpciBvd24gc3VicHJvY2Vzc2VzXG4gICAgLy8gKG5wbSBwdWJsaXNoLCBnaXQgcHVzaCwgLi4uKSwgd2hpY2ggbXVzdCBub3Qga2VlcCBwdWJsaXNoaW5nIGFmdGVyIHdiIHJlcG9ydHMgY2FuY2VsbGF0aW9uLlxuICAgIC8vIHRyZWVLaWxsIFRIUk9XUyAobWlzc2luZy90aW1pbmctb3V0IGBwc2AsIEVQRVJNKSwgYW5kIGFuIGV4Y2VwdGlvbiBlc2NhcGluZyBhIHNpZ25hbFxuICAgIC8vIGxpc3RlbmVyIHdvdWxkIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyBhbmQgc2tpcCB0aGUgcmVzdG9yaW5nIGZpbmFsbHkg4oCUIHNvIGRlZ3JhZGUgdG9cbiAgICAvLyBraWxsaW5nIHRoZSBkaXJlY3QgY2hpbGQgaW5zdGVhZC5cbiAgICB0cnkge1xuICAgICAgaWYgKGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LnBpZCkgdHJlZUtpbGwoYWN0aXZlQ2hpbGQuY3VycmVudC5waWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gdGVybWluYXRlIHRoZSByZWxlYXNlIGNoaWxkIHByb2Nlc3MgdHJlZTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQ/LmtpbGwoc2lnbmFsKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGd1YXJkZWRTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID0gWydTSUdJTlQnLCAnU0lHVEVSTSddO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBndWFyZGVkU2lnbmFscykgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuXG4gIGxldCBleGl0Q29kZSA9IDA7XG4gIGxldCByZWxlYXNlUmFuU3VjY2Vzc2Z1bGx5ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IHJlbGVhc2VQdWJsaXNoZXNUb05wbShwcm9qZWN0KSkge1xuICAgICAgYXdhaXQgcHJlcGFyZU5wbUNvbXBhdGlibGVMYXlvdXQocHJvamVjdCwgYXJndiwgbW9kaWZpZWRGaWxlcywgYWN0aXZlQ2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgaG9pc3RlZCByZWluc3RhbGwgYW5kIHdvcmtzcGFjZS1yYW5nZSByZXdyaXRlIGV4aXN0IHNvbGVseSBzbyBucG0gKHdoaWNoIHRoZVxuICAgICAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW4gZGlnZXN0IHRoZSBjaGVja291dDsgd2l0aG91dCB0aGF0IHBsdWdpblxuICAgICAgLy8gdGhlIHJlbGVhc2UgcnVucyBkaXJlY3RseSBvbiB0aGUgaXNvbGF0ZWQgbGF5b3V0IChpc3N1ZSAjMTAwMCkuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgJ1NraXBwaW5nIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBiZWNhdXNlIHRoZSBzZW1hbnRpYy1yZWxlYXNlIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgaW5jbHVkZSBAc2VtYW50aWMtcmVsZWFzZS9ucG0uJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBBIHNpZ25hbCBtYXkgaGF2ZSBhcnJpdmVkIGJldHdlZW4gY2hpbGRyZW4gKG5vdGhpbmcgdG8gZm9yd2FyZCB0byBhdCB0aGF0IGluc3RhbnQpLCBzbyBpdFxuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBleHBsaWNpdGx5IGJlZm9yZSBhbnl0aGluZyBwdWJsaXNoZXMuXG4gICAgaWYgKHJlY2VpdmVkU2lnbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFib3J0ZWQgYnkgJHtyZWNlaXZlZFNpZ25hbH0gYmVmb3JlIHJ1bm5pbmcgdGhlIHJlbGVhc2UuYCk7XG4gICAgfVxuICAgIGV4aXRDb2RlID0gYXdhaXQgcnVuU2VtYW50aWNSZWxlYXNlKHByb2plY3QsIGFyZ3YsIGFjdGl2ZUNoaWxkKTtcbiAgICAvLyBSZWNvcmRlZCBzZXBhcmF0ZWx5IGZyb20gcmVjZWl2ZWRTaWduYWw6IGEgc2lnbmFsIGFycml2aW5nIEFGVEVSIGEgc3VjY2Vzc2Z1bCBwdWJsaXNoIG11c3RcbiAgICAvLyBub3QgZGVtb3RlIHRoZSByZXN0b3JlIHRvIGJ5dGUtZm9yLWJ5dGUgKHRoYXQgd291bGQgcmV2ZXJ0IHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBidW1wcykuXG4gICAgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSA9IGV4aXRDb2RlID09PSAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEVycm9ycyBtdXN0IHVud2luZCB0aHJvdWdoIHRoaXMgdHJ5IChuZXZlciBgcHJvY2Vzcy5leGl0YCBpbnNpZGUgaXQpOiB0aGUgcmVzdG9yZSBiZWxvdyBpc1xuICAgIC8vIHRoZSBvbmx5IHRoaW5nIHRoYXQgdW5kb2VzIHRoZSBidW5maWcvcGFja2FnZS5qc29uIG11dGF0aW9ucy5cbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICBleGl0Q29kZSA9IDE7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gT24gZmFpbHVyZSBvciBpbnRlcnJ1cHRpb24sIHJlc3RvcmUgYnl0ZS1mb3ItYnl0ZTogc2VtYW50aWMtcmVsZWFzZSBtYXkgaGF2ZSBsZWZ0IFBBUlRJQUxcbiAgICAvLyBlZGl0cyAoZS5nLiBhIHZlcnNpb24gYnVtcCB3aXRob3V0IGEgcHVibGlzaCksIHdoaWNoIG11c3Qgbm90IHN1cnZpdmUuIFRoZSBzZW1hbnRpY1xuICAgIC8vIHdvcmtzcGFjZS1yYW5nZSByZXN0b3JlIGlzIHJlc2VydmVkIGZvciBhIHN1Y2Nlc3NmdWwgcmVsZWFzZS5cbiAgICBjb25zdCByZXN0b3JlZEZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2YgbW9kaWZpZWRGaWxlcykge1xuICAgICAgaWYgKHJlc3RvcmVNb2RpZmllZEZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkpKSByZXN0b3JlZEZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKHJlc3RvcmVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihgUmVzdG9yZWQgJHtyZXN0b3JlZEZpbGVQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBwKSkuam9pbignLCAnKX0uYClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFRoZSBoaW50IGFwcGxpZXMgb25seSB3aGVuIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBhY3R1YWxseSByYW47IGJ1bmZpZy50b21sIGlzIHNuYXBzaG90dGVkXG4gICAgLy8gZXhhY3RseSBpbiB0aGF0IGJyYW5jaC5cbiAgICBjb25zdCByZWluc3RhbGxlZFdpdGhIb2lzdGVkTGlua2VyID0gWy4uLm1vZGlmaWVkRmlsZXMua2V5cygpXS5zb21lKFxuICAgICAgKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2J1bmZpZy50b21sJ1xuICAgICk7XG4gICAgaWYgKHJlaW5zdGFsbGVkV2l0aEhvaXN0ZWRMaW5rZXIgJiYgIWlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAnbm9kZV9tb2R1bGVzIG5vdyB1c2VzIHRoZSBob2lzdGVkIGxheW91dDsgcnVuIGEgY2xlYW4gcmVpbnN0YWxsIChgcm0gLXJmIG5vZGVfbW9kdWxlcyBwYWNrYWdlcy8qL25vZGVfbW9kdWxlcyAmJiBidW4gaW5zdGFsbGApIHRvIHJlc3RvcmUgdGhlIGlzb2xhdGVkIGxheW91dC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGd1YXJkZWRTaWduYWxzKSBwcm9jZXNzLm9mZihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICB9XG4gIGlmIChyZWNlaXZlZFNpZ25hbCkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgcmVjZWl2ZWRTaWduYWwpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBBY3RpdmVDaGlsZFJlZiB7XG4gIGN1cnJlbnQ6IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNwYXduIGFzeW5jaHJvbm91c2x5IGFuZCBhd2FpdCB0aGUgZXhpdCBzdGF0dXMuIFRoZSBldmVudCBsb29wIHN0YXlzIGZyZWUsIHNvIHBhcmVudC1vbmx5XG4gKiBzaWduYWxzIGFyZSBoYW5kbGVkIHByb21wdGx5IGFuZCBmb3J3YXJkZWQgdG8gdGhlIGNoaWxkIGJ5IHJlbGVhc2UoKSdzIHNpZ25hbCBoYW5kbGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBzcGF3bkFuZFdhaXQoXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZixcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogY2hpbGRfcHJvY2Vzcy5TcGF3bk9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSBjaGlsZDtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IpKSk7XG4gICAgICByZXNvbHZlKDEpO1xuICAgIH0pO1xuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKGNvZGUgPz8gMSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbGVhc2UgY2FuIHB1Ymxpc2ggdG8gbnBtLiBUcnVlIHVubGVzcyBhIHBsdWdpbiBsaXN0IGlzIGV4cGxpY2l0bHkgY29uZmlndXJlZFxuICogKGluIGEgSlNPTi1wYXJzZWFibGUgc291cmNlKSBhbmQgb21pdHMgYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgZXZlcnl3aGVyZSBpbiBzY29wZSDigJQgdGhlIHJvb3RcbiAqIGFuZCwgZm9yIG11bHRpLXNlbWFudGljLXJlbGVhc2UgbW9ub3JlcG9zLCBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlIChhIHBhY2thZ2UtbGV2ZWwgcGx1Z2luIGxpc3RcbiAqIG92ZXJyaWRlcyB0aGUgcm9vdCdzKS4gc2VtYW50aWMtcmVsZWFzZSdzIERFRkFVTFQgcGx1Z2luIGxpc3QgaW5jbHVkZXMgdGhlIG5wbSBwbHVnaW4sIHNvIGFcbiAqIG1pc3NpbmcgcGx1Z2luIGxpc3QsIGEgbm9uLUpTT04gY29uZmlnIGZpbGUsIG9yIGFuIGBleHRlbmRzYCBwcmVzZXQgY29uc2VydmF0aXZlbHkga2VlcHMgdGhlXG4gKiBucG0gcHJlcGFyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxlYXNlUHVibGlzaGVzVG9OcG0oXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uJyB8ICd1c2VzQnVuUGFja2FnZU1hbmFnZXInPlxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJvb3RQbHVnaW5zID0gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyhwcm9qZWN0LmRpclBhdGgsIHByb2plY3QucGFja2FnZUpzb24pO1xuICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJvb3QgcGx1Z2luIGxpc3QsIHNlbWFudGljLXJlbGVhc2UncyBkZWZhdWx0IGxpc3QgKG5wbSBpbmNsdWRlZCkgYXBwbGllcy5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHJvb3RQbHVnaW5zKSB8fCBwbHVnaW5zSW5jbHVkZU5wbShyb290UGx1Z2lucykpIHJldHVybiB0cnVlO1xuXG4gIGZvciAoY29uc3QgcGFja2FnZURpclBhdGggb2YgYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IHJlYWRFeHBsaWNpdFNlbWFudGljUmVsZWFzZVBsdWdpbnMocGFja2FnZURpclBhdGgsIHVuZGVmaW5lZCk7XG4gICAgLy8gQSB3b3Jrc3BhY2UgcGFja2FnZSB3aXRob3V0IGl0cyBvd24gcGx1Z2luIGxpc3QgaW5oZXJpdHMgdGhlIHJvb3QncyAobnBtLWZyZWUpIGRlY2lzaW9uLlxuICAgIGlmIChwbHVnaW5zID09PSAndW5rbm93bicgfHwgKEFycmF5LmlzQXJyYXkocGx1Z2lucykgJiYgcGx1Z2luc0luY2x1ZGVOcG0ocGx1Z2lucykpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBsdWdpbnNJbmNsdWRlTnBtKHBsdWdpbnM6IHJlYWRvbmx5IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGx1Z2lucy5zb21lKChwbHVnaW4pID0+IChBcnJheS5pc0FycmF5KHBsdWdpbikgPyBwbHVnaW5bMF0gOiBwbHVnaW4pID09PSAnQHNlbWFudGljLXJlbGVhc2UvbnBtJyk7XG59XG5cbi8qKlxuICogY29zbWljb25maWcgOSdzIGRlZmF1bHQgc2VhcmNoUGxhY2VzIG9yZGVyIGZvciBtb2R1bGUgXCJyZWxlYXNlXCIgKHdoYXQgc2VtYW50aWMtcmVsZWFzZSAyNVxuICogZGVsZWdhdGVzIHRvKSwgbWludXMgdGhlIGxlYWRpbmcgcGFja2FnZS5qc29uIGVudHJ5LCB3aGljaCB0aGUgY2FsbGVyIGNoZWNrcyBmaXJzdC4gVGhlIEZJUlNUXG4gKiBleGlzdGluZyBwbGFjZSB3aW5zOyBwbGFjZXMgd2hvc2UgZm9ybWF0IEpTT04ucGFyc2UgY2Fubm90IHJlYWQgbWFrZSB0aGUgZWZmZWN0aXZlIHBsdWdpblxuICogbGlzdCAndW5rbm93bicuXG4gKi9cbmNvbnN0IHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlczogeyBmaWxlTmFtZTogc3RyaW5nOyBqc29uUGFyc2VhYmxlOiBib29sZWFuIH1bXSA9IFtcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMnLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzb24nLCBqc29uUGFyc2VhYmxlOiB0cnVlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55bWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuY2pzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnlhbWwnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAnLmNvbmZpZy9yZWxlYXNlcmMueW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLnRzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5jb25maWcvcmVsZWFzZXJjLm1qcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcuY29uZmlnL3JlbGVhc2VyYy5janMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcudHMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcubWpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmNqcycsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG5dO1xuXG5mdW5jdGlvbiByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZFxuKTogcmVhZG9ubHkgdW5rbm93bltdIHwgdW5kZWZpbmVkIHwgJ3Vua25vd24nIHtcbiAgLy8gY29zbWljb25maWcgc2VhcmNoZXMgcGFja2FnZS5qc29uJ3MgYHJlbGVhc2VgIGtleSBCRUZPUkUgYW55IHJjL2NvbmZpZyBmaWxlOyBhIG1pc3Npbmcgb3JcbiAgLy8gdW5yZWFkYWJsZSBwYWNrYWdlLmpzb24ganVzdCBmYWxscyB0aHJvdWdoIHRvIHRoZSBmaWxlIHNlYXJjaCBwbGFjZXMuXG4gIGlmIChwYWNrYWdlSnNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgfSBjYXRjaCB7XG4gICAgICBwYWNrYWdlSnNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgbGV0IGNvbmZpZyA9IChwYWNrYWdlSnNvbiBhcyB7IHJlbGVhc2U/OiB7IHBsdWdpbnM/OiB1bmtub3duOyBleHRlbmRzPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZWxlYXNlO1xuICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSBjb250aW51ZTtcbiAgICAgIGlmICghanNvblBhcnNlYWJsZSkgcmV0dXJuICd1bmtub3duJztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4JykpIGFzIHR5cGVvZiBjb25maWc7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnBsdWdpbnMpKSByZXR1cm4gY29uZmlnLnBsdWdpbnM7XG4gIC8vIEFuIGBleHRlbmRzYCBwcmVzZXQgbWF5IGNvbnRyaWJ1dGUgaXRzIG93biBwbHVnaW4gbGlzdCwgd2hpY2ggY2Fubm90IGJlIHJlc29sdmVkIHN0YXRpY2FsbHkuXG4gIHJldHVybiBjb25maWcuZXh0ZW5kcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE1ha2UgdGhlIGNoZWNrb3V0IGRpZ2VzdGlibGUgZm9yIG5wbSwgd2hpY2ggc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0byBmb3JcbiAqIGBucG0gdmVyc2lvbmAgLyBgbnBtIHB1Ymxpc2hgOlxuICogMS4gbnBtJ3MgYXJib3Jpc3QgY2Fubm90IHdhbGsgQnVuJ3MgSVNPTEFURUQgbm9kZV9tb2R1bGVzIGxheW91dCAodGhlIGAuYnVuYCBzeW1saW5rIGZhcm0pLCBzb1xuICogICAgY2xlYW4tcmVpbnN0YWxsIHdpdGggdGhlIGhvaXN0ZWQgbGlua2VyIGZpcnN0LiBBIG5vbi1jbGVhbiBsaW5rZXIgc3dpdGNoIHdvdWxkIGxlYXZlIHN0YWxlXG4gKiAgICBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVoaW5kIChwYWNrYWdlcyB0aGVuIHJlc29sdmUgZnJvbSB+Ly5idW4vaW5zdGFsbC9jYWNoZS9saW5rcyB3aGVyZVxuICogICAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgYXJlIHVucmVhY2hhYmxlKSwgc28gZXZlcnkgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBpcyB3aXBlZCBmaXJzdC5cbiAqIDIuIG5wbSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlIEJ1biBSRVFVSVJFUyB0aGUgcHJvdG9jb2wgc28gYSBjb2xkIGluc3RhbGxcbiAqICAgIGxpbmtzIHRoZSB3b3Jrc3BhY2Ug4oCUIHNvIHJld3JpdGUgdGhlIHJhbmdlcyB0byBgKmAgQUZURVIgdGhlIHJlaW5zdGFsbCAoQnVuIG11c3Qgc3RpbGwgc2VlXG4gKiAgICB0aGUgcHJvdG9jb2wgd2hpbGUgaW5zdGFsbGluZzsgbnBtIG9ubHkgbmVlZHMgdGhlIG1hbmlmZXN0IFRFWFQgdG8gYmUgcGFyc2VhYmxlKS4gVGhlXG4gKiAgICBhZmZlY3RlZCBtYW5pZmVzdHMgYXJlIHByaXZhdGUvdW5wdWJsaXNoZWQgb3IgcmV3cml0dGVuIGJ5IHRoZSBucG0gcGx1Z2luIG9uIHB1Ymxpc2guXG4gKiBBbGwgbXV0YXRpb25zIGFyZSByZXN0b3JlZCBieSB0aGUgY2FsbGVyIGFmdGVyIHRoZSByZWxlYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlTnBtQ29tcGF0aWJsZUxheW91dChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUmVsZWFzZUFyZ3YsXG4gIG1vZGlmaWVkRmlsZXM6IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4sXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJ1bmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgY29uc3QgYnVuZmlnID0gZnMuZXhpc3RzU3luYyhidW5maWdQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhidW5maWdQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICBjb25zdCBob2lzdGVkQnVuZmlnID0gYnVuZmlnID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBidWlsZEhvaXN0ZWRCdW5maWcoYnVuZmlnKTtcbiAgaWYgKGJ1bmZpZyAhPT0gdW5kZWZpbmVkICYmIGhvaXN0ZWRCdW5maWcgIT09IGJ1bmZpZykge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKCdDbGVhbi1yZWluc3RhbGxpbmcgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgc28gbnBtIGNhbiB3YWxrIG5vZGVfbW9kdWxlcy4uLicpKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBtb2RpZmllZEZpbGVzLnNldChidW5maWdQYXRoLCBCdWZmZXIuZnJvbShidW5maWcsICd1dGY4JykpO1xuICAgICAgLy8gVGhlIGhvaXN0ZWQgcmVpbnN0YWxsIG1heSByZXdyaXRlIChvciBjcmVhdGUpIHRoZSBsb2NrZmlsZTsgc25hcHNob3QgdGhlIHJhdyBieXRlcyBzbyBhXG4gICAgICAvLyBzdWNjZXNzZnVsIHJlbGVhc2UgbGVhdmVzIG5vIHRyYWNrZWQgb3IgdW50cmFja2VkIGxvY2tmaWxlIGNoYW5nZXMgYmVoaW5kLlxuICAgICAgZm9yIChjb25zdCBsb2NrRmlsZU5hbWUgb2YgWydidW4ubG9jaycsICdidW4ubG9ja2InXSkge1xuICAgICAgICBjb25zdCBsb2NrRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBsb2NrRmlsZU5hbWUpO1xuICAgICAgICBtb2RpZmllZEZpbGVzLnNldChsb2NrRmlsZVBhdGgsIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhsb2NrRmlsZVBhdGgpIDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoYnVuZmlnUGF0aCwgaG9pc3RlZEJ1bmZpZyA/PyAnJywgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBbcHJvamVjdC5kaXJQYXRoLCAuLi4oYXdhaXQgZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3QpKV0ubWFwKChkaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLmpvaW4oZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBub2RlTW9kdWxlc0RpclBhdGggb2Ygbm9kZU1vZHVsZXNEaXJQYXRocykge1xuICAgICAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICAvLyBSZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGxpZmVjeWNsZSBzY3JpcHRzIERJU0FCTEVEIHdoaWxlIHRoZSByZWxlYXNlIGNyZWRlbnRpYWxzXG4gICAgICAvLyAoVkVSREFDQ0lPX1RPS0VOLCBOUE1fVE9LRU4sIEdJVEhVQl9UT0tFTiwgRk5PWF9BR0VfS0VZLCAuLi4pIGFyZSBpbiB0aGUgZW52aXJvbm1lbnQsXG4gICAgICAvLyBzbyByZXBvc2l0b3J5LSBvciBkZXBlbmRlbmN5LWRlZmluZWQgcHJlaW5zdGFsbC9wb3N0aW5zdGFsbCBjYW4gbmV2ZXIgcmVhZCB0aGVtIOKAlFxuICAgICAgLy8gbWlycm9yaW5nIHJldXNhYmxlLXdvcmtmbG93cycgdHdvLXN0ZXAgcmVsZWFzZSBpbnN0YWxsIChpc3N1ZSAjMTAwMykuXG4gICAgICBjb25zdCBpbnN0YWxsU3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJywgJy0taWdub3JlLXNjcmlwdHMnXSwge1xuICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIH0pO1xuICAgICAgaWYgKGluc3RhbGxTdGF0dXMgIT09IDApIHtcbiAgICAgICAgLy8gVGhyb3dpbmcgKGluc3RlYWQgb2YgcHJvY2Vzcy5leGl0LCB3aGljaCB3b3VsZCBza2lwIHRoZSBjYWxsZXIncyBmaW5hbGx5KSBsZXRzIHRoZVxuICAgICAgICAvLyByZXN0b3JlIHJ1biBiZWZvcmUgdGhlIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcHJlcGFyaW5nIHRoZSByZWxlYXNlLicpO1xuICAgICAgfVxuICAgICAgLy8gUmVwbGF5IHRoZSBza2lwcGVkIGxpZmVjeWNsZSBzY3JpcHRzIGluIGEgY3JlZGVudGlhbC1zY3J1YmJlZCBlbnZpcm9ubWVudC4gQSByZXBlYXRlZFxuICAgICAgLy8gYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgZG9lcyBub3QgcmVwbGF5IHRoZW0sIHNvIG5vZGVfbW9kdWxlcyBpcyB3aXBlZCBhZ2FpbjtcbiAgICAgIC8vIGV2ZXJ5IHBhY2thZ2UgaXMgYWxyZWFkeSBpbiBidW4ncyBjYWNoZSBmcm9tIHRoZSBjcmVkZW50aWFsZWQgc3RlcCwgc28gdGhpcyByZS1saW5rXG4gICAgICAvLyBuZWVkcyBubyByZWdpc3RyeSBjcmVkZW50aWFscy5cbiAgICAgIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRoIG9mIG5vZGVNb2R1bGVzRGlyUGF0aHMpIHtcbiAgICAgICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVwbGF5U3RhdHVzID0gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCAnYnVuJywgWydpbnN0YWxsJ10sIHtcbiAgICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgIGVudjogYnVpbGRDcmVkZW50aWFsRnJlZUVudihwcm9qZWN0LmVudiksXG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXBsYXlTdGF0dXMgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidW4gaW5zdGFsbCBmYWlsZWQgd2hpbGUgcmVwbGF5aW5nIGxpZmVjeWNsZSBzY3JpcHRzIGZvciB0aGUgcmVsZWFzZS4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlycyA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhwcm9qZWN0KTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgW1xuICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoLFxuICAgIC4uLndvcmtzcGFjZVBhY2thZ2VEaXJzLm1hcCgoZGlyUGF0aCkgPT4gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gIF0pIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICBjb25zdCBvcmlnaW5hbCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgLy8gU25hcHNob3QgRVZFUlkgbWFuaWZlc3QgKG5vdCBvbmx5IHJld3JpdHRlbiBvbmVzKTogc2VtYW50aWMtcmVsZWFzZSBhbHNvIGVkaXRzIG1hbmlmZXN0c1xuICAgIC8vIHdpdGhvdXQgd29ya3NwYWNlOiByYW5nZXMgKHZlcnNpb24gYnVtcHMpLCBhbmQgYSBmYWlsZWQgcmVsZWFzZSBtdXN0IHJlc3RvcmUgdGhvc2UgdG9vLlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIG1vZGlmaWVkRmlsZXMuc2V0KHBhY2thZ2VKc29uUGF0aCwgQnVmZmVyLmZyb20ob3JpZ2luYWwsICd1dGY4JykpO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlV29ya3NwYWNlUmFuZ2VzKG9yaWdpbmFsKTtcbiAgICBpZiAocmV3cml0dGVuID09PSBvcmlnaW5hbCkgY29udGludWU7XG5cbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUmV3cml0aW5nIHdvcmtzcGFjZTogcmFuZ2VzIGluICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCl9Li4uYCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCByZXdyaXR0ZW4sICd1dGY4Jyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBjcmVkZW50aWFscyB0aGUgcmVsZWFzZSB3b3JrZmxvdyBpbmplY3RzIChjZi4gcmV1c2FibGUtd29ya2Zsb3dzJyByZWxlYXNlLnltbCBzZWNyZXRzIGFuZFxuLy8gbnBtJ3Mgb3duIHRva2VuIHZhcmlhYmxlcykuIFRoZSByZWxlYXNlIGNvbW1hbmQgbG9hZHMgdGhlIHByb2plY3Qgd2l0aCBsb2FkRW52OiBmYWxzZSwgc28gbm9cbi8vIHdiLWxvYWRlci1pbmplY3RlZCBrZXlzIGV4aXN0IHRvIHNjcnViIGJleW9uZCB0aGVzZS4gQSBkZW55bGlzdCAobm90IGFuIGFsbG93bGlzdCkgaXNcbi8vIGRlbGliZXJhdGU6IGluIHRoZSBzdXBwb3J0ZWQgZW50cnkgcG9pbnQg4oCUIHJldXNhYmxlLXdvcmtmbG93cycgcmVsZWFzZSBqb2Ig4oCUIHRoZXNlIGVudW1lcmF0ZWRcbi8vIHZhcmlhYmxlcyBhcmUgdGhlIE9OTFkgc2VjcmV0cyBpbiB0aGUgYW1iaWVudCBlbnZpcm9ubWVudCAoZm5veCBzZWNyZXRzIHN0YXkgZW5jcnlwdGVkIGJlY2F1c2Vcbi8vIEZOT1hfQUdFX0tFWSBpcyBzY3J1YmJlZCBhbmQgbmV2ZXIgZXhwb3J0ZWQgYXMgcGxhaW50ZXh0IHRoZXJlKSwgd2hpbGUgYW4gYWxsb3dsaXN0IHdvdWxkXG4vLyBicmVhayBsaWZlY3ljbGUgc2NyaXB0cyB0aGF0IGxlZ2l0aW1hdGVseSByZWFkIG9wZXJhdGlvbmFsIHZhcmlhYmxlcyAoUEFUSCwgSE9NRSwgQ0ksIC4uLikuXG4vLyBBIGxvY2FsIGB3YiByZWxlYXNlYCBpbmhlcml0cyB3aGF0ZXZlciB0aGUgZGV2ZWxvcGVyJ3Mgc2hlbGwgYWxyZWFkeSBleHBvc2VzIHRvIGV2ZXJ5XG4vLyBgYnVuIGluc3RhbGxgLCB3aGljaCB0aGlzIHJlcGxheSBkb2VzIG5vdCB3aWRlbi5cbmNvbnN0IGNyZWRlbnRpYWxFbnZWYXJOYW1lcyA9IFtcbiAgJ1ZFUkRBQ0NJT19UT0tFTicsXG4gICdOUE1fVE9LRU4nLFxuICAnTk9ERV9BVVRIX1RPS0VOJyxcbiAgJ0dJVEhVQl9UT0tFTicsXG4gICdHSF9UT0tFTicsXG4gICdHSF9QQUNLQUdFU19UT0tFTicsXG4gICdHSF9QS0dfUkVBRF9UT0tFTicsXG4gICdGTk9YX0FHRV9LRVknLFxuXTtcblxuLyoqXG4gKiBBIGNvcHkgb2YgYGVudmAgc2FmZSB0byBleHBvc2UgdG8gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cy4gQ3JlZGVudGlhbCB2YXJpYWJsZXMgYXJlXG4gKiBFTVBUSUVEIHJhdGhlciB0aGFuIGRlbGV0ZWQgc28gYCR7VkVSREFDQ0lPX1RPS0VOfWAtc3R5bGUgcmVmZXJlbmNlcyBpbiAubnBtcmMga2VlcCBleHBhbmRpbmdcbiAqIHRvICcnIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGluc3RhbGwgKHRoZSBwYXR0ZXJuIHJldXNhYmxlLXdvcmtmbG93cyByZWxpZXMgb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDcmVkZW50aWFsRnJlZUVudihlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc2NydWJiZWRFbnYgPSB7IC4uLmVudiB9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgY3JlZGVudGlhbEVudlZhck5hbWVzKSB7XG4gICAgaWYgKG5hbWUgaW4gc2NydWJiZWRFbnYpIHNjcnViYmVkRW52W25hbWVdID0gJyc7XG4gIH1cbiAgcmV0dXJuIHNjcnViYmVkRW52O1xufVxuXG4vKipcbiAqIFVuZG8gdGhlIHRlbXBvcmFyeSByZWxlYXNlLXRpbWUgbXV0YXRpb25zIG9mIG9uZSBmaWxlLiBgcGFja2FnZS5qc29uYCBmaWxlcyBhcmUgcmVzdG9yZWRcbiAqIHNlbWFudGljYWxseSBpbnN0ZWFkIG9mIGJ5dGUtZm9yLWJ5dGU6IHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHdyaXRlcyB0aGUgcmVsZWFzZWRcbiAqIHZlcnNpb24gaW50byBtYW5pZmVzdHMgd2hpbGUgdGhleSBob2xkIHRoZSByZXdyaXR0ZW4gcmFuZ2VzLCBhbmQgYSBieXRlIHJlc3RvcmUgd291bGQgc2lsZW50bHlcbiAqIHJldmVydCB0aGF0IGJ1bXAg4oCUIHNvIHdoZW4gdGhlIGZpbGUgY2hhbmdlZCBkdXJpbmcgdGhlIHJlbGVhc2UsIG9ubHkgdGhlIGB3b3Jrc3BhY2U6YFxuICogc3BlY2lmaWVycyBhcmUgd3JpdHRlbiBiYWNrIGludG8gdGhlIENVUlJFTlQgY29udGVudC5cbiAqL1xuLyoqIFJldHVybnMgd2hldGhlciB0aGUgb24tZGlzayBjb250ZW50IGFjdHVhbGx5IGNoYW5nZWQgKGRyaXZlcyB0aGUgXCJSZXN0b3JlZCAuLi5cIiBtZXNzYWdlKS4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVNb2RpZmllZEZpbGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG9yaWdpbmFsQ29udGVudDogQnVmZmVyIHwgdW5kZWZpbmVkLFxuICByZWxlYXNlU3VjY2VlZGVkOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgaWYgKG9yaWdpbmFsQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpO1xuICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZXhpc3RlZDtcbiAgfVxuICBpZiAocmVsZWFzZVN1Y2NlZWRlZCAmJiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ3BhY2thZ2UuanNvbicgJiYgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBvcmlnaW5hbENvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBpZiAoY3VycmVudENvbnRlbnQgIT09IHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMob3JpZ2luYWxUZXh0KSkge1xuICAgICAgY29uc3QgcmVzdG9yZWRDb250ZW50ID0gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudCwgb3JpZ2luYWxUZXh0KTtcbiAgICAgIGlmIChyZXN0b3JlZENvbnRlbnQgPT09IGN1cnJlbnRDb250ZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCByZXN0b3JlZENvbnRlbnQsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY3VycmVudEJ1ZmZlciA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGN1cnJlbnRCdWZmZXI/LmVxdWFscyhvcmlnaW5hbENvbnRlbnQpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFdyaXRlIHRoZSBzbmFwc2hvdCBieXRlcyB2ZXJiYXRpbTogYnVuLmxvY2tiIGlzIGJpbmFyeSwgc28gYW55IHRleHQgZGVjb2RlL2VuY29kZSByb3VuZCB0cmlwXG4gIC8vIHdvdWxkIGNvcnJ1cHQgaXQuXG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIb2lzdGVkQnVuZmlnKGJ1bmZpZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1bmZpZ1xuICAgIC5yZXBsYWNlKC9eKFxccypsaW5rZXJcXHMqPVxccyopW1wiJ11pc29sYXRlZFtcIiddL211LCAnJDFcImhvaXN0ZWRcIicpXG4gICAgLnJlcGxhY2UoL15cXHMqZ2xvYmFsU3RvcmVcXHMqPVxccyp0cnVlW15cXG5dKlxcbj8vbXUsICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMocGFja2FnZUpzb25Db250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBPcGVyYXRlIG9ubHkgaW5zaWRlIHRoZSBkZXBlbmRlbmN5IHNlY3Rpb25zOiBhIGJsYW5rZXQgYFwid29ya3NwYWNlOi4uLlwiYCByZXBsYWNlbWVudCB3b3VsZFxuICAvLyBhbHNvIGNvcnJ1cHQgdW5yZWxhdGVkIHN0cmluZyB2YWx1ZXMgKGUuZy4gYSBkZXNjcmlwdGlvbiBzdGFydGluZyB3aXRoIGB3b3Jrc3BhY2U6YCksIGFuZCBhXG4gIC8vIG5hbWUta2V5ZWQgZ2xvYmFsIHJlcGxhY2VtZW50IHdvdWxkIHRvdWNoIHNhbWUtbmFtZWQga2V5cyBpbiBvdGhlciBzZWN0aW9ucyAoZS5nLiBvdmVycmlkZXMpLlxuICByZXR1cm4gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKHBhY2thZ2VKc29uQ29udGVudCwgKHNlY3Rpb24pID0+XG4gICAgc2VjdGlvbi5yZXBsYWNlQWxsKC8oXCJbXlwiXFxuXStcIlxccyo6XFxzKilcIndvcmtzcGFjZTpbXlwiXSpcIi9ndSwgJyQxXCIqXCInKVxuICApO1xufVxuXG4vKipcbiAqIFJlLWFwcGx5IHRoZSBvcmlnaW5hbCBgd29ya3NwYWNlOmAgc3BlY2lmaWVycyB0byB0aGUgQ1VSUkVOVCBtYW5pZmVzdCBjb250ZW50LiBNYXRjaGluZyBrZXlzXG4gKiBvZmYgdGhlIGRlcGVuZGVuY3kgTkFNRSAobm90IHRoZSBgXCIqXCJgIHBsYWNlaG9sZGVyKSBpcyBkZWxpYmVyYXRlOiBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ3NcbiAqIHByZXBhcmUgc3RlcCBvdmVyd3JpdGVzIGxvY2FsIGRlcGVuZGVuY3kgc3BlY2lmaWVycyB3aXRoIGNvbmNyZXRlIHJlbGVhc2VkIHZlcnNpb25zLCBhbmQgdGhlXG4gKiBjb21taXR0ZWQgbWFuaWZlc3QgbXVzdCBnZXQgaXRzIGB3b3Jrc3BhY2U6YCBwcm90b2NvbCBiYWNrIHJlZ2FyZGxlc3Mg4oCUIEJ1biByZXF1aXJlcyB0aGVcbiAqIHByb3RvY29sIHNvIGEgY29sZCBpbnN0YWxsIGxpbmtzIHRoZSB3b3Jrc3BhY2UgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSByZWdpc3RyeSBjb3B5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudDogc3RyaW5nLCBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmtzcGFjZURlcGVuZGVuY2llcyA9IGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMob3JpZ2luYWxDb250ZW50KTtcbiAgLy8gUmVzdG9yZSBwZXIgKHNlY3Rpb24sIG5hbWUpOiBhIHNhbWUtbmFtZWQgZGVwZW5kZW5jeSBpbiBhbm90aGVyIHNlY3Rpb24gbWF5IGxlZ2l0aW1hdGVseVxuICAvLyBob2xkIGEgbm9uLXdvcmtzcGFjZSByYW5nZSAoZS5nLiBhIHBlZXJEZXBlbmRlbmNpZXMgYD49MS4wLjBgIG5leHQgdG8gYSBkZXZEZXBlbmRlbmNpZXNcbiAgLy8gYHdvcmtzcGFjZToqYCkgb3IgYSBkaWZmZXJlbnQgd29ya3NwYWNlIHJhbmdlLCBhbmQgbXVzdCBrZWVwIGl0cyBvd24gdmFsdWUuXG4gIHJldHVybiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMoY3VycmVudENvbnRlbnQsIChzZWN0aW9uLCBzZWN0aW9uS2V5KSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IHNlY3Rpb247XG4gICAgZm9yIChjb25zdCB7IHNlY3Rpb246IGRlcGVuZGVuY3lTZWN0aW9uLCBuYW1lLCBzcGVjaWZpZXIgfSBvZiB3b3Jrc3BhY2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGlmIChkZXBlbmRlbmN5U2VjdGlvbiAhPT0gc2VjdGlvbktleSkgY29udGludWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChcbiAgICAgICAgbmV3IFJlZ0V4cChgKFwiJHtlc2NhcGVSZWdFeHAobmFtZSl9XCJcXFxccyo6XFxcXHMqKVwiW15cIl0qXCJgLCAnZ3UnKSxcbiAgICAgICAgLy8gQSByZXBsYWNlciBmdW5jdGlvbiwgbm90IGEgcmVwbGFjZW1lbnQgc3RyaW5nOiBzcGVjaWZpZXJzIGNvbnRhaW5pbmcgYCRgIG11c3QgYmVcbiAgICAgICAgLy8gaW5zZXJ0ZWQgbGl0ZXJhbGx5IGluc3RlYWQgb2YgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgc3Vic3RpdHV0aW9uIHBhdHRlcm5zLlxuICAgICAgICAoX21hdGNoLCBwcmVmaXg6IHN0cmluZykgPT4gYCR7cHJlZml4fSR7SlNPTi5zdHJpbmdpZnkoc3BlY2lmaWVyKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuLyoqIERlcGVuZGVuY3kgc2VjdGlvbnMgY29udGFpbiBvbmx5IGBcIm5hbWVcIjogXCJzcGVjaWZpZXJcImAgc3RyaW5nIHBhaXJzLCBzbyBgW157fV0qYCBzcGFucyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHJlcGxhY2VTZWN0aW9uOiAoc2VjdGlvbjogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAvKFwiKGRlcGVuZGVuY2llc3xkZXZEZXBlbmRlbmNpZXN8b3B0aW9uYWxEZXBlbmRlbmNpZXN8cGVlckRlcGVuZGVuY2llcylcIlxccyo6XFxzKlxceykoW157fV0qKShcXH0pL2d1LFxuICAgIChfbWF0Y2gsIHByZWZpeDogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcsIGJvZHk6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpID0+XG4gICAgICBgJHtwcmVmaXh9JHtyZXBsYWNlU2VjdGlvbihib2R5LCBzZWN0aW9uS2V5KX0ke3N1ZmZpeH1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uQ29udGVudDogc3RyaW5nXG4pOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10ge1xuICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uO1xuICB0cnkge1xuICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jaWVzOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdCkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltrZXldID8/IHt9KSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHsgc2VjdGlvbjoga2V5LCBuYW1lLCBzcGVjaWZpZXI6IHZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZW1hbnRpY1JlbGVhc2UocHJvamVjdDogUHJvamVjdCwgYXJndjogUmVsZWFzZUFyZ3YsIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGZvcndhcmRlZEFyZ3MgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV0ubWFwKFN0cmluZyk7XG4gIC8vIFRoZSBQQUNLQUdFIG5hbWUgKGZvciBgYnVueGAvYHlhcm4gZGx4YCwgd2hpY2ggZmV0Y2ggYSBwYWNrYWdlKSBhbmQgdGhlIEJJTiBuYW1lIChmb3IgdGhlXG4gIC8vIGxvY2FsIG5vZGVfbW9kdWxlcy8uYmluIGxvb2t1cCkgZGlmZmVyIGZvciB0aGUgc2NvcGVkIGZvcmtzOiBgYnVueCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlYFxuICAvLyB3b3VsZCBmZXRjaCB0aGUgdW5yZWxhdGVkIHVuc2NvcGVkIG5wbSBwYWNrYWdlIGluc3RlYWQgb2YgZS5nLiBAYW5vbGlsYWIncyBmb3JrLlxuICBjb25zdCByZWxlYXNlUGFja2FnZU5hbWUgPSAoXG4gICAgWydAYW5vbGlsYWIvbXVsdGktc2VtYW50aWMtcmVsZWFzZScsICdtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJywgJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXSBhcyBjb25zdFxuICApLmZpbmQoKHBhY2thZ2VOYW1lKSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSk7XG4gIGNvbnN0IHJlbGVhc2VCaW4gPSByZWxlYXNlUGFja2FnZU5hbWUgPyAnbXVsdGktc2VtYW50aWMtcmVsZWFzZScgOiAnc2VtYW50aWMtcmVsZWFzZSc7XG5cbiAgLy8gVGhlIHByb2plY3QgaXMgbG9hZGVkIHdpdGggbG9hZEVudjogZmFsc2UgKHNlbWFudGljLXJlbGVhc2UgcnVucyB3aXRoIHRoZSBhbWJpZW50L0NJXG4gIC8vIGVudmlyb25tZW50IGJ5IGRlc2lnbiksIHNvIHByb2plY3QuZW52IGFsaWFzZXMgcHJvY2Vzcy5lbnYgaGVyZTsgdXNpbmcgaXQga2VlcHMgdGhlXG4gIC8vIHByb2plY3QuZW52IGNvbnZlbnRpb24gYW5kIHBpY2tzIHVwIGVudiBsb2FkaW5nIGlmIHRoYXQgZGVzaWduIGV2ZXIgY2hhbmdlcy5cbiAgY29uc3QgZW52ID0geyAuLi5wcm9qZWN0LmVudiB9O1xuICBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgocHJvamVjdC5kaXJQYXRoLCBlbnYpO1xuICBjb25zdCBoYXNMb2NhbEJpbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJywgcmVsZWFzZUJpbikpO1xuICBjb25zdCBmYWxsYmFja1BhY2thZ2VOYW1lID0gcmVsZWFzZVBhY2thZ2VOYW1lID8/ICdzZW1hbnRpYy1yZWxlYXNlJztcbiAgY29uc3QgY29tbWFuZCA9IGhhc0xvY2FsQmluXG4gICAgPyBbcmVsZWFzZUJpbiwgLi4uZm9yd2FyZGVkQXJnc11cbiAgICA6IHByb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kID09PSAnYnVuJ1xuICAgICAgPyBbJ2J1bngnLCBmYWxsYmFja1BhY2thZ2VOYW1lLCAuLi5mb3J3YXJkZWRBcmdzXVxuICAgICAgOiBbJ3lhcm4nLCAnZGx4JywgZmFsbGJhY2tQYWNrYWdlTmFtZSwgLi4uZm9yd2FyZGVkQXJnc107XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiAke2NvbW1hbmQuam9pbignICcpfWApKTtcbiAgaWYgKGFyZ3YuZHJ5UnVuKSByZXR1cm4gMDtcblxuICByZXR1cm4gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCBjb21tYW5kWzBdISwgY29tbWFuZC5zbGljZSgxKSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudixcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgcmV0cnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbWF4aW11bSByZXRyeSBjb3VudCcsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgYWxpYXM6ICdyJyxcbiAgICBkZWZhdWx0OiAzLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgY29tbWFuZCB0byByZXRyeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgdGhlIGNvbW1hbmQnLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcmV0cnlDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ3JldHJ5IFtjb21tYW5kXSBbYXJncy4uLl0nLFxuICBkZXNjcmliZTogJ1JldHJ5IHRoZSBnaXZlbiBjb21tYW5kIHVudGlsIGl0IHN1Y2NlZWRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbWRBbmRBcmdzID0gW2FyZ3YuY29tbWFuZCwgLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLmFyZ3YuXy5zbGljZSgxKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGxldCBsYXN0U3RhdHVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YucmV0cnk7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtjaGFsay55ZWxsb3coYCMke2l9IFJldHJ5aW5nOiAke2NtZEFuZEFyZ3Muam9pbignICcpfWApfWApO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCBzaW5nbGUgcXVvdGVzIGFyb3VuZCBlYWNoIGFyZ3VtZW50P1xuICAgICAgbGFzdFN0YXR1cyA9IGF3YWl0IHJ1bldpdGhTcGF3bihjbWRBbmRBcmdzLmpvaW4oJyAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBvblNpZ25hbDogKHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChzaWduYWwpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmIChsYXN0U3RhdHVzID09PSAwKSByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChsYXN0U3RhdHVzKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZXNvbHZlRmFsbGJhY2tXYkVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBnZXRSdW5TY3JpcHRBcmdzIH0gZnJvbSAnLi4vLi4vYmluL3J1bkFyZ3MuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCByZWFkQW5kTWVyZ2VFbnZpcm9ubWVudFZhcmlhYmxlcywgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB1c2VzQnVuUnVudGltZSB9IGZyb20gJy4uL3V0aWxzL3J1bnRpbWUuanMnO1xuaW1wb3J0IHsgcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCB9IGZyb20gJy4vZG90ZW52LmpzJztcblxuZXhwb3J0IGNvbnN0IHJ1bkNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdydW4gW2FyZ3MuLl0nLFxuICBkZXNjcmliZTogJ0xvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBydW4gYSBzY3JpcHQgd2l0aCB0aGUgcHJvamVjdCBydW50aW1lLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHtcbiAgICAgICdwYXJzZS1wb3NpdGlvbmFsLW51bWJlcnMnOiBmYWxzZSxcbiAgICAgICdwb3B1bGF0ZS0tJzogdHJ1ZSxcbiAgICAgICd1bmtub3duLW9wdGlvbnMtYXMtYXJncyc6IHRydWUsXG4gICAgfSksXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFyZ3MgPSBnZXRSdW5TY3JpcHRBcmdzKHByb2Nlc3MuYXJndik7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVc2FnZTogd2IgcnVuIDxzY3JpcHQ+IFthcmdzLi4uXScpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgY3dkKTtcbiAgICBjb25zdCBlbnYgPSBwcm9qZWN0Py5lbnYgPz8gcmVhZFN0YW5kYWxvbmVFbnZpcm9ubWVudChhcmd2LCBjd2QpO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBidWlsZFJ1bkNvbW1hbmQoY3dkLCBhcmdzLCBlbnYsIHByb2plY3QpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGBXb3VsZCBydW46ICR7Y29tbWFuZC5qb2luKCcgJyl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHJ1bkNvbW1hbmRXaXRoRW52aXJvbm1lbnQoY29tbWFuZCwgJ3diIHJ1biA8c2NyaXB0PiBbYXJncy4uLl0nLCB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgfSk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBidWlsZFJ1bkNvbW1hbmQoY3dkOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBwcm9qZWN0PzogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgaWYgKCF1c2VzQnVuUnVudGltZShjd2QpKSByZXR1cm4gWydub2RlJywgLi4uYXJnc107XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBwYWNrYWdlLmpzb24gc2NyaXB0cyBiZWZvcmUgbG9jYWwgYmluYXJpZXMsIHNvIGEgc2NyaXB0IHRoYXQgaW52b2tlc1xuICAvLyBgd2IgcnVuIDxpdHMgb3duIG5hbWU+YCAoZS5nLiBcInZpdGVzdFwiOiBcIndiIHJ1biB2aXRlc3QgcnVuXCIpIHdvdWxkIHJlc3Bhd24gaXRzZWxmIGZvcmV2ZXIuXG4gIC8vIEJ5cGFzcyBzY3JpcHQgcmVzb2x1dGlvbiBvbmx5IGZvciBnZW51aW5lIHNlbGYtcmVjdXJzaW9uOiB0aGUgdGFyZ2V0IG5hbWVzIHRoZSBsaWZlY3ljbGVcbiAgLy8gc2NyaXB0IHRoYXQgc3Bhd25lZCB0aGlzIHByb2Nlc3MgQU5EIHRoZSBjdXJyZW50IHBhY2thZ2UgZGVjbGFyZXMgdGhhdCB2ZXJ5IHNjcmlwdCB0ZXh0IOKAlFxuICAvLyBhIGNyb3NzLXBhY2thZ2UgZGVsZWdhdGlvbiB2aWEgLS13b3JraW5nLWRpciByZWFjaGVzIGEgZGlmZmVyZW50IHNjcmlwdCB0ZXh0LCBzbyBpdCBzdGlsbFxuICAvLyBydW5zIHRoZSBkZXN0aW5hdGlvbidzIHNjcmlwdC4gcnVuQ29tbWFuZFdpdGhFbnZpcm9ubWVudCBwcmVwZW5kcyBub2RlX21vZHVsZXMvLmJpbiB0b1xuICAvLyBQQVRILCByZXNvbHZpbmcgdGhlIGRpcmVjdCBleGVjdXRpb24gdG8gdGhlIGxvY2FsIGJpbmFyeS5cbiAgY29uc3QgdGFyZ2V0ID0gYXJnc1swXTtcbiAgaWYgKHRhcmdldCAmJiB0YXJnZXQgPT09IGVudi5ucG1fbGlmZWN5Y2xlX2V2ZW50KSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gcHJvamVjdCA/IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uW3RhcmdldF0gOiByZWFkUGFja2FnZVNjcmlwdChjd2QsIHRhcmdldCk7XG4gICAgaWYgKHNjcmlwdCAhPT0gdW5kZWZpbmVkICYmIHNjcmlwdCA9PT0gZW52Lm5wbV9saWZlY3ljbGVfc2NyaXB0KSByZXR1cm4gWy4uLmFyZ3NdO1xuICB9XG4gIHJldHVybiBbJ2J1bicsICdydW4nLCAuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VTY3JpcHQoY3dkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIGBidW4gcnVuYCByZXNvbHZlcyBzY3JpcHRzIGZyb20gdGhlIG5lYXJlc3QgYW5jZXN0b3IgcGFja2FnZS5qc29uLCBzbyBtYXRjaCB0aGF0IHNjb3BlXG4gIC8vIChlLmcuIC0td29ya2luZy1kaXIgbWF5IHBvaW50IHRvIGEgbWFuaWZlc3QtbGVzcyBzdWJkaXJlY3Rvcnkgb2YgdGhlIHJlY3Vyc2luZyBwYWNrYWdlKS5cbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcGFja2FnZUpzb24uc2NyaXB0cz8uW25hbWVdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpID09PSBjdXJyZW50UGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkU3RhbmRhbG9uZUVudmlyb25tZW50KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgY3dkOiBzdHJpbmcpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IFtlbnZdID0gcmVhZEFuZE1lcmdlRW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgZW52LldCX0VOViB8fD0gcmVzb2x2ZUZhbGxiYWNrV2JFbnYoYXJndik7XG4gIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3YsIGVudik7XG4gIHJldHVybiBlbnY7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhbmRhbG9uZVdiRW52KGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZSwgZW52OiBOb2RlSlMuUHJvY2Vzc0Vudik6IHZvaWQge1xuICBpZiAoZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHwgZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAndHJ1ZScpIHJldHVybjtcbiAgY29uc3Qgc3RhbmRhcmRNb2RlcyA9IG5ldyBTZXQoWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddKTtcbiAgaWYgKGVudi5XQl9FTlYgJiYgIXN0YW5kYXJkTW9kZXMuaGFzKGVudi5XQl9FTlYpKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBXQl9FTlYgbXVzdCBiZSBvbmUgb2YgZGV2ZWxvcG1lbnQsIHRlc3QsIHN0YWdpbmcsIG9yIHByb2R1Y3Rpb24sIGJ1dCBpcyBcIiR7ZW52LldCX0VOVn1cIi4gYCArXG4gICAgICAgICdGaXggdGhlIGVudiBzb3VyY2Ugb3IgdGhlIGV4cG9ydGVkIHZhcmlhYmxlLCBvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgcnVudGltZUVudiA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBzZWxlY3RlZENhc2NhZGUgPVxuICAgIHR5cGVvZiBhcmd2LmNhc2NhZGVFbnYgPT09ICdzdHJpbmcnXG4gICAgICA/IGFyZ3YuY2FzY2FkZUVudlxuICAgICAgOiBhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogYXJndi5hdXRvQ2FzY2FkZUVudiAhPT0gZmFsc2VcbiAgICAgICAgICA/IHJ1bnRpbWVFbnYuV0JfRU5WIHx8IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoZW52LldCX0VOViAmJiBzZWxlY3RlZENhc2NhZGUgJiYgc3RhbmRhcmRNb2Rlcy5oYXMoc2VsZWN0ZWRDYXNjYWRlKSAmJiBlbnYuV0JfRU5WICE9PSBzZWxlY3RlZENhc2NhZGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFdCX0VOViByZXNvbHZlcyB0byBcIiR7ZW52LldCX0VOVn1cIiBhbHRob3VnaCB0aGUgXCIke3NlbGVjdGVkQ2FzY2FkZX1cIiBlbnZpcm9ubWVudCB3YXMgc2VsZWN0ZWQuIGAgK1xuICAgICAgICAnRml4IHRoZSBXQl9FTlYgZGVmaW5lZCBpbiB0aGUgZW52IHNvdXJjZXMsIG9yIHNldCBXQl9TS0lQX0VOVl9DSEVDSz0xIHRvIHNraXAgdGhpcyBjaGVjay4nXG4gICAgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgbG9hZGVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIChkLm5hbWUgPT09ICdtaXNlLnRvbWwnIHx8IGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignbWlzZSBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgcmVzb2x2ZXMgdGhlIHByb2plY3QncyBBQ1RJVkUgaW50ZXJwcmV0ZXIgdG8gYSBzaW5nbGUgYWJzb2x1dGUgcGF0aCxcbiAgICAgIC8vIHVubGlrZSBgbWlzZSBjdXJyZW50IHB5dGhvbmAsIHdoaWNoIHByaW50cyBldmVyeSBjb25maWd1cmVkIHZlcnNpb24gKG1pc2Ugc3VwcG9ydHNcbiAgICAgIC8vIG11bHRpLXZlcnNpb24gcGlucykgYW5kIHdvdWxkIHBhc3MgZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC5cbiAgICAgIGxldCBweXRob25QYXRoID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBweXRob25QYXRoID0gY2hpbGRfcHJvY2Vzc1xuICAgICAgICAgIC5leGVjU3luYygnbWlzZSB3aGljaCBweXRob24nLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoLCBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSB9KVxuICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBtaXNlIG1pc3Npbmcgb3IgcHl0aG9uIHVuY29uZmlndXJlZDsgbGV0IHBvZXRyeSBwaWNrIGl0cyBkZWZhdWx0IGludGVycHJldGVyLlxuICAgICAgfVxuICAgICAgaWYgKHB5dGhvblBhdGgpIHtcbiAgICAgICAgLy8gVGhlIGNvbW1hbmQgcnVucyB0aHJvdWdoIGEgc2hlbGw7IFBPU0lYIHNpbmdsZSBxdW90ZXMga2VlcCB0aGUgcGF0aCBvbmUgbGl0ZXJhbCBhcmd1bWVudFxuICAgICAgICAvLyBldmVuIHdoZW4gYSByZWxvY2F0ZWQgbWlzZSBkYXRhIGRpciBwdXRzIG1ldGFjaGFyYWN0ZXJzIGludG8gaXQuXG4gICAgICAgIGNvbnN0IHF1b3RlZFB5dGhvblBhdGggPSBgJyR7cHl0aG9uUGF0aC5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7cXVvdGVkUHl0aG9uUGF0aH1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkSW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgY29uc3QgbWlzZUFnZUtleVNlY3JldE9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWVxuICAgICAgPyAnXFxuICAgICAgICAtLXNlY3JldCBpZD1taXNlX2FnZV9rZXksZW52PU1JU0VfQUdFX0tFWSdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSR7bWlzZUFnZUtleVNlY3JldE9wdGlvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlFbnZPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVkgPyAnLS1lbnYgTUlTRV9BR0VfS0VZICcgOiAnJztcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9JHttaXNlQWdlS2V5RW52T3B0aW9ufSR7c2VsZWN0Q29udGFpbmVyRW52T3B0aW9ucyhwcm9qZWN0KX0tLXB1Ymxpc2ggJHtwcm9qZWN0LmVudi5QT1JUfTo4MDgwIC0tbmFtZSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxPcHRpb25zfSAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSAke2FkZGl0aW9uYWxBcmdzfWA7XG4gIH1cblxuICBzdG9wKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZG9ja2VyIHJtIC1mICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ID4gL2Rldi9udWxsIDI+JjEgfHwgdHJ1ZWA7XG4gIH1cblxuICBzdG9wQWxsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB0cnVlICQoZG9ja2VyIHJtIC1mICQoZG9ja2VyIHBzIC1xKSAyPiAvZGV2L251bGwpYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG9ja2VyU2NyaXB0cyA9IG5ldyBEb2NrZXJTY3JpcHRzKCk7XG5cbi8vIFZhcmlhYmxlcyB0aGUgSU1BR0UgaXRzZWxmIG93bnM6IGEgRG9ja2VyZmlsZSBwaW5zIHRoZSBjb250YWluZXIgcG9ydCAodGhlIHB1Ymxpc2hlZCBtYXBwaW5nXG4vLyB0YXJnZXRzIDgwODAsIG5vdCB0aGUgaG9zdC1zaWRlIFBPUlQpIGFuZCB0aGUgcnVudGltZSBtb2RlIGl0IHdhcyBidWlsdCBmb3IsIGFuZCBiZWZvcmUgZm5veCB0aGVcbi8vIGJha2VkIC5lbnYgZmlsZXMgbG9zdCB0byB0aG9zZSBgRU5WYCB2YWx1ZXMgdG9vIGJlY2F1c2UgcHJvY2Vzcy5lbnYgd2lucyBvdmVyIGVudiBzb3VyY2VzLlxuY29uc3QgSU1BR0VfT1dORURfS0VZUyA9IG5ldyBTZXQoWydOT0RFX0VOVicsICdQT1JUJ10pO1xuXG4vKipcbiAqIGBkb2NrZXIgcnVuIC0tZW52IEtFWWAgb3B0aW9ucyBmb3IgZXZlcnkgdmFyaWFibGUgdGhlIHByb2plY3QgZGVjbGFyZXMsIHNvIGEgY29udGFpbmVyIGdldHMgdGhlXG4gKiBhcHAncyBlbnZpcm9ubWVudC4gU2luY2UgZm5veCByZXBsYWNlZCB0aGUgLmVudiBmaWxlcyB0aGF0IGltYWdlcyB1c2VkIHRvIGJha2UgaW4g4oCUIHRoZSBhZ2Uga2V5XG4gKiB0aGF0IGRlY3J5cHRzIHRoZW0gbXVzdCBuZXZlciBlbnRlciBhIGNvbnRhaW5lciDigJQgYSBjb250YWluZXIgd291bGQgb3RoZXJ3aXNlIHN0YXJ0IHdpdGggbm9cbiAqIGNvbmZpZ3VyYXRpb24gYXQgYWxsLiBPbmx5IE5BTUVTIGFyZSBwYXNzZWQ6IGRvY2tlciB0aGVuIGZvcndhcmRzIGVhY2ggdmFsdWUgZnJvbSB3YidzIG93blxuICogZW52aXJvbm1lbnQsIGtlZXBpbmcgc2VjcmV0cyBvdXQgb2YgdGhlIGNvbW1hbmQgbGluZSAodmlzaWJsZSBpbiBgcHNgIG91dHB1dCBhbmQgQ0kgbG9ncykuXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdENvbnRhaW5lckVudk9wdGlvbnMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gIGNvbnN0IG9wdGlvbnMgPSBzZWxlY3RDb250YWluZXJFbnZLZXlzKHByb2plY3QuZGVjbGFyZWRFbnZLZXlzLCBwcm9qZWN0LmVudikubWFwKChrZXkpID0+IGAtLWVudiAke2tleX1gKTtcbiAgcmV0dXJuIG9wdGlvbnMubGVuZ3RoID4gMCA/IGAke29wdGlvbnMuam9pbignICcpfSBgIDogJyc7XG59XG5cbi8qKiBUaGUgZGVjbGFyZWQgdmFyaWFibGVzIHRvIGZvcndhcmQgaW50byBhIGNvbnRhaW5lciwgc29ydGVkIGZvciBhIHN0YWJsZSBjb21tYW5kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdENvbnRhaW5lckVudktleXMoXG4gIGRlY2xhcmVkRW52S2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+XG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uZGVjbGFyZWRFbnZLZXlzXVxuICAgIC5maWx0ZXIoKGtleSkgPT4gIUlNQUdFX09XTkVEX0tFWVMuaGFzKGtleSkgJiYgZW52W2tleV0gIT09IHVuZGVmaW5lZClcbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQsIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQge1xuICBmaW5kRDFNaWdyYXRpb25zRGlyUGF0aCxcbiAgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxuICB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybCxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IGRyaXp6bGVTY3JpcHRzIH0gZnJvbSAnLi4vZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3ByaXNtYVNjcmlwdHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RFMkVPcHRpb25zIHtcbiAgLyoqICctLWUyZSBnZW5lcmF0ZScgY2FsbHMgJ2NvZGVnZW4gaHR0cDovL2xvY2FsaG9zdDo4MDgwJyAqL1xuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xuICAvKiogUmF3IFBsYXl3cmlnaHQgYXJncyBmb3J3YXJkZWQgYWZ0ZXIgYHdiIHRlc3QgLS0gLi4uYCAqL1xuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwLlxuICogTm90ZSB0aGF0IFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlU2NyaXB0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHAgPSBzaG91bGRXYWl0QW5kT3BlbkFwcDtcbiAgfVxuXG4gIGJ1aWxkRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRvY2tlclNjcmlwdHMuYnVpbGRJbWFnZShwcm9qZWN0LCB2ZXJzaW9uKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIGFzeW5jIHN0YXJ0RGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhc3luYyBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ1lBUk4nLFxuICAgICAgICAnd2InLFxuICAgICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgICAgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKSxcbiAgICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICAgIF0pfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZztcbiAgcHJvdGVjdGVkIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXN0b21TdGFydFNjcmlwdFBhdGggPSBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0KTtcbiAgICBpZiAoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSB7XG4gICAgICBjb25zdCBzdGFydENvbW1hbmQgPVxuICAgICAgICBgJHtidWlsZFNoZWxsQ29tbWFuZChbJ2Jhc2gnLCBjdXN0b21TdGFydFNjcmlwdFBhdGhdKX0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAgIC8vIEEgc3RhcnQgc2NyaXB0IGZvdW5kIGF0IHRoZSBtb25vcmVwbyByb290IChjZi4gUHJvamVjdC5maW5kRmlsZSkgaXMgd3JpdHRlbiB0byBydW4gZnJvbVxuICAgICAgLy8gdGhlIHJvb3QsIGxpa2UgRG9ja2VyJ3MgV09SS0RJUiwgc28gaXRzIGN3ZCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBzY3JpcHRzLy5cbiAgICAgIGNvbnN0IHNjcmlwdFJvb3REaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShjdXN0b21TdGFydFNjcmlwdFBhdGgpKTtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgW1xuICAgICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgICAgc2NyaXB0Um9vdERpclBhdGggPT09IHByb2plY3QuZGlyUGF0aFxuICAgICAgICAgID8gc3RhcnRDb21tYW5kXG4gICAgICAgICAgOiBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIHNjcmlwdFJvb3REaXJQYXRoXSl9ICYmICR7c3RhcnRDb21tYW5kfSlgLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgY29uc3QgZWNvc3lzdGVtQ29uZmlnUGF0aCA9IGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gZWNvc3lzdGVtQ29uZmlnUGF0aFxuICAgICAgPyBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBwbTItcnVudGltZSBzdGFydCAtLW5vLWF1dG9yZXN0YXJ0ICR7ZWNvc3lzdGVtQ29uZmlnUGF0aH1gXVxuICAgICAgOiB0aGlzLmJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBjb21tYW5kcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICBgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1bicgOiAnbm9kZSd9IGRpc3QvaW5kZXguanMgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndiwgY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kcyA9IHRoaXMuYnVpbGRNaWdyYXRpb25Db21tYW5kcyhwcm9qZWN0KTtcbiAgICAvLyBTcGxpdHRpbmcgbWF5IGN1dCB0aHJvdWdoIGEgYChjZCDigKYgJiYg4oCmKWAgc3Vic2hlbGwsIGJ1dCByZWpvaW5pbmcgd2l0aCAnICYmICcgYW5kIHBlci1waWVjZVxuICAgIC8vIHJlZGlyZWN0cyBrZWVwcyB0aGUgc2NyaXB0IHZhbGlkLCBhbmQgd2ItZ2VuZXJhdGVkIHBhdGhzIG5ldmVyIGNvbnRhaW4gJyYmJy5cbiAgICByZXR1cm4gWy4uLm1pZ3JhdGlvbkNvbW1hbmRzLmZsYXRNYXAoKGNtZCkgPT4gY21kLnNwbGl0KCcmJicpKSwgLi4uY29tbWFuZHNdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKChjbWQpID0+IGAke2NtZH0gJHt0b0Rldk51bGwoYXJndil9YC50cmltKCkpXG4gICAgICAuam9pbignICYmICcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkTWlncmF0aW9uQ29tbWFuZHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgICAvLyBUZXN0LWVudmlyb25tZW50IHdyYW5nbGVyIHN0YXRlIGlzIGRpc3Bvc2FibGU7IHdpcGUgaXQgZW50aXJlbHkgKG5vdCBqdXN0IEQxKSBiZWZvcmVcbiAgICAvLyBtaWdyYXRpbmcsIHNpbmNlIHN0YWxlIEtWIGNhY2hlIGVudHJpZXMgb3IgRHVyYWJsZSBPYmplY3Qgc3RvcmFnZSBjYW4gYnJlYWsgZTJlIHRlc3RzLlxuICAgIGNvbnN0IHdyYW5nbGVyU3RhdGVXaXBlQ29tbWFuZHMgPVxuICAgICAgaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpXG4gICAgICAgID8gW2BybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImBdXG4gICAgICAgIDogW107XG4gICAgLy8gQSBwcm9qZWN0IHdob3NlIEQxIGJpbmRpbmdzIGNhcnJ5IHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGFwcGxpZXMgdGhlbSB3aXRoIHdyYW5nbGVyXG4gICAgLy8gKHNlZSBXb3JrZXJzU2NyaXB0cyAvIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKS4gUnVubmluZyBkcml6emxlLWtpdCBtaWdyYXRlIGFnYWluc3RcbiAgICAvLyB0aGUgc2FtZSBsb2NhbCBEMSB3b3VsZCBhcHBseSB0aGUgc2FtZSBTUUwgdHdpY2Ug4oCUIGRyaXp6bGUncyBnZW5lcmF0ZWQgc3RhdGVtZW50cyBhcmUgbm90XG4gICAgLy8gaWRlbXBvdGVudCAoYENSRUFURSBJTkRFWGAgd2l0aG91dCBJRiBOT1QgRVhJU1RTKSDigJQgc28gZHJpenpsZSBzdGF5cyBPUk0tb25seSB0aGVyZS5cbiAgICBjb25zdCBtaWdyYXRlc0QxV2l0aFdyYW5nbGVyID0gISFmaW5kRDFNaWdyYXRpb25zRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gW1xuICAgICAgLi4ud3JhbmdsZXJTdGF0ZVdpcGVDb21tYW5kcyxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuaGFzRHJpenpsZSAmJiAhbWlncmF0ZXNEMVdpdGhXcmFuZ2xlclxuICAgICAgICA/IFt3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBkcml6emxlU2NyaXB0cy5taWdyYXRlRm9yU3RhcnQocHJvamVjdCkpXVxuICAgICAgICA6IFtdKSxcbiAgICBdO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgdGVzdEUyRURldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFRG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0KSwgb3B0aW9ucyk7XG4gIH1cbiAgYXN5bmMgdGVzdFN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICAvLyBJbiB0aGUgdGVzdCBlbnZpcm9ubWVudCB0aGUgZGV2IHNlcnZlciBydW5zIGFnYWluc3QgZnJlc2gsIGRpc3Bvc2FibGUgc3RhdGUgKGUuZy4gYW4gZW1wdHlcbiAgICAvLyBsb2NhbCBEMSksIHNvIHRoZSBzY2hlbWEgbXVzdCBiZSBtaWdyYXRlZCBmaXJzdCDigJQgYW4gYXBwIHdob3NlIHBhZ2VzIHF1ZXJ5IHRoZSBkYXRhYmFzZVxuICAgIC8vIHdvdWxkIG90aGVyd2lzZSBhbnN3ZXIgNTAwIGFuZCB0aGUgc3RhcnR1cCBjaGVjayB3b3VsZCBuZXZlciBzZWUgYSAyeHguXG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZHMgPSBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpID8gdGhpcy5idWlsZE1pZ3JhdGlvbkNvbW1hbmRzKHByb2plY3QpIDogW107XG4gICAgLy8gVXNlIGVtcHR5IE5PREVfRU5WIHRvIGF2b2lkIFwicHJvZHVjdGlvblwiIG1vZGUgaW4gc29tZSBmcmFtZXdvcmtzLlxuICAgIGNvbnN0IHN0YXJ0dXBDaGVja0NvbW1hbmQgPSBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcywgc3RhcnR1cENoZWNrQ29tbWFuZF0uam9pbignICYmICcpO1xuICB9XG5cbiAgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBwbGF5d3JpZ2h0Q29tbWFuZCA9IHRoaXMuYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gICAgaWYgKHByb2plY3Quc2tpcExhdW5jaGluZ1NlcnZlckZvclBsYXl3cmlnaHQpIHtcbiAgICAgIHJldHVybiBwbGF5d3JpZ2h0Q29tbWFuZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYCR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwMCAtaSAyMDAwJyl9XG4gICAgICAgICYmICR7cGxheXdyaWdodENvbW1hbmR9YCxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKdXN0IHJ1bnMgUGxheXdyaWdodCAocGx1cyB0aGUgb3B0aW9uYWwgYHRlc3QvZTJlLWFkZGl0aW9uYWxgIHNjcmlwdCksIHdpdGhvdXQgbGF1bmNoaW5nIHRoZSBhcHAuXG4gICAqIFVzZSB3aGVuIFBsYXl3cmlnaHQncyBvd24gYHdlYlNlcnZlcmAgY29uZmlnIGJ1aWxkcyBhbmQgc3RhcnRzIHRoZSBhcHAgdW5kZXIgdGVzdC5cbiAgICovXG4gIHByb3RlY3RlZCBidWlsZFBsYXl3cmlnaHRPbmx5Q29tbWFuZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHsgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPSBbXSwgcGxheXdyaWdodEFyZ3MgPSBbJ3Rlc3QnLCAndGVzdC9lMmUvJ10gfTogVGVzdEUyRU9wdGlvbnNcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgcmV0dXJuIGAke2J1aWxkUGxheXdyaWdodENvbW1hbmQocGxheXdyaWdodEFyZ3MsIGFyZ3YudGFyZ2V0cywgYXJndi5iYWlsLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyl9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIHJ1bnNFMmVPbkNpKF86IFByb2plY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGB3YiB0ZXN0YCBzaG91bGQgYXBwbHkgdGhlIHVuaXQgcnVubmVyJ3Mgb3V0cHV0IGhhbmRsaW5nIHRvIHRoZSBlMmUgcGhhc2UgKHRoZSBkZWZhdWx0XG4gICAqIHBhdGgncyBsb2cgZGVkdXBlIHdvdWxkIGRyb3AgcmVwZWF0ZWQgZmFpbHVyZSBkZXRhaWxzKS4gVHJ1ZSBvbmx5IHdoZW4gdGhlIGUyZSBjb21tYW5kIGlzIHRoZVxuICAgKiBiYXJlIHVuaXQgcnVubmVyOiBodHRwLXNlcnZlciBhbmQgV29ya2VycyBwcm9qZWN0cyBtYXkgYWxzbyBlbWl0IGl0LCBidXQgd3JhcHBlZCBpblxuICAgKiBgd2IgY29uY3VycmVudGx5YCB3aXRoIGEgbGl2ZSBzZXJ2ZXIgd2hvc2UgcmVwZXRpdGl2ZSBsb2dzIGFyZSB3aGF0IHRoZSBkZWR1cGUgZXhpc3RzIGZvci5cbiAgICovXG4gIHVzZXNVbml0UnVubmVyRm9yRTJlKF86IFByb2plY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDUwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDEwMDAwIC1pIDEwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCAxMDAwMCAtaSAyMDAwJyl9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgJHtidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZChwb3J0LCAnLXQgMjAwMDAgLWkgNDAwMCcpfSAyPiAvZGV2L251bGxcbiAgICAgIHx8ICR7YnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydCwgJy10IDYwMDAwIC1pIDUwMDAnKX0gMj4gL2Rldi9udWxsXG4gICAgICB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA5MDAwMCAtaSAxMDAwMCcpfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2FpdEFuZE9wZW5BcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGAke3RoaXMud2FpdEFwcChcbiAgICAgIHByb2plY3RcbiAgICApfSB8fCAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQpfSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB3YWl0LW9uIGJvb3QgY2hlY2sgZm9yIGEgbGlzdGVuaW5nIGxvb3BiYWNrIHBvcnQuIEEgVENQIGNoZWNrIHRyZWF0cyByZWRpcmVjdHMgYW5kXG4gKiBhdXRoZW50aWNhdGlvbiByZXNwb25zZXMgYXMgYSBzdWNjZXNzZnVsbHkgc3RhcnRlZCBzZXJ2ZXI7IGFuIEhUVFAgc3RhdHVzIGNoZWNrIHdvdWxkIGtlZXBcbiAqIHdhaXRpbmcgZXZlbiB0aG91Z2ggUGxheXdyaWdodCBjYW4gYWxyZWFkeSB1c2UgdGhlIGFwcC4gYGxvY2FsaG9zdGAgbGV0cyBOb2RlIHRyeSBib3RoIGFkZHJlc3NcbiAqIGZhbWlsaWVzIHdoZW4gYSBkZXYgc2VydmVyIGJpbmRzIG9ubHkgSVB2NCBvciBJUHY2LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXYWl0T25Mb29wYmFja0NvbW1hbmQocG9ydDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCB3YWl0T25BcmdzPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCBwb3J0ID09PSAnJykgdGhyb3cgbmV3IEVycm9yKCdQb3J0IGlzIHJlcXVpcmVkIGZvciB0aGUgbG9vcGJhY2sgcmVhZGluZXNzIGNoZWNrLicpO1xuICByZXR1cm4gYHdhaXQtb24gJHt3YWl0T25BcmdzID8gYCR7d2FpdE9uQXJnc30gYCA6ICcnfXRjcDpsb2NhbGhvc3Q6JHtwb3J0fWA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdzY3JpcHRzL3N0YXJ0LXByb2R1Y3Rpb24uc2gnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRFY29zeXN0ZW1Db25maWdQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9qZWN0LmZpbmRGaWxlKCdlY29zeXN0ZW0uY29uZmlnLmNqcycpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChcbiAgcGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdLFxuICB0YXJnZXRzOiBUZXN0QXJndlsndGFyZ2V0cyddLFxuICBiYWlsPzogYm9vbGVhbixcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBbJ0JVTicsICdwbGF5d3JpZ2h0J107XG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gIGlmIChwbGF5d3JpZ2h0QXJnc1swXSAhPT0gJ3Rlc3QnIHx8ICFub3JtYWxpemVkVGFyZ2V0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFsuLi5iYXNlLCAuLi5wbGF5d3JpZ2h0QXJncywgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLCBiYWlsKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3QgPSBwbGF5d3JpZ2h0QXJncy5zbGljZSgxKTtcbiAgY29uc3QgZXhwbGljaXRUYXJnZXRJbmRleGVzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMocmVzdCk7XG4gIGNvbnN0IHJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQgPVxuICAgIGV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5sZW5ndGggPT09IDAgPyByZXN0IDogcmVzdC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhZXhwbGljaXRUYXJnZXRJbmRleGVzLmluY2x1ZGVzKGluZGV4KSk7XG4gIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihcbiAgICBbLi4uYmFzZSwgJ3Rlc3QnLCAuLi5ub3JtYWxpemVkVGFyZ2V0cywgLi4ucmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCwgLi4uZm9yd2FyZGVkUGxheXdyaWdodEFyZ3NdLFxuICAgIGJhaWxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oY29tbWFuZEFyZ3M6IHN0cmluZ1tdLCBiYWlsPzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHBsYXl3cmlnaHRJbmRleCA9IGNvbW1hbmRBcmdzLmluZGV4T2YoJ3BsYXl3cmlnaHQnKTtcbiAgY29uc3QgaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQgPSBwbGF5d3JpZ2h0SW5kZXggIT09IC0xICYmIGNvbW1hbmRBcmdzW3BsYXl3cmlnaHRJbmRleCArIDFdID09PSAndGVzdCc7XG4gIGlmICghYmFpbCB8fCAhaXNQbGF5d3JpZ2h0VGVzdENvbW1hbmQpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIGlmIChjb21tYW5kQXJncy5zb21lKChhcmcpID0+IGFyZyA9PT0gJy0tbWF4LWZhaWx1cmVzJyB8fCBhcmcuc3RhcnRzV2l0aCgnLS1tYXgtZmFpbHVyZXM9JykpKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWy4uLmNvbW1hbmRBcmdzLCAnLS1tYXgtZmFpbHVyZXM9MSddKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGFyZ3M6IHN0cmluZ1tdKTogbnVtYmVyW10ge1xuICBsZXQgcGVuZGluZ1ZhbHVlTW9kZTogJ29wdGlvbmFsJyB8ICdyZXF1aXJlZCcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRhcmdldEluZGV4ZXM6IG51bWJlcltdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGFyZ10gb2YgYXJncy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSkge1xuICAgICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUgPT09ICdyZXF1aXJlZCcgfHwgIWFyZy5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgIHJldHVybiBbLi4udGFyZ2V0SW5kZXhlcywgLi4uYXJncy5zbGljZShpbmRleCArIDEpLm1hcCgoXywgb2Zmc2V0KSA9PiBpbmRleCArIDEgKyBvZmZzZXQpXTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICBpZiAoYXJnLmluY2x1ZGVzKCc9JykpIGNvbnRpbnVlO1xuICAgICAgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfSBlbHNlIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ29wdGlvbmFsJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0nKSAmJiBhcmcgIT09ICctJykge1xuICAgICAgY29uc3Qgc2hvcnRPcHRpb24gPSBhcmcuc2xpY2UoMCwgMik7XG4gICAgICBpZiAoYXJnLmxlbmd0aCA9PT0gMiAmJiBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoc2hvcnRPcHRpb24pKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAncmVxdWlyZWQnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRhcmdldEluZGV4ZXMucHVzaChpbmRleCk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0SW5kZXhlcztcbn1cblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tYnJvd3NlcicsXG4gICctLWNvbmZpZycsXG4gICctLWdyZXAnLFxuICAnLS1ncmVwLWludmVydCcsXG4gICctLWdsb2JhbC10aW1lb3V0JyxcbiAgJy0tbWF4LWZhaWx1cmVzJyxcbiAgJy0tb3V0cHV0JyxcbiAgJy0tcHJvamVjdCcsXG4gICctLXJlcGVhdC1lYWNoJyxcbiAgJy0tcmVwb3J0ZXInLFxuICAnLS1yZXRyaWVzJyxcbiAgJy0tc2hhcmQnLFxuICAnLS10ZXN0LWxpc3QnLFxuICAnLS10ZXN0LWxpc3QtaW52ZXJ0JyxcbiAgJy0tdGltZW91dCcsXG4gICctLXRyYWNlJyxcbiAgJy0tdHNjb25maWcnLFxuICAnLS11aS1ob3N0JyxcbiAgJy0tdWktcG9ydCcsXG4gICctLXVpLXRpdGxlJyxcbiAgJy0td29ya2VycycsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMgPSBuZXcgU2V0KFtcbiAgJy0tb25seS1jaGFuZ2VkJyxcbiAgJy0tdXBkYXRlLXNuYXBzaG90cycsXG4gICctLXVwZGF0ZS1zb3VyY2UtbWV0aG9kJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfU0hPUlRfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoWyctYycsICctZycsICctaiddKTtcbiIsImltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzLCBidWlsZFdhaXRPbkxvb3BiYWNrQ29tbWFuZCwgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gc3VwZXIudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBzdGFydENvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC9lMmUvJ107XG4gICAgY29uc3QgdGVzdENvbW1hbmQgPSB0aGlzLnRlc3RVbml0KHByb2plY3QsIHsgLi4uYXJndiwgdGFyZ2V0czogbm9ybWFsaXplZFRhcmdldHMgfSk7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGAke2J1aWxkV2FpdE9uTG9vcGJhY2tDb21tYW5kKHBvcnQsICctdCA2MDAwMDAgLWkgMjAwMCcpfSAmJiAke3Rlc3RDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGh0dHBTZXJ2ZXJTY3JpcHRzID0gbmV3IEh0dHBTZXJ2ZXJTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgU0VSVkVSX0xPR19GSUxFID0gJ3NlcnZlci5sb2cnO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBTRVJWRVJfTE9HX0ZJTEUgfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnREZXZQcm90ZWN0ZWQoXzE6IFByb2plY3QsIF8yOiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREZXYoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biBydW4nIDogJ25vZGUnfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVdpdGhvdXRTZXJ2ZXIocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFV2l0aG91dFNlcnZlcihwcm9qZWN0LCBhcmd2LCBvcHRpb25zKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgLy8gQSBwbGFpbiBwcm9qZWN0J3MgZTJlIHRlc3RzIG5lZWQgY3JlZGVudGlhbHMgb3IgcGFpZCBzZXJ2aWNlcyAoZS5nLiByZWFsIExMTSBjYWxscyksIHdoaWNoIENJXG4gIC8vIGRvZXMgbm90IHByb3ZpZGU7IGEgUGxheXdyaWdodCBmaXh0dXJlIHdpdGggaXRzIG93biBgd2ViU2VydmVyYCBpcyBzZWxmLWNvbnRhaW5lZCBhbmQgQ0ktc2FmZS5cbiAgb3ZlcnJpZGUgcnVuc0UyZU9uQ2kocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwcm9qZWN0Lmhhc1BsYXl3cmlnaHRXZWJTZXJ2ZXJDb25maWc7XG4gIH1cbiAgb3ZlcnJpZGUgdXNlc1VuaXRSdW5uZXJGb3JFMmUocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhcHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnO1xuICB9XG5cbiAgLy8gQSBsaWJyYXJ5IGhhcyBubyBzZXJ2ZXIgb2YgaXRzIG93biwgYnV0IGl0IG1heSBzaGlwIGEgc2VsZi1jb250YWluZWQgUGxheXdyaWdodCBmaXh0dXJlIHdob3NlXG4gIC8vIGNvbmZpZyBidWlsZHMgYW5kIHN0YXJ0cyB0aGUgYXBwIHVuZGVyIHRlc3QgdmlhIGEgYHdlYlNlcnZlcmAgYmxvY2sgKGUuZy4gYSBOZXh0LmpzIGZpeHR1cmUgdGhhdFxuICAvLyB2ZXJpZmllcyB0aGUgcHVibGlzaGVkIHBhY2thZ2UgaW1wb3J0cyBjbGVhbmx5KS4gUnVuIFBsYXl3cmlnaHQgZGlyZWN0bHkgaW4gdGhhdCBjYXNlIOKAlCBpbmNsdWRpbmdcbiAgLy8gb24gQ0ksIHdoZXJlIFBsYXl3cmlnaHQncyBvd24gYHdlYlNlcnZlcmAgc3RhcnRzIHRoZSBmaXh0dXJlLiBPdGhlcndpc2UgcnVuIGB0ZXN0L2UyZS9gIHdpdGggdGhlXG4gIC8vIHVuaXQtdGVzdCBydW5uZXI6IENMSSBhbmQgbGlicmFyeSBwcm9qZWN0cyBrZWVwIHNsb3cgdGVzdHMgaGl0dGluZyByZWFsIGV4dGVybmFsIGRlcGVuZGVuY2llc1xuICAvLyB0aGVyZSwgYW5kIHdpdGhvdXQgdGhpcyBwYXRoIHRoZXkgd291bGQgbmV2ZXIgcnVuLlxuICBwcml2YXRlIGFzeW5jIHRlc3RFMkVXaXRob3V0U2VydmVyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodFdlYlNlcnZlckNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRQbGF5d3JpZ2h0T25seUNvbW1hbmQocHJvamVjdCwgYXJndiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIEEgUGxheXdyaWdodCBjb25maWcgd2l0aG91dCBgd2ViU2VydmVyYCBleHBlY3RzIGFuIGV4dGVybmFsbHkgbWFuYWdlZCBzZXJ2ZXIgKHRoZSBzaGFwZSB3YmZ5J3NcbiAgICAvLyBwbGF5d3JpZ2h0Q29uZmlnIGZpeGVyIGRvY3VtZW50cyk7IGl0cyBzcGVjcyBjYW5ub3QgcnVuIHVuZGVyIHRoZSB1bml0IHJ1bm5lci5cbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gYGVjaG8gJ2RvIG5vdGhpbmcuJ2A7XG4gICAgfVxuICAgIC8vIGB3YiB0ZXN0IC0tIDxhcmdzPmAgZW5hYmxlcyB0aGUgZTJlIHBoYXNlLCBzbyBkcm9wcGluZyB0aGUgZm9yd2FyZGVkIGFyZ3MgaGVyZSB3b3VsZCBydW4gdGhlXG4gICAgLy8gd2hvbGUgKHBvdGVudGlhbGx5IHBhaWQpIHN1aXRlIHVuZmlsdGVyZWQ7IHRyYW5zbGF0ZSB3aGF0IHRoZSB1bml0IHJ1bm5lcnMgdW5kZXJzdGFuZC5cbiAgICBjb25zdCBmb3J3YXJkZWQgPSBhZGFwdEZvcndhcmRlZEFyZ3NGb3JVbml0UnVubmVyKG9wdGlvbnMuZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MgPz8gW10pO1xuICAgIGlmIChmb3J3YXJkZWQudW5zdXBwb3J0ZWRPcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2VjaG8nLFxuICAgICAgICBgU2tpcHBpbmcgdGVzdC9lMmUvIChjYW5ub3QgZm9yd2FyZCB0aGUgUGxheXdyaWdodCBhcmcgdG8gdGhlIHVuaXQtdGVzdCBydW5uZXI6ICR7Zm9yd2FyZGVkLnVuc3VwcG9ydGVkT3B0aW9ufSkuYCxcbiAgICAgIF0pO1xuICAgIH1cbiAgICBjb25zdCBleHBsaWNpdFRhcmdldHMgPSBbLi4uKGFyZ3YudGFyZ2V0cyA/PyBbXSksIC4uLmZvcndhcmRlZC50YXJnZXRzXTtcbiAgICBjb25zdCB0YXJnZXRzID0gZXhwbGljaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyBleHBsaWNpdFRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHVuaXRSdW5uZXJDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHMgfSk7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5mbGFncy5sZW5ndGggPiAwXG4gICAgICA/IGAke3VuaXRSdW5uZXJDb21tYW5kfSAke2J1aWxkU2hlbGxDb21tYW5kKGZvcndhcmRlZC5mbGFncyl9YFxuICAgICAgOiB1bml0UnVubmVyQ29tbWFuZDtcbiAgfVxuICBvdmVycmlkZSB0ZXN0U3RhcnQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGxhaW5BcHBTY3JpcHRzID0gbmV3IFBsYWluQXBwU2NyaXB0cygpO1xuXG5jb25zdCBOQU1FX0ZJTFRFUl9PUFRJT05fUkVHRVhQID0gL14oPzotdHwtZ3wtLWdyZXB8LS10ZXN0LW5hbWUtcGF0dGVybikoPzo9KD88dmFsdWU+LiopKT8kLztcblxuLyoqXG4gKiBTcGxpdHMgYHdiIHRlc3QgLS0gPGFyZ3M+YCAoZG9jdW1lbnRlZCBhcyBQbGF5d3JpZ2h0IGZsYWdzKSBpbnRvIHdoYXQgYGJ1biB0ZXN0YC92aXRlc3QgYWNjZXB0OlxuICogYmFyZSBwYXRocyBiZWNvbWUgcG9zaXRpb25hbCB0YXJnZXRzLCBhbmQgdGhlIG5hbWUtZmlsdGVyIGZsYWdzIGJvdGggcnVubmVycyBzaGFyZSBhcmUgdHJhbnNsYXRlZFxuICogdG8gYSBzaW5nbGUgYC10PTxwYXR0ZXJuPmAgdG9rZW4gKGA9YC1qb2luZWQgc28gYSBwYXR0ZXJuIHN0YXJ0aW5nIHdpdGggYC1gIGlzIG5vdCBwYXJzZWQgYXMgYW5cbiAqIG9wdGlvbjsgbGFzdCBmaWx0ZXIgd2lucywgbWF0Y2hpbmcgUGxheXdyaWdodCdzIENMSSkuIEFueSBvdGhlciBvcHRpb24gaXMgcmVwb3J0ZWQgaW5zdGVhZCBvZlxuICogYmVpbmcgc3BsaWNlZCBpbnRvIHRoZSBydW5uZXIgY29tbWFuZCDigJQgdml0ZXN0IGFib3J0cyBvbiB1bmtub3duIG9yIGR1cGxpY2F0ZWQgb3B0aW9ucywgd2hpY2hcbiAqIHdvdWxkIGtpbGwgdGhlIHdob2xlIG1vbm9yZXBvIHRlc3QgcnVuLlxuICovXG5mdW5jdGlvbiBhZGFwdEZvcndhcmRlZEFyZ3NGb3JVbml0UnVubmVyKGFyZ3M6IHN0cmluZ1tdKToge1xuICB0YXJnZXRzOiBzdHJpbmdbXTtcbiAgZmxhZ3M6IHN0cmluZ1tdO1xuICB1bnN1cHBvcnRlZE9wdGlvbj86IHN0cmluZztcbn0ge1xuICBjb25zdCB0YXJnZXRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbmFtZUZpbHRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmdzW2luZGV4XSBhcyBzdHJpbmc7XG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgdGFyZ2V0cy5wdXNoKC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyTWF0Y2ggPSBOQU1FX0ZJTFRFUl9PUFRJT05fUkVHRVhQLmV4ZWMoYXJnKTtcbiAgICBpZiAoZmlsdGVyTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyTWF0Y2guZ3JvdXBzPy52YWx1ZSA/PyBhcmdzWysraW5kZXhdO1xuICAgICAgLy8gQSBtaXNzaW5nIG9yIGVtcHR5IGZpbHRlciB2YWx1ZSAoZS5nLiBgLS1ncmVwIFwiJFVOU0VUX1ZBUlwiYCkgbXVzdCBub3QgZmFsbCB0aHJvdWdoIHRvIGFuXG4gICAgICAvLyB1bmZpbHRlcmVkIHJ1biBvZiB0aGUgd2hvbGUgKHBvdGVudGlhbGx5IHBhaWQpIHN1aXRlIOKAlCBgLXQgJydgIG1hdGNoZXMgZXZlcnkgdGVzdC5cbiAgICAgIGlmICghdmFsdWUpIHJldHVybiB7IHRhcmdldHMsIGZsYWdzOiBbXSwgdW5zdXBwb3J0ZWRPcHRpb246IGFyZyB9O1xuICAgICAgbmFtZUZpbHRlciA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICByZXR1cm4geyB0YXJnZXRzLCBmbGFnczogW10sIHVuc3VwcG9ydGVkT3B0aW9uOiBhcmcgfTtcbiAgICB9XG4gICAgdGFyZ2V0cy5wdXNoKGFyZyk7XG4gIH1cbiAgcmV0dXJuIHsgdGFyZ2V0cywgZmxhZ3M6IG5hbWVGaWx0ZXIgPT09IHVuZGVmaW5lZCA/IFtdIDogW2AtdD0ke25hbWVGaWx0ZXJ9YF0gfTtcbn1cbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnLCAnaG9ubyddO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgTmV4dC5qcyBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgTmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIC8vIEJsaXR6J3Mgd2l0aEJsaXR6IHdpcmVzIGl0cyBSUEMgbGF5ZXIgdGhyb3VnaCBhIHdlYnBhY2sgbG9hZGVyLCB3aGljaCBUdXJib3BhY2sgaWdub3JlcyxcbiAgICAvLyBzbyBCbGl0eiBhcHBzIG11c3QgcnVuIHRoZSB3ZWJwYWNrIGRldiBzZXJ2ZXIgKFR1cmJvcGFjayBkaWVzIHdpdGggcmVzb2x2ZSBlcnJvcnMpLlxuICAgIC8vIFBhc3Npbmcgbm8gYnVuZGxlciBmbGFnIHNlbGVjdHMgd2VicGFjayBvbmx5IG9uIE5leHQuanMgMTU7IE5leHQuanMgMTYgZGVmYXVsdHMgdG9cbiAgICAvLyBUdXJib3BhY2sgYW5kIG5lZWRzIGFuIGV4cGxpY2l0IC0td2VicGFjaywgYSBmbGFnIE5leHQuanMgMTUncyBDTEkgcmVqZWN0cyBhcyB1bmtub3duLlxuICAgIGxldCBidW5kbGVyT3B0aW9uID0gJy0tdHVyYm9wYWNrICc7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eikge1xuICAgICAgYnVuZGxlck9wdGlvbiA9IGdldE5leHRNYWpvclZlcnNpb24ocHJvamVjdCkgPj0gMTYgPyAnLS13ZWJwYWNrICcgOiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGBZQVJOIG5leHQgZGV2ICR7YnVuZGxlck9wdGlvbn0ke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW3Byb2plY3QuYnVpbGRDb21tYW5kLCBgWUFSTiBuZXh0IHN0YXJ0ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCldO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBuZXh0U2NyaXB0cyA9IG5ldyBOZXh0U2NyaXB0cygpO1xuXG4vKipcbiAqIFByZWZlcnMgdGhlIGluc3RhbGxlZCBwYWNrYWdlIG92ZXIgdGhlIGRlY2xhcmVkIHNwZWNpZmllciBiZWNhdXNlIHRoZSBkZWNsYXJlZCBvbmUgbWF5IGJlIGFcbiAqIHJhbmdlOyBmYWxscyBiYWNrIHRvIDE1ICh3ZWJwYWNrLWJ5LWRlZmF1bHQgYmVoYXZpb3IpIHdoZW4gbmVpdGhlciBpcyByZWFkYWJsZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TmV4dE1ham9yVmVyc2lvbihwcm9qZWN0OiBQcm9qZWN0KTogbnVtYmVyIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpbnN0YWxsZWQgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnbmV4dCcsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICkgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH07XG4gICAgY29uc3QgbWFqb3IgPSBzZW12ZXIuY29lcmNlKGluc3RhbGxlZC52ZXJzaW9uKT8ubWFqb3I7XG4gICAgaWYgKG1ham9yICE9PSB1bmRlZmluZWQpIHJldHVybiBtYWpvcjtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWNsYXJlZCBzcGVjaWZpZXJcbiAgfVxuICByZXR1cm4gc2VtdmVyLmNvZXJjZShwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8ubmV4dCk/Lm1ham9yID8/IDE1O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQsXG4gIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQsXG4gIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgdmluZXh0IChOZXh0LmpzIG9uIFZpdGUpIGFwcHMgdGFyZ2V0aW5nIENsb3VkZmxhcmUgV29ya2Vycy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVmluZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIC8vIFVubGlrZSBgbmV4dCBkZXZgLCBWaXRlLWJhc2VkIHZpbmV4dCBkb2VzIG5vdCByZWFkIHRoZSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgIGNvbnN0IGRldkNvbW1hbmQgPSBgWUFSTiB2aW5leHQgZGV2IC0tcG9ydCAke3Byb2plY3QuZW52LlBPUlR9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gICAgLy8gVGhlIENsb3VkZmxhcmUgdml0ZSBwbHVnaW4gKG1pbmlmbGFyZSkgcmVhZHMgcnVudGltZSB2YXJzIG9ubHkgZnJvbSBhIC5kZXYudmFycyBmaWxlLFxuICAgIC8vIHNvIGl0IG11c3QgYmUgcmVnZW5lcmF0ZWQgZnJvbSB0aGUgZm5veC1tYW5hZ2VkIHZhbHVlcyBiZWZvcmUgc2VydmluZy5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gYHZpbmV4dCBkZXZgIChtaW5pZmxhcmUpIHN0YXJ0cyB3aXRoIGFuIGVtcHR5IGxvY2FsIEQxIGFuZCBhcHBsaWVzIG5vIG1pZ3JhdGlvbnMgaXRzZWxmO1xuICAgIC8vIHRoZSB0ZXN0IGVudmlyb25tZW50IHdpcGVzIGl0cyBzdGF0ZSBkaXJlY3RvcnksIHNvIGV2ZXJ5IHBhZ2Ugd291bGQgNTAwIHdpdGhvdXQgdGhpcy5cbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kID0gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSA/IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtaWdyYXRpb25Db21tYW5kKSBjb21tYW5kcy5wdXNoKG1pZ3JhdGlvbkNvbW1hbmQpO1xuICAgIHJldHVybiBbLi4uY29tbWFuZHMsIGRldkNvbW1hbmRdLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICAvLyBTZXJ2aW5nIHRoZSBidWlsdCB3b3JrZXIgc3RhcnRzIGZyb20gYW4gZW1wdHkgKG9yIHdpcGVkKSBsb2NhbCBEMSwgc28gd3JhbmdsZXItbmF0aXZlXG4gICAgLy8gbWlncmF0aW9ucyAoaWYgYW55KSBtdXN0IGJlIGFwcGxpZWQgZmlyc3Q7IGRyaXp6bGUvcHJpc21hIG1pZ3JhdGlvbnMgYXJlIGhhbmRsZWQgYnlcbiAgICAvLyBidWlsZFByb2R1Y3Rpb25Db21tYW5kLlxuICAgIGNvbnN0IGQxTWlncmF0aW9uc0NvbW1hbmQgPSBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KTtcbiAgICAvLyBgdmluZXh0IGJ1aWxkYCBlbWl0cyBhIHdvcmtlciBidW5kbGUgYW5kIGl0cyB3cmFuZ2xlciBjb25maWcgdW5kZXIgZGlzdC9zZXJ2ZXIsIHNvIHRoZVxuICAgIC8vIC5kZXYudmFycyBmaWxlIGV4cG9zaW5nIHdiLW1hbmFnZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3QgYmUgZ2VuZXJhdGVkIGFmdGVyIGJ1aWxkaW5nLlxuICAgIC8vIGAtLWxvY2FsLXVwc3RyZWFtYCBrZWVwcyByZXF1ZXN0IFVSTHMgb24gdGhlIGxvY2FsIGhvc3Q7IG90aGVyd2lzZSwgd3JhbmdsZXIgZGV2IHNpbXVsYXRlc1xuICAgIC8vIHRoZSBwcm9kdWN0aW9uIGN1c3RvbSBkb21haW4gZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyByb3V0ZXMuXG4gICAgcmV0dXJuIFtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnZGlzdC9zZXJ2ZXIvLmRldi52YXJzJyksXG4gICAgICAuLi4oZDFNaWdyYXRpb25zQ29tbWFuZCA/IFtkMU1pZ3JhdGlvbnNDb21tYW5kXSA6IFtdKSxcbiAgICAgIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKFxuICAgICAgICBgZGV2IC0tY29uZmlnIGRpc3Qvc2VydmVyL3dyYW5nbGVyLmpzb24gLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cG9ydH0gLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1sb2NhbC11cHN0cmVhbSBsb2NhbGhvc3Q6JHtwb3J0fSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApLFxuICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpbmV4dFNjcmlwdHMgPSBuZXcgVmluZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFZpdGUtYmFzZWQgYXBwcyB3aXRoIFBsYXl3cmlnaHQgZTJlIHRlc3RzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaXRlU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIHZpdGUgZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgWUFSTiB2aXRlIHByZXZpZXcgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgdml0ZVNjcmlwdHMgPSBuZXcgVml0ZVNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQsXG4gIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQsXG4gIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBIdHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgcGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcHMgKGRldGVjdGVkIHZpYSBhIHdyYW5nbGVyXG4gKiBjb25maWcgZmlsZSB3aGVuIG5vIG90aGVyIGZyYW1ld29yayBtYXRjaGVzOyB2aW5leHQgYXBwcyBoYXZlIHRoZWlyIG93biBzY3JpcHRzKS5cbiAqIEV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMgc28gdGhhdCBlMmUgdGVzdHMgcnVuIHZpYSB0aGUgdW5pdC10ZXN0IHJ1bm5lciBhZ2FpbnN0IHRoZSBydW5uaW5nXG4gKiB3b3JrZXIgd2hlbiB0aGUgcHJvamVjdCBoYXMgbm8gUGxheXdyaWdodCBjb25maWcuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFdvcmtlcnNTY3JpcHRzIGV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIC8vIHdyYW5nbGVyIGRldiBidW5kbGVzIHRoZSB3b3JrZXIgaXRzZWxmLCBzbyBubyBzZXBhcmF0ZSBidWlsZCBzdGVwIGlzIG5lZWRlZC5cbiAgICByZXR1cm4gdGhpcy5idWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICc4Nzg3JztcbiAgICBjb25zdCBzdGF0ZURpciA9IGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KTtcblxuICAgIC8vIFRoZXNlIGhlbHBlcnMgcmVhZCB0aGUgZGVmYXVsdC1uYW1lZCB3cmFuZ2xlciBjb25maWc7IHRoYXQgaXMgc2FmZSBiZWNhdXNlIHdvcmtlcnNTY3JpcHRzXG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgc2VsZWN0ZWQgd2hlbiBzdWNoIGEgY29uZmlnIGZpbGUgZXhpc3RzIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gQXBwbHkgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgKGlmIGFueSkgc28gdGhlIGxvY2FsIGRhdGFiYXNlIG1hdGNoZXMgdGhlIGRlcGxveWVkIG9uZS5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKGQxTWlncmF0aW9uc0NvbW1hbmQpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goZDFNaWdyYXRpb25zQ29tbWFuZCk7XG4gICAgfVxuICAgIGNvbW1hbmRzLnB1c2goXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWlwIDEyNy4wLjAuMSAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAtLXBlcnNpc3QtdG8gXCIke3N0YXRlRGlyfVwiICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBjb21tYW5kcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd29ya2Vyc1NjcmlwdHMgPSBuZXcgV29ya2Vyc1NjcmlwdHMoKTtcbiIsImltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpbmV4dFNjcmlwdHMgfSBmcm9tICcuL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHdvcmtlcnNTY3JpcHRzIH0gZnJvbSAnLi93b3JrZXJzU2NyaXB0cy5qcyc7XG5cbi8qKiBQaWNrcyB0aGUgc2NyaXB0cyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByb2plY3QgKHRoZSBzZWxlY3Rpb24gYHdiIHRlc3RgL2B3YiB0ZXN0LW9uLWNpYCBzaGFyZSkuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0U2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogQmFzZVNjcmlwdHMge1xuICByZXR1cm4gc2VsZWN0RnJhbWV3b3JrU2NyaXB0cyhwcm9qZWN0KSA/PyAoZGVwZW5kc09uSHR0cFNlcnZlclBhY2thZ2UocHJvamVjdCkgPyBodHRwU2VydmVyU2NyaXB0cyA6IHBsYWluQXBwU2NyaXB0cyk7XG59XG5cbi8qKiBUaGUgZnJhbWV3b3JrLWRldGVjdGlvbiBwcmVmaXggZXZlcnkgY29uc3VtZXIgc2hhcmVzOyBgd2Igc3RhcnRgIGNvbXBvc2VzIGl0cyBvd24gdGFpbCBhcm91bmQgaXQuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RnJhbWV3b3JrU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogQmFzZVNjcmlwdHMgfCB1bmRlZmluZWQge1xuICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gIGlmIChkZXBzLnZpbmV4dCB8fCBkZXZEZXBzLnZpbmV4dCkgcmV0dXJuIHZpbmV4dFNjcmlwdHM7XG4gIGlmIChkZXBzLm5leHQpIHJldHVybiBuZXh0U2NyaXB0cztcbiAgaWYgKGRldkRlcHMudml0ZSkgcmV0dXJuIHZpdGVTY3JpcHRzO1xuICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gIGlmIChmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpKSByZXR1cm4gd29ya2Vyc1NjcmlwdHM7XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcGVuZHNPbkh0dHBTZXJ2ZXJQYWNrYWdlKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4gaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBkZXBlbmRzT25IdHRwU2VydmVyUGFja2FnZSwgc2VsZWN0RnJhbWV3b3JrU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3NlbGVjdFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IHRlc3QnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJTdGFydCBhcHAuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gdGhlIHVuZGVybHlpbmcgYXBwIGNvbW1hbmQuIEV4YW1wbGU6IHdiIHN0YXJ0IC0tIC0taG9zdCAwLjAuMC4wXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLm9wdGlvbnMoYnVpbGRlcikgYXMgQXJndjxcbiAgICAgIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4gICAgPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHMgfCB1bmRlZmluZWQgPSBzZWxlY3RGcmFtZXdvcmtTY3JpcHRzKHByb2plY3QpO1xuICAgICAgaWYgKCFzY3JpcHRzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZXBlbmRzT25IdHRwU2VydmVyUGFja2FnZShwcm9qZWN0KSB8fFxuICAgICAgICAgIChwcm9qZWN0Lmhhc0RvY2tlcmZpbGUgJiYgL0VYUE9TRVxccys4MDgwLy50ZXN0KHByb2plY3QuZG9ja2VyZmlsZSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgICAgfSBlbHNlIGlmIChkZXBzWydidWlsZC10cyddIHx8IGRldkRlcHNbJ2J1aWxkLXRzJ10pIHtcbiAgICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ2RldmVsb3BtZW50JztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERldihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBzZWxlY3RTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vc2VsZWN0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zLCBwcmludFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zIH0gZnJvbSAnLi4vdXRpbHMvdGVzdFN0cnVjdHVyZS5qcyc7XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQgPSAyMDA7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPID0gMC4wNTtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246ICdIb3cgdG8gcnVuIEUyRSB0ZXN0cycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYmFpbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0ZXN0cyBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgYXJyYXk6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdVbml0IG9yIEUyRSB0ZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFRlc3RDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj47XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VGVzdENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHN0cmluZ1tdIH07XG5cbmludGVyZmFjZSBUZXN0UnVuT3B0aW9ucyB7XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcilcbiAgICAgIC5wb3NpdGlvbmFsKCd0YXJnZXRzJywgYXJndW1lbnRzQnVpbGRlci50YXJnZXRzKSBhcyBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YsIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndik7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyh0ZXN0QXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAodGVzdEFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gdGVzdEFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAvLyBSZXNvbHZlIHRoZSBlbnZpcm9ubWVudCBlYWdlcmx5OiB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52IGZvcmNlcyB0aGUgdGVzdCBjYXNjYWRlIGFuZFxuICAgIC8vIFByb2plY3QuY29tcGxldGVBbmRWYWxpZGF0ZVdiRW52IGZhbGxzIGJhY2sgV0JfRU5WIHRvIHRoYXQgbW9kZSDigJQgYnV0IHRoZSBlbnYgZ2V0dGVyIGlzXG4gICAgLy8gbGF6eSwgc28gYSBwcm9qZWN0IHdpdGggbm8gcnVubmFibGUgdGVzdHMgd291bGQgb3RoZXJ3aXNlIHNraXAgdGhlIHZhbGlkYXRpb24gZW50aXJlbHkuXG4gICAgdm9pZCBwcm9qZWN0LmVudjtcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3Qgc2NyaXB0cyA9IHNlbGVjdFNjcmlwdHMocHJvamVjdCk7XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIGNvbnN0IHN0cnVjdHVyZVZpb2xhdGlvbnMgPSBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdCk7XG4gICAgaWYgKHN0cnVjdHVyZVZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcHJpbnRUZXN0U3RydWN0dXJlVmlvbGF0aW9ucyhwcm9qZWN0Lm5hbWUsIHN0cnVjdHVyZVZpb2xhdGlvbnMpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLy8gUnVuIHVuaXQgdGVzdHMgaWYgbmVlZGVkXG4gICAgY29uc3QgZGVmYXVsdFVuaXRUYXJnZXRzID0gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3QpO1xuICAgIGNvbnN0IGV4cGxpY2l0VW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gIWlzRTJlVGFyZ2V0KHRhcmdldCkpO1xuICAgIGNvbnN0IHVuaXRUYXJnZXRzID0gZXhwbGljaXRVbml0VGFyZ2V0cy5sZW5ndGggPiAwID8gZXhwbGljaXRVbml0VGFyZ2V0cyA6IGRlZmF1bHRVbml0VGFyZ2V0cztcbiAgICBpZiAoc2hvdWxkUnVuVW5pdCAmJiB1bml0VGFyZ2V0cyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0czogdW5pdFRhcmdldHMgfTtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVW5pdFRlc3RDb21tYW5kKHNjcmlwdHMudGVzdFVuaXQocHJvamVjdCwgdW5pdEFyZ3YpLCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICB0aW1lb3V0OiB0ZXN0QXJndi51bml0VGltZW91dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU2tpcCBlMmUgdGVzdHMgaWYgbm90IG5lZWRlZCBvciBubyBlMmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghc2hvdWxkUnVuRTJlIHx8ICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IGlzRTJlVGFyZ2V0KHRhcmdldCkpO1xuICAgIGNvbnN0IGUyZUFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzOiBlMmVUYXJnZXRzLmxlbmd0aCA+IDAgPyBlMmVUYXJnZXRzIDogdW5kZWZpbmVkIH07XG5cbiAgICAvLyBQbGF5d3JpZ2h0J3Mgb3V0cHV0IGRlZHVwZSAoZm9yIG5vaXN5IHNlcnZlciBsb2dzKSB3b3VsZCBkcm9wIHRoZSBuZWFyLWlkZW50aWNhbCBmYWlsdXJlXG4gICAgLy8gZGV0YWlscyBvZiBhIHVuaXQtcnVubmVyIHN1aXRlLCBzbyByb3V0ZSB0aG9zZSB0aHJvdWdoIHRoZSB1bml0IHJ1bm5lcidzIG91dHB1dCBoYW5kbGluZy5cbiAgICAvLyBBIHNraXAtbm90aWNlIGBlY2hvYCBtdXN0IHN0YXkgb24gdGhlIGRlZmF1bHQgcGF0aDogdGhlIHVuaXQgcnVubmVyJ3Mgc2lsZW50IG1vZGUgaGlkZXNcbiAgICAvLyBzdWNjZXNzZnVsIG91dHB1dCBhbmQgd291bGQgcmVwb3J0IHRoZSBza2lwcGVkIHN1aXRlIGFzIFwiRTJFIHRlc3RzIHBhc3NlZC5cIi5cbiAgICBjb25zdCBydW5FMmVUZXN0Q29tbWFuZCA9IChzY3JpcHQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiA9PlxuICAgICAgc2NyaXB0cy51c2VzVW5pdFJ1bm5lckZvckUyZShwcm9qZWN0KSAmJiAhc2NyaXB0LnN0YXJ0c1dpdGgoJ2VjaG8gJylcbiAgICAgICAgPyBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0LCBwcm9qZWN0LCB0ZXN0QXJndiwge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgICAgIHNpbGVudFN1Y2Nlc3NNZXNzYWdlOiAnRTJFIHRlc3RzIHBhc3NlZC4nLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogcnVuVGVzdENvbW1hbmQoc2NyaXB0LCBwcm9qZWN0LCB0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH0pO1xuXG4gICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkUyZVRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkUyZVRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXInOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZXBzLm5leHQgfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudihhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBUZXN0Q29tbWFuZEFyZ3Yge1xuICBpZiAoYXJndi5jYXNjYWRlRW52IHx8IGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiA9PT0gZmFsc2UpIHtcbiAgICAvLyBFeHBsaWNpdCBlbnYgZmxhZ3Mga2VlcCB0aGVpciBwcm9maWxlLXNlbGVjdGlvbiBzZW1hbnRpY3MsIGJ1dCB0aGUgc3Bhd25lZCB0ZXN0cyBtdXN0IHN0aWxsXG4gICAgLy8gcnVuIGFzIGB0ZXN0YCB3aGVuIHRoZSBzZWxlY3RlZCBwcm9maWxlIGRlZmluZXMgbm8gV0JfRU5WICh0aGUgcHJlLTE1IGB8fD0gJ3Rlc3QnYCBiZWhhdmlvcikuXG4gICAgcmV0dXJuIHsgLi4uYXJndiwgY29tbWFuZERlZmF1bHRXYkVudjogJ3Rlc3QnIH07XG4gIH1cbiAgcmV0dXJuIHsgLi4uYXJndiwgY2FzY2FkZUVudjogJ3Rlc3QnIH07XG59XG5cbi8qKlxuICogVW5pdCB0ZXN0cyBsaXZlIG9ubHkgdW5kZXIgYHRlc3QvdW5pdC9gOyBgdGVzdC9kZWJ1Zy9gIHJ1bnMgb25seSB3aGVuIGV4cGxpY2l0bHkgdGFyZ2V0ZWQuIEJvdGhcbiAqIHZpdGVzdCBhbmQgYGJ1biB0ZXN0YCB0cmVhdCBhIGJhcmUgYHRlc3RgIGFzIGEgZmlsZW5hbWUgZmlsdGVyLCB3aGljaCBhbHNvIG1hdGNoZXMgZS5nLlxuICogYHNyYy9mb28udGVzdC50c2AsIHNvIHRoZSB0cmFpbGluZyBzbGFzaCB0aGF0IGxpbWl0cyB0aGUgdGFyZ2V0IHRvIHRoZSBkaXJlY3RvcnkgaXMgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nW10gfCBmYWxzZSB7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkgPyBbJy4vdGVzdC91bml0LyddIDogZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RPbkRvY2tlcihcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+LFxuICBzY3JpcHRzOiBCYXNlU2NyaXB0cyxcbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXSxcbiAgb3B0aW9uczogVGVzdFJ1bk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gIGNvbnN0IGJ1aWxkRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YsIHtcbiAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICB9KTtcbiAgaWYgKGJ1aWxkRXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gYnVpbGRFeGl0Q29kZTtcbiAgfVxuICBjb25zdCB0ZXN0RXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEb2NrZXIocHJvamVjdCwgYXJndiwge1xuICAgICAgcGxheXdyaWdodEFyZ3MsXG4gICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICB9KSxcbiAgICBwcm9qZWN0LFxuICAgIGFyZ3YsXG4gICAgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH1cbiAgKTtcbiAgY29uc3Qgc3RvcEV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAodGVzdEV4aXRDb2RlICE9PSAwKSB7XG4gICAgcmV0dXJuIHRlc3RFeGl0Q29kZTtcbiAgfVxuICByZXR1cm4gc3RvcEV4aXRDb2RlO1xufVxuXG5mdW5jdGlvbiBydW5UZXN0Q29tbWFuZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bMl0sXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bM10gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHByb2Nlc3NTaWxlbnRPdXRwdXQ6IGRlZHVwZU5vaXN5VGVzdE91dHB1dCxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1blVuaXRUZXN0Q29tbWFuZChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bMl0sXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bj5bM10gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YsIHtcbiAgICBvbWl0U2lsZW50U3RhcnQ6IHRydWUsXG4gICAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5OiB0cnVlLFxuICAgIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNczogMTBfMDAwLFxuICAgIHNpbGVudFN1Y2Nlc3NNZXNzYWdlOiAnVW5pdCB0ZXN0cyBwYXNzZWQuJyxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVkdXBlTm9pc3lUZXN0T3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVjZW50UHJpbnRlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZWR1cGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBpdGVyYXRlTGluZXMob3V0cHV0KSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRMaW5lID0gbm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkobGluZSk7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lU2V0Lmhhcyhub3JtYWxpemVkTGluZSkpIGNvbnRpbnVlO1xuICAgIGlmIChyZWNlbnRQcmludGVkTGluZXMuc29tZSgocHJpbnRlZExpbmUpID0+IGFyZUxpbmVzU2ltaWxhcihwcmludGVkTGluZSwgbm9ybWFsaXplZExpbmUpKSkgY29udGludWU7XG5cbiAgICBwdXNoUmVjZW50UHJpbnRlZExpbmUocmVjZW50UHJpbnRlZExpbmVzLCByZWNlbnRQcmludGVkTGluZVNldCwgbm9ybWFsaXplZExpbmUpO1xuICAgIGRlZHVwZWRMaW5lcy5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiBkZWR1cGVkTGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uKiBpdGVyYXRlTGluZXMob3V0cHV0OiBzdHJpbmcpOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGxldCBsaW5lU3RhcnRJbmRleCA9IDA7XG4gIHdoaWxlIChsaW5lU3RhcnRJbmRleCA8PSBvdXRwdXQubGVuZ3RoKSB7XG4gICAgY29uc3QgbGluZUVuZEluZGV4ID0gb3V0cHV0LmluZGV4T2YoJ1xcbicsIGxpbmVTdGFydEluZGV4KTtcbiAgICBpZiAobGluZUVuZEluZGV4ID09PSAtMSkge1xuICAgICAgeWllbGQgb3V0cHV0LnNsaWNlKGxpbmVTdGFydEluZGV4KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCk7XG4gICAgbGluZVN0YXJ0SW5kZXggPSBsaW5lRW5kSW5kZXggKyAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hSZWNlbnRQcmludGVkTGluZShsaW5lczogc3RyaW5nW10sIGxpbmVTZXQ6IFNldDxzdHJpbmc+LCBsaW5lOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGluZXMucHVzaChsaW5lKTtcbiAgbGluZVNldC5hZGQobGluZSk7XG4gIGlmIChsaW5lcy5sZW5ndGggPD0gU0lNSUxBUl9URVNUX09VVFBVVF9MT09LQkFDS19MSU5FX0NPVU5UKSByZXR1cm47XG5cbiAgY29uc3QgcmVtb3ZlZExpbmUgPSBsaW5lcy5zaGlmdCgpO1xuICBpZiAocmVtb3ZlZExpbmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpbmVTZXQuZGVsZXRlKHJlbW92ZWRMaW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZVxuICAgIC5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJylcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2VBbGwoL14oPzpcXFtbXlxcXV0rXFxdXFxzKikrL2csICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXChub2RlOlxcZCtcXCkvZywgJyhub2RlOjxudW1iZXI+KScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkKyk/Wj9cXGIvZywgJzx0aW1lc3RhbXA+JylcbiAgICAucmVwbGFjZUFsbCgvKFs/Jl1jYWNoZT0pXFxkKy9nLCAnJDE8bnVtYmVyPicpO1xufVxuXG5mdW5jdGlvbiBhcmVMaW5lc1NpbWlsYXIoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4TGVuZ3RoID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgaWYgKG1heExlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heExlbmd0aCAqIFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZGlzdGFuY2UoYSwgYikgLyBtYXhMZW5ndGggPD0gU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoXG4gIGUyZVRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXSxcbiAgYWRkaXRpb25hbEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncykubGVuZ3RoID4gMDtcbiAgcmV0dXJuIFsndGVzdCcsIC4uLihlMmVUYXJnZXRzLmxlbmd0aCA+IDAgfHwgaGFzRm9yd2FyZGVkUGxheXdyaWdodFRhcmdldHMgPyBbXSA6IFsndGVzdC9lMmUvJ10pLCAuLi5hZGRpdGlvbmFsQXJnc107XG59XG5cbi8vIE1hdGNoIHRoZSB0ZXN0L2UyZSBwYXRoIHNlZ21lbnQsIG5vdCB0aGUgJy9lMmUnIHN1YnN0cmluZzogYSB1bml0IHRhcmdldCBzdWNoIGFzXG4vLyB0ZXN0L3VuaXQvZTJlQ29uZmlnLnRlc3QudHMgbXVzdCBub3QgYmUgY2xhc3NpZmllZCBhcyBhbiBlMmUgdGFyZ2V0LlxuY29uc3QgRTJFX1RBUkdFVF9SRUdFWFAgPSAvKD86XnxcXC8pdGVzdFxcL2UyZSg/OlxcL3wkKS87XG5cbmZ1bmN0aW9uIGlzRTJlVGFyZ2V0KHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFMkVfVEFSR0VUX1JFR0VYUC50ZXN0KHRhcmdldCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHMoXG4gIHRlc3RUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW11cbik6IHsgc2hvdWxkUnVuVW5pdDogYm9vbGVhbjsgc2hvdWxkUnVuRTJlOiBib29sZWFuIH0ge1xuICBjb25zdCBoYXNFMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiBpc0UyZVRhcmdldCh0YXJnZXQpKTtcbiAgLy8gTm9uLWUyZSB0YXJnZXRzICh0ZXN0L3VuaXQvIGFuZCB0ZXN0L2RlYnVnLykgcnVuIHRocm91Z2ggdGhlIHVuaXQtdGVzdCBydW5uZXIuXG4gIGNvbnN0IGhhc1VuaXRUYXJnZXRzID0gdGVzdFRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiAhaXNFMmVUYXJnZXQodGFyZ2V0KSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBzZWxlY3RTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vc2VsZWN0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBmaW5kVGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMsIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMgfSBmcm9tICcuLi91dGlscy90ZXN0U3RydWN0dXJlLmpzJztcblxuaW1wb3J0IHsgZ2V0RGVmYXVsdFVuaXRUYXJnZXRzIH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgdGVzdE9uQ2lCdWlsZGVyID0ge1xuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB0ZXN0T25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0LW9uLWNpJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3Qgb24gQ0kgd2l0aCBubyBvcHRpb25zLicsXG4gIGJ1aWxkZXI6IHRlc3RPbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdE9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdE9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFNwYXduZWQgY29tbWFuZHMgcmUtZGVyaXZlIHRoZWlyIGVudiBjYXNjYWRlIGZyb20gdGhlIGV4cG9ydGVkIFdCX0VOViwgc28gYW4gdW5leHBvcnRlZFxuICAvLyBXQl9FTlYgd291bGQgbGV0IGEgY29uZmlndXJlZCBXQl9FTlYgZGVmYXVsdCAoZS5nLiBkZXZlbG9wbWVudCkgc2VsZWN0IHRoZSBkZXZlbG9wbWVudFxuICAvLyBlbnZpcm9ubWVudCDigJQgcnVubmluZyB0aGUgZGVzdHJ1Y3RpdmUgZTJlIHN1aXRlIGFnYWluc3QgdGhlIGRldmVsb3BlcidzIG93biBkYXRhYmFzZS5cbiAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgIHByb2plY3QuZW52LkNJIHx8PSAnMSc7XG4gICAgLy8gT3ZlcndyaXRlLCBub3QgfHw9OiBwcm9qZWN0LmVudiBhbHJlYWR5IGNhcnJpZXMgdGhlIGRvdGVudi1kZXJpdmVkIHZhbHVlLlxuICAgIHByb2plY3QuZW52LldCX0VOViA9IHByb2Nlc3MuZW52LldCX0VOVjtcblxuICAgIGNvbnN0IHNjcmlwdHMgPSBzZWxlY3RTY3JpcHRzKHByb2plY3QpO1xuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBzdHJ1Y3R1cmVWaW9sYXRpb25zID0gZmluZFRlc3RTdHJ1Y3R1cmVWaW9sYXRpb25zKHByb2plY3QpO1xuICAgIGlmIChzdHJ1Y3R1cmVWaW9sYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHByaW50VGVzdFN0cnVjdHVyZVZpb2xhdGlvbnMocHJvamVjdC5uYW1lLCBzdHJ1Y3R1cmVWaW9sYXRpb25zKTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzRG9ja2VyZmlsZSA9IHByb2plY3QuaGFzRG9ja2VyZmlsZTtcbiAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRVbml0VGFyZ2V0cyA9IGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0KTtcbiAgICBpZiAoZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLmFyZ3YsIHRhcmdldHM6IGRlZmF1bHRVbml0VGFyZ2V0cyB9O1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIC8vIENvbmZpcm0gZGV2IHNlcnZlciBzdGFydHVwIGZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgcHJvamVjdHMgd2l0aCBFMkUgdGVzdHMuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIC8vIEtlZXAgdmFsaWRhdGluZyB0aGUgRG9ja2VyIHRlc3QtaW1hZ2UgYnVpbGQgZXZlbiB3aGVuIHRoZSBlMmUgc3VpdGUgaXRzZWxmIGlzIHNraXBwZWQuXG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICAgIGlmIChzY3JpcHRzLnJ1bnNFMmVPbkNpKHByb2plY3QpKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGhhc0RvY2tlcmZpbGVcbiAgICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgICAvLyBQcmVzZXJ2ZSBhIG5vbnplcm8gZXhpdCBjb2RlIGZyb20gYW4gZWFybGllciBwcm9qZWN0IChlLmcuIGEgbGF5b3V0IHZpb2xhdGlvbik6IGEgbGF0ZXJcbiAgICAgICAgLy8gc3VjY2Vzc2Z1bCBwcm9qZWN0IG11c3Qgbm90IHJlc2V0IHRoZSBmYWlsdXJlLlxuICAgICAgICBjb25zdCBlMmVFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAvLyBDSSBtb2RlIGRpc2FsbG93cyBgb25seWAgdG8gYXZvaWQgaW5jbHVkaW5nIGRlYnVnIHRlc3RzXG4gICAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGFyZ3YsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChlMmVFeGl0Q29kZSAhPT0gMCkge1xuICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBlMmVFeGl0Q29kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGRvY2tlclNjcmlwdHMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmludGVyZmFjZSBUcmVlS2lsbENvbW1hbmRBcmdzIHtcbiAgcGlkOiBudW1iZXI7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5jb25zdCBidWlsZGVyID0gKHlhcmdzOiBBcmd2KTogQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPiA9PlxuICB5YXJnc1xuICAgIC5wb3NpdGlvbmFsKCdwaWQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwcm9jZXNzIElEIHRvIGtpbGwuJyxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbignc2lnbmFsJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTaWduYWwgdG8gc2VuZCB0byB0aGUgcHJvY2VzcyB0cmVlLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6ICdTSUdURVJNJyxcbiAgICB9KSBhcyBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+O1xuXG5leHBvcnQgY29uc3QgdHJlZUtpbGxDb21tYW5kOiBDb21tYW5kTW9kdWxlPG9iamVjdCwgVHJlZUtpbGxDb21tYW5kQXJncz4gPSB7XG4gIGNvbW1hbmQ6ICd0cmVlLWtpbGwgPHBpZD4gW3NpZ25hbF0nLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIGdpdmVuIHByb2Nlc3MgYW5kIGFsbCBkZXNjZW5kYW50cycsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBhcmd2LnNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscztcbiAgICAgIGlmICghKHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpZ25hbDogJHtzaWduYWx9YCk7XG4gICAgICB9XG4gICAgICB0cmVlS2lsbChhcmd2LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xuZXhwb3J0IHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG5vdCBsb2FkZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHR5cGVDaGVjayhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUNoZWNrKGFyZ3Y6IFR5cGVDaGVja0NvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHMgPSBidWlsZFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpO1xuICAgIHdoaWxlIChjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZHMuam9pbignICYmICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIC8vIERpc2FibGUgaW50ZXJhY3RpdmUgbW9kZVxuICAgICAgICBjaTogcHJvamVjdHMuZGVzY2VuZGFudHMubGVuZ3RoID4gMSxcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgcHJlc2VydmVDb2xvcjogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10cnkgdHlwZSBjaGVja2luZyBhZnRlciByZW1vdmluZyBgLm5leHRgIGRpcmVjdG9yeVxuICAgICAgY29uc3QgbmV4dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLm5leHQnKTtcbiAgICAgIGlmIChleGl0Q29kZSAmJiBmcy5leGlzdHNTeW5jKG5leHREaXJQYXRoKSkge1xuICAgICAgICBmcy5ybVN5bmMobmV4dERpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdygnUmVtb3ZlZCBgLm5leHRgIGRpcmVjdG9yeS4gV2Ugd2lsbCByZS10cnkgdHlwZSBjaGVja2luZy4nKSk7XG4gICAgICAgIHJlbW92ZWROZXh0RGlyID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGl0Q29kZTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIGxldCBmaW5hbEV4aXRDb2RlID0gMDtcbiAgZm9yIChjb25zdCBleGl0Q29kZSBvZiBleGl0Q29kZXMpIHtcbiAgICBpZiAoZXhpdENvZGUpIGZpbmFsRXhpdENvZGUgPSBleGl0Q29kZTtcbiAgfVxuICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgKVxuICAgICk7XG4gIHJldHVybiBmaW5hbEV4aXRDb2RlO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHR5cGUtY2hlY2sgY29tbWFuZCB0aGlzIHByb2plY3QgcnVucywgYXMgYEJVTmAvYFlBUk5gLXByZWZpeGVkIHNjcmlwdHMuIEV4cG9ydGVkIHNvXG4gKiBgd2IgdmVyaWZ5YCdzIHN0ZXAgcmVjYXAgY2FuIG5hbWUgdGhlIHNhbWUgdG9vbHMgaW5zdGVhZCBvZiByZS1kZXJpdmluZyB0aGUgY29uZGl0aW9ucywgd2hpY2hcbiAqIHdvdWxkIHNpbGVudGx5IGdvIHN0YWxlIHRoZSBuZXh0IHRpbWUgdGhpcyBsaXN0IGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocHJvamVjdC5oYXNPd25Tb3VyY2VDb2RlKSB7XG4gICAgY29tbWFuZHMucHVzaCguLi5idWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KSk7XG4gIH1cbiAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdweXJpZ2h0JykpIHtcbiAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgfVxuICByZXR1cm4gY29tbWFuZHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIGB0eXBlc2NyaXB0YCAoYHRzY2ApOyB3YmZ5IHJlbW92ZXMgdGhlXG4gIC8vIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHByZXZpZXcgZnJvbSBub24tTmV4dC5qcyByZXBvcyAoTmV4dC5qcy1mYW1pbHlcbiAgLy8gcmVwb3Mga2VlcCBpdCBmb3IgYG5leHQgYnVpbGRgKSwgc28gcmVwb3Mgc3RpbGwgb24gdGhlIHByZXZpZXcgc2hvdWxkIHJ1biB3YmZ5XG4gIC8vIGluc3RlYWQgb2YgcmVseWluZyBvbiBhIHRzZ28gZmFsbGJhY2sgaGVyZS5cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzLCBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICcuLi91dGlscy9idW5Mb2NrZmlsZS5qcyc7XG5cbmltcG9ydCB7IGJ1aWxkTGludENvbW1hbmQsIGxpbnQsIHR5cGUgTGludENvbW1hbmRBcmd2IH0gZnJvbSAnLi9saW50LmpzJztcbmltcG9ydCB7IHRlc3QsIHR5cGUgVGVzdENvbW1hbmRBcmd2LCB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52IH0gZnJvbSAnLi90ZXN0LmpzJztcbmltcG9ydCB7IGJ1aWxkVHlwZUNoZWNrQ29tbWFuZHMsIHR5cGVDaGVjaywgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiB9IGZyb20gJy4vdHlwZWNoZWNrLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZnVsbDoge1xuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICBkZXNjcmliZTogJ1J1biB0ZXN0cyBhZnRlciB2ZXJpZnlpbmcgcHJvamVjdCBjb2RlJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIFZlcmlmeUNvZGVDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+O1xudHlwZSBQYWNrYWdlQ29tbWFuZEFyZ3YgPSBQaWNrPFZlcmlmeUNvZGVDb21tYW5kQXJndiwgJ2RyeVJ1bicgfCAndmVyYm9zZSc+O1xuXG4vKiogQSBjb21wbGV0ZWQgYHdiIHZlcmlmeWAgc3RlcCwgcmVjb3JkZWQgc28gdGhlIGZpbmFsIHN1bW1hcnkgY2FuIHByb3ZlIGV2ZXJ5IHN0ZXAgYWN0dWFsbHkgcmFuLiAqL1xuaW50ZXJmYWNlIFZlcmlmeVN0ZXAge1xuICAvKipcbiAgICogQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBzdGVwIHJhbiwgZS5nLiBgdHNjIC0tbm9FbWl0YC4gQWdncmVnYXRlZCBhY3Jvc3MgdGhlIGRlc2NlbmRhbnRcbiAgICogcHJvamVjdHMsIHNvIGAgKyBgIG1lYW5zIGVhY2ggdG9vbCByYW4gc29tZXdoZXJlLCBub3QgdGhhdCBvbmUgY29tbWFuZCByYW4gdGhlbSBhbGwuIE9taXR0ZWQgd2hlblxuICAgKiBub3RoaW5nIGJleW9uZCB0aGUgc3RlcCBuYW1lIGRlc2NyaWJlcyBpdC5cbiAgICovXG4gIGRldGFpbD86IHN0cmluZztcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlDb2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndmVyaWZ5JyxcbiAgZGVzY3JpYmU6ICdWZXJpZnkgcHJvamVjdCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXBzOiBWZXJpZnlTdGVwW10gPSBbXTtcbiAgICBpZiAoYXJndi5mdWxsKSB7XG4gICAgICBhd2FpdCB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdHMuc2VsZiwgYXJndiwgc3RlcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3RzLnNlbGYsIGFyZ3YsIHN0ZXBzKTtcbiAgICAgIHByaW50VmVyaWZ5U3VtbWFyeShzdGVwcywgQm9vbGVhbihhcmd2LmRyeVJ1bikpO1xuICAgIH1cbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGVGdWxseShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsIHN0ZXBzOiBWZXJpZnlTdGVwW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3J0ZXIgPSBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3QsIGFyZ3YsIHN0ZXBzKTtcbiAgICBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IG5hbWU6ICd0ZXN0JyB9LCAoKSA9PiBydW5Qcm9qZWN0VGVzdChwcm9qZWN0LCBhcmd2KSk7XG4gICAgLy8gUHJpbnRlZCBiZWZvcmUgdGhlIHJlcG9ydGVyIGZpbmlzaGVzIHNvIHRoZSBzdW1tYXJ5IGxhbmRzIGluIHZlcmlmeS1mdWxsLmxvZyB0b28uXG4gICAgcHJpbnRWZXJpZnlTdW1tYXJ5KHN0ZXBzLCBCb29sZWFuKGFyZ3YuZHJ5UnVuKSk7XG4gICAgcmVwb3J0ZXIuc3VjY2VlZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydGVyLmZhaWwoZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIHJlcG9ydGVyLmZpbmlzaCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGUocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCBzdGVwczogVmVyaWZ5U3RlcFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGluc3RhbGxgO1xuICAvLyBgYWxsb3dGYWlsdXJlYCBzbyBhIGZhaWxlZCBpbnN0YWxsIHN0aWxsIHJlYWNoZXMgdGhlIG5vcm1hbGl6YXRpb24gYmVsb3c6IGJ1biByZXdyaXRlcyB0aGVcbiAgLy8gbG9ja2ZpbGUgYmVmb3JlIHJ1bm5pbmcgbGlmZWN5Y2xlIHNjcmlwdHMsIHNvIGEgc2NyaXB0IGZhaWx1cmUgd291bGQgb3RoZXJ3aXNlIGxlYXZlIEd1YXJkXG4gIC8vIFVSTHMgaW4gdGhlIHdvcmtpbmcgdHJlZS4gVGhlIGZhaWx1cmUgaXMgcmVwb3J0ZWQgYW5kIGV4aXRzIGV4YWN0bHkgYXMgcnVuUGFja2FnZUNvbW1hbmQgd291bGQuXG4gIGNvbnN0IGluc3RhbGxFeGl0Q29kZSA9IGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgZGV0YWlsOiBpbnN0YWxsQ29tbWFuZCwgbmFtZTogJ2luc3RhbGwnIH0sICgpID0+XG4gICAgcnVuUGFja2FnZUNvbW1hbmQoaW5zdGFsbENvbW1hbmQsIHByb2plY3QsIGFyZ3YsIHsgYWxsb3dGYWlsdXJlOiB0cnVlIH0pXG4gICk7XG4gIC8vIFRoZSByZXBvc2l0b3J5IG1heSBoYXZlIG5vIGBnZW4tY29kZWAgc2NyaXB0ICh3aGVyZSB0aGUgc2FtZSBub3JtYWxpemF0aW9uIHJ1bnMgYXQgcG9zdGluc3RhbGwpLFxuICAvLyBhbmQgYHZlcmlmeWAgaXMgdGhlIGNvbW1hbmQgYSBkZXZlbG9wZXIgcnVucyBiZWZvcmUgY29tbWl0dGluZy5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHByb2plY3Qucm9vdERpclBhdGgpO1xuICB9XG4gIGlmIChpbnN0YWxsRXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7aW5zdGFsbEV4aXRDb2RlfSk6YCksIGluc3RhbGxDb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGluc3RhbGxFeGl0Q29kZSk7XG4gIH1cbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddKSB7XG4gICAgY29uc3QgZ2VuQ29kZUNvbW1hbmQgPSBgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gZ2VuLWNvZGVgO1xuICAgIGF3YWl0IHJ1blN0ZXAoc3RlcHMsIHsgZGV0YWlsOiBnZW5Db2RlQ29tbWFuZCwgbmFtZTogJ2dlbi1jb2RlJyB9LCAoKSA9PlxuICAgICAgcnVuUGFja2FnZUNvbW1hbmQoZ2VuQ29kZUNvbW1hbmQsIHByb2plY3QsIGFyZ3YpXG4gICAgKTtcbiAgfVxuICAvLyBSZXNvbHZlZCBhZnRlciBgZ2VuLWNvZGVgIHNvIGEgZ2VuZXJhdGVkIGBzcmNgIGRpcmVjdG9yeSBpcyBhbHJlYWR5IHRoZXJlIGZvciBgaGFzU291cmNlQ29kZWAsXG4gIC8vIHdoaWNoIGlzIGFuIGV4aXN0c1N5bmMgY2hlY2ssIGFuZCByZXVzZWQgYnkgYm90aCBzdGVwIGRldGFpbHMgYmVsb3cuIFRoZSBwcm9qZWN0IGZhY3Rvcmllc1xuICAvLyBzaGFyZSBpbnN0YW5jZXMgcGVyIChkaXJlY3RvcnksIGxvYWRFbnYsIGVudi1yZWxldmFudCBhcmd2KSwgc28gYHR5cGVjaGVja2AgcmV1c2VzIHRoaXMgdmVyeVxuICAvLyBncmFwaCB3aGlsZSBgbGludGAgKHdoaWNoIGFkZHMgLS1zaWxlbnQpIHJlc29sdmVzIGl0cyBvd24uXG4gIGNvbnN0IHN0ZXBEZXRhaWxzID0gYXdhaXQgYnVpbGRTdGVwRGV0YWlscyhhcmd2KTtcbiAgLy8gYGxpbnQgLS1maXggLS1mb3JtYXRgIHByaW50cyBub3RoaW5nIG9uIHN1Y2Nlc3MsIHNvIHdpdGhvdXQgdGhlIHN0ZXAgc3VtbWFyeSBhIHBhc3NpbmcgYHZlcmlmeWBcbiAgLy8gbG9va3MgbGlrZSBpdCBuZXZlciBsaW50ZWQgYXQgYWxsIOKAlCBhbmQgaXQgc2lsZW50bHkgcmV3cm90ZSB0aGUgd29ya2luZyB0cmVlIHdoaWxlIGF0IGl0LlxuICBhd2FpdCBydW5TdGVwKHN0ZXBzLCB7IGRldGFpbDogc3RlcERldGFpbHMuY2xlYW51cCwgbmFtZTogJ2NsZWFudXAnIH0sICgpID0+XG4gICAgcnVuSW5Qcm9jZXNzQ29tbWFuZCgnY2xlYW51cCcsICgpID0+XG4gICAgICBsaW50KHtcbiAgICAgICAgLi4uYXJndixcbiAgICAgICAgXzogWydsaW50J10sXG4gICAgICAgIGZpeDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiB0cnVlLFxuICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICB9IGFzIHVua25vd24gYXMgTGludENvbW1hbmRBcmd2KVxuICAgIClcbiAgKTtcbiAgLy8gVHlwZS1hd2FyZSBsaW50IHJlcG9ydHMgVHlwZVNjcmlwdCBkaWFnbm9zdGljcyBvbmx5IGZvciB0aGUgZmlsZXMgb3hsaW50IGFjdHVhbGx5IGxpbnRzLCBhbmRcbiAgLy8gdGhlIHNoYXJlZCBjb25maWcgaWdub3JlcyBkaXJlY3RvcmllcyB0c2Mgc3RpbGwgY29tcGlsZXMgKGUuZy4gYF9fZ2VuZXJhdGVkX19gLCBgQHR5cGVzYCxcbiAgLy8gYGRpc3RgKS4gS2VlcCB0aGUgdHlwZWNoZWNrIGNvbW1hbmQgc28gYHZlcmlmeWAgc3RheXMgZXF1aXZhbGVudCB0byBcInRoZSByZXBvc2l0b3J5IGNvbXBpbGVzXCIuXG4gIC8vIFRoZSBvdmVybGFwIHdpdGggbGludCBpcyBkZWxpYmVyYXRlOiBgLS10eXBlLWF3YXJlYCBhbHNvIHBvd2VycyB0eXBlLWF3YXJlIGxpbnQgcnVsZXMsIGFuZFxuICAvLyBkcm9wcGluZyBvbmx5IGAtLXR5cGUtY2hlY2tgIGZyb20gbGludCBzYXZlcyB+MC4xcywgZmFyIGxlc3MgdGhhbiB0aGUgY292ZXJhZ2UgaXQgd291bGQgY29zdC5cbiAgYXdhaXQgcnVuU3RlcChzdGVwcywgeyBkZXRhaWw6IHN0ZXBEZXRhaWxzLnR5cGVjaGVjaywgbmFtZTogJ3R5cGVjaGVjaycgfSwgKCkgPT5cbiAgICBydW5JblByb2Nlc3NDb21tYW5kKCd0eXBlY2hlY2snLCAoKSA9PiB0eXBlQ2hlY2soeyAuLi5hcmd2LCBfOiBbJ3R5cGVjaGVjayddIH0gYXMgdW5rbm93biBhcyBUeXBlQ2hlY2tDb21tYW5kQXJndikpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByb2plY3RUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoe1xuICAgIC4uLmFyZ3YsXG4gICAgXzogWyd0ZXN0J10sXG4gICAgZTJlOiAnaGVhZGxlc3MnLFxuICAgIHNpbGVudDogdHJ1ZSxcbiAgfSBhcyB1bmtub3duIGFzIFRlc3RDb21tYW5kQXJndik7XG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAoZXhpdENvZGUgPT09IDApIHJldHVybjtcblxuICBpZiAoIXByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkYi1yZXNldCddKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksICd0ZXN0JykpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oXG4gICAgY2hhbGsueWVsbG93KCdUZXN0cyBmYWlsZWQuIFRoaXMgcHJvamVjdCBkZWZpbmVzIFwiZGItcmVzZXRcIiwgc28gd2Igd2lsbCByZXNldCB0aGUgZGF0YWJhc2Ugb25jZSBhbmQgcmV0cnkgdGVzdHMuJylcbiAgKTtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGRiLXJlc2V0YCwgZmluZFRlc3RQcm9qZWN0KHByb2plY3QsIHRlc3RBcmd2KSwgdGVzdEFyZ3YsIHtcbiAgICBwcmludFJhd091dHB1dDogdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3QgcmV0cnlFeGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKHJldHJ5RXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0cnlFeGl0Q29kZX0pOmApLCAndGVzdCBhZnRlciBkYi1yZXNldCByZXRyeScpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0cnlFeGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdUZXN0cyBwYXNzZWQgYWZ0ZXIgZGItcmVzZXQgcmV0cnkuJykpO1xufVxuXG5mdW5jdGlvbiBmaW5kVGVzdFByb2plY3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdENvbW1hbmRBcmd2KTogUHJvamVjdCB7XG4gIGNvbnN0IHRlc3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmICghdGVzdFByb2plY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2plY3Qgbm90IGZvdW5kOiAke3Byb2plY3QuZGlyUGF0aH1gKTtcbiAgfVxuICByZXR1cm4gdGVzdFByb2plY3Q7XG59XG5cbi8qKlxuICogTmFtZXMgdGhlIHRvb2xzIGJlaGluZCB0aGUgYGNsZWFudXBgIGFuZCBgdHlwZWNoZWNrYCBzdGVwcy5cbiAqXG4gKiBCb3RoIHN0ZXBzIHR5cGUtY2hlY2ssIHdoaWNoIHJlYWRzIGFzIHJlZHVuZGFudCB1bnRpbCB0aGUgcmVjYXAgc2F5cyBob3cgdGhleSBkaWZmZXI6IGBjbGVhbnVwYFxuICogdHlwZS1jaGVja3MgdGhyb3VnaCBveGxpbnQsIHdoaWNoIHNlZXMgb25seSB0aGUgZmlsZXMgaXQgbGludHMgKHRoZSBzaGFyZWQgY29uZmlnIGlnbm9yZXNcbiAqIGBfX2dlbmVyYXRlZF9fYCwgYEB0eXBlc2AsIGBkaXN0YCwgLi4uKSwgd2hpbGUgYHR5cGVjaGVja2AgcnVucyB0aGUgY29tcGlsZXIgb3ZlciB0aGUgd2hvbGVcbiAqIHRzY29uZmlnIHByb2dyYW0uIEV2ZXJ5IGxhYmVsIGlzIGRlcml2ZWQgZnJvbSB0aGUgcmVzb2x2ZWQgcHJvamVjdHMgcmF0aGVyIHRoYW4gaGFyZC1jb2RlZCwgc28gYVxuICogcmVwb3NpdG9yeSB3aG9zZSBgY2xlYW51cGAgcnVucyBmbGFrZTggb3IgYGRhcnQgYW5hbHl6ZWAgaXMgbmV2ZXIgdG9sZCBpdCByYW4gb3hsaW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZFN0ZXBEZXRhaWxzKGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8eyBjbGVhbnVwOiBzdHJpbmc7IHR5cGVjaGVjaz86IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNsZWFudXAgPSAnbGludCAtLWZpeCAtLWZvcm1hdCc7XG4gIC8vIERlbGliZXJhdGVseSByZXNvbHZlZCB3aXRoIG5vIGV4cGxpY2l0IGRpclBhdGgsIGV4YWN0bHkgYXMgYGxpbnRgIChsaW50LnRzKSBhbmQgYHR5cGVDaGVja2BcbiAgLy8gKHR5cGVjaGVjay50cykgcmVzb2x2ZSB0aGVpcnMsIHNvIHRoZSBsYWJlbHMgYWx3YXlzIGRlc2NyaWJlIHRoZSB2ZXJ5IHByb2plY3Qgc2V0IHRob3NlIGNvbW1hbmRzXG4gIC8vIHByb2Nlc3MuIFRocmVhZGluZyBhIGRpclBhdGggaW4g4oCUIHRoZSBzZWxmIHByb2plY3Qncywgc2F5IOKAlCB3b3VsZCBsZXQgdGhlIHR3byBkaXZlcmdlLCB3aGljaCBpc1xuICAvLyB0aGUgZHJpZnQgdGhpcyBmdW5jdGlvbiBleGlzdHMgdG8gcHJldmVudC5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykgcmV0dXJuIHsgY2xlYW51cCB9O1xuXG4gIC8vIEFza3MgdGhlIHJlYWwgYnVpbGRlcnMgd2hhdCB0aGV5IHdvdWxkIHJ1biByYXRoZXIgdGhhbiByZXN0YXRpbmcgdGhlaXIgY29uZGl0aW9ucywgc28gYSBjaGFuZ2VcbiAgLy8gdG8gZWl0aGVyIGNvbW1hbmQgY2Fubm90IGxlYXZlIHRoZXNlIGxhYmVscyBkZXNjcmliaW5nIHNvbWV0aGluZyBpdCBzdG9wcGVkIGRvaW5nLiBPbmx5IHRoZVxuICAvLyBwcm9qZWN0IHNlbGVjdGlvbiBpcyByZXN0YXRlZDogYGxpbnRgIGFuZCBgdHlwZUNoZWNrYCBhcHBseSBpdCBhcm91bmQgdGhlaXIgYnVpbGRlcnMsIG5vdFxuICAvLyBpbnNpZGUgdGhlbS5cbiAgY29uc3QgcnVuc1R5cGVBd2FyZUxpbnQgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5zb21lKFxuICAgIChwcm9qZWN0KSA9PlxuICAgICAgcHJvamVjdC5oYXNPd25Tb3VyY2VDb2RlICYmIGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgeyBmaXg6IHRydWUsIGZvcm1hdDogdHJ1ZSB9KT8uaW5jbHVkZXMoJy0tdHlwZS1hd2FyZScpXG4gICk7XG4gIGNvbnN0IHR5cGVDaGVja0NvbW1hbmRzID0gW1xuICAgIC4uLm5ldyBTZXQocHJvamVjdHMuZGVzY2VuZGFudHMuZmxhdE1hcCgocHJvamVjdCkgPT4gYnVpbGRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KS5tYXAodG9EaXNwbGF5Q29tbWFuZCkpKSxcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICBjbGVhbnVwOiBydW5zVHlwZUF3YXJlTGludCA/IGAke2NsZWFudXB9IChveGxpbnQgLS10eXBlLWF3YXJlIC0tdHlwZS1jaGVjaylgIDogY2xlYW51cCxcbiAgICB0eXBlY2hlY2s6IHR5cGVDaGVja0NvbW1hbmRzLmxlbmd0aCA+IDAgPyB0eXBlQ2hlY2tDb21tYW5kcy5qb2luKCcgKyAnKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqIERyb3BzIHRoZSBwYWNrYWdlLW1hbmFnZXIgcGxhY2Vob2xkZXIgYHJ1bldpdGhTcGF3bmAgZXhwYW5kcywgbGVhdmluZyB0aGUgdG9vbCBjYWxsIHRvIHNob3cuICovXG5mdW5jdGlvbiB0b0Rpc3BsYXlDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb21tYW5kLnJlcGxhY2UoL14oPzpCVU58WUFSTikgL3UsICcnKTtcbn1cblxuLyoqIFRpbWVzIGEgc3RlcCBhbmQgcmVjb3JkcyBpdCBmb3IgdGhlIGZpbmFsIHN1bW1hcnkuIFN0ZXBzIHRoYXQgZmFpbCBleGl0IHRoZSBwcm9jZXNzIGluc3RlYWQuICovXG5hc3luYyBmdW5jdGlvbiBydW5TdGVwPFQ+KFxuICBzdGVwczogVmVyaWZ5U3RlcFtdLFxuICBzdGVwOiBPbWl0PFZlcmlmeVN0ZXAsICdkdXJhdGlvbk1zJz4sXG4gIHJ1bjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bigpO1xuICBzdGVwcy5wdXNoKHsgLi4uc3RlcCwgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSdW5zIGEgc3RlcCB0aGF0IHN1Y2NlZWRzIHNpbGVudGx5OiB0aGUgcmVjYXAgaXMgdGhlIHNpbmdsZSBwbGFjZSBhIHN1Y2Nlc3NmdWwgc3RlcCBpcyBhbm5vdW5jZWQsXG4gKiBzbyB3cmFwcGVyIGBTdGFydGAvYEZpbmlzaGVkYCBsaW5lcyB3b3VsZCBvbmx5IHJlcGVhdCBpdC4gRmFpbHVyZXMgc3RpbGwgcmVwb3J0IGJlZm9yZSBleGl0aW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5JblByb2Nlc3NDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGV4aXRDb2RlID0gKGF3YWl0IGNvbW1hbmQoKSkgPz8gMDtcbiAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmROYW1lKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUmVjYXBzIGV2ZXJ5IGNvbXBsZXRlZCBzdGVwLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBhbmQgaXRzIHBlci1jb21tYW5kIG91dHB1dCBpcyB1bmV2ZW46IGFcbiAqIHN1Y2Nlc3NmdWwgYGNsZWFudXBgIHByaW50cyBub3RoaW5nIGF0IGFsbCB3aGlsZSBgdHlwZWNoZWNrYCBwcmludHMgcGVyLXBhY2thZ2UgcHJvZ3Jlc3MuIFJlYWRpbmdcbiAqIGEgcGFzc2luZyBydW4gdGhlcmVmb3JlIGdhdmUgbm8gZXZpZGVuY2UgdGhhdCBsaW50aW5nIGhhcHBlbmVkLCBzbyB0aGUgcmVjYXAgbGlzdHMgZWFjaCBzdGVwIHRoYXRcbiAqIHJhbiwgd2hhdCBpdCByYW4sIGFuZCBob3cgbG9uZyBpdCB0b29rLlxuICovXG5mdW5jdGlvbiBwcmludFZlcmlmeVN1bW1hcnkoc3RlcHM6IFZlcmlmeVN0ZXBbXSwgZHJ5UnVuOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChzdGVwcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBuYW1lV2lkdGggPSBNYXRoLm1heCguLi5zdGVwcy5tYXAoKHN0ZXApID0+IHN0ZXAubmFtZS5sZW5ndGgpKTtcbiAgLy8gYC0tZHJ5LXJ1bmAgc2tpcHMgY29tbWFuZCBleGVjdXRpb24sIHNvIGV2ZXJ5IHN0ZXAgdG9vayBubyB0aW1lIGFuZCB2ZXJpZmllZCBub3RoaW5nOiBhIGdyZWVuXG4gIC8vIFwiVmVyaWZpZWRcIiByZWNhcCB3b3VsZCBjbGFpbSBleGFjdGx5IHRoZSB3b3JrIHRoZSBmbGFnIHN1cHByZXNzZWQuIExpc3Qgd2hhdCB3b3VsZCBydW4gaW5zdGVhZC5cbiAgaWYgKGRyeVJ1bikge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRHJ5IHJ1biDigJQgbm90aGluZyB3YXMgZXhlY3V0ZWQuIFN0ZXBzIHRoYXQgd291bGQgcnVuOicpKSk7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7XG4gICAgICAvLyBQYWQgb25seSB3aGVuIGEgZGV0YWlsIGZvbGxvd3MsIHNvIGEgZGV0YWlsLWxlc3Mgc3RlcCBkb2VzIG5vdCBlbWl0IHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4gICAgICBjb25zb2xlLmluZm8oYCAgLSAke3N0ZXAuZGV0YWlsID8gc3RlcC5uYW1lLnBhZEVuZChuYW1lV2lkdGgpICsgY2hhbGsuZ3JheShgICAke3N0ZXAuZGV0YWlsfWApIDogc3RlcC5uYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkdXJhdGlvbnMgPSBzdGVwcy5tYXAoKHN0ZXApID0+IGZvcm1hdFN0ZXBEdXJhdGlvbihzdGVwLmR1cmF0aW9uTXMpKTtcbiAgY29uc3QgZHVyYXRpb25XaWR0aCA9IE1hdGgubWF4KC4uLmR1cmF0aW9ucy5tYXAoKGR1cmF0aW9uKSA9PiBkdXJhdGlvbi5sZW5ndGgpKTtcbiAgY29uc3QgdG90YWxEdXJhdGlvbk1zID0gc3RlcHMucmVkdWNlKCh0b3RhbCwgc3RlcCkgPT4gdG90YWwgKyBzdGVwLmR1cmF0aW9uTXMsIDApO1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5ncmVlbihjaGFsay5ib2xkKGBWZXJpZmllZCBpbiAke2Zvcm1hdFN0ZXBEdXJhdGlvbih0b3RhbER1cmF0aW9uTXMpfTpgKSkpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgc3RlcF0gb2Ygc3RlcHMuZW50cmllcygpKSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSAoZHVyYXRpb25zW2luZGV4XSBhcyBzdHJpbmcpLnBhZFN0YXJ0KGR1cmF0aW9uV2lkdGgpO1xuICAgIGNvbnN0IGRldGFpbCA9IHN0ZXAuZGV0YWlsID8gYCAgJHtzdGVwLmRldGFpbH1gIDogJyc7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCcgIOKclCAnKSArIHN0ZXAubmFtZS5wYWRFbmQobmFtZVdpZHRoKSArIGNoYWxrLmdyYXkoYCAgJHtkdXJhdGlvbn0ke2RldGFpbH1gKSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFja2FnZUNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFja2FnZUNvbW1hbmRBcmd2LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHByaW50UmF3T3V0cHV0PzogYm9vbGVhbiB9ID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LmRpclBhdGgpO1xuICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMoY29tbWFuZCwgdW5kZWZpbmVkLCB7XG4gICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgcHJlc2VydmVDb2xvcjogZmFsc2UgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IG9wdGlvbnMucHJpbnRSYXdPdXRwdXQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICghb3B0aW9ucy5wcmludFJhd091dHB1dCkge1xuICAgIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZCwgZXhpdENvZGUsIHJldC5zdGRvdXQpO1xuICB9XG5cbiAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbi8qKlxuICogUHJpbnRzIHBhY2thZ2UgY29tbWFuZCBvdXRwdXQgZm9yIGB3YiB2ZXJpZnlgLlxuICpcbiAqIGB3YiB2ZXJpZnlgIGlzIHByaW1hcmlseSBjb25zdW1lZCBieSBBSSBjb2RpbmcgYWdlbnRzLCBzbyBzdWNjZXNzZnVsIG5vaXN5XG4gKiBjb21tYW5kcyBhcmUgc3VtbWFyaXplZCB3aGlsZSBmYWlsdXJlIG91dHB1dCByZW1haW5zIGF2YWlsYWJsZSBmb3IgZGlhZ25vc2lzLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIFRoZSBleGVjdXRlZCBjb21tYW5kLlxuICogQHBhcmFtIGV4aXRDb2RlIFRoZSBjb21tYW5kIGV4aXQgY29kZS5cbiAqIEBwYXJhbSBvdXRwdXQgVGhlIG1lcmdlZCBzdGRvdXQgYW5kIHN0ZGVyciBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kOiBzdHJpbmcsIGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCAmJiAvXig/OmJ1bnx5YXJuKSAoPzppbnN0YWxsfGdlbi1jb2RlKSQvdS50ZXN0KGNvbW1hbmQpKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdTdWNjZWVkZWQuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRyaW1tZWRPdXRwdXQgPSBvdXRwdXQudHJpbSgpO1xuICBpZiAodHJpbW1lZE91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHRyaW1tZWRPdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRWZXJpZnlGdWxsUmVwb3J0ZXIocHJvamVjdDogUHJvamVjdCk6IHtcbiAgZmFpbDogKGVycm9yPzogdW5rbm93bikgPT4gdm9pZDtcbiAgZmluaXNoOiAoKSA9PiB2b2lkO1xuICBzdWNjZWVkOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHdiRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcud2InKTtcbiAgZnMubWtkaXJTeW5jKHdiRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4od2JEaXJQYXRoLCAndmVyaWZ5LWZ1bGwubG9nJyk7XG4gIGNvbnN0IGxvZ0ZpbGUgPSBmcy5vcGVuU3luYyhsb2dGaWxlUGF0aCwgJ3cnKTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRvdXRXcml0ZSA9IHByb2Nlc3Muc3Rkb3V0LndyaXRlLmJpbmQocHJvY2Vzcy5zdGRvdXQpO1xuICBjb25zdCBvcmlnaW5hbFN0ZGVycldyaXRlID0gcHJvY2Vzcy5zdGRlcnIud3JpdGUuYmluZChwcm9jZXNzLnN0ZGVycik7XG4gIGxldCBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cbiAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZG91dFdyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gdGVlV3JpdGUob3JpZ2luYWxTdGRlcnJXcml0ZSwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihjaGFsay5ib2xkKCdGdWxsIGxvZzonKSwgbG9nRmlsZVBhdGgpKTtcblxuICBjb25zdCBmaW5pc2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGZpbmlzaGVkKSByZXR1cm47XG4gICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUgPSBvcmlnaW5hbFN0ZG91dFdyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IG9yaWdpbmFsU3RkZXJyV3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3RkZXJyLndyaXRlO1xuXG4gICAgY29uc3QgZWxhcHNlZFRpbWUgPSBmb3JtYXRFbGFwc2VkVGltZShEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBzdGF0dXMgPSBzdWNjZWVkZWQgPyAnU3VjY2VlZGVkJyA6ICdGYWlsZWQnO1xuICAgIGNvbnN0IHN1bW1hcnkgPSBgJHtzdGF0dXN9IGluICR7ZWxhcHNlZFRpbWV9LiBGdWxsIGxvZzogJHtsb2dGaWxlUGF0aH1cXG5gO1xuICAgIGNvbnN0IGNvbG9yZWRTdW1tYXJ5ID0gc3VjY2VlZGVkID8gY2hhbGsuZ3JlZW4oc3VtbWFyeSkgOiBjaGFsay5yZWQoc3VtbWFyeSk7XG4gICAgb3JpZ2luYWxTdGRvdXRXcml0ZShjb2xvcmVkU3VtbWFyeSk7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIHN1bW1hcnkpO1xuICAgIGZzLmNsb3NlU3luYyhsb2dGaWxlKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCBmaW5pc2gpO1xuXG4gIHJldHVybiB7XG4gICAgZmFpbDogKGVycm9yKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbmlzaDogKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignZXhpdCcsIGZpbmlzaCk7XG4gICAgICBmaW5pc2goKTtcbiAgICB9LFxuICAgIHN1Y2NlZWQ6ICgpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGVlV3JpdGUob3JpZ2luYWxXcml0ZTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlLCBsb2dGaWxlOiBudW1iZXIpOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUge1xuICByZXR1cm4gKChcbiAgICBjaHVuazogVWludDhBcnJheSB8IHN0cmluZyxcbiAgICBlbmNvZGluZ09yQ2FsbGJhY2s/OiBCdWZmZXJFbmNvZGluZyB8ICgoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpLFxuICAgIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkXG4gICkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9XG4gICAgICB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnXG4gICAgICAgID8gQnVmZmVyLmZyb20oY2h1bmssIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdzdHJpbmcnID8gZW5jb2RpbmdPckNhbGxiYWNrIDogJ3V0ZjgnKVxuICAgICAgICA6IGNodW5rO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBidWZmZXIpO1xuICAgIC8vIFdyaXRlIHRvIHRoZSB0ZXJtaW5hbCB2aWEgdGhlIG9yaWdpbmFsIHN0cmVhbSBtZXRob2Q6IGEgc3luY2hyb25vdXMgZnMud3JpdGVTeW5jIG9uIHRoZVxuICAgIC8vIHN0ZG91dC9zdGRlcnIgZmQgdGhyb3dzIEVBR0FJTiBvbiBDSSdzIG5vbi1ibG9ja2luZyBwaXBlcyB3aGVuIGxhcmdlIG91dHB1dCBmbHVzaGVzIGF0IG9uY2UsXG4gICAgLy8gd2hpbGUgdGhlIHN0cmVhbSBtZXRob2QgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBoYW5kbGVzIGJhY2twcmVzc3VyZS5cbiAgICByZXR1cm4gb3JpZ2luYWxXcml0ZShidWZmZXIsIHR5cGVvZiBlbmNvZGluZ09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiBjYWxsYmFjayk7XG4gIH0pIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbn1cblxuLyoqIFN1Yi1taW51dGUgc3RlcHMga2VlcCBvbmUgZGVjaW1hbCBzbyBhIGZhc3Qgc3RlcCBpcyBub3QgZmxhdHRlbmVkIHRvIGEgbWlzbGVhZGluZyBgMHNgLiAqL1xuZnVuY3Rpb24gZm9ybWF0U3RlcER1cmF0aW9uKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG1pbGxpc2Vjb25kcyA8IDYwXzAwMCkge1xuICAgIHJldHVybiBgJHsobWlsbGlzZWNvbmRzIC8gMTAwMCkudG9GaXhlZCgxKX1zYDtcbiAgfVxuICByZXR1cm4gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RWxhcHNlZFRpbWUobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcbiAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICByZXR1cm4gYCR7cmVtYWluaW5nU2Vjb25kc31zYDtcbiAgfVxuICByZXR1cm4gYCR7bWludXRlc31tICR7cmVtYWluaW5nU2Vjb25kc31zYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcywgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBwcm90ZWN0UnVuU2NyaXB0QXJncyB9IGZyb20gJy4uL2Jpbi9ydW5BcmdzLmpzJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNoZWNrRW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvY2hlY2tFbnYuanMnO1xuaW1wb3J0IHsgY29uY3VycmVudGx5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvY29uY3VycmVudGx5LmpzJztcbmltcG9ydCB7IGRlcGxveUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2RlcGxveS5qcyc7XG5pbXBvcnQgeyBkb3RlbnZDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9kb3RlbnYuanMnO1xuaW1wb3J0IHsgZ2VuQ29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkNvZGUuanMnO1xuaW1wb3J0IHsgZ2VuRGV2VmFyc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkRldlZhcnMuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRJZk5vbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG1haW50ZW5hbmNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbWFpbnRlbmFuY2UuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJhaWx3YXlFbnZDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yYWlsd2F5RW52LmpzJztcbmltcG9ydCB7IHJlbGVhc2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9yZWxlYXNlLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgcnVuQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cFByaXZhdGVQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5wcm90ZWN0UnVuU2NyaXB0QXJncyhwcm9jZXNzLmFyZ3YpO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICAvLyBXYXJuIG9ubHkgd2hlbiBhIHNoaW0gYWN0dWFsbHkgd2lucyBgbm9kZWAgcmVzb2x1dGlvbjogb3Zlbi9idW4gaW1hZ2VzIGFwcGVuZCBhIGhhcm1sZXNzXG4gICAgLy8gL3Vzci9sb2NhbC9idW4tbm9kZS1mYWxsYmFjay1iaW4gKG5vZGUgLT4gYnVuKSBhdCB0aGUgRU5EIG9mIFBBVEgsIHNvIGEgUEFUSCBzdWJzdHJpbmdcbiAgICAvLyBjaGVjayBmYWxzZS1wb3NpdGl2ZXMgd2hlbmV2ZXIgYSByZWFsIG5vZGUgcHJlY2VkZXMgaXQuXG4gICAgY29uc3Qgbm9kZU9uUGF0aCA9IGZpbmRGaXJzdE5vZGVPblBhdGgoKTtcbiAgICBpZiAobm9kZU9uUGF0aCAmJiBpc0J1bk5vZGVTaGltKG5vZGVPblBhdGgpKSB7XG4gICAgICAvLyBOb3QgZml4ZWQgdXAgaGVyZTogdG9vbHMgcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCkgbWF5IGhhbmcgb3JcbiAgICAgIC8vIGNyYXNoIHVuZGVyIHRoZSBzaGltLCBhbmQgc29tZSAod3JhbmdsZXIgZGV2KSBmYWlsIHNpbGVudGx5LCBzbyBzdXJmYWNlIHRoZSBjYXVzZSB1cGZyb250LlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgV2FybmluZzogXFxgbm9kZVxcYCBvbiBQQVRIIGlzIGEgQnVuIHNoaW0gKCR7bm9kZU9uUGF0aH0pOyBgICtcbiAgICAgICAgICAncnVuIHdiIHdpdGhvdXQgYC0tYnVuYCBhbmQgcmVtb3ZlIGBbcnVuXSBidW5gIGZyb20gYnVuZmlnLnRvbWwuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndi5fWzBdICE9PSAncnVuJykgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQodmVyaWZ5Q29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChjaGVja0VudkNvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gIC5jb21tYW5kKGRvdGVudkNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkNvZGVDb21tYW5kKVxuICAuY29tbWFuZChnZW5EZXZWYXJzQ29tbWFuZClcbiAgLmNvbW1hbmQoa2lsbFBvcnRJZk5vbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG1haW50ZW5hbmNlQ29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJhaWx3YXlFbnZDb21tYW5kKVxuICAuY29tbWFuZChyZWxlYXNlQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChydW5Db21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0cmVlS2lsbENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbi8qKiBUaGUgZmlyc3QgZXhlY3V0YWJsZSBgbm9kZWAgb24gUEFUSCwgaS5lLiB0aGUgb25lIGNoaWxkIHByb2Nlc3NlcyB3aWxsIHJ1bi4gKi9cbmZ1bmN0aW9uIGZpbmRGaXJzdE5vZGVPblBhdGgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBkaXIgb2YgKHByb2Nlc3MuZW52LlBBVEggPz8gJycpLnNwbGl0KHBhdGguZGVsaW1pdGVyKSkge1xuICAgIGlmICghZGlyKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG5vZGVQYXRoID0gcGF0aC5qb2luKGRpciwgJ25vZGUnKTtcbiAgICB0cnkge1xuICAgICAgZnMuYWNjZXNzU3luYyhub2RlUGF0aCwgZnMuY29uc3RhbnRzLlhfT0spO1xuICAgICAgLy8gWF9PSyBhbHNvIHBhc3NlcyBmb3Igc2VhcmNoYWJsZSBkaXJlY3Rvcmllcywgd2hpY2ggZXhlY3ZwIHNraXBzLlxuICAgICAgaWYgKGZzLnN0YXRTeW5jKG5vZGVQYXRoKS5pc0ZpbGUoKSkgcmV0dXJuIG5vZGVQYXRoO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm90IHByZXNlbnQgb3Igbm90IGV4ZWN1dGFibGUgaW4gdGhpcyBkaXJlY3Rvcnk7IGtlZXAgc2VhcmNoaW5nLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0J1bk5vZGVTaGltKG5vZGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gYGJ1biAtLWJ1bmAgYW5kIGJ1bmZpZydzIGBydW4uYnVuYCBwcmVwZW5kIGEgYnVuLW5vZGUtPHZlcnNpb24+IGRpcmVjdG9yeSB3aG9zZSBgbm9kZWAgbGlua3NcbiAgLy8gdG8gYnVuLCBhbmQgb3Zlbi9idW4gaW1hZ2VzIHN5bWxpbmsgbm9kZSAtPiBidW4gaW4gYnVuLW5vZGUtZmFsbGJhY2stYmluLCBzbyB0aGUgZ2l2ZWF3YXkgaXNcbiAgLy8gZWl0aGVyIGEgYnVuLW5vZGUtIHBhdGggc2VnbWVudCBvciBhIHJlc29sdXRpb24gdG8gdGhlIGJ1biBiaW5hcnkgaXRzZWxmLlxuICAvLyBTaGltcyBsaXZlIGRpcmVjdGx5IGluIGEgYnVuLW5vZGUtPHZlcnNpb24+IGRpcmVjdG9yeSwgc28gY2hlY2sgb25seSB0aGUgaW1tZWRpYXRlIHBhcmVudFxuICAvLyAocmVsYXRpdmUgUEFUSCBlbnRyaWVzIGluY2x1ZGVkKTogbWF0Y2hpbmcgYW5jZXN0b3JzIHdvdWxkIGZhbHNlLXBvc2l0aXZlIG9uIGUuZy4gYSByZWFsIG5vZGVcbiAgLy8gaW5zaWRlIGEgYnVuLW5vZGUtd29ya3NwYWNlIGNoZWNrb3V0LlxuICBpZiAocGF0aC5iYXNlbmFtZShwYXRoLmRpcm5hbWUobm9kZVBhdGgpKS5zdGFydHNXaXRoKCdidW4tbm9kZS0nKSkgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdGguYmFzZW5hbWUoZnMucmVhbHBhdGhTeW5jKG5vZGVQYXRoKSkgPT09ICdidW4nO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxubGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuZm9yIChjb25zdCBzaWduYWwgb2YgWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgcHJvY2Vzcy5vbihzaWduYWwsICgpID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG5cbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwcm9jZXNzLnBpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRyZWVLaWxsKCR7cHJvY2Vzcy5waWR9KSBkdXJpbmcgc2h1dGRvd246YCwgZXJyb3IpO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoKTtcbiAgfSk7XG59XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzksMTAsMTEsMTIsMTNdLCJtYXBwaW5ncyI6IjgyQkFlQSxTQUFnQixFQUFvQyxFQUFtQyxFQUErQixDQUNwSCxPQUFPLEdBQ0wsRUFBdUMsQ0FBVSxDQUFDLENB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QyxFQUFFQyxHQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLFdBQVcsV0FBVyxNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsV0FBVyxNQUFNLFdBQVcsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLFdBQVcsTUFBTSxXQUFXLE1BQU0sV0FBVyxNQUFNLFdBQVcsSUFBSSxXQUFXLE1BQU0sRUFBRSxXQUFXLFdBQVcsV0FBVyxXQUFXLE1BQU0sV0FBVyxXQUFXLEVBQUUsV0FBVyxVQUFVLENBQUMsRUFBRUMsR0FBRSxJQUFJLFdBQVcsRUFBRSxFQUFFQyxHQUFFLElBQUksV0FBVyxFQUFFLEVBQUVDLEdBQUUsSUFBSSxZQUFZLElBQUksRUFBRSxJQUFJLFdBQVcsSUFBSSxFQUFFLEdBQUUsSUFBSSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLFdBQVcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLEVBQUUsRUFBRSxHQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUVBLEdBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRUYsR0FBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUVDLEdBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLFdBQVcsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUdILEVBQUUsRUFBRSxLQUFLQSxFQUFFLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEdBQUcsR0FBRyxLQUFLQSxFQUFFLElBQUksSUFBSUEsRUFBRSxFQUFFLEtBQUtBLEVBQUUsR0FBRyxFQUFFLEtBQUtBLEVBQUUsR0FBRyxHQUFHLEtBQUtBLEVBQUUsSUFBSSxJQUFJQSxFQUFFLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxHQUFHLEdBQUcsS0FBS0EsRUFBRSxJQUFJLElBQUlBLEVBQUUsRUFBRSxLQUFLQSxFQUFFLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEdBQUcsR0FBRyxLQUFLQSxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBQUcsRUFBRyxFQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRyxHQUFHLEdBQUcsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxHQUFFLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxFQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRSxHQUFFLEVBQUUsR0FBRSxFQUFHLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxFQUFHLEVBQUcsR0FBRSxFQUFFLEdBQUUsR0FBRSxHQUFHLEVBQUUsR0FBRyxHQUFFLEdBQUUsR0FBRSxHQUFHLEVBQUUsR0FBRSxHQUFFLEVBQUUsR0FBRSxHQUFHLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFHLEVBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFHLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFHLEVBQUUsR0FBRSxHQUFFLEVBQUUsRUFBRyxHQUFHLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSyxJQUFJLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxHQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsR0FBSSxFQUFFLEdBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxJQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFJLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLEdBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxJQUFHLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBRSxJQUFHLEVBQUUsR0FBRyxFQUFFLElBQUcsRUFBRSxHQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFFLEVBQUUsR0FBRSxHQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsR0FBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEVBQUcsR0FBRyxFQUFFLEtBQUksR0FBRyxFQUFHLElBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRyxJQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxHQUFHLEdBQUksR0FBRyxJQUFLLEdBQUcsR0FBRyxHQUFJLEdBQUcsSUFBSyxHQUFHLEVBQUcsSUFBRyxFQUFFLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxLQUFJLEdBQUcsRUFBRSxJQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUcsR0FBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxFQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxFQUFFLEtBQUksR0FBRyxHQUFHLElBQUcsRUFBRSxLQUFJLEdBQUcsRUFBRyxJQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUcsR0FBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUcsR0FBRyxLQUFJLEdBQUcsR0FBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRyxHQUFHLEdBQUcsS0FBSSxFQUFFLEVBQUcsSUFBRyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsR0FBRyxJQUFHLEdBQUcsS0FBSSxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQUcsSUFBRyxHQUFHLEtBQUksRUFBRSxHQUFHLElBQUcsR0FBRyxLQUFJLEVBQUUsRUFBRyxJQUFHLEdBQUcsS0FBSSxHQUFHLEVBQUcsSUFBRyxHQUFHLEtBQUksR0FBRyxHQUFHLElBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUUsS0FBSSxHQUFHLEdBQUcsR0FBSSxFQUFFLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxJQUFLLEdBQUcsRUFBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxHQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUcsR0FBRSxFQUFFLENBQUMsRUFBRyxFQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsRUFBRSxFQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxFQUFFLENBQUMsRUFBRyxFQUFHLEdBQUcsRUFBRyxDQUFDLEVBQUcsRUFBRyxFQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxHQUFHLEdBQUUsRUFBRyxDQUFDLEVBQUcsRUFBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUUsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFFLEdBQUUsRUFBRyxDQUFDLEdBQUcsRUFBRyxHQUFFLEVBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxFQUFHLEdBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRSxFQUFHLENBQUMsRUFBRSxFQUFFLEdBQUUsRUFBRyxDQUFDLEVBQUUsRUFBRyxHQUFFLEdBQUcsQ0FBQyxFQUFHLEVBQUcsR0FBRSxFQUFHLENBQUMsRUFBRyxFQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUcsR0FBRyxHQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUdDLEdBQUUsR0FBRyxJQUFHQSxHQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksRUFBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxDQ1JyMkksTUFBTSxHQUFFSSxHQUFFLEVBQUVDLEdBQUUsSUFBSSxZQUFZQyxHQUFFLElBQUksWUFBWSxPQUFPLEVBQUUsU0FBU0YsSUFBRyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxTQUFTLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLElBQUssSUFBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLElBQUssS0FBSSxFQUFFLFFBQVEsSUFBSyxJQUFHLEVBQUUsS0FBSyxJQUFLLEVBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFNBQVMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUssR0FBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUssS0FBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLFdBQVcsS0FBSyxHQUFHLENBQUMsS0FBS0UsR0FBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUtELEdBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVMsSUFBSSxJQUFJLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxJQUFJLElBQUksU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQ0FqMEIsU0FBUyxHQUFFLEVBQUUsRUFBRSxHQUFFLENBQUMsT0FBTyxLQUFLLFVBQVVFLEdBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVNDLEdBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFLLEdBQUUsTUFBTSxHQUFHLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FBQyxHQUFHLE9BQU8sTUFBTSxDQUFDLEVBQUUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVNELEdBQUUsRUFBRSxFQUFFLEdBQUUsQ0FBQyxJQUFJLEVBQUVDLEdBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxLQUFLLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRUEsR0FBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFLLEdBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sT0FBTyxFQUF6QixDQUE0QixJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxPQUFPLEdBQUcsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSyxHQUFFLEdBQUcsSUFBSSxJQUFLLEdBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENDQXQ4QixTQUFTQyxHQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU9DLEdBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFpQyxTQUFTQyxJQUFHLENBQUMsTUFBTSxFQUFFLENDQTFGLE1BQU0sRUFBRSxHQUFFLENBQUMsWUFBWUMsRUFBQyxDQUFDLEVBQUksR0FBRSxDQUFDLFlBQVlDLEVBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLFlBQVksRUFBRUQsSUFBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEdBQUcsT0FBTyxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxF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
|