@willbooster/wbfy 20.6.0 → 20.7.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.
Files changed (2) hide show
  1. package/dist/index.js +3 -2
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -63,7 +63,8 @@ alwaysApply: true
63
63
  - Always create new commits; avoid \`--amend\`.${_}${v}
64
64
  - In any explanatory text (commit messages, PR descriptions, documentation, code comments, etc.), describe only what exists in the final snapshot: never mention symbols or concepts that were added and later removed or renamed along the way, even if they mattered during the work. If you cannot confirm that an identifier or feature name you are about to write exists in the final diff or the current codebase, drop that statement.
65
65
  - Use heredoc for multi-line command input (e.g., \`git commit -F -\`, \`gh pr create --body-file -\`, \`gh issue create --body-file -\`).
66
- - Put temporary files in \`.tmp\`; use \`/tmp\` only for files that must live outside the repo.${c}
66
+ - Put temporary files in \`.tmp\`; use \`/tmp\` only for files that must live outside the repo.
67
+ - \`AGENTS.md\`, \`CLAUDE.md\`, \`GEMINI.md\`, \`.cursor/rules/general.mdc\`, and \`.gemini/styleguide.md\` are generated from \`AGENTS_EXTRA.md\` and overwritten on every \`wbfy\` run; edit only \`AGENTS_EXTRA.md\` to change agent instructions.${c}
67
68
  - \`bunfig.toml\` uses Bun's isolated linker, so only declared dependencies resolve. If an import fails to resolve, declare that package in the \`package.json\` that imports it; never switch \`linker\` to \`hoisted\` or add to \`publicHoistPattern\` to work around it.${s}${p}${m}${h}
68
69
 
69
70
  ${wr(n,r)}
@@ -552,4 +553,4 @@ labels: 't: feat :sparkles:'
552
553
  `);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Ll(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of Nl){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Rl(a)&&(Bl(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Rl(e){return zl(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith(`git:`)||e.startsWith(`git+`)||e.startsWith(`ssh://git@`)}function zl(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function Bl(e){return Fl.some(t=>t.test(e))}const Vl=`apply-release-age-gate`,Hl=`generate-user-agent-configs`;async function Ul(){let e=await o(process.argv.slice(2)).command(Vl,`Apply only the organization's minimum-release-age policy to this machine's global package-manager configs`).command(Hl,`Overwrite this user's agent instruction files (~/.codex/AGENTS.md, ~/.claude/CLAUDE.md, ~/.gemini/GEMINI.md) with the organization's fixed content and merge the organization's settings into ~/.claude/settings.json`).command(`$0 [paths..]`,`Make a given project follow the WillBooster standard`,e=>{e.positional(`paths`,{describe:`project paths to be wbfied`,array:!0,type:`string`,default:[`.`]})}).options({force:{description:`Apply wbfy even when the repository already records this wbfy version`,type:`boolean`,default:!1,alias:`f`},skipDeps:{description:"Skip adding managed dependencies and the linker probe (the final `bun install` refreshing the lockfile still runs)",type:`boolean`,default:!1,alias:`d`},verbose:{description:`Whether or not to enable verbose mode`,type:`boolean`,default:!1,alias:`v`}}).version(ii()).strict().argv;if(E.isVerbose=e.verbose,e._[0]===Vl){yi()||(process.exitCode=1);return}if(e._[0]===Hl){await Gc()||(process.exitCode=1);return}let t=!1;try{t=await Wl(e.paths,e.skipDeps,e.force)}finally{await Ce()}t&&(process.exitCode=1)}async function Wl(n,r,i){yi();let a=Bun.version;if(Bun.semver.order(a,`1.4.0`)<0)return console.error(`wbfy requires Bun >= ${ml} (found ${a}). Upgrade Bun and re-run.`),!0;let o=oi(),s=!i&&o&&!o.endsWith(`-dirty-local`)?o:void 0,c=!1;for(let i of n){let n=t.resolve(i);if(k.setRootDirPath(e.existsSync(n)?n:void 0),!gl(n)){console.error(`Skip ${n}: mise.toml must pin Bun to one exact version >= ${ml} or omit it. Update the pin and re-run.`),c=!0;continue}if(s&&await Gs(n)===s){console.info(`Skip ${n}: wbfy ${s} is already applied. Pass --force to re-apply.`);continue}let a=t.join(n,`packages`),o=(await ae(()=>e.promises.readdir(a,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.resolve(a,e.name)),l=zt({dirPath:n,packageJson:C(()=>JSON.parse(e.readFileSync(t.resolve(n,`package.json`),`utf8`)))??{},doesContainSubPackageJsons:o.some(n=>e.existsSync(t.resolve(n,`package.json`)))}),u=[...new Set([...o,...l])].filter(e=>e!==t.resolve(n)),d=[...[`.gitattributes`,`bunfig.toml`,`lefthook.yml`,`package.json`,`tsconfig.json`].map(e=>t.resolve(n,e)),...u.flatMap(e=>[`package.json`,`tsconfig.json`].map(n=>t.resolve(e,n)))];if((await Promise.all(d.map(e=>k.isConfinedWritablePath(e)))).includes(!1)){console.error(`Skip ${n}: a managed config file is a symlink or resolves outside the repository.`),c=!0;continue}let f=[n,...u].flatMap(n=>{let r=t.resolve(n,`package.json`);if(!e.existsSync(r))return[];try{let t=Kn({packageJson:JSON.parse(e.readFileSync(r,`utf8`))});return t?[`${n}: ${t}`]:[]}catch{return[`${r} is invalid`]}});if(f.length>0){console.error(`Skip ${n}:\n${f.join(`
553
554
  `)}`),c=!0;continue}let p=await Wn(n);if(E.isVerbose,!p){console.error(`there is no valid package.json in ${n}`),c=!0;continue}let m=await Promise.all(u.map(e=>Wn(e,{isRoot:!1}))),h=u.find((n,r)=>!m[r]&&e.existsSync(t.join(n,`package.json`)));if(h){console.error(`Skip ${n}: ${h}/package.json is invalid.`),c=!0;continue}let g=[p,...m.filter(e=>!!e)],_=g.some(e=>e.isCloudflare)?R(`git`,[`-c`,`core.quotePath=false`,`ls-files`,`--`,`.env.cloudflare`,`*/.env.cloudflare`],p.dirPath).split(`
554
555
  `).filter(Boolean).map(e=>t.resolve(p.dirPath,e)):[];if(_.length>0){console.error(`SECURITY ERROR: Cloudflare credentials must be untracked. Remove ${_.join(`, `)} from Git, purge the token from history, and rotate CLOUDFLARE_API_TOKEN before rerunning wbfy.`),c=!0;continue}let v=hn(p);if(await bl(g),E.isVerbose)for(let e of g)console.info(e);Il(g);let y=Ar(n),ee=jr(g,y,r);await Nr(p,ee),await hl(p),await at(p),await Zc(p,g),await A.promiseAll(),!r&&p.doesContainPackageJson&&!Gl(n,p,y,ee)&&console.warn(`bun install currently fails in ${n} under the isolated linker.`);let b=!$t(p.repository)&&(p.repository?.startsWith(`github:WillBooster/`)||p.repository?.startsWith(`github:WillBoosterLab/`)),te=!b&&!$t(p.repository)&&!!p.repository?.startsWith(`github:`)&&p.isRoot;await Promise.all([v.then(()=>Ks(p)),Wr(p),Kr(p),Yr(p,g),Zr(p),Ml(p),xi(p),zs(p),fc(p),cc(p),...b?[Qt(p)]:[],...te?[al(p,g)]:[],Sl(p),El(p),Al(p),...p.isRoot?[ms(p,g)]:[]]),await A.promiseAll(),await yr(p,g),await A.promiseAll();let x=[];for(let e of g)e.depending.playwrightTest&&x.push(Le(e)),e.depending.next&&x.push(Te(e)),e.depending.chakra&&x.push(Me(e)),await ei(e,p),await A.promiseAll(),!(!e.isRoot&&!e.doesContainPackageJson)&&(bi(e)&&await Is(e),await Ra(e,p,r),e.doesContainVscodeSettingsJson&&x.push(Jc(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&x.push(gc(e)),H(e)?(x.push(As(e)),x.push(Ns(e,p))):!e.isRoot&&e.doesContainPackageJson&&H(p)&&x.push(Ns(e,p)),e.depending.pyright&&x.push(Rs(e)));await Promise.all(x),await A.promiseAll(),Qr(n);try{ql(n)}catch(e){console.error(`Failed to refresh the Bun lockfile:`,e?.message??e),c=!0}try{let e=me(n);e&&console.info(`Removed Takumi Guard proxy URLs from ${e} to keep it registry-agnostic.`)}catch(e){console.error(`Failed to normalize the Bun lockfile:`,e?.message??e),c=!0}Ln(`bun`,[`cleanup`],n)}return c}function Gl(e,t,n,r){return n!==r&&Kl(e,t),Rn(`bun`,[`install`],e,1)===0||(Kl(e,t),!1)}function Kl(n,r){let i=[t.resolve(n,`node_modules`),...[...Lo(r).values()].map(e=>t.resolve(n,e,`node_modules`))],a=e.realpathSync(n);for(let n of i){let r=C(()=>e.realpathSync(t.dirname(n)));!r||r!==a&&!r.startsWith(a+t.sep)||e.rmSync(n,{recursive:!0,force:!0})}}function ql(e){let t=Rn(`bun`,[`install`],e,1);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await Ul();
555
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInBhcnNlSnNvbmMiLCJmc3AiLCJyZWxlYXNlQWdlR2F0ZS5kYXlzIiwicmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMiLCJuZXdDb250ZW50IiwiY29tbW9uQ29udGVudCIsIm5ld0NvbnRlbnQiLCJjaGlsZF9wcm9jZXNzIiwiY29tbW9uQ29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJzb3J0T2JqZWN0S2V5cyIsImdpdEhvb2tzIiwiZGV0ZWN0TmV3bGluZSIsImRlcGVuZGVuY3lTZWN0aW9uS2V5cyIsImNvcmUiLCJtYW5hZ2VkQ29uZmlnQmxvY2tzIiwiZ2V0Q29uZmlnQ29udGVudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9qc29uY1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3N0cmluZ1V0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTYzNTFiOTJmODI2MTU2ZjQvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3diRW52LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWlzZVRvbWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9ucG1yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbi8qKiBUaGUgYHdvcmtzcGFjZXNgIGZpZWxkIG9mIGEgcm9vdCBwYWNrYWdlLmpzb246IHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZXNEZWNsYXJhdGlvbiA9IHN0cmluZ1tdIHwgeyBwYWNrYWdlcz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSB0aGF0IEJ1biB3b3VsZCBsaW5rXG4gKiBmb3IgdGhlIGdpdmVuIHJvb3QgcGFja2FnZS5qc29uIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbi4gQ2Fub25pY2FsaXplcyB0aGUgZGVjbGFyZWQgcGF0dGVybnNcbiAqIChzZWUgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMpLCBkcm9wcyBwYXR0ZXJucyBlc2NhcGluZyB0aGUgcmVwb3NpdG9yeSAoc2VlXG4gKiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4pLCBhbmQgcmVzb2x2ZXMgdGhlIHJlc3Qgd2l0aCBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhcbiAgICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybilcbiAgICApLFxuICAgIHJvb3REaXJQYXRoXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHRvIHBhY2thZ2UuanNvbiBwYXRocyBtaW1pY2tpbmcgQnVuJ3MgU0VRVUVOVElBTCBldmFsdWF0aW9uLFxuICogZGVyaXZlZCBlbXBpcmljYWxseSB3aXRoIEJ1biAxLjMuMTQgKGZpeHR1cmUgcmVwb3Mgb2JzZXJ2ZWQgdmlhIGBidW4gaW5zdGFsbCAtLWxvY2tmaWxlLW9ubHlgO1xuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDQgLyBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNSk6XG4gKiAxLiBQYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyIGludG8gYW4gYWNjdW11bGF0aW5nIHNldDogYSBwb3NpdGl2ZSBnbG9iXG4gKiAgICBwYXR0ZXJuIGFkZHMgZXZlcnkgcGFja2FnZS5qc29uIGl0IG1hdGNoZXM7IGEgbmVnYXRpb24gZGVsZXRlcyBpdHMgbWF0Y2hlcyBmcm9tIHRoZSBzZXRcbiAqICAgIGFjY3VtdWxhdGVkIFNPIEZBUiwgc28gYSBsYXRlciBwb3NpdGl2ZSByZS1hZGRzIHRoZW0gKGBbXCIhYXBwcy9leGNsdWRlZFwiLCBcImFwcHMvKlwiXWAgbGlua3NcbiAqICAgIGFwcHMvZXhjbHVkZWQsIHdoaWxlIGBbXCJhcHBzLypcIiwgXCIhYXBwcy9leGNsdWRlZFwiXWAgZG9lcyBub3QpLlxuICogMi4gQSBuZWdhdGlvbiB3aG9zZSBub3JtYWxpemVkIGJvZHkgaGFzIEVYQUNUTFkgdHdvIHNlZ21lbnRzLCB3aG9zZSBsYXN0IHNlZ21lbnQgaXMgYSBzdGFyLXJ1blxuICogICAgKGAqYCwgYCoqYCwgYCoqKmAsIOKApiksIGFuZCB3aG9zZSBmaXJzdCBzZWdtZW50IGlzIE5PVCBpdHNlbGYgYSBzdGFyLXJ1biBmaXJzdCBzZWVkcyB0aGVcbiAqICAgIGltcGxpY2l0IGJhc2VsaW5lIGludG8gdGhlIHNldCwgdGhlbiBkZWxldGVzIGl0cyBvd24gbWF0Y2hlczogYSBgKipgIGxhc3Qgc2VnbWVudCBzZWVkc1xuICogICAgYCoqYCAocGFja2FnZXMgYXQgYW55IGRlcHRoKSwgYW55IG90aGVyIHN0YXItcnVuIHNlZWRzIGAqXFwvKmAgKGRlcHRoIDIgb25seSkuIFNlZWRpbmdcbiAqICAgIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnMgKGBbXCJhcHBzLypcIiwgXCIhb3RoZXIvKlwiXWAgbGlua3MgZXZlcnkgZGVwdGgtMlxuICogICAgcGFja2FnZSBvdXRzaWRlIG90aGVyLykuIE5vIG90aGVyIG5lZ2F0aW9uIHNoYXBlIHNlZWRzOiBgISpgLCBgISoqYCwgYCEqXFwvKmAsIGAhKlxcLyoqYCxcbiAqICAgIGAhKipcXC8qYCwgYCFhL2IvKmAsIGAhYS9iLyoqYCwgYCFkaXJgLCBhbmQgYCFkaXIvKnhgIGVhY2ggbGluayBub3RoaW5nIG9uIHRoZWlyIG93bi5cbiAqICAgIGA/YCwgYnJhY2UsIGFuZCBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmUgRVJSQVRJQ0FMTFkgKGBbXCIhb3RoZXIvP1wiXWAgbGlua3NcbiAqICAgIHBhY2thZ2VzL2EgeWV0IG5vdCB0aGUgZXF1YWxseSBiYXNlbGluZS1zaGFwZWQgb3RoZXIveXksIGBbXCIhb3RoZXIvPz9cIl1gIGxpbmtzIG5vdGhpbmcsIGFuZFxuICogICAgYFtcIiE/Lz9cIl1gIGxpbmtzIHRoZSB2ZXJ5IG90aGVyL3ggaXQgbWF0Y2hlcyksIHNvIG5vIGNvbnNpc3RlbnQgcnVsZSBjYW4gbW9kZWwgdGhlbTsgdGhleVxuICogICAgYXJlIGRlbGliZXJhdGVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nIOKAlCBzZWUgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSBhbmQgIzEwMDUuXG4gKiAzLiBBIG5vbi1nbG9iIHBvc2l0aXZlIHBhdHRlcm4gUElOUyBpdHMgZGlyZWN0b3J5OiBpdCBzdGF5cyBhIHdvcmtzcGFjZSByZWdhcmRsZXNzIG9mIHdoZXJlIGFcbiAqICAgIG1hdGNoaW5nIG5lZ2F0aW9uIGFwcGVhcnMgKGBbXCJvdGhlci94XCIsIFwiIW90aGVyL3hcIl1gIGFuZCBgW1wiIW90aGVyL3hcIiwgXCJvdGhlci94XCJdYCBib3RoXG4gKiAgICBsaW5rIG90aGVyL3gpLlxuICogNC4gYCoqYCBtYXRjaGVzIHplcm8gb3IgbW9yZSBwYXRoIHNlZ21lbnRzIChgW1wiYXBwcy8qKlwiXWAgbGlua3MgdGhlIHBhY2thZ2UgYXQgYXBwcyBpdHNlbGYsIGFuZFxuICogICAgYCFhcHBzLyoqYCBkZWxldGVzIGl0KSwgbWF0Y2hpbmcgZmFzdC1nbG9iJ3MgZmlsZS1nbG9iIHNlbWFudGljcy5cbiAqIERvIG5vdCBhcHBseSBnbG9iSWdub3JlIGhlcmU6IHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIGRlZmluZWQgc29sZWx5IGJ5IHRoZSBkZWNsYXJlZCBwYXR0ZXJucyxcbiAqIGFuZCBzb3VyY2Utc2Nhbm5pbmcgaWdub3JlcyBzdWNoIGFzIGBidWlsZGAgb3IgYGRpc3RgIHdvdWxkIGhpZGUgbGVnaXRpbWF0ZWx5IG5hbWVkIHdvcmtzcGFjZVxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJuczogc3RyaW5nW10sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlIHN0b3BzIEdMT0IgdHJhdmVyc2FsIHRocm91Z2ggc3ltbGlua3MsIGJ1dCBhIG5vbi1nbG9iIHBhdHRlcm5cbiAgLy8gbmFtaW5nIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBgbGlua2VkYCB3aXRoIGBsaW5rZWQgLT4gLi4vb3RoZXItcmVwb2ApIHN0aWxsIG1hdGNoZXMg4oCUXG4gIC8vIGZhc3QtZ2xvYiByZXNvbHZlcyBzdGF0aWMgcGF0dGVybnMgd2l0aCBkaXJlY3QgZnMgY2hlY2tzLCBhbmQgQnVuIGRvZXMgbGluayBzdWNoIGEgd29ya3NwYWNlLlxuICAvLyBEZWxpYmVyYXRlbHkgZGl2ZXJnZSBmcm9tIEJ1biB0aGVyZTogY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgYW5kIG1hbmlmZXN0XG4gIC8vIHJld3JpdGluZyB3b3VsZCBvdGhlcndpc2UgZGVsZXRlIGFuZCByZXdyaXRlIGZpbGVzIGluIEFOT1RIRVIgcmVwb3NpdG9yeSB0aHJvdWdoIHRoZSBzeW1saW5rLFxuICAvLyBzbyBrZWVwIG9ubHkgbWFuaWZlc3RzIHdob3NlIHJlYWwgcGF0aCBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkncyByZWFsIHJvb3QuIFNjYW5uaW5nIGVhY2hcbiAgLy8gcGF0dGVybiBzZXBhcmF0ZWx5IChubyBjcm9zcy1wYXR0ZXJuIGNhY2hpbmcpIGlzIGRlbGliZXJhdGU6IGRlY2xhcmF0aW9ucyBob2xkIGEgaGFuZGZ1bCBvZlxuICAvLyBwYXR0ZXJucywgc28gYSBjYWNoZSB3b3VsZCBjb21wbGljYXRlIHRoaXMgc2hhcmVkIGNvZGUgd2l0aG91dCBtZWFzdXJhYmxlIGdhaW4uXG4gIGNvbnN0IGdsb2JNYW5pZmVzdFBhdGhzID0gKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICAvLyBCdW4gbGlua3MgZG90LWRpcmVjdG9yeSBwYWNrYWdlcyBvbmx5IHRocm91Z2ggZnVsbHkgc3RhdGljIHBhdHRlcm5zOiB3aXRoIEJ1biAxLjMuMTQsXG4gICAgLy8gYC5oaWRkZW4veGAgcGlucyB0aGUgcGFja2FnZSB3aGlsZSBgLmhpZGRlbi8qYCwgYC4qLypgLCBhbmQgYCoqYCBhbGwgbGluayBub3RoaW5nIHVuZGVyXG4gICAgLy8gLmhpZGRlbiDigJQgZXZlbiB3aGVuIHRoZSBkb3R0ZWQgc2VnbWVudCBpdHNlbGYgaXMgbGl0ZXJhbCDigJQgc28gYW55IGR5bmFtaWMgcGF0dGVybiBtdXN0XG4gICAgLy8gZHJvcCBtYXRjaGVzIGNvbnRhaW5pbmcgYSBkb3QtbGVkIHNlZ21lbnQgKGZhc3QtZ2xvYidzIGBkb3Q6IGZhbHNlYCBvbmx5IGNvdmVycyBzZWdtZW50c1xuICAgIC8vIGEgd2lsZGNhcmQgbWF0Y2hlcykuXG4gICAgY29uc3QgZXhjbHVkZXNEb3RTZWdtZW50cyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybik7XG4gICAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgICAvLyBmYXN0LWdsb2IgMy4zLjMgcmV0dXJucyBubyBtYXRjaGVzIGZvciBmaWxlIGdsb2JzIHdpdGggYSBsb25lLWA/YCBzZWdtZW50IChlLmcuXG4gICAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCksIGFsdGhvdWdoIG1pY3JvbWF0Y2ggbWF0Y2hlcyB0aGVtIGFuZCBCdW4gMS4zLjE0IGxpbmtzIHN1Y2hcbiAgICAvLyB3b3Jrc3BhY2VzOyBmb3IgYD9gLWNhcnJ5aW5nIHBhdHRlcm5zIG9ubHkgKGEgZGlyZWN0b3J5IGdsb2IgZm9yIGUuZy4gYCoqYCB3b3VsZCBzY2FuIGV2ZXJ5XG4gICAgLy8gZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmcgdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpclxuICAgIC8vIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYiwgd2hpY2ggc3RheXMgbmVjZXNzYXJ5IGZvciBgKipgJ3MgemVyby1zZWdtZW50XG4gICAgLy8gbWF0Y2hlcyDigJQgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGRpciBpdHNlbGYgYXMgYSBkaXJlY3RvcnkuXG4gICAgY29uc3QgbWFuaWZlc3RQYXRocyA9IG5ldyBTZXQoZmcuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKHBhdHRlcm4sICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpKTtcbiAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnPycpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZmcuZ2xvYlN5bmMocGF0dGVybiwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpIG1hbmlmZXN0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCwgYnV0IEJ1biBuZXZlciB0cmVhdHMgdGhlXG4gICAgLy8gbW9ub3JlcG8gcm9vdCBhcyBpdHMgb3duIHdvcmtzcGFjZS5cbiAgICByZXR1cm4gWy4uLm1hbmlmZXN0UGF0aHNdLmZpbHRlcihcbiAgICAgIChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCAhPT0gJ3BhY2thZ2UuanNvbicgJiZcbiAgICAgICAgKCFleGNsdWRlc0RvdFNlZ21lbnRzIHx8ICFwYWNrYWdlSnNvblBhdGguc3BsaXQoJy8nKS5zb21lKChzZWdtZW50KSA9PiBzZWdtZW50LnN0YXJ0c1dpdGgoJy4nKSkpICYmXG4gICAgICAgIGlzSW5zaWRlUmVhbFJvb3QocGFja2FnZUpzb25QYXRoKVxuICAgICk7XG4gIH07XG4gIGxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNJbnNpZGVSZWFsUm9vdCA9IChwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZWFsUm9vdERpclBhdGggPz89IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpO1xuICAgICAgLy8gQ29tcGFyZSB3aG9sZSBzZWdtZW50cywgbm90IGEgYC4uYCBwcmVmaXg6IGEgZGlyZWN0b3J5IGxpdGVyYWxseSBuYW1lZCBlLmcuIGAuLnBrZ2AgaXNcbiAgICAgIC8vIGluc2lkZSB0aGUgcm9vdCwgd2hpbGUgYSBwbGFpbiBzdGFydHNXaXRoKCcuLicpIHdvdWxkIG1pc3JlYWQgaXQgYXMgcGFyZW50IHRyYXZlcnNhbC5cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIG1hbmlmZXN0IHRoYXQgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGwgaXMgbm90IGEgd29ya3NwYWNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWNjdW11bGF0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwaW5uZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKGJhc2VsaW5lR2xvYikpIGFjY3VtdWxhdGVkUGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIGFjY3VtdWxhdGVkUGF0aHMuZGVsZXRlKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuQm9keSkgPyBhY2N1bXVsYXRlZFBhdGhzIDogcGlubmVkUGF0aHM7XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIHtcbiAgICAgICAgdGFyZ2V0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uYWNjdW11bGF0ZWRQYXRocywgLi4ucGlubmVkUGF0aHNdKV0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBzZWVkcyBCdW4ncyBpbXBsaWNpdCB3b3Jrc3BhY2UgYmFzZWxpbmU6IGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZVxuICogbmVnYXRpb24gb2YgdGhlIHNlZWRpbmcgc2hhcGUgKHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyBydWxlIDIpLiBNZWFzdXJlZCB3aXRoIEJ1blxuICogMS4zLjE0LCBzZWVkaW5nIGlzIHBlci1uZWdhdGlvbiBhbmQgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJuczsgY29uY3JldGUgb3JcbiAqIG1peGVkLWxpdGVyYWwgbGFzdCBzZWdtZW50cyAoYCFhcHBzL2V4Y2x1ZGVkYCwgYCFhcHBzLypkYCkgbmV2ZXIgc2VlZCwgYW5kIGA/YCwgYnJhY2UsIGFuZFxuICogY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlZCBpbmNvbnNpc3RlbnRseSBhY3Jvc3MgZml4dHVyZXMgKHNvbWV0aW1lcyBkcm9wcGluZyBldmVuXG4gKiB1bnJlbGF0ZWQgc2libGluZyB3b3Jrc3BhY2VzKSwgc28gdGhleSBhcmUgY29uc2VydmF0aXZlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZzsgc2VlXG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIGdldFNlZWRlZEJhc2VsaW5lR2xvYihub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpKSkgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyB3aXRob3V0IEJ1bidzIG5vLW9wIG9uZXMgKGBcIlwiYCwgYSBsb25lIGBcIiFcImAsIGFuZCBgXCIuXCJgKSwgd2hpY2ggQnVuXG4gKiBpZ25vcmVzIGVudGlyZWx5IOKAlCBhIGxvbmUgYFwiIVwiYCBtdXN0IG5vdCBhY3RpdmF0ZSB0aGUgbmVnYXRpdmUtb25seSBpbXBsaWNpdCBiYXNlbGluZSwgYW5kIGBcIlwiYFxuICogbXVzdCBub3QgbWFrZSB0aGUgcmVwb3NpdG9yeSByb290IGl0c2VsZiBhIGRpc2NvdmVyZWQgd29ya3NwYWNlLiBEZWNsYXJhdGlvbiBvcmRlciBhbmRcbiAqIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGUgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKVxuICAgIC5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIC8vIEJ1biBhcHBsaWVzIGxlYWRpbmctYmFuZyBQQVJJVFkgKHZlcmlmaWVkIHdpdGggQnVuIDEuMy4xNCk6IGAhIXBgIGlzIHRoZSBwb3NpdGl2ZSBgcGBcbiAgICAgIC8vIGFuZCBgISEhcGAgdGhlIG5lZ2F0aW9uIGAhcGAsIHNvIGNhbm9uaWNhbGl6ZSB0byBhdCBtb3N0IG9uZSBiYW5nLlxuICAgICAgY29uc3QgYmFuZ0NvdW50ID0gL14hKi91LmV4ZWMod29ya3NwYWNlUGF0dGVybikhWzBdLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zbGljZShiYW5nQ291bnQpO1xuICAgICAgcmV0dXJuIGJhbmdDb3VudCAlIDIgPT09IDEgPyBgISR7cGF0dGVybkJvZHl9YCA6IHBhdHRlcm5Cb2R5O1xuICAgIH0pXG4gICAgLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICAgICAgLy8gTm9ybWFsaXplIHNvIHNwZWxsaW5ncyBsaWtlIGAuL2AsIGAuLy5gLCBhbmQgYCEuL2AgYXJlIHJlY29nbml6ZWQgYXMgdGhlIHNhbWUgbm8tb3BzXG4gICAgICAvLyAocGF0aC5wb3NpeC5ub3JtYWxpemUoJycpID09PSAnLicsIHNvIHRoZSBlbXB0eSBwYXR0ZXJuIGlzIGNvdmVyZWQgdG9vKS5cbiAgICAgIHJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keSkgIT09ICcuJztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgYC8vYCwgcmVzb2x2ZXMgYC4vYCwgYW5kIHN0cmlwcyB0cmFpbGluZyBzbGFzaGVzLCBtaXJyb3JpbmcgQnVuJ3MgcGF0aCBoYW5kbGluZy5cbiAqIEEgcHVyZSBzdGFyLXJ1biBzZWdtZW50IG9mIHRocmVlIG9yIG1vcmUgc3RhcnMgYmVoYXZlcyBsaWtlIGAqYCB1bmRlciBCdW4gKGAhb3RoZXIvKioqYFxuICogbWF0Y2hlcyBvdGhlci94KSBidXQgbm90IHVuZGVyIGZhc3QtZ2xvYiwgc28gY2Fub25pY2FsaXplIGl0IHRvIGAqYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5wb3NpeFxuICAgIC5ub3JtYWxpemUocGF0dGVybkJvZHkpXG4gICAgLnJlcGxhY2UoL1xcLyskL3UsICcnKVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gKC9eXFwqezMsfSQvdS50ZXN0KHNlZ21lbnQpID8gJyonIDogc2VnbWVudCkpXG4gICAgLmpvaW4oJy8nKTtcbn1cblxuLyoqIFRoZSBpbXBsaWNpdCBiYXNlbGluZSBnbG9iIGEgbmVnYXRpb24gc2VlZHMgdW5kZXIgQnVuJ3MgcnVsZSAyIGFib3ZlLCBvciB1bmRlZmluZWQgaWYgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWVkZWRCYXNlbGluZUdsb2IobmVnYXRpb25Cb2R5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWdtZW50cyA9IG5lZ2F0aW9uQm9keS5zcGxpdCgnLycpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbZmlyc3RTZWdtZW50LCBsYXN0U2VnbWVudF0gPSBzZWdtZW50cyBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoIS9eXFwqKyQvdS50ZXN0KGxhc3RTZWdtZW50KSB8fCAvXlxcKiskL3UudGVzdChmaXJzdFNlZ21lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbGFzdFNlZ21lbnQgPT09ICcqKicgPyAnKionIDogJyovKic7XG59XG5cbi8qKiBXb3Jrc3BhY2UgcGF0dGVybnMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkod29ya3NwYWNlcykpIHJldHVybiB3b3Jrc3BhY2VzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzPy5wYWNrYWdlcykgPyB3b3Jrc3BhY2VzLnBhY2thZ2VzIDogW107XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJuIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6XG4gKiBhYnNvbHV0ZSBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBvcGVyYXRlXG4gKiBvbiBhbm90aGVyIHJlcG9zaXRvcnkncyBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICByZXR1cm4gIXBhdGgucG9zaXguaXNBYnNvbHV0ZShwYXR0ZXJuQm9keSkgJiYgIXBhdHRlcm5Cb2R5LnNwbGl0KCcvJykuaW5jbHVkZXMoJy4uJyk7XG59XG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogQW5jaG9yZWQgdG8gYFwiLCBgIHNvIG9ubHkgYSByZWdpc3RyeSBlbnRyeSdzIGByZXNvbHZlZGAgc2xvdCBpcyBjbGVhcmVkLiBBIGRpcmVjdCB0YXJiYWxsXG4gKiBkZXBlbmRlbmN5IGNhcnJpZXMgaXRzIFVSTCBpbiB0aGUgd29ya3NwYWNlIGRlc2NyaXB0b3IgYW5kIHR1cGxlIGlkZW50aWZpZXIgaW5zdGVhZCwgYW5kIHRob3NlXG4gKiBVUkxzIG11c3QgcmVtYWluIGludGFjdC5cbiAqL1xuY29uc3QgZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4gPSAvKFwiLCApXCJodHRwczpcXC9cXC9ucG1cXC5mbGF0dFxcLnRlY2hcXC9bXlwiXSpcIi9nO1xuXG4vKipcbiAqIFJlbW92ZSBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBidW4ubG9jay5cbiAqXG4gKiBCdW4gd3JpdGVzIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIGxvY2tmaWxlIGV2ZW4gd2hlbiBhbiBpbnN0YWxsIHJ1bnMgZnJvbSBhIGNoaWxkIHBhY2thZ2UuIEluIGFcbiAqIEdpdCBjaGVja291dCB0aGUgc2VhcmNoIGNsaW1icyB0byB0aGF0IHJvb3Q7IHdpdGhvdXQgYSBjaGVja291dCBib3VuZGFyeSBpdCBpbnNwZWN0cyBvbmx5IHRoZVxuICogc3RhcnRpbmcgZGlyZWN0b3J5IHNvIGl0IGNhbm5vdCByZXdyaXRlIGFuIHVucmVsYXRlZCBhbmNlc3RvcidzIGxvY2tmaWxlLiBUaGUgcHJveHkgaXNcbiAqIGluc3RhbGwtdGltZSBwb2xpY3kgcmF0aGVyIHRoYW4gcmVwb3NpdG9yeSBzdGF0ZTogYW4gZW1wdHkgcmVzb2x2ZWQgc2xvdCBzdGlsbCBtYWtlcyBCdW4gdXNlIHRoZVxuICogY29uZmlndXJlZCBkZWZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIGxvY2tmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNoYW5nZSB3YXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVuTG9ja2ZpbGUoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NrZmlsZVBhdGggPSBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aCk7XG4gIGlmICghbG9ja2ZpbGVQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuLCAnJDFcIlwiJyk7XG4gIGlmIChub3JtYWxpemVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIEEgc2libGluZyB0ZW1wIGZpbGUgbWFrZXMgdGhlIHJlcGxhY2VtZW50IGFuIGF0b21pYyBzYW1lLWRpcmVjdG9yeSByZW5hbWUsIHNvIGFuIGludGVycnVwdGVkXG4gIC8vIHdyaXRlIGNhbm5vdCBsZWF2ZSBhIHRydW5jYXRlZCBidW4ubG9jayBiZWhpbmQuXG4gIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBgJHtsb2NrZmlsZVBhdGh9Lm5vcm1hbGl6aW5nLiR7cHJvY2Vzcy5waWR9LiR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICB0cnkge1xuICAgIC8vIHN0YXQncyBtb2RlIGluY2x1ZGVzIGZpbGUtdHlwZSBiaXRzLCB3aGljaCBjaG1vZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGFjY2VwdC5cbiAgICBjb25zdCBtb2RlID0gZnMuc3RhdFN5bmMobG9ja2ZpbGVQYXRoKS5tb2RlICYgMG83Nzc7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wb3JhcnlQYXRoLCBub3JtYWxpemVkQ29udGVudCwgeyBtb2RlIH0pO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMncyBtb2RlIGlzIG1hc2tlZCBieSB0aGUgcHJvY2VzcyB1bWFzazsgY2htb2QgcmVzdG9yZXMgdGhlIGV4YWN0IG9yaWdpbmFsIGJpdHMuXG4gICAgZnMuY2htb2RTeW5jKHRlbXBvcmFyeVBhdGgsIG1vZGUpO1xuICAgIGZzLnJlbmFtZVN5bmModGVtcG9yYXJ5UGF0aCwgbG9ja2ZpbGVQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmModGVtcG9yYXJ5UGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gbG9ja2ZpbGVQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWRTdGFydERpclBhdGggPSBwYXRoLnJlc29sdmUoc3RhcnREaXJQYXRoKTtcbiAgY29uc3QgcmVwb3NpdG9yeVJvb3REaXJQYXRoID0gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChyZXNvbHZlZFN0YXJ0RGlyUGF0aCk7XG4gIGlmICghcmVwb3NpdG9yeVJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkU3RhcnREaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpID8gbG9ja2ZpbGVQYXRoIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGRpclBhdGggPSByZXNvbHZlZFN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSkgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbiAgICBpZiAoZGlyUGF0aCA9PT0gcmVwb3NpdG9yeVJvb3REaXJQYXRoKSByZXR1cm47XG5cbiAgICBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgZGlyUGF0aCA9IHN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBkaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgcmV0dXJuO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG4iLCIvKiogV2hldGhlciBhIERvY2tlcmZpbGUgY29uc3VtZXMgd2IncyBnZW5lcmF0ZWQgbm9uLXNlY3JldCBlbnZpcm9ubWVudCBkaXJlY3RseSBvciB0aHJvdWdoIGl0cyBoZWxwZXIuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3VtZXNEb2NrZXJFbnYoZG9ja2VyZmlsZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZG9ja2VyZmlsZVRleHRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLnNvbWUoKGxpbmUpID0+ICEvXlxccyojL3UudGVzdChsaW5lKSAmJiAobGluZS5pbmNsdWRlcygnLmRvY2tlci5lbnYnKSB8fCBsaW5lLmluY2x1ZGVzKCdhcHBseS1kb2NrZXItZW52LnNoJykpKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy5hbnRpZ3Jhdml0eWNsaS8qKicsXG4gIC8vIEdpdCdzIG9iamVjdCBzdG9yZSBob2xkcyBjb3BpZXMgb2YgdHJhY2tlZCBmaWxlcyAoYW5kIGBkb3Q6IHRydWVgIG1ha2VzIHRoZW0gdmlzaWJsZSksIHNvXG4gIC8vIHNjYW5uaW5nIGl0IHdvdWxkIGJvdGggc2xvdyBldmVyeSBnbG9iIGRvd24gYW5kIGxldCBzdGFsZSBibG9icyBpbmZsdWVuY2UgZGV0ZWN0aW9uLlxuICAnKiovLmdpdC8qKicsXG4gIC8vIFRoZSBvcmctc3RhbmRhcmQgdGVtcG9yYXJ5IGRpcmVjdG9yeTsgc3RhbGUgY29waWVzIHVuZGVyIGl0IChlLmcuIHJldmlldyBzY3JhdGNoIGRpcnMpIG11c3RcbiAgLy8gbm90IGluZmx1ZW5jZSBsYW5ndWFnZSBkZXRlY3Rpb24uXG4gICcqKi8udG1wLyoqJyxcbiAgJyoqLy50bXAtKi8qKicsXG4gIC8vIExvY2FsIGNhY2hlcyBjYW4gY29udGFpbiBjb21wbGV0ZSB0aGlyZC1wYXJ0eSBzb3VyY2UgY2hlY2tvdXRzLiBUcmVhdGluZyB0aG9zZSBhcyByZXBvc2l0b3J5XG4gIC8vIGNvZGUgZ2VuZXJhdGVzIHdvcmtmbG93cyBmb3IgcGF0aHMgdGhhdCBhcmUgZ2l0aWdub3JlZCBhbmQgYWJzZW50IGZyb20gZnJlc2ggQ0kgY2hlY2tvdXRzLlxuICAnKiovLmNhY2hlLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxubGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICAvKiogQ29uZmluZXMgZ2VuZXJhdGVGaWxlIHdyaXRlcyB0byB0aGUgcmVwb3NpdG9yeSByb290ZWQgYXQgcm9vdERpclBhdGggKHVuZGVmaW5lZCBkaXNhYmxlcyBpdCkuICovXG4gIHNldFJvb3REaXJQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICByZWFsUm9vdERpclBhdGggPSByb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIG9ubHkgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gT3RoZXIgZmFpbHVyZXMgKGUuZy4gcGVybWlzc2lvbnMpIGFyZVxuICAgKiByZXRocm93biBzbyBjYWxsZXJzIHJlZ2VuZXJhdGluZyBjb25maWcgZmlsZXMgbmV2ZXIgb3ZlcndyaXRlIGNvbnRlbnQgdGhleSBjb3VsZCBub3QgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciBhIHdyaXRlIHRvIGZpbGVQYXRoIHdvdWxkIHBhc3MgdGhlIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMuICovXG4gIGFzeW5jIGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlYWRzIGEgc291cmNlIGZpbGUsIHJldHVybmluZyB1bmRlZmluZWQgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBPUiB3aGVuIGl0XG4gICAqIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIGEgY29tbWl0dGVkIHN5bWxpbmsgcG9pbnRpbmcgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSBtdXN0XG4gICAqIG5vdCBnZXQgaXRzIHRhcmdldCdzIGNvbnRlbnQgY29waWVkIGludG8gYSB0cmFja2VkIGZpbGUuIEEgc3ltbGluayB3aG9zZSByZXNvbHZlZCB0YXJnZXRcbiAgICogc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5IGlzIGxlZ2l0aW1hdGUgKGUuZy4gYC5ub2RlLXZlcnNpb24gLT4gLm52bXJjYCkgYW5kIGlzIHJlYWQuXG4gICAqL1xuICBhc3luYyByZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmICghc3RhdHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGxldCByZWFsRmlsZVBhdGg6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlYWxGaWxlUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGZpbGVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgZGFuZ2xpbmcgc3ltYm9saWMgbGluay5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgcmVhbFJvb3REaXJQYXRoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcmVhbEZpbGVQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiZcbiAgICAgICAgIXJlYWxGaWxlUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIGZpbGVQYXRoIChmb3JjZSwgb3B0aW9uYWxseSByZWN1cnNpdmUpIG9ubHkgd2hlbiBpdHMgUEFSRU5UIGRpcmVjdG9yeSByZXNvbHZlcyBpbnNpZGVcbiAgICogdGhlIHJlcG9zaXRvcnksIHNvIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBhIGNvbW1pdHRlZCAuZ2l0aHViL3dvcmtmbG93cyBsaW5rKSBjYW4gbmV2ZXJcbiAgICogbWFrZSBjbGVhbnVwIGRlbGV0ZSBmaWxlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBSZW1vdmluZyBhIHN5bWxpbmsgZW50cnkgaXRzZWxmIGlzIGFsbG93ZWQ6XG4gICAqIHRoYXQgZGVsZXRlcyBvbmx5IHRoZSBsaW5rLCBuZXZlciBpdHMgdGFyZ2V0LiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlbW92YWwgd2FzIHBlcmZvcm1lZC5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZW1vdmluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IG9wdGlvbnM/LnJlY3Vyc2l2ZSA/PyBmYWxzZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFdyaXRlcyBjb250ZW50IHZlcmJhdGltLCBhcHBseWluZyB0aGUgc2FtZSBzeW1saW5rL3JlcG9zaXRvcnktY29udGFpbm1lbnQgZ3VhcmRzIGFzIGdlbmVyYXRlRmlsZS4gKi9cbiAgYXN5bmMgd3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZmlsZSB3YXMgYWN0dWFsbHkgZ2VuZXJhdGVkIChmYWxzZSB3aGVuIHRoZSBjb25maW5lbWVudCBndWFyZHMgc2tpcCBpdCkuICovXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxpbmVFbmRpbmc6ICdcXG4nIHwgJ1xcclxcbicgPSAnXFxuJyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIGB0cmltYCB0cmVhdHMgYSBCT00gYXMgd2hpdGVzcGFjZSwgc28gaXQgaXMgcmVhdHRhY2hlZCBhdCBwb3NpdGlvbiAwOiBkcm9wcGluZyBpdCB3b3VsZFxuICAgIC8vIHJld3JpdGUgdGhlIGVuY29kaW5nIG1hcmtlciBvZiBhIGZpbGUgdGhlIGdlbmVyYXRvciB3YXMgb25seSBhc2tlZCB0byB1cGRhdGUuXG4gICAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IGNvbnRlbnQuc3RhcnRzV2l0aCgn77u/JykgPyAn77u/JyA6ICcnO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgPSBgJHtieXRlT3JkZXJNYXJrfSR7bm9ybWFsaXplZENvbnRlbnR9JHtsaW5lRW5kaW5nfWA7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIE5ldmVyIHdyaXRlIHRocm91Z2ggYSBzeW1saW5rOiBhIChwb3NzaWJseSBkYW5nbGluZykgbGluayBjb21taXR0ZWQgaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5XG4gIC8vIGNvdWxkIHJlZGlyZWN0IHRoZSB3cml0ZSBvdXRzaWRlIGl0LlxuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIGlmIChzdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB3cml0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gQSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSB3b3VsZCByZWRpcmVjdCByZWFkcywgd3JpdGVzLCBhbmQgcmVtb3ZhbHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSxcbi8vIHNvIHJlcXVpcmUgdGhlIGNsb3Nlc3QgZXhpc3RpbmcgYW5jZXN0b3IgdG8gcmVzb2x2ZSBpbnNpZGUgdGhlIHJvb3Qgc2V0IGJ5IHRoZSBDTEkgZW50cnkgcG9pbnQuXG5hc3luYyBmdW5jdGlvbiBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChyZWFsUm9vdERpclBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIGxldCBhbmNlc3RvclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMoYW5jZXN0b3JQYXRoKSkge1xuICAgIGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvclBhdGgpO1xuICB9XG4gIGNvbnN0IHJlYWxBbmNlc3RvclBhdGggPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFscGF0aChhbmNlc3RvclBhdGgpO1xuICByZXR1cm4gcmVhbEFuY2VzdG9yUGF0aCA9PT0gcmVhbFJvb3REaXJQYXRoIHx8IHJlYWxBbmNlc3RvclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBBUEkgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzeW5jJztcbmltcG9ydCB0eXBlIHsgU291cmNlRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgKEdvKSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYW5kIG5vXG4vLyBsb25nZXIgZXhwb3NlcyBhbiBpbi1wcm9jZXNzIHBhcnNlciBzdWNoIGFzIGB0cy5jcmVhdGVTb3VyY2VGaWxlYC4gUGFyc2luZyBub3dcbi8vIGhhcHBlbnMgaW4gYSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlciByZWFjaGVkIHRocm91Z2ggdGhlIGFzeW5jaHJvbm91cyBBUEksIHNvIHdlXG4vLyBrZWVwIGEgc2luZ2xlIGxhemlseS1jcmVhdGVkIGluc3RhbmNlIGFuZCByZXVzZSBpdCBhY3Jvc3MgZXZlcnkgZml4ZXIgdG8gYXZvaWRcbi8vIHBheWluZyB0aGUgcHJvY2Vzcy1zcGF3biBjb3N0IHBlciBmaWxlLlxubGV0IGFwaTogQVBJIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRBcGkoKTogQVBJIHtcbiAgcmV0dXJuIChhcGkgPz89IG5ldyBBUEkoeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSkpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHNvdXJjZSBmaWxlIGludG8gYSBUeXBlU2NyaXB0IEFTVCB1c2luZyB0aGUgYnVuZGxlZCBuYXRpdmUgY29tcGlsZXIuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGNvbXBpbGVyIGNhbm5vdCBsb2FkIHRoZSBmaWxlIChlLmcuIGl0IGlzIG1pc3NpbmdcbiAqIG9yIHVucGFyc2FibGUpIHNvIGNhbGxlcnMgY2FuIGZhbGwgYmFjayB0byBjb25zZXJ2YXRpdmUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8U291cmNlRmlsZSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0QXBpKCkudXBkYXRlU25hcHNob3QoeyBvcGVuRmlsZXM6IFtmaWxlUGF0aF0gfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IGF3YWl0IHNuYXBzaG90LmdldERlZmF1bHRQcm9qZWN0Rm9yRmlsZShmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb2plY3Q/LnByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaHV0cyBkb3duIHRoZSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlci4gVGhlIHNlcnZlciBrZWVwcyBhbiBvcGVuIElQQyBjaGFubmVsXG4gKiB0aGF0IHdvdWxkIG90aGVyd2lzZSBrZWVwIHRoZSBydW50aW1lIGV2ZW50IGxvb3AgYWxpdmUsIHNvIHdiZnkgbXVzdCBjYWxsIHRoaXNcbiAqIG9uY2UgaXRzIHJ1biBmaW5pc2hlcyBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhcGk/LmNsb3NlKCk7XG4gIGFwaSA9IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG4vLyBTZXR0aW5ncyBldmVyeSBXaWxsQm9vc3RlciBOZXh0LmpzIHByb2plY3Qgc2hvdWxkIGNhcnJ5LiBgbmFtZWAgaXMgdGhlIHRvcC1sZXZlbFxuLy8gcHJvcGVydHkga2V5IHVzZWQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHNldHRpbmcgYWxyZWFkeSBleGlzdHM7IGB0ZXh0YCBpcyBpbnNlcnRlZFxuLy8gdmVyYmF0aW0gKGEgd2hvbGUgYGtleTogdmFsdWVgIHBhaXIpIHdoZW4gdGhlIGtleSBpcyBtaXNzaW5nLlxuY29uc3QgbWFuYWdlZFByb3BlcnRpZXM6IHJlYWRvbmx5IHsgbmFtZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdID0gW1xuICB7IG5hbWU6ICdyZWFjdENvbXBpbGVyJywgdGV4dDogJ3JlYWN0Q29tcGlsZXI6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3JlYWN0U3RyaWN0TW9kZScsIHRleHQ6ICdyZWFjdFN0cmljdE1vZGU6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB0ZXh0OiAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9JyB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWyd0cycsICdtdHMnLCAnY3RzJywgJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYWN0ZWQgPSBhd2FpdCBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWQpIHJldHVybjtcbiAgICBjb25zdCB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9ID0gZXh0cmFjdGVkO1xuXG4gICAgLy8gYHByb3BlcnRpZXNgIGluY2x1ZGVzIHNwcmVhZCBhc3NpZ25tZW50cyAoYC4uLnJlc3RgKSB0aGF0IGNhcnJ5IG5vIG5hbWUsIHNvIGd1YXJkIGJlZm9yZSByZWFkaW5nIGl0LlxuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydGllcyA9IG5ldyBTZXQoXG4gICAgICBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT5cbiAgICAgICAgJ25hbWUnIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm5hbWUgPyBnZXRQcm9wZXJ0eUtleShwcm9wZXJ0eS5uYW1lLCBzb3VyY2UpIDogdW5kZWZpbmVkXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzID0gbWFuYWdlZFByb3BlcnRpZXNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5KSA9PiAhZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eS5uYW1lKSlcbiAgICAgIC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS50ZXh0KTtcbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBzb3VyY2UudGV4dDtcbiAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG9iamVjdExpdGVyYWwuZ2V0RW5kKCkgLSAxO1xuICAgIC8vIFRoZSBuYXRpdmUgVFMgQVNUIGRvZXMgbm90IHJlbGlhYmx5IGV4cG9zZSBgcHJvcGVydGllcy5oYXNUcmFpbGluZ0NvbW1hYCwgc28gc2NhbiB0aGUgc291cmNlXG4gICAgLy8gYmV0d2VlbiB0aGUgbGFzdCBwcm9wZXJ0eSBhbmQgdGhlIGNsb3NpbmcgYnJhY2UuIFN0cmlwIGNvbW1lbnRzIGZpcnN0IHNvIGEgY29tbWEgaW5zaWRlIGFcbiAgICAvLyB0cmFpbGluZyBjb21tZW50IChlLmcuIGBmb286IDEgLy8gYSwgYmApIGlzIG5vdCBtaXN0YWtlbiBmb3IgYSByZWFsIHRyYWlsaW5nIGNvbW1hLlxuICAgIGNvbnN0IGxhc3RQcm9wZXJ0eSA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5hdCgtMSk7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGxhc3RQcm9wZXJ0eVxuICAgICAgPyBzdHJpcENvbW1lbnRzKG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkpLmluY2x1ZGVzKCcsJylcbiAgICAgIDogZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgIWhhc1RyYWlsaW5nQ29tbWEgPyAnLCAnIDogJyc7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpfSR7cHJlZml4fSR7cHJvcGVydHlUZXh0cy5qb2luKCcsICcpfSR7b2xkQ29udGVudC5zbGljZShcbiAgICAgIGluc2VydGlvblBvaW50XG4gICAgKX1gO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx7IHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7IG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCBkZWNsYXJlcyB0aGUgY29uZmlnIGFzIGBjb25zdCBuZXh0Q29uZmlnOiBOZXh0Q29uZmlnID0geyAuLi4gfWAgYW5kXG4gIC8vIGV4cG9ydHMgaXQgKHBvc3NpYmx5IHdyYXBwZWQsIGUuZy4gYHdpdGhTZW50cnlDb25maWcoLi4uKWApLCBzbyB0aGUgb2JqZWN0IGxpdGVyYWwgaXMgcmFyZWx5XG4gIC8vIHRoZSBkaXJlY3Qgb3BlcmFuZCBvZiBgZXhwb3J0IGRlZmF1bHRgL2Btb2R1bGUuZXhwb3J0c2AuIENvbGxlY3QgZXZlcnkgY2FuZGlkYXRlIGFuZCBwaWNrIHRoZVxuICAvLyBtb3N0IGF1dGhvcml0YXRpdmUgb25lIGJlbG93LlxuICBsZXQgZGlyZWN0T2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwb3J0ZWRJZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMgPSBuZXcgTWFwPHN0cmluZywgYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uPigpO1xuICBjb25zdCB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGFzdC5pc0V4cG9ydEFzc2lnbm1lbnQobm9kZSkpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBhc3QuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gYXN0LlN5bnRheEtpbmQuRXF1YWxzVG9rZW4gJiZcbiAgICAgIG5vZGUubGVmdC5nZXRUZXh0KHNvdXJjZSkgPT09ICdtb2R1bGUuZXhwb3J0cydcbiAgICApIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUucmlnaHQpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLnJpZ2h0KSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUucmlnaHQuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXN0LmlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSAmJiBub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmluaXRpYWxpemVyKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsICYmIGFzdC5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLnNldChub2RlLm5hbWUuZ2V0VGV4dChzb3VyY2UpLCBvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgLy8gVGhlIGA6IE5leHRDb25maWdgIGFubm90YXRpb24gd2JmeSB3cml0ZXMgbWFya3MgdGhlIGNhbm9uaWNhbCBjb25maWcgb2JqZWN0IChhY2NlcHRpbmdcbiAgICAgICAgLy8gcXVhbGlmaWVkIG5hbWVzIHN1Y2ggYXMgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgKS5cbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblR5cGUgPSBub2RlLnR5cGU/LmdldFRleHQoc291cmNlKTtcbiAgICAgICAgaWYgKGFubm90YXRpb25UeXBlICE9PSB1bmRlZmluZWQgJiYgaXNOZXh0Q29uZmlnVHlwZShhbm5vdGF0aW9uVHlwZSkpIHtcbiAgICAgICAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzLnB1c2gob2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICBjb25zdCBvYmplY3RMaXRlcmFsID1cbiAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzWzBdID8/XG4gICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/P1xuICAgIChleHBvcnRlZElkZW50aWZpZXIgPyB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldChleHBvcnRlZElkZW50aWZpZXIpIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KCduZXh0Q29uZmlnJyk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsID8geyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN1cnJlbnQgPSB1bndyYXBQYXJlbnRoZXNlcyhub2RlKTtcbiAgcmV0dXJuIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGN1cnJlbnQpID8gY3VycmVudCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdW53cmFwUGFyZW50aGVzZXMobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuRXhwcmVzc2lvbiB7XG4gIGxldCBjdXJyZW50ID0gbm9kZTtcbiAgd2hpbGUgKGFzdC5pc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGN1cnJlbnQpKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnQuZXhwcmVzc2lvbjtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLy8gTWF0Y2ggYm90aCB0aGUgYmFyZSBgTmV4dENvbmZpZ2AgYW5kIHF1YWxpZmllZCBmb3JtcyBsaWtlIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYC5cbmZ1bmN0aW9uIGlzTmV4dENvbmZpZ1R5cGUodHlwZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZVRleHQgPT09ICdOZXh0Q29uZmlnJyB8fCB0eXBlVGV4dC5lbmRzV2l0aCgnLk5leHRDb25maWcnKTtcbn1cblxuLy8gUmV0dXJuIGEgcHJvcGVydHkga2V5IHdpdGhvdXQgc3Vycm91bmRpbmcgcXVvdGVzLCBzbyBgJ3JlYWN0Q29tcGlsZXInYCBtYXRjaGVzIGByZWFjdENvbXBpbGVyYC5cbi8vIElkZW50aWZpZXIsIHN0cmluZy1saXRlcmFsIGFuZCBudW1lcmljLWxpdGVyYWwgbmFtZXMgYWxsIGV4cG9zZSB0aGUgdW5xdW90ZWQgdmFsdWUgdmlhIGAudGV4dGAuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eUtleShuYW1lOiBhc3QuUHJvcGVydHlOYW1lLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nIHtcbiAgcmV0dXJuICd0ZXh0JyBpbiBuYW1lICYmIHR5cGVvZiBuYW1lLnRleHQgPT09ICdzdHJpbmcnID8gbmFtZS50ZXh0IDogbmFtZS5nZXRUZXh0KHNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwQ29tbWVudHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvXFwvXFwvW15cXG5dKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csICcnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeENoYWtyYVRvYXN0ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmNoYWtyYSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdG9hc3Rlci57dHMsdHN4fScsIHtcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogWycqKi8uKi8qKicsICcqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKFxuICAgICAgICBjb250ZW50LmluY2x1ZGVzKCdDcmVhdGVUb2FzdGVyUmV0dXJuJykgfHxcbiAgICAgICAgIWNvbnRlbnQuaW5jbHVkZXMoXCJmcm9tICdAY2hha3JhLXVpL3JlYWN0J1wiKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcygnZXhwb3J0IGNvbnN0IHRvYXN0ZXIgPSBjcmVhdGVUb2FzdGVyKCcpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnRcbiAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgL15pbXBvcnQgLiogZnJvbSAnQGNoYWtyYS11aVxcL3JlYWN0JzskL211LFxuICAgICAgICAgIFwiJCZcXG5pbXBvcnQgdHlwZSB7IENyZWF0ZVRvYXN0ZXJSZXR1cm4gfSBmcm9tICdAY2hha3JhLXVpL3JlYWN0JztcIlxuICAgICAgICApXG4gICAgICAgIC5yZXBsYWNlKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJywgJ2V4cG9ydCBjb25zdCB0b2FzdGVyOiBDcmVhdGVUb2FzdGVyUmV0dXJuID0gY3JlYXRlVG9hc3RlcignKTtcbiAgICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gY29udGVudCkgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgT2JqZWN0TWVtYmVyID0geyBraW5kOiAnZXh0cmEnOyBpbmRleDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdwcm9wZXJ0eSc7IGtleTogc3RyaW5nIH07XG5pbnRlcmZhY2UgUGFyc2VkT2JqZWN0IHtcbiAgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXTtcbiAgbWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG59XG5pbnRlcmZhY2UgRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB7XG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7XG4gIG5vZGU6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cbmNvbnN0IGxpdGVyYWwgPSAodmFsdWU6IHN0cmluZyk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUgfSk7XG5jb25zdCBhc0FycmF5ID0gKHZhbHVlOiBQYXJzZWRWYWx1ZVtdKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2FycmF5JywgdmFsdWUgfSk7XG5jb25zdCBhc09iamVjdCA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZFZhbHVlID0+ICh7XG4gIGtpbmQ6ICdvYmplY3QnLFxuICB2YWx1ZTogdG9QYXJzZWRPYmplY3QocHJvcGVydGllcywgZXh0cmFNZW1iZXJzKSxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHM6IGJvb2xlYW4pOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCB1c2UgPSB0b1BhcnNlZE9iamVjdCh7XG4gICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIHNjcmVlbnNob3Q6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbmx5LW9uLWZhaWx1cmUnIDogJ29uJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pO1xuXG4gIGlmIChzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cykge1xuICAgIHVzZS5wcm9wZXJ0aWVzLmJhc2VVUkwgPSBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpO1xuICAgIHVzZS5tZW1iZXJPcmRlci51bnNoaWZ0KHsga2luZDogJ3Byb3BlcnR5Jywga2V5OiAnYmFzZVVSTCcgfSk7XG4gIH1cblxuICByZXR1cm4gdG9QYXJzZWRPYmplY3Qoe1xuICAgIGZvcmJpZE9ubHk6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgICB1c2U6IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiB1c2UgfSxcbiAgICAuLi4oc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHNcbiAgICAgID8ge1xuICAgICAgICAgIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgICAgICAgICAgY29tbWFuZDogbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKSksXG4gICAgICAgICAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgICAgICAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgICAgICAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgICAgICAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICAgICAgICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZE9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgZXh0cmFNZW1iZXJzLFxuICAgIG1lbWJlck9yZGVyOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKGtleSk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSkpLFxuICAgICAgLi4uZXh0cmFNZW1iZXJzLm1hcCgoXywgaW5kZXgpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSkpLFxuICAgIF0sXG4gICAgcHJvcGVydGllcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gYXdhaXQgZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUsIGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gd2IgZGVyaXZlcyBORVhUX1BVQkxJQ19CQVNFX1VSTCBmcm9tIHRoZSByZXNvbHZlZCBwb3J0IGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzICh2aW5leHRcbiAgICAvLyBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIGBkZXBlbmRpbmcubmV4dGAgY292ZXJzIGJvdGgpLCBzbyB0aG9zZSBuZWVkIG5vIGRlY2xhcmVkXG4gICAgLy8gdmFyaWFibGU7IG90aGVyIHBhY2thZ2VzIHN0aWxsIHJlcXVpcmUgYSBkZWNsYXJhdGlvbi5cbiAgICBjb25zdCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyA9XG4gICAgICBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWcsIHBhcnNlZCkgJiZcbiAgICAgIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgKGF3YWl0IGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCkpKTtcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKTtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVBhcnNlZE9iamVjdHMoZGVmYXVsdENvbmZpZywgcGFyc2VkKTtcbiAgICBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhtZXJnZWQsIGRlZmF1bHRDb25maWcpO1xuICAgIHNldFdlYlNlcnZlckNvbW1hbmQobWVyZ2VkKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5mdW5jdGlvbiBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhjb25maWc6IFBhcnNlZE9iamVjdCwgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHVzZSA9IGNvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgY29uc3QgZGVmYXVsdFVzZSA9IGRlZmF1bHRDb25maWcucHJvcGVydGllcy51c2U7XG4gIGlmICh1c2U/LmtpbmQgIT09ICdvYmplY3QnIHx8IGRlZmF1bHRVc2U/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgWyd0cmFjZScsICdzY3JlZW5zaG90JywgJ3ZpZGVvJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB1c2UudmFsdWUucHJvcGVydGllc1trZXldID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIHBhcnNlZDogUGFyc2VkT2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8XG4gICAgcGFyc2VkLnByb3BlcnRpZXMud2ViU2VydmVyICE9PSB1bmRlZmluZWQgfHxcbiAgICBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwocGFyc2VkLnByb3BlcnRpZXMudXNlKSB8fFxuICAgIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWQgfSwgJ05FWFRfUFVCTElDX0JBU0VfVVJMJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gZG9lc09iamVjdEhhdmVCYXNlVXJsKHZhbHVlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWU/LmtpbmQgPT09ICdvYmplY3QnICYmIHZhbHVlLnZhbHVlLnByb3BlcnRpZXMuYmFzZVVSTCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh2YWx1ZTogUGFyc2VkVmFsdWUsIGxpdGVyYWxUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlLmluY2x1ZGVzKGxpdGVyYWxUZXh0KTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHJldHVybiB2YWx1ZS52YWx1ZS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSk7XG4gIHJldHVybiAoXG4gICAgdmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzLnNvbWUoKG1lbWJlcikgPT4gbWVtYmVyLmluY2x1ZGVzKGxpdGVyYWxUZXh0KSkgfHxcbiAgICBPYmplY3QudmFsdWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICAvLyBTb21lIFBsYXl3cmlnaHQgY29uZmlncyBvbmx5IGRlZmluZSBicm93c2VyIHByb2plY3RzIG9yIGZpeHR1cmVzIGFuZCBkbyBub3RcbiAgLy8gc3RhcnQgYSB3ZWIgYXBwLiBBdm9pZCBmb3JjaW5nIGFuIGFwcC1zZXJ2ZXIgVVJMIGludG8gdGhvc2UgcGFja2FnZXMuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWydmbm94LnRvbWwnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQob2JqZWN0OiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3Qgd2ViU2VydmVyID0gb2JqZWN0LnByb3BlcnRpZXMud2ViU2VydmVyO1xuICBpZiAod2ViU2VydmVyPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbW1hbmQgPSB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kO1xuICAvLyBMaWJyYXJpZXMgY2FuIHVzZSBQbGF5d3JpZ2h0J3Mgd2ViU2VydmVyIHRvIGJ1aWxkIGFuZCBsYXVuY2ggYSBmaXh0dXJlIGV2ZW4gdGhvdWdoIGB3YiBzdGFydGBcbiAgLy8gaW50ZW50aW9uYWxseSBoYXMgbm8gdGVzdCBzZXJ2ZXIgZm9yIHRoZSBsaWJyYXJ5IGl0c2VsZi4gUHJlc2VydmUgdGhvc2UgY3VzdG9tIGxpZmVjeWNsZVxuICAvLyBjb21tYW5kczsgb25seSBhZGQgdGhlIGNvbW1hbmQgd2hlbiB3YmZ5IGFscmVhZHkgb3ducyBpdC5cbiAgaWYgKGNvbW1hbmQgJiYgIWlzR2VuZXJhdGVkV2JTdGFydFRlc3RDb21tYW5kKGNvbW1hbmQpKSByZXR1cm47XG5cbiAgLy8gUGxheXdyaWdodCByZXF1aXJlcyBgY29tbWFuZGAgd2hlbmV2ZXIgYHdlYlNlcnZlcmAgZXhpc3RzOyBhbiBleHRlcm5hbGx5IG1hbmFnZWQgc2VydmVyIHNob3VsZFxuICAvLyBvbWl0IGB3ZWJTZXJ2ZXJgIGluc3RlYWQuIEtlZXAgZmlsbGluZyB0aGlzIHJlcXVpcmVkIGZpZWxkIHdoZW4gYSBwYXJ0aWFsIG1hbmFnZWQgYmxvY2sgbGFja3MgaXQuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZDogUGFyc2VkVmFsdWUpOiBib29sZWFuIHtcbiAgaWYgKGNvbW1hbmQua2luZCAhPT0gJ2xpdGVyYWwnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBjb21tYW5kLnZhbHVlLnRyaW0oKSA9PT0gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk7XG59XG5cbmZ1bmN0aW9uIGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpOiBzdHJpbmcge1xuICByZXR1cm4gYCdidW4gd2Igc3RhcnQgLS1tb2RlIHRlc3QnYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8RXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICBpZiAoYXN0LmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJndW1lbnQpKSB7XG4gICAgICAgIGZvdW5kID0gZmlyc3RBcmd1bWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIHJldHVybiBmb3VuZCA/IHsgc291cmNlLCBub2RlOiBmb3VuZCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogYXN0LkV4cHJlc3Npb24sIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZE9iamVjdCB9IDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHsgZXh0cmFNZW1iZXJzOiBbXSwgbWVtYmVyT3JkZXI6IFtdLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmIChhc3QuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSBsaXRlcmFsKGtleSk7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fFxuICAgICAgKCFhc3QuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICFhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKVxuICAgICkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQuZXh0cmFNZW1iZXJzLnB1c2gocHJvcGVydHkuZ2V0VGV4dChzb3VyY2UpKSAtIDE7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICAgIH0pO1xuICAgIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcblxuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBlbWl0dGVkUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSh2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlcik7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWVtYmVyT3JkZXIuZmxhdE1hcCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ2V4dHJhJykge1xuICAgICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RNZW1iZXIodmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzW21lbWJlci5pbmRleF0gPz8gJycsIGluZGVudCldO1xuICAgIH1cblxuICAgIGlmIChsYXN0UHJvcGVydHlJbmRleEJ5S2V5LmdldChtZW1iZXIua2V5KSAhPT0gaW5kZXgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtID0gdmFsdWUudmFsdWUucHJvcGVydGllc1ttZW1iZXIua2V5XTtcbiAgICBpZiAoIWl0ZW0gfHwgZW1pdHRlZFByb3BlcnRpZXMuaGFzKG1lbWJlci5rZXkpKSByZXR1cm4gW107XG4gICAgZW1pdHRlZFByb3BlcnRpZXMuYWRkKG1lbWJlci5rZXkpO1xuICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkobWVtYmVyLmtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCldO1xuICB9KTtcbiAgbGluZXMucHVzaChcbiAgICAuLi5PYmplY3QuZW50cmllcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFlbWl0dGVkUHJvcGVydGllcy5oYXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpKVxuICApO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIG1lbWJlcl0gb2YgbWVtYmVyT3JkZXIuZW50cmllcygpKSB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSB7XG4gICAgICBsYXN0UHJvcGVydHlJbmRleEJ5S2V5LnNldChtZW1iZXIua2V5LCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYXN0UHJvcGVydHlJbmRleEJ5S2V5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXk6IHN0cmluZywgaXRlbTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgIH1cbiAgfVxuICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RNZW1iZXIobWVtYmVyOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBtZW1iZXIuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIHN0cmluZ2lmaWVkLmVudHJpZXMoKSkge1xuICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke2xpbmV9YDtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxudHlwZSBXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbiA9ICdXaWxsQm9vc3RlcicgfCAnV2lsbEJvb3N0ZXJMYWInO1xudHlwZSBSZXBvc2l0b3J5RnVsbE5hbWUgPSBgJHtXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbn0vJHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBGbm94UmVwb3NpdG9yeVNjb3BlIHtcbiAgb3JnYW5pemF0aW9ucz86IHJlYWRvbmx5IFdpbGxCb29zdGVyT3JnYW5pemF0aW9uW107XG4gIHJlcG9zaXRvcmllcz86IHJlYWRvbmx5IFJlcG9zaXRvcnlGdWxsTmFtZVtdO1xuICAvLyBSZXN0cmljdHMgdGhlIHNjb3BlIHRvIHJlcG9zaXRvcmllcyBvZiB0aGUgZ2l2ZW4gdmlzaWJpbGl0eS4gUHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHRoZWlyXG4gIC8vIGNpcGhlcnRleHRzIHRvIHRoZSB3b3JsZCwgc28gdGhleSBtdXN0IHVzZSBhIENJIGlkZW50aXR5IHNlcGFyYXRlIGZyb20gdGhlIG9yZy1pbnRlcm5hbCBvbmU6XG4gIC8vIGxlYWtpbmcgZWl0aGVyIENJIGtleSBtdXN0IG5vdCBleHBvc2UgdGhlIG90aGVyIHNpZGUncyBzZWNyZXRzLlxuICB2aXNpYmlsaXR5PzogJ3B1YmxpYycgfCAncHJpdmF0ZSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUHJpbmNpcGFsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXlzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVwb3NpdG9yeVNjb3BlOiBGbm94UmVwb3NpdG9yeVNjb3BlO1xuICAvLyBNYXJrcyB0aGUgcHJpbmNpcGFsIGFzIGEgQ0kgaWRlbnRpdHkgYW5kIG5hbWVzIHRoZSBHaXRIdWIgc2VjcmV0IGhvbGRpbmcgaXRzIHByaXZhdGUga2V5LlxuICAvLyBFdmVyeSBmbm94LW1hbmFnZWQgcmVwb3NpdG9yeSBtdXN0IHJlc29sdmUgb25lIChnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvdGhlcndpc2U6IGFcbiAgLy8gcm9zdGVyIHdpdGhvdXQgYSBDSSByZWNpcGllbnQgd291bGQgcmUtZW5jcnlwdCBzZWNyZXRzIHRoYXQgQ0kgY2FuIG5ldmVyIGRlY3J5cHQgYWdhaW4pLCBhbmRcbiAgLy8gdGhlIHdvcmtmbG93IGdlbmVyYXRvciBkZXJpdmVzIGl0cyBjYWxsZXIgbWFwcGluZ3MgZnJvbSB0aGUgc2FtZSByZXNvbHV0aW9uIHNvIHRoZSB0d28gY2FuXG4gIC8vIG5ldmVyIGRpc2FncmVlIG9uIHdoaWNoIENJIGlkZW50aXR5IGFwcGxpZXMuXG4gIGNpQWdlS2V5U2VjcmV0TmFtZT86ICdGTk9YX0FHRV9LRVknIHwgJ1BVQkxJQ19GTk9YX0FHRV9LRVknO1xufVxuXG5pbnRlcmZhY2UgRm5veEFnZVJlY2lwaWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHVibGljS2V5OiBzdHJpbmc7XG59XG5cbi8vIFRoZSBhZ2UgcHJpbmNpcGFscyBhdXRob3JpemVkIHRvIGRlY3J5cHQgZWFjaCBmbm94LW1hbmFnZWQgcmVwb3NpdG9yeS4gVG8gZ3JhbnQgYWNjZXNzLCBhZGQgdGhlXG4vLyBwcmluY2lwYWwncyBwdWJsaWMga2V5cyBhbmQgcmVwb3NpdG9yeSBzY29wZSBoZXJlLiBPcmdhbml6YXRpb24gc2NvcGVzIGluY2x1ZGUgZXZlcnkgY3VycmVudCBhbmRcbi8vIGZ1dHVyZSByZXBvc2l0b3J5IGluIHRoYXQgb3JnYW5pemF0aW9uOyB1c2UgcmVwb3NpdG9yaWVzIGZvciBleGFjdCBvd25lci9yZXBvc2l0b3J5IGdyYW50cy4gVGhlXG4vLyBuZXh0IHdiZnkgcnVuIG9uIGVhY2ggbWF0Y2hpbmcgcmVwb3NpdG9yeSByZXdyaXRlcyBldmVyeSBtYW5hZ2VkIGZub3gudG9tbCBhbmQgcmUtZW5jcnlwdHMgaXRzXG4vLyBjb21taXR0ZWQgc2VjcmV0cyBmb3IgdGhlIHJlc3VsdGluZyByZWNpcGllbnQgc2V0LiBBIHNjb3BlJ3Mgb3B0aW9uYWwgdmlzaWJpbGl0eSBjb25zdHJhaW50XG4vLyBzZWxlY3RzIG9ubHkgcHVibGljIG9yIG9ubHkgcHJpdmF0ZSByZXBvc2l0b3JpZXMgKHVzZWQgdG8ga2VlcCB0aGUgb3JnLWludGVybmFsIGFuZCB0aGVcbi8vIHB1YmxpYy1yZXBvc2l0b3J5IENJIGlkZW50aXRpZXMgYXBhcnQpLiBSZW1vdmluZyBhIHNjb3BlIGNhbm5vdCByZXZva2UgY2lwaGVydGV4dFxuLy8gYWxyZWFkeSBhdmFpbGFibGUgZnJvbSBHaXQgaGlzdG9yeSwgc28gcm90YXRlIHRoZSBzZWNyZXQgdmFsdWVzIHRoYXQgcHJpbmNpcGFsIGNvdWxkIGRlY3J5cHQuXG4vLyBPbmx5IHB1YmxpYyBrZXlzIG1heSBhcHBlYXIgaGVyZTsgYSBDSSBpZGVudGl0eSdzIHByaXZhdGUga2V5IHN1cHBsaWVzIHRoZSBGTk9YX0FHRV9LRVkgKG9yLFxuLy8gZm9yIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG5leHBvcnQgY29uc3QgRk5PWF9BR0VfUFJJTkNJUEFMUyA9IFtcbiAge1xuICAgIG5hbWU6ICdleGthenV1JyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFqMjM1NHhodm0zZnY5eTc3dDVnNnkzcThtZXhnazJtZjAwdGdya3pncDczdHlucnZ6NTVzOGF1YXl3J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3BvbmhhcnUnLFxuICAgIHB1YmxpY0tleXM6IFtcbiAgICAgICdhZ2UxOHJ1Z2xkZjlodGM2dW01ZXBscHgyN2s1M2VwNHpuMGxoendmZmdueHpocnEwYzd6Z3Z5cTN6Y2NkeScsXG4gICAgICAnYWdlMW56Mm45OWNyanI3bnA5eGpnbHdmZmZjM2R1ZDQ1ZGhld3F6cWZ6cHp0a2R3dTRoajc0Z3E2ZWw1MzMnLFxuICAgIF0sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgLy8gVGhlIG9yZy1pbnRlcm5hbCBDSSBpZGVudGl0eSAodGhlIEZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb24gc2VjcmV0IC8gfi8uY29uZmlnL2Zub3gvYWdlLWNpLXdiLnR4dCkuXG4gICAgbmFtZTogJ2NpJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFhMmM2ZWY2YWhsNm1ta2hncXR4ZzBtZ3RkN3lzc3BudHE3cnh1c3YyNmVmeGhudWhsY2RzcjlkcGFrJ10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSwgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnRk5PWF9BR0VfS0VZJyxcbiAgfSxcbiAge1xuICAgIC8vIFRoZSBDSSBpZGVudGl0eSBkZWRpY2F0ZWQgdG8gcHVibGljIHJlcG9zaXRvcmllcyAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uXG4gICAgLy8gc2VjcmV0IC8gfi8uY29uZmlnL2Zub3gvYWdlLWNpLXdiLXB1YmxpYy50eHQpLiBTY29wZWQgdG8gV2lsbEJvb3N0ZXIgb25seSBiZWNhdXNlIHRoZVxuICAgIC8vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0IGlzIHJlZ2lzdGVyZWQgaW4gdGhhdCBvcmdhbml6YXRpb24gYWxvbmU7IGEgcHVibGljXG4gICAgLy8gV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yeSByZXNvbHZlcyBOTyBDSSBpZGVudGl0eSBhbmQgZ2VuZXJhdGVGbm94VG9tbCBmYWlscyBjbG9zZWQgb24gaXRcbiAgICAvLyAoV2lsbEJvb3N0ZXJMYWIgZG9lcyBvd24gcHVibGljIHJlcG9zaXRvcmllcywgZS5nLiBpdHMgcmV1c2FibGUtd29ya2Zsb3dzIHN5bmMgbWlycm9yLCBidXRcbiAgICAvLyBub25lIG9mIHRoZW0gdXNlIGZub3gg4oCUIHJlZ2lzdGVyIHRoZSBzZWNyZXQgdGhlcmUgYW5kIGV4dGVuZCB0aGlzIHNjb3BlIGlmIG9uZSBldmVyIGRvZXMpLlxuICAgIG5hbWU6ICdjaS1wdWJsaWMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWZoZWE4NXhqd3A4OWx3cTNqY253ajMyc3doM3YyNHB3cGFycWg1bDdxa2d2YzRheDNwMHFsNmR1MzYnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlciddLCB2aXNpYmlsaXR5OiAncHVibGljJyB9LFxuICAgIGNpQWdlS2V5U2VjcmV0TmFtZTogJ1BVQkxJQ19GTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3JlbWluJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFtdzRwejlkdWp5OWRtaGswcGFscWF3amtqN200azd6eDc4eXI5Zmp0NjNzYTVsM2U0M3VxNm53MDA0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2FyaWVzJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFubjBlaHlhZW55cThrbW5xNDI5NGt6emd4djVkbmY2cGVwMmNka3JheHpmcWxrN3hnc3JxcW42bm45J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFtcbiAgICAgICAgJ1dpbGxCb29zdGVyL2FnZW50LWNoYWxsZW5nZXMnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnRpYy13b3JrZmxvd3MtZGFzaGJvYXJkJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2NoZWVybGluZ3MnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hvZnUtd2Fsa2luZycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHknLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvanVkZ2UnLFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3N1bmFnYScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdWx4em42eTY4a3UzNGNweDVmeWE1Z2Y3cm5yd3owdWZsbnllNnV4dWhnMzRwMm5qaGdrcW1nNzNnNCddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9leGVyY29kZScsICdXaWxsQm9vc3Rlci9qdWRnZSddLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXlhbWUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMXZ4bTJnczAwM3J1d204cDZoM2h2N3hhc2p1MnM4azRteG1jMzR6bTZncmR3em5yczA5bnE2eHo1dnonXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogWydXaWxsQm9vc3Rlci9haS1vY3InLCAnV2lsbEJvb3N0ZXIvY2hvZnUtd2Fsa2luZycsICdXaWxsQm9vc3Rlci9leGVyY29kZScsICdXaWxsQm9vc3Rlci9qdWRnZSddLFxuICAgIH0sXG4gIH0sXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBGbm94QWdlUHJpbmNpcGFsW107XG5cbmludGVyZmFjZSBGbm94VG9tbCB7XG4gIGltcG9ydD86IHVua25vd247XG4gIHByb3ZpZGVycz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmxldCBmbm94U3luY0ZhaWxlZCA9IGZhbHNlO1xubGV0IG1pZ3JhdGlvbk1hcmtlclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xuXG4vKiogV2hldGhlciBhbnkgZm5veCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGZhaWxlZCBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5OyBzZXR1cFNlY3JldHMgbXVzdCBub3QgdXBsb2FkIHRoZW4uICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRm5veFN5bmNGYWlsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBmbm94U3luY0ZhaWxlZDtcbn1cblxuLyoqXG4gKiBTeW5jaHJvbml6ZXMgdGhlIGFnZSByZWNpcGllbnRzIGluIGV2ZXJ5IGZub3gudG9tbCB3aXRoIHRoZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgZm9yIHRoaXNcbiAqIHJlcG9zaXRvcnkgYW5kIHJlLWVuY3J5cHRzIHRoZSBjb21taXR0ZWQgc2VjcmV0cyB3aGVuIHRoZSByZWNpcGllbnQgc2V0IGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUZub3hUb21sKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUZub3hUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRoZSBmYWlsdXJlIGZsYWcgaXMgcGVyIHJlcG9zaXRvcnk6IHdiZnkgY2FuIHByb2Nlc3MgbXVsdGlwbGUgd29ya2luZyBkaXJlY3RvcmllcyBpbiBvbmVcbiAgICAvLyBpbnZvY2F0aW9uLCBhbmQgYW4gZWFybGllciByZXBvc2l0b3J5J3MgZmFpbHVyZSBtdXN0IG5vdCB2ZXRvIGEgbGF0ZXIgcmVwb3NpdG9yeSdzIHVwbG9hZC5cbiAgICBmbm94U3luY0ZhaWxlZCA9IGZhbHNlO1xuICAgIC8vIEEgcmVwb3NpdG9yeSBvdXRzaWRlIFdpbGxCb29zdGVyL1dpbGxCb29zdGVyTGFiIG1hbmFnZXMgaXRzIG93biByZWNpcGllbnQgc2V0IChlLmcuIGFcbiAgICAvLyBwZXJzb25hbCByZXBvc2l0b3J5IHdpdGggaXRzIG93biBDSSBpZGVudGl0eSksIHNvIHJld3JpdGluZyBpdCB0byB0aGUgb3JnIHJvc3RlciB3b3VsZCBncmFudFxuICAgIC8vIG9yZyBtZW1iZXJzIGFjY2VzcyBhbmQgcmUtZW5jcnlwdCBzZWNyZXRzIGZvciBhIENJIGtleSB0aGF0IHJlcG9zaXRvcnkgZG9lcyBub3QgdXNlLlxuICAgIC8vIHNldHVwU2VjcmV0cyBuZXZlciB1cGxvYWRzIHNlY3JldHMgZm9yIHN1Y2ggcmVwb3NpdG9yaWVzIGVpdGhlciwgc28gc2tpcCBlbnRpcmVseS5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHJldHVybjtcbiAgICBjb25zdCBhZ2VSZWNpcGllbnRzID0gZ2V0Rm5veEFnZVJlY2lwaWVudHMocm9vdENvbmZpZyk7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICAvLyBBIG5lc3RlZC1vbmx5IGZub3ggbGF5b3V0IGlzIHVuc3VwcG9ydGVkOiBzZXR1cFNlY3JldHMgd291bGQgdGFrZSB0aGUgZG90ZW52IHBhdGggYW5kXG4gICAgICAvLyBkZWxldGUgRk5PWF9BR0VfS0VZIGV2ZW4gdGhvdWdoIHRoZSBuZXN0ZWQgY29uZmlnJ3MgQ0kgc3RpbGwgbmVlZHMgaXQuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBPbmx5IGFnZS11c2luZyBjb25maWdzIGNhcnJ5IHRoYXQgcmlzay4gV2l0aG91dCBhIHJvb3QgcHJvdmlkaW5nIHRoZSBhZ2UgcHJvdmlkZXIsIGFcbiAgICAgICAgLy8gc3RyYXkgY29uZmlnIHRoYXQgZGVjbGFyZXMgbm9uZSB1c2VzIG5vIGFnZSBlbmNyeXB0aW9uIGF0IGFsbCAoZS5nLiBhIHBsYWludGV4dCB0ZXN0XG4gICAgICAgIC8vIGZpeHR1cmUgb3IgZXhhbXBsZSBjb25maWcgYW55IHJlcG9zaXRvcnkgbWF5IGxlZ2l0aW1hdGVseSBjb21taXQpLCBzbyBpdCBuZWl0aGVyIG5lZWRzXG4gICAgICAgIC8vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gbm9yIG93bnMgYW4gRk5PWF9BR0VfS0VZIGFuZCBtdXN0IG5vdCBibG9jayB0aGUgcnVuLlxuICAgICAgICBjb25zdCBzdHJheUZpbGVQYXRocyA9IGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aCkuZmlsdGVyKChmaWxlUGF0aCkgPT5cbiAgICAgICAgICBkZWNsYXJlc0Zub3hBZ2VQcm92aWRlcihmaWxlUGF0aClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN0cmF5RmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBmbm94IGNvbmZpZ3MgZXhpc3Qgd2l0aG91dCBhIHJvb3QgZm5veC50b21sOiAke3N0cmF5RmlsZVBhdGhzLmpvaW4oJywgJyl9LiBBZGQgYSByb290IGZub3gudG9tbC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRmFpbCBjbG9zZWQ6IHdpdGhvdXQgZ2l0IGluZm9ybWF0aW9uIGEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgY2Fubm90IGJlIHJ1bGVkIG91dCwgYW5kXG4gICAgICAgIC8vIHNldHVwU2VjcmV0cyB3b3VsZCBvdGhlcndpc2UgdGFrZSB0aGUgZG90ZW52IHBhdGggYW5kIGRlbGV0ZSBGTk9YX0FHRV9LRVkuXG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIGNoZWNrIGZvciBuZXN0ZWQgZm5veCBjb25maWdzIGR1ZSB0bzogJHsoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBmYWlsZWQgdmlzaWJpbGl0eSBsb29rdXAgY29sbGFwc2VzIGlzUHVibGljUmVwbyB0byBmYWxzZSwgd2hpY2ggd291bGQgc2lsZW50bHkgcmUtZW5jcnlwdFxuICAgIC8vIGEgcHVibGljIHJlcG9zaXRvcnkncyB3b3JsZC1yZWFkYWJsZSBjaXBoZXJ0ZXh0cyB0byB0aGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5IChhbmQgdmljZVxuICAgIC8vIHZlcnNhIGRyb3AgdGhlIHB1YmxpYyBvbmUpLiBGYWlsIGluc3RlYWQgb2YgZ3Vlc3Npbmcgd2hlbmV2ZXIgdmlzaWJpbGl0eSBjaGFuZ2VzIHRoZSByb3N0ZXIuXG4gICAgaWYgKCFyb290Q29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biAmJiBkb2VzRm5veFJlY2lwaWVudFNldERlcGVuZE9uVmlzaWJpbGl0eShyb290Q29uZmlnKSkge1xuICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSB0aGUgdmlzaWJpbGl0eSBvZiAke3Jvb3RDb25maWcucmVwb0F1dGhvcn0vJHtyb290Q29uZmlnLnJlcG9OYW1lfSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAoR2l0SHViIGxvb2t1cCBmYWlsZWQpIGFuZCB0aGUgQ0kgcmVjaXBpZW50IGRlcGVuZHMgb24gaXQuIENoZWNrIG5ldHdvcmsgYW5kIGdoIGF1dGhlbnRpY2F0aW9uLCB0aGVuIHJlcnVuIHdiZnkuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQm90aCBDSSBpZGVudGl0aWVzIGFyZSB2aXNpYmlsaXR5LWNvbnN0cmFpbmVkLCBzbyBhIHJlcG9zaXRvcnkgY2FuIGZhbGwgdGhyb3VnaCBCT1RIIChlLmcuIGFcbiAgICAvLyBwdWJsaWMgV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yeSwgd2hvc2Ugb3JnYW5pemF0aW9uIGhhcyBubyBQVUJMSUNfRk5PWF9BR0VfS0VZIHNlY3JldCkuXG4gICAgLy8gUmUtZW5jcnlwdGluZyBmb3IgYSByb3N0ZXIgd2l0aG91dCBhIENJIGlkZW50aXR5IHdvdWxkIGxlYXZlIENJIHVuYWJsZSB0byBkZWNyeXB0IGFueXRoaW5nLFxuICAgIC8vIGZhaWxpbmcgb25seSBhdCBydW50aW1lIGluIEFjdGlvbnM7IGZhaWwgbG91ZGx5IGhlcmUgaW5zdGVhZC5cbiAgICBpZiAoIXJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG5vIENJIGlkZW50aXR5IGlzIHNjb3BlZCB0byAke3Jvb3RDb25maWcucmVwb0F1dGhvcn0vJHtyb290Q29uZmlnLnJlcG9OYW1lfSAocHVibGljIHJlcG9zaXRvcmllcyBhcmUgc3VwcG9ydGVkIG9ubHkgaW4gdGhlIFdpbGxCb29zdGVyIG9yZ2FuaXphdGlvbikuIFByb3Zpc2lvbiB0aGUgbWF0Y2hpbmcgb3JnYW5pemF0aW9uIHNlY3JldCBhbmQgZXh0ZW5kIHRoZSBDSSBzY29wZXMgaW4gd2JmeSBmaXJzdC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgbWlncmF0aW9uIGlzIHRyYW5zYWN0aW9uYWwgb3ZlciBldmVyeSBtYW5hZ2VkIGZub3gudG9tbDogcmVydW5zIG11c3QgcmV0cnkgZnJvbSB0aGVcbiAgICAvLyBvcmlnaW5hbCBzdGF0ZSwgYW5kIGEgcGFydGlhbGx5IG1pZ3JhdGVkIHRyZWUgY291bGQgb3RoZXJ3aXNlIGJlY29tZSB1bmRlY3J5cHRhYmxlIGZvciB0aGVcbiAgICAvLyBpZGVudGl0eSBwZXJmb3JtaW5nIGEgbGF0ZXIgcmV0cnkgKGUuZy4gd2hlbiBhIHJlY2lwaWVudCBpcyBiZWluZyByZW1vdmVkKS5cbiAgICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIC8vIEEgZmFpbGVkIHN5bmNocm9uaXphdGlvbiBtdXN0IGZhaWwgdGhlIHdob2xlIHdiZnkgcnVuOiBleGl0aW5nIHplcm8gd2l0aCBzdGFsZSByZWNpcGllbnRzXG4gICAgLy8gd291bGQgbGVhdmUgc2VjcmV0cyB1bmRlY3J5cHRhYmxlIGZvciBuZXcgcmVjaXBpZW50cyB3aGlsZSBsb29raW5nIHN1Y2Nlc3NmdWwuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFueSBmbm94IGNvbmZpZyAoaW5jbHVkaW5nIGFsaWFzZXMgYW5kIGxvY2FsIG92ZXJyaWRlcykgaW4gYW4gYW5jZXN0b3IgZGlyZWN0b3J5IHdvdWxkXG4gICAgICAvLyBtZXJnZSBpbnRvIChhbmQgcG9zc2libHkgYmUgUkVXUklUVEVOIGJ5KSB0aGlzIHJlcG9zaXRvcnkncyBgZm5veCByZWVuY3J5cHRgIHRocm91Z2hcbiAgICAgIC8vIGhpZXJhcmNoaWNhbCBsb2FkaW5nLCB1c2luZyB0aGlzIHJlcG9zaXRvcnkncyByZWNpcGllbnQgc2V0IGZvciBmb3JlaWduIHNlY3JldHMuXG4gICAgICBmb3IgKGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJvb3REaXJQYXRoKTsgOyBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGFuY2VzdG9yRm5veEZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoKTtcbiAgICAgICAgaWYgKGFuY2VzdG9yRm5veEZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYW4gYW5jZXN0b3IgZGlyZWN0b3J5IGNvbnRhaW5zIGZub3ggY29uZmlncyB0aGF0IGZub3ggd291bGQgaGllcmFyY2hpY2FsbHkgbWVyZ2UgYW5kIHJld3JpdGU6ICR7YW5jZXN0b3JGbm94RmlsZU5hbWVzXG4gICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSlcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBSZW1vdmUgdGhlbSBvciBtb3ZlIHRoZSByZXBvc2l0b3J5LmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aC5kaXJuYW1lKGRpclBhdGgpID09PSBkaXJQYXRoKSBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIGZub3ggYWxzbyBsb2FkcyBjb21taXR0ZWQgY29uZmlnIGFsaWFzZXMgdGhpcyBnZW5lcmF0b3IgY2Fubm90IGtlZXAgaW4gc3luYy5cbiAgICAgIGNvbnN0IGZub3hMaWtlRmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkRmlsZVBhdGhzID0gZm5veExpa2VGaWxlUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgIT09ICdmbm94LnRvbWwnKTtcbiAgICAgIGlmICh1bnN1cHBvcnRlZEZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBvbmx5IGZub3gudG9tbCBmaWxlcyBhcmUgc3VwcG9ydGVkOiAke3Vuc3VwcG9ydGVkRmlsZVBhdGhzLmpvaW4oJywgJyl9LiBNZXJnZSB0aGVtIGludG8gdGhlIGFkamFjZW50IGZub3gudG9tbC5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpclBhdGhzID0gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHMpO1xuICAgICAgaWYgKCFkaXJQYXRocy5pbmNsdWRlcyhyb290RGlyUGF0aCkpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnZm5veC50b21sJyl9IGlzIGludmlzaWJsZSB0byBnaXQgKGdpdGlnbm9yZWQ/KS4gQ29tbWl0IGl0IG9yIHJlbW92ZSBpdC5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSBnaXRpZ25vcmVkIGZpbGVzLCBzbyBhbHNvIGluc3BlY3QgZXZlcnkgZGlyZWN0b3J5IGluIGVhY2hcbiAgICAgIC8vIG1hbmFnZWQgY29uZmlnJ3MgaGllcmFyY2h5IHRocm91Z2ggdGhlIGZpbGVzeXN0ZW06IGEgZ2l0aWdub3JlZCBhbGlhcyAoZS5nLiAuZm5veC50b21sKVxuICAgICAgLy8gb3IgYSBnaXRpZ25vcmVkIGZub3gudG9tbCBpbiBhbiBpbnRlcm1lZGlhdGUgZGlyZWN0b3J5IHdvdWxkIHN0aWxsIGJlIGxvYWRlZCBieSBmbm94IGFuZFxuICAgICAgLy8gY291bGQgb3ZlcnJpZGUgdGhlIHByb3ZpZGVyIHVzZWQgZm9yIG5lc3RlZCByZS1lbmNyeXB0aW9uLlxuICAgICAgY29uc3QgbWFuYWdlZERpclBhdGhzID0gbmV3IFNldChkaXJQYXRocyk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBoaWVyYXJjaHlEaXJQYXRoIG9mIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGgsIHJvb3REaXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHN0cmF5RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGhpZXJhcmNoeURpclBhdGgpLmZpbHRlcihcbiAgICAgICAgICAgIChuYW1lKSA9PiBuYW1lICE9PSAnZm5veC5sb2NhbC50b21sJyAmJiAhKG5hbWUgPT09ICdmbm94LnRvbWwnICYmIG1hbmFnZWREaXJQYXRocy5oYXMoaGllcmFyY2h5RGlyUGF0aCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc3RyYXlGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBmbm94IHdvdWxkIGxvYWQgdW5tYW5hZ2VkIChnaXRpZ25vcmVkPykgY29uZmlnczogJHtzdHJheUZpbGVOYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGguam9pbihoaWVyYXJjaHlEaXJQYXRoLCBuYW1lKSlcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKX0uIENvbW1pdCB0aGVtIGFzIGZub3gudG9tbCBvciByZW1vdmUgdGhlbS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBIGZub3gubG9jYWwudG9tbCBhbnl3aGVyZSBpbiB0aGUgbWVyZ2VkIGhpZXJhcmNoeSAobm90IG9ubHkgbmV4dCB0byBhIG1hbmFnZWRcbiAgICAgICAgICAvLyBjb25maWcpIGNhbiBvdmVycmlkZSBwcm92aWRlcnMuXG4gICAgICAgICAgY29uc3QgbG9jYWxJc3N1ZSA9IGZpbmRGbm94TG9jYWxUb21sSXNzdWUoaGllcmFyY2h5RGlyUGF0aCk7XG4gICAgICAgICAgaWYgKGxvY2FsSXNzdWUpIHtcbiAgICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtsb2NhbElzc3VlfS4gS2VlcCBvbmx5IG1hY2hpbmUtbG9jYWwgc2VjcmV0IG92ZXJyaWRlcyB0aGVyZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGluLW1lbW9yeSBzbmFwc2hvdHMgZG8gbm90IHN1cnZpdmUgYSBraWxsZWQgcHJvY2Vzcywgc28gYSBkdXJhYmxlIG1hcmtlciBpcyB3cml0dGVuXG4gICAgICAvLyBiZWZvcmUgdGhlIGZpcnN0IG11dGF0aW9uIGFuZCByZW1vdmVkIG9ubHkgd2hlbiB0aGUgdHJlZSBpcyBjb25zaXN0ZW50IGFnYWluLiBBIGxlZnRvdmVyXG4gICAgICAvLyBtYXJrZXIgbWVhbnMgYSBwcmV2aW91cyBydW4gd2FzIGtpbGxlZCBtaWQtbWlncmF0aW9uIChvciBjb3VsZCBub3QgcmVzdG9yZSk6IHNvbWVcbiAgICAgIC8vIGNpcGhlcnRleHRzIG1heSBub3QgbWF0Y2ggdGhlIHJlY2lwaWVudHMsIG9yIG1heSBldmVuIGJlIHVuZGVjcnlwdGFibGUgZm9yIHRoZSBleGVjdXRvcidzXG4gICAgICAvLyBpZGVudGl0eSB3aGVuIGEgcmVjaXBpZW50IHdhcyBiZWluZyByZW1vdmVkIOKAlCBzdGF0ZXMgdGhpcyBjb2RlIGNhbm5vdCByZXBhaXIgc2FmZWx5XG4gICAgICAvLyBiZWNhdXNlIHRoZSB3b3JraW5nIHRyZWUgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSAoYnJhbmNoIHN3aXRjaGVzLCBtYW51YWwgZWRpdHMpLiBUaGVcbiAgICAgIC8vIGZub3gudG9tbCBmaWxlcyBhcmUgZ2l0LXRyYWNrZWQsIHNvIHRoZSB1c2VyIHJlc3RvcmVzIHRoZW0gdmlhIGdpdCBhbmQgY2xlYXJzIHRoZSBtYXJrZXIuXG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbWlncmF0aW9uLW1hcmtlcicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMobWlncmF0aW9uTWFya2VyUGF0aCkpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGEgcHJldmlvdXMgbWlncmF0aW9uIHdhcyBpbnRlcnJ1cHRlZC4gUmVzdG9yZSB0aGUgZm5veC50b21sIGZpbGVzIHZpYSBnaXQgKGUuZy4gXFxgZ2l0IHN0YXR1c1xcYCBhbmQgXFxgZ2l0IHJlc3RvcmUgLS0gJypmbm94Ki50b21sJ1xcYCBpZiB5b3UgaGF2ZSBubyBpbnRlbnRpb25hbCBsb2NhbCBjaGFuZ2VzKSwgdGhlbiBkZWxldGUgJHttaWdyYXRpb25NYXJrZXJQYXRofSBhbmQgcmVydW4gd2JmeS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQSB0cmFja2VkIHN5bWxpbmsgbmFtZWQgZm5veC50b21sIChvciBhIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5KSB3b3VsZCBtYWtlIHRoZVxuICAgICAgLy8gcmV3cml0ZSBhbmQgYGZub3ggcmVlbmNyeXB0YCByZWFkIGFuZCBNT0RJRlkgZmlsZXMgb3V0c2lkZSB0aGlzIHJlcG9zaXRvcnkuXG4gICAgICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgICAgIGNvbnN0IHJlYWxQYXRoID0gZnMucmVhbHBhdGhTeW5jKGZub3hUb21sUGF0aCk7XG4gICAgICAgIGlmIChmcy5sc3RhdFN5bmMoZm5veFRvbWxQYXRoKS5pc1N5bWJvbGljTGluaygpIHx8ICFyZWFsUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKSkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoJHtyZWFsUGF0aH0pLiBSZXBsYWNlIGl0IHdpdGggYSByZWd1bGFyIGluLXJlcG9zaXRvcnkgZmlsZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc25hcHNob3RzLnNldChmbm94VG9tbFBhdGgsIGZzLnJlYWRGaWxlU3luYyhmbm94VG9tbFBhdGgsICd1dGY4JykpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb3J0ZWQgb3JkZXIgcHJvY2Vzc2VzIGFuY2VzdG9ycyBiZWZvcmUgZGVzY2VuZGFudHMsIHNvIGNvbmZpZ3MgaW5oZXJpdGluZyBhbiB1cGRhdGVkXG4gICAgICAvLyBwcm92aWRlciByZS1lbmNyeXB0IGFnYWluc3QgdGhlIGFscmVhZHktdXBkYXRlZCByZWNpcGllbnRzLlxuICAgICAgY29uc3QgY2hhbmdlZERpclBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IGFueUZhaWxlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGFuY2VzdG9yQ2hhbmdlZCA9IGNoYW5nZWREaXJQYXRocy5zb21lKChjaGFuZ2VkRGlyUGF0aCkgPT4gZGlyUGF0aC5zdGFydHNXaXRoKGNoYW5nZWREaXJQYXRoICsgcGF0aC5zZXApKTtcbiAgICAgICAgLy8gRXZlcnkgZGlyUGF0aCB3YXMgc25hcHNob3R0ZWQgYWJvdmUuIEEgbWlzc2luZyBzbmFwc2hvdCBtdXN0IGZhaWwgaGFyZDogZmFsbGluZyBiYWNrIHRvXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b3VsZCBmbG93IGludG8gcmVwbGFjZUFnZVJlY2lwaWVudHMgYW5kIG92ZXJ3cml0ZSB0aGUgcmVhbCBmbm94LnRvbWxcbiAgICAgICAgLy8gd2l0aCBhIHJlY2lwaWVudHMtb25seSBmaWxlLCBkZXN0cm95aW5nIGV2ZXJ5IGNvbW1pdHRlZCBzZWNyZXQuXG4gICAgICAgIGNvbnN0IHNuYXBzaG90Q29udGVudCA9IHNuYXBzaG90cy5nZXQocGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKSk7XG4gICAgICAgIGlmIChzbmFwc2hvdENvbnRlbnQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGZub3gudG9tbCBzbmFwc2hvdCBmb3IgJHtkaXJQYXRofS5gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3luY2hyb25pemVGbm94QWdlUmVjaXBpZW50cyhcbiAgICAgICAgICBkaXJQYXRoLFxuICAgICAgICAgIHJvb3REaXJQYXRoLFxuICAgICAgICAgIGRpclBhdGggPT09IHJvb3REaXJQYXRoLFxuICAgICAgICAgIGFuY2VzdG9yQ2hhbmdlZCxcbiAgICAgICAgICBzbmFwc2hvdENvbnRlbnQsXG4gICAgICAgICAgYWdlUmVjaXBpZW50c1xuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0ID09PSAnY2hhbmdlZCcpIGNoYW5nZWREaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgICBhbnlGYWlsZWQgfHw9IHJlc3VsdCA9PT0gJ2ZhaWxlZCc7XG4gICAgICB9XG4gICAgICBpZiAoYW55RmFpbGVkKSB7XG4gICAgICAgIC8vIEEgZmFpbGVkIHJlLWVuY3J5cHRpb24gbWF5IGhhdmUgcmV3cml0dGVuIHNvbWUgY2lwaGVydGV4dHMsIHNvIHJlc3RvcmUgdW5jb25kaXRpb25hbGx5LlxuICAgICAgICAvLyBUaGUgbWFya2VyIGlzIHJlbW92ZWQgb25seSB3aGVuIHJlc3RvcmF0aW9uIGZ1bGx5IHN1Y2NlZWRlZCBhbmQgdGhlIHRyZWUgaXMgY29uc2lzdGVudC5cbiAgICAgICAgLy8gUmVzdG9yZSBPTkxZIHdoZW4gdGhpcyBydW4gb3ducyB0aGUgbWFya2VyOiBldmVyeSBjb21taXR0ZWQtY29uZmlnIG11dGF0aW9uIGhhcHBlbnNcbiAgICAgICAgLy8gYWZ0ZXIgbWFya2VyIGFjcXVpc2l0aW9uLCBzbyBhIG5vbi1vd25lciAoZS5nLiBsb3NpbmcgYSByYWNlIGFnYWluc3QgYSBjb25jdXJyZW50IHdiZnkpXG4gICAgICAgIC8vIGhhcyBjaGFuZ2VkIG5vdGhpbmcgYW5kIG11c3Qgbm90IG92ZXJ3cml0ZSB0aGUgb3duZXIncyBpbi1wcm9ncmVzcyBtaWdyYXRpb24uXG4gICAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAobWlncmF0aW9uTWFya2VyT3duZWQgJiYgcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHMpKSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGR1ZSB0bzogJHsoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcn1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3luY2hyb25pemVGbm94QWdlUmVjaXBpZW50cyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBpc1Jvb3Q6IGJvb2xlYW4sXG4gIGFuY2VzdG9yUmVjaXBpZW50c0NoYW5nZWQ6IGJvb2xlYW4sXG4gIG9yaWdpbmFsQ29udGVudDogc3RyaW5nLFxuICBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W11cbik6IFByb21pc2U8J2NoYW5nZWQnIHwgJ3VuY2hhbmdlZCcgfCAnZmFpbGVkJz4ge1xuICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuXG4gIC8vIFJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gb25seSB1bmRlcnN0YW5kcyB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUgbGF5b3V0IHdpdGggb25lXG4gIC8vIHRvcC1sZXZlbCBhZ2UgcHJvdmlkZXIgbmFtZWQgYGFnZWAuIEdpdGlnbm9yZWQgY29uZmlnIGFsaWFzZXMgKGUuZy4gLmZub3gubG9jYWwudG9tbCkgdGhhdFxuICAvLyBnaXQtYmFzZWQgZGlzY292ZXJ5IGNhbm5vdCBzZWUsIGltcG9ydHMsIGRpZmZlcmVudGx5IG5hbWVkIGFnZSBwcm92aWRlcnMsIG9yIHByb3ZpZGVyXG4gIC8vIG92ZXJyaWRlcyB3b3VsZCBrZWVwIHVzaW5nIHJlY2lwaWVudCBzZXRzIHRoaXMgZ2VuZXJhdG9yIGRvZXMgbm90IHJld3JpdGUsIHNvIHRoZWlyIHNlY3JldHNcbiAgLy8gd291bGQgc2lsZW50bHkgc3RheSB1bmRlY3J5cHRhYmxlIGZvciBuZXcgcmVjaXBpZW50czsgZmFpbCBpbnN0ZWFkIG9mIHByb2NlZWRpbmcuIFRoZVxuICAvLyBnaXRpZ25vcmVkIGZub3gubG9jYWwudG9tbCBpcyBhIHN1cHBvcnRlZCBtYWNoaW5lLWxvY2FsIG92ZXJyaWRlLCBidXQgb25seSB3aGlsZSBpdCBsZWF2ZXNcbiAgLy8gcHJvdmlkZXJzIGFsb25lLlxuICBjb25zdCB1bnN1cHBvcnRlZEZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoKS5maWx0ZXIoXG4gICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LnRvbWwnICYmIG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnXG4gICk7XG4gIGlmICh1bnN1cHBvcnRlZEZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGluICR7ZGlyUGF0aH0gYmVjYXVzZSBvbmx5IGZub3gudG9tbCBhbmQgZm5veC5sb2NhbC50b21sIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlTmFtZXMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byBmbm94LnRvbWwuYFxuICAgICk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIC8vIEEgc3RhbGUgYmFja3VwIGxlZnQgYnkgYW4gaW50ZXJydXB0ZWQgZWFybGllciBydW4gbXVzdCBiZSByZXN0b3JlZCBzbyB0aGUgdXNlcidzIGxvY2FsXG4gIC8vIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdCAodGhlIG1pZ3JhdGlvbiBtYXJrZXIgc2VwYXJhdGVseSBibG9ja3MgdGhpcyBydW4gd2hlbiB0aGVcbiAgLy8gaW50ZXJydXB0aW9uIGxlZnQgdGhlIG1pZ3JhdGlvbiBpdHNlbGYgaW5jb21wbGV0ZSkuXG4gIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG5cbiAgY29uc3QgbGF5b3V0SXNzdWUgPSBmaW5kRm5veExheW91dElzc3VlKG9yaWdpbmFsQ29udGVudCk7XG4gIGlmIChsYXlvdXRJc3N1ZSkge1xuICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2Zub3hUb21sUGF0aH0gJHtsYXlvdXRJc3N1ZX0uYCk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2Uob3JpZ2luYWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgY29uc3QgcHJvZmlsZU5hbWVzID0gT2JqZWN0LmtleXMoc2V0dGluZ3MucHJvZmlsZXMgPz8ge30pO1xuICBjb25zdCBjdXJyZW50UmVjaXBpZW50cyA9IHJlYWRGbm94QWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQpO1xuXG4gIC8vIEEgbmVzdGVkIGZub3gudG9tbCB3aXRob3V0IGl0cyBvd24gYWdlIHByb3ZpZGVyIGluaGVyaXRzIHRoZSBuZWFyZXN0IGFuY2VzdG9yJ3Mgb25lIHRocm91Z2hcbiAgLy8gZm5veCdzIGhpZXJhcmNoaWNhbCBsb2FkaW5nLCBzbyBvbmx5IHRoZSByb290IGNvbmZpZyBtdXN0IGRlY2xhcmUgdGhlIHByb3ZpZGVyIOKAlCBidXQgdGhlXG4gIC8vIG5lc3RlZCBjb25maWcncyBvd24gY2lwaGVydGV4dHMgc3RpbGwgbXVzdCBiZSByZS1lbmNyeXB0ZWQgd2hlbmV2ZXIgYW4gYW5jZXN0b3IncyByZWNpcGllbnRzXG4gIC8vIGNoYW5nZWQsIGFuZCB0aGF0IG9ubHkgaGFwcGVucyB3aGVuIGBmbm94IHJlZW5jcnlwdGAgcnVucyBmcm9tIHRoZSBuZXN0ZWQgZGlyZWN0b3J5LlxuICBpZiAoIWlzUm9vdCAmJiAhY3VycmVudFJlY2lwaWVudHMpIHtcbiAgICBpZiAoYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZCkge1xuICAgICAgd3JpdGVNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIGlmICghcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aCwgcm9vdERpclBhdGgsIHByb2ZpbGVOYW1lcykpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmUtZW5jcnlwdCBmbm94IHNlY3JldHMgaW4gJHtkaXJQYXRofSBmb3IgdGhlIHVwZGF0ZWQgcmVjaXBpZW50cy4gRml4IHRoZSBlcnJvciBhbmQgcmVydW4gd2JmeS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiAnZmFpbGVkJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICd1bmNoYW5nZWQnO1xuICB9XG5cbiAgaWYgKFxuICAgIGN1cnJlbnRSZWNpcGllbnRzICYmXG4gICAgY3VycmVudFJlY2lwaWVudHMuc2l6ZSA9PT0gYWdlUmVjaXBpZW50cy5sZW5ndGggJiZcbiAgICBhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IGN1cnJlbnRSZWNpcGllbnRzLmhhcyhyZWNpcGllbnQucHVibGljS2V5KSlcbiAgKSB7XG4gICAgcmV0dXJuICd1bmNoYW5nZWQnO1xuICB9XG5cbiAgLy8gUmV3cml0ZSBvbmx5IHRoZSByZWNpcGllbnRzIGFzc2lnbm1lbnQgc28gdXNlci1hdXRob3JlZCBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBzdXJ2aXZlLlxuICAvLyBSZS1wYXJzZSBiZWZvcmUgd3JpdGluZzogYW4gdW51c3VhbCBsYXlvdXQgKGUuZy4gZG90dGVkIGtleXMpIGNvdWxkIG1ha2UgdGhlIHRleHR1YWwgZWRpdFxuICAvLyBwcm9kdWNlIGEgZHVwbGljYXRlIHRhYmxlIG9yIGxlYXZlIHRoZSBvbGQgcmVjaXBpZW50cyBpbiBlZmZlY3QuXG4gIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gcmVwbGFjZUFnZVJlY2lwaWVudHMob3JpZ2luYWxDb250ZW50LCBhZ2VSZWNpcGllbnRzKTtcbiAgY29uc3QgdXBkYXRlZFJlY2lwaWVudHMgPSBbLi4uKHJlYWRGbm94QWdlUmVjaXBpZW50cyh1cGRhdGVkQ29udGVudCkgPz8gW10pXTtcbiAgaWYgKFxuICAgIHVwZGF0ZWRSZWNpcGllbnRzLmxlbmd0aCAhPT0gYWdlUmVjaXBpZW50cy5sZW5ndGggfHxcbiAgICAhYWdlUmVjaXBpZW50cy5ldmVyeSgocmVjaXBpZW50KSA9PiB1cGRhdGVkUmVjaXBpZW50cy5pbmNsdWRlcyhyZWNpcGllbnQucHVibGljS2V5KSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXdyaXRpbmcgdGhlIGFnZSByZWNpcGllbnRzIGluICR7Zm5veFRvbWxQYXRofSBkaWQgbm90IHRha2UgZWZmZWN0OyB1cGRhdGUgdGhlbSBtYW51YWxseS5gKTtcbiAgfVxuICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuXG4gIGlmICghcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aCwgcm9vdERpclBhdGgsIHByb2ZpbGVOYW1lcykpIHtcbiAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjb25maWc6IGtlZXBpbmcgdGhlIG5ldyByZWNpcGllbnRzIHdpdGggb2xkIGNpcGhlcnRleHRzIHdvdWxkIG1ha2VcbiAgICAvLyB0aGlzIGdlbmVyYXRvciBza2lwIHJlLWVuY3J5cHRpb24gZm9yZXZlciBhbmQgbGV0IHNldHVwU2VjcmV0cyB1cGxvYWQgYSBDSSBrZXkgdGhhdFxuICAgIC8vIGNhbm5vdCBkZWNyeXB0IGFueXRoaW5nLiBUaGUgb2xkIGNpcGhlcnRleHRzIHJlbWFpbiB2YWxpZCBmb3IgdGhlIG9sZCByZWNpcGllbnRzLlxuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCBvcmlnaW5hbENvbnRlbnQpO1xuICAgIGZhaWxGbm94U3luYyhcbiAgICAgIGBGYWlsZWQgdG8gcmUtZW5jcnlwdCBmbm94IHNlY3JldHMgaW4gJHtkaXJQYXRofSBmb3IgdGhlIHVwZGF0ZWQgcmVjaXBpZW50cy4gRml4IHRoZSBlcnJvciBhbmQgcmVydW4gd2JmeS5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgcmV0dXJuICdjaGFuZ2VkJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYSBmbm94LnRvbWwgbGF5b3V0IHRoYXQgcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBhbmQgdGhlIENJLWtleVxuICogdmVyaWZpY2F0aW9uIGNhbm5vdCBjb3Zlciwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHN0YW5kYXJkIHNpbmdsZS1maWxlLCBzaW5nbGUtYWdlLXByb3ZpZGVyXG4gKiBsYXlvdXQgaXMgdXNlZC5cbiAqL1xuZnVuY3Rpb24gZmluZEZub3hMYXlvdXRJc3N1ZShmbm94VG9tbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmIChzZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCkgcmV0dXJuICd1c2VzIHRoZSB1bnN1cHBvcnRlZCBgaW1wb3J0YCBzZXR0aW5nJztcbiAgICBjb25zdCBub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm92aWRlcnMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbbmFtZSwgcHJvdmlkZXJdKSA9PiAocHJvdmlkZXI/LnR5cGUgPT09ICdhZ2UnKSAhPT0gKG5hbWUgPT09ICdhZ2UnKSlcbiAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7XG4gICAgaWYgKG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYGRlY2xhcmVzIGFnZSBwcm92aWRlcnMgbm90IG5hbWVkIFxcYGFnZVxcYCAob3IgYW4gXFxgYWdlXFxgIHByb3ZpZGVyIG9mIGFub3RoZXIgdHlwZSk6ICR7bm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmpvaW4oJywgJyl9YDtcbiAgICB9XG4gICAgY29uc3QgcHJvZmlsZXNXaXRoUHJvdmlkZXJzID0gT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MucHJvZmlsZXMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbLCBwcm9maWxlXSkgPT4gcHJvZmlsZT8ucHJvdmlkZXJzKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAocHJvZmlsZXNXaXRoUHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgdW5zdXBwb3J0ZWQgcHJvZmlsZS1zcGVjaWZpYyBwcm92aWRlcnM6ICR7cHJvZmlsZXNXaXRoUHJvdmlkZXJzLmpvaW4oJywgJyl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICdjYW5ub3QgYmUgcGFyc2VkIGFzIFRPTUwnO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIFtwcm92aWRlcnMuYWdlXS5yZWNpcGllbnRzIG9mIGEgZm5veC50b21sLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgY29uZmlnIGRlY2xhcmVzIG5vXG4gKiBhZ2UgcHJvdmlkZXIgKG5lc3RlZCBjb25maWdzIHRoZW4gaW5oZXJpdCB0aGUgcm9vdCBvbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZub3hBZ2VSZWNpcGllbnRzKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZm5veFRvbWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgICBpZiAoIXNldHRpbmdzLnByb3ZpZGVycz8uYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBzZXR0aW5ncy5wcm92aWRlcnMuYWdlLnJlY2lwaWVudHM7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuaXNBcnJheShyZWNpcGllbnRzKSA/IHJlY2lwaWVudHMuZmlsdGVyKChyKTogciBpcyBzdHJpbmcgPT4gdHlwZW9mIHIgPT09ICdzdHJpbmcnKSA6IFtdKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQW4gdW5wYXJzYWJsZSBmbm94LnRvbWwgeWllbGRzIG5vIHJlY2lwaWVudHMsIHNvIHRoZSBjYWxsZXIgcmVwb3J0cyBhbiBlcnJvci5cbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG59XG5cbnR5cGUgRm5veFJlcG9zaXRvcnlJZGVudGl0eSA9IFBpY2s8UGFja2FnZUNvbmZpZywgJ3JlcG9BdXRob3InIHwgJ3JlcG9OYW1lJyB8ICdpc1B1YmxpY1JlcG8nIHwgJ2lzUmVwb1Zpc2liaWxpdHlLbm93bic+O1xuXG4vKipcbiAqIFRoZSBHaXRIdWIgc2VjcmV0IGhvbGRpbmcgdGhlIHByaXZhdGUga2V5IG9mIHRoZSBDSSBpZGVudGl0eSBzY29wZWQgdG8gdGhlIHJlcG9zaXRvcnksIG9yXG4gKiB1bmRlZmluZWQgd2hlbiBub25lIGlzIChhbiB1bmtub3duIHZpc2liaWxpdHksIG9yIGEgcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMpLiBUaGUgc2luZ2xlXG4gKiBzb3VyY2Ugb2YgdHJ1dGggc2hhcmVkIGJ5IHRoZSByZWNpcGllbnQgc3luYyBhbmQgdGhlIHdvcmtmbG93IGdlbmVyYXRvcidzIGNhbGxlciBtYXBwaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKFxuICBjb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHlcbik6ICdGTk9YX0FHRV9LRVknIHwgJ1BVQkxJQ19GTk9YX0FHRV9LRVknIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2lQcmluY2lwYWw6IEZub3hBZ2VQcmluY2lwYWwgfCB1bmRlZmluZWQgPSBGTk9YX0FHRV9QUklOQ0lQQUxTLmZpbmQoXG4gICAgKHByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCkgPT5cbiAgICAgIHByaW5jaXBhbC5jaUFnZUtleVNlY3JldE5hbWUgJiYgbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUocHJpbmNpcGFsLnJlcG9zaXRvcnlTY29wZSwgY29uZmlnKVxuICApO1xuICByZXR1cm4gY2lQcmluY2lwYWw/LmNpQWdlS2V5U2VjcmV0TmFtZTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlY2lwaWVudCBzZXQgZGlmZmVycyBiZXR3ZWVuIHRoZSBwdWJsaWMgYW5kIHByaXZhdGUgcmVhZGluZyBvZiB0aGUgcmVwb3NpdG9yeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzRm5veFJlY2lwaWVudFNldERlcGVuZE9uVmlzaWJpbGl0eShcbiAgcm9vdENvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHB1YmxpY0tleXNGb3IgPSAoaXNQdWJsaWNSZXBvOiBib29sZWFuKTogc3RyaW5nID0+XG4gICAgZ2V0Rm5veEFnZVJlY2lwaWVudHMoeyAuLi5yb290Q29uZmlnLCBpc1B1YmxpY1JlcG8sIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHJ1ZSB9KVxuICAgICAgLm1hcCgoeyBwdWJsaWNLZXkgfSkgPT4gcHVibGljS2V5KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gcHVibGljS2V5c0Zvcih0cnVlKSAhPT0gcHVibGljS2V5c0ZvcihmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnOiBGbm94UmVwb3NpdG9yeUlkZW50aXR5KTogRm5veEFnZVJlY2lwaWVudFtdIHtcbiAgcmV0dXJuIEZOT1hfQUdFX1BSSU5DSVBBTFMuZmlsdGVyKChwcmluY2lwYWwpID0+XG4gICAgbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUocHJpbmNpcGFsLnJlcG9zaXRvcnlTY29wZSwgcm9vdENvbmZpZylcbiAgKS5mbGF0TWFwKChwcmluY2lwYWwpID0+XG4gICAgcHJpbmNpcGFsLnB1YmxpY0tleXMubWFwKChwdWJsaWNLZXksIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogcHJpbmNpcGFsLnB1YmxpY0tleXMubGVuZ3RoID09PSAxID8gcHJpbmNpcGFsLm5hbWUgOiBgJHtwcmluY2lwYWwubmFtZX0ke2luZGV4ICsgMX1gLFxuICAgICAgcHVibGljS2V5LFxuICAgIH0pKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUoc2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGUsIHJlcG9zaXRvcnk6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBib29sZWFuIHtcbiAgY29uc3Qgb3duZXIgPSByZXBvc2l0b3J5LnJlcG9BdXRob3I/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG5hbWUgPSByZXBvc2l0b3J5LnJlcG9OYW1lPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIW93bmVyIHx8ICFuYW1lKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQW4gdW5rbm93biB2aXNpYmlsaXR5IChmYWlsZWQgR2l0SHViIGxvb2t1cCkgbWF0Y2hlcyBubyB2aXNpYmlsaXR5LWNvbnN0cmFpbmVkIHNjb3BlOiBjYWxsZXJzXG4gIC8vIHRoYXQgd291bGQgcmV3cml0ZSByZWNpcGllbnRzIGZhaWwgaW5zdGVhZCBvZiBlbmNyeXB0aW5nIHRvIHRoZSB3cm9uZyBDSSBpZGVudGl0eS5cbiAgaWYgKFxuICAgIHNjb3BlLnZpc2liaWxpdHkgJiZcbiAgICAoIXJlcG9zaXRvcnkuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IChzY29wZS52aXNpYmlsaXR5ID09PSAncHVibGljJykgIT09IHJlcG9zaXRvcnkuaXNQdWJsaWNSZXBvKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIChzY29wZS5vcmdhbml6YXRpb25zPy5zb21lKChvcmdhbml6YXRpb24pID0+IG9yZ2FuaXphdGlvbi50b0xvd2VyQ2FzZSgpID09PSBvd25lcikgPz8gZmFsc2UpIHx8XG4gICAgKHNjb3BlLnJlcG9zaXRvcmllcz8uc29tZSgoZnVsbE5hbWUpID0+IGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGAke293bmVyfS8ke25hbWV9YCkgPz8gZmFsc2UpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VBZ2VSZWNpcGllbnRzKGNvbnRlbnQ6IHN0cmluZywgYWdlUmVjaXBpZW50czogcmVhZG9ubHkgRm5veEFnZVJlY2lwaWVudFtdKTogc3RyaW5nIHtcbiAgLy8gVHJhaWxpbmcgbmFtZSBjb21tZW50cyBsZXQgaHVtYW5zIHRlbGwgd2hvc2Uga2V5IGVhY2ggcmVjaXBpZW50IGlzIHdpdGhvdXQgY29uc3VsdGluZyB3YmZ5LlxuICBjb25zdCByZWNpcGllbnRzVGV4dCA9IGByZWNpcGllbnRzID0gW1xcbiR7YWdlUmVjaXBpZW50c1xuICAgIC5tYXAoKHJlY2lwaWVudCkgPT4gYCAgXCIke3JlY2lwaWVudC5wdWJsaWNLZXl9XCIsICMgJHtyZWNpcGllbnQubmFtZX1gKVxuICAgIC5qb2luKCdcXG4nKX1cXG5dYDtcbiAgLy8gd2JmeSB3cml0ZXMgYSBbcHJvdmlkZXJzLmFnZV0gdGFibGUgKHBvc3NpYmx5IHdpdGggYSB0cmFpbGluZyBjb21tZW50KS4gU2NhbiBsaW5lLXdpc2Ugc28gdGhhdFxuICAvLyBhIGBbYCBpbnNpZGUgYSBjb21tZW50IG9yIGEgc3RyaW5nIG5ldmVyIHRlcm1pbmF0ZXMgdGhlIHRhYmxlIGVhcmx5OyB0aGUgdGFibGUgZW5kcyBhdCB0aGVcbiAgLy8gbmV4dCBsaW5lLXN0YXJ0IHRhYmxlIGhlYWRlci4gVGhlIGFzc2lnbm1lbnQgbWF0Y2ggaXMgbGluZS1hbmNob3JlZCBzbyBhIGNvbW1lbnRlZC1vdXRcbiAgLy8gYCMgcmVjaXBpZW50cyA9IFsuLi5dYCBpcyBuZXZlciBtaXN0YWtlbiBmb3IgdGhlIHJlYWwgb25lLCB3aGlsZSBtdWx0aWxpbmUgYXJyYXlzIHN0aWxsIG1hdGNoXG4gIC8vIGJlY2F1c2UgdGhlIG5lZ2F0ZWQgY2xhc3MgW15cXF1dICh1bmxpa2UgYC5gKSBzcGFucyBuZXdsaW5lcy4gQW55IG90aGVyIHNwZWxsaW5nIGZhbGxzIHRocm91Z2hcbiAgLy8gdG8gdGhlIGNhbGxlcidzIHJlLXBhcnNlIHZhbGlkYXRpb24sIHdoaWNoIGZhaWxzIHRoZSBydW4gc2FmZWx5IHdpdGggaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2ZcbiAgLy8gY29ycnVwdGluZyB0aGUgZmlsZS5cbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgaGVhZGVySW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+IC9eXFxzKlxcW3Byb3ZpZGVyc1xcLmFnZVxcXVxccyooPzojLiopPyQvdS50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ICE9PSAtMSkge1xuICAgIGxldCBlbmRJbmRleCA9IGxpbmVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpbmRleCA9IGhlYWRlckluZGV4ICsgMTsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmICgvXlxccypcXFsvdS50ZXN0KGxpbmVzW2luZGV4XSA/PyAnJykpIHtcbiAgICAgICAgZW5kSW5kZXggPSBpbmRleDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlY3Rpb24gPSBsaW5lcy5zbGljZShoZWFkZXJJbmRleCwgZW5kSW5kZXgpLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IHJlcGxhY2VkU2VjdGlvbiA9IHNlY3Rpb24ucmVwbGFjZSgvXlxccypyZWNpcGllbnRzXFxzKj1cXHMqXFxbW15cXF1dKlxcXS9tdSwgcmVjaXBpZW50c1RleHQpO1xuICAgIGNvbnN0IG5ld1NlY3Rpb24gPVxuICAgICAgcmVwbGFjZWRTZWN0aW9uID09PSBzZWN0aW9uXG4gICAgICAgID8gW2xpbmVzW2hlYWRlckluZGV4XSwgcmVjaXBpZW50c1RleHQsIC4uLmxpbmVzLnNsaWNlKGhlYWRlckluZGV4ICsgMSwgZW5kSW5kZXgpXS5qb2luKCdcXG4nKVxuICAgICAgICA6IHJlcGxhY2VkU2VjdGlvbjtcbiAgICByZXR1cm4gWy4uLmxpbmVzLnNsaWNlKDAsIGhlYWRlckluZGV4KSwgbmV3U2VjdGlvbiwgLi4ubGluZXMuc2xpY2UoZW5kSW5kZXgpXS5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gYCR7Y29udGVudC50cmltRW5kKCl9XFxuXFxuW3Byb3ZpZGVycy5hZ2VdXFxudHlwZSA9IFwiYWdlXCJcXG4ke3JlY2lwaWVudHNUZXh0fVxcbmA7XG59XG5cbi8vIFJlLWVuY3J5cHRzIHRoZSBiYXNlIHNlY3JldHMgYW5kIGVhY2ggcHJvZmlsZSdzIG93biBzZWNyZXRzICgtLW5vLWRlZmF1bHRzIGtlZXBzIHRoZSBtZXJnZWRcbi8vIGJhc2Ugc2VjcmV0cyBmcm9tIGJlaW5nIGR1cGxpY2F0ZWQgaW50byBwcm9maWxlIHRhYmxlcykgZm9yIHRoZSBjdXJyZW50IHJlY2lwaWVudCBzZXQuIFRoZVxuLy8gc3Bhd25lZCBmbm94IHJ1bnMgd2l0aCBhbiBpc29sYXRlZCBIT01FL1hER19DT05GSUdfSE9NRSBiZWNhdXNlIGZub3ggbWVyZ2VzIHRoZSB1c2VyLWdsb2JhbFxuLy8gfi8uY29uZmlnL2Zub3gvY29uZmlnLnRvbWwgaW50byBldmVyeSBwcm9qZWN0IGNvbmZpZyDigJQgYSBwbGFpbiByZWVuY3J5cHQgd291bGQgcmV3cml0ZSB0aGVcbi8vIHVzZXIncyBnbG9iYWwgc2VjcmV0cyB0b28uIERlY3J5cHRpb24gdGhlcmVmb3JlIG5lZWRzIHRoZSBwZXJzb25hbCBpZGVudGl0eSBwYXNzZWQgZXhwbGljaXRseVxuLy8gdmlhIEZOT1hfQUdFX0tFWTsgRk5PWF9QUk9GSUxFIGlzIHN0cmlwcGVkIHNvIGl0IGNhbm5vdCByZWRpcmVjdCB0aGUgYmFzZSAobm8gLVApIHJ1bi5cbmZ1bmN0aW9uIHJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZywgcHJvZmlsZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBUaGUgaWRlbnRpdHkgaXMgb3B0aW9uYWw6IGEgcGxhaW50ZXh0LW9ubHkgY29uZmlnIGhhcyBub3RoaW5nIHRvIGRlY3J5cHQgYW5kIGZub3ggc3VjY2VlZHNcbiAgLy8gd2l0aG91dCBvbmUsIHdoaWxlIGV4aXN0aW5nIGNpcGhlcnRleHRzIG1ha2UgZm5veCBmYWlsIGxvdWRseSBvbiBpdHMgb3duLlxuICBjb25zdCBpZGVudGl0eSA9IHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpID8/IHByb2Nlc3MuZW52LkZOT1hfQUdFX0tFWTtcbiAgY29uc3QgZm5veENvbW1hbmQgPSByZXNvbHZlRm5veENvbW1hbmQoZGlyUGF0aCk7XG4gIGNvbnN0IGlzb2xhdGVkSG9tZURpclBhdGggPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICd3YmZ5LWZub3gtaG9tZS0nKSk7XG4gIHRyeSB7XG4gICAgLy8gSGlkZSB0aGUgbG9jYWwgb3ZlcnJpZGVzIG9mIEVWRVJZIGRpcmVjdG9yeSBmbm94IG1lcmdlcyBoaWVyYXJjaGljYWxseSAoZnJvbSB0aGUgY29tbWFuZFxuICAgIC8vIGRpcmVjdG9yeSB1cCB0byB0aGUgcmVwb3NpdG9yeSByb290KTogYW4gYW5jZXN0b3IncyBmbm94LmxvY2FsLnRvbWwgd291bGQgb3RoZXJ3aXNlIHNoYWRvd1xuICAgIC8vIGNvbW1pdHRlZCBzZWNyZXRzIG9yIGl0c2VsZiBnZXQgcmV3cml0dGVuIGJ5IHRoZSByZS1lbmNyeXB0aW9uLlxuICAgIHJldHVybiB3aXRoRm5veExvY2Fsc0hpZGRlbihyb290RGlyUGF0aCwgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbnYgPSB7XG4gICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikuZmlsdGVyKChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKCdGTk9YXycpKSksXG4gICAgICAgIC4uLihpZGVudGl0eSA/IHsgRk5PWF9BR0VfS0VZOiBpZGVudGl0eSB9IDoge30pLFxuICAgICAgICBIT01FOiBpc29sYXRlZEhvbWVEaXJQYXRoLFxuICAgICAgICBYREdfQ09ORklHX0hPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICB9O1xuICAgICAgY29uc3QgcHJvZmlsZUFyZ3NMaXN0ID0gW1tdLCAuLi5wcm9maWxlTmFtZXMubWFwKChuYW1lKSA9PiBbJy0tbm8tZGVmYXVsdHMnLCBgLS1wcm9maWxlPSR7bmFtZX1gXSldO1xuICAgICAgZm9yIChjb25zdCBwcm9maWxlQXJncyBvZiBwcm9maWxlQXJnc0xpc3QpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IFsncmVlbmNyeXB0JywgJy0tZm9yY2UnLCAnLS1uby1kYWVtb24nLCAnLS1wcm92aWRlcicsICdhZ2UnLCAuLi5wcm9maWxlQXJnc107XG4gICAgICAgIGNvbnNvbGUubG9nKGAkICR7Zm5veENvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9IGF0ICR7ZGlyUGF0aH1gKTtcbiAgICAgICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGZub3hDb21tYW5kLCBhcmdzLCB7XG4gICAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgICAgICBlbnYsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKHByb2Muc3RhdHVzID8/IDEpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmMoaXNvbGF0ZWRIb21lRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGFjdHVhbCBmbm94IGJpbmFyeS4gYGZub3hgIG9uIFBBVEggaXMgb2Z0ZW4gYSBtaXNlIHNoaW0sIGFuZCBtaXNlIHJlZnVzZXMgdG8gcnVuXG4gKiBvbmNlIEhPTUUvWERHX0NPTkZJR19IT01FIHBvaW50IGF0IHRoZSBpc29sYXRlZCBkaXJlY3RvcnkgKGl0cyB0cnVzdCBzdGF0ZSBkaXNhcHBlYXJzKSwgc28gdGhlXG4gKiBpc29sYXRlZCBzcGF3bnMgbmVlZCB0aGUgc2hpbSByZXNvbHZlZCB0byB0aGUgcmVhbCBleGVjdXRhYmxlIGJlZm9yZWhhbmQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ21pc2UnLCBbJ3doaWNoJywgJ2Zub3gnXSwgeyBjd2Q6IGRpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfSk7XG4gIGNvbnN0IHJlc29sdmVkID0gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgOiAnJztcbiAgcmV0dXJuIHJlc29sdmVkIHx8ICdmbm94Jztcbn1cblxuLy8gVGhlIHBlcnNvbmFsIGlkZW50aXR5IGZpbGUgaXMgbWFjaGluZS1nbG9iYWwsIHNvIGl0IGlzIHJlYWQgb25jZSBwZXIgcHJvY2Vzcy5cbmxldCBoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSBmYWxzZTtcbmxldCBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiByZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSkgcmV0dXJuIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5O1xuICBoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jb25maWcnLCAnZm5veCcsICdhZ2UudHh0JyksICd1dGY4Jyk7XG4gICAgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSBjb250ZW50XG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmluZCgobGluZSkgPT4gbGluZS50cmltKCkuc3RhcnRzV2l0aCgnQUdFLVNFQ1JFVC1LRVktJykpXG4gICAgICA/LnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5O1xufVxuXG4vKipcbiAqIFJ1bnMgYSBmdW5jdGlvbiB3aGlsZSB0aGUgbWFjaGluZS1sb2NhbCBmbm94LmxvY2FsLnRvbWwgZmlsZXMgb2YgdGhlIGdpdmVuIGRpcmVjdG9yaWVzIGFyZVxuICogdGVtcG9yYXJpbHkgbW92ZWQgYXNpZGU6IGZub3ggbG9hZHMgdGhlbSBhdCBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgY29tbWl0dGVkIGZub3gudG9tbCwgc28gYVxuICogbG9jYWwgb3ZlcnJpZGUgc2hhZG93aW5nIGEgY29tbWl0dGVkIHNlY3JldCB3b3VsZCBtYWtlIGBmbm94IHJlZW5jcnlwdGAgc2tpcCB0aGF0IHNlY3JldC5cbiAqL1xuZnVuY3Rpb24gd2l0aEZub3hMb2NhbHNIaWRkZW48VD4ocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aHM6IHN0cmluZ1tdLCBmdW5jOiAoKSA9PiBUKTogVCB7XG4gIGNvbnN0IGhpZGRlbkRpclBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGJhY2t1cFBhdGggPSBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgICAgICAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICAgIGZzLnJlbmFtZVN5bmMobG9jYWxQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgaGlkZGVuRGlyUGF0aHMucHVzaChkaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZnVuYygpO1xuICAgIC8vIEEgcmVzdG9yYXRpb24gY29uZmxpY3QgdGhyb3dzIGhlcmUgYW5kIHRoZXJlYnkgaW52YWxpZGF0ZXMgdGhlIHNlZW1pbmdseSBzdWNjZXNzZnVsIHJlc3VsdDpcbiAgICAvLyBhIHJlY3JlYXRlZCBvdmVycmlkZSBtYXkgaGF2ZSBzaGFkb3dlZCBjb21taXR0ZWQgc2VjcmV0cyBkdXJpbmcgdGhlIGZub3ggcnVuLCBzbyB0aGUgb3V0ZXJcbiAgICAvLyB0cmFuc2FjdGlvbiBtdXN0IHJlc3RvcmUgZXZlcnkgY29tbWl0dGVkIGZub3gudG9tbCBpbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIG1pZ3JhdGlvbi5cbiAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gVGhlIG9yaWdpbmFsIGZhaWx1cmUgbXVzdCB3aW47IGEgcmVzdG9yYXRpb24gY29uZmxpY3Qgb24gdGhpcyBwYXRoIGlzIG9ubHkgcmVwb3J0ZWQgc28gaXRcbiAgICAvLyBjYW5ub3QgbWFzayB0aGUgcm9vdCBjYXVzZS5cbiAgICB0cnkge1xuICAgICAgcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGgsIGhpZGRlbkRpclBhdGhzKTtcbiAgICB9IGNhdGNoIChyZXN0b3JlRXJyb3IpIHtcbiAgICAgIGZhaWxGbm94U3luYygocmVzdG9yZUVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBTdHJpbmcocmVzdG9yZUVycm9yKSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIE1vdmVzIHRoZSBoaWRkZW4gZm5veC5sb2NhbC50b21sIGZpbGVzIGJhY2ssIGNsZWFyaW5nIHRoZSBnaXZlbiBsaXN0IHNvIGEgc2Vjb25kIGNhbGwgaXMgYVxuLy8gbm8tb3AuIE5ldmVyIGNsb2JiZXJzIGEgZm5veC5sb2NhbC50b21sIHJlY3JlYXRlZCAoZS5nLiBieSBhbiBlZGl0b3IpIHdoaWxlIGZub3ggd2FzIHJ1bm5pbmc6XG4vLyB0aGUgYmFja3VwIGlzIGtlcHQgYW5kIHJlcG9ydGVkIGZvciBhIG1hbnVhbCBtZXJnZS5cbmZ1bmN0aW9uIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoOiBzdHJpbmcsIGhpZGRlbkRpclBhdGhzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBjb25zdCBjb25mbGljdGluZ0xvY2FsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBoaWRkZW5EaXJQYXRocy5zcGxpY2UoMCkpIHtcbiAgICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgIGNvbmZsaWN0aW5nTG9jYWxQYXRocy5wdXNoKGxvY2FsUGF0aCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucmVuYW1lU3luYyhmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKSwgbG9jYWxQYXRoKTtcbiAgfVxuICBpZiAoY29uZmxpY3RpbmdMb2NhbFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIGZvbGxvd2luZyBmbm94LmxvY2FsLnRvbWwgZmlsZXMgd2VyZSByZWNyZWF0ZWQgd2hpbGUgZm5veCB3YXMgcnVubmluZyAob3JpZ2luYWwgZmlsZXMgYXJlIHByZXNlcnZlZCB1bmRlciAke3BhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJy50bXAnLCAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcpfSDigJQgbWVyZ2UgdGhlbSBtYW51YWxseSk6ICR7Y29uZmxpY3RpbmdMb2NhbFBhdGhzLmpvaW4oJywgJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXN0b3JlcyBhIGZub3gubG9jYWwudG9tbCBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBzbyB0aGUgdXNlcidzIGxvY2FsXG4gKiBvdmVycmlkZXMgYXJlIG5ldmVyIHNpbGVudGx5IGxvc3QuXG4gKi9cbmZ1bmN0aW9uIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYmFja3VwUGF0aCkpIHJldHVybjtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQm90aCAke2xvY2FsUGF0aH0gYW5kIGl0cyBiYWNrdXAgJHtiYWNrdXBQYXRofSBleGlzdDsgcmVzb2x2ZSB0aGUgbGVmdG92ZXIgYmFja3VwIG1hbnVhbGx5LmApO1xuICB9XG4gIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGgsIGJhY2t1cFBhdGgpO1xuICBmcy5yZW5hbWVTeW5jKGJhY2t1cFBhdGgsIGxvY2FsUGF0aCk7XG59XG5cbi8vIENyZWF0ZXMgdGhlIGJhY2t1cCBkaXJlY3RvcnkgYW5kIHByb3ZlcyBubyBwYXRoIGNvbXBvbmVudCBiZWxvdyB0aGUgcmVwb3NpdG9yeSByb290IGlzIGFcbi8vIHN5bWxpbms6IGEgcmVwb3NpdG9yeS1jb250cm9sbGVkIHN5bWxpbmsgKGUuZy4gYSB0cmFja2VkIC50bXAvd2JmeS1mbm94LWxvY2FsLWJhY2t1cCBsaW5rKVxuLy8gY291bGQgb3RoZXJ3aXNlIG1vdmUgdGhlIHBsYWludGV4dCBsb2NhbCBzZWNyZXRzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIG9yIHJlc29sdmUgdGhlIGJhY2t1cFxuLy8gYmFjayBvbnRvIHRoZSBzb3VyY2UgZmlsZSBhbmQgdHVybiB0aGUgaGlkZSByZW5hbWUgaW50byBhIG5vLW9wLlxuZnVuY3Rpb24gZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aDogc3RyaW5nLCBiYWNrdXBQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguZGlybmFtZShiYWNrdXBQYXRoKTtcbiAgZnMubWtkaXJTeW5jKGJhY2t1cERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBleHBlY3RlZFJlYWxQYXRoID0gcGF0aC5qb2luKGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCksIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGJhY2t1cERpclBhdGgpKTtcbiAgaWYgKGZzLnJlYWxwYXRoU3luYyhiYWNrdXBEaXJQYXRoKSAhPT0gZXhwZWN0ZWRSZWFsUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtiYWNrdXBEaXJQYXRofSByZXNvbHZlcyB0aHJvdWdoIGEgc3ltbGluazsgcmVtb3ZlIHRoZSBzeW1saW5rZWQgY29tcG9uZW50LmApO1xuICB9XG59XG5cbi8vIFRoZSBiYWNrdXAgbGl2ZXMgdW5kZXIgdGhlIGdpdGlnbm9yZWQgLnRtcCBzbyBhIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgY2FuIG5ldmVyIGJlY29tZVxuLy8gc3RhZ2VhYmxlIChhIHNpYmxpbmcgcmVuYW1lIGxpa2UgZm5veC5sb2NhbC50b21sLndiZnktYmFrIHdvdWxkIG5vIGxvbmdlciBtYXRjaCB0aGUgZG9jdW1lbnRlZFxuLy8gYGZub3gubG9jYWwudG9tbGAgaWdub3JlIGVudHJ5IGFuZCBjb3VsZCBiZSBjb21taXR0ZWQgYnkgYGdpdCBhZGQgLUFgKS5cbmZ1bmN0aW9uIGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShcbiAgICByb290RGlyUGF0aCxcbiAgICAnLnRtcCcsXG4gICAgJ3diZnktZm5veC1sb2NhbC1iYWNrdXAnLFxuICAgIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGRpclBhdGgpLFxuICAgICdmbm94LmxvY2FsLnRvbWwnXG4gICk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlclBhdGggfHwgbWlncmF0aW9uTWFya2VyT3duZWQpIHJldHVybjtcbiAgY29uc3QgdG1wRGlyUGF0aCA9IHBhdGguZGlybmFtZShtaWdyYXRpb25NYXJrZXJQYXRoKTtcbiAgZnMubWtkaXJTeW5jKHRtcERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAvLyBSZWZ1c2UgdG8gd3JpdGUgdGhyb3VnaCBzeW1saW5rczogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgLnRtcCBzeW1saW5rIGNvdWxkIG90aGVyd2lzZVxuICAvLyByZWRpcmVjdCB0aGUgbWFya2VyIHdyaXRlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFRoZSBgd3hgIGZsYWcgbWFrZXMgdGhlIG9wZW4gaXRzZWxmIGZhaWxcbiAgLy8gb24gYW55IHByZS1leGlzdGluZyBwYXRoLCBpbmNsdWRpbmcgYSBkYW5nbGluZyBzeW1saW5rIOKAlCB3aGljaCBhbHNvIGFjcXVpcmVzIHRoZSBtYXJrZXJcbiAgLy8gYXRvbWljYWxseSwgc28gYSBjb25jdXJyZW50IHdiZnkgcnVuIGNhbm5vdCBzdGFydCBhIHNlY29uZCBtaWdyYXRpb24uXG4gIGlmIChmcy5sc3RhdFN5bmModG1wRGlyUGF0aCkuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0bXBEaXJQYXRofSBpcyBhIHN5bWxpbms7IHJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgZGlyZWN0b3J5LmApO1xuICB9XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGgsXG4gICAgICAnd2JmeSBmbm94IG1pZ3JhdGlvbiBpbiBwcm9ncmVzczsgYSBsZWZ0b3ZlciBtYXJrZXIgYmxvY2tzIG5ldyBtaWdyYXRpb25zXFxuJyxcbiAgICAgIHtcbiAgICAgICAgZmxhZzogJ3d4JyxcbiAgICAgIH1cbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQW5vdGhlciB3YmZ5IHByb2Nlc3MgYXBwZWFycyB0byBiZSBtaWdyYXRpbmcgKCR7bWlncmF0aW9uTWFya2VyUGF0aH0gZXhpc3RzKTogJHtlcnJvcn1gKTtcbiAgfVxuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IHRydWU7XG59XG5cbi8vIE9ubHkgdGhlIHJ1biB0aGF0IGFjcXVpcmVkIHRoZSBtYXJrZXIgbWF5IHJlbW92ZSBpdDogZGVsZXRpbmcgYSBmb3JlaWduIG1hcmtlciB3b3VsZCBkaXNhYmxlXG4vLyBpbnRlcnJ1cHRlZC1taWdyYXRpb24gZGV0ZWN0aW9uIGZvciBhIGNvbmN1cnJlbnRseSBydW5uaW5nIHdiZnkuXG5mdW5jdGlvbiByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpOiB2b2lkIHtcbiAgaWYgKCFtaWdyYXRpb25NYXJrZXJPd25lZCB8fCAhbWlncmF0aW9uTWFya2VyUGF0aCkgcmV0dXJuO1xuICBmcy5ybVN5bmMobWlncmF0aW9uTWFya2VyUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBib29sZWFuIHtcbiAgbGV0IHN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBzbmFwc2hvdHMpIHtcbiAgICB0cnkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgY29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHJlc3RvcmUgJHtmaWxlUGF0aH0gYWZ0ZXIgYSBmYWlsZWQgbWlncmF0aW9uOiAke2Vycm9yfWApO1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIGZhaWxGbm94U3luYyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIGZub3hTeW5jRmFpbGVkID0gdHJ1ZTtcbn1cblxuLy8gUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIGFuIHVuc3VwcG9ydGVkIGZub3gubG9jYWwudG9tbCBpbiB0aGUgZGlyZWN0b3J5LCBvciB1bmRlZmluZWQuIExvY2FsXG4vLyBvdmVycmlkZXMgbWF5IG9ubHkgaG9sZCBtYWNoaW5lLWxvY2FsIHNlY3JldCB2YWx1ZXM7IGltcG9ydHMgb3IgcHJvdmlkZXIgKHJlKWRlZmluaXRpb25zIHdvdWxkXG4vLyBzaWxlbnRseSBjaGFuZ2Ugd2hpY2ggcmVjaXBpZW50IHNldCBnb3Zlcm5zIHJlLWVuY3J5cHRpb24uXG5mdW5jdGlvbiBmaW5kRm5veExvY2FsVG9tbElzc3VlKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2FsVG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxUb21sUGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxvY2FsU2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxUb21sUGF0aCwgJ3V0ZjgnKSkgYXMgRm5veFRvbWw7XG4gIGNvbnN0IGRlZmluZXNQcm92aWRlcnMgPVxuICAgIGxvY2FsU2V0dGluZ3MuaW1wb3J0ICE9PSB1bmRlZmluZWQgfHxcbiAgICBsb2NhbFNldHRpbmdzLnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhsb2NhbFNldHRpbmdzLnByb2ZpbGVzID8/IHt9KS5zb21lKChwcm9maWxlKSA9PiBwcm9maWxlPy5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiBkZWZpbmVzUHJvdmlkZXJzID8gYCR7bG9jYWxUb21sUGF0aH0gZGVmaW5lcyBpbXBvcnRzLCBwcm92aWRlcnMsIG9yIHByb2ZpbGUgcHJvdmlkZXJzYCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMaXN0cyBldmVyeSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGNvbW1pdHRlZCAob3IgY29tbWl0dGFibGUpIGZub3gudG9tbCBhbW9uZyB0aGUgZ2l2ZW5cbiAqIGdpdC1kaXNjb3ZlcmVkIGNvbmZpZyBwYXRocyAoc2VlIGxpc3RGbm94TGlrZUZpbGVQYXRoczogZ2l0LWJhc2VkIGRpc2NvdmVyeSBleGNsdWRlcyBnaXRpZ25vcmVkXG4gKiB0cmVlcyBzdWNoIGFzIG5vZGVfbW9kdWxlcyB3aXRob3V0IGV4Y2x1ZGluZyBsZWdpdGltYXRlIHBhY2thZ2VzIG5hbWVkIGxpa2UgYnVpbGQgb3V0cHV0cykuXG4gKi9cbmZ1bmN0aW9uIGxpc3RGbm94VG9tbERpclBhdGhzKGZub3hMaWtlRmlsZVBhdGhzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZm5veExpa2VGaWxlUGF0aHNcbiAgICAgICAgLmZpbHRlcigoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpID09PSAnZm5veC50b21sJylcbiAgICAgICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmbm94IGNvbmZpZyBkZWNsYXJlcyBpdHMgb3duIGBbcHJvdmlkZXJzLmFnZV1gLCBpLmUuIHBhcnRpY2lwYXRlcyBpbiBhZ2UgZW5jcnlwdGlvbi5cbiAqIEEgY29uZmlnIHdpdGhvdXQgb25lIGVpdGhlciBpbmhlcml0cyBhIG1hbmFnZWQgcm9vdCdzIHByb3ZpZGVyIChoYW5kbGVkIGJ5IHRoZSByb290LWV4aXN0cyBwYXRoKVxuICogb3IsIHdoZW4gbm8gcm9vdCBleGlzdHMsIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIOKAlCBzbyBpdCBuZWVkcyBubyByZWNpcGllbnQgc3luY2hyb25pemF0aW9uXG4gKiBhbmQgb3ducyBubyBGTk9YX0FHRV9LRVkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5yZWFkYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gQm9vbGVhbigoQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgRm5veFRvbWwpLnByb3ZpZGVycz8uYWdlKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGFuIHVucGFyc2FibGUgY29uZmlnIG1pZ2h0IGRlY2xhcmUgYW4gYWdlIHByb3ZpZGVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIHBhdGggbGllcyBpbnNpZGUgYSB0ZXN0LWZpeHR1cmUgdHJlZSAodGVzdC9maXh0dXJlcywgdGVzdC1maXh0dXJlcyxcbiAqIF9fdGVzdHNfXyk6IGZpeHR1cmUgY29uZmlncyBhcmUgdGVzdCBJTlBVVFMsIG5vdCByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24uIGZub3ggbmV2ZXIgbG9hZHNcbiAqIHRoZW0gZm9yIHJlYWwgY29tbWFuZHMgKGhpZXJhcmNoaWNhbCBsb2FkaW5nIG9ubHkgd2Fsa3MgY3dkIGFuY2VzdG9ycyksIHJlY2lwaWVudFxuICogc3luY2hyb25pemF0aW9uIG11c3Qgbm90IHJld3JpdGUgb3IgcmUtZW5jcnlwdCB0aGVtIChzaGFyZWQtbGliLW5vZGUncyB1bmRlY3J5cHRhYmxlIGZpeHR1cmVcbiAqIGV4aXN0cyBwcmVjaXNlbHkgdG8gc3RheSB1bmRlY3J5cHRhYmxlKSwgYW5kIGEgZml4dHVyZSBtdXN0IG5vdCBmYWlsIHRoZSBzdHJheS1uZXN0ZWQtY29uZmlnXG4gKiBjaGVjayBpbiByZXBvc2l0b3JpZXMgd2l0aG91dCBhIHJvb3QgZm5veC50b21sLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXN0Rml4dHVyZUZub3hQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gYGZpeHR1cmVzYCBjb3VudHMgb25seSBkaXJlY3RseSB1bmRlciBhIHRlc3QgZGlyZWN0b3J5OiB3YmZ5IHN1cHBvcnRzIGFyYml0cmFyeSB3b3Jrc3BhY2VzLFxuICAvLyBzbyBhIGxlZ2l0aW1hdGUgYHBhY2thZ2VzL2ZpeHR1cmVzL2Agd29ya3NwYWNlIG11c3Qgc3RheSBtYW5hZ2VkIGFuZCB2ZXJpZmllZC5cbiAgY29uc3Qgc2VnbWVudHMgPSBmaWxlUGF0aC5zcGxpdCgnLycpO1xuICByZXR1cm4gc2VnbWVudHMuc29tZShcbiAgICAoc2VnbWVudCwgaW5kZXgpID0+XG4gICAgICBzZWdtZW50ID09PSAndGVzdC1maXh0dXJlcycgfHxcbiAgICAgIHNlZ21lbnQgPT09ICdfX3Rlc3RzX18nIHx8XG4gICAgICAoc2VnbWVudCA9PT0gJ2ZpeHR1cmVzJyAmJiAoc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3QnIHx8IHNlZ21lbnRzW2luZGV4IC0gMV0gPT09ICd0ZXN0cycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gLXogcHJpbnRzIE5VTC1kZWxpbWl0ZWQgdmVyYmF0aW0gcGF0aHM7IHdpdGhvdXQgaXQsIGNvcmUucXVvdGVQYXRoIEMtcXVvdGVzIG5vbi1BU0NJSSBwYXRoc1xuICAvLyAoZS5nLiBcIlxcMzQ2XFwyMjdcXDI0NS4uLlwiKSwgd2hpY2ggd291bGQgbWFrZSB0aGUgYmFzZW5hbWUgZmlsdGVyIHNpbGVudGx5IHNraXAgdGhvc2UgY29uZmlncy5cbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKFxuICAgICdnaXQnLFxuICAgIFsnbHMtZmlsZXMnLCAnLXonLCAnLS1jYWNoZWQnLCAnLS1vdGhlcnMnLCAnLS1leGNsdWRlLXN0YW5kYXJkJywgJy0tJywgJypmbm94Ki50b21sJ10sXG4gICAgeyBjd2Q6IHJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgLy8gRmFpbCBjbG9zZWQ6IHRyZWF0aW5nIGEgZ2l0IGZhaWx1cmUgYXMgXCJubyBmbm94IGNvbmZpZ3NcIiB3b3VsZCBza2lwIHN5bmNocm9uaXphdGlvbiBhbmQgbGV0XG4gIC8vIHNldHVwU2VjcmV0cyB1cGxvYWQgYSBrZXkgdGhhdCB3YXMgbmV2ZXIgdmVyaWZpZWQgYWdhaW5zdCB0aGUgcmVwb3NpdG9yeSdzIGNpcGhlcnRleHRzLlxuICBpZiAocHJvYy5zdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGdpdCBscy1maWxlcyBmYWlsZWQgaW4gJHtyb290RGlyUGF0aH06ICR7KHByb2Muc3RkZXJyIHx8IHByb2MuZXJyb3I/Lm1lc3NhZ2UgfHwgJycpLnRyaW0oKX1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXRcbiAgICAuc3BsaXQoJ1xcMCcpXG4gICAgLmZpbHRlcigobGluZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KHBhdGguYmFzZW5hbWUobGluZSkpICYmICFpc1Rlc3RGaXh0dXJlRm5veFBhdGgobGluZSkpXG4gICAgLm1hcCgobGluZSkgPT4gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCBsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMoZGlyUGF0aClcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IC9eXFwuP2Zub3goXFwuLispP1xcLnRvbWwkL3UudGVzdChuYW1lKSlcbiAgICAgIC50b1NvcnRlZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpPy5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIC8vIEZhaWwgY2xvc2VkOiBmbm94IGNhbiBzdGlsbCBsb2FkIGEgY29uZmlnIGZyb20gYSBkaXJlY3RvcnkgdGhpcyBwcm9jZXNzIGNhbm5vdCBlbnVtZXJhdGVcbiAgICAvLyAoZS5nLiBleGVjdXRlLW9ubHkgcGVybWlzc2lvbiksIHNvIGFuIGVudW1lcmF0aW9uIGZhaWx1cmUgbXVzdCBub3QgcmVhZCBhcyBcIm5vIGNvbmZpZ3NcIi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbnNwZWN0ICR7ZGlyUGF0aH0gZm9yIGZub3ggY29uZmlnczogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRpclBhdGhzID0gW2RpclBhdGhdO1xuICB3aGlsZSAoZGlyUGF0aHMuYXQoLTEpICE9PSByb290RGlyUGF0aCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZGlybmFtZShkaXJQYXRocy5hdCgtMSkgPz8gJycpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpclBhdGhzLmF0KC0xKSkgYnJlYWs7XG4gICAgZGlyUGF0aHMucHVzaChwYXJlbnQpO1xuICB9XG4gIHJldHVybiBkaXJQYXRocztcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHtcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFNlZWRlZEJhc2VsaW5lR2xvYixcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbiAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuLFxuICBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSxcbiAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG4vLyBUaGUgQnVuLWV4YWN0IHJlc29sdXRpb24gcHJpbWl0aXZlcyBsaXZlIGluIEB3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUgKHNyYy9idW5Xb3Jrc3BhY2VzLnRzKVxuLy8gc28gd2IncyByZWxlYXNlIGNvZGUgc2hhcmVzIHRoZW07IHJlLWV4cG9ydCB0aGUgb25lcyB3YmZ5IG1vZHVsZXMgYW5kIHRlc3RzIGNvbnN1bWUuXG5leHBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG4vKiogVGhlIHN1YnNldCBvZiBQYWNrYWdlQ29uZmlnIHRoYXQgd29ya3NwYWNlIGRpc2NvdmVyeSBuZWVkcywgc28gaXQgY2FuIHJ1biBiZWZvcmUgY29uZmlncyBleGlzdC4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZVJvb3RMaWtlID0gUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCcgfCAnZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMnIHwgJ3BhY2thZ2VKc29uJz47XG5cbi8qKlxuICogRXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGRpcmVjdG9yeSAoYWJzb2x1dGUsIGRlZHVwbGljYXRlZCkgb2YgdGhlIG1vbm9yZXBvIHJvb3QsIGNvdmVyaW5nXG4gKiBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qLiBVbmNhY2hlZCBiZWNhdXNlIGluZGV4LnRzIGNhbGxzIGl0IGJlZm9yZSB3YmZ5IG11dGF0ZXNcbiAqIHRoZSByb290IHBhY2thZ2UuanNvbiAoZ2V0V29ya3NwYWNlUGFja2FnZURpcnMgY2FjaGVzIHRoZSBwb3N0LW11dGF0aW9uIHN0YXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290TGlrZSkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShyb290TGlrZS5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICAgIClcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSwgaW5jbHVkaW5nIG1hbmlmZXN0c1xuICogd2l0aG91dCBhIGBuYW1lYCBmaWVsZCDigJQgd2JmeSBuYW1lcyB0aG9zZSBsYXRlciwgc28gZGVwZW5kZW5jeSBzY2FucyBtdXN0IG5vdCBza2lwIHRoZW0uXG4gKiBSZXNvbHV0aW9uIG1pbWljcyBCdW4ncyBzZXF1ZW50aWFsIHBhdHRlcm4gZXZhbHVhdGlvbjsgc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RDb25maWcpLCByb290Q29uZmlnLmRpclBhdGgpO1xufVxuXG5pbnRlcmZhY2UgV29ya3NwYWNlRGlyUGF0dGVybnMge1xuICAvKiogRGlyZWN0b3J5IHN1YnRyZWVzIChvciBwYWNrYWdlLW93bmVkIHN1YnBhdGhzKSBtYXRjaGVkIGJ5IGVmZmVjdGl2ZSBuZWdhdGlvbnMsIGZvciB0c2NvbmZpZyBgZXhjbHVkZWAgZW50cmllcy4gKi9cbiAgZXhjbHVkZXM6IHN0cmluZ1tdO1xuICAvKiogUG9zaXRpdmUgZGlyZWN0b3J5IHBhdHRlcm5zIChvciBjb25jcmV0ZSBkaXJlY3RvcmllcyBmb3IgQnVuLW9ubHkgZ2xvYiBzeW50YXgpLiAqL1xuICBpbmNsdWRlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogU29ydGVkIHdvcmtzcGFjZSBkaXJlY3RvcnkgcGF0dGVybnMgKHBvc2l4LCByZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCkgZm9yIGdlbmVyYXRvcnMgdGhhdFxuICogbmVlZCBwYXR0ZXJuLXNoYXBlZCBnbG9icyBjb3ZlcmluZyBldmVyeSB3b3Jrc3BhY2UgbGF5b3V0IOKAlCBlLmcuIHRoZSByb290IHRzY29uZmlnJ3MgYGFwcHMvKmBcbiAqIGluY2x1ZGUgZW50cmllcyDigJQgaW5zdGVhZCBvZiBjb25jcmV0ZSBkaXJlY3Rvcmllcywgd2hpY2ggd291bGQgY2h1cm4gZ2VuZXJhdGVkIGZpbGVzIHdoZW5ldmVyIGFcbiAqIHdvcmtzcGFjZSBwYWNrYWdlIGlzIGFkZGVkIG9yIHJlbW92ZWQuIEV2ZXJ5IHJldHVybmVkIHBhdHRlcm4gaXMgdmFsaWQgdHNjb25maWcgZ2xvYiBzeW50YXguXG4gKiBBIHBhdHRlcm4gY2FuIG1hdGNoIGEgc2libGluZyBkaXJlY3Rvcnkgd2l0aG91dCBhIHBhY2thZ2UuanNvbiAobm90IGEgd29ya3NwYWNlIHRvIEJ1bik7IHRoYXRcbiAqIGlzIGRlbGliZXJhdGUsIG1pcnJvcmluZyB0aGUgbG9uZy1zdGFuZGluZyBgcGFja2FnZXMvKmAgZW50cmllcycgYmVoYXZpb3IgaW4gZmF2b3Igb2Ygc3RhYmxlXG4gKiBnZW5lcmF0ZWQgb3V0cHV0LiBOZWdhdGlvbnMgZm9sbG93IEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKTogYSBuZWdhdGlvbiBzdGF5cyBwYXR0ZXJuLXNoYXBlZCB3aGlsZSBpdCBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMsIGJ1dCBpcyBjb25jcmV0aXplZCBwZXIgbWF0Y2hlZCBkaXJlY3Rvcnkgd2hlbiBhIG1hdGNoZWQgZGlyZWN0b3J5IGVuZHMgdXAgYVxuICogd29ya3NwYWNlIGFueXdheSAocmUtaW5jbHVkZWQgYnkgYSBsYXRlciBwb3NpdGl2ZSwgYSBwaW5uZWQgY29uY3JldGUgcG9zaXRpdmUsIG9yIGEgc2VlZGVkXG4gKiBiYXNlbGluZTsgIzEwMDUpIG9yIGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSwgd2hlcmUgQnVuIGV4Y2x1ZGVzIG9ubHkgdGhlXG4gKiBwYWNrYWdlIEFUIHRoYXQgZGlyZWN0b3J5LCBzbyBvbmx5IGl0cyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIGFyZSBleGNsdWRlZCAoIzEwMDQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogV29ya3NwYWNlRGlyUGF0dGVybnMge1xuICAvLyBVbmxpa2UgZGlzY292ZXJ5LCBnZW5lcmF0ZWQgb3V0cHV0IG11c3Qgbm90IGNvbnRhaW4gYSBuZXZlci1tYXRjaGluZyBgcGFja2FnZXMvKmAgZmFsbGJhY2s6XG4gIC8vIGFuIGFwcHMvKi1vbmx5IG1vbm9yZXBvIHdvdWxkIGdldCBkZWFkIGdsb2JzIGNvbW1pdHRlZCBpbnRvIGl0cyByb290IHRzY29uZmlnLiBNaXJyb3JcbiAgLy8gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zLCB3aGljaCBmb3JjZXMgYHBhY2thZ2VzLypgIG9ubHkgd2hlbiBhIG1hbmlmZXN0IGFjdHVhbGx5IG1hdGNoZXMuXG4gIGNvbnN0IGhhc1BhY2thZ2VzTGF5b3V0ID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJlxuICAgIC8vIE1pcnJvciBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMnIGJhc2VsaW5lIGdhdGUgdG9vOiB3aXRoIGFuIGltcGxpY2l0IGJhc2VsaW5lIHNlZWRlZCxcbiAgICAvLyBgcGFja2FnZXMvKmAgZW50cmllcyB3b3VsZCBiZSBkZWFkIGdsb2JzIHN1YnN1bWVkIGJ5IHRoZSBiYXNlbGluZS1kZXJpdmVkIG9uZXMuXG4gICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpICYmXG4gICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywge1xuICAgICAgY3dkOiByb290TGlrZS5kaXJQYXRoLFxuICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgfSkubGVuZ3RoID4gMDtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyh7XG4gICAgLi4ucm9vdExpa2UsXG4gICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGhhc1BhY2thZ2VzTGF5b3V0LFxuICB9KTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBuZXcgU2V0KFxuICAgIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zLCByb290TGlrZS5kaXJQYXRoKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpXG4gICAgKVxuICApO1xuICBjb25zdCBpbmNsdWRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBuZWdhdGlvbkJvZGllczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXR0ZXJuIG9mIHdvcmtzcGFjZVBhdHRlcm5zKSB7XG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpO1xuICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkoaXNOZWdhdGl2ZSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuKTtcbiAgICBpZiAoaXNOZWdhdGl2ZSkge1xuICAgICAgLy8gQSBzZWVkaW5nIG5lZ2F0aW9uIG1ha2VzIEJ1biBsaW5rIGJhc2VsaW5lLW1hdGNoZWQgZGlyZWN0b3JpZXMsIHNvIHRoZSBiYXNlbGluZSBtdXN0XG4gICAgICAvLyBlbnRlciB0aGUgZ2VuZXJhdGVkIGluY2x1ZGUgcGF0dGVybnMgZXZlbiB3aGVuIGV2ZXJ5IGRlY2xhcmVkIHBhdHRlcm4gaXMgYSBuZWdhdGlvbi5cbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIGluY2x1ZGVzLmFkZChiYXNlbGluZUdsb2IpO1xuICAgICAgbmVnYXRpb25Cb2RpZXMucHVzaChwYXR0ZXJuQm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0dGVybiBvZiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKHBhdHRlcm5Cb2R5LCByb290TGlrZS5kaXJQYXRoKSkge1xuICAgICAgICBpbmNsdWRlcy5hZGQoZGlyUGF0dGVybik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGV4Y2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbmVnYXRpb25Cb2R5IG9mIG5lZ2F0aW9uQm9kaWVzKSB7XG4gICAgZm9yIChjb25zdCBleGNsdWRlRW50cnkgb2YgdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHksIHdvcmtzcGFjZURpclBhdGhzLCByb290TGlrZS5kaXJQYXRoKSkge1xuICAgICAgZXhjbHVkZXMuYWRkKGV4Y2x1ZGVFbnRyeSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGV4Y2x1ZGVzOiBbLi4uZXhjbHVkZXNdLnRvU29ydGVkKCksIGluY2x1ZGVzOiBbLi4uaW5jbHVkZXNdLnRvU29ydGVkKCkgfTtcbn1cblxuLyoqXG4gKiB0c2NvbmZpZyBleGNsdWRlIGVudHJpZXMgZm9yIG9uZSBuZWdhdGlvbi4gUGF0dGVybi1zaGFwZWQgd2hlbiB0aGUgbmVnYXRpb24gZXhjbHVkZXMgZXhhY3RseVxuICogd2hhdCBpdCBtYXRjaGVzIChzdGFibGUgb3V0cHV0KTsgcGVyLWRpcmVjdG9yeSBvdGhlcndpc2U6IGEgZGlyZWN0b3J5IHRoYXQgaXMgYSB3b3Jrc3BhY2VcbiAqIGRlc3BpdGUgdGhlIG5lZ2F0aW9uIGlzIG5vdCBleGNsdWRlZCBhdCBhbGwsIGFuZCBuZWl0aGVyIGlzIGEgUExBSU4gKHBhY2thZ2UuanNvbi1sZXNzKVxuICogZGVzY2VuZGFudCBvZiBhIHdvcmtzcGFjZSBkaXJlY3Rvcnkg4oCUIG5lZ2F0aW5nIGEgbm9uLXBhY2thZ2UgZGlyZWN0b3J5IGlzIGEgbm8tb3AgZm9yIEJ1bixcbiAqIGFuZCB0aGUgZW5jbG9zaW5nIHdvcmtzcGFjZSBzdGF5cyBhY3RpdmUgKGUuZy4gYFsnYXBwcy8qKicsICchYXBwcy8qKicsICdhcHBzL3dlYiddYFxuICogcmUtaW5jbHVkZXMgYXBwcy93ZWIsIHdob3NlIHNyYyBtdXN0IGtlZXAgdHlwZS1jaGVja2luZzsgYSB0c2NvbmZpZyBleGNsdWRlIHdvdWxkIG92ZXJyaWRlXG4gKiB0aGUgaW5jbHVkZSkuIEEgZGVzY2VuZGFudCB3aXRoIGl0cyBvd24gbWFuaWZlc3QgdGhhdCB0aGUgbmVnYXRpb24ga2VlcHMgb3V0IG9mIHRoZSB3b3Jrc3BhY2VcbiAqIHNldCBpcyBhbiBleGNsdWRlZCBuZXN0ZWQgcGFja2FnZSBhbmQgc3RheXMgZXhjbHVkZWQuIEEgZGlyZWN0b3J5IHRoYXQgaXMgYW5cbiAqIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSBnZXRzIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgZXhjbHVkZWQsIGJlY2F1c2UgQnVuXG4gKiBleGNsdWRlcyBvbmx5IHRoZSBwYWNrYWdlIEFUIHRoYXQgZGlyZWN0b3J5IHdoaWxlIGtlZXBpbmcgZGVzY2VuZGFudCB3b3Jrc3BhY2VzICgjMTAwNCkuXG4gKi9cbmZ1bmN0aW9uIHRvRXhjbHVkZUVudHJpZXMobmVnYXRpb25Cb2R5OiBzdHJpbmcsIHdvcmtzcGFjZURpclBhdGhzOiBTZXQ8c3RyaW5nPiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaXNXb3Jrc3BhY2VBbmNlc3RvciA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiB3b3Jrc3BhY2VEaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZGlyUGF0aH0vYCkpO1xuICAvLyBPbmx5IFBMQUlOIGRpcmVjdG9yaWVzIChubyBwYWNrYWdlLmpzb24gb2YgdGhlaXIgb3duKSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBlbmNsb3NpbmdcbiAgLy8gd29ya3NwYWNlOiBhIG1hdGNoZWQgZGlyZWN0b3J5IHRoYXQgY2FycmllcyBpdHMgb3duIG1hbmlmZXN0IHlldCBpcyBhYnNlbnQgZnJvbSB0aGUgZmluYWxcbiAgLy8gd29ya3NwYWNlIHNldCBpcyBhbiBleGNsdWRlZCBuZXN0ZWQgcGFja2FnZSwgYW5kIGl0cyBleGNsdXNpb24gbXVzdCBzdXJ2aXZlLlxuICBjb25zdCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQgPSAoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgIFsuLi53b3Jrc3BhY2VEaXJQYXRoc10uc29tZSgod29ya3NwYWNlRGlyUGF0aCkgPT4gZGlyUGF0aC5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKTtcbiAgY29uc3QgbWF0Y2hlZERpclBhdGhzID0gZ2V0TWF0Y2hlZERpclBhdGhzKG5lZ2F0aW9uQm9keSwgcm9vdERpclBhdGgpO1xuICBpZiAoXG4gICAgIW1hdGNoZWREaXJQYXRocy5zb21lKFxuICAgICAgKGRpclBhdGgpID0+XG4gICAgICAgIHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1dvcmtzcGFjZUFuY2VzdG9yKGRpclBhdGgpIHx8IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudChkaXJQYXRoKVxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZWREaXJQYXRocy5mbGF0TWFwKChkaXJQYXRoKSA9PiB7XG4gICAgLy8gVGhlIGRlc2NlbmRhbnQgY2hlY2sgcHJlY2VkZXMgdGhlIGFuY2VzdG9yIG9uZTogYSBkaXJlY3RvcnkgaW5zaWRlIG9uZSB3b3Jrc3BhY2UgYnV0IGFib3ZlXG4gICAgLy8gYSBuZXN0ZWQgb25lIChlLmcuIGFwcHMvd2ViL3BsdWdpbnMgYmV0d2VlbiB3b3Jrc3BhY2VzIGFwcHMvd2ViIGFuZCBhcHBzL3dlYi9wbHVnaW5zL3gpXG4gICAgLy8gc3RpbGwgYmVsb25ncyB0byB0aGUgZW5jbG9zaW5nIGFjdGl2ZSB3b3Jrc3BhY2UsIHNvIG5vdGhpbmcgb2YgaXQgbWF5IGJlIGV4Y2x1ZGVkLlxuICAgIGlmICh3b3Jrc3BhY2VEaXJQYXRocy5oYXMoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpKSByZXR1cm4gW107XG4gICAgaWYgKGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkpIHtcbiAgICAgIHJldHVybiBbYCR7ZGlyUGF0aH0vKi5jb25maWcudHNgLCBgJHtkaXJQYXRofS9zY3JpcHRzYCwgYCR7ZGlyUGF0aH0vc3JjYCwgYCR7ZGlyUGF0aH0vdGVzdGBdO1xuICAgIH1cbiAgICByZXR1cm4gW2RpclBhdGhdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEaXJlY3RvcmllcyBhIG5lZ2F0aW9uIG1hdGNoZXMuIFRoZSBtYW5pZmVzdC1iYXNlZCBnbG9iIGNvbXBsZW1lbnRzIG9ubHlEaXJlY3RvcmllcyBiZWNhdXNlXG4gKiBmYXN0LWdsb2IncyBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gYGRpcmAgaXRzZWxmIGFzIGEgZGlyZWN0b3J5LCB3aGlsZSBib3RoIEJ1biBhbmQgdGhlXG4gKiBtYW5pZmVzdCBnbG9iIHRyZWF0IGAqKmAgYXMgemVybyBvciBtb3JlIHNlZ21lbnRzIChgYXBwcy8qKmAgY292ZXJzIHRoZSBwYWNrYWdlIGF0IGFwcHMpLlxuICovXG5mdW5jdGlvbiBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5OiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdsb2JPcHRpb25zID0geyBjd2Q6IHJvb3REaXJQYXRoLCBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH07XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi5mZy5nbG9iU3luYyhuZWdhdGlvbkJvZHksIHsgLi4uZ2xvYk9wdGlvbnMsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSxcbiAgICAgIC4uLmZnXG4gICAgICAgIC5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4obmVnYXRpb25Cb2R5LCAncGFja2FnZS5qc29uJyksIGdsb2JPcHRpb25zKVxuICAgICAgICAubWFwKChwYWNrYWdlSnNvblBhdGgpID0+IHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgICAvLyBBIHplcm8tc2VnbWVudCBgKipgIG1hdGNoIHJlYWNoZXMgdGhlIHJvb3QgaXRzZWxmLCB3aGljaCBpcyBuZXZlciBhIHdvcmtzcGFjZS5cbiAgICAgICAgLmZpbHRlcigoZGlyUGF0aCkgPT4gZGlyUGF0aCAhPT0gJy4nKSxcbiAgICBdKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGluY2x1ZGUvZXhjbHVkZSBzdXBwb3J0IG9ubHkgdGhlIGAqYCwgYD9gLCBhbmQgYCoqYCB3aWxkY2FyZHMsIHdoaWxlIEJ1biB3b3Jrc3BhY2VzXG4gKiBhY2NlcHQgZnVsbCBnbG9iIHN5bnRheCAoYnJhY2UgZXhwYW5zaW9uLCBjaGFyYWN0ZXIgY2xhc3Nlcywg4oCmKSwgc28gZXhwYW5kIEJ1bi1vbmx5IHBhdHRlcm5zIHRvXG4gKiB0aGUgY29uY3JldGUgZGlyZWN0b3JpZXMgdGhleSBtYXRjaCB0byBrZWVwIHRoZSBnZW5lcmF0ZWQgZ2xvYnMgdmFsaWQgZm9yIFR5cGVTY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCEvWygpW1xcXXt9XS91LnRlc3QocGF0dGVybkJvZHkpKSByZXR1cm4gW3BhdHRlcm5Cb2R5XTtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm5Cb2R5LCB7XG4gICAgY3dkOiByb290RGlyUGF0aCxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgb25seURpcmVjdG9yaWVzOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHRoYXQgc3RheSBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6IGFic29sdXRlXG4gKiBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyByZW1vdmVOb2RlTW9kdWxlcyBvcGVyYXRlIG9uIGFub3RoZXJcbiAqIHJlcG9zaXRvcnkncyBmaWxlcy4gRGVjbGFyYXRpb24gb3JkZXIgYW5kIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGVcbiAqIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gcG9zaXRpb24gbWF0dGVycy5cbiAqL1xuZnVuY3Rpb24gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICBjb25zdCBkZWNsYXJlZFBhdHRlcm5zID0gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpO1xuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgZm9yY2VzIGBwYWNrYWdlcy8qYCBpbnRvIGEgbW9ub3JlcG8ncyB3b3Jrc3BhY2VzIHdoZW4gYVxuICAvLyBwYWNrYWdlcy8qL3BhY2thZ2UuanNvbiBhY3R1YWxseSBtYXRjaGVzLCBidXQgaXQgbWF5IG5vdCBoYXZlIHdyaXR0ZW4gdGhlIHJvb3QgcGFja2FnZS5qc29uXG4gIC8vIHlldCwgc28gbWlycm9yIHRoYXQgbm9ybWFsaXphdGlvbiBoZXJlIOKAlCBQUkVQRU5ERUQgbGlrZSB0aGVyZSwgYmVjYXVzZSBhIHBvc2l0aXZlIHBhdHRlcm5cbiAgLy8gcGxhY2VkIGFmdGVyIGEgdXNlciBuZWdhdGlvbiB3b3VsZCByZS1pbmNsdWRlIHRoZSBuZWdhdGVkIHBhY2thZ2VzIHVuZGVyIEJ1bidzIHNlcXVlbnRpYWxcbiAgLy8gZXZhbHVhdGlvbi4gRGlzY292ZXJ5IGNhbGxlcnMgcGFzcyB0aGUgZmFsbGJhY2sgdW5jb25kaXRpb25hbGx5IGZvciBtb25vcmVwb3Mg4oCUIGFcbiAgLy8gbmV2ZXItbWF0Y2hpbmcgcGF0dGVybiBjb250cmlidXRlcyBubyBwYXRocyB0aGVyZSDigJQgd2hpbGUgcGF0dGVybi1zaGFwZWQgY2FsbGVyc1xuICAvLyAoZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMpIGdhdGUgaXQgb24gYW4gYWN0dWFsIG1hdGNoLlxuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9XG4gICAgcm9vdExpa2UuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgIWhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybihyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcylcbiAgICAgID8gWydwYWNrYWdlcy8qJywgLi4uZGVjbGFyZWRQYXR0ZXJuc11cbiAgICAgIDogZGVjbGFyZWRQYXR0ZXJucztcbiAgcmV0dXJuIHdvcmtzcGFjZVBhdHRlcm5zLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgcG9zaXRpdmUgcGF0dGVybiBhbHJlYWR5IGNvdmVycyBgcGFja2FnZXMvKmAgdW5kZXIgcGF0aCBub3JtYWxpemF0aW9uXG4gKiAoZS5nLiBgLi9wYWNrYWdlcy8qYCBvciBhIHRyYWlsaW5nLXNsYXNoIHNwZWxsaW5nKTogZm9yY2luZyBhIHRleHR1YWwgYHBhY2thZ2VzLypgIG5leHQgdG9cbiAqIHN1Y2ggYSBzcGVsbGluZyB3b3VsZCBwZXJzaXN0IGR1cGxpY2F0ZSBlcXVpdmFsZW50IHBhdHRlcm5zIGFuZCByZS1zY2FuIHRoZSBzYW1lIGRpcmVjdG9yaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHdvcmtzcGFjZXM6IFBhY2thZ2VKc29uWyd3b3Jrc3BhY2VzJ10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICAhd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIC8vIEEgYC4uYC10cmF2ZXJzaW5nIG9yIGFic29sdXRlIHNwZWxsaW5nIChlLmcuIGB4Ly4uL3BhY2thZ2VzLypgKSBpcyBkaXNjYXJkZWQgYnlcbiAgICAgIC8vIGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zLCBzbyBpdCBtdXN0IG5vdCBjb3VudCBhcyBjb3ZlcmluZyBwYWNrYWdlcy8qIOKAlCB0aGF0IHdvdWxkXG4gICAgICAvLyBzdXBwcmVzcyB0aGUgZmFsbGJhY2sgQU5EIGxvc2UgdGhlIHBhdHRlcm4sIGxlYXZpbmcgbm8gZGlzY292ZXJlZCB3b3Jrc3BhY2VzLlxuICAgICAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pICYmXG4gICAgICBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuKSA9PT0gJ3BhY2thZ2VzLyonXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMgfSBmcm9tICcuL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBQUklWQVRFX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlLyc7XG5cbmNvbnN0IHByaXZhdGVSZWdpc3RyeUhvc3QgPSAndmVyZGFjY2lvLXByb2R1Y3Rpb24tZTM4OS51cC5yYWlsd2F5LmFwcCc7XG5leHBvcnQgY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nID0gYEB3aWxsYm9vc3Rlci1wcml2YXRlOnJlZ2lzdHJ5PWh0dHBzOi8vJHtwcml2YXRlUmVnaXN0cnlIb3N0fS9gO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhpcyByZXBvc2l0b3J5IGRlYWxzIHdpdGggYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHBhY2thZ2VzIOKAlCBieSBjb252ZW50aW9uIHRoYXQgc2NvcGVcbiAqIGxpdmVzIGV4Y2x1c2l2ZWx5IG9uIHRoZSBwcml2YXRlIFZlcmRhY2NpbyByZWdpc3RyeSwgc28gZXhhY3RseSB0aGVzZSByZXBvc2l0b3JpZXMgbmVlZCB0aGVcbiAqIFZFUkRBQ0NJT19UT0tFTiBwYXNzLXRocm91Z2ggaW4gdGhlaXIgcmV1c2FibGUtd29ya2Zsb3cgY2FsbGVycy5cbiAqXG4gKiBBIHJlcG9zaXRvcnkgcXVhbGlmaWVzIHdoZW4gYW55IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gREVDTEFSRVMgYSBkZXBlbmRlbmN5IGluIHRoZSBzY29wZSAoYW55XG4gKiBkZXBlbmRlbmN5IGZpZWxkKSwgb3IgaXMgaXRzZWxmIE5BTUVEIGluIHRoZSBzY29wZSAoaXQgcHVibGlzaGVzIHRvIFZlcmRhY2NpbywgYW5kIHJlbGVhc2UueW1sXG4gKiBkZXJpdmVzIGl0cyBucG0gYXV0aCBmcm9tIHRoZSBzYW1lIHNlY3JldCkuIE5vdGhpbmcgZWxzZSBpcyBzY2FubmVkOiBsb2NrZmlsZXMgb25seSBtaXJyb3IgdGhlXG4gKiBkZWNsYXJlZCBkZXBlbmRlbmNpZXMsIGFuZCBidW5maWcudG9tbCdzIGBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzYCBtZW50aW9ucyB0aGUgc2NvcGUgZXZlbiBpblxuICogcmVwb3NpdG9yaWVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhcbiAgY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1hbmlmZXN0UmVsUGF0aHMgPSBuZXcgU2V0KFsncGFja2FnZS5qc29uJywgLi4uZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhjb25maWcpXSk7XG4gIHJldHVybiBbLi4ubWFuaWZlc3RSZWxQYXRoc10uc29tZSgocmVsUGF0aCkgPT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxQYXRoKSk7XG4gICAgaWYgKCFtYW5pZmVzdCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChtYW5pZmVzdC5uYW1lPy5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gW1xuICAgICAgbWFuaWZlc3QuZGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3QucGVlckRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMgPz8ge30pLnNvbWUoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG4gIHF1ZXVlPzogJ3NpbmdsZScgfCAnbWF4Jztcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgLy8gR2l0SHViIEFjdGlvbnMgdHJlYXRzIGBldmVudDogbnVsbGAgYXMgYSB2YWx1ZWxlc3MgZXZlbnQgbWFwcGluZywgZS5nLlxuICAvLyBgcHVsbF9yZXF1ZXN0OmAuIGB1bmRlZmluZWRgIHdvdWxkIG9taXQgdGhlIGV2ZW50IGVudGlyZWx5IHdoZW4gZHVtcGluZyBZQU1MLlxuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCAnaW5oZXJpdCc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgICAvLyBMZXQgbWFpbnRhaW5lcnMgcmUtcnVuIHRoZSB0ZXN0cyBieSBoYW5kLlxuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICAvLyBOb25lIG9mIHRoZXNlIG1heSBiZSBuYXJyb3dlZCBqdXN0IGJlY2F1c2UgdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgbmV2ZXIgcHVzaGVzOlxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgdGhlIHRlc3Qgam9iJ3Mgc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyBjYWxsIHdpdGggY2FuY2VsX290aGVyczogdHJ1ZSAodGhlIHJldXNhYmxlXG4gICAgICAvLyB0ZXN0IHdvcmtmbG93IGRlY2xhcmVzIG5vIHBlcm1pc3Npb25zIG9mIGl0cyBvd24sIHNvIGl0cyBqb2JzIHJ1biBvbiB0aGlzIHRva2VuKVxuICAgICAgYWN0aW9uczogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBgc2VtYW50aWMtcmVsZWFzZSAtLWRyeS1ydW5gLCB3aGljaCBkb2VzIGEgYGdpdCBwdXNoIC0tZHJ5LXJ1bmAgdG8gdmVyaWZ5IHdyaXRlXG4gICAgICAvLyBhY2Nlc3MgYW5kIGFib3J0cyB3aXRoIEVHSVROT1BFUk1JU1NJT04gd2l0aG91dCBpdFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgcGtnLXByZWZsaWdodCBQUiBmaWxlIGxpc3RpbmdcbiAgICAgICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAndGVzdC1ydXN0Jzoge1xuICAgIG5hbWU6ICdUZXN0IFJ1c3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LXJ1c3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBgcXVldWU6IG1heGAgaGVyZSB0b28gKCM5NzQpOiBHaXRIdWIncyBkZWZhdWx0IHF1ZXVlIChgc2luZ2xlYCkgY2FuY2VscyBhbiBhbHJlYWR5LVBFTkRJTkdcbiAgICAvLyBjYWxsZXIgcnVuIHdoZW4gYW5vdGhlciBvbmUgcXVldWVzIOKAlCBiZWZvcmUgaXRzIGpvYiAoYW5kIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIG93blxuICAgIC8vIGpvYi1sZXZlbCBgcXVldWU6IG1heGApIGV2ZXIgc3RhcnRzIOKAlCBzaWxlbnRseSBkcm9wcGluZyB0aGF0IHJlbGVhc2UgdHJpZ2dlci5cbiAgICAvLyBUaGUgY2FsbGVyLWxldmVsIGdyb3VwIG11c3QgTk9UIHJldXNlIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIGpvYi1sZXZlbCBncm91cCBuYW1lXG4gICAgLy8gKGByZWxlYXNlLSR7eyBnaXRodWIucmVwb3NpdG9yeSB9fWApOiB3b3JrZmxvdy1sZXZlbCBhbmQgam9iLWxldmVsIGdyb3VwcyBzaGFyZSBvbmVcbiAgICAvLyByZXBvc2l0b3J5LXdpZGUgbmFtZXNwYWNlLCBhbmQgaWRlbnRpY2FsIG5hbWVzIGRlYWRsb2NrIHRoZSBydW4gKFwiQ2FuY2VsaW5nIHNpbmNlIGFcbiAgICAvLyBkZWFkbG9jayBmb3IgY29uY3VycmVuY3kgZ3JvdXAgLi4uIHdhcyBkZXRlY3RlZCBiZXR3ZWVuICd0b3AgbGV2ZWwgd29ya2Zsb3cnIGFuZCAnPGpvYj4nXCIpLlxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgcXVldWU6ICdtYXgnLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG4vKipcbiAqIFBhcnNlcyBhIGB1c2VzOmAgdmFsdWUgY2FsbGluZyBvbmUgb2YgV2lsbEJvb3N0ZXIncyBvd24gcmV1c2FibGUgd29ya2Zsb3dzIChvciB0aGVcbiAqIFdpbGxCb29zdGVyTGFiIHN5bmMgbWlycm9yKSBpbnRvIHRoZSB3b3JrZmxvdyBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikgYW5kIGdpdCByZWYuIE9ubHkgdGhvc2VcbiAqIGZvbGxvdyB0aGUgY29udHJhY3Qgd2JmeSBlbmZvcmNlcyDigJQgY2FsbGVycyBvZiBhbm90aGVyIG9yZ2FuaXphdGlvbidzIHNhbWUtbmFtZWQgcmVwb3NpdG9yeSBhcmVcbiAqIGxlZnQgYWxvbmUuIEdpdEh1YiB0cmVhdHMgb3duZXIvcmVwb3NpdG9yeSBuYW1lcyBjYXNlLWluc2Vuc2l0aXZlbHksIHNvIHRoZSBjb21wYXJpc29uIGRvZXNcbiAqIHRvbywgd2hpbGUgdGhlIHdvcmtmbG93IHBhdGggYW5kIHJlZiBzdGF5IGNhc2Utc2Vuc2l0aXZlLlxuICovXG5mdW5jdGlvbiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKFxuICB1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHsgd29ya2Zsb3dOYW1lOiBzdHJpbmc7IGV4dGVuc2lvbjogc3RyaW5nOyByZWY6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbXi9dKylcXC8oW14vXSspXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvKFteL0BdKz8pXFwuKHlhP21sKUAoLispJC91LmV4ZWModXNlcyA/PyAnJyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG93bmVyID0gbWF0Y2hbMV0hLnRvTG93ZXJDYXNlKCk7XG4gIGlmICgob3duZXIgIT09ICd3aWxsYm9vc3RlcicgJiYgb3duZXIgIT09ICd3aWxsYm9vc3RlcmxhYicpIHx8IG1hdGNoWzJdIS50b0xvd2VyQ2FzZSgpICE9PSAncmV1c2FibGUtd29ya2Zsb3dzJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgd29ya2Zsb3dOYW1lOiBtYXRjaFszXSEsIGV4dGVuc2lvbjogbWF0Y2hbNF0hLCByZWY6IG1hdGNoWzVdISB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIC8vIFdpdGggLmdpdGh1YiBvciAuZ2l0aHViL3dvcmtmbG93cyBzeW1saW5rZWQgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgd3JpdGVZYW1sJ3MgZ3VhcmRzXG4gICAgLy8gYWxyZWFkeSByZWZ1c2UgdGhlIHdyaXRlcywgYnV0IHJlYWRkaXIvcm0gYmVsb3cgd291bGQgc3RpbGwgZW51bWVyYXRlIGFuZCBERUxFVEUgZmlsZXNcbiAgICAvLyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IOKAlCBzbyByZXF1aXJlIHRoZSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBpbnNpZGUgaXQgYmVmb3JlIGFueVxuICAgIC8vIHRyYXZlcnNhbCwgbWtkaXIsIG9yIGNsZWFudXAuXG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyB3b3JrZmxvd3MgYmVjYXVzZSAke3dvcmtmbG93c1BhdGh9IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIC8vIHdiZnkgd3JpdGVzIC55bWwgd29ya2Zsb3dzLCBzbyBlYWNoIGtpbmQgbWFwcyB0byBpdHMgLnltbCBmaWxlLlxuICAgIGNvbnN0IGZpbGVOYW1lc0J5S2luZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICFlbnRyeS5uYW1lLmVuZHNXaXRoKCcueW1sJykpIGNvbnRpbnVlO1xuICAgICAgZmlsZU5hbWVzQnlLaW5kLnNldChlbnRyeS5uYW1lLnNsaWNlKDAsIC0nLnltbCcubGVuZ3RoKSwgZW50cnkubmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmRhdG9yeUtpbmRzID0gWyd0ZXN0JywgJ3NlbWFudGljLXByJywgJ2Nsb3NlLWNvbW1lbnQnXTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCdyZWxlYXNlJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3Rlc3QtcnVzdCcpO1xuICAgIH1cbiAgICAvLyBBIHByZXZpb3VzIHJ1biBtYXkgaGF2ZSBtaXN0YWtlbiBhIGdpdGlnbm9yZWQgdGhpcmQtcGFydHkgY2hlY2tvdXQgZm9yIHJlcG9zaXRvcnkgUnVzdCBjb2RlLlxuICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBnZW5lcmF0ZWQtc3R5bGUgY2FsbGVyOiBhIHNhbWUtbmFtZWQgY3VzdG9tIHdvcmtmbG93IHdpdGggYW55IG90aGVyIGpvYiBzdGF5cy5cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHRlc3RSdXN0RmlsZU5hbWUgPSBmaWxlTmFtZXNCeUtpbmQuZ2V0KCd0ZXN0LXJ1c3QnKTtcbiAgICAgIGlmICh0ZXN0UnVzdEZpbGVOYW1lICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lLCAndGVzdC1ydXN0JykpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgndGVzdC1ydXN0Jyk7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCd3YmZ5Jyk7XG4gICAgZm9yIChjb25zdCBraW5kIG9mIG1hbmRhdG9yeUtpbmRzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lc0J5S2luZC5oYXMoa2luZCkpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLnNldChraW5kLCBgJHtraW5kfS55bWxgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbGVOYW1lc0J5S2luZC5oYXMoJ3N5bmMnKSkge1xuICAgICAgLy8gVGhlIHN5bmMgd29ya2Zsb3cncyBnZW5lcmF0aW9uIG93bnMgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3csIHNvIHByb2Nlc3NpbmcgaXQgYXMgYW5cbiAgICAgIC8vIGluZGVwZW5kZW50IGtpbmQgd291bGQgcmFjZSBjb25jdXJyZW50IHdyaXRlcyBvbiB0aGUgc2FtZSBwYXRoLlxuICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgnc3luYy1mb3JjZScpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tpbmQsIGZpbGVOYW1lXSBvZiBmaWxlTmFtZXNCeUtpbmQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQgYXMgS25vd25LaW5kLCBmaWxlTmFtZSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENhc2UtaW5zZW5zaXRpdmU6IEdpdEh1YiByZXBvc2l0b3J5IG5hbWVzIGFyZSwgYW5kIGEgcmVtb3RlIG1heSBzcGVsbCB0aGlzIG9uZSBhbnkgd2F5LiBHZXR0aW5nIGl0IHdyb25nXG4gIC8vIGxldHMgd2JmeSByZXdyaXRlIHRoZSByZXBvc2l0b3J5IHRoYXQgaG9zdHMgdGhlIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICByZXR1cm4gcmVwb3NpdG9yeT8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZXZlcnkgam9iIG9mIHRoZSB3b3JrZmxvdyBmaWxlIGNhbGxzIHRoZSBuYW1lZCBXaWxsQm9vc3RlciByZXVzYWJsZSB3b3JrZmxvdyAob3duZXJcbiAqIHJlc3RyaWN0ZWQgdmlhIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwpLiBVc2VkIHRvIGRlY2lkZSB3aGV0aGVyIHdiZnkgb3ducyBhIGZpbGUgZW5vdWdoIHRvXG4gKiBkZWxldGUgaXQ6IHVucGFyc2FibGUgZmlsZXMgYW5kIGZpbGVzIHdpdGggYW55IG90aGVyIGpvYiByZXR1cm4gZmFsc2Ug4oCUIGRlbGV0aW5nIGEgd2hvbGVcbiAqIHdvcmtmbG93IG9uIGEgbG9vc2UgbWF0Y2ggd291bGQgYmUgdG9vIGFnZ3Jlc3NpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCB3b3JrZmxvd05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKCcueW1sJykpIHJldHVybiBmYWxzZTtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBpc1RhcmdldENhbGwgPSAodXNlczogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgICB0eXBlb2YgdXNlcyA9PT0gJ3N0cmluZycgJiYgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSB3b3JrZmxvd05hbWU7XG4gIHRyeSB7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGpvYnMgPSBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpO1xuICAgICAgcmV0dXJuIGpvYnMubGVuZ3RoID4gMCAmJiBqb2JzLmV2ZXJ5KChqb2IpID0+IGlzVGFyZ2V0Q2FsbChqb2I/LnVzZXMpKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIFVucGFyc2FibGUgY29udGVudCBpcyBub3QgcHJvdmFibHkgYSBjYWxsZXIgb2YgdGhlIG5hbWVkIHdvcmtmbG93LlxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgd29ya2Zsb3dzUGF0aDogc3RyaW5nLFxuICBraW5kOiBLbm93bktpbmQsXG4gIGZpbGVOYW1lID0gYCR7a2luZH0ueW1sYFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKVxuICAgID8gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCdcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBBIG5vbi1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbCBpbiBhIHJlcG8gd2l0aG91dCBSdXN0IGNvZGUgbWVyZWx5IHNoYXJlcyB0aGUgbmFtZTsgbGVhdmUgaXQgYWxvbmUuXG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0JyAmJiBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFdvcmtmbG93O1xuICAgIHRyeSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHdvcmtmbG93IHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlIHRlbXBsYXRlXG4gICAgICAvLyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcmVwb3NpdG9yeSdzIHdvcmtmbG93LlxuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgWUFNTC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8geWFtbC5sb2FkIHJldHVybnMgdW5kZWZpbmVkIGZvciBlbXB0eS9jb21tZW50LW9ubHkgZmlsZXMgYW5kIG5vbi1vYmplY3RzIGZvciBzY2FsYXJcbiAgICAvLyBkb2N1bWVudHMgd2l0aG91dCB0aHJvd2luZzsgZGVlcG1lcmdlIHdvdWxkIGNyYXNoIG9uIHRoZW0uXG4gICAgaWYgKHR5cGVvZiBvbGRTZXR0aW5ncyAhPT0gJ29iamVjdCcgfHwgb2xkU2V0dGluZ3MgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IGEgd29ya2Zsb3cuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH1cblxuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgLy8gVW5saWtlIHRoZSByZWxlYXNlIGNhbGxlciwgdGhlIGRlZmF1bHQgcXVldWUgKGBzaW5nbGVgKSBpcyBpbnRlbnRpb25hbCBoZXJlOiBhIHBlbmRpbmdcbiAgICAgIC8vIGRlcGxveSB0aGF0IGlzIGNhbmNlbGxlZCBhbmQgcmVwbGFjZWQgYnkgYSBuZXdlciBvbmUgbG9zZXMgbm90aGluZyDigJQgdGhlIG5ld2VyIGRlcGxveVxuICAgICAgLy8gY29udmVyZ2VzIHRoZSBlbnZpcm9ubWVudCB0byB0aGUgbGF0ZXN0IHN0YXRlIGFueXdheS5cbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZSkge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWU7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgZW1wdHkgam9icyAoYSBiYXJlIGBqb2JOYW1lOmAgcGFyc2VzIGFzIG51bGwpLCBub24tcmV1c2FibGUgd29ya2Zsb3dzLCBhbmQgb3RoZXJcbiAgICAvLyBvcmdhbml6YXRpb25zJyByZXVzYWJsZSB3b3JrZmxvd3M6IGEgc2FtZS1uYW1lZCBgcmV1c2FibGUtd29ya2Zsb3dzYCByZXBvc2l0b3J5IGVsc2V3aGVyZVxuICAgIC8vIGZvbGxvd3MgYSBkaWZmZXJlbnQgY29udHJhY3QsIGFuZCBub3JtYWxpemluZyBpdHMgY2FsbGVycyAoc2VjcmV0IGluamVjdGlvbi9yZW1vdmFsLFxuICAgIC8vIHBlcm1pc3Npb25zKSBjb3VsZCBicmVhayB0aGVtLlxuICAgIGlmICgham9iIHx8ICFwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICAvLyBEZXBsb3kgY2FsbGVycyBuZWVkIG5vIHJlcG9zaXRvcnkgd3JpdGVzOiB0aGUgY2FsbGVkIHJldXNhYmxlIHdvcmtmbG93IGluaGVyaXRzIHRoZSBjYWxsZXInc1xuICAvLyB0b2tlbiBwZXJtaXNzaW9ucywgcmVwb3NpdG9yaWVzIGRlZmF1bHQgdGhlIHRva2VuIHRvIHdyaXRlLCBhbmQgdGhlIHJldXNhYmxlIGRlcGxveSB3b3JrZmxvd1xuICAvLyBhdCBtYWluIHBlcmZvcm1zIG5vIEdJVEhVQl9UT0tFTiB3cml0ZXMuIFRoZSByZWFkLW9ubHkgZGVmYXVsdCBpcyBpbmplY3RlZCBhdCB0aGUgSk9CIGxldmVsXG4gIC8vIChqb2IgcGVybWlzc2lvbnMgZG8gbm90IGFmZmVjdCBzaWJsaW5nIGpvYnMsIHNvIGlubGluZSBqb2JzIG9yIHBpbm5lZCBjYWxsZWVzIOKAlCB3aG9zZSB3cml0ZVxuICAvLyBuZWVkcyBhcmUgdW5hdWRpdGVkIOKAlCBrZWVwIHRoZWlycyksIGFuZCBvbmx5IHdoZW4gbmVpdGhlciB0aGUgd29ya2Zsb3cgbm9yIHRoZSBqb2IgZGVjbGFyZXNcbiAgLy8gaXRzIG93biBwZXJtaXNzaW9ucyAoT0lEQyBkZXBsb3lzIGFsd2F5cyBkbywgZm9yIGlkLXRva2VuKS4gcnVuLXNjcmlwdCBjYWxsZXJzIGFyZSBleGNsdWRlZFxuICAvLyBiZWNhdXNlIGFyYml0cmFyeSBwYWNrYWdlIHNjcmlwdHMgbWF5IHB1c2ggY29tbWl0cy5cbiAgaWYgKCFuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAgIGlmICgham9iKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgICAgIGlmICgham9iLnBlcm1pc3Npb25zICYmIGNhbGw/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveScgJiYgY2FsbC5yZWYgPT09ICdtYWluJykge1xuICAgICAgICBqb2IucGVybWlzc2lvbnMgPSB7IGNvbnRlbnRzOiAncmVhZCcgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOlxuICAgIGNhc2UgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93IGJhc2VkIG9uIHRoZSBzeW5jIHdvcmtmbG93IGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbi8vIHdiJ3MgZ2xvYmFsIG9wdGlvbnMgdGhhdCBjb25zdW1lIGEgZm9sbG93aW5nIHZhbHVlIHRva2VuIChmcm9tIHNoYXJlZE9wdGlvbnNCdWlsZGVyIHBsdXNcbi8vIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpOyBldmVyeSBvdGhlciBgLWAtcHJlZml4ZWQgdG9rZW4gYmVmb3JlIHRoZSBzdWJjb21tYW5kIGlzIGEgYm9vbGVhbi5cbmNvbnN0IHdiR2xvYmFsVmFsdWVPcHRpb25zID0gbmV3IFNldChbJy0td29ya2luZy1kaXInLCAnLXcnLCAnLS1lbnYnLCAnLS1jYXNjYWRlLWVudiddKTtcblxuLy8gU3ViY29tbWFuZHMgdGhhdCBydW4gYSBCSU5BUlkgKHNvIHRoZSBmb2xsb3dpbmcgdG9rZW4gY2FuIGJlIHRoZSB3YiBleGVjdXRhYmxlKSwgcGVyIHJ1bm5lcjogYnVuXG4vLyByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGEgcGFja2FnZSBzY3JpcHQgb2YgdGhhdCBuYW1lKSwgbnBtIGhhcyBgZXhlY2AvYHhgLFxuLy8gYW5kIHBucG0veWFybiAoQmVycnkpIGhhdmUgYGV4ZWNgL2BkbHhgLlxuY29uc3QgcnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSB7XG4gIG5wbTogbmV3IFNldChbJ2V4ZWMnLCAneCddKSxcbiAgcG5wbTogbmV3IFNldChbJ2V4ZWMnLCAnZGx4J10pLFxuICB5YXJuOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIGJ1bjogbmV3IFNldChbJ3gnXSksXG59O1xuXG4vLyBSdW5uZXIgb3B0aW9ucyB0aGF0IGNvbnN1bWUgdGhlIEZPTExPV0lORyB0b2tlbiBhcyB0aGVpciB2YWx1ZSwgc28gaXQgaXMgbm90IHRoZSB3YiBleGVjdXRhYmxlXG4vLyAoZS5nLiBgYnVuIC0tY3dkIGRpciB3YiBkZXBsb3lgLCBgbnB4IC1wIHBrZyB3YiBkZXBsb3lgKS4gQSBjb25zZXJ2YXRpdmUgc3VwZXJzZXQgYWNyb3NzXG4vLyBucG0vcG5wbS95YXJuL2J1biBhbmQgdGhlIG5weC9idW54IHBhY2thZ2UgZXhlY3V0b3JzLlxuY29uc3QgcnVubmVyVmFsdWVPcHRpb25zID0gbmV3IFNldChbXG4gICctLWN3ZCcsXG4gICctQycsXG4gICctLXByZWZpeCcsXG4gICctLWZpbHRlcicsXG4gICctRicsXG4gICctLXdvcmtzcGFjZScsXG4gICctdycsXG4gICctLWRpcicsXG4gICctcCcsXG4gICctLXBhY2thZ2UnLFxuICAnLWMnLFxuICAnLS1jYWxsJyxcbl0pO1xuXG4vKiogQWR2YW5jZSBwYXN0IGEgcnVubmVyJ3Mgb3B0aW9ucywgY29uc3VtaW5nIGEgc2VwYXJhdGUgdmFsdWUgdG9rZW4gd2hlcmUgb25lIGFwcGxpZXMuICovXG5mdW5jdGlvbiBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnM6IHN0cmluZ1tdLCBzdGFydEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBzdGFydEluZGV4O1xuICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb25zdCBvcHRpb24gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCFvcHRpb24uaW5jbHVkZXMoJz0nKSAmJiBydW5uZXJWYWx1ZU9wdGlvbnMuaGFzKG9wdGlvbikgJiYgaW5kZXggPCB0b2tlbnMubGVuZ3RoKSBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBUb2tlbml6ZSBhIHNoZWxsIGNvbW1hbmQgbGluZSBpbnRvIGNvbW1hbmQgc2VnbWVudHMsIGVhY2ggYSBsaXN0IG9mIHRva2VucyB3aXRoIHF1b3RlcyByZW1vdmVkLlxuICogQSBuZXcgc2VnbWVudCBzdGFydHMgYXQgYW4gdW5xdW90ZWQgYCYmYC9gfHxgL2A7YC9gfGAvYCZgOyBhbiB1bnF1b3RlZCBgI2Agc3RhcnRzIGEgY29tbWVudCB0b1xuICogZW5kIG9mIGxpbmU7IGEgYmFja3NsYXNoIGVzY2FwZXMgdGhlIG5leHQgY2hhcmFjdGVyIChzbyBgXFw7YCBpcyBhIGxpdGVyYWwsIG5vdCBhIHNlcGFyYXRvcik7XG4gKiBncm91cGluZyBwYXJlbnRoZXNlcyBgKGAvYClgIGFyZSB0b2tlbiBzZXBhcmF0b3JzLCBzbyBgKHdiIGRlcGxveSlgIHRva2VuaXplcyBhcyBgd2IgZGVwbG95YC5cbiAqIFNlZ21lbnRzL3Rva2VucyBtb2RlbCBjb21tYW5kIHN0cnVjdHVyZSBwcmVjaXNlbHkgZW5vdWdoIHRoYXQgcXVvdGVkIG9wZXJhdG9ycywgZXNjYXBlZFxuICogb3BlcmF0b3JzLCBjb21tZW50cywgYW5kIHN1YnNoZWxsIGdyb3VwcyBuZWl0aGVyIGZhYnJpY2F0ZSBub3IgaGlkZSBhIGB3YiBkZXBsb3lgIGludm9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU2hlbGxDb21tYW5kKHNjcmlwdDogc3RyaW5nKTogeyBzZWdtZW50czogc3RyaW5nW11bXTsgc2F3SGVyZWRvYzogYm9vbGVhbiB9IHtcbiAgY29uc3Qgc2VnbWVudHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSAnJztcbiAgbGV0IGluVG9rZW4gPSBmYWxzZTtcbiAgbGV0IHF1b3RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8vIFdoZXRoZXIgdGhlIHNjcmlwdCB1c2VzIGFueSBoZXJlZG9jLiBGYWl0aGZ1bGx5IGNsYXNzaWZ5aW5nIHdoaWNoIGJvZHkgbGluZXMgYXJlIGRhdGEgKHRoZVxuICAvLyBkZWxpbWl0ZXIgd29yZCBjYW4gYmUgcXVvdGVkL2JhY2tzbGFzaC1lc2NhcGVkLCBgPDwtYCBzdHJpcHMgbGVhZGluZyB0YWJzLCB0ZXJtaW5hdG9ycyBtYXRjaFxuICAvLyBleGFjdGx5KSBpcyBtb3JlIHRoYW4gdGhpcyBwYXJzZXIgbW9kZWxzLCBzbyBhIGhlcmVkb2MgYW55d2hlcmUgbWFrZXMgZGV0ZWN0aW9uIHJldHVybiBmYWxzZS5cbiAgbGV0IHNhd0hlcmVkb2MgPSBmYWxzZTtcbiAgLy8gSGVyZWRvYyBkZWxpbWl0ZXJzIHdob3NlIGJvZGllcyBiZWdpbiBhdCB0aGUgTkVYVCBuZXdsaW5lOiBgY2F0IDw8QSA8PEJgIHF1ZXVlcyBBIHRoZW4gQiwgYW5kXG4gIC8vIHRoZSBjb21tYW5kcyBBRlRFUiB0aGUgYDw8YCBoZWFkZXIgb24gdGhlIHNhbWUgbGluZSBzdGlsbCBleGVjdXRlLCBzbyB0aGUgaGVhZGVyIGlzIHJlY29yZGVkXG4gIC8vIGhlcmUgYW5kIHRoZSBib2RpZXMgYXJlIHNraXBwZWQgb25seSB3aGVuIHRoZSBsaW5lJ3MgbmV3bGluZSBpcyByZWFjaGVkLlxuICBsZXQgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBza2lwSGVyZWRvY0JvZGllcyA9IChmcm9tSW5kZXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgbGV0IGN1cnNvciA9IGZyb21JbmRleDtcbiAgICBmb3IgKGNvbnN0IGRlbGltaXRlciBvZiBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMpIHtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBzY3JpcHQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVTdGFydCA9IGN1cnNvciArIDE7XG4gICAgICAgIGxldCBsaW5lRW5kID0gbGluZVN0YXJ0O1xuICAgICAgICB3aGlsZSAobGluZUVuZCA8IHNjcmlwdC5sZW5ndGggJiYgc2NyaXB0W2xpbmVFbmRdICE9PSAnXFxuJykgbGluZUVuZCsrO1xuICAgICAgICBjdXJzb3IgPSBsaW5lRW5kO1xuICAgICAgICBpZiAoc2NyaXB0LnNsaWNlKGxpbmVTdGFydCwgbGluZUVuZCkudHJpbSgpID09PSBkZWxpbWl0ZXIpIGJyZWFrO1xuICAgICAgICBpZiAobGluZUVuZCA+PSBzY3JpcHQubGVuZ3RoKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzID0gW107XG4gICAgcmV0dXJuIGN1cnNvcjtcbiAgfTtcbiAgY29uc3QgZW5kVG9rZW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGluVG9rZW4pIHRva2Vucy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSAnJztcbiAgICBpblRva2VuID0gZmFsc2U7XG4gIH07XG4gIGNvbnN0IGVuZFNlZ21lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgZW5kVG9rZW4oKTtcbiAgICBzZWdtZW50cy5wdXNoKHRva2Vucyk7XG4gICAgdG9rZW5zID0gW107XG4gIH07XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzY3JpcHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gc2NyaXB0W2luZGV4XSA/PyAnJztcbiAgICBpZiAocXVvdGUpIHtcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiBxdW90ZSA9PT0gJ1wiJykge1xuICAgICAgICAvLyBJbnNpZGUgZG91YmxlIHF1b3RlcywgYmFja3NsYXNoLW5ld2xpbmUgaXMgc3RpbGwgYSBsaW5lIGNvbnRpbnVhdGlvbiAoYm90aCByZW1vdmVkKTtcbiAgICAgICAgLy8gYW55IG90aGVyIGVzY2FwZWQgY2hhcmFjdGVyIGNvbnRyaWJ1dGVzIGxpdGVyYWxseS5cbiAgICAgICAgaWYgKHNjcmlwdFtpbmRleCArIDFdID09PSAnXFxuJykgaW5kZXgrKztcbiAgICAgICAgZWxzZSBjdXJyZW50ICs9IHNjcmlwdFsrK2luZGV4XSA/PyAnJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBlbHNlIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJykge1xuICAgICAgLy8gQmFja3NsYXNoLW5ld2xpbmUgaXMgYSBsaW5lIGNvbnRpbnVhdGlvbjogdGhlIHNoZWxsIHJlbW92ZXMgYm90aCwgam9pbmluZyB0aGUgbGluZXNcbiAgICAgIC8vIHdpdGhvdXQgaW50cm9kdWNpbmcgYSB0b2tlbiBib3VuZGFyeS4gQW55IG90aGVyIGVzY2FwZWQgY2hhcmFjdGVyIGlzIGEgbGl0ZXJhbC5cbiAgICAgIGlmIChzY3JpcHRbaW5kZXggKyAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjdXJyZW50ICs9IHNjcmlwdFsrK2luZGV4XSA/PyAnJztcbiAgICAgIGluVG9rZW4gPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09IFwiJ1wiIHx8IGNoYXJhY3RlciA9PT0gJ1wiJykge1xuICAgICAgcXVvdGUgPSBjaGFyYWN0ZXI7XG4gICAgICBpblRva2VuID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBBIGA8PGAvYDw8LWAgaGVyZWRvYyByZWRpcmVjdGlvbjogaXRzIGJvZHkgbGluZXMgKHVwIHRvIHRoZSBkZWxpbWl0ZXIgbGluZSkgYXJlIERBVEEsIG5vdFxuICAgIC8vIGNvbW1hbmRzLCBzbyBgY2F0IDw8J0VPRidcXG53YiBkZXBsb3lcXG5FT0ZgIG11c3Qgbm90IHJlYWQgYHdiIGRlcGxveWAgYXMgYW4gaW52b2NhdGlvbi4gU2luY2VcbiAgICAvLyB0aGUgY2FsbGVyIGRlY2xpbmVzIG9uIEFOWSBoZXJlZG9jLCBmbGFnIGl0IHRoZSBpbnN0YW50IGA8PGAgYXBwZWFycyDigJQgYmVmb3JlIHBhcnNpbmcgdGhlXG4gICAgLy8gZGVsaW1pdGVyIHdvcmQg4oCUIHNvIGFuIGV4b3RpYyBkZWxpbWl0ZXIgKGA8PCtgKSB0aGUgd29yZCBzY2FubmVyIGNhbm5vdCByZWFkIHN0aWxsIGRlY2xpbmVzLlxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICc8JyAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gJzwnKSB7XG4gICAgICBzYXdIZXJlZG9jID0gdHJ1ZTtcbiAgICAgIGxldCBjdXJzb3IgPSBpbmRleCArIDI7XG4gICAgICBpZiAoc2NyaXB0W2N1cnNvcl0gPT09ICctJykgY3Vyc29yKys7XG4gICAgICB3aGlsZSAoL1sgXFx0XS91LnRlc3Qoc2NyaXB0W2N1cnNvcl0gPz8gJycpKSBjdXJzb3IrKztcbiAgICAgIGxldCBkZWxpbWl0ZXIgPSAnJztcbiAgICAgIC8vIFRoZSBkZWxpbWl0ZXIgd29yZCBtYXkgYmUgcXVvdGVkIChgPDwnRU9GJ2ApIG9yIGJhY2tzbGFzaC1lc2NhcGVkIChgPDxcXEVPRmApOyBlaXRoZXIgZm9ybVxuICAgICAgLy8ganVzdCBkaXNhYmxlcyBib2R5IGV4cGFuc2lvbiwgc28gY29sbGVjdCB0aGUgYmFyZSB3b3JkLiBNaXNzaW5nIHRoZSBlc2NhcGVkIGZvcm0gd291bGQgZHJvcFxuICAgICAgLy8gYHNhd0hlcmVkb2NgIGFuZCByZWFkIHRoZSBoZXJlZG9jIGJvZHkgYXMgY29tbWFuZHMuXG4gICAgICBsZXQgZGVsaW1pdGVyUXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBzY3JpcHQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlbGltaXRlckNoYXIgPSBzY3JpcHRbY3Vyc29yXSA/PyAnJztcbiAgICAgICAgaWYgKGRlbGltaXRlclF1b3RlKSB7XG4gICAgICAgICAgaWYgKGRlbGltaXRlckNoYXIgPT09IGRlbGltaXRlclF1b3RlKSBkZWxpbWl0ZXJRdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBlbHNlIGRlbGltaXRlciArPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbGltaXRlckNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICAgIC8vIEEgYmFja3NsYXNoIHF1b3RlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW50byB0aGUgZGVsaW1pdGVyIHdvcmQgKGA8PFxcRU9GYCDihpIgYEVPRmApLlxuICAgICAgICAgIGN1cnNvcisrO1xuICAgICAgICAgIGRlbGltaXRlciArPSBzY3JpcHRbY3Vyc29yXSA/PyAnJztcbiAgICAgICAgfSBlbHNlIGlmIChkZWxpbWl0ZXJDaGFyID09PSBcIidcIiB8fCBkZWxpbWl0ZXJDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgZGVsaW1pdGVyUXVvdGUgPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKC9bXFx3Li1dL3UudGVzdChkZWxpbWl0ZXJDaGFyKSkge1xuICAgICAgICAgIGRlbGltaXRlciArPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnNvcisrO1xuICAgICAgfVxuICAgICAgaWYgKGRlbGltaXRlcikge1xuICAgICAgICAvLyBUaGUgYDw8ZGVsaW1gIGhlYWRlciBpcyBhIHJlZGlyZWN0aW9uIChub3QgYSB0b2tlbik7IHJlY29yZCB0aGUgZGVsaW1pdGVyIGFuZCBrZWVwXG4gICAgICAgIC8vIHBhcnNpbmcgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIOKAlCBpdHMgYm9keSBpcyBza2lwcGVkIHdoZW4gdGhlIG5ld2xpbmUgaXMgcmVhY2hlZC5cbiAgICAgICAgZW5kVG9rZW4oKTtcbiAgICAgICAgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzLnB1c2goZGVsaW1pdGVyKTtcbiAgICAgICAgaW5kZXggPSBjdXJzb3IgLSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJyMnICYmICFpblRva2VuKSB7XG4gICAgICAvLyBDb21tZW50IHJ1bnMgdG8gZW5kIG9mIGxpbmU7IGVuZCB0aGUgY3VycmVudCBjb21tYW5kIHNlZ21lbnQgYW5kIGxldCB0aGUgbG9vcCByZXN1bWUgYXRcbiAgICAgIC8vIHRoZSBuZXdsaW5lIHNvIHRoZSBuZXh0IGxpbmUgaXMgcGFyc2VkIGFzIGl0cyBvd24gc2VnbWVudC5cbiAgICAgIGVuZFNlZ21lbnQoKTtcbiAgICAgIHdoaWxlIChpbmRleCArIDEgPCBzY3JpcHQubGVuZ3RoICYmIHNjcmlwdFtpbmRleCArIDFdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnJicgfHwgY2hhcmFjdGVyID09PSAnfCcgfHwgY2hhcmFjdGVyID09PSAnOycgfHwgY2hhcmFjdGVyID09PSAnXFxuJykge1xuICAgICAgZW5kU2VnbWVudCgpO1xuICAgICAgaWYgKChjaGFyYWN0ZXIgPT09ICcmJyB8fCBjaGFyYWN0ZXIgPT09ICd8JykgJiYgc2NyaXB0W2luZGV4ICsgMV0gPT09IGNoYXJhY3RlcikgaW5kZXgrKztcbiAgICAgIC8vIEEgbmV3bGluZSB0aGF0IGNsb3NlcyBhIGhlcmVkb2MgaGVhZGVyIGxpbmUgY29uc3VtZXMgdGhlIHF1ZXVlZCBib2RpZXMgYmVmb3JlIHRoZSBuZXh0XG4gICAgICAvLyBjb21tYW5kLlxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcbicgJiYgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzLmxlbmd0aCA+IDApIGluZGV4ID0gc2tpcEhlcmVkb2NCb2RpZXMoaW5kZXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcoJyB8fCBjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZW5kVG9rZW4oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoL1xccy91LnRlc3QoY2hhcmFjdGVyKSkge1xuICAgICAgZW5kVG9rZW4oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgICBpblRva2VuID0gdHJ1ZTtcbiAgfVxuICBlbmRTZWdtZW50KCk7XG4gIHJldHVybiB7IHNlZ21lbnRzLCBzYXdIZXJlZG9jIH07XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlcGxveSBzY3JpcHQgaW52b2tlcyBgd2Ig4oCmIGRlcGxveWAgYXQgY29tbWFuZCBwb3NpdGlvbi4gRW52IGFzc2lnbm1lbnRzLCBwYWNrYWdlXG4gKiBydW5uZXJzLCBhbmQgZ2xvYmFsIHlhcmdzIG9wdGlvbnMgKHdpdGggdGhlaXIgdmFsdWUgdG9rZW5zKSBtYXkgcHJlY2VkZSB0aGUgZGVwbG95IGNvbW1hbmQ7XG4gKiBzaGVsbCBxdW90aW5nLCBlc2NhcGluZywgY29tbWVudHMsIGFuZCBncm91cGluZyBhcmUgaG9ub3JlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQ6IHN0cmluZywgc2NyaXB0TmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgY29uc3QgeyBzZWdtZW50cywgc2F3SGVyZWRvYyB9ID0gdG9rZW5pemVTaGVsbENvbW1hbmQoZGVwbG95U2NyaXB0KTtcbiAgLy8gQSBoZXJlZG9jIG1ha2VzIGJvZHktdnMtY29tbWFuZCBjbGFzc2lmaWNhdGlvbiB1bnJlbGlhYmxlIChzZWUgdG9rZW5pemVTaGVsbENvbW1hbmQpLlxuICBpZiAoc2F3SGVyZWRvYykgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IHRva2VucyBvZiBzZWdtZW50cykge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgaW5kZXgrKztcbiAgICAvLyBMZWFkaW5nIGxhdW5jaGVycyBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgZW52YCAod2l0aCBvcHRpb25zICsgS0VZPXZhbHVlIGFzc2lnbm1lbnRzKVxuICAgIC8vIGFuZCB0aGUgUE9TSVggYGNvbW1hbmRgIGJ1aWx0aW4gKHdpdGggaXRzIGAtcGAvYC12YC9gLVZgIG9wdGlvbnMpLiBDb21tYW5kLXBvc2l0aW9uIHNoZWxsXG4gICAgLy8gcmVzZXJ2ZWQgd29yZHMgYW5kIG90aGVyIGxhdW5jaGVycyAoYGlmYC9gdGhlbmAvYGZvcmAvYHRpbWVgL2BleGVjYC9gIWAvYnJhY2UgZ3JvdXBzLCDigKYpIGFyZVxuICAgIC8vIE5PVCBtb2RlbGVkOiB0aGV5IGxlYXZlIGEgbm9uLWB3YmAgZmlyc3QgdG9rZW4sIHNvIHRoZSBzZWdtZW50IHNpbXBseSBkb2VzIG5vdCBtYXRjaC4gVGhpcyBpc1xuICAgIC8vIGEgZGVsaWJlcmF0ZSBmYWxzZS1uZWdhdGl2ZSBmb3IgZ2VuZXJhdGVkIGd1aWRhbmNlLlxuICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnZW52Jykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgICBpZiAoL15bQS1aYS16X11bQS1aYS16MC05X10qPS91LnRlc3QodG9rZW4pKSBpbmRleCsrO1xuICAgICAgICAvLyBlbnYncyBkaXJlY3RvcnkgdmFsdWUgbWF5IGJlIHNlcGFyYXRlIG9yIGF0dGFjaGVkIChgLUNkaXJgLCBgLS1jaGRpcj1kaXJgKS4gSXQgY2hhbmdlc1xuICAgICAgICAvLyB3aGVyZSB3YiBydW5zIGJ1dCBub3Qgd2hldGhlciB0aGUgY29tbWFuZCBpbnZva2VzIHdiIGRlcGxveS5cbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctQycgfHwgdG9rZW4gPT09ICctLWNoZGlyJykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLUMnKSB8fCB0b2tlbi5zdGFydHNXaXRoKCctLWNoZGlyPScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy11JykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBgY29tbWFuZCBDTURgIGV4ZWN1dGVzIENNRCwgYnV0IGBjb21tYW5kIC12YC9gLVYgQ01EYCBvbmx5IFFVRVJZIGl0cyBhdmFpbGFiaWxpdHkgd2l0aG91dFxuICAgIC8vIHJ1bm5pbmcgaXQsIHNvIGEgZGVwbG95IGJlaGluZCB0aGVtIGRvZXMgbm90IHJ1bi4gVGhlIGB2YC9gVmAgZmxhZyBtYXkgYmUgY2x1c3RlcmVkIHdpdGhcbiAgICAvLyBvdGhlciBvcHRpb24gbGV0dGVycyAoYGNvbW1hbmQgLXB2IHdiYCksIHNvIG1hdGNoIGFueSBvcHRpb24gbGV0dGVyIGNsdXN0ZXIgY29udGFpbmluZyBpdC5cbiAgICB3aGlsZSAodG9rZW5zW2luZGV4XSA9PT0gJ2NvbW1hbmQnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgbGV0IHF1ZXJpZXNPbmx5ID0gZmFsc2U7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgaWYgKC9eLVtBLVphLXpdKlt2Vl1bQS1aYS16XSokL3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgcXVlcmllc09ubHkgPSB0cnVlO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHF1ZXJpZXNPbmx5KSB7XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSBjb250aW51ZTtcbiAgICAvLyBSZXNvbHZlIGEgcnVubmVyIHByZWZpeCB0byB3aGV0aGVyIHRoZSBmb2xsb3dpbmcgdG9rZW4gaXMgYSBCSU5BUlkgKHRoZSB3YiBleGVjdXRhYmxlKSBvciBhXG4gICAgLy8gcGFja2FnZSBTQ1JJUFQgbmFtZS4gYGJ1bnhgL2BucHhgIGFuZCBgPHBtPiB4fGRseHxleGVjYCBydW4gYSBiaW5hcnk7IGA8cG0+IHJ1bnxydW4tc2NyaXB0YFxuICAgIC8vIChhbmQgYmFyZSBgbnBtIDxuYW1lPmAsIG9yIGFueSBydW5uZXIgZm9sbG93ZWQgYnkgYC0tYCkgcnVuIGEgcGFja2FnZSBzY3JpcHQg4oCUIHNvXG4gICAgLy8gYG5wbSBydW4gd2IgZGVwbG95YCBleGVjdXRlcyB0aGUgc2NyaXB0IG5hbWVkIGB3YmAsIG5vdCB0aGUgd2IgYmluYXJ5LCBhbmQgbXVzdCBiZSByZWplY3RlZC5cbiAgICBpZiAoWyducG0nLCAncG5wbScsICd5YXJuJywgJ2J1biddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBjb25zdCBydW5uZXIgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgICBjb25zdCBzdWJjb21tYW5kID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGlmIChbJ3J1bicsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoc3ViY29tbWFuZCkpIGNvbnRpbnVlOyAvLyBydW5zIGEgcGFja2FnZSBzY3JpcHQsIG5vdCB3YlxuICAgICAgLy8gRXhlY3V0b3Igc3ViY29tbWFuZHMgYXJlIHJ1bm5lci1TUEVDSUZJQzogYnVuIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYVxuICAgICAgLy8gcGFja2FnZSBzY3JpcHQgbmFtZWQgZGx4L2V4ZWMpLiBSZWFsIGJ1aWx0LWluIGV4ZWN1dG9ycyAoYGV4ZWNgL2B4YCwgYW5kIGBkbHhgIGZvciBwbnBtKVxuICAgICAgLy8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgYSBzYW1lLW5hbWVkIHNjcmlwdCwgc28gdGhleSBhcmUgTk9UIHNoYWRvdy1jaGVja2VkLiBPbmx5IGB5YXJuIGRseGAgaXNcbiAgICAgIC8vIGFtYmlndW91cyDigJQgYSBCZXJyeSBidWlsdC1pbiBidXQgYSBwYWNrYWdlIFNDUklQVCBpbiBZYXJuIENsYXNzaWMg4oCUIHNvIGEgZGVjbGFyZWQgYGRseGBcbiAgICAgIC8vIHNjcmlwdCBtYWtlcyBgeWFybiBkbHhgIGRlY2xpbmUgKGZhbGwgdGhyb3VnaCB0byB0aGUgcGFja2FnZS1zY3JpcHQgY2hlY2tzKS5cbiAgICAgIGNvbnN0IGlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQgPSBydW5uZXIgPT09ICd5YXJuJyAmJiBzdWJjb21tYW5kID09PSAnZGx4JyAmJiBzY3JpcHROYW1lcy5oYXMoJ2RseCcpO1xuICAgICAgaWYgKHJ1bm5lckV4ZWN1dG9yU3ViY29tbWFuZHNCeVJ1bm5lcltydW5uZXJdPy5oYXMoc3ViY29tbWFuZCkgJiYgIWlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQpIHtcbiAgICAgICAgaW5kZXgrKzsgLy8gYmluYXJ5IHJ1bm5lciAocG5wbSBkbHgsIGJ1biB4LCBgbnBtIGV4ZWMgLS0gd2Ig4oCmYClcbiAgICAgICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICctLScpIGluZGV4Kys7IC8vIHRoZSBleGVjdXRvcidzIG9wdGlvbmFsIGAtLWAgYmVmb3JlIHRoZSBjb21tYW5kXG4gICAgICB9IGVsc2UgaWYgKHJ1bm5lciA9PT0gJ25wbScpIHtcbiAgICAgICAgY29udGludWU7IC8vIGJhcmUgYG5wbSB3YmAgbmV2ZXIgcnVucyBhIGJpbmFyeVxuICAgICAgfSBlbHNlIGlmICh0b2tlbnNbaW5kZXhdID09PSAnd2InICYmIHNjcmlwdE5hbWVzLmhhcygnd2InKSkge1xuICAgICAgICAvLyBCYXJlIGBidW4vcG5wbS95YXJuIHdiYCBydW5zIGEgcGFja2FnZSBTQ1JJUFQgbmFtZWQgYHdiYCB3aGVuIG9uZSBleGlzdHMgKHBhc3NpbmcgYGRlcGxveWBcbiAgICAgICAgLy8gYXMgaXRzIGFyZ3VtZW50KSwgbm90IHRoZSB3YiBiaW5hcnkuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoWydidW54JywgJ25weCddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICB9XG4gICAgaWYgKHRva2Vuc1tpbmRleF0gIT09ICd3YicpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHdiQXJncyA9IHRva2Vucy5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIFNraXAgZ2xvYmFsIG9wdGlvbnMgKGFuZCBhbnkgdmFsdWUgdG9rZW4gYSB2YWx1ZS1iZWFyaW5nIG9wdGlvbiBjb25zdW1lcykgc28gdGhlIEZJUlNUXG4gICAgLy8gY29tbWFuZCB0b2tlbiBkZWNpZGVzOiBgd2IgLS1jYXNjYWRlLWVudiBwcm9kdWN0aW9uIGRlcGxveWAgYW5kIGB3YiAtdyBwYWNrYWdlcy9hcGkgZGVwbG95YFxuICAgIC8vIG1hdGNoLCB3aGlsZSBzdWJjb21tYW5kcyBvd25pbmcgdGhlaXIgb3duIGBkZXBsb3lgIChgd2IgcHJpc21hIGRlcGxveWAsIGB3YiByZXRyeSBkZXBsb3lgKVxuICAgIC8vIGRvIG5vdC4gYC0tb3B0PXZhbHVlYCBjYXJyaWVzIGl0cyB2YWx1ZSBpbmxpbmUsIHNvIG9ubHkgdGhlIHNwYWNlLXNlcGFyYXRlZCBmb3JtIHNraXBzIG9uZS5cbiAgICBsZXQgY29tbWFuZEluZGV4ID0gMDtcbiAgICB3aGlsZSAoY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCAmJiAod2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc3QgZmxhZyA9IHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnO1xuICAgICAgY29tbWFuZEluZGV4Kys7XG4gICAgICBpZiAod2JHbG9iYWxWYWx1ZU9wdGlvbnMuaGFzKGZsYWcpICYmIGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGgpIGNvbW1hbmRJbmRleCsrO1xuICAgIH1cbiAgICBpZiAod2JBcmdzW2NvbW1hbmRJbmRleF0gIT09ICdkZXBsb3knKSBjb250aW51ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgd29ya2Zsb3dzIGRpcmVjdG9yeSBob2xkcyBhIGxpdmUgY2FsbGVyIG9mIHRoZSByZXVzYWJsZSBDbG91ZGZsYXJlIGRlcGxveSB3b3JrZmxvdy5cbiAqIFlBTUwgaXMgcGFyc2VkIGFuZCBvbmx5IGBqb2JzLioudXNlc2AgdmFsdWVzIGFyZSBpbnNwZWN0ZWQgKGEgcmF3LXRleHQgc2VhcmNoIHdvdWxkIG1hdGNoXG4gKiBjb21tZW50cyBvciBgcnVuOmAgc3RyaW5ncyksIHdpdGggYSBgZGVwbG95KmAtZmlsZW5hbWUgc2hvcnRjdXQgYW5kIGEgY29uc2VydmF0aXZlIHJhdy10ZXh0XG4gKiBmYWxsYmFjayBmb3IgdW5wYXJzZWFibGUgZmlsZXMuIFVzZWQgYnkgdGhlIGFnZW50LWluc3RydWN0aW9uIGdlbmVyYXRvciBzbyBnZW5lcmF0ZWQgZ3VpZGFuY2VcbiAqIGRlc2NyaWJlcyBvbmx5IHdvcmtmbG93cyB0aGF0IGV4aXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93KHdvcmtmbG93c0RpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgZW50cmllczogZnMuRGlyZW50W107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENhc2UtaW5zZW5zaXRpdmUgb3duZXIvcmVwb3NpdG9yeSAoR2l0SHViIHRyZWF0cyB0aGVtIHNvKSwgY2FzZS1zZW5zaXRpdmUgcGF0aC9yZWYg4oCUIG1hdGNoaW5nXG4gIC8vIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwsIHVzZWQgZm9yIHRoZSB1bnBhcnNlYWJsZS1ZQU1MIHJhdy10ZXh0IGZhbGxiYWNrIG9ubHkuXG4gIGNvbnN0IGRlcGxveUNhbGxQYXR0ZXJuID0gL1teL10rXFwvcmV1c2FibGUtd29ya2Zsb3dzXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvZGVwbG95XFwueWE/bWxAL2l1O1xuICBjb25zdCBjYWxsc0RlcGxveVdvcmtmbG93ID0gKHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgICBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09ICdkZXBsb3knO1xuICByZXR1cm4gZW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIS9cXC55YT9tbCQvdS50ZXN0KGVudHJ5Lm5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIHJldHVybiB0cnVlO1xuICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c0RpclBhdGgsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh3b3JrZmxvdy5qb2JzKS5zb21lKChqb2IpID0+IGNhbGxzRGVwbG95V29ya2Zsb3coam9iPy51c2VzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGVwbG95Q2FsbFBhdHRlcm4udGVzdChjb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBUaGUgcmV1c2FibGUgd29ya2Zsb3dzIHRoYXQgZGVjbGFyZSBGTk9YX0FHRV9LRVkgYW5kIFZFUkRBQ0NJT19UT0tFTiB1bmRlclxuLy8gb24ud29ya2Zsb3dfY2FsbC5zZWNyZXRzIChzZWUgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzKS4gUGFzc2luZyBlaXRoZXIgc2VjcmV0IHRvIGFueVxuLy8gb3RoZXIgY2FsbGVlIGlzIGEgR2l0SHViIGVycm9yLlxuY29uc3QgaW5zdGFsbENhcGFibGVSZXVzYWJsZVdvcmtmbG93cyA9IG5ldyBTZXQoWydkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0JywgJ3Rlc3QnXSk7XG5jb25zdCByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICAvLyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIHJlYWRzIHdvcmtmbG93IHJ1bnM7IGNhbmNlbF9vdGhlcnMgaXMgZmFsc2UsIHNvIHJlYWQgaXMgZW5vdWdoLlxuICAndGVzdC1ydXN0JzogeyBhY3Rpb25zOiAncmVhZCcsIGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgJ3NlbWFudGljLXByJzogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3dyaXRlJyB9LFxufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIC8vIGBzZWNyZXRzOiBpbmhlcml0YCAocGFyc2VkIGJ5IGpzLXlhbWwgYXMgYSBwbGFpbiBzdHJpbmcpIGFscmVhZHkgZm9yd2FyZHMgZXZlcnkgY2FsbGVyIHNlY3JldFxuICAvLyBpbmNsdWRpbmcgdGhlIG9uZXMgaW5qZWN0ZWQgYmVsb3csIHNvIHByZXNlcnZlIGl0IHVudG91Y2hlZCDigJQgcHJvcGVydHkgYXNzaWdubWVudHMgb24gdGhlXG4gIC8vIHN0cmluZyB3b3VsZCB0aHJvdy4gQ2F2ZWF0OiBgaW5oZXJpdGAgZm9yd2FyZHMgc2VjcmV0cyB1bmRlciB0aGVpciBleGlzdGluZyBOQU1FUywgc28gaXQgY2FuXG4gIC8vIG5ldmVyIGZlZWQgUFVCTElDX0ZOT1hfQUdFX0tFWSBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVk7IGEgaGFuZC13cml0dGVuXG4gIC8vIGluaGVyaXQgY2FsbGVyIGluIGEgUFVCTElDIGZub3ggcmVwb3NpdG9yeSBtdXN0IGJlIGNvbnZlcnRlZCB0byBhbiBleHBsaWNpdCBtYXBwaW5nIG1hbnVhbGx5XG4gIC8vICh3YmZ5IG5ldmVyIGdlbmVyYXRlcyB0aGUgaW5oZXJpdCBmb3JtLCBhbmQgaGFuZC13cml0dGVuIGRldmlhdGlvbnMgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbiAgLy8gcmVwb3NpdG9yeSBieSBwb2xpY3kpLlxuICBjb25zdCBzZWNyZXRzID0gam9iLnNlY3JldHMgPT09ICdpbmhlcml0JyA/IHVuZGVmaW5lZCA6IChqb2Iuc2VjcmV0cyA9IGpvYi5zZWNyZXRzID8/IHt9KTtcblxuICBpZiAoc2VjcmV0cyAmJiAoa2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICdyZWxlYXNlJykpIHtcbiAgICBzZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBmbm94LnRvbWwgY2FycmllcyBhZ2UtZW5jcnlwdGVkIGFwcCBzZWNyZXRzOyBDSSBkZWNyeXB0cyB0aGVtIHdpdGggdGhlIEZOT1hfQUdFX0tFWSAob3IsIGZvclxuICAvLyBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuICAvLyBLZXkgdGhlIGluamVjdGlvbiBvbiB0aGUgKmNhbGxlZCogcmV1c2FibGUgd29ya2Zsb3csIG5vdCB0aGUgY2FsbGVyJ3MgZmlsZW5hbWU6IGNhbGxlcnMgbWF5IGhhdmVcbiAgLy8gYXJiaXRyYXJ5IG5hbWVzIChlLmcuIHNjaGVkdWxlZCBydW4tc2NyaXB0IGNhbGxlcnMpLCBhbmQgR2l0SHViIHJlamVjdHMgcGFzc2luZyBhIHNlY3JldCB0aGF0IHRoZVxuICAvLyBjYWxsZWUgZG9lcyBub3QgZGVjbGFyZS5cbiAgLy8gT25seSBhbiBAbWFpbiBjYWxsZWUgaXMga25vd24gdG8gZm9sbG93IHRoZSBjdXJyZW50IHNlY3JldCBjb250cmFjdDogYSB3b3JrZmxvdyBwaW5uZWQgdG8gYW5cbiAgLy8gb2xkZXIgdGFnIG9yIFNIQSBtYXkgc3RpbGwgZGVjbGFyZSBOUE1fVE9LRU4gKGFuZCBub3QgVkVSREFDQ0lPX1RPS0VOKSwgYW5kIEdpdEh1YiByZWplY3RzIGFcbiAgLy8gY2FsbGVyIHdob3NlIHNlY3JldHMgZG8gbm90IG1hdGNoIHRoZSBzZWxlY3RlZCByZXZpc2lvbidzIGRlY2xhcmF0aW9ucywgc28gcGlubmVkIGNhbGxlcnMga2VlcFxuICAvLyB0aGVpciBzZWNyZXRzIHVudG91Y2hlZC5cbiAgY29uc3Qgb3JnV29ya2Zsb3dDYWxsID0gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcyk7XG4gIGNvbnN0IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPSBvcmdXb3JrZmxvd0NhbGw/LnJlZiA9PT0gJ21haW4nID8gb3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVxdWlyZWRQZXJtaXNzaW9ucyA9IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPyByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnNbY2FsbGVkUmV1c2FibGVXb3JrZmxvd10gOiB1bmRlZmluZWQ7XG4gIGlmIChyZXF1aXJlZFBlcm1pc3Npb25zKSBqb2IucGVybWlzc2lvbnMgPSB7IC4uLnJlcXVpcmVkUGVybWlzc2lvbnMgfTtcbiAgaWYgKHNlY3JldHMgJiYgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyAmJiBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzLmhhcyhjYWxsZWRSZXVzYWJsZVdvcmtmbG93KSkge1xuICAgIC8vIFRoZSBjYWxsZWUgcm91dGVzIHB1YmxpYyAoZGVmYXVsdC1yZWdpc3RyeSkgaW5zdGFsbHMgdGhyb3VnaCB0aGUgVGFrdW1pIEd1YXJkXG4gICAgLy8gbWFsaWNpb3VzLXBhY2thZ2UtYmxvY2tpbmcgcHJveHkgd2hlbiB0aGlzIHRva2VuIHJlc29sdmVzOyBhbiB1bnNldCBvcmdhbml6YXRpb24gc2VjcmV0XG4gICAgLy8gZXhwYW5kcyB0byAnJyBhbmQgdGhlIGNhbGxlZSB0cmVhdHMgdGhhdCBhcyBcImZlYXR1cmUgb2ZmXCIsIHNvIHBhc3NpbmcgaXQgaXMgYWx3YXlzIHNhZmUuXG4gICAgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gPSAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JztcbiAgICAvLyBUaGUgY2FsbGVlIGdlbmVyYXRlcyB0aGUgd29ya3NwYWNlIC5ucG1yYyBmb3IgQHdpbGxib29zdGVyLXByaXZhdGUvKiBmcm9tIFZFUkRBQ0NJT19UT0tFTlxuICAgIC8vIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4gT25seSByZXBvc2l0b3JpZXMgdGhhdCBhY3R1YWxseSByZXNvbHZlIHByaXZhdGUgcGFja2FnZXNcbiAgICAvLyAob3IgcHVibGlzaCB0byBWZXJkYWNjaW8pIGdldCB0aGUgcGFzcy10aHJvdWdoOiBldmVyeXdoZXJlIGVsc2UgdGhlIGNyZWRlbnRpYWwgd291bGQgZmxvd1xuICAgIC8vIGludG8gQ0kgcnVucyB0aGF0IG5ldmVyIHVzZSBpdCwgc28gdGhlIGxpbmUgaXMgcmVtb3ZlZCBpbnN0ZWFkLiBUaGUgR2l0SHViIHNlY3JldCBpdHNlbGYgaXNcbiAgICAvLyBhbHdheXMgcmVnaXN0ZXJlZCBtYW51YWxseSBhbmQgc3RheXMgcmVnaXN0ZXJlZCBlaXRoZXIgd2F5LlxuICAgIGlmIChyZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoY29uZmlnKSkge1xuICAgICAgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gPSAnJHt7IHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOIH19JztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIFB1YmxpYyByZXBvc2l0b3JpZXMgY29tbWl0IHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzLCBzbyB0aGV5IGRlY3J5cHQgd2l0aCBhIGRlZGljYXRlZFxuICAgICAgLy8gQ0kgaWRlbnRpdHkgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQpIGluc3RlYWQgb2YgdGhlIG9yZy1pbnRlcm5hbFxuICAgICAgLy8gb25lOyB0aGUgY2FsbGVlIHN0aWxsIHJlY2VpdmVzIGl0IHVuZGVyIGl0cyBkZWNsYXJlZCBGTk9YX0FHRV9LRVkgbmFtZS4gV2hlbiBubyBDSVxuICAgICAgLy8gaWRlbnRpdHkgcmVzb2x2ZXMgKHNlZSBmbm94QWdlS2V5TWFwcGluZyksIGxlYXZlIGFueSBleGlzdGluZyBtYXBwaW5nIHVudG91Y2hlZCBhbmQgYWRkXG4gICAgICAvLyBub25lOiBjcmVhdGluZyBvciByZXdyaXRpbmcgb25lIG9uIGluY29tcGxldGUgaW5mb3JtYXRpb24gd291bGQgbWFwIGEgcG9zc2libHktcHVibGljXG4gICAgICAvLyByZXBvc2l0b3J5IHRvIHRoZSB3cm9uZyBpZGVudGl0eSwgYW5kIGEgZm5veCByZWNpcGllbnQgc3luYyBmYWlsdXJlIGRvZXMgbm90IHN0b3AgdGhpc1xuICAgICAgLy8gZ2VuZXJhdG9yIGZyb20gd3JpdGluZyBmaWxlcyDigJQgdGhlIGZhaWxlZCBydW4ncyByZXJ1biBmaWxscyB0aGUgbWFwcGluZyBpbi5cbiAgICAgIGNvbnN0IG1hcHBpbmcgPSBmbm94QWdlS2V5TWFwcGluZyhjb25maWcpO1xuICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgc2VjcmV0cy5GTk9YX0FHRV9LRVkgPSBtYXBwaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcpIHtcbiAgICBjb25zdCBbcnVzdERpclBhdGhdID0gY29uZmlnLmNhcmdvVG9tbERpclBhdGhzO1xuICAgIGlmIChydXN0RGlyUGF0aCAmJiBydXN0RGlyUGF0aCAhPT0gJy4nKSB7XG4gICAgICBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeSA9IHJ1c3REaXJQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLndpdGgud29ya2luZ19kaXJlY3Rvcnk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjb25zdHJ1Y3QgZnJvbSB0aGUgcGFyc2VkIGNhbGwgc28gYSBkaWZmZXJlbnRseSBjYXNlZCBvd25lciAoR2l0SHViIGlzIGNhc2UtaW5zZW5zaXRpdmVcbiAgLy8gdGhlcmUpIGlzIGFsc28gbm9ybWFsaXplZCB0byB0aGUgcmVwb3NpdG9yeSdzIG93biBvcmdhbml6YXRpb24gLyBtaXJyb3IuXG4gIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH0gZWxzZSBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3RlckxhYi9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEFuIGV4aXN0aW5nIGdpdGh1Yl9ob3N0ZWRfcnVubmVyIG9uIGEgUFJJVkFURSByZXBvc2l0b3J5IGlzIHByZXNlcnZlZCBvbiBwdXJwb3NlOiB0aGUgaW5wdXRcbiAgICAvLyBleGlzdHMgcHJlY2lzZWx5IHNvIGEgcHJpdmF0ZSBjYWxsZXIgY2FuIG9wdCBpbnRvIEdpdEh1Yi1ob3N0ZWQgcnVubmVycywgYW5kIHdiZnkgbXVzdCBub3RcbiAgICAvLyByZXZlcnQgdGhhdCBtYW51YWwgY2hvaWNlIChvbmx5IHRoZSBvdGhlciBraW5kcyBiZWxvdyBuZXZlciB0YWtlIHRoZSBpbnB1dCkuXG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoc2VjcmV0cykge1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoc2VjcmV0cyk7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0IGV4cHJlc3Npb24gdGhlIGNhbGxlciBtYXBzIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSwgb3IgdW5kZWZpbmVkXG4gKiB3aGVuIHRoZSByZXBvc2l0b3J5IHN0YXRlIGRvZXMgbm90IGlkZW50aWZ5IGEgdXNhYmxlIENJIGlkZW50aXR5IOKAlCBhbiB1bmtub3duIHZpc2liaWxpdHksIGFcbiAqIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzIChkZXJpdmluZyBmcm9tIHRoZSBzYW1lIHByaW5jaXBhbCByb3N0ZXIgYXMgdGhlIHJlY2lwaWVudCBzeW5jXG4gKiBrZWVwcyB0aGUgdHdvIGZyb20gZXZlciBkaXNhZ3JlZWluZyksIG9yIGEgZmFpbGVkIGZub3ggcmVjaXBpZW50IHN5bmMsIHdob3NlIGNpcGhlcnRleHRzIG1heVxuICogc3RpbGwgdGFyZ2V0IHRoZSBwcmV2aW91cyBpZGVudGl0eS4gVGhlIGNhbGxlciBtdXN0IHRoZW4gcHJlc2VydmUgYW55IGV4aXN0aW5nIG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCBoYXNGbm94U3luY0ZhaWxlZCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzZWNyZXROYW1lID0gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoY29uZmlnKTtcbiAgcmV0dXJuIHNlY3JldE5hbWUgJiYgYFxcJHt7IHNlY3JldHMuJHtzZWNyZXROYW1lfSB9fWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSBwZXJtaXNzaW9ucyBvYmplY3QgZW1wdGllZCBieSB0aGUgcGVyLWtpbmQgZGVsZXRpb25zIChlLmcuIGFuIGV4aXN0aW5nIHRlc3QtcnVzdCBjYWxsZXJcbiAgLy8gd2hvc2Ugb25seSBlbnRyeSB3YXMgYGFjdGlvbnNgKSBtdXN0IGJlIGRyb3BwZWQgZW50aXJlbHk6IGBwZXJtaXNzaW9uczoge31gIHN0cmlwcyBFVkVSWVxuICAvLyB0b2tlbiBwZXJtaXNzaW9uIGZyb20gdGhlIHdvcmtmbG93LCB1bmxpa2UgdGhlIGFic2VudCBrZXkgd2hpY2gga2VlcHMgdGhlIGRlZmF1bHRzLlxuICBpZiAobmV3U2V0dGluZ3MucGVybWlzc2lvbnMgJiYgT2JqZWN0LmtleXMobmV3U2V0dGluZ3MucGVybWlzc2lvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucztcbiAgfVxuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgY29udGVudFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgICAgLy8gVGhlIHdvcmQgYm91bmRhcnkgYW5kIHRyYWlsaW5nLXdoaXRlc3BhY2UgZ3VhcmQga2VlcCB3b3JkcyBtZXJlbHkgZW5kaW5nIGluIHRoZVxuICAgICAgLy8gYWJicmV2aWF0aW9uIGxldHRlcnMgKGUuZy4gXCJjb29raWUuXCIsIFwibGVnLlwiKSBpbnRhY3QuXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmNmLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiZWdcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmUuZy4nKVxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmllXFwuKD89XFxzfCQpL2csICckMS8vJDJpLmUuJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIC8vIFRoZSBkb3QgbXVzdCBiZSBlc2NhcGVkOiBhbiB1bmVzY2FwZWQgYC5gIG1hdGNoZXMgQU5ZIGNoYXJhY3Rlciwgc28gYGxlZ2l0YCBsb3N0IGl0cyBgbGAgYW5kIGBlYC5cbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvXFwuZ2l0JC91LCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgcmV0dXJuIHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDA0O1xufVxuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgLy8gR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBzbyBjcmVkZW50aWFsIHNlbGVjdGlvbiAoYW5kIHRoZSBjYWNoZSBrZXkpIG11c3RcbiAgLy8gbm90IGRlcGVuZCBvbiBob3cgYSByZW1vdGUgVVJMIGhhcHBlbnMgdG8gc3BlbGwgdGhlIG9yZ2FuaXphdGlvbi5cbiAgY29uc3Qga2V5ID0gb3duZXI/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvbiBwdXJwb3NlOiBhIG5vbmNhbm9uaWNhbGx5IGNhc2VkIHJlbW90ZSAoZS5nLiBnaXRodWIuY29tL3dpbGxib29zdGVybGFiL+KApilcbiAgLy8gbXVzdCBzdGlsbCBzZWxlY3QgdGhlIG9yZ2FuaXphdGlvbidzIG93biBQQVQg4oCUIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgZ2VuZXJpYyBicmFuY2ggd291bGRcbiAgLy8gcHJlZmVyIHRoZSBPVEhFUiBvcmdhbml6YXRpb24ncyBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHRoaXMgb3JnYW5pemF0aW9uJ3MgcHJpdmF0ZVxuICAvLyByZXBvc2l0b3JpZXMuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPd25lciA9IG93bmVyPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRPd25lciA9PT0gJ3dpbGxib29zdGVybGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBhcHBseUVkaXRzLCBjcmVhdGVTY2FubmVyLCBmaW5kTm9kZUF0TG9jYXRpb24sIG1vZGlmeSwgcGFyc2UgYXMgcGFyc2VKc29uYywgcGFyc2VUcmVlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuLy8ganNvbmMtcGFyc2VyIGRlY2xhcmVzIFN5bnRheEtpbmQvU2NhbkVycm9yIGFzIGFtYmllbnQgY29uc3QgZW51bXMsIHdoaWNoIGNhbm5vdCBiZSBpbXBvcnRlZFxuLy8gdW5kZXIgdmVyYmF0aW1Nb2R1bGVTeW50YXg7IG1pcnJvciB0aGUgbmVlZGVkIG1lbWJlciB2YWx1ZXMgbG9jYWxseS5cbmNvbnN0IHN5bnRheEtpbmQgPSB7IGxpbmVDb21tZW50VHJpdmlhOiAxMiwgYmxvY2tDb21tZW50VHJpdmlhOiAxMywgbGluZUJyZWFrVHJpdmlhOiAxNCwgdHJpdmlhOiAxNSwgZW9mOiAxNyB9O1xuY29uc3Qgc2NhbkVycm9yTm9uZSA9IDA7XG5cbmV4cG9ydCBjb25zdCBqc29uY1V0aWwgPSB7XG4gIC8qKlxuICAgKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGhvbGRzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsIOKAlCBvbmx5IHdoaXRlc3BhY2UsIGNvbXBsZXRlIGNvbW1lbnRzLFxuICAgKiBhbmQvb3IgYSBCT00uIHRzYyB0cmVhdHMgc3VjaCBhIHRzY29uZmlnLmpzb24gYXMgYW4gZW1wdHkgY29uZmlnLCBzbyBnZW5lcmF0b3JzIHNob3VsZCB0cmVhdFxuICAgKiBpdCBsaWtlIGEgbWlzc2luZyBmaWxlIChhbmQgZ2VuZXJhdGUgZGVmYXVsdHMpIGluc3RlYWQgb2YgcmVmdXNpbmcgdG8gbWFuYWdlIGl0LiBMZXhpY2FsbHlcbiAgICogYnJva2VuIHRyaXZpYSAoZS5nLiBhbiB1bnRlcm1pbmF0ZWQgYmxvY2sgY29tbWVudCkgaXMgTk9UIHRyaXZpYS1vbmx5OiB0aGUgZmlsZSBtdXN0IGJlIGxlZnRcbiAgICogdW50b3VjaGVkIHJhdGhlciB0aGFuIG92ZXJ3cml0dGVuIHdpdGggZGVmYXVsdHMuXG4gICAqL1xuICBpc1RyaXZpYU9ubHkoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUgfHxcbiAgICAgICAgKGtpbmQgIT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQudHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC5saW5lQnJlYWtUcml2aWEpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIFBhcnNlcyBhIEpTT05DIChKU09OIHdpdGggY29tbWVudHMpIG9iamVjdCBmcm9tIGNvbmZpZyBmaWxlcyBzdWNoIGFzIHRzY29uZmlnLmpzb24sXG4gICAqIHB5cmlnaHRjb25maWcuanNvbiwgcmVub3ZhdGUuanNvbiwgLnZzY29kZS9zZXR0aW5ncy5qc29uLCBhbmQgd3JhbmdsZXIuanNvbmMuXG4gICAqXG4gICAqIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgcmV0dXJucyBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsIHdoaWNoIG11c3RcbiAgICogbm90IGJlIHRyZWF0ZWQgYXMgdGhlIGZpbGUncyBjb25maWd1cmF0aW9uOyByZWplY3QgYW55IHBhcnNlIGVycm9yIGluc3RlYWQuIEEgbGVhZGluZyBCT00gaXNcbiAgICogc3RyaXBwZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGFjY2VwdHMgQk9NJ2QgY29uZmlnIGZpbGVzIHdoaWxlIGpzb25jLXBhcnNlciByZXBvcnRzIHRoZSBCT00gYXNcbiAgICogYSBwYXJzZSBlcnJvci5cbiAgICovXG4gIHBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUIGV4dGVuZHMgb2JqZWN0Pihjb250ZW50OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXJzZUVycm9yczogUGFyc2VFcnJvcltdID0gW107XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUpzb25jKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJyksIHBhcnNlRXJyb3JzLCB7IGFsbG93VHJhaWxpbmdDb21tYTogdHJ1ZSB9KSBhc1xuICAgICAgfCBUXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBjYXJyaWVzIGF0IGxlYXN0IG9uZSBjb21tZW50LCBpLmUuIGNvbnRlbnQgSlNPTi5zdHJpbmdpZnkgd291bGQgZHJvcC4gKi9cbiAgY29udGFpbnNDb21tZW50KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICAvLyBBIGxleGljYWwgZXJyb3IgbWVhbnMgdGhlIHJlbWFpbmluZyB0b2tlbnMgYXJlIHVucmVsaWFibGU7IHJlcG9ydCBubyBjb21tZW50IHJhdGhlciB0aGFuXG4gICAgICAvLyBndWVzc2luZywgc2luY2UgY2FsbGVycyBvbmx5IHVzZSB0aGlzIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHdhcm4gYWJvdXQgZHJvcHBlZCBjb21tZW50cy5cbiAgICAgIGlmICgoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGtpbmQgPT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgfHwga2luZCA9PT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGBzZXR0aW5nc2AgaW50byBgb2xkQ29udGVudGAsIGVkaXRpbmcgb25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzXG4gICAqIGNoYW5nZWQgc28gdGhlIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIG9mIGFuIGV4aXN0aW5nIGZpbGUgc3Vydml2ZS4gQ2FsbGVycyBuZXZlciBkcm9wXG4gICAqIHByb3BlcnRpZXMgKGdlbmVyYXRlZCBzZXR0aW5ncyBhcmUgbWVyZ2VkIE9OIFRPUCBvZiB0aGUgZXhpc3Rpbmcgb25lcyksIHNvIHJlbW92YWxzIGFyZSBub3RcbiAgICogaGFuZGxlZDogYSBwcm9wZXJ0eSBtaXNzaW5nIGZyb20gYHNldHRpbmdzYCBpcyBsZWZ0IHVudG91Y2hlZCByYXRoZXIgdGhhbiBkZWxldGVkLlxuICAgKlxuICAgKiBUcml2aWEtb25seSBjb250ZW50IGtlZXBzIGl0cyBjb21tZW50cyBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW5cbiAgICogYmVpbmcgcmVwbGFjZWQgb3V0cmlnaHQgb3IgcnVuIHRocm91Z2ggbW9kaWZ5KCkgKHdoaWNoIHdvdWxkIG1vdmUgdGhlIG9iamVjdCBpbiBmcm9udCBvZiB0aGVtKS5cbiAgICovXG4gIHN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgb2xkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB7IGNvbnRlbnQ6IHN0cmluZzsga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSB9IHtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSwga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2xkQ29udGVudCk7XG4gICAgLy8gRHJvcCBhIGxlYWRpbmcgQk9NOiBtb2RpZnkoKSBpbnNlcnRzIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IEJFRk9SRSBhbnkgbGVhZGluZyB0cml2aWEsIHdoaWNoXG4gICAgLy8gd291bGQgbGVhdmUgdGhlIEJPTSBzdHJhbmRlZCBtaWQtZmlsZSB3aGVyZSBpdCBpcyBhIHN5bnRheCBlcnJvciByYXRoZXIgdGhhbiBhbiBpZ25vcmVkIG1hcmsuXG4gICAgbGV0IGNvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpO1xuICAgIGlmIChqc29uY1V0aWwuaXNUcml2aWFPbmx5KGNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBjb250ZW50LnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IGAke2hlYWRlciA/IGhlYWRlciArICdcXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKX1gLFxuICAgICAgICBrZXlzTG9zaW5nQ29tbWVudHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbW9kaWZ5T3B0aW9ucyA9IHsgZm9ybWF0dGluZ09wdGlvbnM6IGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQpIH07XG4gICAgY29uc3Qga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5ld0VudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncykpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkU2V0dGluZ3M/LltrZXldO1xuICAgICAgLy8gQ29tcGFyZSBzZXJpYWxpemVkIGZvcm1zIHNvIGRlZXAtZXF1YWwgdmFsdWVzIChlLmcuIGEgcmUtbWVyZ2VkIGBleHRlbmRzYCBhcnJheSkgZG8gbm90XG4gICAgICAvLyByZXdyaXRlIHRoZSBwcm9wZXJ0eSBhbmQgcmVmbG93IGl0cyBmb3JtYXR0aW5nLlxuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2luZyBhIHdob2xlIGFycmF5IHdvdWxkIGRpc2NhcmQgdGhlIGNvbW1lbnRzIGJldHdlZW4gaXRzIGVsZW1lbnRzLCBzbyBncm93IGl0IHdpdGhcbiAgICAgIC8vIHBlci1lbGVtZW50IGluc2VydGlvbnMgd2hlbmV2ZXIgdGhlIG5ldyB2YWx1ZSBvbmx5IGFkZHMgdG8gaXQuXG4gICAgICBjb25zdCBpbnNlcnRpb25zID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZSwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBpbnNlcnRpb24gb2YgaW5zZXJ0aW9ucyA/PyBbXSkge1xuICAgICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIG1vZGlmeShjb250ZW50LCBba2V5LCBpbnNlcnRpb24uaW5kZXhdLCBpbnNlcnRpb24udmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgaXNBcnJheUluc2VydGlvbjogdHJ1ZSB9KVxuICAgICAgICApO1xuICAgICAgICBjb250ZW50ID0gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50LCBrZXksIGluc2VydGlvbi5pbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zZXJ0aW9ucykgY29udGludWU7XG4gICAgICAvLyBSZXdyaXRpbmcgdGhlIHdob2xlIHZhbHVlIGlzIHRoZSBvbmx5IG9wdGlvbiBsZWZ0ICh0aGUgbmV3IG9uZSBkcm9wcyBvciByZW9yZGVycyBlbGVtZW50cyksXG4gICAgICAvLyBhbmQgaXQgdGFrZXMgYW55IGNvbW1lbnQgbmVzdGVkIGluc2lkZSBpdCBhbG9uZy4gUmVwb3J0IHRoYXQgcmF0aGVyIHRoYW4gbG9zaW5nIGl0IHF1aWV0bHkuXG4gICAgICBjb25zdCByZXBsYWNlZFRleHQgPSB2YWx1ZVRleHRPZihjb250ZW50LCBrZXkpO1xuICAgICAgaWYgKHJlcGxhY2VkVGV4dCAhPT0gdW5kZWZpbmVkICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQocmVwbGFjZWRUZXh0KSkga2V5c0xvc2luZ0NvbW1lbnRzLnB1c2goa2V5KTtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIG1vZGlmeU9wdGlvbnMpKTtcbiAgICB9XG4gICAgLy8gUHJlcGVuZCByYXRoZXIgdGhhbiBhcHBlbmQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmV3OiBhcHBlbmRpbmcgZGV0YWNoZXMgYSB0cmFpbGluZ1xuICAgIC8vIHNhbWUtbGluZSBjb21tZW50IGZyb20gdGhlIGxhc3QgcHJvcGVydHksIGxlYXZpbmcgaXQgdG8gZGVzY3JpYmUgdGhlIGdlbmVyYXRlZCB2YWx1ZVxuICAgIC8vIGluc3RlYWQuIEluc2VydGluZyBpbiByZXZlcnNlIGtlZXBzIHRoZSBvcmRlciB0aGUgc2V0dGluZ3MgZGVjbGFyZSB0aGVtIGluLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMudG9SZXZlcnNlZCgpKSB7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGdldEluc2VydGlvbkluZGV4OiAoKSA9PiAwIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH07XG4gIH0sXG59O1xuXG4vKiogUmV0dXJucyB0aGUgc291cmNlIHRleHQgb2YgYSB0b3AtbGV2ZWwgcHJvcGVydHkncyB2YWx1ZSwgY29tbWVudHMgYW5kIGFsbC4gKi9cbmZ1bmN0aW9uIHZhbHVlVGV4dE9mKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBub2RlID0gcm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pO1xuICByZXR1cm4gbm9kZSAmJiBjb250ZW50LnNsaWNlKG5vZGUub2Zmc2V0LCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoKTtcbn1cblxuLy8gVGhlIHdob2xlIHNhbWUtbGluZSBjb21tZW50IHNlcXVlbmNlLCBub3QganVzdCB0aGUgZmlyc3Qgb25lOiBhIGxpbmUgY29tbWVudCBlbmRzIGl0IChpdCBydW5zIHRvXG4vLyB0aGUgbmV3bGluZSksIGJ1dCBhbnkgbnVtYmVyIG9mIGJsb2NrIGNvbW1lbnRzIGNhbiBwcmVjZWRlIGl0LCBhbmQgbW92aW5nIG9ubHkgdGhlIGZpcnN0IHdvdWxkXG4vLyBsZWF2ZSB0aGUgcmVzdCBkZXNjcmliaW5nIHRoZSB3cm9uZyBlbGVtZW50LlxuY29uc3QgdHJhaWxpbmdDb21tZW50UGF0dGVybiA9IC9eKD86W15cXFNcXG5dKlxcL1xcKltcXFNcXHNdKj9cXCpcXC8pKig/OlteXFxTXFxuXSpcXC9cXC9bXlxcbl0qKT8vdTtcblxuLyoqXG4gKiBSZWF0dGFjaGVzIGEgc2FtZS1saW5lIGNvbW1lbnQgdG8gdGhlIGVsZW1lbnQgaXQgZGVzY3JpYmVzLiBJbnNlcnRpbmcgaW50byBhbiBhcnJheSBwbGFjZXMgdGhlXG4gKiBuZXcgZWxlbWVudCBCRUZPUkUgdGhlIHRyaXZpYSB0aGF0IGZvbGxvd3MgaXRzIHByZWRlY2Vzc29yLCBzbyBhcHBlbmRpbmcgYWZ0ZXJcbiAqIGB7IC4uLiB9IC8vIHdoeSB0aGlzIHJ1bGUgZXhpc3RzYCBsZWF2ZXMgdGhhdCBjb21tZW50IGV4cGxhaW5pbmcgdGhlIGdlbmVyYXRlZCBlbGVtZW50IGluc3RlYWQuXG4gKiBBIGZyZXNobHkgc2VyaWFsaXplZCBlbGVtZW50IG5ldmVyIGNhcnJpZXMgYSBjb21tZW50IG9mIGl0cyBvd24sIHNvIGFueXRoaW5nIHRyYWlsaW5nIHRoZVxuICogaW5zZXJ0aW9uIGJlbG9uZ2VkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBpbnNlcnRlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaW5zZXJ0ZWRJbmRleCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IGVsZW1lbnRzID0gKHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKSk/LmNoaWxkcmVuO1xuICBjb25zdCBpbnNlcnRlZCA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleF07XG4gIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4IC0gMV07XG4gIGlmICghaW5zZXJ0ZWQgfHwgIXByZXZpb3VzKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5zZXJ0ZWRFbmQgPSBpbnNlcnRlZC5vZmZzZXQgKyBpbnNlcnRlZC5sZW5ndGg7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuLmV4ZWMoY29udGVudC5zbGljZShpbnNlcnRlZEVuZCkpPy5bMF07XG4gIGlmICghY29tbWVudCkgcmV0dXJuIGNvbnRlbnQ7XG4gIC8vIExhbmQgdGhlIGNvbW1lbnQgYWZ0ZXIgdGhlIHNlcGFyYXRpbmcgY29tbWEgc28gdGhlIGVsZW1lbnQga2VlcHMgaXRzIG93biBsaW5lIGludGFjdC5cbiAgY29uc3QgcHJldmlvdXNFbmQgPSBwcmV2aW91cy5vZmZzZXQgKyBwcmV2aW91cy5sZW5ndGg7XG4gIGNvbnN0IHJlc3RvcmVPZmZzZXQgPSBwcmV2aW91c0VuZCArICgvXlxccyosL3UuZXhlYyhjb250ZW50LnNsaWNlKHByZXZpb3VzRW5kKSk/LlswXS5sZW5ndGggPz8gMCk7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCByZXN0b3JlT2Zmc2V0KSArXG4gICAgY29tbWVudCArXG4gICAgY29udGVudC5zbGljZShyZXN0b3JlT2Zmc2V0LCBpbnNlcnRlZEVuZCkgK1xuICAgIGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQgKyBjb21tZW50Lmxlbmd0aClcbiAgKTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBpbmRlbnRhdGlvbiB0aGUgZmlsZSBhbHJlYWR5IHVzZXMsIHNvIGEgc2VtYW50aWMgY2hhbmdlIGRvZXMgbm90IHJlaW5kZW50IHVucmVsYXRlZFxuICogbGluZXMuIFRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgaW5kZW50ZWQgbGluZSwgYmVjYXVzZSBhIGRlY29yYXRlZFxuICogYmxvY2sgY29tbWVudCAoYCAqIC4uLmApIHdvdWxkIG90aGVyd2lzZSBwYXNzIGZvciB0aGUgZmlsZSdzIGluZGVudGF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSB0d29cbiAqIHNwYWNlcyBldmVyeSBnZW5lcmF0ZWQgY29uZmlnIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQ6IHN0cmluZyk6IHsgaW5zZXJ0U3BhY2VzOiBib29sZWFuOyB0YWJTaXplOiBudW1iZXIgfSB7XG4gIGNvbnN0IGZpcnN0UHJvcGVydHkgPSBwYXJzZVRyZWUoY29udGVudCk/LmNoaWxkcmVuPy5bMF07XG4gIGNvbnN0IGluZGVudGF0aW9uID1cbiAgICBmaXJzdFByb3BlcnR5ICYmIGNvbnRlbnQuc2xpY2UoY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpICsgMSwgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpO1xuICBpZiAoIWluZGVudGF0aW9uIHx8ICEvXltcXHQgXSskL3UudGVzdChpbmRlbnRhdGlvbikpIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogMiB9O1xuICBpZiAoaW5kZW50YXRpb24uc3RhcnRzV2l0aCgnXFx0JykpIHJldHVybiB7IGluc2VydFNwYWNlczogZmFsc2UsIHRhYlNpemU6IDEgfTtcbiAgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiBpbmRlbnRhdGlvbi5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBpbnNlcnQgaW50byBgb2xkVmFsdWVgIHRvIHR1cm4gaXQgaW50byBgbmV3VmFsdWVgLCBvciB1bmRlZmluZWQgd2hlblxuICogdGhhdCBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgYG5ld1ZhbHVlYCBkcm9wcyBvciByZW9yZGVycyBhbiBleGlzdGluZyBlbGVtZW50ICh0aGUgY2FsbGVyIG11c3RcbiAqIHRoZW4gcmVwbGFjZSB0aGUgYXJyYXkgd2hvbGVzYWxlKS4gSW5kaWNlcyBhZGRyZXNzIHRoZSBhcnJheSBhcyBpdCBncm93cywgc28gYXBwbHlpbmcgdGhlXG4gKiBpbnNlcnRpb25zIGxlZnQgdG8gcmlnaHQgeWllbGRzIGBuZXdWYWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlOiB1bmtub3duW10sIG5ld1ZhbHVlOiB1bmtub3duW10pOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc2VydGlvbnM6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdID0gW107XG4gIGxldCBvbGRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgW25ld0luZGV4LCBlbGVtZW50XSBvZiBuZXdWYWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAob2xkSW5kZXggPCBvbGRWYWx1ZS5sZW5ndGggJiYgSlNPTi5zdHJpbmdpZnkob2xkVmFsdWVbb2xkSW5kZXhdKSA9PT0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpIHtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaW5zZXJ0aW9ucy5wdXNoKHsgaW5kZXg6IG5ld0luZGV4LCB2YWx1ZTogZWxlbWVudCB9KTtcbiAgfVxuICByZXR1cm4gb2xkSW5kZXggPT09IG9sZFZhbHVlLmxlbmd0aCA/IGluc2VydGlvbnMgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBSZWNvZ25pemVzIHRoZSBtYW5hZ2VkIGB3YiBnZW4tY29kZWAgc2VnbWVudCwgYSBvbmUtbGV2ZWwgcGFja2FnZS1zY3JpcHQgd3JhcHBlciBhcm91bmQgaXQsIGFuZFxuICogY3VzdG9tIHNlZ21lbnRzIHRoYXQgd2JmeSBsZWF2ZXMgYWxvbmUuXG4gKi9cbnR5cGUgU2NyaXB0U2VnbWVudEtpbmQgPSAnY3VzdG9tJyB8ICdnZW5Db2RlJyB8ICdnZW5Db2RlV3JhcHBlcic7XG5cbmNvbnN0IGdlbkNvZGVTZWdtZW50UGF0dGVybiA9IC9eYnVuXFxzK3diXFxzK2dlbi1jb2RlJC91O1xuXG4vLyBBIHJ1bm5lciBkZWxlZ2F0aW5nIHRvIG9uZSBvZiB0aGlzIHBhY2thZ2UncyBvd24gc2NyaXB0cywgZS5nLiBgYnVuIHJ1biBnZW4tdHlwZXNgLlxuY29uc3Qgc2NyaXB0UnVubmVyUGF0dGVybiA9IC9eYnVuXFxzK3J1blxccysoXFxTKykkL3U7XG5cbi8vIEFueXRoaW5nIHdiZnkncyBgJiZgIHNwbGl0IGNhbm5vdCBtb2RlbCAocGlwZXMsIHNlcXVlbmNpbmcsIHJlZGlyZWN0aW9ucywgcXVvdGluZywgc3Vic3RpdHV0aW9ucywgZGlyZWN0b3J5XG4vLyBjaGFuZ2VzKS4gU2NyaXB0cyBjb250YWluaW5nIGl0IGFyZSBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG5jb25zdCB1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybiA9IC9bXFxuO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3U7XG5cbi8qKlxuICogU3BsaXRzIGEgc2NyaXB0IGludG8gYCYmYC1zZXBhcmF0ZWQgc2VnbWVudHMsIG9yIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCB1c2VzIHNoZWxsIHN5bnRheCB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAodW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm47XG4gIHJldHVybiBzY3JpcHRcbiAgICAuc3BsaXQoJyYmJylcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTY3JpcHRTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIGZvbGxvd3NXcmFwcGVyID0gdHJ1ZVxuKTogU2NyaXB0U2VnbWVudEtpbmQge1xuICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgaWYgKGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KG5vcm1hbGl6ZWQpKSByZXR1cm4gJ2dlbkNvZGUnO1xuICAvLyBBIG9uZS1sZXZlbCB3cmFwcGVyIGxvb2t1cCBjb3ZlcnMgYFwicG9zdGluc3RhbGxcIjogXCJidW4gcnVuIGdlbi10eXBlc1wiYCwgdGhlIHNoYXBlIHRoZXNlIHJlcG9zaXRvcmllcyB1c2U7XG4gIC8vIGRlZXBlciBjaGFpbnMgc3RheSBjdXN0b20gc28gd2JmeSBjYW5ub3QgbG9vcCBvbiBhIHNlbGYtcmVmZXJlbnRpYWwgc2NyaXB0LlxuICBjb25zdCBzY3JpcHROYW1lID0gZm9sbG93c1dyYXBwZXIgPyBzY3JpcHRSdW5uZXJQYXR0ZXJuLmV4ZWMobm9ybWFsaXplZCk/LlsxXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiAnY3VzdG9tJztcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHRhcmdldCk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgc3RpbGwgcGVyZm9ybXMgdGhlIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiwgc28gaXQgY291bnRzIGFzIGdlbi1jb2RlOyB0cmVhdGluZyBpdCBhcyBjdXN0b20gd291bGQgYXBwZW5kIGEgc2Vjb25kIGB3YiBnZW4tY29kZWAgYW5kIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuXG4gIGlmIChzZWdtZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIG1hbmFnZWQgZ2VuZXJhdGlvbiBBTkQgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IGlzIHRoZSBpbnN0YWxsLXRpbWUgZW50cnkgcG9pbnQ6IGl0IG11c3QgYmUga2VwdCBhc1xuICAgIC8vIHdyaXR0ZW4uIFJlcGxhY2luZyBpdCB3aXRoIGEgYmFyZSBgd2IgZ2VuLWNvZGVgIHdvdWxkIGRyb3AgdGhvc2Ugc3RlcHM7IGFwcGVuZGluZyBvbmUgd291bGQgcnVuIGV2ZXJ5XG4gICAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICAgIHJldHVybiBzZWdtZW50cz8uc29tZSgoaW5uZXIpID0+IGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KGlubmVyLnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpKSlcbiAgICAgID8gJ2dlbkNvZGVXcmFwcGVyJ1xuICAgICAgOiAnY3VzdG9tJztcbiAgfVxuICByZXR1cm4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnRzWzBdID8/ICcnLCBzY3JpcHRzLCBmYWxzZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZCwgYXJncywgY3dkKVsxXTtcbn1cblxuZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dCA6IHN0ZG91dC50b1N0cmluZygpO1xuICByZXR1cm4gW3Byb2Muc3RhdHVzID8/IDEsIHN0ZG91dFRleHQudHJpbSgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICcuL3V0aWxzL3N0cmluZ1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocywgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMgfSBmcm9tICcuL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIC8vIFdoZXRoZXIgaXNQdWJsaWNSZXBvIGNvbWVzIGZyb20gYW4gYWN0dWFsIEdpdEh1YiBBUEkgcmVzcG9uc2U6IGEgZmFpbGVkIGxvb2t1cCAob2ZmbGluZSxcbiAgLy8gcmF0ZS1saW1pdGVkLCBiYWQgY3JlZGVudGlhbCkgY29sbGFwc2VzIHRvIGlzUHVibGljUmVwbz1mYWxzZSwgd2hpY2ggdmlzaWJpbGl0eS1zZW5zaXRpdmVcbiAgLy8gZ2VuZXJhdG9ycyBtdXN0IG5vdCBtaXN0YWtlIGZvciBhIGNvbmZpcm1lZCBwcml2YXRlIHJlcG9zaXRvcnkuXG4gIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQ2xvdWRmbGFyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZzogYm9vbGVhbjtcbiAgaXNSYWlsd2F5OiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvKiogRGlyZWN0b3JpZXMgY29udGFpbmluZyBDYXJnby50b21sIChyZWxhdGl2ZSB0byBkaXJQYXRoLCByb290LW1vc3QgZmlyc3QpLiBFbXB0eSBpZiB0aGUgcmVwbyBoYXMgbm8gUnVzdCBjb2RlLiAqL1xuICBjYXJnb1RvbWxEaXJQYXRoczogc3RyaW5nW107XG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblV2TG9jazogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBQeXRob24gbG9ja2ZpbGUgKHBvZXRyeS5sb2NrIC8gdXYubG9jaykgZXhpc3RzIGFueXdoZXJlIGluIHRoZSBkaXJlY3RvcnkgdHJlZS4gKi9cbiAgZG9lc0NvbnRhaW5QeXRob25Mb2NrQW55d2hlcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIE1hdmVuIHBvbS54bWwgZXhpc3RzIGFueXdoZXJlIGluIHRoZSBkaXJlY3RvcnkgdHJlZS4gKi9cbiAgZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBTbGlkZXYgZGVjayAoYCouc2xpZGV2Lm1kYCkgZXhpc3RzIGFueXdoZXJlIGluIHRoZSBkaXJlY3RvcnkgdHJlZS4gKi9cbiAgZG9lc0NvbnRhaW5TbGlkZXZNZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZzogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0UnVudGltZTogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc2xpZGV2OiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB0YXVyaTogYm9vbGVhbjtcbiAgICB2aW5leHQ6IGJvb2xlYW47XG4gICAgdml0ZTogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgICBjaGFrcmE6IGJvb2xlYW47XG4gICAgZHJpenpsZTogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEFuIGV4cGxpY2l0IGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHBsdWdpbiBlbnRyeSBwdWJsaXNoZXMgdGhlIHJvb3QgbWFuaWZlc3QgaXRzZWxmXG4gICAgICogKG5vIHBrZ1Jvb3QgcmVkaXJlY3Rpb24gYW5kIG5wbVB1Ymxpc2ggbm90IGRpc2FibGVkKS5cbiAgICAgKi9cbiAgICBucG1QdWJsaXNoZXNSb290OiBib29sZWFuO1xuICB9O1xuICBtaXNlVGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBUaGUgc2VtYW50aWMtcmVsZWFzZSBjb25maWcgZmlsZXMgd2JmeSBleHBlY3RzLCBpbiBjb3NtaWNvbmZpZydzIHJlc29sdXRpb24gb3JkZXIgKHRoZSBsZWFkaW5nXG4gKiBwYWNrYWdlLmpzb24gZW50cnkgaXMgY2hlY2tlZCBieSB0aGUgY2FsbGVyKS4gd2JmeSBnZW5lcmF0ZXMgLnJlbGVhc2VyYy5qc29uOyB0aGUgb3RoZXIgc3BlbGxpbmdzXG4gKiBhcmUgbGlzdGVkIG9ubHkgdG8gZGV0ZWN0IGEgaGFuZC13cml0dGVuIGNvbmZpZywgd2hvc2UgZm9ybWF0IEpTT04ucGFyc2UgY2Fubm90IHJlYWQgYW5kIHdob3NlXG4gKiBwbHVnaW4gbGlzdCBpcyB0aGVyZWZvcmUgc3RhdGljYWxseSB1bmluc3BlY3RhYmxlLlxuICovXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXM6IHsgZmlsZU5hbWU6IHN0cmluZzsganNvblBhcnNlYWJsZTogYm9vbGVhbiB9W10gPSBbXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qc29uJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55YW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgaXNSb290PzogYm9vbGVhbiB9XG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXQgPSBmYWxzZTtcbiAgICBsZXQgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgPSBmYWxzZTtcbiAgICAvLyBUaGUgRklSU1QgZXhpc3Rpbmcgc2VhcmNoIHBsYWNlIHdpbnMgKGNvc21pY29uZmlnIHNob3J0LWNpcmN1aXRzKSwgc28gYSBKUy9ZQU1ML1RTIGNvbmZpZ1xuICAgIC8vIG9yIGFuIGBleHRlbmRzYCBwcmVzZXQgbWFrZXMgdGhlIGVmZmVjdGl2ZSBwbHVnaW4gbGlzdCBzdGF0aWNhbGx5IHVuaW5zcGVjdGFibGUgKG1pcnJvcnNcbiAgICAvLyByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zIGluIHdiJ3MgcmVsZWFzZS50cykuIFRyZWF0aW5nIGl0IGFzIHVua25vd24ga2VlcHNcbiAgICAvLyBgcmVsZWFzZS5ucG1gIGNvbnNlcnZhdGl2ZWx5IHRydWUsIHNvIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyBuZXZlciBmb3JjZXNcbiAgICAvLyBgcHJpdmF0ZTogdHJ1ZWAgb24gYSBtb25vcmVwbyB0aGF0IGFjdHVhbGx5IHB1Ymxpc2hlcyB0byBucG0uXG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICB0eXBlIFJlbGVhc2VDb25maWcgPVxuICAgICAgICB8IHtcbiAgICAgICAgICAgIGJyYW5jaGVzPzogdW5rbm93bjtcbiAgICAgICAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5dKVtdO1xuICAgICAgICAgICAgZXh0ZW5kcz86IHVua25vd247XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIC8vIGNvc21pY29uZmlnIHNlYXJjaGVzIHBhY2thZ2UuanNvbidzIGByZWxlYXNlYCBrZXkgQkVGT1JFIGFueSByYy9jb25maWcgZmlsZVxuICAgICAgLy8gKHNlbWFudGljLXJlbGVhc2UgMjUgZGVsZWdhdGVzIHRvIGNvc21pY29uZmlnIDkncyBkZWZhdWx0IHNlYXJjaFBsYWNlcykuXG4gICAgICBsZXQgcmVsZWFzZUNvbmZpZyA9IChwYWNrYWdlSnNvbiBhcyB7IHJlbGVhc2U/OiBSZWxlYXNlQ29uZmlnIH0pLnJlbGVhc2U7XG4gICAgICBpZiAocmVsZWFzZUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgeyBmaWxlTmFtZSwganNvblBhcnNlYWJsZSB9IG9mIHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlcykge1xuICAgICAgICAgIGNvbnN0IHJlbGVhc2VyY1BhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhyZWxlYXNlcmNQYXRoKSkgY29udGludWU7XG4gICAgICAgICAgaWYgKCFqc29uUGFyc2VhYmxlKSB7XG4gICAgICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGAucmVsZWFzZXJjYCBhbmQgYC5jb25maWcvcmVsZWFzZXJjYCBtYXkgYWxzbyBob2xkIFlBTUw7IGEgSlNPTi5wYXJzZSBmYWlsdXJlIGxhbmRzXG4gICAgICAgICAgLy8gaW4gdGhlIGNhdGNoIGJlbG93IGFuZCBtYXJrcyB0aGUgcGx1Z2luIGxpc3QgdW5rbm93biBpbnN0ZWFkIG9mIHNpbGVudGx5IHJlcG9ydGluZ1xuICAgICAgICAgIC8vIFwibm8gcGx1Z2luc1wiLlxuICAgICAgICAgIHJlbGVhc2VDb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNQYXRoLCAndXRmOCcpKSBhcyBSZWxlYXNlQ29uZmlnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlIGFjY2VwdHMgYSBzY2FsYXIgYnJhbmNoIG9yIGJyYW5jaCBvYmplY3RzICh7IG5hbWUsIHByZXJlbGVhc2UsIC4uLiB9KTtcbiAgICAgIC8vIG5vcm1hbGl6ZSB0byBwbGFpbiBicmFuY2ggbmFtZXMgZm9yIGNvbnN1bWVycyBzdWNoIGFzIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IuXG4gICAgICBjb25zdCByYXdCcmFuY2hlcyA9IHJlbGVhc2VDb25maWc/LmJyYW5jaGVzO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0gKEFycmF5LmlzQXJyYXkocmF3QnJhbmNoZXMpID8gcmF3QnJhbmNoZXMgOiByYXdCcmFuY2hlcyA9PT0gdW5kZWZpbmVkID8gW10gOiBbcmF3QnJhbmNoZXNdKVxuICAgICAgICAubWFwKChicmFuY2g6IHVua25vd24pID0+XG4gICAgICAgICAgdHlwZW9mIGJyYW5jaCA9PT0gJ3N0cmluZycgPyBicmFuY2ggOiAoYnJhbmNoIGFzIHsgbmFtZT86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/Lm5hbWVcbiAgICAgICAgKVxuICAgICAgICAuZmlsdGVyKChicmFuY2hOYW1lKTogYnJhbmNoTmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIGJyYW5jaE5hbWUgPT09ICdzdHJpbmcnKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlbGVhc2VDb25maWc/LnBsdWdpbnMpKSB7XG4gICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbkVudHJ5IG9mIHJlbGVhc2VDb25maWcucGx1Z2lucykge1xuICAgICAgICAgIGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5PcHRpb25zXSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpID8gcGx1Z2luRW50cnkgOiBbcGx1Z2luRW50cnksIHVuZGVmaW5lZF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW5OYW1lICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMucHVzaChwbHVnaW5OYW1lKTtcbiAgICAgICAgICBpZiAocGx1Z2luTmFtZSAhPT0gJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpIGNvbnRpbnVlO1xuICAgICAgICAgIC8vIFdpdGggcGtnUm9vdCB0aGUgcGx1Z2luIHB1Ymxpc2hlcyBhbm90aGVyIG1hbmlmZXN0IChpdCByZXNvbHZlcyBwa2dSb290IGFnYWluc3QgdGhlXG4gICAgICAgICAgLy8gcmVwbyByb290LCBzbyBgLmAgYW5kIGAuL2AgYm90aCBtZWFuIHRoZSByb290IGl0c2VsZiksIGFuZCBucG1QdWJsaXNoOiBmYWxzZVxuICAgICAgICAgIC8vIGRpc2FibGVzIHB1Ymxpc2hpbmcgZW50aXJlbHk7IG9ubHkgdGhlIHJlbWFpbmluZyBzaGFwZSBwcm92ZXMgdGhlIFJPT1QgaXMgcHVibGlzaGVkLlxuICAgICAgICAgIGNvbnN0IHBrZ1Jvb3QgPSBwbHVnaW5PcHRpb25zPy5wa2dSb290O1xuICAgICAgICAgIGNvbnN0IHB1Ymxpc2hlc1Jvb3QgPVxuICAgICAgICAgICAgcGx1Z2luT3B0aW9ucz8ubnBtUHVibGlzaCAhPT0gZmFsc2UgJiZcbiAgICAgICAgICAgIChwa2dSb290ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKHR5cGVvZiBwa2dSb290ID09PSAnc3RyaW5nJyAmJiBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcGtnUm9vdCkgPT09IHBhdGgucmVzb2x2ZShkaXJQYXRoKSkpO1xuICAgICAgICAgIHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290IHx8PSBwdWJsaXNoZXNSb290O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlbGVhc2VDb25maWcgJiYgcmVsZWFzZUNvbmZpZy5leHRlbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgfVxuICAgIC8vIFdpdGhvdXQgYW4gZXhwbGljaXQgcGx1Z2luIGxpc3QsIHNlbWFudGljLXJlbGVhc2UncyBkZWZhdWx0IGxpc3QgYXBwbGllcywgd2hpY2ggaW5jbHVkZXNcbiAgICAvLyBAc2VtYW50aWMtcmVsZWFzZS9ucG0gYW5kIEBzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YiAobWlycm9ycyByZWxlYXNlUHVibGlzaGVzVG9OcG0gaW4gd2Inc1xuICAgIC8vIHJlbGVhc2UudHMpLlxuICAgIGNvbnN0IHVzZXNTZW1hbnRpY1JlbGVhc2UgPSAhIShcbiAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMCB8fFxuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgKTtcblxuICAgIC8vIFRoZSBjYWxsZXIgbWF5IGNsYXNzaWZ5IGV4cGxpY2l0bHkgKGluZGV4LnRzIHBhc3NlcyBmYWxzZSBmb3IgZXZlcnkgZGlzY292ZXJlZCB3b3Jrc3BhY2UsXG4gICAgLy8gaW5jbHVkaW5nIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyopOyB0aGUgaGV1cmlzdGljIGNsYXNzaWZpZXMgdGhlIENMSSBlbnRyeVxuICAgIC8vIHBhdGggaXRzZWxmLCBzbyBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gIGFuZCBgd2JmeSA8cmVwbz4vYXBwcy88YXBwPmAga2VlcCB0aGVpciBjaGlsZFxuICAgIC8vIGNsYXNzaWZpY2F0aW9uLlxuICAgIGNvbnN0IGlzUm9vdCA9IG9wdGlvbnM/LmlzUm9vdCA/PyAhaXNXb3Jrc3BhY2VPZkVuY2xvc2luZ1Jvb3QoZGlyUGF0aCk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIC8vIEZldGNoIHZpc2liaWxpdHkgZm9yIHRoZSBDTEkgZW50cnkgZXZlbiB3aGVuIGl0IGlzIGEgd29ya3NwYWNlIGNoaWxkIChgd2JmeVxuICAgIC8vIDxyZXBvPi9wYWNrYWdlcy88YXBwPmApOiBnZW5lcmF0b3JzIHJlYWQgaXNQdWJsaWNSZXBvIGZyb20gdGhlaXIgcm9vdENvbmZpZyBwYXJhbWV0ZXIsXG4gICAgLy8gd2hpY2ggSVMgdGhlIGNoaWxkIGNvbmZpZyBpbiB0aGF0IGludm9jYXRpb24sIHNvIGEgc3R1YiBgZmFsc2VgIHRoZXJlIHdvdWxkIGRyb3AgdGhlXG4gICAgLy8gcHVibGljLXJlcG8gcHVibGlzaENvbmZpZyBoYW5kbGluZy4gRGlzY292ZXJlZCBjaGlsZHJlbiAob3B0aW9ucy5pc1Jvb3QgPT09IGZhbHNlKSBzdGlsbFxuICAgIC8vIHNraXAgdGhlIGZldGNoIOKAlCB0aGV5IGluaGVyaXQgdGhlIGVuY2xvc2luZyByb290J3MgdmlzaWJpbGl0eSB2aWEgcm9vdENvbmZpZyBpbnN0ZWFkLlxuICAgIGlmIChvcHRpb25zPy5pc1Jvb3QgIT09IGZhbHNlKSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9GdWxsTmFtZSA9IHR5cGVvZiByZXBvSW5mbz8uZnVsbF9uYW1lID09PSAnc3RyaW5nJyA/IHJlcG9JbmZvLmZ1bGxfbmFtZSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb0F1dGhvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXBvRnVsbE5hbWUpIHtcbiAgICAgIGNvbnN0IHJlcG9QYXJ0cyA9IHJlcG9GdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlcG9QYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXBvQXV0aG9yID0gcmVwb1BhcnRzWzBdO1xuICAgICAgICByZXBvTmFtZSA9IHJlcG9QYXJ0c1sxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gT25seSB0aGUgcm9vdCBmZXRjaGVzIHJlcG8gaW5mbywgYW5kIHRoYXQgZmV0Y2ggbmVlZHMgbmV0d29yayBhbmQgYSB0b2tlbiwgc28gaWRlbnRpdHktZGVyaXZlZFxuICAgIC8vIGZsYWdzIGJlbG93IHdvdWxkIG90aGVyd2lzZSBiZSBmYWxzZSBmb3IgZXZlcnkgd29ya3NwYWNlIHBhY2thZ2UgYW5kIGZvciBldmVyeSBvZmZsaW5lIG9yXG4gICAgLy8gcmF0ZS1saW1pdGVkIHJ1bi4gVGhlIGdpdCByZW1vdGUgYW5zd2VycyB0aGUgc2FtZSBxdWVzdGlvbiBsb2NhbGx5LCBmb3IgZXZlcnkgcGFja2FnZS5cbiAgICBpZiAoIXJlcG9BdXRob3IgfHwgIXJlcG9OYW1lKSB7XG4gICAgICBbcmVwb0F1dGhvciwgcmVwb05hbWVdID0gYXdhaXQgcmVzb2x2ZUxvY2FsUmVwb0lkZW50aXR5KGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG4gICAgLy8gQnVpbHQgZnJvbSB0aGUgUkVTT0xWRUQgaWRlbnRpdHkgc28gd29ya3NwYWNlIHBhY2thZ2VzIGFuZCBvZmZsaW5lIHJ1bnMgYWxzbyBnZXQgaXQ7IGNvbnN1bWVycyBkZXJpdmVcbiAgICAvLyB0aGUgb3duZXIgZnJvbSB0aGlzIGZpZWxkIChlLmcuIHRvIHNldCBgYXV0aG9yYCkuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHJlcG9BdXRob3IgJiYgcmVwb05hbWUgPyBgZ2l0aHViOiR7cmVwb0F1dGhvcn0vJHtyZXBvTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIC8vIFRhdXJpIG9mZmljaWFsbHkgc3VwcG9ydHMgSlNPTiwgSlNPTjUsIGFuZCBUT01MIGNvbmZpZ3VyYXRpb24gZm9ybWF0cy5cbiAgICBjb25zdCBkb2VzQ29udGFpblRhdXJpQ29uZmlnID0gWyd0YXVyaS5jb25mLmpzb24nLCAndGF1cmkuY29uZi5qc29uNScsICdUYXVyaS50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3JjLXRhdXJpJywgZmlsZU5hbWUpKVxuICAgICk7XG4gICAgLy8gUm9vdC1sZXZlbCBcIkluUGFja2FnZXNcIiBzaWduYWxzIG11c3Qgc2VlIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy4gYXBwcy8qKSwgbm90XG4gICAgLy8ganVzdCB0aGUgY29udmVudGlvbmFsIHBhY2thZ2VzLyogZGlyZWN0b3J5LCBzbyBzY2FuIGVhY2ggZGlzY292ZXJlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHdvcmtzcGFjZVN1YkRpclBhdGhzID0gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoe1xuICAgICAgZGlyUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzID0gKHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAgIHdvcmtzcGFjZVN1YkRpclBhdGhzLnNvbWUoKHdvcmtzcGFjZVN1YkRpclBhdGgpID0+IGNvbnRhaW5zQW55KHBhdHRlcm4sIHdvcmtzcGFjZVN1YkRpclBhdGgpKTtcbiAgICBjb25zdCBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnID0gZGV0ZWN0V3JhbmdsZXJDb25maWcoZGlyUGF0aCk7XG4gICAgY29uc3Qgd29ya2Zsb3dDb250ZW50cyA9IHJlYWRXb3JrZmxvd0ZpbGVDb250ZW50cyhkaXJQYXRoKTtcbiAgICBjb25zdCBpbXBvcnRzUGxheXdyaWdodEF0UnVudGltZSA9IGRldGVjdFBsYXl3cmlnaHRSdW50aW1lSW1wb3J0KGRpclBhdGgpO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlcG9WaXNpYmlsaXR5S25vd246IHR5cGVvZiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNDbG91ZGZsYXJlOiBkZXRlY3RDbG91ZGZsYXJlKHBhY2thZ2VKc29uLCBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnLCB3b3JrZmxvd0NvbnRlbnRzKSxcbiAgICAgIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcsXG4gICAgICBpc1JhaWx3YXk6IGRldGVjdFJhaWx3YXkoZGlyUGF0aCwgcGFja2FnZUpzb24sIHdvcmtmbG93Q29udGVudHMpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGRldGVjdElzV2lsbEJvb3N0ZXJDb25maWdzKGRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCwgcmVwb05hbWUpLFxuICAgICAgY2FyZ29Ub21sRGlyUGF0aHM6IGZpbmRDYXJnb1RvbWxEaXJQYXRocyhkaXJQYXRoKSxcbiAgICAgIC8vIEFsc28gaG9ub3IgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIGJleW9uZCBwYWNrYWdlcy8qIChlLmcuIGFwcHMvKik6IHRyZWF0aW5nIGFuXG4gICAgICAvLyBhcHBzLyotb25seSBtb25vcmVwbyBhcyBhIHBsYWluIHBhY2thZ2Ugd291bGQgZGVsZXRlIGl0cyBgd29ya3NwYWNlc2AgZGVjbGFyYXRpb24gaW5cbiAgICAgIC8vIGdlbmVyYXRlUGFja2FnZUpzb24gYW5kIHNraXAgbW9ub3JlcG8tb25seSBjb252ZW50aW9ucyBzdWNoIGFzIHJvb3QgYHByaXZhdGU6IHRydWVgLlxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSB8fCB3b3Jrc3BhY2VTdWJEaXJQYXRocy5sZW5ndGggPiAwLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5VdkxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd1di5sb2NrJykpLFxuICAgICAgLy8gUmVjdXJzaXZlIGxpa2UgZG9lc0NvbnRhaW5KYXZhOiBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3JpZXMga2VlcCBsYW5ndWFnZSBkaXJlY3Rvcmllc1xuICAgICAgLy8gKGUuZy4gUHl0aG9uIHRvb2xpbmcgb3IgTWF2ZW4gbW9kdWxlcykgb3V0c2lkZSB0aGUgcm9vdCBhbmQgb3V0c2lkZSBkZWNsYXJlZCB3b3Jrc3BhY2VzLlxuICAgICAgZG9lc0NvbnRhaW5QeXRob25Mb2NrQW55d2hlcmU6IGNvbnRhaW5zQW55KCcqKi97cG9ldHJ5LmxvY2ssdXYubG9ja30nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sQW55d2hlcmU6IGNvbnRhaW5zQW55KCcqKi9wb20ueG1sJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5TbGlkZXZNZDogY29udGFpbnNBbnkoJyoqLyouc2xpZGV2Lm1kJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKFxuICAgICAgICAnc3JjLXRhdXJpL3t0YXVyaS5jb25mLmpzb24sdGF1cmkuY29uZi5qc29uNSxUYXVyaS50b21sfSdcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhOiBjb250YWluc0FueSgnKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnKSxcbiAgICAgIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCcqKi8qLmphdmEnKSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGNoYWtyYTogISFkZXZEZXBlbmRlbmNpZXNbJ0BjaGFrcmEtdWkvY2xpJ10sXG4gICAgICAgIGRyaXp6bGU6ICEhZGVwZW5kZW5jaWVzWydkcml6emxlLW9ybSddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydkcml6emxlLWtpdCddLFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGdlbkkxOG5UczogISFkZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICByZWFjdDogISFkZXBlbmRlbmNpZXMucmVhY3QsXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzLm5leHQsXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0LFxuICAgICAgICBwbGF5d3JpZ2h0UnVudGltZTogaW1wb3J0c1BsYXl3cmlnaHRBdFJ1bnRpbWUsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIHNsaWRldjogISFkZXBlbmRlbmNpZXNbJ0BzbGlkZXYvY2xpJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BzbGlkZXYvY2xpJ10sXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgdGF1cmk6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2FwaSddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2FwaSddIHx8XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2NsaSddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2NsaSddIHx8XG4gICAgICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgICAgdmluZXh0OiAhIWRlcGVuZGVuY2llcy52aW5leHQgfHwgISFkZXZEZXBlbmRlbmNpZXMudmluZXh0LFxuICAgICAgICB2aXRlOiAhIWRlcGVuZGVuY2llcy52aXRlIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpdGUsXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0XG4gICAgICAgICAgPyByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykgfHwgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgICAgICAgOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXRcbiAgICAgICAgICA/IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSB8fCByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICAgICAgICA6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIG5wbVB1Ymxpc2hlc1Jvb3Q6IHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290LFxuICAgICAgfSxcbiAgICAgIG1pc2VUYXNrczogYXdhaXQgcmVhZE1pc2VUYXNrcyhkaXJQYXRoKSxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCB8fFxuICAgICAgLy8gQSByZXBvc2l0b3J5IGNhbiBsZWdpdGltYXRlbHkgY29udGFpbiBvbmx5IGRvY3VtZW50YXRpb24uIEl0cyBHaXQgbWV0YWRhdGEgaXMgZW5vdWdoIHRvXG4gICAgICAvLyBlc3RhYmxpc2ggdGhhdCB0aGUgQ0xJIHRhcmdldCBpcyBhIHByb2plY3Qgcm9vdDsgcmVxdWlyaW5nIGEgbGFuZ3VhZ2UgbWFuaWZlc3QgaGVyZSB3b3VsZFxuICAgICAgLy8gbWFrZSB3YmZ5IHVuYWJsZSB0byBjcmVhdGUgdGhlIHBhY2thZ2UuanNvbiB0aGF0IGl0IG1hbmFnZXMgZm9yIHN1Y2ggcmVwb3NpdG9yaWVzLiBCb3RoXG4gICAgICAvLyBvcmRpbmFyeSBjaGVja291dHMgKGAuZ2l0YCBkaXJlY3RvcnkpIGFuZCB3b3JrdHJlZXMgKGAuZ2l0YCBmaWxlKSBzYXRpc2Z5IHRoaXMgY2hlY2suXG4gICAgICAoY29uZmlnLmlzUm9vdCAmJiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLmdpdCcpKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIHdiZnkgbWFuYWdlcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGZvciB0aGUgcGFja2FnZS4gVGhlIGZpbGUgaXMgZ2l0aWdub3JlZCBhbmQgdW50cmFja2VkXG4gKiBiZWNhdXNlIHRoZSBgd2IgZ2VuLWNvZGVgIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0IG9uIGV2ZXJ5IGluc3RhbGwsIHNvIHRoZSBwYWNrYWdlIGhhcyB0byBvd24gYSB3cmFuZ2xlclxuICogY29uZmlnIChgd3JhbmdsZXIgdHlwZXNgIGV4aXRzIG5vbi16ZXJvIHdpdGhvdXQgb25lKSwgdG8gZGVwZW5kIG9uIHdyYW5nbGVyIChhIHBhY2thZ2UgZGVwbG95aW5nIHZpYSBhXG4gKiBDSSBhY3Rpb24gY2Fubm90IHJlc29sdmUgdGhlIGNvbW1hbmQpLCBhbmQgdG8gY29uc3VtZSB0aGUgZ2VuZXJhdGVkIGZpbGUuXG4gKlxuICogSU5WQVJJQU5UIOKAlCB0aGlzIGRlY2lzaW9uIG11c3QgY29udmVyZ2UgYWNyb3NzIG1hY2hpbmVzIGhvbGRpbmcgdGhlIHNhbWUgY29tbWl0LiBJdCBtdXN0IE5FVkVSIGNvbnN1bHRcbiAqIGdpdGlnbm9yZWQgZmlsZXMgKGAuZGV2LnZhcnMqYCwgYC5lbnYqYCwgLi4uKSwgd2hpY2ggYHdiIHN0YXJ0YCBhbmQgYHdiIGRlcGxveWAgY3JlYXRlIHJvdXRpbmVseSBhbmQgd2hpY2hcbiAqIHRoZXJlZm9yZSBzdGF5IHVudHJhY2tlZCBvbiBkZXYgbWFjaGluZXMgZm9yZXZlcjogYSBmb3JtZXIgY2hlY2sgdGhhdCB0cmVhdGVkIHRoZW0gYXMgaXJyZXByb2R1Y2libGUgaW5wdXRzXG4gKiBtYWRlIHdiZnkgcnVucyBvbiBkZXYgbWFjaGluZXMgcmUtdHJhY2sgdGhlIH4xNWstbGluZSBnZW5lcmF0ZWQgZmlsZSB0aGF0IHJ1bnMgZnJvbSBjbGVhbiBjaGVja291dHMgaGFkXG4gKiB1bnRyYWNrZWQsIG9zY2lsbGF0aW5nIGV0ZXJuYWxseSAoZS5nLiBhaS1nYW1lLWJ1aWxkZXIgIzY4NCDihpIgIzc0NikuIFJlYWRpbmcgY29tbWl0dGFibGUgcmVwb3NpdG9yeSBmaWxlc1xuICogZnJvbSB0aGUgd29ya2luZyB0cmVlICh0aGUgd3JhbmdsZXIgY29uZmlnLCBwYWNrYWdlLmpzb24sIHRzY29uZmlnIOKAlCBhcyBldmVyeSB3YmZ5IGdlbmVyYXRvciBkb2VzKSBpcyBmaW5lOlxuICogYW55IGRpdmVyZ2VuY2UgdGhlcmUgaXMgdHJhbnNpZW50IGFuZCBkaXNhcHBlYXJzIG9uY2UgdGhlIGZpbGUgaXMgY29tbWl0dGVkIG9yIHJlbW92ZWQuXG4gKiBUaGUgaGF6YXJkIHRoYXQgY2hlY2sgZ3VhcmRlZCBhZ2FpbnN0IG5vIGxvbmdlciBleGlzdHM6IGB3YiBnZW4tY29kZWAgcnVucyBgd3JhbmdsZXIgdHlwZXMgLS1lbnYtZmlsZWAgd2l0aFxuICogYSBrZXkgc3R1YiBkZXJpdmVkIHNvbGVseSBmcm9tIHRoZSBjb21taXR0ZWQgZm5veC50b21sIChzZWUgd2IncyB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiksIHNvIGxvY2FsIGRvdGVudlxuICogZmlsZXMgbmV2ZXIgaW5mbHVlbmNlIHRoZSBnZW5lcmF0ZWQgYEVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiBoYXNXcmFuZ2xlckRlcGVuZGVuY3kocGFja2FnZUpzb24pICYmIGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdwYWNrYWdlSnNvbic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2NyaXB0cyA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChzY3JpcHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdCk7XG4gICAgY29uc3QgaGFzTm9uQ2Fub25pY2FsV2JHZW5Db2RlID0gc2VnbWVudHM/LnNvbWUoKHNlZ21lbnQpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBzZWdtZW50LnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgL14oPzooPzpidW58YnVueCkoPzogLS1idW4pPyg/OiBydW4pPyApP3diIGdlbi1jb2RlJC91LnRlc3Qobm9ybWFsaXplZCkgJiZcbiAgICAgICAgY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMsIHRydWUpID09PSAnY3VzdG9tJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoaGFzTm9uQ2Fub25pY2FsV2JHZW5Db2RlKSByZXR1cm4gYCR7bmFtZX0gbXVzdCB1c2UgdGhlIGNhbm9uaWNhbCBidW4gd2IgZ2VuLWNvZGUgY29tbWFuZGA7XG4gIH1cbiAgLy8gT25seSBgYnVuIHJ1biA8c2NyaXB0PmAgaXMgcmVjb2duaXplZCBhcyBhIHdyYXBwZXI7IGFub3RoZXIgcnVubmVyIHNwZWxsaW5nIHdvdWxkIGdldCBhIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiBhcHBlbmRlZCBuZXh0IHRvIGl0IGFuZCBydW4gZXZlcnkgZ2VuZXJhdG9yIHR3aWNlIHBlciBpbnN0YWxsLiBXaXRob3V0IGEgZ2VuLWNvZGVcbiAgLy8gcGlwZWxpbmUgbm90aGluZyBpcyBhcHBlbmRlZCwgc28gdGhlIHNwZWxsaW5nIGlzIGlycmVsZXZhbnQgdGhlcmUuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdHMucG9zdGluc3RhbGwgPz8gJycpID8/IFtdKSB7XG4gICAgY29uc3Qgc2NyaXB0TmFtZSA9IC9eKD86YnVufGJ1bngpKD86XFxzKy0tYnVuKT8oPzpcXHMrcnVuKT9cXHMrKFxcUyspJC91LmV4ZWMoc2VnbWVudCk/LlsxXTtcbiAgICBjb25zdCB0YXJnZXQgPSBzY3JpcHROYW1lID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgIGlmIChcbiAgICAgIHRhcmdldCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBzZWdtZW50ICE9PSBgYnVuIHJ1biAke3NjcmlwdE5hbWV9YCAmJlxuICAgICAgKHNjcmlwdHNbJ2dlbi1jb2RlJ10gIT09IHVuZGVmaW5lZCB8fCB0YXJnZXQuaW5jbHVkZXMoJ3diIGdlbi1jb2RlJykpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYHBvc3RpbnN0YWxsIG11c3QgaW52b2tlIHRoZSAke3NjcmlwdE5hbWV9IHNjcmlwdCBhcyBidW4gcnVuICR7c2NyaXB0TmFtZX1gO1xuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgLyg/Ol58JiYpXFxzKig/Om5wbXxucHh8cG5wbXx5YXJuKVxccysoPzpydW4oPzotc2NyaXB0KT9cXHMrKT8oPzpnZW4tY29kZXx3YlxccytnZW4tY29kZSlcXHMqKD86JiZ8JCkvdS50ZXN0KFxuICAgICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA/PyAnJ1xuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuICdwb3N0aW5zdGFsbCBtdXN0IHVzZSBidW4gd2IgZ2VuLWNvZGUgaW5zdGVhZCBvZiBhIG5vbi1CdW4gZ2VuLWNvZGUgcnVubmVyJztcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAod3JhbmdsZXJUeXBlc1RleHRQYXR0ZXJuLnRlc3Qoc2NyaXB0KSkgcmV0dXJuIGAke25hbWV9IG11c3QgdXNlIGJ1biB3YiBnZW4tY29kZSBpbnN0ZWFkIG9mIHdyYW5nbGVyIHR5cGVzYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNXcmFuZ2xlckRlcGVuZGVuY3kocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBbXG4gICAgcGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5vcHRpb25hbERlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8ucGVlckRlcGVuZGVuY2llcyxcbiAgXS5zb21lKChkZXBlbmRlbmNpZXMpID0+IGRlcGVuZGVuY2llcz8ud3JhbmdsZXIgIT09IHVuZGVmaW5lZCk7XG59XG5cbmNvbnN0IHNoZWxsV29yZFBhdHRlcm4gPSBTdHJpbmcucmF3YCg/OlwiKD86XFxcXC58W15cIlxcXFxdKSpcInwnKD86XFxcXC58W14nXFxcXF0pKid8KD86XFxcXC58W15cXHNcIidcXFxcXSkrKWA7XG5jb25zdCB3cmFuZ2xlck9wdGlvblBhdHRlcm4gPSBTdHJpbmcucmF3YFxccystLT9bQS1aYS16XVtcXHctXSooPzo9JHtzaGVsbFdvcmRQYXR0ZXJufXxcXHMrKD8hLXx0eXBlc1xcYikke3NoZWxsV29yZFBhdHRlcm59KT9gO1xuY29uc3Qgd3JhbmdsZXJUeXBlc1RleHRQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgU3RyaW5nLnJhd2BbXCInXT9cXGJ3cmFuZ2xlcig/OkBbXlxcc1wiJ10rKT9cXGJbXCInXT8oPzoke3dyYW5nbGVyT3B0aW9uUGF0dGVybn0pKlxccyt0eXBlc1xcYmAsXG4gICd1J1xuKTtcblxuLyoqXG4gKiBBIHBhY2thZ2Ugd2hvc2UgVHlwZVNjcmlwdCBwcm9qZWN0IGNhbm5vdCBpbmNsdWRlIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgKGUuZy4gb25lIG9uIGEgaGFuZC1tYWludGFpbmVkXG4gKiBtaW5pbWFsIGBFbnZgIHdpdGggYHR5cGVzOiBbXCJidW5cIl1gLCB0aGUgc3RhbmRhcmQgZXNjYXBlIHdoZW4gdGhlIGFtYmllbnQgd3JhbmdsZXIgZ2xvYmFscyBjb25mbGljdCB3aXRoIHRoZVxuICogYEB0eXBlcy9idW5gIGdsb2JhbHMgaXRzIHRlc3RzIG5lZWQpIGdhaW5zIG5vdGhpbmcgZnJvbSByZWdlbmVyYXRpbmcgdGhlIH41MDBLQiBmaWxlIG9uIGV2ZXJ5IGluc3RhbGwsIHNvIHdiZnlcbiAqIGxlYXZlcyBzdWNoIHBhY2thZ2VzIHVubWFuYWdlZCBpbnN0ZWFkIG9mIHJlLWFkZGluZyB0aGUgZ2VuZXJhdGlvbiBzdGVwLiBDb25zdW1wdGlvbiBpcyBkZXRlY3RlZCB0d28gd2F5czpcbiAqIGEgdGV4dHVhbCBgd29ya2VyLWNvbmZpZ3VyYXRpb25gIHJlZmVyZW5jZSBpbiBhbnkgdHJhY2tlZCBmaWxlIG9mIHRoZSBwYWNrYWdlIChjb3ZlcnMgaW1wb3J0cywgdHJpcGxlLXNsYXNoXG4gKiByZWZlcmVuY2VzLCBhbmQgZXhwbGljaXQgdHNjb25maWcgZW50cmllcyksIG9yIGEgYGZpbGVzYC9gaW5jbHVkZWAvYGV4Y2x1ZGVgIHNldCB0aGF0IGNhbiBtYXRjaCB0aGUgZmlsZSDigJRcbiAqIHJlc29sdmVkIHRocm91Z2ggcmVsYXRpdmUgYGV4dGVuZHNgIGNoYWlucyB3aXRoIGVhY2ggcGF0dGVybiBrZXB0IHJlbGF0aXZlIHRvIHRoZSBjb25maWcgdGhhdCBkZWNsYXJlZCBpdCxcbiAqIG1hdGNoaW5nIHRzYy4gV2hlbmV2ZXIgdGhlIGVmZmVjdGl2ZSBzZXQgY2Fubm90IGJlIGRldGVybWluZWQgKG1pc3Npbmcgb3IgdW5wYXJzZWFibGUgdHNjb25maWcsIHBhY2thZ2UtbmFtZVxuICogYGV4dGVuZHNgIHByZXNldHMsIG9yIFR5cGVTY3JpcHQncyBkZWZhdWx0IGAqKmAgaW5jbHVzaW9uKSwgdGhlIGN1cnJlbnQgbWFuYWdlZCBiZWhhdmlvciBpcyBrZXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnPik6IGJvb2xlYW4ge1xuICAvLyBgZ2l0IGdyZXBgIHNlYXJjaGVzIHRyYWNrZWQgZmlsZXMgb25seSwgc28gdGhlIGdpdGlnbm9yZWQgZ2VuZXJhdGVkIGZpbGUgaXRzZWxmIG5ldmVyIG1hdGNoZXMuXG4gIC8vIHdiZnkncyBvd24gbWFuYWdlZCBhcnRpZmFjdHMgYXJlIGV4Y2x1ZGVkOiB0aGUgYC5naXRpZ25vcmVgIHJ1bGUgKGAvd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c2ApXG4gIC8vIHdiZnkgY29tbWl0dGVkIHdoaWxlIGl0IG1hbmFnZWQgdGhlIHBhY2thZ2UgbXVzdCBub3QgY291bnQgYXMgY29uc3VtcHRpb24sIG9yIGEgb25jZS1tYW5hZ2VkXG4gIC8vIHBhY2thZ2UgY291bGQgbmV2ZXIgb3B0IG91dC5cbiAgY29uc3QgZ3JlcFJlc3VsdCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnZ2l0JyxcbiAgICAvLyB0c2NvbmZpZyBmaWxlcyBhcmUgY2xhc3NpZmllZCBieSB0aGUgcmVzb2x2ZWQgZmlsZXMvaW5jbHVkZS9leGNsdWRlIGxvZ2ljIGJlbG93IOKAlCBhIHRleHR1YWxcbiAgICAvLyBoaXQgdGhlcmUgKGUuZy4gYW4gYGV4Y2x1ZGVgIGVudHJ5KSBtdXN0IG5vdCBjb3VudCBhcyBjb25zdW1wdGlvbi5cbiAgICBbXG4gICAgICAnZ3JlcCcsXG4gICAgICAnLWwnLFxuICAgICAgJ3dvcmtlci1jb25maWd1cmF0aW9uJyxcbiAgICAgICctLScsXG4gICAgICAnLicsXG4gICAgICAnOihleGNsdWRlKS5naXRpZ25vcmUnLFxuICAgICAgJzooZXhjbHVkZSkuZ2l0YXR0cmlidXRlcycsXG4gICAgICBTdHJpbmcucmF3YDooZ2xvYixleGNsdWRlKSoqL3RzY29uZmlnKi5qc29uYCxcbiAgICBdLFxuICAgIGNvbmZpZy5kaXJQYXRoXG4gICk7XG4gIGlmIChncmVwUmVzdWx0LnRyaW0oKSkgcmV0dXJuIHRydWU7XG5cbiAgY29uc3Qgd29ya2VyVHlwZXNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cycpO1xuICBjb25zdCBmaWxlU2V0ID0gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyksIGNvbmZpZy5kaXJQYXRoLCA1KTtcbiAgaWYgKCFmaWxlU2V0KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbWF0Y2hlcyA9IChwYXR0ZXJuU2V0OiBUc2NvbmZpZ1BhdHRlcm5TZXQgfCB1bmRlZmluZWQpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXBhdHRlcm5TZXQgfHwgIUFycmF5LmlzQXJyYXkocGF0dGVyblNldC5wYXR0ZXJucykpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdHRlcm5TZXQuYmFzZURpclBhdGgsIHdvcmtlclR5cGVzUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgcmV0dXJuIHBhdHRlcm5TZXQucGF0dGVybnMuc29tZSgocGF0dGVybikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gYCR7Y29uZmlnRGlyfWAtcHJlZml4ZWQgcGF0dGVybnMgd2VyZSBleHBhbmRlZCB0byBhYnNvbHV0ZSBwYXRocyBhdCByZXNvbHZlIHRpbWUuXG4gICAgICBpZiAocGF0aC5pc0Fic29sdXRlKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuLCB3b3JrZXJUeXBlc1BhdGgsIHBhdHRlcm5TZXQuZXhwYW5kc0RpcmVjdG9yaWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm4sIHJlbGF0aXZlUGF0aCwgcGF0dGVyblNldC5leHBhbmRzRGlyZWN0b3JpZXMpO1xuICAgIH0pO1xuICB9O1xuICAvLyBgZmlsZXNgIGVudHJpZXMgYXJlIGFsd2F5cyBwYXJ0IG9mIHRoZSBwcm9ncmFtLCBldmVuIHdoZW4gYGV4Y2x1ZGVgIG1hdGNoZXMgdGhlbS5cbiAgaWYgKG1hdGNoZXMoZmlsZVNldC5maWxlcykpIHJldHVybiB0cnVlO1xuICBpZiAobWF0Y2hlcyhmaWxlU2V0LmV4Y2x1ZGUpKSByZXR1cm4gZmFsc2U7XG4gIC8vIE5laXRoZXIgaW5jbHVkZSBub3IgZmlsZXMgZGVjbGFyZWQ6IFR5cGVTY3JpcHQncyBkZWZhdWx0IGAqKmAgaW5jbHVzaW9uIGNvdmVycyB0aGUgZmlsZS5cbiAgaWYgKCFmaWxlU2V0LmluY2x1ZGUgJiYgIWZpbGVTZXQuZmlsZXMpIHJldHVybiB0cnVlO1xuICByZXR1cm4gbWF0Y2hlcyhmaWxlU2V0LmluY2x1ZGUpO1xufVxuXG5pbnRlcmZhY2UgVHNjb25maWdQYXR0ZXJuU2V0IHtcbiAgLyoqIERpcmVjdG9yeSBvZiB0aGUgY29uZmlnIHRoYXQgZGVjbGFyZWQgdGhlIHBhdHRlcm5zOyB0c2MgcmVzb2x2ZXMgdGhlbSByZWxhdGl2ZSB0byBpdC4gKi9cbiAgYmFzZURpclBhdGg6IHN0cmluZztcbiAgLyoqIGluY2x1ZGUvZXhjbHVkZSB0cmVhdCBhbiBleHRlbnNpb25sZXNzIG5vbi1nbG9iIHBhdHRlcm4gYXMgYSBkaXJlY3Rvcnkgc3VidHJlZTsgYGZpbGVzYCBkb2VzIG5vdC4gKi9cbiAgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuO1xuICBwYXR0ZXJuczogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFRzY29uZmlnRmlsZVNldCB7XG4gIGV4Y2x1ZGU/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG4gIGZpbGVzPzogVHNjb25maWdQYXR0ZXJuU2V0O1xuICBpbmNsdWRlPzogVHNjb25maWdQYXR0ZXJuU2V0O1xufVxuXG4vKiogUmVzb2x2ZXMgZmlsZXMvaW5jbHVkZS9leGNsdWRlIHRocm91Z2ggcmVsYXRpdmUgYGV4dGVuZHNgIGNoYWluczsgdW5kZWZpbmVkIHdoZW4gdW5yZWFkYWJsZS4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbnN1bWVyRGlyUGF0aDogc3RyaW5nLFxuICByZW1haW5pbmdEZXB0aDogbnVtYmVyXG4pOiBUc2NvbmZpZ0ZpbGVTZXQgfCB1bmRlZmluZWQge1xuICBpZiAocmVtYWluaW5nRGVwdGggPD0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHRzY29uZmlnID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjx7XG4gICAgZXhjbHVkZT86IHVua25vd247XG4gICAgZXh0ZW5kcz86IHVua25vd247XG4gICAgZmlsZXM/OiB1bmtub3duO1xuICAgIGluY2x1ZGU/OiB1bmtub3duO1xuICB9Pihjb250ZW50KTtcbiAgaWYgKCF0c2NvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIC8vIGAke2NvbmZpZ0Rpcn1gIHJlc29sdmVzIHRvIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIFJPT1QgKGNvbnN1bWluZykgY29uZmlnLCB3aGVyZXZlciBpdCBhcHBlYXJzLlxuICBjb25zdCB0b1BhdHRlcm5TZXQgPSAocGF0dGVybnM6IHVua25vd24sIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbik6IFRzY29uZmlnUGF0dGVyblNldCB8IHVuZGVmaW5lZCA9PlxuICAgIEFycmF5LmlzQXJyYXkocGF0dGVybnMpXG4gICAgICA/IHtcbiAgICAgICAgICBiYXNlRGlyUGF0aDogZGlyUGF0aCxcbiAgICAgICAgICBleHBhbmRzRGlyZWN0b3JpZXMsXG4gICAgICAgICAgcGF0dGVybnM6IHBhdHRlcm5zLm1hcCgocGF0dGVybikgPT5cbiAgICAgICAgICAgIHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJyAmJiBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyR7Y29uZmlnRGlyfScpXG4gICAgICAgICAgICAgID8gcGF0aC5qb2luKGNvbnN1bWVyRGlyUGF0aCwgcGF0dGVybi5zbGljZSgnJHtjb25maWdEaXJ9Jy5sZW5ndGgpKVxuICAgICAgICAgICAgICA6IHBhdHRlcm5cbiAgICAgICAgICApLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZmlsZVNldDogVHNjb25maWdGaWxlU2V0ID0ge1xuICAgIGV4Y2x1ZGU6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5leGNsdWRlLCB0cnVlKSxcbiAgICBmaWxlczogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmZpbGVzLCBmYWxzZSksXG4gICAgaW5jbHVkZTogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmluY2x1ZGUsIHRydWUpLFxuICB9O1xuICBjb25zdCBwYXJlbnRzID1cbiAgICB0eXBlb2YgdHNjb25maWcuZXh0ZW5kcyA9PT0gJ3N0cmluZycgPyBbdHNjb25maWcuZXh0ZW5kc10gOiBBcnJheS5pc0FycmF5KHRzY29uZmlnLmV4dGVuZHMpID8gdHNjb25maWcuZXh0ZW5kcyA6IFtdO1xuICAvLyBXaXRoIGFuIGBleHRlbmRzYCBhcnJheSwgbGF0ZXIgZW50cmllcyBvdmVycmlkZSBlYXJsaWVyIG9uZXMsIGFuZCB0aGUgY2hpbGQgb3ZlcnJpZGVzIGFsbCDigJRcbiAgLy8gc28gZmlsbCBlYWNoIHN0aWxsLW1pc3Npbmcga2V5IGZyb20gdGhlIGxhc3QgcGFyZW50IHRoYXQgZGVmaW5lcyBpdC5cbiAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cy50b1JldmVyc2VkKCkpIHtcbiAgICBpZiAoZmlsZVNldC5leGNsdWRlICYmIGZpbGVTZXQuZmlsZXMgJiYgZmlsZVNldC5pbmNsdWRlKSBicmVhaztcbiAgICAvLyBQYWNrYWdlLW5hbWUgZXh0ZW5kcyAoZS5nLiBgQHRzY29uZmlnL2J1bmApIGFyZSBjb21waWxlck9wdGlvbnMgcHJlc2V0cyB3aXRob3V0IGZpbGUgc2V0cy5cbiAgICBpZiAodHlwZW9mIHBhcmVudCAhPT0gJ3N0cmluZycgfHwgIXBhcmVudC5zdGFydHNXaXRoKCcuJykpIGNvbnRpbnVlO1xuICAgIGxldCBwYXJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIHBhcmVudCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhcmVudFBhdGgpICYmIGZzLmV4aXN0c1N5bmMoYCR7cGFyZW50UGF0aH0uanNvbmApKSBwYXJlbnRQYXRoICs9ICcuanNvbic7XG4gICAgY29uc3QgcGFyZW50RmlsZVNldCA9IHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQocGFyZW50UGF0aCwgY29uc3VtZXJEaXJQYXRoLCByZW1haW5pbmdEZXB0aCAtIDEpO1xuICAgIGlmICghcGFyZW50RmlsZVNldCkgY29udGludWU7XG4gICAgZmlsZVNldC5leGNsdWRlID8/PSBwYXJlbnRGaWxlU2V0LmV4Y2x1ZGU7XG4gICAgZmlsZVNldC5maWxlcyA/Pz0gcGFyZW50RmlsZVNldC5maWxlcztcbiAgICBmaWxlU2V0LmluY2x1ZGUgPz89IHBhcmVudEZpbGVTZXQuaW5jbHVkZTtcbiAgfVxuICByZXR1cm4gZmlsZVNldDtcbn1cblxuZnVuY3Rpb24gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybjogc3RyaW5nLCB0YXJnZXRQYXRoOiBzdHJpbmcsIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkID0gcGF0dGVybi5yZXBsYWNlKC9eXFwuXFwvL3UsICcnKTtcbiAgLy8gQSBiYXJlIGAuYCBpbmNsdWRlIGNvdmVycyBldmVyeXRoaW5nIHVuZGVyIHRoZSBjb25maWcncyBkaXJlY3RvcnkuXG4gIGlmIChub3JtYWxpemVkID09PSAnJyB8fCBub3JtYWxpemVkID09PSAnLicpIHJldHVybiB0cnVlO1xuICAvLyBBYnNvbHV0ZSBwYXR0ZXJucyAoZXhwYW5kZWQgYCR7Y29uZmlnRGlyfWApIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGFic29sdXRlIHRhcmdldDsgZHJvcCB0aGVcbiAgLy8gbGVhZGluZyBzbGFzaGVzIGZyb20gYm90aCBzbyB0aGUgc2VnbWVudC1idWlsdCByZWdleCBhbmNob3JzIGlkZW50aWNhbGx5LlxuICB0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9eXFwvKy91LCAnJyk7XG4gIGNvbnN0IHNlZ21lbnRzID0gbm9ybWFsaXplZC5zcGxpdCgnLycpLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudCAhPT0gJycpO1xuICBjb25zdCByZWdleFNvdXJjZSA9IHNlZ21lbnRzXG4gICAgLm1hcCgoc2VnbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGggLSAxO1xuICAgICAgaWYgKHNlZ21lbnQgPT09ICcqKicpIHJldHVybiBpc0xhc3QgPyAnLionIDogU3RyaW5nLnJhd2AoPzpbXi9dKy8pKmA7XG4gICAgICBjb25zdCBzZWdtZW50U291cmNlID0gc2VnbWVudFxuICAgICAgICAucmVwbGFjZUFsbCgvWy4rXiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJyonLCBTdHJpbmcucmF3YFteL10qYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJz8nLCBTdHJpbmcucmF3YFteL11gKTtcbiAgICAgIHJldHVybiBpc0xhc3QgPyBzZWdtZW50U291cmNlIDogYCR7c2VnbWVudFNvdXJjZX0vYDtcbiAgICB9KVxuICAgIC5qb2luKCcnKTtcbiAgLy8gdHNjIHRyZWF0cyBhbiBleHRlbnNpb25sZXNzIG5vbi1nbG9iIGluY2x1ZGUvZXhjbHVkZSBlbnRyeSBhcyBhIGRpcmVjdG9yeSB3aG9zZSBzdWJ0cmVlIGlzIGluY2x1ZGVkLlxuICBjb25zdCBsYXN0U2VnbWVudCA9IHNlZ21lbnRzLmF0KC0xKSA/PyAnJztcbiAgY29uc3QgZGlyZWN0b3J5U3VmZml4ID1cbiAgICBleHBhbmRzRGlyZWN0b3JpZXMgJiYgIS9bKj9dL3UudGVzdChsYXN0U2VnbWVudCkgJiYgIWxhc3RTZWdtZW50LmluY2x1ZGVzKCcuJykgPyBTdHJpbmcucmF3YCg/Oi8uKik/YCA6ICcnO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7cmVnZXhTb3VyY2V9JHtkaXJlY3RvcnlTdWZmaXh9JGAsICd1JykudGVzdCh0YXJnZXRQYXRoKTtcbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIHRoZSBkaXJlY3Rvcnkgb3ducyBhIFdvcmtlciwgdW5saWtlIHRoZSBpc0Nsb3VkZmxhcmUgaGV1cmlzdGljLCB3aGljaCBhbHNvIG1hdGNoZXMgYSBwYWNrYWdlIHRoYXRcbiAqIG1lcmVseSBtZW50aW9ucyB3cmFuZ2xlciBpbiBhIHNjcmlwdCBvciB3b3JrZmxvdyAoZS5nLiB0aGUgcm9vdCBvZiBhIG1vbm9yZXBvIHdob3NlIFdvcmtlciBsaXZlcyBpbiBhIHN1Yi1wYWNrYWdlKS5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0V3JhbmdsZXJDb25maWcoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ3dyYW5nbGVyLmpzb25jJywgJ3dyYW5nbGVyLmpzb24nLCAnd3JhbmdsZXIudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHdoZXRoZXIgZGlyUGF0aCBiZWxvbmdzIHRvIHRoZSB3aWxsYm9vc3Rlci1jb25maWdzIHJlcG9zaXRvcnkuIFByZWZlcnMgdGhlIGF1dGhvcml0YXRpdmVcbiAqIEdpdEh1YiByZXBvIG5hbWUsIHdoaWNoIGlzIGltbXVuZSB0byB0aGUgbG9jYWwgZGlyZWN0b3J5IGxheW91dC4gVGhhdCBuYW1lIGlzIGZldGNoZWQgb25seSBmb3IgdGhlXG4gKiByb290LCBzbyBzdWItcGFja2FnZXMgKGFuZCBvZmZsaW5lIHJvb3RzKSB3YWxrIHVwIHRvIHRoZSBuZWFyZXN0IGdpdCByb290IGFuZCBtYXRjaCBpdHMgZGlyZWN0b3J5XG4gKiBuYW1lOiBhIHNpYmxpbmcgcmVwbyBjbG9uZWQgdW5kZXIgYSBwYXJlbnQgZGlyZWN0b3J5IG5hbWVkIHdpbGxib29zdGVyLWNvbmZpZ3Mgc3RvcHMgYXQgaXRzIG93blxuICogYC5naXRgLCBzbyBpdCBpcyBub3QgbWlzY2xhc3NpZmllZC4gVGhlIHBhdGggc2VnbWVudCByZW1haW5zIGEgbGFzdCByZXNvcnQgd2hlbiBubyBnaXQgcm9vdCBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdElzV2lsbEJvb3N0ZXJDb25maWdzKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb25QYXRoOiBzdHJpbmcsIHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKHJlcG9OYW1lKSByZXR1cm4gcmVwb05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3dpbGxib29zdGVyLWNvbmZpZ3MnO1xuICBsZXQgY3VycmVudCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgd2hpbGUgKGN1cnJlbnQgIT09IHBhdGguZGlybmFtZShjdXJyZW50KSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLmdpdCcpKSkge1xuICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUoY3VycmVudCkudG9Mb3dlckNhc2UoKSA9PT0gJ3dpbGxib29zdGVyLWNvbmZpZ3MnO1xuICAgIH1cbiAgICBjdXJyZW50ID0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGgudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MvJyk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdENsb3VkZmxhcmUoXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZzogYm9vbGVhbixcbiAgd29ya2Zsb3dDb250ZW50czogc3RyaW5nW11cbik6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygnd3JhbmdsZXInKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dDb250ZW50cy5zb21lKChjb250ZW50KSA9PiAvY2xvdWRmbGFyZXx3cmFuZ2xlci9pdS50ZXN0KGNvbnRlbnQpKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UmFpbHdheShkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgd29ya2Zsb3dDb250ZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIGlmIChzY3JpcHRzICYmIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiBzY3JpcHQuaW5jbHVkZXMoJ3JhaWx3YXknKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJhaWx3YXlpZ25vcmUnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS5qc29uJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3JhaWx3YXkudG9tbCcpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9yYWlsd2F5L2l1LnRlc3QoY29udGVudCkpO1xufVxuXG4vKiogQ29udGVudHMgb2YgdGhlIHJlYWRhYmxlIC5naXRodWIvd29ya2Zsb3dzIFlBTUwgZmlsZXMsIHJlYWQgb25jZSBmb3IgZXZlcnkgZGV0ZWN0b3IgbmVlZGluZyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKVxuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IC9cXC55YT9tbCQvaXUudGVzdChmaWxlTmFtZSkpXG4gICAgICAuZmxhdE1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gW2ZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpXTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNaXNlVGFza3MoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IHRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZGlyUGF0aCBpcyBhIGNoaWxkIHdvcmtzcGFjZSBvZiBhbiBlbmNsb3NpbmcgbW9ub3JlcG8gcm9vdDogZWl0aGVyIHRoZSBjb252ZW50aW9uYWxcbiAqIGA8cm9vdD4vcGFja2FnZXMvPG5hbWU+YCBsYXlvdXQsIG9yIGEgZGlyZWN0b3J5IG1hdGNoaW5nIGEgd29ya3NwYWNlIHBhdHRlcm4gZGVjbGFyZWQgYnkgYW5cbiAqIGFuY2VzdG9yIHBhY2thZ2UuanNvbiAocGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXAsIGUuZy4gYGV4YW1wbGVzLyoqYCkuIFRoZSB3YWxrIHN0b3BzXG4gKiBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZyByZXBvc2l0b3J5J3Mgd29ya3NwYWNlcyBjYW5cbiAqIG5ldmVyIHJlY2xhc3NpZnkgYW4gaW5kZXBlbmRlbnQgcmVwb3NpdG9yeSBhcyBhIGNoaWxkLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVzb2x2ZWREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAvLyBBIGRpcmVjdG9yeSB3aXRoIGl0cyBvd24gLmdpdCBpcyBhIHJlcG9zaXRvcnkgaW4gaXRzIG93biByaWdodCwgbmV2ZXIgYSBjaGlsZCB3b3Jrc3BhY2Ug4oCUXG4gIC8vIGNoZWNrZWQgRklSU1Qgc28gYW4gaW5kZXBlbmRlbnQgcmVwb3NpdG9yeSB1bmRlciBzb21lIGBwYWNrYWdlcy9gIGRpcmVjdG9yeSBzdGF5cyBhIHJvb3QuXG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuZ2l0JykpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuLicpKSA9PT0gJ3BhY2thZ2VzJyAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKFxuICAgIGxldCBjYW5kaWRhdGVSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShyZXNvbHZlZERpclBhdGgpO1xuICAgIDtcbiAgICBjYW5kaWRhdGVSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShjYW5kaWRhdGVSb290RGlyUGF0aClcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3RQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsIHJlc29sdmVkRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoe1xuICAgICAgICBkaXJQYXRoOiBjYW5kaWRhdGVSb290RGlyUGF0aCxcbiAgICAgICAgcGFja2FnZUpzb246IHJvb3RQYWNrYWdlSnNvbixcbiAgICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGZhbHNlLFxuICAgICAgfSkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+IHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKTtcbiAgICAgIGlmICh3b3Jrc3BhY2VEaXJQYXRocy5pbmNsdWRlcyhyZWxhdGl2ZURpclBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vIG9yIHVucGFyc2FibGUgbWFuaWZlc3QgYXQgdGhpcyBhbmNlc3Rvcjoga2VlcCB3YWxraW5nLlxuICAgIH1cbiAgICBjb25zdCBpc1JlcG9Cb3VuZGFyeSA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gY2FuZGlkYXRlUm9vdERpclBhdGggPT09IHBhdGguZGlybmFtZShjYW5kaWRhdGVSb290RGlyUGF0aCk7XG4gICAgaWYgKGlzUmVwb0JvdW5kYXJ5IHx8IGlzRmlsZXN5c3RlbVJvb3QpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDYXJnb1RvbWxEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmZ1xuICAgIC5nbG9iU3luYygnKiovQ2FyZ28udG9tbCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KVxuICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5zcGxpdCgnLycpLmxlbmd0aCAtIGIuc3BsaXQoJy8nKS5sZW5ndGggfHwgYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVzID0gZmcuZ2xvYlN5bmMoJ3thcHAsc3JjfS8qKi8qLntjanMsY3RzLGpzLGpzeCxtanMsbXRzLHRzLHRzeH0nLCB7XG4gICAgZG90OiB0cnVlLFxuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAnKiovX190ZXN0c19fLyoqJywgJyoqLyouc3BlYy4qJywgJyoqLyoudGVzdC4qJywgJyoqL3BsYXl3cmlnaHQuY29uZmlnLionXSxcbiAgfSk7XG4gIGNvbnN0IHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuID0gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKCdwbGF5d3JpZ2h0Jyk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGUpLCAndXRmOCcpO1xuICAgIGlmIChwbGF5d3JpZ2h0SW1wb3J0UGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUnVudGltZUltcG9ydFJlZ0V4cChwYWNrYWdlTmFtZTogc3RyaW5nKTogUmVnRXhwIHtcbiAgLy8gTWF0Y2ggdGhlIGJhcmUgc3BlY2lmaWVyIG9yIGFueSBzdWJwYXRoIG9mIGl0IChgcGtnYCAvIGBwa2cvc3ViYCksIGJ1dCBuZXZlciBhIGRpZmZlcmVudCBwYWNrYWdlXG4gIC8vIHRoYXQgbWVyZWx5IHNoYXJlcyB0aGUgcHJlZml4IChgcGtnLW90aGVyYCksIHNpbmNlIHRoZSBjaGFyIGFmdGVyIHRoZSBuYW1lIG11c3QgYmUgYC9gIG9yIGEgcXVvdGUuXG4gIGNvbnN0IHNwZWNpZmllciA9IFN0cmluZy5yYXdgWydcIl0ke2VzY2FwZVJlZ0V4cChwYWNrYWdlTmFtZSl9KD86L1teJ1wiXSopP1snXCJdYDtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgU3RyaW5nLnJhd2BcXGJmcm9tXFxzKyR7c3BlY2lmaWVyfXxcXGJpbXBvcnRcXHMqXFwoXFxzKiR7c3BlY2lmaWVyfVxccypcXCl8XFxicmVxdWlyZVxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKWAsXG4gICAgJ3UnXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlbW90ZVVybCA9IGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoKTtcbiAgaWYgKHJlbW90ZVVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvbi4gVGhlIG93bmVyIE1VU1QgYmUgcGFzc2VkOiBnZXRPY3Rva2l0KCkgd2l0aG91dCBpdCBwcmVmZXJzIHRoZVxuICAgIC8vIFdpbGxCb29zdGVyIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgcHJpdmF0ZSBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3JpZXMsIGNvbGxhcHNpbmcgdGhlaXJcbiAgICAvLyB2aXNpYmlsaXR5IHRvIHVua25vd24gKGFuZCBlLmcuIHNraXBwaW5nIHRoZSB3YmZ5IGNhbGxlciBnZW5lcmF0aW9uIGluZGVmaW5pdGVseSkuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG9yZykucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIC8vIFJlLWZldGNoIHVuZGVyIHRoZSByZWRpcmVjdGVkIGlkZW50aXR5IHNvIGEgcmVuYW1lZCByZXBvc2l0b3J5IHN0aWxsIGdldHMgY29tcGxldGVcbiAgICAgIC8vIG1ldGFkYXRhICh2aXNpYmlsaXR5IGluY2x1ZGVkKSBpbnN0ZWFkIG9mIGEgYmFyZSBmdWxsX25hbWUgdGhhdCB3b3VsZCBsZWF2ZVxuICAgICAgLy8gaXNSZXBvVmlzaWJpbGl0eUtub3duIGZhbHNlIG9uIGV2ZXJ5IHN1YnNlcXVlbnQgcnVuIHdpdGggdGhlIHN0YWxlIHJlbW90ZSBVUkwuXG4gICAgICBjb25zdCBbcmVkaXJlY3RlZE9yZywgcmVkaXJlY3RlZE5hbWVdID0gcmVkaXJlY3RlZEZ1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVkaXJlY3RlZE9yZyAmJiByZWRpcmVjdGVkTmFtZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChyZWRpcmVjdGVkT3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXI6IHJlZGlyZWN0ZWRPcmcsXG4gICAgICAgICAgICByZXBvOiByZWRpcmVjdGVkTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiYXJlIGlkZW50aXR5IGJlbG93OiB0aGUgcmVwb3NpdG9yeSBpcyBzdGlsbCBjYW5vbmljYWxpemVkLCBvbmx5XG4gICAgICAgICAgLy8gaXRzIHZpc2liaWxpdHkgc3RheXMgdW5rbm93bi5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZnVsbF9uYW1lOiByZWRpcmVjdGVkRnVsbE5hbWUgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBgPG9yZz4vPG5hbWU+YCBmcm9tIHRoZSBnaXQgcmVtb3RlIChmYWxsaW5nIGJhY2sgdG8gcGFja2FnZS5qc29uJ3MgYHJlcG9zaXRvcnlgKSB3aXRob3V0XG4gKiBjYWxsaW5nIHRoZSBHaXRIdWIgQVBJLiBJdCB3b3JrcyBmb3IgZXZlcnkgd29ya3NwYWNlIHBhY2thZ2UsIG5vdCBqdXN0IHRoZSByb290IOKAlCBvbmx5IHRoZSByb290XG4gKiBmZXRjaGVzIHJlcG8gaW5mbyDigJQgYW5kIGl0IGtlZXBzIHdvcmtpbmcgb2ZmbGluZSBvciByYXRlLWxpbWl0ZWQsIHdoZXJlIGFuIHVuZGVmaW5lZCBpZGVudGl0eVxuICogd291bGQgc2lsZW50bHkgcmVjbGFzc2lmeSB0aGUgcmVwb3NpdG9yeSAoZS5nLiBtYWtpbmcgd2JmeSB3cml0ZSB3aWxsYm9vc3Rlci1jb25maWdzJyBSZW5vdmF0ZVxuICogcHJlc2V0IGludG8gdGhlIHByZXNldCBpdHNlbGYgYWdhaW4pLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBQcm9taXNlPFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZF0+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSByZWFkR2l0SHViSWRlbnRpdHkocmVtb3RlVXJsKTtcbiAgICBpZiAoaWRlbnRpdHkpIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSByZWFkR2l0SHViSWRlbnRpdHkodXJsKTtcbiAgICBpZiAoaWRlbnRpdHkpIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnY29uZmlnJywgJy0tZ2V0JywgJ3JlbW90ZS5vcmlnaW4udXJsJ10sIGRpclBhdGgpIHx8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBgZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lYCBpcyBob3N0LWFnbm9zdGljLCBzbyBpdCBoYXBwaWx5IHR1cm5zIGEgR2l0TGFiIFVSTCBpbnRvIGFuIGA8b3JnPi88cmVwbz5gIHBhaXIuXG4gKiBFdmVyeXRoaW5nIGRvd25zdHJlYW0gdHJlYXRzIHRoZSByZXN1bHRpbmcgaWRlbnRpdHkgYXMgR2l0SHViICh0aGUgYGdpdGh1YjpgIHJlcG9zaXRvcnkgZmllbGQgaXMgcmV3cml0dGVuXG4gKiBpbnRvIHBhY2thZ2UuanNvbiksIHNvIHRoZSBob3N0IG11c3QgYmUgdmVyaWZpZWQgZmlyc3Q7IGEgbm9uLUdpdEh1YiByZW1vdGUgeWllbGRzIG5vIGlkZW50aXR5LCBhcyBiZWZvcmUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRHaXRIdWJJZGVudGl0eSh1cmw6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10gfCB1bmRlZmluZWQge1xuICBpZiAoIXRhcmdldHNHaXRIdWIodXJsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsKTtcbiAgcmV0dXJuIG9yZyAmJiBuYW1lID8gW2Nhbm9uaWNhbGl6ZU93bmVyKG9yZyksIG5hbWVdIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIFVSTCdzIEhPU1QgaXMgZ2l0aHViLmNvbS4gUGFyc2VkIHJhdGhlciB0aGFuIHN1YnN0cmluZy1tYXRjaGVkOiBhIHBhdGggc3VjaCBhc1xuICogYGh0dHBzOi8vZ2l0bGFiLmNvbS9naXRodWIuY29tL293bmVyL3JlcG8uZ2l0YCB3b3VsZCBvdGhlcndpc2UgYmUgdGFrZW4gZm9yIEdpdEh1YiwgYW5kIGFuIHVwcGVyY2FzZVxuICogYEdJVEhVQi5DT01gIHdvdWxkIGJlIHJlamVjdGVkLiBgZ2l0aHViOm93bmVyL3JlcG9gIGlzIG5wbSdzIHNob3J0aGFuZCBhbmQgbmFtZXMgbm8gaG9zdCwgc28gaXQgaXNcbiAqIHJlY29nbml6ZWQgc2VwYXJhdGVseTsgbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIGFjY2VwdHMgdGhlIHNhbWUgc2hvcnRoYW5kLlxuICovXG5mdW5jdGlvbiB0YXJnZXRzR2l0SHViKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICgvXmdpdGh1YjovaXUudGVzdCh1cmwpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2NwLXN0eWxlIHJlbW90ZXMgKGBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvLmdpdGApIGFyZSBub3QgdmFsaWQgVVJMcy5cbiAgY29uc3Qgc2NwSG9zdCA9IC9eW14vQF0qQChbXjovXSspOi91LmV4ZWModXJsKT8uWzFdO1xuICBpZiAoc2NwSG9zdCkgcmV0dXJuIHNjcEhvc3QudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybC5yZXBsYWNlKC9eZ2l0XFwrL3UsICcnKSkuaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBhIHJlbW90ZSBvciBtYW5pZmVzdCBVUkwgbWF5IHNwZWxsIHRoZW0gYW55IHdheSwgYnV0IHRoZSBBUEknc1xuICogYGZ1bGxfbmFtZWAgYWx3YXlzIHJldHVybmVkIHRoZSBjYW5vbmljYWwgc3BlbGxpbmcg4oCUIHdoaWNoIHRoZSBtYW55IGV4YWN0IGA9PT0gJ1dpbGxCb29zdGVyJ2AgcG9saWN5IGNoZWNrc1xuICogKG9yZ2FuaXphdGlvbiB3b3JrZmxvd3MsIGF1dGhvciBtZXRhZGF0YSwgdGhlIFdpbGxCb29zdGVyTGFiIHByZS1wdXNoIGd1YXJkKSBkZXBlbmQgb24uIENhbm9uaWNhbGl6ZSBoZXJlIHNvXG4gKiB0aGUgbG9jYWwgZmFsbGJhY2sgeWllbGRzIHRoZSBzYW1lIGlkZW50aXR5IHRoZSBBUEkgZGlkLCBpbnN0ZWFkIG9mIHNpbGVudGx5IHNraXBwaW5nIHRob3NlIHBvbGljaWVzLlxuICovXG5mdW5jdGlvbiBjYW5vbmljYWxpemVPd25lcihvd25lcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2Fub25pY2FsT3duZXJzID0gWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddO1xuICByZXR1cm4gY2Fub25pY2FsT3duZXJzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyLnRvTG93ZXJDYXNlKCkpID8/IG93bmVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdywgaW52b2tlc1diRGVwbG95IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290Q29uZmlnLmRpclBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuXG4vKipcbiAqIFJlYWRzIHRoZSByb290J3MgdXNlci1hdXRob3JlZCBBR0VOVFNfRVhUUkEubWQgb25jZSBwZXIgcHJvY2Vzczogd2JmeSBuZXZlciByZXdyaXRlcyB0aGUgZmlsZSxcbiAqIGFuZCBib3RoIHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBhbmQgR2VtaW5pIGdlbmVyYXRvcnMgbmVlZCBpdHMgY29udGVudC4gQ2FjaGluZyB0aGUgcmVzb2x2ZWRcbiAqIHZhbHVlIChub3QgdGhlIFByb21pc2UpIGlzIHJhY2UtZnJlZSBiZWNhdXNlIHRoZSB0d28gY2FsbGVycyBydW4gc2VxdWVudGlhbGx5IGluIGluZGV4LnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gIGlmICghYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuaGFzKGFnZW50c0V4dHJhUGF0aCkpIHtcbiAgICBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5zZXQoYWdlbnRzRXh0cmFQYXRoLCBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhhZ2VudHNFeHRyYVBhdGgpKTtcbiAgfVxuICByZXR1cm4gYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuZ2V0KGFnZW50c0V4dHJhUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gJ2J1bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb247XG4gIGNvbnN0IGZub3hJbnN0cnVjdGlvbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKVxuICAgID8gYFxcbi0gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzZWNyZXRzIGFyZSBtYW5hZ2VkIGluIFxcYGZub3gudG9tbFxcYCB2aWEgbWlzZSArIGZub3g7IHJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgIGluc3RlYWQgb2YgZXhwZWN0aW5nIFxcYC5lbnZcXGAgZmlsZXMuIE5ldmVyIGNyZWF0ZSBhIFxcYC5lbnZcXGAsIFxcYC5lbnYuKlxcYCwgb3IgXFxgLmRldi52YXJzXFxgIGZpbGU6IGFkZCB0aGUgdmFyaWFibGUgdG8gXFxgZm5veC50b21sXFxgIGluc3RlYWQuIFByb2ZpbGUgc2VjcmV0cyBsb2FkIG9ubHkgd2hlbiBhIHByb2ZpbGUgaXMgc2VsZWN0ZWQ6IG1vZGUtYXdhcmUgd2IgY29tbWFuZHMgKGUuZy4gXFxgd2Igc3RhcnRcXGAsIFxcYHdiIHRlc3RcXGApIGFuZCBcXGB3YiBkb3RlbnZcXGAgc2VsZWN0IGl0IHRoZW1zZWx2ZXMgKFxcYHdiIGRvdGVudlxcYCB1c2VzIFxcYFdCX0VOVlxcYCwgZWxzZSBcXGBGTk9YX1BST0ZJTEVcXGAsIGVsc2UgXFxgTk9ERV9FTlZcXGAsIGVsc2UgdGhlIGRldmVsb3BtZW50IHByb2ZpbGU7IFxcYFdCX0VOVlxcYCBhY2NlcHRzIG9ubHkgXFxgZGV2ZWxvcG1lbnRcXGAvXFxgdGVzdFxcYC9cXGBzdGFnaW5nXFxgL1xcYHByb2R1Y3Rpb25cXGAsIHNvIHVzZSBcXGBGTk9YX1BST0ZJTEVcXGAgZm9yIGFueSBvdGhlciBwcm9maWxlKSwgd2hpbGUgYmFyZSBcXGBmbm94IHJ1blxcYCBuZWVkcyBhbiBleHBsaWNpdCBcXGAtUCA8cHJvZmlsZT5cXGAuYFxuICAgIDogJyc7XG4gIC8vIG1pc2Ugb3ducyB0aGUgcGlubmVkIHRvb2wgdmVyc2lvbnMsIHNvIGEgdmVyc2lvbiBtaXNtYXRjaCBpcyBmaXhlZCBieSBlZGl0aW5nIG1pc2UudG9tbCDigJQgbm90XG4gIC8vIGJ5IGluc3RhbGxpbmcgYSBkaWZmZXJlbnQgdmVyc2lvbiBnbG9iYWxseSwgd2hpY2ggdGhlIG5leHQgYG1pc2UgaW5zdGFsbGAgc2lsZW50bHkgb3ZlcnJpZGVzLlxuICBjb25zdCBtaXNlSW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdtaXNlLnRvbWwnKSlcbiAgICA/ICdcXG4tIFRvb2wgdmVyc2lvbnMgKGUuZy4sIG5vZGUpIGFyZSBwaW5uZWQgaW4gYG1pc2UudG9tbGA7IHJ1biBgbWlzZSBpbnN0YWxsYCBhZnRlciBjaGFuZ2luZyBpdCwgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICBjb25zdCB1c2VzV2JEZXBsb3kgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydkZXBsb3knXTtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9KSkpXG4gICAgKTtcbiAgfSk7XG4gIC8vIEluZGVwZW5kZW50IGZhY3RzIHN0YXkgc2VwYXJhdGUgc2VudGVuY2VzOiB0aGUgd29ya2Zsb3cncyBvd24gZGVwbG95IG1lY2hhbmlzbSBpcyBub3RcbiAgLy8gaW5zcGVjdGVkLCBzbyB0aGUgd2ItZGVwbG95IGNsYXVzZSBtdXN0IG5vdCBjbGFpbSB0aGUgd29ya2Zsb3cgaW52b2tlcyBpdC5cbiAgY29uc3QgY2xvdWRmbGFyZUluc3RydWN0aW9uID0gb3duc1dyYW5nbGVyQ29uZmlnXG4gICAgPyBgXFxuLSBUaGlzIHByb2plY3QgcnVucyBvbiBDbG91ZGZsYXJlIFdvcmtlcnM6IHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uIGZpbGUgaG9sZHMgdGhlIFdvcmtlcidzIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBhbnkgYmluZGluZ3MgYW5kIHBlci1lbnZpcm9ubWVudCBvdmVycmlkZXMuJHtoYXNEZXBsb3lXb3JrZmxvdyA/ICcgVGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYCBwZXJmb3JtIGRlcGxveW1lbnRzLicgOiAnJ30ke3VzZXNXYkRlcGxveSA/ICcgVGhlIGBkZXBsb3lgIHBhY2thZ2Ugc2NyaXB0IHJ1bnMgYHdiIGRlcGxveWAuJyA6ICcnfSR7b3duc0dlbmVyYXRlZFdvcmtlclR5cGVzID8gYFxcbi0gXFxgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c1xcYCBpcyBnZW5lcmF0ZWQgYnkgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgZ2VuLWNvZGVcXGAgYW5kIGlzIGdpdGlnbm9yZWQ7IGFmdGVyIGNoYW5naW5nIGJpbmRpbmdzIG9yIHZhcnMgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24sIHJlLXJ1biBpdCBpbnN0ZWFkIG9mIGVkaXRpbmcgdGhhdCBmaWxlIGJ5IGhhbmQuYCA6ICcnfWBcbiAgICA6ICcnO1xuICAvLyBXaWxsQm9vc3RlciBSYWlsd2F5IHByb2plY3QgaWRlbnRpZmllcnMgYXJlIG1hbmFnZWQgaW4gZGVwbG95IHdvcmtmbG93IHNldHRpbmdzLlxuICBjb25zdCByYWlsd2F5SW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzUmFpbHdheVxuICAgID8gJ1xcbi0gUmFpbHdheSBwcm9qZWN0IGluZm9ybWF0aW9uIGlzIGluIHRoZSBkZXBsb3kgd29ya2Zsb3dzIHVuZGVyIGAuZ2l0aHViL3dvcmtmbG93c2AuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHBsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb24gPSBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihhbGxDb25maWdzKVxuICAgID8gYFxcbi0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0XFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmBcbiAgICA6ICcnO1xuICBjb25zdCBjb0F1dGhvckluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbiAgLSBFbmQgeW91ciBjb21taXQgbWVzc2FnZSB3aXRoIGEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYC5gXG4gICAgOiAnJztcbiAgLy8gS2V5ZWQgb24gdGhlIHJlcG9zaXRvcnkgY2xhc3NpZmljYXRpb24gcmF0aGVyIHRoYW4gb24gdGhlIHRlbXBsYXRlIGZpbGVzJyBwcmVzZW5jZTogdGhlIHNhbWVcbiAgLy8gcnVuIHdyaXRlcyB0aGUgdGVtcGxhdGVzIGZvciBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcyBiZWZvcmUgdGhpcyBnZW5lcmF0b3JcbiAgLy8gcnVucywgYW5kIGhhbmQtYWRkZWQgdGVtcGxhdGVzIGVsc2V3aGVyZSBiZWxvbmcgdG8gQUdFTlRTX0VYVFJBLm1kLlxuICBjb25zdCBwclRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBcIlxcbiAgLSBCYXNlIHRoZSBQUiBib2R5IG9uIGAuZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZGAgd2hlbiBjcmVhdGluZyBvciB1cGRhdGluZyBhIFBSLCBldmVuIHdoZW4gYSBza2lsbCBvciB3b3JrZmxvdyBzdXBwbGllcyBpdHMgb3duIGJvZHkgc2tlbGV0b246IGtlZXAgdGhlIHRlbXBsYXRlJ3MgaGVhZGluZ3MgaW4gaXRzIG9yZGVyLCBmaWxsIGV2ZXJ5IHNlY3Rpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gaXRzIHBsYWNlaG9sZGVyIGNvbW1lbnQgYXNrcyBmb3IgYXQgYSBsZW5ndGggdGhhdCBmaXRzIHRoZSBjaGFuZ2UgKGEgc2VudGVuY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBudW1iZXJlZCBzdWJzZWN0aW9ucyBmb3IgYSBsYXJnZSBvbmUpLCBkZWxldGUgdGhlIHBsYWNlaG9sZGVyIGNvbW1lbnRzIGFuZCBhbiBlbXB0eSBOb3RlcyBzZWN0aW9uLCBhbmQga2VlcCBgQ2xvc2UgIzxuPmAgb25seSB3aGVuIHRoZSBQUiByZXNvbHZlcyBhbiBleGlzdGluZyBpc3N1ZS5cIlxuICAgIDogJyc7XG4gIGNvbnN0IGlzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/ICdcXG4tIFdoZW4gY3JlYXRpbmcgYW4gaXNzdWUsIHJlYWQgdGhlIHRlbXBsYXRlcyB1bmRlciBgLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9gIGFuZCBmb2xsb3cgdGhlIGNsb3Nlc3Qgb25lOiBgYnVnLm1kYCBmb3Igd3JvbmcgYmVoYXZpb3IsIGBjaGFuZ2UubWRgIGZvciBhbnl0aGluZyB0byBidWlsZCBvciBhbHRlci4gVGhlIFlBTUwgZnJvbnQgbWF0dGVyIGJldHdlZW4gdGhlIGAtLS1gIGxpbmVzIGlzIG1ldGFkYXRhLCBub3QgYm9keSB0ZXh0OiBwcmVmaXggdGhlIHRpdGxlIGFzIGl0cyBgdGl0bGVgIHNheXMsIHBhc3MgaXRzIGBsYWJlbHNgIHZpYSBgLS1sYWJlbGAsIGFuZCBzdWJtaXQgb25seSB0aGUgY29udGVudCBiZWxvdyB0aGUgY2xvc2luZyBgLS0tYCBhcyB0aGUgYm9keS4gS2VlcCB0aGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgb2YgYGNoYW5nZS5tZGAgZm9yIGFueSBjaGFuZ2UgYW5kIGFkZCB0aGUgcmVtYWluaW5nIHNlY3Rpb25zIGFzIHRoZSBjaGFuZ2UgZ3Jvd3M7IGtlZXAgUHJvYmxlbSBhbmQgUHJvcG9zYWwgb2YgYGJ1Zy5tZGAgYW5kIGRyb3AgRXZpZGVuY2Ugb3IgSW1wYWN0IHdoZW4gdGhleSBhZGQgbm90aGluZy4gRGVsZXRlIHRoZSBwbGFjZWhvbGRlciBjb21tZW50cy4gQSBxdWVzdGlvbiBvciBhIG5vdGUgdGhhdCBmaXRzIG5laXRoZXIgdGVtcGxhdGUgbmVlZHMgbm8gdGVtcGxhdGUuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtwcm9qZWN0TmFtZX1cXGAke2Rlc2NyaXB0aW9uID8gYFxcbi0gRGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YCA6ICcnfVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gSWYgb24gXFxgbWFpblxcYCwgY3JlYXRlIGEgbmV3IGJyYW5jaDsgb3RoZXJ3aXNlIHdvcmsgb24gdGhlIGN1cnJlbnQgYnJhbmNoLlxuLSBSdW4gXFxgZ2l0XFxgIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUgdG8gYXZvaWQgXFxgaW5kZXgubG9ja1xcYCBjb25mbGljdHMuXG4tIFdyaXRlIGEgdGVzdCBvbmx5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQsIG9yIHdoZW4gYSBiZWhhdmlvciBpcyBib3RoIGxpa2VseSB0byByZWdyZXNzIEFORCBoYXMgbm8gb3RoZXIgYXV0b21hdGljIHNhZmVndWFyZCAodHlwZSBjaGVja2luZywgbGludGluZywgb3IgYW4gZXhpc3RpbmcgdGVzdC9DSSBjaGVjayB3b3VsZCBub3QgY2F0Y2ggdGhlIGJyZWFrYWdlKS4gU2tpcCB0aGUgdGVzdCB3aGVuIGFuIGV4aXN0aW5nIHNpZ25hbCBhbHJlYWR5IGNhdGNoZXMgdGhlIHJlZ3Jlc3Npb24sIHdoZW4gdGhlIGltcGxlbWVudGF0aW9uIG1lcmVseSBtYXBzIGNvbmRpdGlvbnMgdG8gY29uc3RhbnQgb3V0cHV0cyBzbyBhIHRlc3Qgd291bGQgcmVzdGF0ZSB0aGF0IG1hcHBpbmcgYW5kIGZhaWwgb25seSBvbiBpbnRlbnRpb25hbCBlZGl0cyAoYSBjaGFuZ2UgZGV0ZWN0b3IpLCBvciB3aGVuIHlvdSBhcmUgb25seSBjb25maXJtaW5nIGFuIGV4dGVybmFsIGZhY3QgKGEgbGlicmFyeSdzIGJlaGF2aW9yLCB3aGV0aGVyIGEgdmVyc2lvbiBmaXhlcyBhbiBpc3N1ZSk7IHZlcmlmeSB0aGUgbGF0dGVyIHR3byBvbmNlIG1hbnVhbGx5IGluc3RlYWQgb2YgYWRkaW5nIGEgcGVybWFuZW50IHRlc3QuXG4tIFdoZW4gd3JpdGluZyB0ZXN0cywgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIFRlc3QgZXh0ZXJuYWxseSBvYnNlcnZhYmxlIGJlaGF2aW9yIChlLmcuLCBlbWl0dGVkIGZpbGVzLCBDTEkgb3V0cHV0LCByZW5kZXJlZCByZXN1bHRzKSBhdCB0aGUgc3lzdGVtIGJvdW5kYXJ5LCBub3QgaW1wbGVtZW50YXRpb24gZGV0YWlsczogZG8gbm90IG1pcnJvciBwcm9kdWN0aW9uIGxvZ2ljLCBhc3NlcnQgdGhhdCBhIGJyYW5jaCBpcyB0YWtlbiwgb3IgZmVlZCBoYW5kLWFzc2VtYmxlZCBpbnRlcm5hbCBvYmplY3RzIHRvIGludGVybmFsIGZ1bmN0aW9ucy5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAtIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4gIC0gQXZvaWQgZml4ZWQgd2FpdHMgaW4gRTJFIHRlc3RzOyB3YWl0IGZvciBjb25kaXRpb25zIGluc3RlYWQuXG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRlc3RzIGFuZC9vciBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeVxcYCAodHlwZSBjaGVja2luZyBhbmQgbGludGluZzsgdGFrZXMgdXAgdG8gMTAgbWludXRlcyksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnktZnVsbFxcYCAoYWxsIHRlc3RzOyB0YWtlcyB1cCB0byAxIGhvdXIpIGlmIHlvdSBjaGFuZ2VkIHJ1bnRpbWUgYmVoYXZpb3Igb3IgdGVzdHMuIEZpeCBlcnJvcnMgYW5kIHJlLXJ1biB1bnRpbCBpdCBwYXNzZXMuXG4gIC0gQWdlbnQgc2hlbGxzIG1heSB0ZXJtaW5hdGUgdHJhY2tlZCBjb21tYW5kcyAoaW5jbHVkaW5nIGJhY2tncm91bmQgb25lcykgYXQgdGltZSBsaW1pdHMsIG9mdGVuIG1pbnV0ZXMsIHNvIHJ1biBjb21tYW5kcyB0aGF0IGNhbiBleGNlZWQgeW91ciBzaGVsbC1jYWxsIHRpbWVvdXQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnlcXGAgYW5kIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnktZnVsbFxcYCkgZGV0YWNoZWQgdmlhIG5vaHVwLCBmcm9tIGEgc2hlbGwgY2FsbCB0aGF0IHJldHVybnMgaW1tZWRpYXRlbHk6IFxcYG1rZGlyIC1wIC50bXA7IHJtIC1mIC50bXAvdmVyaWZ5LWZ1bGwuZXhpdDsgbm9odXAgc2ggLWMgJyR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnktZnVsbDsgZWNobyAkPyA+IC50bXAvdmVyaWZ5LWZ1bGwuZXhpdCcgPiAudG1wL3ZlcmlmeS1mdWxsLmxvZyAyPiYxICZcXGAgKHRoZSByZWRpcmVjdHMgYXJlIHJlcXVpcmVkOiBhbiBpbmhlcml0ZWQgc3Rkb3V0L3N0ZGVyciBwaXBlIHdvdWxkIGtlZXAgdGhlIGNhbGwgd2FpdGluZykuIFBvbGwgZnJvbSBzZXBhcmF0ZSBjYWxscywgZWFjaCBzaG9ydGVyIHRoYW4geW91ciBzaGVsbC1jYWxsIHRpbWVvdXQ6IFxcYGZvciBpIGluIDEgMiAzOyBkbyB0ZXN0IC1mIC50bXAvdmVyaWZ5LWZ1bGwuZXhpdCAmJiBicmVhazsgc2xlZXAgMjA7IGRvbmU7IGNhdCAudG1wL3ZlcmlmeS1mdWxsLmV4aXQgMj4vZGV2L251bGwgfHwgZWNobyBzdGlsbCBydW5uaW5nXFxgLiBSZXBlYXQgdW50aWwgdGhlIGV4aXQgZmlsZSBhcHBlYXJzIChpdHMgY29udGVudCBpcyB0aGUgZXhpdCBjb2RlKSwgdGhlbiByZWFkIHRoZSBsb2c7IGlmIGl0IG5ldmVyIGFwcGVhcnMgd2hpbGUgdGhlIGxvZyBzdG9wcyBncm93aW5nLCB0aGUgcnVuIGl0c2VsZiBkaWVkLlxuLSBPbmNlIHZlcmlmaWVkLCBjb21taXQgYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIGFuZCBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAgaWYgbm9uZSBleGlzdHMgZm9yIHRoZSBicmFuY2guXG4gIC0gRm9sbG93IHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBmb3JtYXQgKGUuZy4sIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgKS4ke2NvQXV0aG9ySW5zdHJ1Y3Rpb259XG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0czsgYXZvaWQgXFxgLS1hbWVuZFxcYC4ke3ByVGVtcGxhdGVJbnN0cnVjdGlvbn0ke2lzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbn1cbi0gSW4gYW55IGV4cGxhbmF0b3J5IHRleHQgKGNvbW1pdCBtZXNzYWdlcywgUFIgZGVzY3JpcHRpb25zLCBkb2N1bWVudGF0aW9uLCBjb2RlIGNvbW1lbnRzLCBldGMuKSwgZGVzY3JpYmUgb25seSB3aGF0IGV4aXN0cyBpbiB0aGUgZmluYWwgc25hcHNob3Q6IG5ldmVyIG1lbnRpb24gc3ltYm9scyBvciBjb25jZXB0cyB0aGF0IHdlcmUgYWRkZWQgYW5kIGxhdGVyIHJlbW92ZWQgb3IgcmVuYW1lZCBhbG9uZyB0aGUgd2F5LCBldmVuIGlmIHRoZXkgbWF0dGVyZWQgZHVyaW5nIHRoZSB3b3JrLiBJZiB5b3UgY2Fubm90IGNvbmZpcm0gdGhhdCBhbiBpZGVudGlmaWVyIG9yIGZlYXR1cmUgbmFtZSB5b3UgYXJlIGFib3V0IHRvIHdyaXRlIGV4aXN0cyBpbiB0aGUgZmluYWwgZGlmZiBvciB0aGUgY3VycmVudCBjb2RlYmFzZSwgZHJvcCB0aGF0IHN0YXRlbWVudC5cbi0gVXNlIGhlcmVkb2MgZm9yIG11bHRpLWxpbmUgY29tbWFuZCBpbnB1dCAoZS5nLiwgXFxgZ2l0IGNvbW1pdCAtRiAtXFxgLCBcXGBnaCBwciBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCwgXFxgZ2ggaXNzdWUgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uJHttaXNlSW5zdHJ1Y3Rpb259JHtpc29sYXRlZEluc3RhbGxJbnN0cnVjdGlvbn0ke2Zub3hJbnN0cnVjdGlvbn0ke2Nsb3VkZmxhcmVJbnN0cnVjdGlvbn0ke3JhaWx3YXlJbnN0cnVjdGlvbn0ke3BsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb259XG5cbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWcsIGFsbENvbmZpZ3MpfVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgaGFzTmV3U2VjdGlvbiA9IGV4dHJhQ29udGVudD8udHJpbSgpLnN0YXJ0c1dpdGgoJyMnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudFxuICAgID8gaGFzTmV3U2VjdGlvblxuICAgICAgPyAnXFxuXFxuJyArIGV4dHJhQ29udGVudC50cmltKClcbiAgICAgIDogJ1xcbicgKyBleHRyYUNvbnRlbnRcbiAgICA6ICcnO1xuICByZXR1cm4gYmFzZUNvbnRlbnQgKyBub3JtYWxpemVkRXh0cmFDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIC8vIFRhdXJpIGRlc2t0b3AgYXBwcyBzaGlwIFdpbmRvd3MgYnVpbGRzLCBhbmQgdGhlIGJvdW5kYXJ5IGJldHdlZW4gYXBwIGNvZGUgYW5kIHNoYXJlZCBjb2RlIGlzXG4gIC8vIHRvbyBmdXp6eSB0byBzY29wZSB0aGUgbWFjT1MvTGludXgtb25seSBydWxlIHBlciBwYWNrYWdlLCBzbyBzdWNoIHJlcG9zaXRvcmllcyB0YXJnZXQgYWxsXG4gIC8vIHRocmVlIE9TZXMgaW5zdGVhZC5cbiAgY29uc3QgaGFzRGVza3RvcEFwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcudGF1cmkgfHwgYy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcyk7XG4gIC8vIEEgcHVibGljIHJlcG9zaXRvcnkgd2l0aCBubyBgQHdpbGxib29zdGVyL2AgcGFja2FnZSBpcyBPU1MgZm9yIHRoZSBnZW5lcmFsIHB1YmxpYywgd2hvc2UgdXNlcnNcbiAgLy8gbWF5IHJ1biBXaW5kb3dzLCBzbyBubyBPUyByZXN0cmljdGlvbiBhcHBsaWVzIHRoZXJlLiBBbiB1bmtub3duIHZpc2liaWxpdHkgY29sbGFwc2VzIHRvXG4gIC8vIGlzUHVibGljUmVwbz1mYWxzZSBhbmQgdGhlcmVmb3JlIGtlZXBzIHRoZSByZXN0cmljdGl2ZSBkZWZhdWx0LlxuICBjb25zdCBpc0dlbmVyYWxQdWJsaWNPc3MgPVxuICAgIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvICYmIGFsbENvbmZpZ3MuZXZlcnkoKGMpID0+ICFjLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpO1xuICBjb25zdCBvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbiA9IGlzR2VuZXJhbFB1YmxpY09zc1xuICAgID8gJydcbiAgICA6IGhhc0Rlc2t0b3BBcHBcbiAgICAgID8gJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzLCBtYWNPUywgYW5kIExpbnV4LidcbiAgICAgIDogJy0gRW5zdXJlIGNvbXBhdGliaWxpdHkgb25seSB3aXRoIG1hY09TIGFuZCBMaW51eDsgZG8gbm90IGluY2x1ZGUgV2luZG93cy1zcGVjaWZpYyBjb2RlLic7XG4gIC8vIENsb3VkZmxhcmUgV29ya2VycyBleGVjdXRlIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcyBhbmQgdHdvIHJlcXVlc3RzIGFyZSBub3QgZ3VhcmFudGVlZFxuICAvLyB0byBoaXQgdGhlIHNhbWUgaW5zdGFuY2UsIHNvIHRoZSBzaW5nbGUtaW5zdGFuY2Ugc2ltcGxpZmljYXRpb24gc2lsZW50bHkgbG9zZXMgc3RhdGUgdGhlcmUg4oCUXG4gIC8vIGJ1dCBXb3JrZXJzIGRlbGliZXJhdGVseSByZXVzZSBleGVjdXRpb24gY29udGV4dHMsIHNvIGJlc3QtZWZmb3J0IGlzb2xhdGUtbG9jYWwgY2FjaGVzIHN0YXlcbiAgLy8gbGVnaXRpbWF0ZSAoaHR0cHM6Ly9kZXZlbG9wZXJzLmNsb3VkZmxhcmUuY29tL3dvcmtlcnMvcmVmZXJlbmNlL2hvdy13b3JrZXJzLXdvcmtzLykuIFRoZVxuICAvLyBzaWduYWxzIGFyZSBjb3JyZWxhdGVkIFBFUiBQQUNLQUdFOiBhIG1vbm9yZXBvIGNhbiBob3N0IGEgc2luZ2xlLWluc3RhbmNlIHNlcnZlciBhcHAgbmV4dCB0b1xuICAvLyBhbiB1bnJlbGF0ZWQgV29ya2VyLCBhbmQgbmVpdGhlciBtYXkgb3ZlcnJpZGUgdGhlIG90aGVyJ3MgcnVsZS4gZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyBpc1xuICAvLyB0aGUgYWNjdXJhdGUgV29ya2VycyBzaWduYWwgKGlzQ2xvdWRmbGFyZSBhbHNvIG1hdGNoZXMgYSBtZXJlIHdyYW5nbGVyIG1lbnRpb24gaW4gYSBzY3JpcHQgb3JcbiAgLy8gd29ya2Zsb3cpLlxuICBjb25zdCBoYXNXb3JrZXJzQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcpO1xuICBjb25zdCBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcCA9IGFsbENvbmZpZ3Muc29tZShcbiAgICAoYykgPT4gKGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KSAmJiAhYy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnXG4gICk7XG4gIGNvbnN0IHdvcmtlcnNJbnN0cnVjdGlvbiA9XG4gICAgJy0gQ2xvdWRmbGFyZSBXb3JrZXJzIHJ1biBhY3Jvc3MgbXVsdGlwbGUgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgbWF5IGhpdCBkaWZmZXJlbnQgaW5zdGFuY2VzOiBuZXZlciBsZXQgY29ycmVjdG5lc3MgZGVwZW5kIG9uIG1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlOyBwZXJzaXN0IGF1dGhvcml0YXRpdmUgc2hhcmVkIHN0YXRlIGluIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpLiBCZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBvZiBub24tcmVxdWVzdC1zY29wZWQgZGF0YSBhcmUgZmluZS4nO1xuICBjb25zdCBzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9uID0gaGFzV29ya2Vyc0FwcFxuICAgID8gaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gYCR7d29ya2Vyc0luc3RydWN0aW9ufSBUaGlzIGFwcGxpZXMgdG8gYWxsIGNvZGUgdGhhdCBydW5zIG9uIENsb3VkZmxhcmUgV29ya2VycyAodGhlIHdyYW5nbGVyLWNvbmZpZ3VyZWQgcGFja2FnZXMgYW5kIGFueSB3b3Jrc3BhY2UgcGFja2FnZSB0aGV5IGltcG9ydCk7IGFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UgZm9yIHRoZSBvdGhlciBzZXJ2ZXIgYXBwcy5gXG4gICAgICA6IHdvcmtlcnNJbnN0cnVjdGlvblxuICAgIDogaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gJy0gQXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS4nXG4gICAgICA6ICcnO1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmaWxlIG5hbWVzIGZvciBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgKFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBtb2R1bGVzIGFuZCBkaXJlY3RvcmllcyB3aXRoIGhpZ2ggY29oZXNpb24gYW5kIGxvdyBjb3VwbGluZzsgc3BsaXQgbGFyZ2UgbW9kdWxlcyB3aGVuIG5lZWRlZC5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgKHRvcC1kb3duIG9yZGVyKTsgcGxhY2UgdmFyaWFibGUgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGFib3ZlIHRoZWlyIHVzYWdlLlxuLSBXcml0ZSBjb21tZW50cyBhbmQgSlNEb2Mgb25seSBmb3IgaGFyZC10by11bmRlcnN0YW5kIGNvZGU6IGV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4tIE5ldmVyIGV4cGxhaW4gaG93IFdpbGxCb29zdGVyJ3MgaW4taG91c2UgdG9vbHMgKGUuZy4sIFxcYHdiXFxgLCBcXGB3YmZ5XFxgKSB3b3JrIGluIGNvZGUgY29tbWVudHMgb3IgZG9jdW1lbnRzIG91dHNpZGUgdGhlIHRvb2wncyBvd24gcGFja2FnZSwgZXhjZXB0IGluIGluc3RydWN0aW9ucyBmb3IgQUkgYWdlbnRzOyBlLmcuLCBkbyBub3Qgbm90ZSB0aGF0IFxcYFBPUlRcXGAgaXMgdW5zZXQgYmVjYXVzZSBcXGB3YlxcYCBwaWNrcyBhIGZyZWUgcG9ydC5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gV2hlbiB2YWxpZGF0aW5nIEphdmFTY3JpcHQgb2JqZWN0cyAoZS5nLiwgcGFyc2VkIEpTT04sIEFQSSByZXNwb25zZXMpLCBhbHdheXMgdXNlIFxcYHpvZFxcYCBpZiBwb3NzaWJsZSBpbnN0ZWFkIG9mIGhhbmQtd3JpdHRlbiBjaGVja3Mgb3IgdHlwZSBhc3NlcnRpb25zLlxuLSBCdWlsZCBwcm9tcHRzIGFzIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgb24gYSBwcmUtY29tcHV0YWJsZSBhcnJheSBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZDsgaWYgdmFsaWRhdGlvbiBpcyBuZWVkZWQsIFxcYGFzc2VydFxcYCBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbi0gQXNzdW1lIGxvY2FsIHRvb2xzIHN1Y2ggYXMgXFxgZ2l0XFxgLCBcXGBnaFxcYCwgYW5kIFxcYGdocVxcYCBhcmUgaW5zdGFsbGVkIGFuZCBhdXRoZW50aWNhdGVkLlxuJHtvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBhZGRpbmcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHJlZ2lzdGVyIHRoZW0gaW4gdGhlIFxcYGkxOG5cXGAgcmVzb3VyY2UgZmlsZXMgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGUgXFxgaTE4blxcYCB1dGlsaXR5IChlLmcuLCBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgKS5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIG92ZXIgXFxgdXNlU3RhdGVcXGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbi0gVXNlIFxcYGF1dG9Gb2N1c1xcYCB3aGVyZSBpdCByZWR1Y2VzIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIGN1cnJlbnQgd2ViLWFwcCBmcmFtZXdvcmsgYW5kIGVuYWJsZXMgdGhlIFJlYWN0IENvbXBpbGVyIGp1c3QgYXMgTmV4dC5qc1xuICAvLyBkb2VzLCBzbyBpdCBtdXN0IG5vdCBtaXNzIHRoaXMgcnVsZS5cbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGBcbi0gVGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCBzbyBcXGB1c2VDYWxsYmFja1xcYCBhbmQgXFxgdXNlTWVtb1xcYCBhcmUgdW5uZWNlc3NhcnkgZm9yIHBlcmZvcm1hbmNlLlxuYFxuICAgIDogJydcbn1cbiR7c2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsIiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCByZWxlYXNlQWdlR2F0ZSBmcm9tICcuLi8uLi9jb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgICBnbG9iYWxTdG9yZT86IGJvb2xlYW47XG4gICAgbGlua2VyPzogc3RyaW5nO1xuICB9O1xufVxuXG4vLyBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gaXMgdGhlIG9yZ2FuaXphdGlvbidzIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBwb2xpY3k6IHRoZVxuLy8gbWFjaGluZXMnIGdsb2JhbCBjb25maWdzIGdldCBpdCB0aHJvdWdoIGNvbmZpZ3MvYXBwbHlSZWxlYXNlQWdlR2F0ZS5zaCAocnVuIGJ5IHdiZnkgaXRzZWxmLCBieVxuLy8gcmV1c2FibGUtd29ya2Zsb3dzIG9uIENJLCBhbmQgYnkgc2VsZi1ob3N0LXV0aWxzIG9uIHRoZSBydW5uZXJzKSwgYW5kIHJlcG9zaXRvcmllcyBnZXQgaXQgaGVyZS5cbi8vIE9ubHkgb3VyIG93biBwYWNrYWdlcyBhcmUgZXhlbXB0OiB3ZSBjb250cm9sIHdobyBwdWJsaXNoZXMgdGhlbSwgc28gYSBjb21wcm9taXNlZCByZWxlYXNlIGNhbm5vdFxuLy8gcmVhY2ggdXMgdGhyb3VnaCBhbiB1cHN0cmVhbSBtYWludGFpbmVyJ3Mgc3RvbGVuIGNyZWRlbnRpYWxzLiBUaGF0IGNvdmVycyBldmVyeVxuLy8gQHdpbGxib29zdGVyLXByaXZhdGUgcGFja2FnZSAodGhlIHNjb3BlIHJlc29sdmVzIG9ubHkgZnJvbSBvdXIgb3duIHJlZ2lzdHJ5KSwgYnV0IGJ1biwgbnBtLCBhbmRcbi8vIFlhcm4gbWF0Y2ggZXhjbHVkZSBlbnRyaWVzIGJ5IGV4YWN0IG5hbWUg4oCUIG5vIEBzY29wZS8qIHBhdHRlcm5zIOKAlCBzbyBlYWNoIG5ldyBwYWNrYWdlIGluIHRoZVxuLy8gc2NvcGUgbXVzdCBiZSBhZGRlZCB0byBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24gd2hlbiBpdCBpcyBmaXJzdCBwdWJsaXNoZWQuIFRoaXJkLXBhcnR5XG4vLyBwYWNrYWdlcyDigJQgaW5jbHVkaW5nXG4vLyB0b29saW5nIHdiZnkgcGlucyBpdHNlbGYg4oCUIHN0YXkgYWdlLWdhdGVkOyBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uIGluIHBhY2thZ2VKc29uLnRzXG4vLyBwaW5zIHRoZSBuZXdlc3QgcmVsZWFzZSBvbGQgZW5vdWdoIHRvIHBhc3MgdGhlIGdhdGUsIHNvIHBpbm5pbmcga2VlcHMgd29ya2luZyB3aXRob3V0IGFuIGV4ZW1wdGlvbi5cbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgPSByZWxlYXNlQWdlR2F0ZS5kYXlzICogMjQgKiA2MCAqIDYwO1xuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSByZWxlYXNlQWdlR2F0ZS5leGNsdWRlcztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHBhcnNlQnVuZmlnVG9tbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpPy5pbnN0YWxsPy5nbG9iYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5HbG9iYWxTdG9yZShcbiAgY29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBza2lwRGVwczogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSA9IHNob3VsZFVzZUJ1bkdsb2JhbFN0b3JlKGNvbmZpZ3MpO1xuICByZXR1cm4gc2tpcERlcHMgPyAocHJldmlvdXNHbG9iYWxTdG9yZSA/PyBkZWZhdWx0VXNlR2xvYmFsU3RvcmUpIDogZGVmYXVsdFVzZUdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIC8vIEJsaXR6IGJ1aWxkcyBvbiBOZXh0LmpzIGJ1dCBuZWVkIG5vdCBkZWNsYXJlIGl0IGRpcmVjdGx5LCBhbmQgaXRzIGNvZGVnZW4gYWxzbyBwYXRjaGVzIE5leHRcbiAgLy8gaW5zaWRlIG5vZGVfbW9kdWxlcy4gQm90aCBmcmFtZXdvcmtzIHRoZXJlZm9yZSByZXF1aXJlIHByb2plY3QtbG9jYWwgaXNvbGF0ZWQgaW5zdGFsbHMuXG4gIC8vIFNsaWRldiBsb2FkcyBvcHRpb25hbCBWdWUgY29tcGlsZXIgcGVlcnMgdGhyb3VnaCBsb2NhbC1wa2cuIFRoZSBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzXG4gIC8vIGxvY2FsLXBrZyBvdXRzaWRlIHRoZSBwcm9qZWN0LCBzbyBOb2RlIGNhbm5vdCByZXNvbHZlIGEgY29tcGlsZXIgZGVjbGFyZWQgYnkgdGhlIHByb2plY3QuXG4gIHJldHVybiAhY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuc2xpZGV2KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcsIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIC8vIG1pbmltdW1SZWxlYXNlQWdlIGFuZCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIGFyZSBvcmcgcG9saWN5LCBuZXZlciByZXBvc2l0b3J5IHBvbGljeTogYm90aFxuICAvLyBhcmUgcmV3cml0dGVuIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbidzIHZhbHVlcyBvbiBldmVyeSBydW4sIHNvIGEgaGFuZC1lZGl0ZWQgKHdlYWtlbmVkKVxuICAvLyBnYXRlIGNhbm5vdCBzdXJ2aXZlIHJlZ2VuZXJhdGlvbi4gRHJvcHBpbmcgcmVwb3NpdG9yeS1zcGVjaWZpYyBleGNsdWRlIGVudHJpZXMgaXMgZmFpbC1zYWZlIOKAlCBhblxuICAvLyB1bmNvdmVyZWQgcGFja2FnZSBiZWNvbWVzIGFnZS1nYXRlZCBhbmQgc3VyZmFjZXMgYXQgaW5zdGFsbCB0aW1lIGluc3RlYWQgb2Ygd2Vha2VuaW5nIHRoZSBnYXRlLlxuICAvLyBUdXJib3BhY2sgcmVqZWN0cyBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVjYXVzZSB0aGV5IHJlc29sdmUgb3V0c2lkZSBpdHMgZmlsZXN5c3RlbSByb290LlxuICAvLyBLZWVwaW5nIE5leHQuanMgaW5zdGFsbHMgcHJvamVjdC1sb2NhbCBhdm9pZHMgd2lkZW5pbmcgdGhhdCByb290IHRvICRIT01FIChvciBgL2AgaW4gRG9ja2VyKSxcbiAgLy8gd2hpY2ggd291bGQgZXhwYW5kIGRldmVsb3BtZW50IGZpbGVzeXN0ZW0gd2F0Y2hpbmcgYW5kIGJ5cGFzcyB0aGUgYm91bmRhcnkncyBjYWNoZSBiZW5lZml0cy5cbiAgY29uc3QgZ2xvYmFsU3RvcmVMaW5lID0gdXNlR2xvYmFsU3RvcmUgPyAnZ2xvYmFsU3RvcmUgPSB0cnVlJyA6ICdnbG9iYWxTdG9yZSA9IGZhbHNlJztcbiAgLy8gTm8gYFtydW5dIGJ1biA9IHRydWVgOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrc1xuICAvLyB0b29scyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KTsgYW55IGV4aXN0aW5nIHNldHRpbmcgaXMgZHJvcHBlZC5cbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIOKAlCB0c3g6IGJ1aWxkLXRzIHVuZGVyIE5vZGUuanMgc3Bhd25zIGBub2RlIC0taW1wb3J0IHRzeGAsIHdoaWNoIHJlc29sdmVzXG4gIC8vIHRzeCBmcm9tIHRoZSBjb25zdW1lciBwYWNrYWdlJ3MgZGlyZWN0b3J5LCBub3QgZnJvbSBidWlsZC10cydzIG93biBkZXBlbmRlbmNpZXMuXG4gIC8vIHVuZGljaS10eXBlczogYnVuLXR5cGVzIHJlZmVyZW5jZXMgaXQgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSk7XG4gIC8vIGdlbmVyYXRlZCB0c2NvbmZpZ3MgYWxzbyBtYXAgdW5kaWNpLXR5cGVzIHRvIHRoZSBob2lzdGVkIGNvcHkgKHNlZSB0c2NvbmZpZy50cykgYmVjYXVzZSB0aGVcbiAgLy8gZ2xvYmFsIHN0b3JlIHJlYWxwYXRocyBidW4tdHlwZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGV4aXN0aW5nQ29udGVudCl9W2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbiR7Z2xvYmFsU3RvcmVMaW5lfVxubGlua2VyID0gXCJpc29sYXRlZFwiXG5wdWJsaWNIb2lzdFBhdHRlcm4gPSBbXCJ0c3hcIiwgXCJ1bmRpY2ktdHlwZXNcIl1cbm1pbmltdW1SZWxlYXNlQWdlID0gJHtidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHN9XG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHtidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbi8qKlxuICogUHJlc2VydmUgdGhlIHByb2plY3QncyBgW3Rlc3RdYCBzZWN0aW9ucyAoZS5nLiBwcmVsb2FkIHNjcmlwdHMgc3dhcHBpbmcgYSBDbG91ZGZsYXJlIEQxIGNsaWVudFxuICogZm9yIGEgbG9jYWwgU1FMaXRlIG9uZSkgdmVyYmF0aW0sIGNvbW1lbnRzIGluY2x1ZGVkOyB3YmZ5IG1hbmFnZXMgb25seSB0aGUgb3RoZXIgc2VjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UmF3VGVzdFNlY3Rpb25zKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghY29udGVudCkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IHByZXNlcnZlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgaW5UZXN0U2VjdGlvbiA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBzZWN0aW9uTWF0Y2ggPSAvXlxccypcXFsoW15cXF1dKylcXF0vLmV4ZWMobGluZSk7XG4gICAgaWYgKHNlY3Rpb25NYXRjaCkge1xuICAgICAgaW5UZXN0U2VjdGlvbiA9IHNlY3Rpb25NYXRjaFsxXSA9PT0gJ3Rlc3QnIHx8IChzZWN0aW9uTWF0Y2hbMV0gYXMgc3RyaW5nKS5zdGFydHNXaXRoKCd0ZXN0LicpO1xuICAgIH1cbiAgICBpZiAoaW5UZXN0U2VjdGlvbiAmJiBsaW5lLnRyaW0oKSkge1xuICAgICAgcHJlc2VydmVkTGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByZXNlcnZlZExpbmVzLmxlbmd0aCA+IDAgPyBgJHtwcmVzZXJ2ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5cXG5gIDogJyc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGUgZGVwbG95cyBHaXQtYmFzZWQgcHJpdmF0ZSBwYWNrYWdlcyBmcm9tIG5vZGVfbW9kdWxlcywgYnV0IHRoZSBEb2NrZXIgY29udGV4dCBzaG91bGQgc3RheSBuYXJyb3cuXG5jb25zdCBpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnMgPSBbJ0B3aWxsYm9vc3RlciddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuLmVudipcbioqLy5EU19TdG9yZVxuKiovLmNhY2hlXG4qKi8uY2xhdWRlXG4qKi8uY3Vyc29yXG4qKi8uZWRpdG9yY29uZmlnXG4qKi8uZXNsaW50Y2FjaGVcbioqLy5nZW1pbmlcbioqLy5naXRcbioqLy5naXRhdHRyaWJ1dGVzXG4qKi8uZ2l0aHViXG4qKi8uZ2l0aWdub3JlXG4qKi8uaWRlYVxuKiovLmxlZnRob29rXG4qKi8ubXlweV9jYWNoZVxuKiovLm5leHQvY2FjaGVcbioqLy5ucG1cbioqLy5wYXJjZWwtY2FjaGVcbioqLy5wbnBtLXN0b3JlXG4qKi8ucHl0ZXN0X2NhY2hlXG4qKi8ucmFpbHdheWlnbm9yZVxuKiovLnJlbGVhc2VyYy5qc29uXG4qKi8ucnVmZl9jYWNoZVxuKiovLnRtcFxuKiovLnRtcC0qLyoqXG4qKi8udHVyYm9cbioqLy50b3hcbioqLy52c2NvZGVcbioqLy55YXJuL2NhY2hlXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuKiovX19weWNhY2hlX19cbioqLyoubG9nXG4qKi8qLnB5Y1xuKiovKi50c2J1aWxkaW5mb1xuKiovY292ZXJhZ2VcbioqL25vZGVfbW9kdWxlcy8qKlxuJHtpbmNsdWRlZE5vZGVNb2R1bGVzUGF0dGVybnNcbiAgLm1hcChcbiAgICAocGF0dGVybikgPT4gYCEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufVxuISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59LyoqYFxuICApXG4gIC5qb2luKCdcXG4nKX1cbioqL25vZGVfbW9kdWxlcy8uY2FjaGVcbioqL3BsYXl3cmlnaHQtcmVwb3J0XG4qKi9zdG9yeWJvb2stc3RhdGljXG4qKi90YXJnZXRcbioqL3Rlc3QtcmVzdWx0c1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlLCByZWFkQWdlbnRzRXh0cmFDb250ZW50IH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnlhbWwnKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuXG4gICAgY29uc3QgaGFzTm9uQ2Fub25pY2FsQ29uZmlnID0gISEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQobm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KSk7XG4gICAgaWYgKGhhc05vbkNhbm9uaWNhbENvbmZpZykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgU2tpcHBlZCBnZW5lcmF0aW5nICR7Y29uZmlnRmlsZVBhdGh9IGJlY2F1c2UgJHtub25DYW5vbmljYWxDb25maWdGaWxlUGF0aH0gaXMgbm90IGEgc3VwcG9ydGVkIEdlbWluaSBjb25maWcgbG9jYXRpb24uIFJlbmFtZSBpdCBtYW51YWxseS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gaGFzTm9uQ2Fub25pY2FsQ29uZmlnID8gdW5kZWZpbmVkIDogYXdhaXQgZnNVdGlsLnJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhjb25maWdGaWxlUGF0aCk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb2xkQ29uZmlnID0gQnVuLllBTUwucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICAgIC8vIE1lcmdlIG9ubHkgYSBtYXBwaW5nOiBlbXB0eSwgY29tbWVudC1vbmx5LCBvciBzY2FsYXIgWUFNTCB3b3VsZCBlaXRoZXIgdGhyb3cgaW5cbiAgICAgICAgLy8gbWVyZ2UuYWxsIG9yIHBvbGx1dGUgdGhlIGNvbmZpZyB3aXRoIGluZGV4IGtleXMuXG4gICAgICAgIGlmIChvbGRDb25maWcgJiYgdHlwZW9mIG9sZENvbmZpZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2xkQ29uZmlnKSkge1xuICAgICAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBjYW4ndCBiZSBwYXJzZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IEJ1bi5ZQU1MLnN0cmluZ2lmeShuZXdDb25maWcsIHVuZGVmaW5lZCwgMik7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCByZWFkQWdlbnRzRXh0cmFDb250ZW50KGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3QgcmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbiA9IGNvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICAgID8gJ1JldmlldyBpbiBFbmdsaXNoIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy4nXG4gICAgICA6ICfku6XkuIvjga7jgrPjg7zjg4fjgqPjg7PjgrDopo/ntITjgpLouI/jgb7jgYjjgabjgIHml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIInO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYCR7cmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbn1cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShjb25maWcsIGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIC4uLihoYXNOb25DYW5vbmljYWxDb25maWcgPyBbXSA6IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKV0pLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGdpdE91dHB1dE1heEJ1ZmZlciA9IDY0ICogMTAyNCAqIDEwMjQ7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbi8vIGAuZ2l0aWdub3JlIC10ZXh0YCBrZWVwcyB0aGUgbWFjT1MgdGVtcGxhdGUncyBgSWNvblxcclxccmAgcnVsZSBpbnRhY3Q6IGB0ZXh0PWF1dG9gIG5vcm1hbGl6YXRpb25cbi8vIHN0cmlwcyBvbmUgQ1IgcGVyIGNoZWNraW4sIGRlZ3JhZGluZyB0aGUgcnVsZSB1bnRpbCBpdCBtYXRjaGVzIG5vdGhpbmcuXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbi5naXRpZ25vcmUgLXRleHRcblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMoZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBvdXRwdXQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBvdXRwdXQgPSBjaGlsZF9wcm9jZXNzLmV4ZWNGaWxlU3luYygnZ2l0JywgWydscy1maWxlcycsICctLWVvbCcsICcteiddLCB7XG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgbWF4QnVmZmVyOiBnaXRPdXRwdXRNYXhCdWZmZXIsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHRyYWNrZWQgbGluZS1lbmRpbmcgcmVub3JtYWxpemF0aW9uOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHJlbm9ybWFsaXplZENvdW50ID0gMDtcbiAgZm9yIChjb25zdCByZWNvcmQgb2Ygb3V0cHV0LnNwbGl0KCdcXDAnKSkge1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gcmVjb3JkLmluZGV4T2YoJ1xcdCcpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA9PT0gLTEpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHJlY29yZC5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCk7XG4gICAgaWYgKCEvXmlcXC8oPzpjcmxmfG1peGVkKVxccy91LnRlc3QoYXR0cmlidXRlcykgfHwgIS9hdHRyXFwvLipcXGJlb2w9KD86bGZ8Y3JsZikoPzpcXHN8JCkvdS50ZXN0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWNvcmQuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKTtcbiAgICBjb25zdCB0cmFja2VkRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCBzdGF0cyA9IGZzLmxzdGF0U3luYyh0cmFja2VkRmlsZVBhdGgsIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pO1xuICAgIGlmICghc3RhdHM/LmlzRmlsZSgpKSBjb250aW51ZTtcblxuICAgIC8vIEdpdCdzIHN0YXQgY2FjaGUgY2FuIGhpZGUgcHJlLWV4aXN0aW5nIENSTEYgYmxvYnMgYWZ0ZXIgd2JmeSBpbnRyb2R1Y2VzIHRleHQgYXR0cmlidXRlcy5cbiAgICAvLyBOb3JtYWxpemUgYnl0ZXMgaW4gdGhlIHdvcmt0cmVlIHNvIHRoZSBjYWxsZXIncyBub3JtYWwgYGdpdCBhZGQgLUFgIHJlY29yZHMgdGhlIGNhbm9uaWNhbFxuICAgIC8vIGJsb2I7IHRoaXMgYWxzbyBwcmV2ZW50cyBQcmV0dGllcidzIG1ldGFkYXRhIGNhY2hlIGZyb20gc2tpcHBpbmcgdGhlIG5ld2x5IGNoYW5nZWQgZmlsZS5cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0cmFja2VkRmlsZVBhdGgsIEJ1ZmZlci5mcm9tKGNvbnRlbnQudG9TdHJpbmcoJ2JpbmFyeScpLnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKSwgJ2JpbmFyeScpKTtcbiAgICByZW5vcm1hbGl6ZWRDb3VudCsrO1xuICB9XG4gIGlmIChyZW5vcm1hbGl6ZWRDb3VudCA+IDApIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbm9ybWFsaXplZCBsaW5lIGVuZGluZ3MgaW4gJHtyZW5vcm1hbGl6ZWRDb3VudH0gdHJhY2tlZCBmaWxlKHMpLmApO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcywgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIERvIG5vdCByZW1vdmUgYHdpbmRvd3NgOiBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBmaWxlcyBtdXN0IGtlZXAgaWdub3JpbmcgV2luZG93cy1jcmVhdGVkIGxvY2FsIGFydGlmYWN0cy5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuX19nZW5lcmF0ZWRfXy9cbiEua2VlcFxuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZG9ja2VyLmVudlxuLmVudipcbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50bXAtKi9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG5Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICAvLyBFdmVyeSBhY2NlcHRlZCByZXBvc2l0b3J5IHJvb3QgcmVjZWl2ZXMgYSBtYW5hZ2VkIHBhY2thZ2UuanNvbiBsYXRlciBpbiB0aGUgc2FtZSBydW4sIHNvIGl0c1xuICAgIC8vIGRlcGVuZGVuY3kgdHJlZSBtdXN0IGJlIGlnbm9yZWQgZXZlbiB3aGVuIHRoZSBtYW5pZmVzdCBkaWQgbm90IGV4aXN0IGF0IGNvbmZpZy1kZXRlY3Rpb24gdGltZS5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHwgY29uZmlnLmlzUm9vdCkge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3QgcG9tLnhtbCk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBpdHMgTWF2ZW5cbiAgICAvLyBtb2R1bGVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmQgZHJvcHBpbmcgdGhlIG1hdmVuIHRlbXBsYXRlIHdvdWxkIGxldCB0YXJnZXQvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnkuIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdFxuICAgIC8vIGxvY2tmaWxlKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIFB5dGhvbiBkaXJlY3RvcmllcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kXG4gICAgLy8gZHJvcHBpbmcgdGhlIHB5dGhvbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgX19weWNhY2hlX18vIGFuZCAudmVudi8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZC5cbiAgICAgIC8vIC5lbnYuY2xvdWRmbGFyZSBjYXJyaWVzIENMT1VERkxBUkVfQVBJX1RPS0VOOiBDSSB3cml0ZXMgaXQgZnJvbSBhIHNlY3JldCwgYW5kIGEgbG9jYWxcbiAgICAgIC8vIGB3YiBkZXBsb3lgIG5lZWRzIGEgcmVhbCB0b2tlbiBpbiBpdCwgc28gY29tbWl0dGluZyBpdCB3b3VsZCBsZWFrIGFjY291bnQgY3JlZGVudGlhbHMuXG4gICAgICAvLyBJdCBpcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGUgQ2xvdWRmbGFyZS1zcGVjaWZpYyBjcmVkZW50aWFsIHBvbGljeSByZW1haW5zIHZpc2libGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi5lbnYuY2xvdWRmbGFyZVxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSBvcHQtb3V0IGRlbGV0aW9uIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiAhY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAvLyBPbiBhIGdlbnVpbmUgd29ya2VyLXR5cGVzIG9wdC1vdXQgKG5vdGhpbmcgY29uc3VtZXMgdGhlIGdlbmVyYXRlZCBmaWxlOyBnZW5lcmF0ZXNXb3JrZXJUeXBlc1xuICAgICAgLy8gYWxvbmUgaXMgZmFsc2UgZm9yIHVucmVsYXRlZCByZWFzb25zIHN1Y2ggYXMgYSBtaXNzaW5nIGxvY2FsIHdyYW5nbGVyIGRlcGVuZGVuY3ksIHdoZXJlIHRoZVxuICAgICAgLy8gZmlsZSBtYXkgc3RpbGwgYmUgY29uc3VtZWQpIHRoZSBpZ25vcmUgcnVsZVxuICAgICAgLy8gYWJvdmUgZGlzYXBwZWFycywgc28gYW4gYWxyZWFkeS1nZW5lcmF0ZWQgZmlsZSB3b3VsZCBzdXJmYWNlIGFzIHVudHJhY2tlZCBub2lzZSBvbiBldmVyeVxuICAgICAgLy8gY2hlY2tvdXQg4oCUIGRlbGV0ZSBpdC4gTm8gcmVwb3NpdG9yeSB0cmFja3MgdGhlIGZpbGUgKGRvY3MvZXhwZWN0ZWQtcmVwb3NpdG9yeS1ydWxlcy5tZCksXG4gICAgICAvLyBzbyBhbiBleGlzdGluZyBjb3B5IGlzIGFsd2F5cyBhIGRpc3Bvc2FibGUgZ2VuZXJhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtlclR5cGVzUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHdvcmtlclR5cGVzUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlJ3MgdW5hbmNob3JlZCBkZWJ1Zy8gd291bGQgYWxzbyBoaWRlIGZyb250ZW5kIHNvdXJjZVxuICAgICAgLy8gZGlyZWN0b3JpZXMgc3VjaCBhcyBzcmMvZGVidWcvOyBjYXJnbyBvdXRwdXQgaXMgYWxyZWFkeSBjb3ZlcmVkIGJ5IHRhcmdldC8uXG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXmRlYnVnXFwvJC9nbSwgJyMgZGVidWcvJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyB8fCBjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXMpIHtcbiAgICAgIC8vIFRoZSBydXN0IHRlbXBsYXRlIGlnbm9yZXMgQ2FyZ28ubG9jaywgYnV0IGEgc3JjLXRhdXJpIGNvbmZpZ3VyYXRpb24gbWFya3MgYW5cbiAgICAgIC8vIGFwcGxpY2F0aW9uLCB3aG9zZSBDYXJnby5sb2NrIG11c3QgYmUgY29tbWl0dGVkIGZvciByZXByb2R1Y2libGUgYnVpbGRzLiBUaGVcbiAgICAgIC8vIHJ1bGUgaXMgYWxzbyBkaXNhYmxlZCB3aGVuIGEgc3ViIHBhY2thZ2UgY29udGFpbnMgYSBUYXVyaSBhcHBsaWNhdGlvbiwgYmVjYXVzZVxuICAgICAgLy8gYW4gdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgaW4gYSBwYXJlbnQgLmdpdGlnbm9yZSB3b3VsZCBoaWRlIHRoZSBuZXN0ZWRcbiAgICAgIC8vIGFwcGxpY2F0aW9uJ3MgbG9ja2ZpbGUuIFRhdXJpIHBsdWdpbiBsaWJyYXJpZXMgKGRldGVjdGVkIG9ubHkgdmlhXG4gICAgICAvLyBAdGF1cmktYXBwcy8qIGRlcGVuZGVuY2llcykga2VlcCB0aGUgdGVtcGxhdGUncyBwb2xpY3kgb2YgaWdub3JpbmcgQ2FyZ28ubG9jay5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eQ2FyZ29cXC5sb2NrJC9nbSwgJyMgQ2FyZ28ubG9jaycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbi8qKlxuICogVGhlIHZlcnNpb24gd2JmeSdzIG93biBwYWNrYWdlLmpzb24gY2FycmllcyBpbiB0aGUgcmVwb3NpdG9yeS4gYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgcmV3cml0ZXNcbiAqIGl0IGluIHRoZSBwdWJsaXNoZWQgdGFyYmFsbCBvbmx5IChpdCBpcyBuZXZlciBjb21taXR0ZWQgYmFjayksIHNvIGEgd2JmeSBydW4gc3RhcnRlZCBmcm9tIGEgZ2l0XG4gKiBjaGVja291dCByZXBvcnRzIHRoaXMgcGxhY2Vob2xkZXIgaW5zdGVhZCBvZiBhIHJlYWwgdmVyc2lvbi5cbiAqL1xuY29uc3QgdW5yZWxlYXNlZFZlcnNpb25QcmVmaXggPSAnMC4wLjAtJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uKCk6IHN0cmluZyB7XG4gIHJldHVybiByZWFkV2JmeVBhY2thZ2VKc29uKCkudmVyc2lvbjtcbn1cblxuLyoqIHdiZnkncyBsb2NhdGlvbiBpbnNpZGUgaXRzIG93biByZXBvc2l0b3J5LCByZWxhdGl2ZSB0byB0aGUgcmVwb3NpdG9yeSByb290LiAqL1xuY29uc3Qgd2JmeURpclBhdGhJblJlcG8gPSBwYXRoLmpvaW4oJ3BhY2thZ2VzJywgJ3diZnknKTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcHJvZHVjZWQgdGhlIGdlbmVyYXRlZCBmaWxlczogdGhlIHJlbGVhc2VkIHZlcnNpb24sIG9yXG4gKiBgPHNob3J0IGNvbW1pdCBoYXNoPlstZGlydHldLWxvY2FsYCB3aGVuIHdiZnkgcnVucyBmcm9tIGl0cyBvd24gZ2l0IGNoZWNrb3V0LiBVbmRlZmluZWQgd2hlblxuICogbmVpdGhlciBpcyBhdmFpbGFibGUgKGUuZy4gYW4gdW5yZWxlYXNlZCBidWlsZCBleHRyYWN0ZWQgZnJvbSBhIHNvdXJjZSBhcmNoaXZlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlWZXJzaW9uTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gTmVpdGhlciB0aGUgaW5zdGFsbGVkIHBhY2thZ2UuanNvbiBub3IgdGhlIGdpdCBzdGF0ZSBvZiB3YmZ5J3Mgb3duIGNoZWNrb3V0IGNhbiBjaGFuZ2VcbiAgLy8gbWlkLXJ1biwgYW5kIGNvbXB1dGluZyB0aGUgbGFiZWwgc3Bhd25zIHNldmVyYWwgZ2l0IHN1YnByb2Nlc3Nlcywgc28gaXQgaXMgY29tcHV0ZWQgb25jZS5cbiAgaWYgKCFoYXNDb21wdXRlZFZlcnNpb25MYWJlbCkge1xuICAgIGNhY2hlZFZlcnNpb25MYWJlbCA9IGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gICAgaGFzQ29tcHV0ZWRWZXJzaW9uTGFiZWwgPSB0cnVlO1xuICB9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uTGFiZWw7XG59XG5cbmxldCBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IGZhbHNlO1xubGV0IGNhY2hlZFZlcnNpb25MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBjb21wdXRlV2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IG5hbWUsIHZlcnNpb24sIGRpclBhdGggfSA9IHJlYWRXYmZ5UGFja2FnZUpzb24oKTtcbiAgaWYgKCF2ZXJzaW9uLnN0YXJ0c1dpdGgodW5yZWxlYXNlZFZlcnNpb25QcmVmaXgpKSByZXR1cm4gdmVyc2lvbjtcblxuICAvLyBnaXQgcmVzb2x2ZXMgdGhlIE5FQVJFU1QgZW5jbG9zaW5nIHJlcG9zaXRvcnksIHdoaWNoIGZvciBhbiB1bnJlbGVhc2VkIGJ1aWxkIHBsYWNlZCB1bmRlciBhXG4gIC8vIHRhcmdldCByZXBvc2l0b3J5IChub2RlX21vZHVsZXMsIG9yIGEgdmVuZG9yZWQvZXh0cmFjdGVkIHNvdXJjZSB0cmVlKSBpcyB0aGF0IHJlcG9zaXRvcnkg4oCUIGl0c1xuICAvLyBjb21taXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSB3YmZ5IGJ1aWxkIHRoYXQgcmFuLiBPbmx5IHdiZnkncyBvd24gbG9jYXRpb24gaW5zaWRlIGl0cyBvd25cbiAgLy8gcmVwb3NpdG9yeSBpZGVudGlmaWVzIGEgZ2VudWluZSBjaGVja291dCwgc28gYW55dGhpbmcgZWxzZSBmYWxscyBiYWNrIHRvIHRoZSB2ZXJzaW9uLWxlc3MgbGFiZWwuXG4gIGNvbnN0IGdpdFJvb3REaXJQYXRoID0gcnVuR2l0KFsncmV2LXBhcnNlJywgJy0tc2hvdy10b3BsZXZlbCddLCBkaXJQYXRoKTtcbiAgaWYgKFxuICAgICFnaXRSb290RGlyUGF0aCB8fFxuICAgIHBhdGgucmVsYXRpdmUoZ2l0Um9vdERpclBhdGgsIGRpclBhdGgpICE9PSB3YmZ5RGlyUGF0aEluUmVwbyB8fFxuICAgICFpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoKVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG9ydD04JywgJ0hFQUQnXSwgZGlyUGF0aCk7XG4gIGlmICghY29tbWl0SGFzaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gVGhlIGNvbW1pdCBhbG9uZSB3b3VsZCBtaXNpZGVudGlmeSBhIGJ1aWxkIG1hZGUgZnJvbSBhbiBlZGl0ZWQgY2hlY2tvdXQsIHNvIHVuY29tbWl0dGVkIGNoYW5nZXNcbiAgLy8gYXJlIHJlcG9ydGVkIHRvbyDigJQgYnV0IG9ubHkgdW5kZXIgcGFja2FnZXMvKi9zcmMsIHBhY2thZ2VzLyovYmluIGFuZCBwYWNrYWdlcy8qL2NvbmZpZ3MsIHRoZVxuICAvLyBzb3VyY2UsIGVudHJ5LXBvaW50IHdyYXBwZXIgYW5kIHBvbGljeSBmaWxlcyB3YmZ5IGFuZCBpdHMgd29ya3NwYWNlIGRlcGVuZGVuY2llcyBhY3R1YWxseSBydW5cbiAgLy8gZnJvbS4gRXZlcnl0aGluZyB3YmZ5IEdFTkVSQVRFUyB3aGVuIGl0IHRhcmdldHMgaXRzIG93biByZXBvc2l0b3J5IGxpdmVzIG91dHNpZGUgdGhvc2UgKHRoZVxuICAvLyByb290IFJFQURNRSB0aGlzIGxhYmVsIGdvZXMgaW50bywgYW5kIGVhY2ggcGFja2FnZSdzIC5naXRpZ25vcmUsIHBhY2thZ2UuanNvbiwgdHNjb25maWcsIOKApiksIHNvXG4gIC8vIGEgZmlyc3QgcnVuIGNhbm5vdCBtYWtlIHRoZSBuZXh0IG9uZSByZWxhYmVsIHRoZSBiYWRnZSBgLWRpcnR5LWxvY2FsYCBieSBpdHNlbGYuXG4gIC8vIE1hbmlmZXN0cyBzdGF5IG91dCBvbiBwdXJwb3NlLCBldmVuIHRob3VnaCBhbiBlZGl0ZWQgYGV4cG9ydHNgIG1hcCBjYW4gcmVkaXJlY3Qgd2hpY2ggY29kZVxuICAvLyBsb2Fkczogd2JmeSBHRU5FUkFURVMgcGFja2FnZS5qc29uLCBzbyBpbmNsdWRpbmcgaXQgd291bGQgbWFrZSBldmVyeSBydW4gcmVwb3J0IGl0c2VsZiBkaXJ0eS5cbiAgLy8gVGhlIGxhYmVsIGlzIGJlc3QtZWZmb3J0IGJ1aWxkIHByb3ZlbmFuY2UsIG5vdCBhIHJlcHJvZHVjaWJsZS1idWlsZCBhdHRlc3RhdGlvbi5cbiAgY29uc3QgaXNEaXJ0eSA9IGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGgpO1xuICBpZiAoaXNEaXJ0eSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoaXNEaXJ0eSkgcmV0dXJuIGAke2NvbW1pdEhhc2h9LWRpcnR5LWxvY2FsYDtcbiAgLy8gQW4gdW5tb2RpZmllZCBjaGVja291dCBzaXR0aW5nIG9uIGEgcmVsZWFzZSB0YWcgcnVucyBleGFjdGx5IHRoZSBjb2RlIHRoYXQgd2FzIHB1Ymxpc2hlZCB1bmRlclxuICAvLyB0aGF0IHZlcnNpb24sIHNvIGl0IGlzIGxhYmVsZWQgd2l0aCB0aGUgdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBjb21taXQgdGhhdCBvbmx5IHdiZnkgZGV2ZWxvcGVyc1xuICAvLyBjb3VsZCByZXNvbHZlIGJhY2sgdG8gb25lLlxuICByZXR1cm4gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChuYW1lLCBkaXJQYXRoKSA/PyBgJHtjb21taXRIYXNofS1sb2NhbGA7XG59XG5cbi8qKiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCB0YWdzIGVhY2ggcmVsZWFzZSBgPHBhY2thZ2UgbmFtZT5APHZlcnNpb24+YC4gKi9cbmZ1bmN0aW9uIGZpbmRSZWxlYXNlZFZlcnNpb25BdEhlYWQocGFja2FnZU5hbWU6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdQcmVmaXggPSBgJHtwYWNrYWdlTmFtZX1AYDtcbiAgLy8gQSBjb21taXQgY2FycmllcyBhdCBtb3N0IG9uZSByZWxlYXNlIHRhZyBwZXIgcGFja2FnZSwgc28gdGhlIGZpcnN0IG1hdGNoIGlzIHRoZSBvbmx5IG1hdGNoLlxuICByZXR1cm4gcnVuR2l0KFsndGFnJywgJy0tcG9pbnRzLWF0JywgJ0hFQUQnXSwgY3dkKVxuICAgID8uc3BsaXQoJ1xcbicpXG4gICAgLmZpbmQoKHRhZykgPT4gdGFnLnN0YXJ0c1dpdGgodGFnUHJlZml4KSlcbiAgICA/LnNsaWNlKHRhZ1ByZWZpeC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc1diZnlSZXBvc2l0b3J5KGdpdFJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gRXZlcnkgcmVtb3RlIGNvdW50cywgbm90IGp1c3QgYG9yaWdpbmA6IGEgZm9yayBjaGVja291dCBjYXJyaWVzIHRoZSBjYW5vbmljYWwgcmVwb3NpdG9yeSBhc1xuICAvLyBgdXBzdHJlYW1gLCBhbmQgaXQgaXMgc3RpbGwgYSBnZW51aW5lIHdiZnkgY2hlY2tvdXQgd2hvc2UgY29tbWl0IGlkZW50aWZpZXMgdGhlIGJ1aWxkLlxuICBjb25zdCByZW1vdGVVcmxzID0gcnVuR2l0KFsncmVtb3RlJywgJy12J10sIGdpdFJvb3REaXJQYXRoKTtcbiAgcmV0dXJuICEhcmVtb3RlVXJscz8uc3BsaXQoJ1xcbicpLnNvbWUoKGxpbmUpID0+IGlzQ2Fub25pY2FsUmVtb3RlVXJsKGxpbmUuc3BsaXQoL1sgXFx0XSsvdSlbMV0gPz8gJycpKTtcbn1cblxuY29uc3QgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGggPSAvXlxcLz9XaWxsQm9vc3RlclxcL3NoYXJlZCg/OlxcLmdpdCk/JC9pdTtcblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZW1vdGUgVVJMIHBvaW50cyBhdCB3YmZ5J3Mgb3duIHJlcG9zaXRvcnkuIFRoZSBob3N0IGlzIGNvbXBhcmVkIGFmdGVyIFBBUlNJTkcgcmF0aGVyXG4gKiB0aGFuIG1hdGNoZWQgaW5zaWRlIHRoZSBzdHJpbmc6IGFueSBwYXR0ZXJuIGxvb3NlIGVub3VnaCB0byBhY2NlcHQgZXZlcnkgVVJMIGZvcm0gZ2l0IHN1cHBvcnRzXG4gKiBhbHNvIGFjY2VwdGVkIGEgbG9va2FsaWtlIHRoYXQgbWVyZWx5IGNvbnRhaW5zIHRoZSBob3N0LCBzdWNoIGFzXG4gKiBgaHR0cHM6Ly9ldmlsLmV4YW1wbGUvL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGAsIGxldHRpbmcgYW4gdW5yZWxhdGVkIGNoZWNrb3V0IGNsYWltIHRvXG4gKiBiZSBhIGdlbnVpbmUgd2JmeSBidWlsZC5cbiAqL1xuZnVuY3Rpb24gaXNDYW5vbmljYWxSZW1vdGVVcmwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gc2NwLXN0eWxlIChgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXIvc2hhcmVkLmdpdGApIGlzIG5vdCBhIFVSTCwgc28gaXQgaXMgbWF0Y2hlZCBzZXBhcmF0ZWx5LlxuICAvLyBUaGUgbG9va2FoZWFkIGtlZXBzIGEgc2NoZW1lJ3MgYDovL2AgZnJvbSBiZWluZyByZWFkIGFzIHRoZSBgaG9zdDpwYXRoYCBzZXBhcmF0b3IuXG4gIGNvbnN0IHNjcE1hdGNoID0gL14oPzpbXkAvXStAKT8oW14vOl0rKTooPyFcXC8pKC4qKSQvdS5leGVjKHVybCk7XG4gIGlmIChzY3BNYXRjaCkge1xuICAgIHJldHVybiBzY3BNYXRjaFsxXSEudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3Qoc2NwTWF0Y2hbMl0hKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBhdGhuYW1lIH0gPSBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIGhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJyAmJiBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aC50ZXN0KHBhdGhuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEdpdERpcnR5U3RhdGUoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgW1xuICAgICAgJ3N0YXR1cycsXG4gICAgICAnLS1wb3JjZWxhaW4nLFxuICAgICAgJy0tdW50cmFja2VkLWZpbGVzPWFsbCcsXG4gICAgICAnLS0nLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9Lyovc3JjLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2Jpbi8qKmAsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9jb25maWdzLyoqYCxcbiAgICBdLFxuICAgIHsgY3dkOiBnaXRSb290RGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9XG4gICk7XG4gIHJldHVybiBwcm9jLnN0YXR1cyA9PT0gMCA/ICEhcHJvYy5zdGRvdXQudHJpbSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBydW5HaXQoYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKCdnaXQnLCBhcmdzLCB7IGN3ZCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gcHJvYy5zdGRvdXQudHJpbSgpIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFdiZnlQYWNrYWdlSnNvbjogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBSZXR1cm5zIHdiZnkncyBvd24gcGFja2FnZSBkaXJlY3RvcnksIHdoaWNoIGFsc28gaG9sZHMgaXRzIGNvbmZpZ3MgKGUuZy4gcmVsZWFzZUFnZUdhdGUuanNvbikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeURpclBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS5kaXJQYXRoO1xufVxuXG5mdW5jdGlvbiByZWFkV2JmeVBhY2thZ2VKc29uKCk6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGRpclBhdGg6IHN0cmluZyB9IHtcbiAgaWYgKGNhY2hlZFdiZnlQYWNrYWdlSnNvbikgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbiAgLy8gZmlsZVVSTFRvUGF0aCwgbm90IFVSTC5wYXRobmFtZTogdGhlIGxhdHRlciBrZWVwcyBwZXJjZW50LWVuY29kaW5nLCBzbyBhbiBpbnN0YWxsYXRpb24gcGF0aFxuICAvLyBjb250YWluaW5nIGUuZy4gYSBzcGFjZSB3b3VsZCByZXNvbHZlIHRvIGEgbm9uZXhpc3RlbnQgZGlyZWN0b3J5IGFuZCB0aGUgc2VhcmNoIHdvdWxkIHdhbGsgdXBcbiAgLy8gdG8gYW4gdW5yZWxhdGVkIHBhY2thZ2UuXG4gIGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gICAgLy8gcGF0aC5kaXJuYW1lKCcvJykgPT09ICcvJywgc28gdGhlIHNlYXJjaCBtdXN0IHN0b3AgZXhwbGljaXRseSBhdCB0aGUgZmlsZXN5c3RlbSByb290LlxuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSB0aHJvdyBuZXcgRXJyb3IoXCJ3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBpcyBtaXNzaW5nLlwiKTtcbiAgICBkaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICBjYWNoZWRXYmZ5UGFja2FnZUpzb24gPSB7IG5hbWU6IHBhY2thZ2VKc29uLm5hbWUsIHZlcnNpb246IHBhY2thZ2VKc29uLnZlcnNpb24sIGRpclBhdGggfTtcbiAgcmV0dXJuIGNhY2hlZFdiZnlQYWNrYWdlSnNvbjtcbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRXYmZ5RGlyUGF0aCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIEdMT0JBTFxuICogcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuIFJlcG9zaXRvcnkgY29uZmlncyBndWFyZCBvbmx5IHdiZmllZCByZXBvc2l0b3JpZXM7IGEgYnJhbmQtbmV3IGxvY2FsXG4gKiBwcm9qZWN0IGhhcyBubyBidW5maWcudG9tbCB5ZXQsIHNvIHRoZSBnbG9iYWwgZmlsZXMgYXJlIHRoZSBvbmx5IGdhdGUgYmV0d2VlbiBgYnVuIGNyZWF0ZWAgL1xuICogYG5wbSBpbml0YCBhbmQgYSBmcmVzaGx5IGNvbXByb21pc2VkIHJlbGVhc2UuIFRoZSBzYW1lIHNjcmlwdCBydW5zIG9uIENJIGFuZCBvbiB0aGUgc2VsZi1ob3N0ZWRcbiAqIHJ1bm5lcnMsIHNvIGV2ZXJ5IG1hY2hpbmUgZW5kcyB1cCB3aXRoIGJ5dGUtaWRlbnRpY2FsIHNldHRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk6IGJvb2xlYW4ge1xuICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKCdiYXNoJywgW3BhdGguam9pbihnZXRXYmZ5RGlyUGF0aCgpLCAnY29uZmlncycsICdhcHBseVJlbGVhc2VBZ2VHYXRlLnNoJyldLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFwcGx5IHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGUgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzLicpO1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSnNPclRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YSB8fCBjb25maWcuZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCB0YXNrT3B0aW9ucyA9IFtcbiAgICB7XG4gICAgICBhcmdzOiAnLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICEqKi9wYWNrYWdlLmpzb24nLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5veGZtdCxcbiAgICAgIG5hbWU6ICdPeGZtdCcsXG4gICAgICBwcm9ncmFtOiBveGZtdFByb2dyYW0sXG4gICAgfSxcbiAgICB7XG4gICAgICBhcmdzOiAnLS1jYWNoZSAtLXdyaXRlJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLnByZXR0aWVyT25seSxcbiAgICAgIG5hbWU6ICdQcmV0dGllcicsXG4gICAgICBwcm9ncmFtOiBwcmV0dGllclByb2dyYW0sXG4gICAgfSxcbiAgXVxuICAgIC5maWx0ZXIoKHRhc2spID0+IHRhc2suY29uZGl0aW9uKVxuICAgIC5mbGF0TWFwKCh0YXNrKSA9PiB0YXNrLmV4dGVuc2lvbnMubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKHRhc2sucHJvZ3JhbSwgdGFzay5hcmdzLCB0YXNrLm5hbWUsIGV4dCkpKTtcblxuICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuICAgICR7dGFza09wdGlvbnMuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZyc+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAnYnVuIHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbCc7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCIiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0cmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgc29ydE9iamVjdEtleXMgZnJvbSAnc29ydC1vYmplY3Qta2V5cydcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCdcbmltcG9ydCB7IGRldGVjdE5ld2xpbmVHcmFjZWZ1bCBhcyBkZXRlY3ROZXdsaW5lIH0gZnJvbSAnZGV0ZWN0LW5ld2xpbmUnXG5pbXBvcnQgZ2l0SG9va3MgZnJvbSAnZ2l0LWhvb2tzLWxpc3QnXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICdpcy1wbGFpbi1vYmonXG5pbXBvcnQgc2VtdmVyQ29tcGFyZSBmcm9tICdzZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanMnXG5pbXBvcnQgc2VtdmVyTWluVmVyc2lvbiBmcm9tICdzZW12ZXIvcmFuZ2VzL21pbi12ZXJzaW9uLmpzJ1xuXG5jb25zdCBwaXBlID1cbiAgKGZucykgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnJlZHVjZSgocmVzdWx0LCBmbikgPT4gZm4ocmVzdWx0LCAuLi5hcmdzKSwgeClcbmNvbnN0IG9uQXJyYXkgPSAoZm4pID0+ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGZuKHgpIDogeClcbmNvbnN0IG9uU3RyaW5nQXJyYXkgPSAoZm4pID0+ICh4KSA9PlxuICBBcnJheS5pc0FycmF5KHgpICYmIHguZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgPyBmbih4KSA6IHhcbmNvbnN0IHVuaXEgPSBvblN0cmluZ0FycmF5KCh4cykgPT4gWy4uLm5ldyBTZXQoeHMpXSlcbmNvbnN0IHNvcnRBcnJheSA9IG9uU3RyaW5nQXJyYXkoKGFycmF5KSA9PiBhcnJheS50b1NvcnRlZCgpKVxuY29uc3QgdW5pcUFuZFNvcnRBcnJheSA9IHBpcGUoW3VuaXEsIHNvcnRBcnJheV0pXG5jb25zdCBvbk9iamVjdCA9XG4gIChmbikgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgaXNQbGFpbk9iamVjdCh4KSA/IGZuKHgsIC4uLmFyZ3MpIDogeFxuY29uc3Qgc29ydE9iamVjdEJ5ID0gKGNvbXBhcmF0b3IsIGRlZXApID0+IHtcbiAgY29uc3Qgb3ZlciA9IG9uT2JqZWN0KChvYmplY3QpID0+IHtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvdmVyKHZhbHVlKV0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhvYmplY3QsIGNvbXBhcmF0b3IpXG4gIH0pXG5cbiAgcmV0dXJuIG92ZXJcbn1cbmNvbnN0IHNvcnRPYmplY3QgPSBzb3J0T2JqZWN0QnkoKVxuY29uc3Qgc29ydFVSTE9iamVjdCA9IHNvcnRPYmplY3RCeShbJ3R5cGUnLCAndXJsJ10pXG5jb25zdCBzb3J0UGVvcGxlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnbmFtZScsICdlbWFpbCcsICd1cmwnXSlcbmNvbnN0IHNvcnREaXJlY3RvcmllcyA9IHNvcnRPYmplY3RCeShbXG4gICdsaWInLFxuICAnYmluJyxcbiAgJ21hbicsXG4gICdkb2MnLFxuICAnZXhhbXBsZScsXG4gICd0ZXN0Jyxcbl0pXG5jb25zdCBvdmVyUHJvcGVydHkgPSAocHJvcGVydHksIG92ZXIpID0+XG4gIG9uT2JqZWN0KChvYmplY3QsIC4uLmFyZ3MpID0+XG4gICAgT2JqZWN0Lmhhc093bihvYmplY3QsIHByb3BlcnR5KVxuICAgICAgPyB7IC4uLm9iamVjdCwgW3Byb3BlcnR5XTogb3ZlcihvYmplY3RbcHJvcGVydHldLCAuLi5hcmdzKSB9XG4gICAgICA6IG9iamVjdCxcbiAgKVxuY29uc3Qgc29ydEdpdEhvb2tzID0gc29ydE9iamVjdEJ5KGdpdEhvb2tzKVxuXG5jb25zdCBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UgPSAoc3BlY2lmaWVyKSA9PiB7XG4gIC8vIElnbm9yZSBhbnl0aGluZyBhZnRlciA+ICYgcmVseSBvbiBmYWxsYmFjayBhbHBoYW51bWVyaWMgc29ydGluZyBmb3IgdGhhdFxuICBjb25zdCBbbmFtZUFuZFZlcnNpb25dID0gc3BlY2lmaWVyLnNwbGl0KCc+JylcbiAgY29uc3QgYXRNYXRjaGVzID0gWy4uLm5hbWVBbmRWZXJzaW9uLm1hdGNoQWxsKCdAJyldXG4gIGlmIChcbiAgICAhYXRNYXRjaGVzLmxlbmd0aCB8fFxuICAgIChhdE1hdGNoZXMubGVuZ3RoID09PSAxICYmIGF0TWF0Y2hlc1swXS5pbmRleCA9PT0gMClcbiAgKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogc3BlY2lmaWVyIH1cbiAgfVxuICBjb25zdCBzcGxpdEluZGV4ID0gYXRNYXRjaGVzLnBvcCgpLmluZGV4XG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpLFxuICAgIHJhbmdlOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpLFxuICB9XG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeVNlbXZlciA9IHNvcnRPYmplY3RCeSgoYSwgYikgPT4ge1xuICBjb25zdCB7IG5hbWU6IGFOYW1lLCByYW5nZTogYVJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYSlcbiAgY29uc3QgeyBuYW1lOiBiTmFtZSwgcmFuZ2U6IGJSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGIpXG5cbiAgaWYgKGFOYW1lICE9PSBiTmFtZSkge1xuICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lLCAnZW4nKVxuICB9XG4gIGlmICghYVJhbmdlKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKCFiUmFuZ2UpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIHJldHVybiBzZW12ZXJDb21wYXJlKHNlbXZlck1pblZlcnNpb24oYVJhbmdlKSwgc2VtdmVyTWluVmVyc2lvbihiUmFuZ2UpKVxufSlcblxuY29uc3QgZ2V0UGFja2FnZU5hbWUgPSAoaWRlbnQpID0+IHtcbiAgY29uc3QgaW5kZXggPSBpZGVudC5pbmRleE9mKCdAJywgaWRlbnQuc3RhcnRzV2l0aCgnQCcpID8gMSA6IDApXG4gIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHVubGVzcyB1c2VyIG1hbnVhbGx5IGVkaXQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyBpZGVudCA6IGlkZW50LnNsaWNlKDAsIGluZGV4KVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlJZGVudCA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lQSA9IGdldFBhY2thZ2VOYW1lKGEpXG4gIGNvbnN0IHBhY2thZ2VOYW1lQiA9IGdldFBhY2thZ2VOYW1lKGIpXG5cbiAgaWYgKHBhY2thZ2VOYW1lQSA8IHBhY2thZ2VOYW1lQikgcmV0dXJuIC0xXG4gIGlmIChwYWNrYWdlTmFtZUEgPiBwYWNrYWdlTmFtZUIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIENhY2hlIGJ5IGBwcm9jZXNzLmN3ZCgpYCBpbnN0ZWFkIG9mIGEgdmFyaWFibGUgdG8gYWxsb3cgdXNlciBjYWxsIGBwcm9jZXNzLmNoZGlyKClgXG5jb25zdCBjYWNoZSA9IG5ldyBNYXAoKVxuY29uc3QgaGFzWWFybk9yUG5wbUZpbGVzID0gKCkgPT4ge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghY2FjaGUuaGFzKGN3ZCkpIHtcbiAgICBjYWNoZS5zZXQoXG4gICAgICBjd2QsXG4gICAgICBmcy5leGlzdHNTeW5jKCd5YXJuLmxvY2snKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybi8nKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybnJjLnltbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0tbG9jay55YW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS13b3Jrc3BhY2UueWFtbCcpLFxuICAgIClcbiAgfVxuICByZXR1cm4gY2FjaGUuZ2V0KGN3ZClcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBwYWNrYWdlIG1hbmFnZXIgZnJvbSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlSnNvbiAtIFRoZSBwYXJzZWQgcGFja2FnZS5qc29uIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlci4gRGVmYXVsdCB0byBucG0gaWYgbm90IGRldGVjdGVkLlxuICovXG5mdW5jdGlvbiBzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL2NvcmVwYWNrXG4gIGlmICh0eXBlb2YgcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ25wbUAnKVxuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyPy5uYW1lKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLmRldkVuZ2luZXMucGFja2FnZU1hbmFnZXIubmFtZSA9PT0gJ25wbSdcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5wbnBtKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBPcHRpbWlzYXRpb246IENoZWNrIGlmIG5wbSBpcyBleHBsaWNpdCBiZWZvcmUgcmVhZGluZyBGUy5cbiAgaWYgKHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5wbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaGFzWWFybk9yUG5wbUZpbGVzKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU29ydCBkZXBlbmRlbmNpZXMgYWxwaGFiZXRpY2FsbHksIGRldGVjdGluZyBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlIHRoZVxuICogYXBwcm9wcmlhdGUgY29tcGFyaXNvbi4gbnBtIHVzZXMgbG9jYWxlLWF3YXJlIGNvbXBhcmlzb24sIHlhcm4gYW5kIHBucG0gdXNlXG4gKiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb25cbiAqL1xuY29uc3Qgc29ydERlcGVuZGVuY2llcyA9IG9uT2JqZWN0KChkZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIC8vIEF2b2lkIGZpbGUgYWNjZXNzXG4gIGlmIChPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzXG4gIH1cblxuICAvLyBzb3J0IGRlcHMgbGlrZSB0aGUgbnBtIENMSSBkb2VzICh2aWEgdGhlIHBhY2thZ2UgQG5wbWNsaS9wYWNrYWdlLWpzb24pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vcGFja2FnZS1qc29uL2Jsb2IvYjY0NjVmNDRjNzI3ZDY1MTNkYjY4OThjN2NiZTQxZGQzNTVjZWJlOC9saWIvdXBkYXRlLWRlcGVuZGVuY2llcy5qcyNMOC1MMjFcbiAgaWYgKHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMsIChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYiwgJ2VuJykpXG4gIH1cblxuICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzKVxufSlcblxuLyoqXG4gKiBcIndvcmtzcGFjZXNcIiBjYW4gYmUgYW4gYXJyYXkgKG5wbSBvciB5YXJuIGNsYXNzaWMpIG9yIGFuIG9iamVjdCAocG5wbS9idW4pLlxuICogSW4gdGhlIGNhc2Ugb2YgYW4gYXJyYXksIHdlIGRvIG5vdCB3YW50IHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgaXQgaW4gY2FzZVxuICogc2NyaXB0cyBuZWVkIHRvIHJ1biBpbiBhIHNwZWNpZmljIG9yZGVyLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjcvdXNpbmctbnBtL3dvcmtzcGFjZXM/dj10cnVlI3J1bm5pbmctY29tbWFuZHMtaW4tdGhlLWNvbnRleHQtb2Ytd29ya3NwYWNlc1xuICovXG5jb25zdCBzb3J0V29ya3NwYWNlcyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoWydwYWNrYWdlcycsICdjYXRhbG9nJ10pLFxuICBvdmVyUHJvcGVydHkoJ3BhY2thZ2VzJywgdW5pcUFuZFNvcnRBcnJheSksXG4gIG92ZXJQcm9wZXJ0eSgnY2F0YWxvZycsIHNvcnREZXBlbmRlbmNpZXMpLFxuXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9hY2MwZTQ3NTcyYTkzOTAyOTJiNGUzMTNiNGE0YmYzNjBkMjM2MzU4L2NvbmYvY29uZmlnLXNjaGVtYS5qc1xuY29uc3QgZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gIC8vIGBmaWxlc2AgYW5kIGBleGNsdWRlZEZpbGVzYCBhcmUgb25seSBvbiBgb3ZlcnJpZGVzW11gXG4gIC8vIGZvciBlYXNpZXIgc29ydCBgb3ZlcnJpZGVzW11gLFxuICAvLyBhZGQgdGhlbSB0byBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHNvcnQgYG92ZXJyaWRlc1tdYCB0d2ljZVxuICAnZmlsZXMnLFxuICAnZXhjbHVkZWRGaWxlcycsXG4gIC8vIGJhc2VDb25maWdcbiAgJ2VudicsXG4gICdwYXJzZXInLFxuICAncGFyc2VyT3B0aW9ucycsXG4gICdzZXR0aW5ncycsXG4gICdwbHVnaW5zJyxcbiAgJ2V4dGVuZHMnLFxuICAncnVsZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ2dsb2JhbHMnLFxuICAncHJvY2Vzc29yJyxcbiAgJ25vSW5saW5lQ29uZmlnJyxcbiAgJ3JlcG9ydFVudXNlZERpc2FibGVEaXJlY3RpdmVzJyxcbl1cbmNvbnN0IHNvcnRFc2xpbnRDb25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KCdlbnYnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KCdnbG9iYWxzJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+IG92ZXJyaWRlcy5tYXAoc29ydEVzbGludENvbmZpZykpLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3BhcnNlck9wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdydWxlcycsXG4gICAgc29ydE9iamVjdEJ5KFxuICAgICAgKHJ1bGUxLCBydWxlMikgPT5cbiAgICAgICAgcnVsZTEuc3BsaXQoJy8nKS5sZW5ndGggLSBydWxlMi5zcGxpdCgnLycpLmxlbmd0aCB8fFxuICAgICAgICBydWxlMS5sb2NhbGVDb21wYXJlKHJ1bGUyKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3NldHRpbmdzJywgc29ydE9iamVjdCksXG5dKVxuY29uc3Qgc29ydFZTQ29kZUJhZGdlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnZGVzY3JpcHRpb24nLCAndXJsJywgJ2hyZWYnXSlcblxuY29uc3Qgc29ydFByZXR0aWVyQ29uZmlnID0gcGlwZShbXG4gIC8vIHNvcnQga2V5cyBhbHBoYWJldGljYWxseSwgYnV0IHB1dCBgb3ZlcnJpZGVzYCBhdCBib3R0b21cbiAgb25PYmplY3QoKGNvbmZpZykgPT5cbiAgICBzb3J0T2JqZWN0S2V5cyhjb25maWcsIFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKGNvbmZpZylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdvdmVycmlkZXMnKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgJ292ZXJyaWRlcycsXG4gICAgXSksXG4gICksXG4gIC8vIGlmIGBjb25maWcub3ZlcnJpZGVzYCBleGlzdHNcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIC8vIGFuZCBgY29uZmlnLm92ZXJyaWRlc2AgaXMgYW4gYXJyYXlcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+XG4gICAgICBvdmVycmlkZXMubWFwKFxuICAgICAgICBwaXBlKFtcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW11gIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgc29ydE9iamVjdCxcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW10ub3B0aW9uc2AgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBvdmVyUHJvcGVydHkoJ29wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICksXG5dKVxuXG5jb25zdCBzb3J0Vm9sdGEgPSBzb3J0T2JqZWN0QnkoWydub2RlJywgJ25wbScsICd5YXJuJ10pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvd2lyZWl0XG5jb25zdCB3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzID0gWydjb21tYW5kJywgJ2RlcGVuZGVuY2llcycsICdmaWxlcycsICdvdXRwdXQnXVxuY29uc3Qgc29ydFdpcmVpdFNjcmlwdCA9IHBpcGUoW1xuICBzb3J0T2JqZWN0Qnkod2lyZWl0U2NyaXB0UHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICBvbkFycmF5KChkZXBzKSA9PiBkZXBzLm1hcChzb3J0T2JqZWN0QnkoWydzY3JpcHQnLCAnY2FzY2FkZSddKSkpLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2VudicsXG4gICAgb25PYmplY3QoKGVudikgPT5cbiAgICAgIHNvcnRPYmplY3RLZXlzKFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoZW52KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc29ydE9iamVjdEJ5KFsnZXh0ZXJuYWwnLCAnZGVmYXVsdCddKSh2YWx1ZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnc2VydmljZScsXG4gICAgcGlwZShbc29ydE9iamVjdEJ5KFsncmVhZHlXaGVuJ10pLCBvdmVyUHJvcGVydHkoJ3JlYWR5V2hlbicsIHNvcnRPYmplY3QpXSksXG4gICksXG5dKVxuY29uc3Qgc29ydFdpcmVpdCA9IG9uT2JqZWN0KCh3aXJlaXQpID0+XG4gIHNvcnRPYmplY3RLZXlzKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdpcmVpdCkubWFwKChbbmFtZSwgY29uZmlnXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICBzb3J0V2lyZWl0U2NyaXB0KGNvbmZpZyksXG4gICAgICBdKSxcbiAgICApLFxuICApLFxuKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAoa2V5KSA9PiAoa2V5LnN0YXJ0c1dpdGgoJy4nKSA/ICdwYXRocycgOiAnY29uZGl0aW9ucycpLFxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4ucGF0aHMsIC4uLnNvcnRDb25kaXRpb25zKGNvbmRpdGlvbnMpXS5tYXAoKGtleSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgc29ydEV4cG9ydHMoZXhwb3J0c1trZXldKSxcbiAgICBdKSxcbiAgKVxufSlcblxuLy8gZmllbGRzIG1hcmtlZCBgdnNjb2RlYCBhcmUgZm9yIGBWaXN1YWwgU3R1ZGlvIENvZGUgZXh0ZW5zaW9uIG1hbmlmZXN0YCBvbmx5XG4vLyBodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9hcGkvcmVmZXJlbmNlcy9leHRlbnNpb24tbWFuaWZlc3Rcbi8vIFN1cHBvcnRlZCBmaWVsZHM6XG4vLyBwdWJsaXNoZXIsIGRpc3BsYXlOYW1lLCBjYXRlZ29yaWVzLCBnYWxsZXJ5QmFubmVyLCBwcmV2aWV3LCBjb250cmlidXRlcyxcbi8vIGFjdGl2YXRpb25FdmVudHMsIGJhZGdlcywgbWFya2Rvd24sIHFuYSwgZXh0ZW5zaW9uUGFjayxcbi8vIGV4dGVuc2lvbkRlcGVuZGVuY2llcywgaWNvblxuXG4vLyBmaWVsZC5rZXl7c3RyaW5nfTogZmllbGQgbmFtZVxuLy8gZmllbGQub3ZlcntmdW5jdGlvbn06IHNvcnQgZmllbGQgc3ViS2V5XG5jb25zdCBmaWVsZHMgPSBbXG4gIHsga2V5OiAnJHNjaGVtYScgfSxcbiAgeyBrZXk6ICduYW1lJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdkaXNwbGF5TmFtZScgfSxcbiAgeyBrZXk6ICd2ZXJzaW9uJyB9LFxuICAvKiB5YXJuICovIHsga2V5OiAnc3RhYmxlVmVyc2lvbicgfSxcbiAgeyBrZXk6ICdwcml2YXRlJyB9LFxuICB7IGtleTogJ2Rlc2NyaXB0aW9uJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjYXRlZ29yaWVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2tleXdvcmRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2hvbWVwYWdlJyB9LFxuICB7IGtleTogJ2J1Z3MnLCBvdmVyOiBzb3J0T2JqZWN0QnkoWyd1cmwnLCAnZW1haWwnXSkgfSxcbiAgeyBrZXk6ICdyZXBvc2l0b3J5Jywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2Z1bmRpbmcnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnbGljZW5zZScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncW5hJyB9LFxuICB7IGtleTogJ2F1dGhvcicsIG92ZXI6IHNvcnRQZW9wbGVPYmplY3QgfSxcbiAge1xuICAgIGtleTogJ21haW50YWluZXJzJyxcbiAgICBvdmVyOiBvbkFycmF5KChtYWludGFpbmVycykgPT4gbWFpbnRhaW5lcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbnRyaWJ1dG9ycycsXG4gICAgb3Zlcjogb25BcnJheSgoY29udHJpYnV0b3JzKSA9PiBjb250cmlidXRvcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHVibGlzaGVyJyB9LFxuICB7IGtleTogJ3NpZGVFZmZlY3RzJyB9LFxuICB7IGtleTogJ3R5cGUnIH0sXG4gIHsga2V5OiAnaW1wb3J0cycgfSxcbiAgeyBrZXk6ICdleHBvcnRzJywgb3Zlcjogc29ydEV4cG9ydHMgfSxcbiAgeyBrZXk6ICdtYWluJyB9LFxuICB7IGtleTogJ3N2ZWx0ZScgfSxcbiAgeyBrZXk6ICd1bWQ6bWFpbicgfSxcbiAgeyBrZXk6ICdqc2RlbGl2cicgfSxcbiAgeyBrZXk6ICd1bnBrZycgfSxcbiAgeyBrZXk6ICdtb2R1bGUnIH0sXG4gIHsga2V5OiAnc291cmNlJyB9LFxuICB7IGtleTogJ2pzbmV4dDptYWluJyB9LFxuICB7IGtleTogJ2Jyb3dzZXInIH0sXG4gIHsga2V5OiAncmVhY3QtbmF0aXZlJyB9LFxuICB7IGtleTogJ3R5cGVzJyB9LFxuICB7IGtleTogJ3R5cGVzVmVyc2lvbnMnIH0sXG4gIHsga2V5OiAndHlwaW5ncycgfSxcbiAgeyBrZXk6ICdzdHlsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGVzdHlsZScgfSxcbiAgeyBrZXk6ICdhc3NldHMnIH0sXG4gIHsga2V5OiAnYmluJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21hbicgfSxcbiAgeyBrZXk6ICdkaXJlY3RvcmllcycsIG92ZXI6IHNvcnREaXJlY3RvcmllcyB9LFxuICB7IGtleTogJ2ZpbGVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ3dvcmtzcGFjZXMnLCBvdmVyOiBzb3J0V29ya3NwYWNlcyB9LFxuICAvLyBub2RlLXByZS1neXAgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvbm9kZS1wcmUtZ3lwIzEtYWRkLW5ldy1lbnRyaWVzLXRvLXlvdXItcGFja2FnZWpzb25cbiAge1xuICAgIGtleTogJ2JpbmFyeScsXG4gICAgb3Zlcjogc29ydE9iamVjdEJ5KFtcbiAgICAgICdtb2R1bGVfbmFtZScsXG4gICAgICAnbW9kdWxlX3BhdGgnLFxuICAgICAgJ3JlbW90ZV9wYXRoJyxcbiAgICAgICdwYWNrYWdlX25hbWUnLFxuICAgICAgJ2hvc3QnLFxuICAgIF0pLFxuICB9LFxuICB7IGtleTogJ3NjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ2JldHRlclNjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ3dpcmVpdCcsIG92ZXI6IHNvcnRXaXJlaXQgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gW1xuICAnQHRzY29uZmlnL2J1bicsXG4gICdAdHNjb25maWcvbm9kZS1sdHMnLFxuICAnQHRzY29uZmlnL25vZGUtdHMnLFxuICAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZScsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgLy8gUmVhY3QgTmF0aXZlIG5lZWRzIE1ldHJvLWNvbXBhdGlibGUgc2V0dGluZ3MgKGpzeDogcmVhY3QtbmF0aXZlLCBub2RlIHJlc29sdXRpb24pLCB3aGljaFxuICAvLyBAdHNjb25maWcvYnVuIHdvdWxkIG92ZXJyaWRlIGV2ZW4gdGhvdWdoIHRoZSByZXBvIHVzZXMgQnVuIGFzIGl0cyBwYWNrYWdlIG1hbmFnZXIuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiAnQHRzY29uZmlnL2J1bi90c2NvbmZpZy5qc29uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiBbJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnXTtcbiAgfVxuICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGEgZ2VuZXJhdGVkIGNvbmZpZyBmaWxlIHNob3VsZCB1c2UgdG8gbG9hZCBhXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIGNvbmZpZyBwYWNrYWdlIHN1Y2ggYXMgYEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnYC5cbiAqXG4gKiBPdXRzaWRlIHdpbGxib29zdGVyLWNvbmZpZ3MgdGhpcyBpcyBzaW1wbHkgdGhlIHB1Ymxpc2hlZCBwYWNrYWdlIG5hbWUuIEluc2lkZVxuICogd2lsbGJvb3N0ZXItY29uZmlncyB0aGUgcGFja2FnZSBtdXN0IG5vdCBiZSBkZWNsYXJlZCBhcyBhIGRlcGVuZGVuY3k6IHRoZVxuICogY29uZmlnIHBhY2thZ2VzIGltcG9ydCBvbmUgYW5vdGhlciAoZS5nLiBveGZtdC1jb25maWcncyBveGxpbnQuY29uZmlnLnRzXG4gKiBpbXBvcnRzIG94bGludC1jb25maWcgYW5kIHZpY2UgdmVyc2EpLCBzbyBhIGRlY2xhcmVkIGVkZ2Ugd291bGQgZm9ybSBhXG4gKiBkZXBlbmRlbmN5IGN5Y2xlIHRoYXQgbXVsdGktc2VtYW50aWMtcmVsZWFzZSBjYW5ub3QgdG9wb2xvZ2ljYWxseSBzb3J0LiBTaW5jZVxuICogdGhlIGVkZ2UgaXMgYWJzZW50LCBpc29sYXRlZCBpbnN0YWxscyBjYW5ub3QgcmVzb2x2ZSB0aGUgYmFyZSBwYWNrYWdlIG5hbWUsIHNvXG4gKiBpbXBvcnQgdGhlIGNvbW1pdHRlZCBgY29uZmlnLm1qc2AgYnVpbGQgb3V0cHV0IHRocm91Z2ggYSByZWxhdGl2ZSBwYXRoIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBjb25maWdQYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybiBjb25maWdQYWNrYWdlTmFtZTtcblxuICAvLyBlLmcuICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycgLT4gJ294bGludC1jb25maWcnLCB3aGljaCBpcyBpdHMgZGlyZWN0b3J5IHVuZGVyIGBwYWNrYWdlcy9gLlxuICBjb25zdCBjb25maWdQYWNrYWdlRGlyID0gY29uZmlnUGFja2FnZU5hbWUuc3BsaXQoJy8nKS5wb3AoKSA/PyAnJztcbiAgLy8gRGVyaXZlIHRoZSB3aWxsYm9vc3Rlci1jb25maWdzIHJvb3QgZnJvbSB0aGUgcGFja2FnZSBiZWluZyBnZW5lcmF0ZWQsIG5vdCBmcm9tIHRoZSBDTEkgZW50cnlcbiAgLy8gcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxwa2c+YCBpcyBhIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIGVudHJ5IGNvbmZpZyBpcyB0aGUgY2hpbGRcbiAgLy8gcGFja2FnZSByYXRoZXIgdGhhbiB0aGUgcmVwbyByb290LCBzbyByZWx5aW5nIG9uIHRoZSBlbnRyeSB3b3VsZCBlbWl0IGEgbmVzdGVkLCB1bnJlc29sdmFibGVcbiAgLy8gcGF0aCBmb3IgYSBkaXJlY3RseSB0YXJnZXRlZCBjb25maWcgcGFja2FnZS4gRXZlcnkgd2lsbGJvb3N0ZXItY29uZmlncyBwYWNrYWdlIGlzIGVpdGhlciB0aGVcbiAgLy8gcm9vdCBvciBhIGRpcmVjdCBjaGlsZCB1bmRlciBgcGFja2FnZXMvYCwgc28gdGhlIHJvb3QgaXMgdGhlIHBhY2thZ2UgZGlyIGl0c2VsZiBvciBpdHMgZ3JhbmRwYXJlbnQuXG4gIGNvbnN0IHJlcG9Sb290RGlyUGF0aCA9IGNvbmZpZy5pc1Jvb3QgPyBjb25maWcuZGlyUGF0aCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gIGNvbnN0IGxvY2FsRW50cnkgPSBwYXRoLnJlc29sdmUocmVwb1Jvb3REaXJQYXRoLCAncGFja2FnZXMnLCBjb25maWdQYWNrYWdlRGlyLCAnY29uZmlnLm1qcycpO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBsb2NhbEVudHJ5KTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJlxuICAgICFjb25maWcuaXNSb290ICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uPy5wcml2YXRlICE9PSB0cnVlICYmXG4gICAgQXJyYXkuaXNBcnJheShjb25maWcucGFja2FnZUpzb24/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvciwgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuLi91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcbmltcG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG4gIGhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybixcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbn0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5pbXBvcnQgeyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgfSBmcm9tICcuL2J1bmZpZy5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG4vLyBUeXBlU2NyaXB0IDcncyBgdHlwZXNjcmlwdGAgcGFja2FnZSBpcyB0aGUgdHNnbyBuYXRpdmUgY29tcGlsZXIgYW5kIGV4cG9zZXMgbm9cbi8vIHByb2dyYW1tYXRpYyBBUEkuIE5leHQuanMncyBidWlsZC10aW1lIGB2ZXJpZnlUeXBlU2NyaXB0U2V0dXBgIG5lZWRzIHRoYXQgQVBJLCBzb1xuLy8gYG5leHQgYnVpbGRgIGZhaWxzIChcInRyeWluZyB0byB1c2UgVHlwZVNjcmlwdCBidXQgZG8gbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBhY2thZ2UocylcIilcbi8vIHdpdGggb25seSBgdHlwZXNjcmlwdGAgdjcgaW5zdGFsbGVkLiBOZXh0LmpzIHJlc29sdmVzIHRoZSB0c2dvIGJpbmFyeSB0aHJvdWdoIHRoZVxuLy8gc2VwYXJhdGUgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCBwYWNrYWdlLCBzbyBOZXh0LmpzLWZhbWlseSByZXBvcyBtdXN0IGluc3RhbGxcbi8vIGJvdGg7IG90aGVyIHJlcG9zIG9ubHkgbmVlZCBgdHlwZXNjcmlwdGAgZm9yIGB0c2NgIHR5cGVjaGVja3MuXG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3QgbGVmdGhvb2tEZXBlbmRlbmN5ID0gJ2xlZnRob29rJztcbmNvbnN0IG1hbmFnZWREZXBlbmRlbmN5TmFtZXMgPSBuZXcgU2V0KFtcbiAgd2JEZXBlbmRlbmN5LFxuICBidWlsZFRzRGVwZW5kZW5jeSxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0RGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSxcbiAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgLy8gTWl4ZWQgQHR5cGVzL2J1biB2ZXJzaW9ucyBhY3Jvc3MgYSBtb25vcmVwbyBsb2FkIHR3byBidW4tdHlwZXMgY29waWVzLCB3aGljaFxuICAvLyBicmVha3MgZ2xvYmFsIGludGVyZmFjZSBtZXJnaW5nIChlLmcuIFJlc3BvbnNlL0hlYWRlcnMpIGR1cmluZyB0eXBlIGNoZWNraW5nLlxuICAnQHR5cGVzL2J1bicsXG4gIC4uLm94bGludERlcHMsXG5dKTtcbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgcGFja2FnZUFnZUdhdGVNcyA9IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyAqIDEwMDA7XG5jb25zdCBucG1QYWNrYWdlVGltZXNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxudHlwZSBXcml0YWJsZVBhY2thZ2VKc29uID0gU2V0UmVxdWlyZWQ8XG4gIFBhY2thZ2VKc29uLFxuICAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnXG4+O1xuXG5pbnRlcmZhY2UgRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBkZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmtlclR5cGVzU2NyaXB0RXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZyk7XG4gIGlmICh3b3JrZXJUeXBlc1NjcmlwdEVycm9yKSB0aHJvdyBuZXcgRXJyb3Iod29ya2VyVHlwZXNTY3JpcHRFcnJvcik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25PYmogPSBhd2FpdCByZWFkUGFja2FnZUpzb24oZmlsZVBhdGgpO1xuICB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgLy8gT24gYSBmaXJzdCBydW4gdGhlcmUgaXMgbm8gbWFuaWZlc3QgZm9yIGBidW4gYWRkYCB0byB1cGRhdGUgcmVsaWFibHkuIFdyaXRlIHRoZSByZXNvbHZlZFxuICAvLyBkZXBlbmRlbmN5IHZlcnNpb25zIGludG8gdGhlIG5ldyBtYW5pZmVzdCBkaXJlY3RseTsgdGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBgYnVuIGluc3RhbGxgXG4gIC8vIHRoZW4gaW5zdGFsbHMgdGhlbSBhbmQgcmVtYWlucyB0aGUgYXV0aG9yaXRhdGl2ZSBmYWlsdXJlIGNoZWNrLlxuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgZGVwZW5kZW5jeVVwZGF0ZXMsXG4gICAgc2tpcEFkZGluZ0RlcHMgfHwgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uXG4gICk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBnZW5lcmF0ZWRcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIC8vIEEgcmVmdXNlZCB3cml0ZSAoZS5nLiBhIHN5bWxpbmtlZCBwYWNrYWdlLmpzb24pIG11c3QgYWxzbyBhYm9ydCB0aGUgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb25cbiAgLy8gYmVsb3c6IGBidW4gYWRkYCBmb2xsb3dzIHRoZSBzeW1saW5rIGFuZCB3b3VsZCBtb2RpZnkgdGhlIGZpbGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpKSkgcmV0dXJuO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gICAgLy8gQSBuZXdseSBjcmVhdGVkIG1hbmlmZXN0IGlzIGFscmVhZHkgc29ydGVkIGJ5IHdiZnkncyBidW5kbGVkIHNlcmlhbGl6ZXI7IHRoZSB0YXJnZXQgZm9ybWF0dGVyXG4gICAgLy8gaXMgYXZhaWxhYmxlIHdpdGhvdXQgYW4gZXh0cmEgZmV0Y2ggb25seSB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgd2l0aCBwYWNrYWdlLmpzb24uXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgbGV0IGpzb25PYmo6IFBhY2thZ2VKc29uID0ge307XG4gIHRyeSB7XG4gICAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRG9jdW1lbnRhdGlvbi1vbmx5IHJlcG9zaXRvcmllcyBoYXZlIG5vIG1hbmlmZXN0IG9uIHRoZWlyIGZpcnN0IHdiZnkgcnVuLiBTdGFydGluZyBmcm9tIGFuXG4gICAgLy8gZW1wdHkgb2JqZWN0IGxldHMgdGhlIG5vcm1hbCBnZW5lcmF0b3IgZXN0YWJsaXNoIHRoZSBzYW1lIG1hbmFnZWQgYmFzZWxpbmUgYXMgZXZlcnkgb3RoZXJcbiAgICAvLyByZXBvc2l0b3J5OyBtYWxmb3JtZWQgb3IgdW5yZWFkYWJsZSBleGlzdGluZyBtYW5pZmVzdHMgbXVzdCBzdGlsbCBmYWlsIGxvdWRseS5cbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHRocm93IGVycm9yO1xuICB9XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5mdW5jdGlvbiBwcnVuZUNhcGFiaWxpdHlEZXBlbmRlbnRDb21waWxlckRlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgLy8gUnVuIGJlZm9yZSBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIHJlLWFkZHMgdHNnbyBvbmx5IGZvciBjdXJyZW50IE5leHQuanMtZmFtaWx5IHJlcG9zaXRvcmllcy5cbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbn1cblxuLyoqXG4gKiBLZWVwcyB0aGUgcHJvamVjdCdzIG93biBzZWdtZW50cyBpbiBvcmRlciwgcmVwbGFjaW5nIHRoZSBmaXJzdCBtYW5hZ2VkIGdlbi1jb2RlIHNwZWxsaW5nIHdpdGhcbiAqIGBidW4gd2IgZ2VuLWNvZGVgIGFuZCBkcm9wcGluZyBsYXRlciBkdXBsaWNhdGVzLiBBcHBlbmRzIGdlbmVyYXRpb24gb25seSB3aGVuIHRoZSBzY3JpcHRcbiAqIGNvbnRhaW5lZCBub25lLCBzbyBub3RoaW5nIGlzIHJlb3JkZXJlZC5cbiAqL1xuZnVuY3Rpb24gcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHM6IHN0cmluZ1tdLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogc3RyaW5nW10ge1xuICBjb25zdCBraW5kcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMsIHRydWUpKTtcbiAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIGN1c3RvbWl6ZWQgZ2VuLWNvZGUgYWxyZWFkeSBnZW5lcmF0ZXM7IGFkZGluZyBhbm90aGVyIGludm9jYXRpb24gd291bGQgcnVuIGV2ZXJ5XG4gIC8vIGdlbmVyYXRvciB0d2ljZS5cbiAgbGV0IGdlbmVyYXRpb25QbGFjZWQgPSBraW5kcy5pbmNsdWRlcygnZ2VuQ29kZVdyYXBwZXInKTtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgc2VnbWVudF0gb2Ygc2VnbWVudHMuZW50cmllcygpKSB7XG4gICAgY29uc3Qga2luZCA9IGtpbmRzW2luZGV4XTtcbiAgICBpZiAoa2luZCA9PT0gJ2N1c3RvbScgfHwga2luZCA9PT0gJ2dlbkNvZGVXcmFwcGVyJykge1xuICAgICAgcmVzdWx0LnB1c2goc2VnbWVudCk7XG4gICAgfSBlbHNlIGlmICghZ2VuZXJhdGlvblBsYWNlZCkge1xuICAgICAgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICAgICAgZ2VuZXJhdGlvblBsYWNlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmICghZ2VuZXJhdGlvblBsYWNlZCkgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50cyB3aGlsZSBrZWVwaW5nIHRoZSBmaXJzdCBzZWdtZW50J3MgcG9zaXRpb24gc28gYSBjdXN0b21cbiAqIHN0ZXAgdGhhdCBjb25zdW1lcyBnZW5lcmF0ZWQgb3V0cHV0IHN0aWxsIHJ1bnMgYWZ0ZXIgaXQuIFJldHVybnMgd2l0aG91dCBjaGFuZ2luZyBhblxuICogdW5wYXJzZWFibGUgc2NyaXB0LlxuICovXG5mdW5jdGlvbiB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLCBtYW5hZ2VzV29ya2VyVHlwZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgLy8gYGJ1biB3YiBnZW4tY29kZWAgcmVnZW5lcmF0ZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBpdHNlbGYsIHNvIGEgcGFja2FnZSB3aXRoIGFcbiAgLy8gY29kZS1nZW5lcmF0aW9uIG9yIHdvcmtlci10eXBlcyBwaXBlbGluZSBnZXRzIG9uZSBtYW5hZ2VkIGdlbmVyYXRpb24gc2VnbWVudC5cbiAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10gfHwgbWFuYWdlc1dvcmtlclR5cGVzKSB7XG4gICAgLy8gUHJvamVjdC1vd25lZCBzdGVwcyBhcmUgbmV2ZXIgZHJvcHBlZCwgYW5kIHRoZWlyIFBPU0lUSU9OIHJlbGF0aXZlIHRvIGdlbmVyYXRpb24gaXMgcHJlc2VydmVkOiBhIHN0ZXBcbiAgICAvLyBiZWZvcmUgaXQgbWF5IHByb2R1Y2UgYHdyYW5nbGVyIHR5cGVzYCcgaW5wdXRzIChhIHdyYW5nbGVyIGNvbmZpZywgYC5kZXYudmFyc2ApLCB3aGlsZSBvbmUgYWZ0ZXIgaXQgbWF5XG4gICAgLy8gY29uc3VtZSB0aGUgZ2VuZXJhdGVkIHR5cGVzLiBTbyB0aGUgbWFuYWdlZCBnZW5lcmF0aW9uIHJlcGxhY2VzIHRoZSBmaXJzdCBtYW5hZ2VkIHNlZ21lbnQgaW4gcGxhY2UsIGFuZCBpc1xuICAgIC8vIGFwcGVuZGVkIG9ubHkgd2hlbiB0aGUgc2NyaXB0IGhhZCBub25lLiBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIGdlbmVyYXRpb24gcGx1cyB0aGUgcHJvamVjdCdzIG93biBzdGVwcywgc28gaXQgc3VwcHJlc3NlcyB0aGUgcmVwbGFjZW1lbnQgZW50aXJlbHkuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBzY3JpcHRzLnBvc3RpbnN0YWxsID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCk7XG4gICAgY29uc3Qga2VwdFNlZ21lbnRzID0gc2VnbWVudHMgJiYgcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHMsIHNjcmlwdHMpO1xuICAgIGlmIChrZXB0U2VnbWVudHMpIHtcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPSBrZXB0U2VnbWVudHMuam9pbignICYmICcpO1xuICAgIH1cbiAgICAvLyBBbnkgb3RoZXIgdW5wYXJzZWFibGUgcG9zdGluc3RhbGwgaXMgbGVmdCB0byBhIGh1bWFuIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAvLyBMZWZ0aG9vayBnZW5lcmF0aW9uIGlzIGJlc3QtZWZmb3J0IGFuZCAubGVmdGhvb2sgaXMgYWJzZW50IGZyb20gRG9ja2VyIGJ1aWxkIGNvbnRleHRzLCBzbyBhXG4gICAgLy8gbWlzc2luZyBub3JtYWxpemVyIGlzIHZhbGlkLiBPbmNlIHByZXNlbnQsIGl0cyBmYWlsdXJlIG11c3QgYWJvcnQgaW5zdGFsbCByYXRoZXIgdGhhbiBsZWF2ZSBhXG4gICAgLy8gR3VhcmQtcGlubmVkIGxvY2tmaWxlIGJlaGluZDsga2VlcCB0aGF0IGZhaWwtZmFzdCBncm91cGluZyBleHBsaWNpdCBiZWZvcmUgYW55IHdvcmtzcGFjZSBidWlsZC5cbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9XG4gICAgICAnKGJ1biBsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUpICYmICh0ZXN0ICEgLWYgLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2ggfHwgYmFzaCAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCknO1xuICAgIC8vIFdoZW4gQHdpbGxib29zdGVyL3diIGlzIGEgd29ya3NwYWNlIG9mIHRoaXMgcmVwb3NpdG9yeSwgdGhlIGdlbmVyYXRlZCBgYnVuIHdiIOKApmAgc2NyaXB0cyBydW5cbiAgICAvLyBpdHMgZ2l0aWdub3JlZCBkaXN0IGJ1aWxkIChiaW4vaW5kZXguanMgaW1wb3J0cyAuLi9kaXN0L2luZGV4LmpzKSwgc28gYSBmcmVzaCBjaGVja291dCBtdXN0XG4gICAgLy8gYnVpbGQgaXQgZHVyaW5nIGluc3RhbGw7IHJlZ2lzdHJ5IGluc3RhbGxzIHNoaXAgYSBwcmVidWlsdCBkaXN0IGFuZCBuZWVkIG5vIGV4dHJhIHN0ZXAuXG4gICAgY29uc3Qgd2JXb3Jrc3BhY2VEaXIgPSBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5nZXQod2JEZXBlbmRlbmN5KTtcbiAgICBpZiAod2JXb3Jrc3BhY2VEaXIpIHtcbiAgICAgIC8vIFNpbmdsZSBxdW90ZXMgKHdpdGggZW1iZWRkZWQgcXVvdGVzIGVzY2FwZWQpIHByZXZlbnQgdGhlIHNoZWxsIGZyb20gZXhwYW5kaW5nIGAkKOKApilgIG9yXG4gICAgICAvLyB2YXJpYWJsZXMgdGhhdCBhIGhvc3RpbGUgZGlyZWN0b3J5IG5hbWUgY291bGQgc211Z2dsZSBpbnRvIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgKz0gYCAmJiBidW4gcnVuIC0tY3dkICcke3diV29ya3NwYWNlRGlyLnJlcGxhY2VBbGwoXCInXCIsIFN0cmluZy5yYXdgJ1xcJydgKX0nIGJ1aWxkYDtcbiAgICB9XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2gobGVmdGhvb2tEZXBlbmRlbmN5KTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShqc29uT2JqLnNjcmlwdHMucmVsZWFzZSkpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ107XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgICAvLyBSdW50aW1lIGltcG9ydHMgbmVlZCB0aGUgc3RhbmRhbG9uZSBwYWNrYWdlIGFmdGVyIERvY2tlciBwcnVuaW5nIHJlbW92ZXMgZGV2RGVwZW5kZW5jaWVzLlxuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/PVxuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddID8/XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uIFlhcm4gdjEncyBvYmplY3QgZm9ybSBrZWVwcyBpdHNcbiAgICAgIC8vIGRlY2xhcmVkIHBhdHRlcm5zICh3b3Jrc3BhY2VzLnBhY2thZ2VzKTsgb25seSBleHRyYXMgc3VjaCBhcyBub2hvaXN0IGFyZSBkcm9wcGVkLlxuICAgICAgLy8gRm9yY2UgYHBhY2thZ2VzLypgIG9ubHkgd2hlbiBpdCBhY3R1YWxseSBtYXRjaGVzIGEgd29ya3NwYWNlIG1hbmlmZXN0OiBhbiBhcHBzLyotb25seVxuICAgICAgLy8gbW9ub3JlcG8gbXVzdCBub3QgZ2V0IGEgbmV2ZXItbWF0Y2hpbmcgcGF0dGVybiBhcHBlbmRlZCB0byBpdHMgZGVjbGFyYXRpb24uIEFcbiAgICAgIC8vIGJhc2VsaW5lLXNlZWRpbmcgZGVjbGFyYXRpb24gbmVlZHMgbm8gZm9yY2VkIHBhdHRlcm4gYXQgYWxsIOKAlCB0aGUgc2VlZGVkIGJhc2VsaW5lXG4gICAgICAvLyAoYCovKmAgb3IgYCoqYCkgYWxyZWFkeSBjb3ZlcnMgcGFja2FnZXMvKi4gVGhlIGZvcmNlZCBwYXR0ZXJuIGlzIFBSRVBFTkRFRDogQnVuXG4gICAgICAvLyBldmFsdWF0ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gYSBwb3NpdGl2ZSBwYXR0ZXJuIHBsYWNlZCBhZnRlciBhIHVzZXJcbiAgICAgIC8vIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMuIEEgZGVjbGFyYXRpb24gdGhhdCBhbHJlYWR5IGNvdmVyc1xuICAgICAgLy8gcGFja2FnZXMvKiB1bmRlciBub3JtYWxpemF0aW9uIChlLmcuIGAuL3BhY2thZ2VzLypgKSBpcyBrZXB0IHZlcmJhdGltOiBmb3JjaW5nIGEgdGV4dHVhbFxuICAgICAgLy8gYHBhY2thZ2VzLypgIG5leHQgdG8gaXQgd291bGQgcGVyc2lzdCBhIGR1cGxpY2F0ZSBlcXVpdmFsZW50IHBhdHRlcm4uXG4gICAgICBjb25zdCBmb3JjZWRQYXR0ZXJucyA9XG4gICAgICAgICFoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgIWhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybihqc29uT2JqLndvcmtzcGFjZXMpICYmXG4gICAgICAgIGZnLmdsb2JTeW5jKCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIHsgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH0pLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFsncGFja2FnZXMvKiddXG4gICAgICAgICAgOiBbXTtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IG1lcmdlLmFsbChbZm9yY2VkUGF0dGVybnMsIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMoanNvbk9iai53b3Jrc3BhY2VzKV0sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgfSk7XG4gICAgICAvLyBCb3RoIGlucHV0cyBjYW4gYmUgZW1wdHkgKGUuZy4gcGFja2FnZXMvcGFja2FnZS5qc29uIHdpdGhvdXQgYW55IHBhY2thZ2VzLyovcGFja2FnZS5qc29uXG4gICAgICAvLyBhbmQgbm8gZGVjbGFyZWQgd29ya3NwYWNlcyk7IGRvIG5vdCBwZXJzaXN0IGEgbWVhbmluZ2xlc3MgYHdvcmtzcGFjZXM6IFtdYC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykgJiYganNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaXhlcnMvbmV4dENvbmZpZy50cyBlbmFibGVzIGByZWFjdENvbXBpbGVyOiB0cnVlYCBmb3IgZXZlcnkgTmV4dC5qcyBwcm9qZWN0LCBhbmQgTmV4dC5qc1xuICAvLyByZXNvbHZlcyBgYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyYCBhdCBidWlsZCB0aW1lIHdoZW4gUmVhY3QgQ29tcGlsZXIgaXMgb24uIEFkZCBpdCBoZXJlIHNvXG4gIC8vIHRoZSBtYW5hZ2VkIG5leHQuY29uZmlnIG5ldmVyIGJyZWFrcyBgbmV4dCBidWlsZGAgd2l0aCBhbiB1bnJlc29sdmVkLXBhY2thZ2UgZXJyb3IuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyk7XG4gIH1cblxuICAvLyBgd2IgdmVyaWZ5IC0tZnVsbGAgYXVkaXRzIGV2ZXJ5IGAqLnNsaWRldi5tZGAgZGVjayB3aXRoIHNsaWRldi1jaGVjaywgc28gdGhlIGNoZWNrZXIgaGFzIHRvIGJlXG4gIC8vIGluc3RhbGxlZCB3aGVyZXZlciBhIGRlY2sgbGl2ZXMuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TbGlkZXZNZCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzbGlkZXYtY2hlY2snKTtcbiAgfVxuXG4gIGlmICghaXNXYlBhY2thZ2UoanNvbk9iaikpIHtcbiAgICAvLyBBIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgZGVwZW5kcyBvbiB0aGUgd2IgZGV2ZWxvcGVkIGluIHRoaXMgcmVwb3NpdG9yeSAoZS5nLlxuICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBpdHNlbGYpOyBpbnN0YWxsaW5nIHRoZSBsYXRlc3QgcmVnaXN0cnkgcmVsZWFzZSBvdmVyIGl0IHdvdWxkIHNpbGVudGx5XG4gICAgLy8gcmVwbGFjZSB0aGUgbG9jYWwgYnVpbGQgd2l0aCBhIHB1Ymxpc2hlZCBvbmUsIHNvIGxlYXZlIHN1Y2ggYSBkZWNsYXJhdGlvbiB1bnRvdWNoZWQuXG4gICAgY29uc3Qgd2JTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1t3YkRlcGVuZGVuY3ldID8/IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV07XG4gICAgaWYgKCF3YlNwZWNpZmllcj8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgaWYgKHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSwgc28gaXQgaXNcbiAgICAvLyBub3cgdGhlIG1hbmFnZWQgY29tcGlsZXIgZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcmVwbyAodHlwZWNoZWNraW5nIHJ1bnMgYHRzY2ApLlxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHREZXBlbmRlbmN5KTtcbiAgICAvLyBOZXh0LmpzJ3MgYG5leHQgYnVpbGRgIGluc3BlY3RzIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHRvIHJ1biBpdHMgdHlwZVxuICAgIC8vIGNoZWNrOyB0aGUgYHR5cGVzY3JpcHRgIHY3IHBhY2thZ2UgYWxvbmUgbGFja3MgdGhlIEFQSSBuZXh0IG5lZWRzLCBzbyBrZWVwIGJvdGhcbiAgICAvLyBpbnN0YWxsZWQgZm9yIE5leHQuanMtZmFtaWx5IHJlcG9zLiBTZWUgdGhlIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgY29tbWVudCBhYm92ZS5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgICAvLyBSZWFjdCBOYXRpdmUgcmVsaWVzIG9uIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUncyBhbWJpZW50IHR5cGVzIGluc3RlYWQgb2YgQHR5cGVzL2J1bi5cbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2Uoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL1xcYig/OmJ1bnh8bnB4fHBucG1cXHMrZGx4fHlhcm5cXHMrZGx4KVxccytzZW1hbnRpYy1yZWxlYXNlKD86QFxcUyspP1xcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCBrZWVwQXNSdW50aW1lXSBvZiBbXG4gICAgW3diRGVwZW5kZW5jeSwgc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gICAgW2J1aWxkVHNEZXBlbmRlbmN5LCBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICBdIGFzIGNvbnN0KSB7XG4gICAgaWYgKGtlZXBBc1J1bnRpbWUpIHtcbiAgICAgIGNvbnN0IGRldlZlcnNpb24gPSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZGV2VmVyc2lvbikgY29udGludWU7XG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFydW50aW1lVmVyc2lvbiB8fCBpc05ld2VyUGFja2FnZVZlcnNpb24oZGV2VmVyc2lvbiwgcnVudGltZVZlcnNpb24pKSB7XG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZGV2VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9IGVsc2UgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSB7XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBpbWFnZXMgcnVuIG1pZ3JhdGlvbnMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsIGp1c3QgYXMgcGFja2FnZSBtYW5hZ2Vyc1xuICAvLyBydW4gcG9zdGluc3RhbGwgZHVyaW5nIHByb2R1Y3Rpb24gaW5zdGFsbHMsIHNvIGJvdGggZW50cnkgcG9pbnRzIG11c3QgcmV0YWluIHRoZSB3YiBiaW5hcnkuXG4gIC8vIEtlZXAgdGhlIHdvcmQgbWF0Y2ggY29uc2VydmF0aXZlOiBzdXBwb3J0ZWQgY3VzdG9tIHdyYXBwZXJzIGNhbiBwdXQgd2IgaW5zaWRlIHNoZWxsIGxvb3BzIHRoYXRcbiAgLy8gdGhlIGNvbW1hbmQtcG9zaXRpb24gcGFyc2VyIGNhbm5vdCBjbGFzc2lmeSwgd2hpbGUgYSBmYWxzZSBwb3NpdGl2ZSBvbmx5IHJldGFpbnMgdGhlIENMSS5cbiAgcmV0dXJuIFtqc29uT2JqLnNjcmlwdHM/LnBvc3RpbnN0YWxsLCBqc29uT2JqLnNjcmlwdHM/LlsnZGItbWlncmF0ZSddXS5zb21lKFxuICAgIChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIC9cXGJ3YlxcYi91LnRlc3Qoc2NyaXB0KVxuICApO1xufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iajogUGFja2FnZUpzb24pOiBib29sZWFuIHtcbiAgY29uc3QgcHJpc21hID0ganNvbk9iai5wcmlzbWEgYXMgeyBzZWVkPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhwcmlzbWE/LnNlZWQpIHx8IGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoanNvbk9iai5zY3JpcHRzPy5zZWVkKTtcbn1cblxuZnVuY3Rpb24gZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhzZWVkQ29tbWFuZDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIERvY2tlciBpbWFnZXMgcnVuIHNlZWQgc2NyaXB0cyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCxcbiAgLy8gc28gVHlwZVNjcmlwdCBzZWVkIHJ1bm5lcnMgbXVzdCByZW1haW4gYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXG4gIHJldHVybiB0eXBlb2Ygc2VlZENvbW1hbmQgPT09ICdzdHJpbmcnICYmIC8oPzwhW1xcdy1dKWJ1aWxkLXRzKD8hW1xcdy1dKS91LnRlc3Qoc2VlZENvbW1hbmQpO1xufVxuXG5jb25zdCBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucyA9IFtcbiAgJ2RlcGVuZGVuY2llcycsXG4gICdkZXZEZXBlbmRlbmNpZXMnLFxuICAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLFxuICAncGVlckRlcGVuZGVuY2llcycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEZvcmNlcyBzdG9yZS1pbmNvbXBhdGlibGUgcGFja2FnZXMgdG8gc3RheSBwcm9qZWN0LWxvY2FsIHdoZW4gdGhlIGdlbmVyYXRlZCBidW5maWcudG9tbCBlbmFibGVzXG4gKiBCdW4ncyBnbG9iYWwgc3RvcmU6IGBjaGFrcmEgdHlwZWdlbmAgKHJ1biBieSBgd2IgZ2VuLWNvZGVgKVxuICogd3JpdGVzIGdlbmVyYXRlZCB0eXBlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdCBwYWNrYWdlLCB3aGljaCB3b3VsZCBvdGhlcndpc2VcbiAqIG11dGF0ZSB0aGUgbWFjaGluZS13aWRlIHN0b3JlIHNoYXJlZCBhY3Jvc3MgcmVwb3NpdG9yaWVzLCBhbmQgZHJpenpsZS1raXQgcmVxdWlyZXMgZHJpenpsZS1vcm1cbiAqIHdpdGhvdXQgZGVjbGFyaW5nIGl0LCB3aGljaCB0aGUgc3RvcmUgcmVhbHBhdGggcGxhY2VzIGJleW9uZCBhIHBsYWluIG5vZGVfbW9kdWxlcyB3YWxrLXVwLlxuICogTGlzdGluZyB0aGVtIGluIGB0cnVzdGVkRGVwZW5kZW5jaWVzYCBtYWtlcyBCdW4gbWF0ZXJpYWxpemUgYSBwZXItcHJvamVjdCBjb3B5IHVuZGVyXG4gKiBgbm9kZV9tb2R1bGVzLy5idW4vYCwgd2hvc2Ugc2libGluZyBgbm9kZV9tb2R1bGVzLy5idW4vbm9kZV9tb2R1bGVzL2AgbGlua3MgZXZlcnkgaW5zdGFsbGVkXG4gKiBwYWNrYWdlIGFuZCB0aGVyZWZvcmUgcmVzb2x2ZXMgdGhlIHVuZGVjbGFyZWQgcmVxdWlyZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEJ1biBjb25zdWx0cyB0cnVzdGVkRGVwZW5kZW5jaWVzIGluIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIHBhY2thZ2UuanNvbiBvbmx5LCBzbyB0aGUgbGlzdCBpc1xuICAvLyBtYW5hZ2VkIHRoZXJlIGFuZCBtdXN0IGNvdmVyIGRlcGVuZGVuY2llcyBkZWNsYXJlZCBhbnl3aGVyZSBpbiB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG4gIGNvbnN0IGJ1bkpzb25PYmogPSBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb24gJiB7IHRydXN0ZWREZXBlbmRlbmNpZXM/OiBzdHJpbmdbXSB9O1xuICAvLyBCdW4gaW5zdGFsbHMgb3B0aW9uYWwgYW5kIHBlZXIgZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQsIHNvIGFsbCBkZWNsYXJhdGlvbiBzZWN0aW9ucyBjb3VudC5cbiAgLy8gRXZlcnkgZGVjbGFyZWQgcmFuZ2UgaXMga2VwdCBwZXIgcGFja2FnZTogYSByb290IGRlY2xhcmF0aW9uIG11c3Qgbm90IG1hc2sgYSB3b3Jrc3BhY2Ugb25lXG4gIC8vIChlLmcuIHJvb3QgQGNoYWtyYS11aS9jbGkgdjIgYWxvbmdzaWRlIGEgd29ya3NwYWNlIG9uIHYzKS5cbiAgY29uc3QgZGVjbGFyZWREZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGNvbnN0IGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzID0gKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBkZXBlbmRlbmN5RGVjbGFyYXRpb25TZWN0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHZlcnNpb25SYW5nZV0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUpzb25bc2VjdGlvbl0gPz8ge30pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmVyc2lvblJhbmdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25SYW5nZXMgPSBkZWNsYXJlZERlcGVuZGVuY2llcy5nZXQoZGVwZW5kZW5jeU5hbWUpO1xuICAgICAgICAgIGlmICh2ZXJzaW9uUmFuZ2VzKSB7XG4gICAgICAgICAgICB2ZXJzaW9uUmFuZ2VzLnB1c2godmVyc2lvblJhbmdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVjbGFyZWREZXBlbmRlbmNpZXMuc2V0KGRlcGVuZGVuY3lOYW1lLCBbdmVyc2lvblJhbmdlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBhZGREZWNsYXJlZERlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhjb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKFxuICAgICAgICBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb25cbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5yZWFkYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIC8vIE9ubHkgQGNoYWtyYS11aS9jbGkgdjMncyBgY2hha3JhIHR5cGVnZW5gIHdyaXRlcyBpbnRvIHRoZSBpbnN0YWxsZWQgQGNoYWtyYS11aS9yZWFjdDtcbiAgLy8gdjIncyBgY2hha3JhLWNsaSB0b2tlbnNgIHdyaXRlcyBpbnRvIEBjaGFrcmEtdWkvc3R5bGVkLXN5c3RlbSBpbnN0ZWFkLCBzbyB0cnVzdGluZ1xuICAvLyBAY2hha3JhLXVpL3JlYWN0IHRoZXJlIHdvdWxkIGZvcmNlIGEgdXNlbGVzcyBwcm9qZWN0LWxvY2FsIGNvcHkgd2l0aG91dCBmaXhpbmcgZ2VuLWNvZGUuXG4gIC8vIE1pcnJvciB3YiBnZW4tY29kZSdzIGNsYXNzaWZpY2F0aW9uOiBvbmx5IGEgcmFuZ2Ugd2hvc2UgbGVhZGluZyBtYWpvciBwYXJzZXMgdG8gMiBzZWxlY3RzIHRoZVxuICAvLyB2MiBjb21tYW5kLCBzbyBkaWdpdGxlc3Mgc3BlY3MgbGlrZSBgbGF0ZXN0YCBvciBjYXRhbG9nIHJlZmVyZW5jZXMgY291bnQgYXMgdjMuXG4gIGNvbnN0IGhhc0NoYWtyYUNsaVYzID0gKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldCgnQGNoYWtyYS11aS9jbGknKSA/PyBbXSkuc29tZShcbiAgICAodmVyc2lvblJhbmdlKSA9PiAvXFxkKy91LmV4ZWModmVyc2lvblJhbmdlKT8uWzBdICE9PSAnMidcbiAgKTtcbiAgY29uc3QgcmVxdWlyZWRXYmZ5UGFja2FnZXMgPSBbXG4gICAgLi4uKGhhc0NoYWtyYUNsaVYzICYmIGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGNoYWtyYS11aS9yZWFjdCcpID8gWydAY2hha3JhLXVpL3JlYWN0J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnZHJpenpsZS1raXQnKSA/IFsnZHJpenpsZS1raXQnXSA6IFtdKSxcbiAgICAvLyBUaGVzZSBnaXQtZGVwZW5kZW5jeSBidWlsZHMgaW1wb3J0IHBhY2thZ2VzIHRoZXkgZG8gbm90IGRlY2xhcmUgKGUuZy4gem9kKSwgd2hpY2ggdGhlXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGxheW91dCBwbGFjZXMgYmV5b25kIHRoZWlyIHdhbGstdXA7IGEgcHJvamVjdC1sb2NhbCBjb3B5IHVuZGVyXG4gICAgLy8gbm9kZV9tb2R1bGVzLy5idW4gcmVzb2x2ZXMgdGhlbSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvcHJvbXB0LXN0dWR5KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSA/IFsnQHdpbGxib29zdGVyL2p1ZGdlJ10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpID8gWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gOiBbXSksXG4gICAgLy8gYmxpdHogYW5kIEBibGl0empzL2F1dGggcmVxdWlyZSByZWFjdCAoYW5kIG90aGVyIHBlZXJzKSB3aXRob3V0IGRlY2xhcmluZyB0aGVtLCByZWx5aW5nIG9uXG4gICAgLy8gaG9pc3RpbmcsIHdoaWNoIHRoZSBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cCAob2JzZXJ2ZWQgaW5cbiAgICAvLyBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtOiBgbmV4dCBidWlsZGAgcGFnZS1kYXRhIGNvbGxlY3Rpb24gZGllcyB3aXRoIFwiQ2Fubm90IGZpbmQgbW9kdWxlXG4gICAgLy8gJ3JlYWN0J1wiIGZyb20gQGJsaXR6anMvYXV0aCkuIEBibGl0empzL3JwYyBpcyBOT1QgbGlzdGVkIGJlY2F1c2UgaXQgcHJvcGVybHkgZGVjbGFyZXMgaXRzXG4gICAgLy8gcmVhY3QvQHRhbnN0YWNrIHBlZXJzLCBzbyBCdW4gbGlua3MgdGhlbSBpbnRvIGl0cyBzdG9yZSBlbnRyeS4gQGJsaXR6anMvbmV4dCBpc1xuICAgIC8vIGRlbGliZXJhdGVseSBOT1QgbGlzdGVkIGVpdGhlcjogdHJ1c3RpbmcgaXQgd291bGQgcnVuIGl0cyBwb3N0aW5zdGFsbCAoYGJsaXR6IGNvZGVnZW5gKSxcbiAgICAvLyB3aGljaCBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluIHBsYWNlIOKAlCByZXBvc2l0b3JpZXMgcGF0Y2ggb3V0IHRoYXQgcG9zdGluc3RhbGxcbiAgICAvLyB3aXRoIGBidW4gcGF0Y2hgIGluc3RlYWQsIHdoaWNoIGFsc28ga2VlcHMgdGhlIHBhY2thZ2UgcHJvamVjdC1sb2NhbC5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdibGl0eicpID8gWydibGl0eiddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0BibGl0empzL2F1dGgnKSA/IFsnQGJsaXR6anMvYXV0aCddIDogW10pLFxuICAgIC8vIEJ1biBkb2VzIG5vdCBsaW5rIEBob29rZm9ybS9yZXNvbHZlcnMnIE9QVElPTkFMIHZhbGlkYXRvciBwZWVycyAoZS5nLiB6b2QpIGludG8gaXRzXG4gICAgLy8gZ2xvYmFsLXN0b3JlIGVudHJ5IGV2ZW4gd2hlbiB0aGUgcHJvamVjdCBpbnN0YWxscyB0aGVtLCBzbyBpdHMgc2VydmVyLXNpZGVcbiAgICAvLyBgaW1wb3J0ICd6b2QnYCBmYWlscyBmcm9tIHRoZSBzdG9yZSAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGhvb2tmb3JtL3Jlc29sdmVycycpID8gWydAaG9va2Zvcm0vcmVzb2x2ZXJzJ10gOiBbXSksXG4gICAgLy8gQHpvb20vcnRtcyBpbnN0YWxscyBpdHMgbmF0aXZlIHJ0bXMubm9kZSBiaW5kaW5nIGluIGEgbGlmZWN5Y2xlIHNjcmlwdC4gV2l0aG91dCBleHBsaWNpdFxuICAgIC8vIHRydXN0LCBCdW4gc2tpcHMgdGhhdCBzY3JpcHQgYW5kIHRoZSBwYWNrYWdlIGZhaWxzIGFzIHNvb24gYXMgdGhlIFpvb20gYm90IGltcG9ydHMgaXRcbiAgICAvLyAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc21hcnRzZS16b29tLWJvdCkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHpvb20vcnRtcycpID8gWydAem9vbS9ydG1zJ10gOiBbXSksXG4gIF07XG5cbiAgLy8gd2JmeSBmdWxseSBvd25zIHRoaXMgZmllbGQ6IGEgcGFja2FnZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyBtdXN0IHJ1biBnZXRzIGFkZGVkIHRvIHdiZnlcbiAgLy8gaXRzZWxmIGluc3RlYWQgb2YgdG8gaW5kaXZpZHVhbCByZXBvc2l0b3JpZXMsIHNvIHVubWFuYWdlZCBlbnRyaWVzIGFyZSBhbHdheXMgcmVtb3ZlZCDigJRcbiAgLy8gaW5jbHVkaW5nIGFuIGV4cGxpY2l0bHkgZW1wdHkgZGVueS1hbGwgbGlzdCwgd2hvc2UgZGVsZXRpb24gZGVsaWJlcmF0ZWx5IHJlc3RvcmVzIEJ1bidzXG4gIC8vIGRlZmF1bHQgYWxsb3ctbGlzdCAodGhlIG93bmVyc2hpcCBwb2xpY3kgY2hvc2VuIGluICM5NzUpLlxuICBjb25zdCBleGlzdGluZ1RydXN0ZWQgPSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gIGlmIChyZXF1aXJlZFdiZnlQYWNrYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZXhpc3RpbmdUcnVzdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIERlbGV0aW5nIHRoZSBmaWVsZCByZXN0b3JlcyBCdW4ncyBmdWxsIGRlZmF1bHQgYWxsb3ctbGlzdCwgc28gb25seSBlbnRyaWVzIG91dHNpZGUgdGhhdFxuICAgICAgLy8gbGlzdCBhY3R1YWxseSBsb3NlIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzLlxuICAgICAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQsIG5ldyBTZXQoKSk7XG4gICAgICBkZWxldGUgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBbiBleHBsaWNpdCB0cnVzdGVkRGVwZW5kZW5jaWVzIGxpc3QgUkVQTEFDRVMgQnVuJ3MgZGVmYXVsdCBhbGxvdy1saXN0IGluc3RlYWQgb2YgZXh0ZW5kaW5nXG4gIC8vIGl0LCBhbmQgQnVuIHByaW50cyBubyB3YXJuaW5nIGZvciB0aGUgcG9zdGluc3RhbGxzIGl0IGNvbnNlcXVlbnRseSBza2lwcyAoZS5nLiBAcmFpbHdheS9jbGlcbiAgLy8gZG93bmxvYWRzIGl0cyBiaW5hcnkgaW4gcG9zdGluc3RhbGwgYW5kIGV4aXRzIDEgd2l0aG91dCBvbmUpLiBJbmNsdWRlIHRoZSBFTlRJUkUgZGVmYXVsdCBsaXN0OlxuICAvLyBlbnRyaWVzIGZvciBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW5zdGFsbGVkIGFyZSBpbmVydCwgYW5kIHRoaXMgaXMgdGhlIG9ubHkgcmVwcmVzZW50YXRpb25cbiAgLy8gdGhhdCBzdGF5cyBjb3JyZWN0IGZvciB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyB0aGUgZmluYWwgYGJ1biBpbnN0YWxsYCByZXNvbHZlcyBhZnRlciB0aGlzXG4gIC8vIHJ1bnMg4oCUIGFuIGludGVyc2VjdGlvbiB3aXRoIGEgbWlzc2luZyBvciBzdGFsZSBsb2NrZmlsZSB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZW0uXG4gIGNvbnN0IGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgLy8gbGVmdGhvb2sgaXMgYXBwZW5kZWQgZXhwbGljaXRseSBzbyB0aGUgZGVmYXVsdC1saXN0IGxvb2t1cCBmYWlsaW5nIGNhbm5vdCBkcm9wIGl0OiBpdCBpc1xuICAvLyByZXF1aXJlZCBpbiBldmVyeSBtYW5hZ2VkIHJlcG9zaXRvcnkuXG4gIGNvbnN0IG5ld1RydXN0ZWRQYWNrYWdlcyA9IG5ldyBTZXQoW1xuICAgIC4uLnJlcXVpcmVkV2JmeVBhY2thZ2VzLFxuICAgIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgICAuLi4oZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPz8gW10pLFxuICBdKTtcbiAgd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBleGlzdGluZ1RydXN0ZWQgPz8gW10sIG5ld1RydXN0ZWRQYWNrYWdlcyk7XG4gIGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcyA9IFsuLi5uZXdUcnVzdGVkUGFja2FnZXNdLnRvU29ydGVkKCk7XG59XG5cbi8vIFRoZSBwYWNrYWdlcyB3YmZ5IGl0c2VsZiBtYXkgd3JpdGUgaW50byB0cnVzdGVkRGVwZW5kZW5jaWVzOyB0aGVpciByZW1vdmFsIGlzIG1hbmFnZWQgY2xlYW51cCxcbi8vIG5ldmVyIGEgbG9zcyBvZiB1c2VyIHBvbGljeS5cbmNvbnN0IHdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcyA9IG5ldyBTZXQoW1xuICAnQGJsaXR6anMvYXV0aCcsXG4gICdAY2hha3JhLXVpL3JlYWN0JyxcbiAgJ0Bob29rZm9ybS9yZXNvbHZlcnMnLFxuICAnQHdpbGxib29zdGVyL2p1ZGdlJyxcbiAgJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknLFxuICAnQHpvb20vcnRtcycsXG4gICdibGl0eicsXG4gICdkcml6emxlLWtpdCcsXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbl0pO1xuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBleGlzdGluZ1RydXN0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXB0UGFja2FnZXM6IFJlYWRvbmx5U2V0PHN0cmluZz5cbik6IHZvaWQge1xuICAvLyBBIGRlZmF1bHQtdHJ1c3RlZCBlbnRyeSBuZXZlciBsb3NlcyBhbnl0aGluZyBieSByZW1vdmFsOiB3aGlsZSB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQgdGhlXG4gIC8vIGtlcHQgbGlzdCAob3IsIHdoZW4gdGhlIGZpZWxkIGlzIGRlbGV0ZWQsIEJ1bidzIG93biBkZWZhdWx0IGxpc3QpIHN0aWxsIHRydXN0cyBpdC5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICBjb25zdCByZW1vdmVkUGFja2FnZXMgPSBleGlzdGluZ1RydXN0ZWQuZmlsdGVyKFxuICAgIChwa2cpID0+ICFrZXB0UGFja2FnZXMuaGFzKHBrZykgJiYgIXdiZnlNYW5hZ2VkVHJ1c3RlZERlcGVuZGVuY2llcy5oYXMocGtnKSAmJiAhZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM/Lmhhcyhwa2cpXG4gICk7XG4gIGlmIChyZW1vdmVkUGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBSZW1vdmluZyB1bm1hbmFnZWQgdHJ1c3RlZERlcGVuZGVuY2llcyBlbnRyaWVzOiAke3JlbW92ZWRQYWNrYWdlcy5qb2luKCcsICcpfS4gd2JmeSBvd25zIHRoaXMgZmllbGQ7IGlmIHRoZWlyIGxpZmVjeWNsZSBzY3JpcHRzIGFyZSByZXF1aXJlZCwgYWRkIHRoZSBwYWNrYWdlcyB0byB3YmZ5IGl0c2VsZi5gXG4gICAgKTtcbiAgfVxufVxuXG5sZXQgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4vKiogRmV0Y2hlcyBCdW4ncyBkZWZhdWx0IHRydXN0ZWQtZGVwZW5kZW5jeSBhbGxvdy1saXN0IGZyb20gdGhlIEJ1biB2ZXJzaW9uIGluc3RhbGxpbmcgdGhlIHJlcG9zaXRvcnkuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyBCdW4gY29sb3JpemVzIHRoZSBsaXN0IG1hcmtlcnMgd2hlbiBGT1JDRV9DT0xPUiBpcyBzZXQgKGUuZy4gYnkgdGVzdCBydW5uZXJzIG9uIENJKSwgc29cbiAgICAvLyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgbXVzdCBiZSBzdHJpcHBlZCBiZWZvcmUgcGFyc2luZy5cbiAgICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2J1bicsIFsncG0nLCAnZGVmYXVsdC10cnVzdGVkJ10sIGNvbmZpZy5kaXJQYXRoKS5yZXBsYWNlQWxsKFxuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gbWF0Y2hpbmcgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIHJlcXVpcmVzIHRoZSBFU0MgY29udHJvbCBjaGFyYWN0ZXJcbiAgICAgIC9cXHUwMDFCXFxbWzAtOTtdKm0vZ3UsXG4gICAgICAnJ1xuICAgICk7XG4gICAgY29uc3QgcGFyc2VkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbLi4uc3Rkb3V0Lm1hdGNoQWxsKC9eXFxzKi1cXHMrKFxcUyspJC9nbXUpXS5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXSBhcyBzdHJpbmcpKTtcbiAgICBpZiAocGFyc2VkRGVwZW5kZW5jaWVzLnNpemUgPT09IDApIHtcbiAgICAgIC8vIERvIG5vdCBjYWNoZSB0aGUgZmFpbHVyZTogYSB0YXJnZXQtbG9jYWwgcHJvYmxlbSAoZS5nLiBhbiB1bnJlYWRhYmxlIHBhY2thZ2UuanNvbikgbXVzdFxuICAgICAgLy8gbm90IGRlbnkgdGhlIGRlZmF1bHQgbGlzdCB0byBldmVyeSBsYXRlciB0YXJnZXQgb2YgYSBtdWx0aS1wYXRoIHJ1bi5cbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHJlYWQgdGhlIGRlZmF1bHQgYWxsb3ctbGlzdCB2aWEgYGJ1biBwbSBkZWZhdWx0LXRydXN0ZWRgLicpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBwYXJzZWREZXBlbmRlbmNpZXM7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIC8vIEV4cGxpY2l0IHJvb3QgcHVibGlzaGluZyBpbnRlbnQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHdiZnkncyBwcml2YXRlIG1vbm9yZXBvLXJvb3QgZGVmYXVsdC5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAoY29uZmlnLnJlbGVhc2UubnBtUHVibGlzaGVzUm9vdCB8fCBqc29uT2JqLnB1Ymxpc2hDb25maWcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucHJpdmF0ZTtcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgIWNvbmZpZy5yZWxlYXNlLm5wbSAmJiAhanNvbk9iai5wdWJsaXNoQ29uZmlnKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCByZWdpc3RyeSwgbnBtIHJlc29sdmVzIHRoZSBwdWJsaXNoIHRhcmdldCBmcm9tIHRoZSB3b3Jrc3BhY2UgLm5wbXJjLFxuICAgIC8vIHdob3NlIGRlZmF1bHQgcmVnaXN0cnkgb24gQ0kgbWF5IGJlIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwcm94eSDigJQgd2hpY2ggcmVqZWN0c1xuICAgIC8vIGBucG0gcHVibGlzaGAgd2l0aCA0MDUgKHNoYXJlZCMxMDcyKS4gYD8/PWAga2VlcHMgYSBkZWxpYmVyYXRlbHkgZGlmZmVyZW50IHJlZ2lzdHJ5LlxuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5yZWdpc3RyeSA/Pz0gJ2h0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyc7XG4gIH1cbiAgY29uc3Qgb3duZXIgPSBjb25maWcucmVwb0F1dGhvcjtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgYXdhaXQgbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKGNvbmZpZywganNvbk9iaik7XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICdidW4gcnVuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGNvbnN0IHNjcmlwdFJ1bm5lciA9ICdidW4gcnVuJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgJHtzY3JpcHRSdW5uZXJ9IHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknID8gJ3V2JyA6ICdwb2V0cnknfWBdO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gYCR7c2NyaXB0UnVubmVyfSBsaW50YDtcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IGdlbkNvZGVTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIGlmIChzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWcpKSB7XG4gICAgLy8gUHJlc2VydmUgcHJvamVjdC1zcGVjaWZpYyBzdGVwcyBhIHJlcG8gYXBwZW5kZWQgdG8gdGhlIG1hbmFnZWQgYGJ1biB3YiBnZW4tY29kZWAgKGUuZy4gYnVpbGRpbmcgZXh0cmEgZGVwbG95XG4gICAgLy8gYXNzZXRzKSBpbnN0ZWFkIG9mIGRpc2NhcmRpbmcgdGhlbTsgb25seSB0aGUgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50IGlzIHdiZnkncyB0b1xuICAgIC8vIHJlZ2VuZXJhdGUuIEFuIHVucGFyc2VhYmxlIHNjcmlwdCBpcyBsZWZ0IGFsb25lIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBnZW5Db2RlU2NyaXB0ID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoZ2VuQ29kZVNjcmlwdCk7XG4gICAgY29uc3QgY3VzdG9tU2VnbWVudHMgPSBzZWdtZW50cz8uZmlsdGVyKFxuICAgICAgKHNlZ21lbnQpID0+IGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBqc29uT2JqLnNjcmlwdHMsIHRydWUpID09PSAnY3VzdG9tJ1xuICAgICk7XG4gICAgaWYgKGN1c3RvbVNlZ21lbnRzKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBbJ2J1biB3YiBnZW4tY29kZScsIC4uLmN1c3RvbVNlZ21lbnRzXS5qb2luKCcgJiYgJyk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLmNoYWtyYSB8fCBjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCBjb25maWcuZGVwZW5kaW5nLnByaXNtYTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gZm9ybWF0U2NyaXB0ID8gYCR7Zm9ybWF0U2NyaXB0fSAmJiBidW4gcnVuIGZvcm1hdC1jb2RlYCA6ICdidW4gcnVuIGZvcm1hdC1jb2RlJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwXSk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgWy4uLmRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcywgLi4uZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLCBqc29uT2JqKV0sXG4gICAgc2tpcEFkZGluZ0RlcHNcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAganNvbk9iajogUGFja2FnZUpzb25cbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKS5maWx0ZXIoXG4gICAgKGRlcGVuZGVuY3kpID0+XG4gICAgICBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSAmJlxuICAgICAgLy8gQSBwdWJsaWMgcGFja2FnZSdzIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgbXVzdCBuZXZlciBiZSByZS1tYW5hZ2VkIHZpYSBhIHJlZ2lzdHJ5IGluc3RhbGxcbiAgICAgIC8vIChwcml2YXRlIG9uZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYHdvcmtzcGFjZToqYCBsYXRlcikuIFRoaXMgYWxzbyBjb3ZlcnMgcnVubmluZyB3YmZ5IG9uIGFcbiAgICAgIC8vIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSwgd2hlcmUgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMgYXJlIGludmlzaWJsZSBhbmQgdGhlIHdvcmtzcGFjZS1tYXBcbiAgICAgIC8vIGd1YXJkIGluIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIGNhbm5vdCBwcm90ZWN0IHRoZSBzcGVjaWZpZXIuXG4gICAgICAoanNvbk9iai5wcml2YXRlIHx8ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKVxuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogdm9pZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gICAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyICYmIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzKV07XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5Jykge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKCd1dicsIFsnYWRkJywgJy0tZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5JyB8ICd1dicgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSByZXR1cm4gJ3V2JztcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHJldHVybiAncG9ldHJ5Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiAncG9ldHJ5JyB8ICd1dicpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd1dicpIHJldHVybiAndXYgc3luYyAtLWZyb3plbic7XG4gIC8vIGBtaXNlIHdoaWNoIHB5dGhvbmAgeWllbGRzIHRoZSBzaW5nbGUgYWN0aXZlIGludGVycHJldGVyIHBhdGg7IGBtaXNlIGN1cnJlbnQgcHl0aG9uYCBjYW5cbiAgLy8gcHJpbnQgbXVsdGlwbGUgc3BhY2Utc2VwYXJhdGVkIHZlcnNpb25zIChtaXNlIHN1cHBvcnRzIG11bHRpLXZlcnNpb24gcGlucyksIHdoaWNoIHdvdWxkIHBhc3NcbiAgLy8gZXh0cmEgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gYHBvZXRyeSBlbnYgdXNlYC4gV2hlbiBtaXNlIGlzIG1pc3Npbmcgb3IgcHl0aG9uIGlzXG4gIC8vIHVuY29uZmlndXJlZCwgc2tpcCBgcG9ldHJ5IGVudiB1c2VgIGFuZCBmYWxsIGJhY2sgdG8gcG9ldHJ5J3MgZGVmYXVsdCBpbnRlcnByZXRlciBpbnN0ZWFkIG9mXG4gIC8vIGFib3J0aW5nIHRoZSBjaGFpbi5cbiAgLy8gVGhlIGB8fCB0cnVlYCBjb3ZlcnMgb25seSB0aGUgbWlzZSByZXNvbHV0aW9uOiBhIG1pc3NpbmcvdW5jb25maWd1cmVkIG1pc2UgZmFsbHMgYmFjayB0b1xuICAvLyBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyLCB3aGlsZSBhIGZhaWxpbmcgYHBvZXRyeSBlbnYgdXNlYCBzdGlsbCBhYm9ydHMgdGhlIGNoYWluLlxuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHsgcHl0aG9uX3BhdGg9XCIkKG1pc2Ugd2hpY2ggcHl0aG9uIDI+L2Rldi9udWxsKVwiIHx8IHRydWU7IH0gJiYgeyBbIC16IFwiJHB5dGhvbl9wYXRoXCIgXSB8fCBwb2V0cnkgZW52IHVzZSBcIiRweXRob25fcGF0aFwiOyB9ICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+IGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSkpKSxcbiAgXTtcbiAgc3Bhd25TeW5jKCdidW4nLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICAvLyBBIHByaXZhdGUgcGFja2FnZSB3aG9zZSBtb25vcmVwbyBjb250YWlucyB0aGlzIGRlcGVuZGVuY3kgYXMgYSB3b3Jrc3BhY2UgbXVzdCByZWZlcmVuY2UgaXRcbiAgICAvLyB2aWEgdGhlIHdvcmtzcGFjZSBwcm90b2NvbDogcGlubmluZyBhIHJlZ2lzdHJ5IHZlcnNpb24gbWFrZXMgQnVuIHNoYWRvdyB0aGUgc2FtZS1uYW1lXG4gICAgLy8gd29ya3NwYWNlIGFuZCBza2lwIGluc3RhbGxpbmcgdGhlIHdvcmtzcGFjZSdzIG93biBkZXBlbmRlbmNpZXMuIChQdWJsaXNoZWQgcGFja2FnZXMgaW5zdGVhZFxuICAgIC8vIHBpbiBhIGNvbmNyZXRlIHZlcnNpb24gYmVjYXVzZSBgbnBtIHB1Ymxpc2hgIHJlamVjdHMgYHdvcmtzcGFjZToqYCBzcGVjaWZpZXJzIOKAlCBidXQgYW5cbiAgICAvLyBFWElTVElORyBgd29ya3NwYWNlOmAgZGVjbGFyYXRpb24gaXMgYWx3YXlzIGtlcHQ6IG92ZXJ3cml0aW5nIGl0IHdpdGggYSByZWdpc3RyeSByZWxlYXNlXG4gICAgLy8gd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGxvY2FsIHdvcmtzcGFjZSBsaW5rLilcblxuICAgIC8vIEEgZGVjbGFyZWQgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBhbHdheXMgd2lucywgd2hldGhlciBvciBub3QgdGhlIHdvcmtzcGFjZSBtYXAgc2VlcyB0aGVcbiAgICAvLyBwYWNrYWdlOiBydW5uaW5nIHdiZnkgb24gYSBtb25vcmVwbyBTVUJESVJFQ1RPUlkgaGlkZXMgdGhlIHBhcmVudCdzIHdvcmtzcGFjZXMsIHNvIHRoZSBtYXBcbiAgICAvLyBhbG9uZSBjYW5ub3QgYmUgdHJ1c3RlZCB0byBkZXRlY3QgYSBsb2NhbCB3b3Jrc3BhY2UgbGluay5cbiAgICBpZiAocGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgaWYgKGpzb25PYmoucHJpdmF0ZSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGpzb25PYmoucHJpdmF0ZSAmJiBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5oYXMoZGVwZW5kZW5jeSkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0gcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWV4aXN0aW5nU3BlY2lmaWVyIHx8IGV4aXN0aW5nU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9ICd3b3Jrc3BhY2U6Kic7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQW4gZXhpc3RpbmcgQ09OQ1JFVEUgcGluIG9uIGEgd29ya3NwYWNlIHBhY2thZ2UgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSBhbmQgbXVzdCBub3QgYmVcbiAgICAgIC8vIGNvbnZlcnRlZCB0byB0aGUgd29ya3NwYWNlIHByb3RvY29sLiBOb3RlIHRoZSB0cmFkZS1vZmYgZWl0aGVyIHdheTogbnBtICh3aGljaFxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0bykgY2Fubm90IHBhcnNlIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXJzLCB3aGlsZVxuICAgICAgLy8gYSByZWdpc3RyeSBwaW4gbWFrZXMgYSBjb2xkIGJ1biBpbnN0YWxsIHNoYWRvdyB0aGUgd29ya3NwYWNlIGFuZCBza2lwIGl0cyBkZXBlbmRlbmNpZXMg4oCUXG4gICAgICAvLyBXaWxsQm9vc3Rlci9zaGFyZWQga2VlcHMgYHdvcmtzcGFjZToqYCBhbmQgc3RyaXBzIHRoZSBwcm90b2NvbCBvbiB0aGUgQ0kgY2hlY2tvdXQgcmlnaHRcbiAgICAgIC8vIGJlZm9yZSByZWxlYXNpbmcgKHNjcmlwdHMvc3RyaXBXb3Jrc3BhY2VQcm90b2NvbC5tanMpLiBGYWxsIHRocm91Z2ggc28gYSBjb25jcmV0ZSBwaW5cbiAgICAgIC8vIGtlZXBzIGJlaW5nIGJ1bXBlZCBsaWtlIGFueSBtYW5hZ2VkIGRlcGVuZGVuY3kuXG4gICAgfVxuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSA9IHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gICAgICBjb25maWcsXG4gICAgICByb290Q29uZmlnLFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgICAgICAvLyBgYnVuIGFkZCBkZXBlbmRlbmN5YCBwcmVzZXJ2ZXMgYW4gZXhpc3RpbmcgZXhhY3QgcGluLCBzbyB3cml0ZSB0aGUgYWdlLWNsZWFyZWQgdmVyc2lvblxuICAgICAgICAvLyBkaXJlY3RseS4gVGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBpbnN0YWxsIHJlZnJlc2hlcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgZXZlcnkgcGFja2FnZVxuICAgICAgICAvLyBtYW5pZmVzdCBoYXMgY29udmVyZ2VkIG9uIHRoZSBnZW5lcmF0ZWQgcmVsZWFzZS1hZ2UgcG9saWN5LlxuICAgICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IG1hbmFnZWRWZXJzaW9uO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRlcGVuZGVuY2llc1RvSW5zdGFsbC5wdXNoKGRlcGVuZGVuY3kpO1xuICAgICAgaWYgKCFza2lwQWRkaW5nRGVwcykgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICAgIGlmIChsYXRlc3RWZXJzaW9uID09PSAnKicgJiYgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgLy8gVHlwZVNjcmlwdCA3J3MgbmF0aXZlIGNvbXBpbGVyIGRyb3BwZWQgdGhlIGluLXByb2Nlc3MgYHBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb25gXG4gICAgLy8gaGVscGVyLCBzbyBwYXJzZSB0aGUgdHNjb25maWcgaW50byBhbiBBU1QgYW5kIHJlYWQgaXRzIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZGlyZWN0bHkuXG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGFic29sdXRlRmlsZVBhdGgpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZC5gKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbi8qKiBSZWFkcyB0aGUgdG9wLWxldmVsIGBleHRlbmRzYCBlbnRyaWVzIChhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzKSBmcm9tIGEgcGFyc2VkIHRzY29uZmlnLiAqL1xuZnVuY3Rpb24gcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nW10ge1xuICBjb25zdCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2UpKSB7XG4gICAgaWYgKGFzdC5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgJiYgYXN0LmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSAmJiBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdleHRlbmRzJykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHZhbHVlcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmZ1bmN0aW9uIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHJlYWRvbmx5IGFzdC5PYmplY3RMaXRlcmFsRWxlbWVudExpa2VbXSB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHNvdXJjZS5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKGFzdC5pc0V4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KSAmJiBhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbikpIHtcbiAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5wcm9wZXJ0aWVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKG5vZGU6IGFzdC5FeHByZXNzaW9uLCB2YWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGlmIChhc3QuaXNTdHJpbmdMaXRlcmFsKG5vZGUpKSB7XG4gICAgdmFsdWVzLnB1c2gobm9kZS50ZXh0KTtcbiAgfSBlbHNlIGlmIChhc3QuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG5vZGUuZWxlbWVudHMpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKGVsZW1lbnQsIHZhbHVlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSkge1xuICAgIHJldHVybiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIH1cblxuICByZXR1cm4gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0aW1lcyA9IGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5KTtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgaWYgKGxhdGVzdFZlcnNpb24gIT09ICcqJyAmJiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUodGltZXNbbGF0ZXN0VmVyc2lvbl0pKSB7XG4gICAgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gIH1cblxuICByZXR1cm4gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcodGltZXMpWzBdID8/ICcqJztcbn1cblxuLyoqIEV2ZXJ5IHN0YWJsZSByZWxlYXNlIGluIGB0aW1lc2AgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZSBnYXRlLCBuZXdlc3QgZmlyc3QuICovXG5mdW5jdGlvbiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRpbWVzKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gc2VtdmVyLnZhbGlkKHZlcnNpb24pKVxuICAgIC5maWx0ZXIoKFt2ZXJzaW9uXSkgPT4gKHNlbXZlci5wcmVyZWxlYXNlKHZlcnNpb24pPy5sZW5ndGggPz8gMCkgPT09IDApXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkpKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gbm93IC0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCkgPj0gcGFja2FnZUFnZUdhdGVNcylcbiAgICAudG9Tb3J0ZWQoKFt2ZXJzaW9uQV0sIFt2ZXJzaW9uQl0pID0+IHNlbXZlci5yY29tcGFyZSh2ZXJzaW9uQSwgdmVyc2lvbkIpKVxuICAgIC5tYXAoKFt2ZXJzaW9uXSkgPT4gdmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZShwdWJsaXNoZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcHVibGlzaGVkQXQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHVibGlzaGVkVGltZSA9IERhdGUucGFyc2UocHVibGlzaGVkQXQpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHB1Ymxpc2hlZFRpbWUpICYmIERhdGUubm93KCkgLSBwdWJsaXNoZWRUaW1lID49IHBhY2thZ2VBZ2VHYXRlTXM7XG59XG5cbmZ1bmN0aW9uIGdldE5wbVBhY2thZ2VUaW1lcyhkZXBlbmRlbmN5OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBkZXBlbmRlbmN5LnJlcGxhY2UoL0BbXkAvXSskL3UsICcnKTtcbiAgY29uc3QgY2FjaGVkVGltZXMgPSBucG1QYWNrYWdlVGltZXNDYWNoZS5nZXQocGFja2FnZU5hbWUpO1xuICBpZiAoY2FjaGVkVGltZXMpIHJldHVybiBjYWNoZWRUaW1lcztcblxuICBjb25zdCBzdGRvdXQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ25wbScsXG4gICAgWydzaG93JywgcGFja2FnZU5hbWUsICd0aW1lJywgJy0tanNvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSxcbiAgICBwcm9jZXNzLmN3ZCgpXG4gICk7XG4gIGlmICghc3Rkb3V0KSByZXR1cm4ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0ZG91dCkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XTtcbiAgICBjb25zdCB0aW1lcyA9IEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZFswXSA6IHBhcnNlZDtcbiAgICBpZiAoIXRpbWVzKSByZXR1cm4ge307XG4gICAgbnBtUGFja2FnZVRpbWVzQ2FjaGUuc2V0KHBhY2thZ2VOYW1lLCB0aW1lcyk7XG4gICAgcmV0dXJuIHRpbWVzO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gS2VlcCBtYW5hZ2VkIGZpcnN0LXBhcnR5IHBhY2thZ2VzIGFsaWduZWQgd2l0aCBCdW4ncyBleHBsaWNpdCBleGVtcHRpb25zLiB3YmZ5J3MgZ2VuZXJhdGVkXG4gIC8vIGNvbmZpZ3VyYXRpb24gY2FuIHJlbHkgb24gdGhlIGN1cnJlbnQgd2IgY29udHJhY3QsIHNvIGluZGVwZW5kZW50bHkgc29ha2luZyBvciBkb3duZ3JhZGluZyB3YlxuICAvLyB3b3VsZCBwYWlyIG5ldyBnZW5lcmF0ZWQgZmlsZXMgd2l0aCBhbiBpbmNvbXBhdGlibGUgb2xkIENMSS4gVGhvc2UgcGFja2FnZXMgYXJlIHJlbGVhc2VkIGFuZFxuICAvLyBmaXhlZCBhdCB0aGVpciBzb3VyY2UgaW5zdGVhZDsgb25seSBwYWNrYWdlcyBCdW4gaXRzZWxmIGdhdGVzIG1heSBiZSBzZWxlY3RlZCBmcm9tIG9sZGVyIHRhZ3MuXG4gIHJldHVybiAhYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5zb21lKChwYXR0ZXJuKSA9PiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuLCBkZXBlbmRlbmN5KSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwYXR0ZXJuID09PSBkZXBlbmRlbmN5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZUFsbCgvWy4rP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApLnJlcGxhY2VBbGwoJyonLCAnLionKTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgLCAndScpLnRlc3QoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBObyBjYWNoZSBoZXJlOiB0aGUgb25seSBjYWxsZXIgY2hhaW4gZ29lcyB0aHJvdWdoIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uLCB3aGljaCBhbHJlYWR5XG4gIC8vIG1lbW9pemVzIHBlciBkZXBlbmRlbmN5LCBzbyB0aGlzIGNhbiBydW4gYXQgbW9zdCBvbmNlIHBlciBkZXBlbmRlbmN5LlxuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBkZXBlbmRlbmN5LCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSwgcHJvY2Vzcy5jd2QoKSkgfHwgJyonO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFR5cGVTY3JpcHQgaXMgdmVyc2lvbi1jYXBwZWQgaW4gQmxpdHogcmVwb3NpdG9yaWVzLCBzbyBpdHMgaW5zdGFsbCBzcGVjaWZpZXIgbXVzdCBjYXJyeSB0aGVcbiAgLy8gbWFuYWdlZCB2ZXJzaW9uIOKAlCBhIGJhcmUgYGJ1biBhZGRgIHdvdWxkIGluc3RhbGwgdGhlIGluY29tcGF0aWJsZSBsYXRlc3QuXG4gIGlmIChkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Z2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSl9YDtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jeTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYSBCbGl0eiBhcHAgKHRoZSBjdXJyZW50IHBhY2thZ2Ugb3IgdGhlIHdvcmtzcGFjZSByb290KS4gKi9cbmZ1bmN0aW9uIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCByb290Q29uZmlnLmRlcGVuZGluZy5ibGl0ejtcbn1cblxuY29uc3Qgd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4vKiogTWFwIGZyb20gZWFjaCB3b3Jrc3BhY2UgcGFja2FnZSdzIG5hbWUgdG8gaXRzIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIG1vbm9yZXBvIHJvb3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgY2FjaGVkID0gd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZS5nZXQocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCB3b3Jrc3BhY2VEaXJzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpXG4gICAgICApIGFzIFBhY2thZ2VKc29uO1xuICAgICAgaWYgKHdvcmtzcGFjZVBhY2thZ2VKc29uLm5hbWUpIHtcbiAgICAgICAgd29ya3NwYWNlRGlyc0J5TmFtZS5zZXQod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSwgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucGFyc2FibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLnNldChyb290Q29uZmlnLmRpclBhdGgsIHdvcmtzcGFjZURpcnNCeU5hbWUpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyc0J5TmFtZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGN1cnJlbnRWZXJzaW9uID09PSAnKicpIHJldHVybiB0cnVlO1xuICBpZiAoaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkgcmV0dXJuIHRydWU7XG4gIGlmICghbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgY29uc3QgY3VycmVudFZhbGlkVmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIC8vIEEgVHlwZVNjcmlwdCA3IHBpbiBpbiBhIEJsaXR6IHJlcG9zaXRvcnkgaXMgbGlrZXdpc2UgaW5jb21wYXRpYmxlIChgbmV4dCBidWlsZGAgZmFpbHMgb25cbiAgLy8gdGhlIE5leHQuanMgMTUgdGhhdCBCbGl0eiBwaW5zIOKAlCBzZWUgZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKSwgc28gcmV3cml0ZSBpdCB0byB0aGVcbiAgLy8gY2FwcGVkIHJlbGVhc2UgaW5zdGVhZCBvZiBwcmVzZXJ2aW5nIGl0IHZpYSB0aGUgbm8tZG93bmdyYWRlIHJ1bGUgYmVsb3cuIFRoZSBwaW4gbWF5IGJlIGFcbiAgLy8gUkFOR0UgKGUuZy4gYF43LjAuMGApLCB3aGljaCBzZW12ZXIudmFsaWQgcmVqZWN0cyDigJQganVkZ2UgdGhlIG1ham9yIGZyb20gdGhlIHJhbmdlIG1pbmltdW0uXG4gIGNvbnN0IGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiA9XG4gICAgY3VycmVudFZhbGlkVmVyc2lvbiA/PyAoc2VtdmVyLnZhbGlkUmFuZ2UoY3VycmVudFZlcnNpb24pID8gc2VtdmVyLm1pblZlcnNpb24oY3VycmVudFZlcnNpb24pPy52ZXJzaW9uIDogdW5kZWZpbmVkKTtcbiAgaWYgKFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmXG4gICAgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSAmJlxuICAgIGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbiAmJlxuICAgIHNlbXZlci5tYWpvcihjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24pID49IDcgJiZcbiAgICBzZW12ZXIudmFsaWQobWFuYWdlZFZlcnNpb24pICYmXG4gICAgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbilcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gVGhlIGdlbmVyYXRlZCBidW5maWcgYXBwbGllcyB0aGUgb3JnYW5pemF0aW9uIGFnZSBnYXRlIGV2ZW4gdG8gZXhhY3QgcGlucy4gSWYgYSBtYW5hZ2VkXG4gIC8vIHRoaXJkLXBhcnR5IHRvb2wgaXMgbmV3ZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UgdGhhdCBjbGVhcmVkIHRoYXQgZ2F0ZSwgcHJlc2VydmluZyB0aGUgcGluXG4gIC8vIHByb2R1Y2VzIGEgcGFja2FnZS5qc29uIHRoYXQgYSBmcmVzaCBpbnN0YWxsIHdpdGhvdXQgdGhlIG9sZCBsb2NrZmlsZSBjYW5ub3QgcmVzb2x2ZSAobm90YWJseVxuICAvLyBvcHRpbWl6ZWQgRG9ja2VyIGJ1aWxkcykuIEtlZXAgdGhlIG5vLWRvd25ncmFkZSBwb2xpY3kgb25seSB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIGV4ZW1wdCBmcm9tXG4gIC8vIHRoZSBnYXRlOyBhZ2UtZ2F0ZWQgbWFuYWdlZCB0b29scyBtdXN0IGNvbnZlcmdlIG9uIHRoZSB2ZXJzaW9uIHRoZSBnZW5lcmF0ZWQgYnVuZmlnIGFjY2VwdHMuXG4gIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyB3YmZ5IG93bnMgdGhlc2UgdG9vbCBkZXBlbmRlbmNpZXMsIGJ1dCBhcHBseWluZyB3YmZ5IHNob3VsZCBub3QgZG93bmdyYWRlIGFcbiAgLy8gcmVwb3NpdG9yeSB0aGF0IGFscmVhZHkgcGlucyBhIG5ld2VyIHJldmlld2VkIHJlbGVhc2Ugd2hlbiB0aGUgb3JnIHBvbGljeSBleGVtcHRzIGl0LlxuICByZXR1cm4gaXNOZXdlclBhY2thZ2VWZXJzaW9uKG1hbmFnZWRWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWFuYWdlZFZlcnNpb246IHN0cmluZ1xuKTogY3VycmVudFZlcnNpb24gaXMgc3RyaW5nIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRNYW5hZ2VkVmVyc2lvbiA9IHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbik7XG4gIHJldHVybiAoXG4gICAgc2hvdWxkQXBwbHlQYWNrYWdlQWdlR2F0ZShkZXBlbmRlbmN5KSAmJlxuICAgIHZhbGlkQ3VycmVudFZlcnNpb24gIT09IG51bGwgJiZcbiAgICB2YWxpZE1hbmFnZWRWZXJzaW9uICE9PSBudWxsICYmXG4gICAgc2VtdmVyLmd0KHZhbGlkQ3VycmVudFZlcnNpb24sIHZhbGlkTWFuYWdlZFZlcnNpb24pXG4gICk7XG59XG5cbi8vIFRoZSBuZXdlc3QgVHlwZVNjcmlwdCA2IHJlbGVhc2UgYXQgdGhlIHRpbWUgdGhlIEJsaXR6IGNhcCBzaGlwcGVkOyB1c2VkIG9ubHkgd2hlbiB0aGUgcmVnaXN0cnlcbi8vIGxvb2t1cCBmb3IgdGhlIGFjdHVhbCBuZXdlc3QgcHJlLXY3IHJlbGVhc2UgZmFpbHMgKHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLlxuY29uc3QgbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbiA9ICc2LjAuMyc7XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICAvLyBCbGl0eiBwaW5zIE5leHQuanMgMTUsIHdob3NlIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgcmVxdWlyZXMgdGhlIGNsYXNzaWNcbiAgICAvLyBgdHlwZXNjcmlwdGAgY29tcGlsZXIgQVBJOyB0aGUgVHlwZVNjcmlwdCA3IGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIGJpbmFyeVxuICAgIC8vIHdpdGhvdXQgdGhhdCBBUEksIHNvIGBuZXh0IGJ1aWxkYCBhYm9ydHMgd2l0aCBcIkZhaWxlZCB0byBpbnN0YWxsIHJlcXVpcmVkIFR5cGVTY3JpcHRcbiAgICAvLyBkZXBlbmRlbmNpZXNcIiAob2JzZXJ2ZWQgaW4gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbSkuIENhcCBgdHlwZXNjcmlwdGAgYmVsb3cgNyB1bnRpbFxuICAgIC8vIEJsaXR6IHN1cHBvcnRzIGEgTmV4dC5qcyByZWxlYXNlIHRoYXQgdW5kZXJzdGFuZHMgdHNnby4gQSBmYWlsZWQgcmVnaXN0cnkgbG9va3VwIG11c3RcbiAgICAvLyByZXNvbHZlIHRvIGEga25vd24tY29tcGF0aWJsZSByZWxlYXNlIOKAlCBmYWxsaW5nIGJhY2sgdG8gbGF0ZXN0VmVyc2lvbiB3b3VsZCByZWluc3RhbGwgdGhlXG4gICAgLy8gaW5jb21wYXRpYmxlIFR5cGVTY3JpcHQgNy5cbiAgICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbik7XG4gICAgaWYgKHZhbGlkTGF0ZXN0VmVyc2lvbiAmJiBzZW12ZXIubWFqb3IodmFsaWRMYXRlc3RWZXJzaW9uKSA8IDcpIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICAgIC8vIFRoZSBjYXBwZWQgbG9va3VwIG11c3QgcmVzcGVjdCB0aGUgYWdlIGdhdGUgdG9vOiB0aGlzIHZlcnNpb24gaXMgd3JpdHRlbiBhcyBhbiBleGFjdCBwaW4sXG4gICAgLy8gYW5kIEJ1biByZWZ1c2VzIHRvIHJlc29sdmUgb25lIHB1Ymxpc2hlZCBpbnNpZGUgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93LiBUaGVyZSBpcyBub1xuICAgIC8vIHVuZ2F0ZWQgZmFsbGJhY2sg4oCUIHdpdGhvdXQgcHVibGljYXRpb24gbWV0YWRhdGEgdGhlIGFnZSBvZiBhIHJhbmdlIHJlc3VsdCBpcyB1bmtub3duLCBzbyBhXG4gICAgLy8gcGFydGlhbCByZWdpc3RyeSBmYWlsdXJlIHdvdWxkIG90aGVyd2lzZSB3cml0ZSBhIHZlcnNpb24gQnVuIHRoZW4gcmVmdXNlcyB0byBpbnN0YWxsLlxuICAgIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZFZlcnNpb25CZWxvdyh0eXBlc2NyaXB0RGVwZW5kZW5jeSwgJzcuMC4wJykgPz8gbGFzdEtub3duUHJlVjdUeXBlc2NyaXB0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCByZWxlYXNlIG9mIGBwYWNrYWdlTmFtZWAgYmVsb3cgYGV4Y2x1c2l2ZVVwcGVyQm91bmRgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2VcbiAqIGdhdGUsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSByZWdpc3RyeSBsb29rdXAgZmFpbHMgb3Igbm8gc3VjaCByZWxlYXNlIGV4aXN0cyB5ZXQuXG4gKi9cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHBhY2thZ2VOYW1lOiBzdHJpbmcsIGV4Y2x1c2l2ZVVwcGVyQm91bmQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyhnZXROcG1QYWNrYWdlVGltZXMocGFja2FnZU5hbWUpKS5maW5kKCh2ZXJzaW9uKSA9PlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBleGNsdXNpdmVVcHBlckJvdW5kKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyUGFja2FnZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbjogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChjYW5kaWRhdGVWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHNcbiAgICAvLyByZXF1aXJpbmcgcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgICBjbGVhbnVwOiAnYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgIGZvcm1hdDogYGJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICBsaW50OiBgYnVuIHdiIGxpbnRgLFxuICAgICdsaW50LWZpeCc6ICdidW4gd2IgbGludCAtLWZpeCcsXG4gICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICB0eXBlY2hlY2s6ICdidW4gd2IgdHlwZWNoZWNrJyxcbiAgICB2ZXJpZnk6ICdidW4gd2IgdmVyaWZ5JyxcbiAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICB9O1xuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGFwcGx5VGVzdE9uQ2lTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIH1cbiAgYXBwbHlUZXN0U2NyaXB0KGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cyk7XG4gIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ3Rlc3QnLCAndmVyaWZ5LWZ1bGwnXSk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgYGJ1biAke2dldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZyl9YCk7XG4gIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbi8vIENJIHdvcmtmbG93cyAoYm90aCB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdyBhbmQgdGhlIHNlbGYtY29udGFpbmVkIHZhcmlhbnQgZm9yIG5vbi1XaWxsQm9vc3RlclxuLy8gcmVwb3NpdG9yaWVzKSBwcmVmZXIgYHRlc3QvY2lgIG92ZXIgYHRlc3RgLCBzbyBzdGFuZGFyZGl6ZSBpdCBvbiBgd2IgdGVzdC1vbi1jaWAgYXQgdGhlIHJvb3Qg4oCUXG4vLyBgd2IgdGVzdC1vbi1jaWAgYWxyZWFkeSBpdGVyYXRlcyB3b3Jrc3BhY2UgcGFja2FnZXMgaXRzZWxmLlxuZnVuY3Rpb24gYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbJ3Rlc3QvY2knXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBDSSB0ZXN0cyB3aXRoIGV4dHJhIHN0ZXBzIChlLmcuIHNlbGVjdGluZyBzcGVjIGZpbGVzIG9yIHJ1bm5pbmcgcmF3XG4gIC8vIFBsYXl3cmlnaHQpIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5OyBzdWNoIHdyYXBwZXJzIGFyZSBwcmVzZXJ2ZWQuXG4gIHNjcmlwdHNbJ3Rlc3QvY2knXSA9IG9sZFNjcmlwdCAmJiAhaXNHZW5lcmF0ZWRUZXN0T25DaVNjcmlwdChvbGRTY3JpcHQpID8gb2xkU2NyaXB0IDogJ2J1biB3YiB0ZXN0LW9uLWNpJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIGdlbmVyYXRlZCBgd2IgdGVzdC1vbi1jaWAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKipcbiAqIGB3YiB0ZXN0YCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCB0ZXN0IHJ1bm5lcnMgb25seSwgc28gcmVwbGFjaW5nIHRoZSBgdGVzdGAgc2NyaXB0IG9mIGFcbiAqIHBhY2thZ2Ugd3JpdHRlbiBpbiBhbm90aGVyIGxhbmd1YWdlIChlLmcuIGEgTWF2ZW4gb3IgYW4gUlNwZWMgcGFja2FnZSBpbiBhIHBvbHlnbG90IG1vbm9yZXBvKVxuICogc2lsZW50bHkgZHJvcHMgaXRzIHdob2xlIHN1aXRlOiB0aGUgZ2VuZXJhdGVkIHNjcmlwdCB0aGVuIHN1Y2NlZWRzIHdpdGhvdXQgcnVubmluZyBhbnl0aGluZy5cbiAqIFN1Y2ggYSBwYWNrYWdlIGtlZXBzIGl0cyBvd24gYHRlc3RgIHNjcmlwdDsgSlMvVFMgcGFja2FnZXMgYXJlIHN0YW5kYXJkaXplZCBhcyB1c3VhbC5cbiAqL1xuZnVuY3Rpb24gYXBwbHlUZXN0U2NyaXB0KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHNcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzLnRlc3Q/LnRyaW0oKTtcbiAgaWYgKCFvbGRTY3JpcHQgfHwgZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBpc0dlbmVyYXRlZFRlc3RTY3JpcHQob2xkU2NyaXB0KSkgcmV0dXJuO1xuICBzY3JpcHRzLnRlc3QgPSBvbGRTY3JpcHQ7XG59XG5cbi8qKiBXaGV0aGVyIGEgc2NyaXB0IGJvZHkgaXMgb25lIG9mIHRoZSBLTk9XTiBnZW5lcmF0ZWQgYHdiIHRlc3RgIGludm9jYXRpb25zLiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0U2NyaXB0KHNjcmlwdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQudHJpbSgpID09PSAnYnVuIHdiIHRlc3QnO1xufVxuXG4vKipcbiAqIEtlZXBzIGEgc2NyaXB0IHRoYXQgQ0hBSU5TIGV4dHJhIGNvbW1hbmRzIG9udG8gdGhlIGdlbmVyYXRlZCBvbmUgKGUuZy4gYSBwb2x5Z2xvdCBtb25vcmVwb1xuICogYXBwZW5kaW5nIGl0cyBNYXZlbiBhbmQgUlNwZWMgc3VpdGVzIHRvIGB3YiB0ZXN0YCwgd2hpY2ggcnVucyBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgcnVubmVyc1xuICogb25seSkuIFN1Y2ggYSB3cmFwcGVyIHN0aWxsIHJ1bnMgdGhlIGdlbmVyYXRlZCBjb21tYW5kLCBzbyByZXBsYWNpbmcgaXQgd291bGQgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJlcG9zaXRvcnkncyBvd24gc3RlcHMg4oCUIHRoZSBzYW1lIHJlYXNvbmluZyBhcyBgYXBwbHlUZXN0T25DaVNjcmlwdGAuIEFuIHVucmVjb2duaXplZCBjaGFpbmVkXG4gKiBzY3JpcHQgaXMga2VwdCB3aG9sZXNhbGUgcmF0aGVyIHRoYW4gbG9zaW5nIGl0cyBwcm9qZWN0LW93bmVkIGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiBrZWVwR2VuZXJhdGVkU2NyaXB0V3JhcHBlcnMoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHNjcmlwdE5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBzY3JpcHROYW1lcykge1xuICAgIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbc2NyaXB0TmFtZV0/LnRyaW0oKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRTY3JpcHQgPSBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgIGlmICghb2xkU2NyaXB0IHx8ICFnZW5lcmF0ZWRTY3JpcHQgfHwgb2xkU2NyaXB0ID09PSBnZW5lcmF0ZWRTY3JpcHQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRSZWdFeHAgPSBuZXcgUmVnRXhwKFxuICAgICAgYF4ke2VzY2FwZVJlZ0V4cChnZW5lcmF0ZWRTY3JpcHQpLnJlcGxhY2VBbGwoJyAnLCBTdHJpbmcucmF3YFsgXFx0XStgKX0oPz1bIFxcXFx0XSooPzomJnxcXFxcfFxcXFx8fDt8XFxcXG4pKWAsXG4gICAgICAndSdcbiAgICApO1xuICAgIC8vIEEgbmV3bGluZSBzZXBhcmF0ZXMgc2hlbGwgY29tbWFuZHMganVzdCBsaWtlICYmLCB8fCBhbmQgOy5cbiAgICBpZiAoaGVhZFJlZ0V4cC50ZXN0KG9sZFNjcmlwdCkpIHtcbiAgICAgIC8vIEEgZnVuY3Rpb24gcmVwbGFjZW1lbnQga2VlcHMgYCRgLXNoYXBlZCBjaGFyYWN0ZXJzIGluIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCBsaXRlcmFsLlxuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdC5yZXBsYWNlKGhlYWRSZWdFeHAsICgpID0+IGdlbmVyYXRlZFNjcmlwdCk7XG4gICAgfSBlbHNlIGlmICgvKD86JiZ8XFx8XFx8fDt8XFxuKS91LnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG9sZFNjcmlwdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgd2JEYkNvbW1hbmQ6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkgcmV0dXJuO1xuXG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLWNyZWF0ZS1taWdyYXRpb24nLCBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgLCAnbWlncmF0ZS1kZXYnKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgICBzY3JpcHRzLFxuICAgIG9sZFNjcmlwdHMsXG4gICAgJ2RiLW1pZ3JhdGUnLFxuICAgIGAke3diRGJDb21tYW5kfSBtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3lgLFxuICAgICdtaWdyYXRlIC0tY2hlY2staWRlbXBvdGVuY3knXG4gICk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoc2NyaXB0cywgb2xkU2NyaXB0cywgJ2RiLXZpZXcnLCBgJHt3YkRiQ29tbWFuZH0gc3R1ZGlvYCwgJ3N0dWRpbycpO1xufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0KFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lOiBzdHJpbmcsXG4gIGdlbmVyYXRlZFNjcmlwdDogc3RyaW5nLFxuICBnZW5lcmF0ZWRBcmd1bWVudHM6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHNbbmFtZV07XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgbWlncmF0aW9uIGNvbW1hbmRzIHRvIHByZXBhcmUgU1FMaXRlIGRpcmVjdG9yaWVzLFxuICAvLyBmYW4gb3V0IG92ZXIgdGVuYW50cywgb3IgcGVyZm9ybSBjbGVhbnVwIHRoYXQgd2IgY2Fubm90IGluZmVyIGdlbmVyaWNhbGx5LlxuICBjb25zdCBnZW5lcmF0ZWRCb2RpZXMgPSBbYGJ1biB3YiBkYiAke2dlbmVyYXRlZEFyZ3VtZW50c31gLCBgYnVuIHdiIHByaXNtYSAke2dlbmVyYXRlZEFyZ3VtZW50c31gXTtcbiAgc2NyaXB0c1tuYW1lXSA9IG9sZFNjcmlwdCAmJiAhZ2VuZXJhdGVkQm9kaWVzLmluY2x1ZGVzKG9sZFNjcmlwdC50cmltKCkpID8gb2xkU2NyaXB0IDogZ2VuZXJhdGVkU2NyaXB0O1xufVxuXG5mdW5jdGlvbiBnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiAnd2IgZGInIHwgJ3diIHByaXNtYScge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiAnd2IgcHJpc21hJztcbiAgcmV0dXJuICd3YiBkYic7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgLy8gUHJlc2VydmUgYSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYgcHJlZml4IChlLmcuIGBNSVNFX0VOVj10ZXN0YCkgb24gYW4gZXhpc3RpbmcgbWlzZSBicmlkZ2UuXG4gICAgLy8gU3VjaCBhIHByZWZpeCBpcyByZXF1aXJlZCBmb3IgbWlzZSBjb25maWcgZW52aXJvbm1lbnRzIChtaXNlLjxNSVNFX0VOVj4udG9tbCksIHdoaWNoIGFyZVxuICAgIC8vIHNlbGVjdGVkIGZyb20gTUlTRV9FTlYgKmJlZm9yZSogbWlzZSBzdGFydHMgYW5kIGNhbm5vdCBiZSBzd2l0Y2hlZCBmcm9tIGluc2lkZSBhIHRhc2s7IGRyb3BwaW5nXG4gICAgLy8gaXQgd291bGQgc2lsZW50bHkgcnVuIHRoZSB0YXNrIGluIHRoZSBkZWZhdWx0IGVudmlyb25tZW50LlxuICAgIGNvbnN0IGVudlByZWZpeCA9IGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpO1xuICAgIGlmIChlbnZQcmVmaXggPT09IHVuZGVmaW5lZCAmJiBvbGRTY3JpcHRzW25hbWVdICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGAke2VudlByZWZpeCA/PyAnJ31taXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudi12YXIgcHJlZml4IG9mIGFuIGV4aXN0aW5nIGBtaXNlIHJ1biA8bmFtZT5gIGJyaWRnZSBzY3JpcHRcbiAqIChwb3NzaWJseSBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYnJpZGdlIGhhcyBubyBwcmVmaXgpLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzY3JpcHQgaXMgbm90IGFcbiAqIG1pc2UgYnJpZGdlIGZvciB0aGUgZ2l2ZW4gdGFzay5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgoc2NyaXB0OiB1bmtub3duLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVhY2ggYXNzaWdubWVudCB2YWx1ZSBtYXkgYmUgZG91YmxlLXF1b3RlZCwgc2luZ2xlLXF1b3RlZCwgb3IgYW4gdW5xdW90ZWQgcnVuIG9mIG5vbi13aGl0ZXNwYWNlLFxuICAvLyBzbyBwcmVmaXhlcyBsaWtlIGBNSVNFX0VOVj1cImEgYlwiYCAod2hvc2UgdmFsdWUgY29udGFpbnMgc3BhY2VzKSBhcmUgbWF0Y2hlZCBpbnN0ZWFkIG9mIGRyb3BwZWQuXG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF4oKD86XFx3Kz0oPzpcIlteXCJdKlwifCdbXiddKid8XFxTKylcXHMrKSopbWlzZSBydW4gJHtlc2NhcGVSZWdFeHAobmFtZSl9JGAsICd1JykuZXhlYyhcbiAgICBzY3JpcHQudHJpbSgpXG4gICk7XG4gIHJldHVybiBtYXRjaD8uWzFdO1xufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIG9yZzogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCBvcmc6ICdXaWxsQm9vc3RlcicsIHJlcG86ICdjb2RlLWFuYWx5emVyJywgdGFyZ2V0OiAnZGV2RGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvanVkZ2UnLCBvcmc6ICdXaWxsQm9vc3RlckxhYicsIHJlcG86ICdqdWRnZScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IG9yZywgcGFja2FnZU5hbWUsIHJlcG8sIHRhcmdldCB9KSA9PiB7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lcy5oYXMocGFja2FnZU5hbWUpIHx8IGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCBwYWNrYWdlTmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBqc29uT2JqLmRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdO1xuICAgICAgY29uc3Qgb3RoZXJUYXJnZXQgPSB0YXJnZXQgPT09ICdkZXBlbmRlbmNpZXMnID8gJ2RldkRlcGVuZGVuY2llcycgOiAnZGVwZW5kZW5jaWVzJztcbiAgICAgIC8vIFRoZSBsaW50IHJ1bGUgZGlzYWxsb3dzIGBkZWxldGVgIHdpdGggY29tcHV0ZWQgcGFja2FnZSBuYW1lczsgUmVmbGVjdCBoYXMgdGhlIHNhbWUgZGVsZXRpb24gc2VtYW50aWNzIGhlcmUuXG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmpbb3RoZXJUYXJnZXRdLCBwYWNrYWdlTmFtZSk7XG4gICAgICBqc29uT2JqW3RhcmdldF1bcGFja2FnZU5hbWVdID0gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihleGlzdGluZ1NwZWNpZmllciwgb3JnLCByZXBvKVxuICAgICAgICA/IGV4aXN0aW5nU3BlY2lmaWVyXG4gICAgICAgIDogYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIob3JnLCByZXBvKTtcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGV4aXN0aW5nIHNwZWNpZmllciBhbHJlYWR5IHBpbnMgYSBnaXQgcmVmIG9mIHRoZSBleHBlY3RlZCBwcml2YXRlIHJlcG9zaXRvcnkuXG4gKiB3YmZ5IG11c3Qgbm90IGJ1bXAgc3VjaCBwaW5zOiBhIHJ1biBpbnRlbmRlZCBhcyBjb25maWd1cmF0aW9uL3BhY2thZ2UtbWFuYWdlciBtYWludGVuYW5jZVxuICogd291bGQgb3RoZXJ3aXNlIGNoYW5nZSB0aGUgZGVwZW5kZW5jeSdzIHZlcnNpb24gYXMgYSBzaWRlIGVmZmVjdCAodXBkYXRpbmcgcGlucyBpcyBSZW5vdmF0ZSdzXG4gKiBqb2IpLCBwb3NzaWJseSB0byBhIGNvbW1pdCB3aG9zZSBwcmVidWlsdCBhcnRpZmFjdHMgYXJlIG1pc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzUGlubmVkUHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoXG4gIHNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcmc6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nXG4pOiBzcGVjaWZpZXIgaXMgc3RyaW5nIHtcbiAgaWYgKCFzcGVjaWZpZXIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzpefFs6L10pJHtvcmd9LyR7cmVwb30oPzpcXC5naXQpPyNcXFMrJGAsICd1JykudGVzdChzcGVjaWZpZXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmc6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2gob3JnLCByZXBvKTtcbiAgcmV0dXJuIGBnaXRAZ2l0aHViLmNvbToke29yZ30vJHtyZXBvfS5naXQjJHtjb21taXRIYXNofWA7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2V0R2VuSTE4blRzQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL2dlbkkxOG5Ucy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInO1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIExlZnRob29rSm9iIHtcbiAgbmFtZTogc3RyaW5nO1xuICBnbG9iPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gIHNjcmlwdD86IHN0cmluZztcbiAgcnVubmVyPzogJ2Jhc2gnO1xuICBzdGFnZV9maXhlZD86IHRydWU7XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJyxcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncHJlcGFyZScsXG4gICAgICAgIHNjcmlwdDogJ3ByZXBhcmUuc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NoZWNrJyxcbiAgICAgICAgc2NyaXB0OiAnY2hlY2suc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbi8vIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyB0aGUgdW5xdW90ZWQgbG9vcHMgYmVsb3cga2VlcCBwYXRoc1xuLy8gd2l0aCBzcGFjZXMgaW50YWN0LlxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgam9iczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdjbGVhbnVwJyxcbiAgICAgIGdsb2I6ICcnLFxuICAgICAgcnVuOiAnJyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2NoZWNrLW1pZ3JhdGlvbnMnLFxuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5mYWlsZWQ9MFxuZm9yIGZpbGUgaW4ge3N0YWdlZF9maWxlc307IGRvXG4gIGlmIGdyZXAgLXEgJ1dhcm5pbmdzOicgXCIkZmlsZVwiOyB0aGVuXG4gICAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZSAoJGZpbGUpIGNvbnRhaW5zIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgICBmYWlsZWQ9MVxuICBmaVxuZG9uZVxuZXhpdCBcIiRmYWlsZWRcIlxuYC50cmltKCksXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBidW4gcmVjb3JkcyBhbiBhYnNvbHV0ZSBgcmVzb2x2ZWRgIFVSTCBmb3IgYW4gYWxyZWFkeS1sb2NrZWQgcGFja2FnZSB3aGVuZXZlciB0aGVcbiAgICAgIC8vIGNvbmZpZ3VyZWQgcmVnaXN0cnkgZG9lcyBub3Qgc2VydmUgdGhlIHRhcmJhbGwgaG9zdCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSDigJQgd2hpY2ggaXNcbiAgICAgIC8vIGV4YWN0bHkgd2hhdCB0aGUgVGFrdW1pIEd1YXJkIHByb3h5IGRvZXMuIFNvIGFuIGluc3RhbGwgcnVuIHdpdGggR3VhcmQgYXMgdGhlIGRlZmF1bHRcbiAgICAgIC8vIHJlZ2lzdHJ5IChDSSwgb3IgYSBkZXZlbG9wZXIgd2hvIHB1dCBpdCBpbiB+Ly5ucG1yYykgYmFrZXMgbnBtLmZsYXR0LnRlY2ggVVJMcyBpbnRvXG4gICAgICAvLyBidW4ubG9jaywgYW5kIGNvbW1pdHRpbmcgdGhlbSBwaW5zIGEgU0hBUkVEIGxvY2tmaWxlIHRvIG9uZSBlbnZpcm9ubWVudCdzIG1pcnJvcjogZXZlcnlcbiAgICAgIC8vIGxhdGVyIGluc3RhbGwgZG93bmxvYWRzIHRocm91Z2ggdGhlIHByb3h5LCBhbmQgYSBjb2xkLWNhY2hlIGluc3RhbGwgZmFpbHMgb3V0cmlnaHQgd2l0aFxuICAgICAgLy8gNDAxIGZvciBhbnlvbmUgd2hvc2UgbnBtcmMgY2FycmllcyBhIHJlZ2lzdHJ5Lm5wbWpzLm9yZyB0b2tlbiwgYmVjYXVzZSBidW4gc2VuZHMgdGhlXG4gICAgICAvLyBkZWZhdWx0IHJlZ2lzdHJ5J3MgY3JlZGVudGlhbHMgdG8gd2hhdGV2ZXIgaG9zdCB0aGUgbG9ja2ZpbGUgbmFtZXMuIEd1YXJkIGNvdmVyYWdlIGRvZXNcbiAgICAgIC8vIG5vdCBkZXBlbmQgb24gdGhlc2UgVVJMcyDigJQgd2l0aCBhbiBlbXB0eSBgcmVzb2x2ZWRgLCBidW4gZGVyaXZlcyB0aGUgZG93bmxvYWQgVVJMIGZyb21cbiAgICAgIC8vIHRoZSBjb25maWd1cmVkIHJlZ2lzdHJ5IOKAlCBzbyBzdHJpcCB0aGVtLiBPbmx5IHRoZSBHdWFyZCBob3N0IGlzIHN0cmlwcGVkOiBhIHNjb3BlZFxuICAgICAgLy8gcmVnaXN0cnkgc3VjaCBhcyBWZXJkYWNjaW8gbGVnaXRpbWF0ZWx5IHJlY29yZHMgaXRzIG93biBVUkwgZm9yIHByaXZhdGUgcGFja2FnZXMuXG4gICAgICBuYW1lOiAnbm9ybWFsaXplLWJ1bi1sb2NrZmlsZScsXG4gICAgICBnbG9iOiAnYnVuLmxvY2snLFxuICAgICAgcnVuOiAnYmFzaCAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIE9ubHkgd2lsbGJvb3N0ZXItY29uZmlncyBnZXRzIHRoaXMgam9iOiBldmVyeSBvdGhlciByZXBvc2l0b3J5J3MgcmVub3ZhdGUuanNvbmMgbWVyZWx5XG4gICAgICAvLyBleHRlbmRzIHRoZSBzaGFyZWQgcHJlc2V0LCBhbmQgdGhlIHZhbGlkYXRvciBkb2VzIG5vdCByZXNvbHZlIHJlbW90ZSBwcmVzZXRzLCBzbyBydW5uaW5nIGl0XG4gICAgICAvLyB0aGVyZSB3b3VsZCB2YWxpZGF0ZSB0d28gbGluZXMgYW5kIGNhdGNoIG5vdGhpbmcuIGAtLW5vLWdsb2JhbGAgdmFsaWRhdGVzIHRoZSBwcmVzZXQgYXMgYVxuICAgICAgLy8gcmVwbyBjb25maWcgaW5zdGVhZCBvZiBhIHNlbGYtaG9zdGVkIGdsb2JhbCBjb25maWcsIGFuZCBgQGxhdGVzdGAga2VlcHMgbnBtIGZyb20gc2lsZW50bHlcbiAgICAgIC8vIGluc3RhbGxpbmcgYW4gYW5jaWVudCBSZW5vdmF0ZSB0aGF0IGNhbm5vdCBldmVuIHBhcnNlIEpTT05DIHdoZW4gdGhlIGxvY2FsIE5vZGUgbGFncyBiZWhpbmQuXG4gICAgICAvLyBTdGFnaW5nIGEgZGVsZXRpb24gb2YgcmVub3ZhdGUuanNvbmMgbGVhdmVzIG5vIGZpbGUgZm9yIGluc3BlY3Rpb24sIHNvIExlZnRob29rIHNraXBzIHRoaXNcbiAgICAgIC8vIGpvYiBpbnN0ZWFkIG9mIHJ1bm5pbmcgdGhlIHZhbGlkYXRvciBvbiBhIG1pc3NpbmcgcGF0aCDigJQgZGVsaWJlcmF0ZWx5LCBiZWNhdXNlIGRlbGV0aW5nIHRoZVxuICAgICAgLy8gc2hhcmVkIHByZXNldCBpcyBub3QgYW4gb3BlcmF0aW9uIHRoaXMgaG9vayBuZWVkcyB0byBndWFyZC5cbiAgICAgIG5hbWU6ICd2YWxpZGF0ZS1yZW5vdmF0ZS1jb25maWcnLFxuICAgICAgZ2xvYjogJ3Jlbm92YXRlLmpzb25jJyxcbiAgICAgIHJ1bjogJ25weCAtLXllcyAtLXBhY2thZ2UgcmVub3ZhdGVAbGF0ZXN0IC0tIHJlbm92YXRlLWNvbmZpZy12YWxpZGF0b3IgLS1zdHJpY3QgLS1uby1nbG9iYWwge3N0YWdlZF9maWxlc30nLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICAvLyBwcmVwYXJlIGNhbGxzIHRoaXMgd2l0aG91dCBhcmd1bWVudHMgYWZ0ZXIgQnVuIHNhdmVzIHRoZSByb290IGxvY2tmaWxlOyBMZWZ0aG9vayBwYXNzZXMgaXRzXG4gIC8vIHN0YWdlZCBwYXRoLiBUaGUgdW5wcmVkaWN0YWJsZSBzaWJsaW5nIGZpbGUgbWFrZXMgcmVwbGFjZW1lbnQgYXRvbWljLCBgY3AgLXBgIHByZXNlcnZlcyBpdHNcbiAgLy8gbW9kZSwgYW5kIHRoZSBhbmNob3JlZCBwYXR0ZXJuIGNhbm5vdCBlcmFzZSBhIGRpcmVjdCB0YXJiYWxsIGRlcGVuZGVuY3kgVVJMLlxuICBub3JtYWxpemVCdW5Mb2NrZmlsZTogYFxuIyEvYmluL2Jhc2hcbnNldCAtZVxuXG5pZiBbWyBcIiQjXCIgLWVxIDAgXV07IHRoZW5cbiAgc2V0IC0tIGJ1bi5sb2NrXG5maVxuXG5ub3JtYWxpemVkPVwiXCJcbnRyYXAgJ1tbIC16IFwiJG5vcm1hbGl6ZWRcIiBdXSB8fCBybSAtZiBcIiRub3JtYWxpemVkXCInIEVYSVRcbmZvciBmaWxlIGluIFwiJEBcIjsgZG9cbiAgW1sgLWYgXCIkZmlsZVwiIF1dIHx8IGNvbnRpbnVlXG4gIG5vcm1hbGl6ZWQ9XCIkKG1rdGVtcCBcIiRmaWxlLndiZnktbm9ybWFsaXppbmcuWFhYWFhYXCIpXCJcbiAgY3AgLXAgXCIkZmlsZVwiIFwiJG5vcm1hbGl6ZWRcIlxuICBzZWQgLUUgJ3MjKFwiLCApXCJodHRwczovL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvW15cIl0qXCIjXFxcXDFcIlwiI2cnIFwiJGZpbGVcIiA+IFwiJG5vcm1hbGl6ZWRcIlxuICBpZiAhIGNtcCAtcyBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiOyB0aGVuXG4gICAgbXYgXCIkbm9ybWFsaXplZFwiIFwiJGZpbGVcIlxuICAgIGVjaG8gXCJSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJGZpbGUgc28gdGhlIGxvY2tmaWxlIHN0YXlzIHJlZ2lzdHJ5LWFnbm9zdGljLlwiXG4gIGZpXG4gIHJtIC1mIFwiJG5vcm1hbGl6ZWRcIlxuICBub3JtYWxpemVkPVwiXCJcbmRvbmVcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdID0gW2NvbmZpZ10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCBhbGxDb25maWdzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCB7IGxpbnQgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgam9iczogZ2V0UHJlQ29tbWl0Sm9icyhjb25maWcpLFxuICAgIH0sXG4gIH07XG4gIGlmICghbGludCkge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcblxuICBpZiAobGludCkge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZywgYWxsQ29uZmlncykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoJyksIHNjcmlwdHMubm9ybWFsaXplQnVuTG9ja2ZpbGUgKyAnXFxuJywge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gQnVuIHJlcG9zIHJlY2VpdmUgd2IgYXMgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCB0b29sY2hhaW4sIHNvIGdlbmVyYXRlIHRoZVxuICAvLyBmaW5hbCBob29rIGNvbW1hbmQgb24gdGhlIGZpcnN0IHJ1biBpbnN0ZWFkIG9mIGNoYW5naW5nIGl0IG9uIHRoZSBzZWNvbmQuXG4gIGNvbnN0IHF1aWV0TGludENvbW1hbmQgPSAnYnVuIHdiIGxpbnQgLS1xdWlldCc7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9ic1xuICAgIC5maWx0ZXIoKGpvYikgPT4gam9iLm5hbWUgIT09ICd2YWxpZGF0ZS1yZW5vdmF0ZS1jb25maWcnIHx8IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncylcbiAgICAubWFwKChqb2IpID0+XG4gICAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uam9iLFxuICAgICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgICAgfVxuICAgICAgICA6IGpvYlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID0gWy4uLmV4dGVuc2lvbnMucHJldHRpZXJPbmx5XTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbmJ1biBydW4gLS1jd2QgcGFja2FnZXMvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cbiAgLy8gUHl0aG9uLW9ubHkgQnVuIHJlcG9zIGluc3RhbGwgd2IgZm9yIHNoYXJlZCBzY3JpcHRzIGJ1dCBub3QgT3hsaW50LCBzb1xuICAvLyBzdGFnZWQtZmlsZSBob29rcyBtdXN0IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZm9ybWF0dGVyIHBhdGggYmVsb3cuXG4gIGNvbnN0IGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICBpZiAoY2FuVXNlV2JGb3JTdGFnZWRGaWxlcykge1xuICAgIHJldHVybiBgXG5idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbnBhY2thZ2VfanNvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcIlxuJHtoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpID8gU3RyaW5nLnJhd2BweXRob25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwucHkkJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCA/IFN0cmluZy5yYXdgZGFydF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5kYXJ0JCcgfCBncmVwIC12ICdnZW5lcmF0ZWQnIHwgZ3JlcCAtdiAnXFwuZnJlZXplZFxcLmRhcnQkJyB8IGdyZXAgLXYgJ1xcLmdcXC5kYXJ0JCcgfHwgdHJ1ZSlcImAgOiAnJ31cblxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIGJ1biBzb3J0LXBhY2thZ2UtanNvbiAkcGFja2FnZV9qc29uX2ZpbGVzXG5maVxuJHtcbiAgaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKVxuICAgID8gYGlmIFsgLW4gXCIkcHl0aG9uX2ZpbGVzXCIgXTsgdGhlblxuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBibGFjayAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGZsYWtlOCAkcHl0aG9uX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbFxuICAgID8gYGlmIFsgLW4gXCIkZGFydF9maWxlc1wiIF07IHRoZW5cbiAgZGFydCBmb3JtYXQgJGRhcnRfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2NhbFdiUGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZXMnLCAnd2InLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93Yic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfFxcLm1pc2VcXC50b21sKWA7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gJ2J1biBpbnN0YWxsJztcbiAgLy8gRG8gTk9UIGFkZCBgLnZpbmV4dGAgaGVyZTogaXQgaG9sZHMgb25seSB2aW5leHQncyBjb250ZW50LWhhc2hlZCBmb250IGNhY2hlIGFuZCB0aGUgZGV2XG4gIC8vIHNlcnZlcidzIGxvY2sgZmlsZSAoZGVsZXRpbmcgdGhlIGxvY2sgZGlzYWJsZXMgdGhlIGR1cGxpY2F0ZS1kZXYtc2VydmVyIGd1YXJkIGZvciBhIHJ1bm5pbmdcbiAgLy8gc2VydmVyKS4gdmluZXh0J3MgYnVpbGQgb3V0cHV0IGdvZXMgdG8gYGRpc3QvYCwgYW5kIFZpdGUncyBkZXBlbmRlbmN5IGNhY2hlIGlzIGhhbmRsZWQgYnlcbiAgLy8gdGhlIHNlcGFyYXRlIGluc3RhbGwtbGF5b3V0IGhvb2sgYmVsb3cuXG4gIC8vIFNjYW4gZXZlcnkgd29ya3NwYWNlIGNvbmZpZyAobm90IGp1c3QgdGhlIHJvb3QpOiBpbiBhIG1vbm9yZXBvIHRoZSBhcHAgdXN1YWxseSBsaXZlcyBpblxuICAvLyBwYWNrYWdlcy88YXBwPiBvciBhcHBzLzxhcHA+LCBhbmQgdGhlIGNhY2hlIGRpcmVjdG9yaWVzIGFyZSB3b3Jrc3BhY2UtcmVsYXRpdmUuXG4gIGNvbnN0IG5leHRDYWNoZURpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gICAgY29uZmlnLFxuICAgIGFsbENvbmZpZ3MsXG4gICAgKHdvcmtzcGFjZUNvbmZpZykgPT4gd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLm5leHQsXG4gICAgJy5uZXh0J1xuICApO1xuICBjb25zdCBybU5leHREaXJlY3RvcmllcyA9XG4gICAgbmV4dENhY2hlRGlyUGF0aHMubGVuZ3RoID4gMCA/IGAgJiYgcm0gLVJmIC0tICR7bmV4dENhY2hlRGlyUGF0aHMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1gIDogJyc7XG4gIC8vIEJ1biBkb2VzIG5vdCByZWxpbmsgYW4gZXhpc3RpbmcgaXNvbGF0ZWQgdHJlZSB3aGVuIGdsb2JhbFN0b3JlL2xpbmtlciBzZXR0aW5ncyBjaGFuZ2UuIEluc3BlY3RcbiAgLy8gdGhvc2Uga2V5cyByYXRoZXIgdGhhbiBldmVyeSBidW5maWcgY2hhbmdlOiBtaW5pbXVtUmVsZWFzZUFnZSB1cGRhdGVzIG11c3Qgbm90IGRlc3Ryb3kgYVxuICAvLyBjb250cmlidXRvcidzIHdvcmtpbmcgaW5zdGFsbCBiZWZvcmUgYSBwb3RlbnRpYWxseSBuZXR3b3JrLWRlcGVuZGVudCByZXBsYWNlbWVudCBzdWNjZWVkcy5cbiAgY29uc3Qgbm9kZU1vZHVsZXNEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKGNvbmZpZywgYWxsQ29uZmlncywgKCkgPT4gdHJ1ZSwgJ25vZGVfbW9kdWxlcycpO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgaWYgZ2l0IGRpZmYgLS1uby1jb2xvciAtVTAgT1JJR19IRUFEIEhFQUQgLS0gJypidW5maWcudG9tbCcgfCBncmVwIC0tcXVpZXQgLUUgJ15bKy1dICooZ2xvYmFsU3RvcmV8bGlua2VyfHB1YmxpY0hvaXN0UGF0dGVybiknOyB0aGVuIHJtIC1SZiAtLSAke25vZGVNb2R1bGVzRGlyUGF0aHMubWFwKHF1b3RlRm9yU2hlbGwpLmpvaW4oJyAnKX07IGZpYFxuICApO1xuICAvLyBidW4ubG9jay1vbmx5IG1lcmdlcyAoUmVub3ZhdGUgbG9ja2ZpbGUgbWFpbnRlbmFuY2UpLCBidW5maWcudG9tbCAvIC5ucG1yYyBjaGFuZ2VzIChsaW5rZXIsXG4gIC8vIHJlZ2lzdHJ5LCBob2lzdGluZyksIGFuZCBwYXRjaCBlZGl0cyBhbGwgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0IHRvdWNoaW5nIHBhY2thZ2UuanNvbi5cbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKHBhY2thZ2VcXC5qc29ufGJ1blxcLmxvY2t8YnVuZmlnXFwudG9tbHxcXC5ucG1yY3xwYXRjaGVzLylcIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcmllc31cImBcbiAgKTtcbiAgLy8gVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaW4gbm9kZV9tb2R1bGVzLy52aXRlIHNlbGYtaW52YWxpZGF0ZXMgb24gbG9ja2ZpbGUgLyBwYXRjaGVzIC9cbiAgLy8gY29uZmlnIC8gTk9ERV9FTlYgY2hhbmdlcyAoc2VlIFZpdGUncyBkZXAgcHJlLWJ1bmRsaW5nIGRvY3MpLCBzbyB0aGUgcmVzaWR1YWwgc3RhbGUgY2FzZSBpc1xuICAvLyBpbnN0YWxsLWxheW91dCBjaGFuZ2VzIChidW5maWcudG9tbCBsaW5rZXIsIC5ucG1yYyk6IHRoZXkgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0XG4gIC8vIHRvdWNoaW5nIHRoZSBsb2NrZmlsZSwgYW5kIHRoZXkgYXJlIGFic2VudCBmcm9tIFZpdGUncyBjYWNoZSBrZXkuXG4gIGNvbnN0IHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpdGUsXG4gICAgJ25vZGVfbW9kdWxlcy8udml0ZSdcbiAgKTtcbiAgaWYgKHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMubGVuZ3RoID4gMCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmMpXCIgXCJybSAtUmYgLS0gJHtybVZpdGVDYWNoZURpcmVjdG9yaWVzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9XCJgXG4gICAgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICAvLyBCbGl0eiByZXBvc2l0b3JpZXMgZGVsaWJlcmF0ZWx5IGdldCB0aGUgc2FtZSB3Yi1kcml2ZW4gcHJpc21hIGNvbW1hbmRzIGFzIGV2ZXJ5b25lIGVsc2U6XG4gIC8vIHRoZSBibGl0eiBDTEkncyBjb2RlZ2VuIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2UsIHdoaWNoIG11c3QgbmV2ZXIgcnVuXG4gIC8vIHVuZGVyIEJ1bidzIHNoYXJlZCBnbG9iYWwgc3RvcmUuIFlhcm4tZXJhIEJsaXR6IHJlcG9zIGdldCB0aGVpciByb3V0ZSBtYW5pZmVzdCBmcm9tXG4gIC8vIGB3YiBnZW4tY29kZWAncyBgYmxpdHogY29kZWdlbmAgc3RlcCwgYW5kIGN1cnJlbnQgd2Igcm91dGVzIG9ubHkgYHdiIHByaXNtYSBzZWVkYCB0aHJvdWdoXG4gIC8vIHRoZSBibGl0eiBDTEksIG9ubHkgZm9yIG5vbi1CdW4gcmVwb3MgKHNlZSBwYWNrYWdlcy93Yi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzKTsgdGhlXG4gIC8vIHBvc3QtbWVyZ2UgaG9va3Mgc3RheSB3Yi1kcml2ZW4gYmVjYXVzZSBgcHJpc21hIGRlcGxveWAvYGdlbmVyYXRlYCBuZWVkIG5vIGJsaXR6IGxvYWRlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuLy8gVGhlIGdlbmVyYXRlZCBjb21tYW5kIHBhc3NlcyB0aHJvdWdoIFRXTyBzaGVsbCBwYXJzaW5nIHN0YWdlczogdGhlIHByZXBhcmUuc2ggbGluZSBwYXJzZXMgaXQgYXNcbi8vIGEgZG91YmxlLXF1b3RlZCBhcmd1bWVudCAocHJvY2Vzc2luZyBcXCwgYCwgJCBhbmQgXCIgaW1tZWRpYXRlbHkpLCBhbmQgcnVuX2lmX2NoYW5nZWQgdGhlbiBldmFsJ3Ncbi8vIGl0ICh3b3JkLXNwbGl0dGluZyBhbmQgZ2xvYmJpbmcpLiBBbiB1bnF1b3RlZCBwYXRoIGNvbnRhaW5pbmcgc3BhY2VzIChlLmcuIGBhcHBzL215IGFwcC8ubmV4dGApXG4vLyB3b3VsZCB3b3JkLXNwbGl0IGludG8gdW5yZWxhdGVkIHJtIHRhcmdldHMsIGFuZCBgJGAvYmFja3RpY2sgd291bGQgZXhwYW5kIGF0IHRoZSBmaXJzdCBzdGFnZS5cbi8vIFNvOiBzaW5nbGUtcXVvdGUgZm9yIHRoZSBldmFsIHN0YWdlLCB0aGVuIGJhY2tzbGFzaC1lc2NhcGUgdGhlIGRvdWJsZS1xdW90ZS1jb250ZXh0IHNwZWNpYWxzLlxuZnVuY3Rpb24gcXVvdGVGb3JFdmFsdWF0ZWRTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXZhbFF1b3RlZCA9IHF1b3RlRm9yU2hlbGwoZmlsZVBhdGgpO1xuICByZXR1cm4gZXZhbFF1b3RlZC5yZXBsYWNlQWxsKC9bXFxcXGAkXCJdL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuZnVuY3Rpb24gcXVvdGVGb3JTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnJHtmaWxlUGF0aC5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG59XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBkaXJlY3RvcmllcyAocm9vdCBmaXJzdCwgZGVkdXBsaWNhdGVkLCBgPHN1YkRpck5hbWU+YCBhcHBlbmRlZCkgb2YgZXZlcnlcbiAqIHdvcmtzcGFjZSB3aG9zZSBjb25maWcgbWF0Y2hlcyB0aGUgcHJlZGljYXRlLiBUaGUgaG9vayBzY3JpcHQgcnVucyBhdCB0aGUgcmVwb3NpdG9yeSByb290LCBzb1xuICogcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IGNvbmZpZydzIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgcHJlZGljYXRlOiAoY29uZmlnOiBQYWNrYWdlQ29uZmlnKSA9PiBib29sZWFuLFxuICBzdWJEaXJOYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgYWxsQ29uZmlnc1xuICAgICAgICAuZmlsdGVyKChjb25maWcpID0+IHByZWRpY2F0ZShjb25maWcpKVxuICAgICAgICAubWFwKChjb25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHJvb3RDb25maWcuZGlyUGF0aCwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgICAgIHJldHVybiByZWxhdGl2ZURpclBhdGggPyBwYXRoLnBvc2l4LmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBzdWJEaXJOYW1lKSA6IHN1YkRpck5hbWU7XG4gICAgICAgIH0pXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29uZmlnQ29udGVudChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGVudD8udHJpbSgpO1xufVxuIiwiaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nVXRpbC5qcyc7XG5cbmV4cG9ydCB0eXBlIENvbmZpZ0Jsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5pbnRlcmZhY2UgTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMge1xuICBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcbiAgbWFya2VyUHJlZml4OiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRDb25maWdDb250ZW50T3B0aW9ucyB7XG4gIGRlc2lyZWRDb250ZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZENvbmZpZ0Jsb2NrcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZXJQcmVmaXg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMpIHtcbiAgICB0aGlzLmJsb2NrTmFtZXMgPSBvcHRpb25zLmJsb2NrTmFtZXM7XG4gICAgdGhpcy5tYXJrZXJQcmVmaXggPSBvcHRpb25zLm1hcmtlclByZWZpeDtcbiAgICB0aGlzLnRvb2xOYW1lID0gb3B0aW9ucy50b29sTmFtZTtcbiAgfVxuXG4gIGdldENvbmZpZ0NvbnRlbnQob3B0aW9uczogR2V0Q29uZmlnQ29udGVudE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghb3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICAgIGlmICh0aGlzLmhhc01hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCwgb3B0aW9ucy5kZXNpcmVkQ29udGVudCwgb3B0aW9ucy5maWxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICB9XG5cbiAgZ2V0QmxvY2soYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKX1cbiR7Y29udGVudH1cbiR7dGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKX1gO1xuICB9XG5cbiAgaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja05hbWVzLnNvbWUoKGJsb2NrTmFtZSkgPT4gY29udGVudC5pbmNsdWRlcyh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICAgIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIHRoaXMuYmxvY2tOYW1lcykge1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLmV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiAke3RoaXMudG9vbE5hbWV9IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgYCR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cCh0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTpzdGFydCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTplbmQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hmbXQnLFxuICB0b29sTmFtZTogJ294Zm10Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94Zm10Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICBmaWxlUGF0aCxcbiAgICB9KTtcbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3Qgb3hmbXRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnKTtcblxuICAvLyBDb21tb25KUyBwYWNrYWdlcyBuZWVkIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMgaGVyZTogb3hmbXQgY29uZmlnIGZpbGVzIGFyZVxuICAvLyBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCB0aGUgc2hhcmVkIGNvbmZpZyBwYWNrYWdlIGlzIEVTTS1vbmx5LlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94Zm10IGNvbmZpZyBmaWxlcyBhcmUgb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hmbXRDb25maWcgPSByZXF1aXJlKCcke294Zm10QmFzZUNvbmZpZ01vZHVsZX0nKTtcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBveGZtdENvbmZpZy5kZWZhdWx0ID8/IG94Zm10Q29uZmlnO2BcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gY29uZmlnO2BcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlLFxuICByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUsXG59IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gZ2VuZXJhdGlvblxuICAgIC8vIG11c3Qgbm90IHJlcGxhY2UgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuIEdlbmVyYXRlZCBmaWxlcyB3aXRoXG4gICAgLy8gbWFuYWdlZCBibG9ja3MgYXJlIHN0aWxsIHNhZmUgdG8gdXBkYXRlLlxuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnID0gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgfSk7XG5cbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgaXNSb290Q29uZmlnID0gY29uZmlnLmlzUm9vdDtcbiAgY29uc3Qgb3hsaW50QmFzZUNvbmZpZ01vZHVsZSA9IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWcsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycpO1xuXG4gIC8vIERvIG5vdCBjb2xsYXBzZSB0aGlzIHRvIGEgc3RhdGljIGltcG9ydCBmb3IgZXZlcnkgcGFja2FnZS4gQ29tbW9uSlMgcGFja2FnZXNcbiAgLy8gdHlwZS1jaGVjayBhdXRvLWRpc2NvdmVyZWQgb3hsaW50LmNvbmZpZy50cyBhcyBDb21tb25KUywgc28gaW1wb3J0aW5nIHRoZSBFU01cbiAgLy8gQHdpbGxib29zdGVyL294bGludC1jb25maWcgcGFja2FnZSB0cmlnZ2VycyBUUzE0NzkuIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGhcbiAgLy8gbGl0ZXJhY3ktdGVzdCdzIGdlbmVyYXRlZCBjb25maWcgcGF0dGVybi5cbiAgLy8gTm8gLy8vIDxyZWZlcmVuY2UgdHlwZXM+IGxpbmU6IHRoZSB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZyBhbHJlYWR5IGNvdmVycyAqLmNvbmZpZy50cyB3aXRoXG4gIC8vIHR5cGVzIFtcImJ1blwiXSwgd2hpY2ggdHlwZXMgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cywgd2hpbGUgYSBcIm5vZGVcIiByZWZlcmVuY2UgYnJlYWtzIHVuZGVyXG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciB3aGVyZSB0aGUgdW5kZWNsYXJlZCBAdHlwZXMvbm9kZSBpcyB1bnJlc29sdmFibGUgKFRTMjY4OCkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZy5kZWZhdWx0ID8/IG94bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG5pbXBvcnQgb3hsaW50QmFzZUNvbmZpZyBmcm9tICcke294bGludEJhc2VDb25maWdNb2R1bGV9JztcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUga2VlcHMgYSBwYWNrYWdlLWxvY2FsIGNvcHkgc28gcmVwb3NpdG9yaWVzIGNhbiBhZGQgc2V0dGluZ3Mgb3V0c2lkZSBtYW5hZ2VkXG4vLyBibG9ja3Mgd2l0aG91dCBtdXRhdGluZyB0aGUgc2hhcmVkIGltcG9ydGVkIGNvbmZpZyBvYmplY3QuIFRoZSByb290IGNvbmZpZyBmb3JjZXMgdGhlIHR5cGUtYXdhcmVcbi8vIG9wdGlvbnMgb24gaW5zaWRlIHRoZSBtYW5hZ2VkIGJsb2NrIHNvIG5vIGN1c3RvbWl6YXRpb24gY2FuIHNpbGVudGx5IGRpc2FibGUgdHlwZSBjaGVja2luZzsgZXZlcnlcbi8vIG90aGVyIGNvbmZpZyBkZWxldGVzIHRoZW0gYmVjYXVzZSBPeGxpbnQgcmVqZWN0cyB0aG9zZSByb290LW9ubHkgb3B0aW9ucyBlbHNld2hlcmUgKHR5cGUgY2hlY2tpbmdcbi8vIHN1cnZpdmVzOiB0aGUgbGludCBjb21tYW5kcyBwYXNzIC0tdHlwZS1hd2FyZSBhbmQgLS10eXBlLWNoZWNrIGV4cGxpY2l0bHkpLlxuZnVuY3Rpb24gZ2V0UmVzb2x2ZWRDb25maWdDb250ZW50KGJhc2VDb25maWdOYW1lOiBzdHJpbmcsIGlzUm9vdENvbmZpZzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc1Jvb3RDb25maWcpIHtcbiAgICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucyA9IHsgLi4ub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucywgdHlwZUF3YXJlOiB0cnVlLCB0eXBlQ2hlY2s6IHRydWUgfTtgO1xuICB9XG5cbiAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbmRlbGV0ZSBveGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zO2A7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgLy8gcHlyaWdodGNvbmZpZy5qc29uIGFsbG93cyBKU09OQzsgYW4gZXhpc3RpbmcgZmlsZSB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnRcbiAgICAgIC8vIHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIGJhcmUgdGVtcGxhdGUuXG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8b2JqZWN0PihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS1jbGVhbiBweXJpZ2h0Y29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUobmV3U2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uc3VtZXNEb2NrZXJFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbWFuYWdlZFNjcmlwdHNCbG9jayA9IGBzY3JpcHRzLyoqXG4hc2NyaXB0cy9cbiFzY3JpcHRzLyouc2hgO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UmFpbHdheWlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhSYWlsd2F5aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJhaWx3YXlpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHVzZXNEb2NrZXJFbnYgPSBjb25zdW1lc0RvY2tlckVudihjb25maWcuZG9ja2VyZmlsZSk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICBpZiAoY29uZmlnLmlzUmFpbHdheSAmJiB1c2VzRG9ja2VyRW52KSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCAnIS5kb2NrZXIuZW52XFxuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9ec2NyaXB0c1xcLyQvbSwgbWFuYWdlZFNjcmlwdHNCbG9jayk7XG4gICAgLy8gYHJhaWx3YXkgdXBgIHN0cmlwcyBnaXRpZ25vcmVkIGZpbGVzIGZyb20gdGhlIHVwbG9hZGVkIGJ1aWxkIGNvbnRleHQsIHNvIHRoZSBnZW5lcmF0ZWRcbiAgICAvLyBub24tc2VjcmV0IC5kb2NrZXIuZW52IChgd2IgZ2VuLWRvY2tlci1lbnZgIG91dHB1dCkgbmVlZHMgYW4gZXhwbGljaXQgdW4taWdub3JlIHRvIHJlYWNoXG4gICAgLy8gdGhlIHJlbW90ZSBEb2NrZXIgYnVpbGQuIEFwcGVuZGVkLCBub3QgcHJlcGVuZGVkOiBpZ25vcmUgZmlsZXMgYXJlIGxhc3QtbWF0Y2gtd2lucywgc28gYVxuICAgIC8vIGhhbmQtd3JpdHRlbiBwYXR0ZXJuIHN1Y2ggYXMgYCouZW52YCBlYXJsaWVyIGluIHRoZSBmaWxlIG11c3Qgbm90IHNpbGVudGx5IHJlLWV4Y2x1ZGUgaXQuXG4gICAgaWYgKHVzZXNEb2NrZXJFbnYgJiYgIS9eIVxcLmRvY2tlclxcLmVudiQvbS50ZXN0KG5ld0NvbnRlbnQpKSB7XG4gICAgICBuZXdDb250ZW50ID0gYCR7bmV3Q29udGVudC5yZXBsYWNlKC9cXG4/JC8sICdcXG4nKX0hLmRvY2tlci5lbnZcXG5gO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvY2tlcmZpbGUgJiYgIXVzZXNEb2NrZXJFbnYpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL14hXFwuZG9ja2VyXFwuZW52XFxuPy9tLCAnJyk7XG4gICAgfVxuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIG5ld0NvbnRlbnQgPyBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSA6IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aClcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgSW1hZ2UsIExpbmssIFBhcmFncmFwaCwgUGhyYXNpbmdDb250ZW50LCBSb290Q29udGVudCB9IGZyb20gJ21kYXN0JztcbmltcG9ydCB7IGZyb21NYXJrZG93biB9IGZyb20gJ21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cgfSBmcm9tICcuL3dvcmtmbG93LmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5jb25zdCB3YmZ5QmFkZ2VVcmxQcmVmaXggPSAnaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS93YmZ5LSc7XG5jb25zdCB3YmZ5QmFkZ2VVcmxTdWZmaXggPSAnLTFlOTBmZi5zdmcnO1xuY29uc3Qgd2JmeUJhZGdlTGluayA9ICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL3RyZWUvbWFpbi9wYWNrYWdlcy93YmZ5JztcblxuY29uc3QgbnBtUGFja2FnZVVybFByZWZpeCA9ICdodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS8nO1xuXG5jb25zdCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucyA9IFtcbiAgL15cXFshXFxbd2JmeVxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL2JhZGdlXFwvd2JmeS1bXilcXHNdKy0xZTkwZmZcXC5zdmdcXClcXF1cXChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9XaWxsQm9vc3RlclxcL3NoYXJlZFxcL3RyZWVcXC9tYWluXFwvcGFja2FnZXNcXC93YmZ5XFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1teKVxcc10rXFwvYWN0aW9uc1xcL3dvcmtmbG93c1xcL1teKVxcc10rKVxcL2JhZGdlXFwuc3ZnXFwpXFxdXFwoXFwxXFwpJC91LFxuICAvLyBBbnkgYmFkZ2UgbGlua2luZyB0byBhbiBucG0gcGFja2FnZSBwYWdlLCB3aGF0ZXZlciBpbWFnZSBpdCBzaG93cyBhbmQgaG93ZXZlciB0aGUgbGluayBpc1xuICAvLyBzcGVsbGVkOiB0aGUgYmxvY2sgaXMgd2JmeSdzLCBpdCB3cml0ZXMgYXQgbW9zdCBvbmUgbnBtIGJhZGdlLCBzbyBhIGJhZGdlIGZvciBhIHJlbmFtZWQgb3JcbiAgLy8gdW5wdWJsaXNoZWQgcGFja2FnZSBpcyBhIHN0YWxlIGNvcHkgb2YgdGhhdCBvbmUg4oCUIG5vdCBhbm90aGVyIGJhZGdlIHRvIGtlZXAgYmVzaWRlIGl0LlxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoW14pXFxzXStcXClcXF1cXChodHRwcz86XFwvXFwvKD86d3d3XFwuKT9ucG1qc1xcLmNvbVxcL3BhY2thZ2VcXC9bXilcXHNdKlxcKSQvdSxcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkV2JmeUJhZGdlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIeXBoZW5zIGFyZSBlc2NhcGVkIGFzIGAtLWAgcGVyIHNoaWVsZHMuaW8ncyBiYWRnZSBwYXRoIHN5bnRheCwgc28gYHYxLjIuMy1yYy4xYCBzdGF5cyBpbnRhY3QuXG4gIHJldHVybiBgWyFbd2JmeV0oJHt3YmZ5QmFkZ2VVcmxQcmVmaXh9JHtsYWJlbC5yZXBsYWNlQWxsKCctJywgJy0tJyl9JHt3YmZ5QmFkZ2VVcmxTdWZmaXh9KV0oJHt3YmZ5QmFkZ2VMaW5rfSlgO1xufVxuXG4vKiogVGhlIHZlcnNpb24gbGFiZWwgdGhlIHdiZnkgYmFkZ2UgaW4gdGhlIHJlcG9zaXRvcnkncyBSRUFETUUgcmVjb3JkcywgaS5lLiB0aGUgYnVpbGQgdGhhdCB3YmZpZWQgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIENvbmZpbmVkLCBhbmQgdG9sZXJhbnQgb2YgYW55IHJlYWQgZmFpbHVyZTogYSBSRUFETUUgdGhhdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IChhXG4gIC8vIGNvbW1pdHRlZCBzeW1saW5rKSBvciBjYW5ub3QgYmUgcmVhZCBhdCBhbGwgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoIGJ1aWxkIGNvbmZpZ3VyZWQgVEhJU1xuICAvLyByZXBvc2l0b3J5LCBhbmQgdGhlIGFuc3dlciBvbmx5IGV2ZXIgc3VwcHJlc3NlcyB3b3JrIOKAlCBzbyBhbnl0aGluZyBidXQgYSByZWFkYWJsZSBpbi1yZXBvc2l0b3J5XG4gIC8vIFJFQURNRSBtZWFucyBcIm5vdCBrbm93biB0byBiZSBhcHBsaWVkXCIgYW5kIHRoZSBydW4gcHJvY2VlZHMuXG4gIGNvbnN0IHJlYWRtZSA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdSRUFETUUubWQnKSkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAocmVhZG1lID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFJFQURNRSBpcyBwYXJzZWQgcmF0aGVyIHRoYW4gc2Nhbm5lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3cml0ZUJhZGdlQmxvY2sgcGFyc2VzIGl0LCBhbmRcbiAgLy8gb25seSB0aGUgc2hhcGUgd3JpdGVCYWRnZUJsb2NrIGl0c2VsZiB3cml0ZXMgY291bnRzIGFzIGFuIGFwcGxpZWQgYmFkZ2U6IGEgdG9wLWxldmVsIHBhcmFncmFwaFxuICAvLyBvZiBiYWRnZXMuIEEgYmFkZ2UgYW55d2hlcmUgZWxzZSBpcyBjb250ZW50IHRoYXQgbWVyZWx5IG1lbnRpb25zIG9uZSDigJQgYSBmZW5jZWQgZXhhbXBsZSAod2JmeSdzXG4gIC8vIG93biBkb2N1bWVudGF0aW9uIGhhcyB0aG9zZSksIGEgYmxvY2sgcXVvdGUsIGEgbGlzdCBpdGVtIOKAlCBhbmQgcmVhZGluZyBpdCBhcyBhcHBsaWVkIHdvdWxkIHNraXBcbiAgLy8gZXZlcnkgZml4ZXIgZm9yIHRoZSByZXBvc2l0b3J5LlxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZnJvbU1hcmtkb3duKHJlYWRtZSkuY2hpbGRyZW4pIHtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYmFkZ2Ugb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKCFpc0JhZGdlTm9kZShiYWRnZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyB1cmwgfSA9IGJhZGdlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHdiZnlCYWRnZVVybFByZWZpeCkgJiYgdXJsLmVuZHNXaXRoKHdiZnlCYWRnZVVybFN1ZmZpeCkpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSh3YmZ5QmFkZ2VVcmxQcmVmaXgubGVuZ3RoLCAtd2JmeUJhZGdlVXJsU3VmZml4Lmxlbmd0aCkucmVwbGFjZUFsbCgnLS0nLCAnLScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICAvLyBUaGUgd2JmeSBiYWRnZSBtYXJrcyBhIHJlcG9zaXRvcnkgYXMgd2JmaWVkLCBzbyBhIHJlcG9zaXRvcnkgd2l0aG91dCBhIFJFQURNRSBzdGlsbCBnZXRzIG9uZS5cbiAgICAvLyByZWFkRmlsZUlmRXhpc3RzIGZhbGxzIGJhY2sgT05MWSBvbiBFTk9FTlQ6IGEgUkVBRE1FIHRoYXQgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZCAoZS5nLlxuICAgIC8vIHBlcm1pc3Npb25zLCBFTUZJTEUpIG11c3QgYWJvcnQgdGhlIGdlbmVyYXRvciBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIHN0dWIuXG4gICAgbGV0IG5ld0NvbnRlbnQgPVxuICAgICAgKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz9cbiAgICAgIGAjICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID8/IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSl9XFxuYDtcblxuICAgIC8vIE9yZGVyZWQgYnkgd2hhdCBhIHJlYWRlciBjYXJlcyBhYm91dCBtb3N0OiB0aGUgbnBtIGJhZGdlIG5hbWVzIHRoZSBwYWNrYWdlIGEgcmVhZGVyIGluc3RhbGxzLFxuICAgIC8vIHRoZW4gdGhlIHdvcmtmbG93IGJhZGdlcyByZXBvcnQgd2hldGhlciB0aGUgY29kZSBpcyBjdXJyZW50bHkgaGVhbHRoeSwgdGhlbiBob3cgaXQgaXNcbiAgICAvLyByZWxlYXNlZCwgYW5kIGxhc3QgdGhlIHdiZnkgYnVpbGQgdGhhdCBjb25maWd1cmVkIGl0LlxuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBucG1QYWNrYWdlTmFtZSA9IGF3YWl0IGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZyk7XG4gICAgaWYgKG5wbVBhY2thZ2VOYW1lKSBiYWRnZXMucHVzaChidWlsZE5wbUJhZGdlKG5wbVBhY2thZ2VOYW1lKSk7XG4gICAgYmFkZ2VzLnB1c2goLi4uKGF3YWl0IGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnKSkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkgYmFkZ2VzLnB1c2goc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIGJhZGdlcy5wdXNoKGJ1aWxkV2JmeUJhZGdlKGdldFdiZnlWZXJzaW9uTGFiZWwoKSA/PyAnYXBwbGllZCcpKTtcblxuICAgIC8vIFRoZSBibG9jayBpcyB3cml0dGVuIGluIG9uZSBwYXNzIGZyb20gdGhlIGJhZGdlcyB3YmZ5IG1hbmFnZXMgcmlnaHQgbm93LiBBIGJhZGdlIHRoYXQgaXMgbm9cbiAgICAvLyBsb25nZXIgd2FudGVkIOKAlCBhIHN1cGVyc2VkZWQgdmVyc2lvbiwgb3Igb25lIHdob3NlIHdvcmtmbG93IGlzIGdvbmUg4oCUIHNpbXBseSBpcyBub3QgaW4gdGhlXG4gICAgLy8gbGlzdCwgc28gbm90aGluZyBoYXMgdG8gcmVtb3ZlIGl0LlxuICAgIG5ld0NvbnRlbnQgPSB3cml0ZUJhZGdlQmxvY2sobmV3Q29udGVudCwgYmFkZ2VzKTtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50LCBnZXRMaW5lRW5kaW5nKG5ld0NvbnRlbnQpKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBucG0gcGFja2FnZSBuYW1lIHRoZSByZXBvc2l0b3J5IHB1Ymxpc2hlcyBmcm9tIGl0cyByb290IG1hbmlmZXN0LCBpZiBhbnkuIEEgbWFuaWZlc3Qgbm9cbiAqIHJlbGVhc2UgcHVibGlzaGVzLCBvciBvbmUga2VwdCBvdXQgb2YgdGhlIHJlZ2lzdHJ5IG9uIHB1cnBvc2UsIGhhcyBubyBwYWNrYWdlIHBhZ2UgdG8gbGluayB0by5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGlzaGVkTnBtUGFja2FnZU5hbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIGlmICghcGFja2FnZUpzb24/Lm5hbWUgfHwgIWNvbmZpZy5yZWxlYXNlLm5wbSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gYHByaXZhdGVgIGlzIHJlYWQgdGhlIHdheSBnZW5lcmF0ZVBhY2thZ2VKc29uIHdyaXRlcyBpdDogaXQgcmVtb3ZlcyB0aGUgZmxhZyBmcm9tIGEgTU9OT1JFUE9cbiAgLy8gcm9vdCB0aGF0IGRlY2xhcmVzIHB1Ymxpc2hpbmcgaW50ZW50LCBzbyByZWFkaW5nIHRoZSBmbGFnIGFsb25lIHdvdWxkIGRlbnkgdGhlIGJhZGdlIHRvIHRoZVxuICAvLyB2ZXJ5IG1hbmlmZXN0IHRoZSBzYW1lIHJ1biBtYWtlcyBwdWJsaXNoYWJsZS4gQW55d2hlcmUgZWxzZSB0aGUgZmxhZyBzdGFuZHMgYXMgd3JpdHRlbi5cbiAgY29uc3QgZGVjbGFyZXNQdWJsaXNoaW5nSW50ZW50ID0gISFwYWNrYWdlSnNvbi5wdWJsaXNoQ29uZmlnIHx8IGNvbmZpZy5yZWxlYXNlLm5wbVB1Ymxpc2hlc1Jvb3Q7XG4gIGlmIChwYWNrYWdlSnNvbi5wcml2YXRlICYmICEoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIGRlY2xhcmVzUHVibGlzaGluZ0ludGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIFRoZSBtYW5pZmVzdCBvbmx5IHNheXMgdGhlIHJlcG9zaXRvcnkgSU5URU5EUyB0byBwdWJsaXNoOiBhIG1vbm9yZXBvIHJvb3QgdGhhdCBjb25maWd1cmVzXG4gIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbSBmb3IgaXRzIHdvcmtzcGFjZXMgaXMgbmV2ZXIgb24gbnBtIGl0c2VsZiwgYW5kIGEgcGFja2FnZSdzIGZpcnN0IHJlbGVhc2VcbiAgLy8gaGFzIG5vdCBoYXBwZW5lZCB5ZXQuIEJvdGggd291bGQgcmVuZGVyIGEgYnJva2VuIGJhZGdlLCBzbyB0aGUgcmVnaXN0cnkgZGVjaWRlcy5cbiAgcmV0dXJuIChhd2FpdCBpc01pc3NpbmdGcm9tTnBtUmVnaXN0cnkocGFja2FnZUpzb24ubmFtZSkpID8gdW5kZWZpbmVkIDogcGFja2FnZUpzb24ubmFtZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpc3RyeSBhbnN3ZXJzIHRoYXQgaXQgaGFzIG5vIHN1Y2ggcGFja2FnZSDigJQgdGhlIE9OTFkgYW5zd2VyIHRoYXQgcmVtb3ZlcyBhIGJhZGdlLlxuICogQSBjaGVjayB0aGF0IGNhbm5vdCBydW4gKG9mZmxpbmUsIGFuIG91dGFnZSwgYSB0aW1lb3V0KSBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHBhY2thZ2UsIGFuZFxuICogdHJlYXRpbmcgaXQgYXMgYWJzZW50IHdvdWxkIHN0cmlwIHRoZSBiYWRnZSBvdXQgb2YgZXZlcnkgcHVibGlzaGVkIHJlcG9zaXRvcnkgd2JmeSB0b3VjaGVzXG4gKiBkdXJpbmcgdGhlIG91dGFnZSBhbmQgcHV0IGl0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICAvLyBUaGUgc2NvcGUgc2VwYXJhdG9yIG11c3Qgc3Vydml2ZSBhcyBhIHBhdGggc2VnbWVudCwgc28gdGhlIG5hbWUgaXMgZW5jb2RlZCBwaWVjZXdpc2UuXG4gICAgY29uc3QgZW5jb2RlZE5hbWUgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLycpLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJy8nKTtcbiAgICAvLyBBIGJhZGdlIGlzIGRlY29yYXRpb246IGEgc3RhbGxlZCByZWdpc3RyeSBjb25uZWN0aW9uIG11c3Qgbm90IGhvbGQgdGhlIHdob2xlIHJ1biBmb3IgaG93ZXZlclxuICAgIC8vIGxvbmcgdGhlIG5ldHdvcmtpbmcgc3RhY2sgd291bGQgd2FpdC4gVGhlIGJ1ZGdldCBpcyBnZW5lcm91cyBiZWNhdXNlIGEgdGltZW91dCBhbnN3ZXJzXG4gICAgLy8gXCJ1bmtub3duXCIsIHdoaWNoIGtlZXBzIHRoZSBiYWRnZSDigJQgYW5kIG9uIGEgcmVwb3NpdG9yeSB0aGF0IGlzIG5vdCBvbiBucG0gdGhhdCBtZWFucyB3cml0aW5nXG4gICAgLy8gb25lIGl0IHNob3VsZCBub3QgaGF2ZTsgYSB3YmZ5IHJ1biBhbHJlYWR5IHNwZW5kcyBtaW51dGVzIG9uIGluc3RhbGxzLCBzbyB3YWl0aW5nIGEgbGl0dGxlXG4gICAgLy8gbG9uZ2VyIGZvciBhIHJlYWwgYW5zd2VyIGNvc3RzIGxlc3MgdGhhbiBhY3Rpbmcgb24gYSBtaXNzaW5nIG9uZS5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8ke2VuY29kZWROYW1lfWAsIHtcbiAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDEwXzAwMCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGROcG1CYWRnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBbIVtucG0gdmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vdi8ke3BhY2thZ2VOYW1lfS5zdmcpXSgke25wbVBhY2thZ2VVcmxQcmVmaXh9JHtwYWNrYWdlTmFtZX0pYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRXb3JrZmxvd0JhZGdlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICBpZiAoIXJlcG9zaXRvcnkgfHwgIWZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkpIHJldHVybiBbXTtcblxuICAvLyBXb3JrZmxvdyBhbmQgUkVBRE1FIGdlbmVyYXRpb24gcnVuIGNvbmN1cnJlbnRseS4gRG8gbm90IHJldGFpbiBhIHN0YWxlIFJ1c3QgYmFkZ2Ugd2hpbGUgdGhlXG4gIC8vIHdvcmtmbG93IGdlbmVyYXRvciByZW1vdmVzIGEgY2FsbGVyIGNyZWF0ZWQgZnJvbSBhIGZvcm1lcmx5IG1pc2RldGVjdGVkIGxvY2FsIGNhY2hlIOKAlCBidXRcbiAgLy8gbWlycm9yIGl0cyBvd25lcnNoaXAgY2hlY2s6IGEgY3VzdG9tIHNhbWUtbmFtZWQgd29ya2Zsb3cgc3Vydml2ZXMsIHNvIGl0cyBiYWRnZSBtdXN0IHRvby5cbiAgLy8gRGVjaWRlZCBzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUgbG9vcCdzIGZpcnN0IGF3YWl0OiB0aGUgZ2VuZXJhdG9yJ3MgZGVsZXRlIGNhbiBvbmx5IGxhbmQgYXRcbiAgLy8gYW4gYXdhaXQgcG9pbnQsIGFuZCBhIHBvc3QtZGVsZXRlIHJlYWQgd291bGQgbWlzcmVwb3J0IHRoZSB3YmZ5LW93bmVkIGNhbGxlciBhcyBjdXN0b20uXG4gIC8vIE5vIGV4aXN0c1N5bmMgcHJlLWNoZWNrOiB0aGUgaGVscGVyIGFscmVhZHkgdHJlYXRzIGEgbWlzc2luZyBmaWxlIGFzIG5vdCBvd25lZCwgYW5kIHRoaXMgcnVuc1xuICAvLyBvbmNlIHBlciByZXBvc2l0b3J5LCBzbyB0aGUgZXhjZXB0aW9uYWwgRU5PRU5UIHJlYWQgY29zdHMgbm90aGluZyB3b3J0aCBhIHJlZHVuZGFudCBzdGF0LlxuICBjb25zdCBkcm9wc1Rlc3RSdXN0QmFkZ2UgPVxuICAgIGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDAgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsICd0ZXN0LXJ1c3QueW1sJywgJ3Rlc3QtcnVzdCcpO1xuXG4gIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSkge1xuICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG4gICAgaWYgKGZpbGVOYW1lID09PSAndGVzdC1ydXN0LnltbCcgJiYgZHJvcHNUZXN0UnVzdEJhZGdlKSBjb250aW51ZTtcbiAgICAvLyBHaXRIdWIncyBiYWRnZSBlbmRwb2ludCByZXR1cm5zIDQwNCB1bnRpbCB0aGUgd29ya2Zsb3cgaGFzIGF0IGxlYXN0IG9uZSBydW4sIHNvIGEgYmFkZ2UgZm9yIGFcbiAgICAvLyBkaXNwYXRjaC1vbmx5IGRlcGxveSB3b3JrZmxvdyB0aGF0IGhhcyBuZXZlciBydW4gcmVuZGVycyBhcyBhIGJyb2tlbiBpbWFnZS4gVGVzdCB3b3JrZmxvd3MgcnVuXG4gICAgLy8gb24gZXZlcnkgUFIsIHNvIG9ubHkgZGVwbG95IGJhZGdlcyBuZWVkIHRoZSBndWFyZC5cbiAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgIShhd2FpdCBoYXNBbnlXb3JrZmxvd1J1bihyZXBvc2l0b3J5LCBmaWxlTmFtZSwgY29uZmlnLmlzUHVibGljUmVwbykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYmFkZ2VOYW1lID0gKGZpbGVOYW1lWzBdID8/ICcnKS50b1VwcGVyQ2FzZSgpICsgZmlsZU5hbWUuc2xpY2UoMSwgZmlsZU5hbWUuaW5kZXhPZignLicpKS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICBjb25zdCB3b3JrZmxvd1VybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2VuY29kZVVybFBhdGgoZmlsZU5hbWUpfWA7XG4gICAgYmFkZ2VzLnB1c2goYFshWyR7YmFkZ2VOYW1lfV0oJHt3b3JrZmxvd1VybH0vYmFkZ2Uuc3ZnKV0oJHt3b3JrZmxvd1VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJhZGdlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQW55V29ya2Zsb3dSdW4oXG4gIHJlcG9zaXRvcnk6IHN0cmluZyxcbiAgd29ya2Zsb3dGaWxlTmFtZTogc3RyaW5nLFxuICBpc1B1YmxpY1JlcG86IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gcmVwb3NpdG9yeS5zcGxpdCgnLycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQob3duZXIpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgd29ya2Zsb3dfaWQ6IHdvcmtmbG93RmlsZU5hbWUsXG4gICAgICBwZXJfcGFnZTogMSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS50b3RhbF9jb3VudCA+IDA7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRm9yIGEgUFVCTElDIHJlcG9zaXRvcnkgdGhlIHJ1bnMgZW5kcG9pbnQgbmVlZHMgbm8gYXV0aG9yaXphdGlvbiwgc28gNDA0IHJlbGlhYmx5IG1lYW5zIHRoZVxuICAgIC8vIHdvcmtmbG93IGlzIGFic2VudCBmcm9tIHRoZSByZW1vdGUgKGUuZy4gYWRkZWQgbG9jYWxseSwgbmV2ZXIgcHVzaGVkKSDigJQgbGlrZSB6ZXJvIHJ1bnMsIGl0c1xuICAgIC8vIGJhZGdlIHdvdWxkIHJlbmRlciBicm9rZW4uIEZvciBhIFBSSVZBVEUgcmVwb3NpdG9yeSBHaXRIdWIgYWxzbyBhbnN3ZXJzIDQwNCB3aGVuIHRoZSB0b2tlblxuICAgIC8vIGlzIG1pc3Npbmcgb3IgdW5kZXItc2NvcGVkLCBzbyA0MDQgaXMgYW1iaWd1b3VzIHRoZXJlIGFuZCB0aGUgYmFkZ2UgaXMga2VwdC5cbiAgICBpZiAoKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cyA9PT0gNDA0ICYmIGlzUHVibGljUmVwbykgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEtlZXAgdGhlIHByZS1ndWFyZCBiZWhhdmlvciAoaW5zZXJ0IHRoZSBiYWRnZSkgd2hlbiB0aGUgY2hlY2sgaXRzZWxmIGNhbm5vdCBydW4uXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgYmFkZ2UgYmxvY2sg4oCUIHRoZSBiYWRnZXMgd2JmeSBrZWVwcyBkaXJlY3RseSB1bmRlciB0aGUgdGl0bGUg4oCUIHdpdGggYG1hbmFnZWRCYWRnZXNgLFxuICoga2VlcGluZyBhbnkgYmFkZ2UgdGhlcmUgdGhhdCB3YmZ5IGRvZXMgbm90IG1hbmFnZSwgYW5kIHJlYXNzZW1ibGVzIHRoZSBSRUFETUUgYXJvdW5kIGl0IHdpdGhcbiAqIGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgb24gZWFjaCBzaWRlLlxuICpcbiAqIEJvdGggdGhlIHRpdGxlIGFuZCB0aGUgYmxvY2sgYXJlIGxvY2F0ZWQgaW4gYSBDb21tb25NYXJrIHN5bnRheCB0cmVlIHJhdGhlciB0aGFuIGJ5IHNjYW5uaW5nXG4gKiBsaW5lczogb25seSBhIHJlYWwgcGFyc2VyIGtub3dzIHdoZXRoZXIgYSBsaW5lIHRoYXQgbG9va3MgbGlrZSBhIGJhZGdlIGlzIGEgYmFkZ2UgKGEgcGFyYWdyYXBoIG9mXG4gKiBsaW5rZWQgaW1hZ2VzKSBvciBjb250ZW50IHRoYXQgbWVyZWx5IHJlYWRzIGxpa2Ugb25lIChhbiBpbmRlbnRlZCBjb2RlIGJsb2NrLCBhIGJsb2NrIHF1b3RlLCBhXG4gKiBmZW5jZWQgZXhhbXBsZSwgYSBtdWx0aWxpbmUgY29kZSBzcGFuLCBhbiBIVE1MIGJsb2NrKS4gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBibG9jayBpcyBjb3BpZWQgYmFja1xuICogdmVyYmF0aW0gZnJvbSB0aGUgb3JpZ2luYWwgdGV4dCB0aHJvdWdoIHRoZSBwYXJzZXIncyBwb3NpdGlvbmFsIG9mZnNldHMsIHNvIG5vIHJlZm9ybWF0dGluZyBvZiB0aGVcbiAqIHVzZXIncyBjb250ZW50IGlzIHBvc3NpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVCYWRnZUJsb2NrKHJlYWRtZTogc3RyaW5nLCBtYW5hZ2VkQmFkZ2VzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVFbmRpbmcgPSBnZXRMaW5lRW5kaW5nKHJlYWRtZSk7XG4gIC8vIEEgQk9NIGlzIG5vdCBNYXJrZG93bjogbGVmdCBpbiB0aGUgdGV4dCBpdCBoaWRlcyB0aGUgYCNgIG9mIHRoZSB0aXRsZSBmcm9tIHRoZSBwYXJzZXIsIGFuZFxuICAvLyBwcmVwZW5kaW5nIHRoZSBibG9jayBhaGVhZCBvZiBpdCB3b3VsZCBzdHJpcCB0aGUgbWFya2VyIGZyb20gdGhlIGZpbGUncyBmaXJzdCBieXRlLlxuICBjb25zdCBieXRlT3JkZXJNYXJrID0gcmVhZG1lLnN0YXJ0c1dpdGgoJ++7vycpID8gJ++7vycgOiAnJztcbiAgLy8gRnJvbnQgbWF0dGVyIGlzIGRlbGltaXRlZCBieSB0aGUgc2FtZSBgLS0tYCBhIFNldGV4dCBoZWFkaW5nIGFuZCBhIHRoZW1hdGljIGJyZWFrIHVzZSwgc28gaXQgaXNcbiAgLy8gZGV0YWNoZWQgYmVmb3JlIHBhcnNpbmcgaW5zdGVhZCBvZiBiZWluZyB0b2xkIGFwYXJ0IGFmdGVyd2FyZHM7IGl0IGFsc28gaGFzIHRvIHN0YXkgZmlyc3QgaW4gdGhlXG4gIC8vIGZpbGUsIHdoaWNoIG1ha2VzIGl0IGEgcHJlZml4IGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoZSBCT00gaXMuXG4gIGNvbnN0IHdpdGhvdXRNYXJrID0gcmVhZG1lLnNsaWNlKGJ5dGVPcmRlck1hcmsubGVuZ3RoKTtcbiAgY29uc3QgZnJvbnRNYXR0ZXIgPSB3aXRob3V0TWFyay5zdGFydHNXaXRoKCctLS0nKVxuICAgID8gKC9eLS0tWyBcXHRdKlxccj9cXG5bXFxzXFxTXSo/Xi0tLVsgXFx0XSooPzpcXHI/XFxufCQpL211LmV4ZWMod2l0aG91dE1hcmspPy5bMF0gPz8gJycpXG4gICAgOiAnJztcbiAgY29uc3QgcHJlZml4ID0gYCR7Ynl0ZU9yZGVyTWFya30ke2Zyb250TWF0dGVyfWA7XG4gIC8vIFRoZSBmaW5hbCBuZXdsaW5lIGlzIHNldCBhc2lkZSByYXRoZXIgdGhhbiBwYXJzZWQgYXMgdHJhaWxpbmcgYmxhbmsgc3BhY2UsIHdoaWNoIHRoZSBibGFuay1saW5lXG4gIC8vIHRyaW1taW5nIGJlbG93IHdvdWxkIG90aGVyd2lzZSBzd2FsbG93LlxuICBjb25zdCBlbmRzV2l0aE5ld2xpbmUgPSAvXFxyP1xcbiQvdS50ZXN0KHJlYWRtZSk7XG4gIGNvbnN0IGNvbnRlbnQgPSB3aXRob3V0TWFyay5zbGljZShmcm9udE1hdHRlci5sZW5ndGgpLnJlcGxhY2UoL1xccj9cXG4kL3UsICcnKTtcblxuICBjb25zdCBub2RlcyA9IGZyb21NYXJrZG93bihjb250ZW50KS5jaGlsZHJlbjtcbiAgLy8gQSBsZWFkaW5nIGJhZGdlIGJsb2NrIGlzIHRoZSB1c2VyJ3Mgb3duIGxheW91dDogaXQgc3RheXMgYWJvdmUgdGhlIHRpdGxlLCBhbmQgd2JmeSdzIGJsb2NrIGdvZXMgYmVsb3cuXG4gIGNvbnN0IGtlZXBzTGVhZGluZ0Jsb2NrID0gISFub2Rlc1swXSAmJiBpc0JhZGdlQmxvY2tOb2RlKG5vZGVzWzBdKSAmJiBpc1RpdGxlTm9kZShub2Rlc1sxXSk7XG4gIGNvbnN0IHRpdGxlSW5kZXggPSBrZWVwc0xlYWRpbmdCbG9jayA/IDEgOiBpc1RpdGxlTm9kZShub2Rlc1swXSkgPyAwIDogLTE7XG4gIC8vIFdpdGhvdXQgYSByZWNvZ25pemFibGUgdGl0bGUgdGhlIGJsb2NrIHNpdHMgYXQgdGhlIHZlcnkgdG9wLCBhYm92ZSBldmVyeXRoaW5nLlxuICBjb25zdCBoZWFkU3RhcnROb2RlID0ga2VlcHNMZWFkaW5nQmxvY2sgPyBub2Rlc1swXSEgOiBub2Rlc1t0aXRsZUluZGV4XTtcbiAgY29uc3QgaGVhZCA9XG4gICAgdGl0bGVJbmRleCA9PT0gLTFcbiAgICAgID8gJydcbiAgICAgIDogY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgaGVhZFN0YXJ0Tm9kZSEpLCBub2Rlc1t0aXRsZUluZGV4XSEucG9zaXRpb24hLmVuZC5vZmZzZXQpO1xuXG4gIGNvbnN0IGJsb2NrTm9kZSA9IG5vZGVzW3RpdGxlSW5kZXggKyAxXTtcbiAgY29uc3QgZXhpc3RpbmcgPSBibG9ja05vZGUgJiYgaXNCYWRnZUJsb2NrTm9kZShibG9ja05vZGUpID8gcmVhZEJhZGdlcyhibG9ja05vZGUsIGNvbnRlbnQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBib2R5Tm9kZSA9IGV4aXN0aW5nICYmIGJsb2NrTm9kZSA/IG5vZGVzW25vZGVzLmluZGV4T2YoYmxvY2tOb2RlKSArIDFdIDogYmxvY2tOb2RlO1xuICBjb25zdCBib2R5ID0gYm9keU5vZGUgPyBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50LCBib2R5Tm9kZSkpIDogJyc7XG5cbiAgLy8gU3VwZXJzZWRpbmcgYSBtYW5hZ2VkIGJhZGdlIGlzIGp1c3QgZHJvcHBpbmcgdGhlIG9sZCBvbmU6IGEgdmVyc2lvbiBvciB3b3JrZmxvdyBjaGFuZ2UgbGVhdmVzXG4gIC8vIG5vIHN0YWxlIGNvcHksIHdoaWxlIGFueSBvdGhlciBiYWRnZSBpbiB0aGUgYmxvY2sgKGluY2x1ZGluZyBhIG5vbi1jYW5vbmljYWwgd2JmeSBiYWRnZSwgd2hpY2hcbiAgLy8gaXMgcmVtb3ZlZCBtYW51YWxseSkgaXMga2VwdC5cbiAgY29uc3QgYmFkZ2VzID0gWy4uLm1hbmFnZWRCYWRnZXMsIC4uLihleGlzdGluZyA/PyBbXSkuZmlsdGVyKChiYWRnZSkgPT4gIWlzTWFuYWdlZEJhZGdlKGJhZGdlKSldO1xuICAvLyBDb250ZW50IGlzIHNsaWNlZCBmcm9tIGl0cyBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBzbyB3aGF0ZXZlciBibGFuayBzcGFjZSBmb2xsb3dlZCB0aGUgZnJvbnRcbiAgLy8gbWF0dGVyIGlzIGdvbmU7IGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgaXMgcmVzdG9yZWQgaGVyZS4gQSBjbG9zaW5nIGRlbGltaXRlciB0aGF0IGVuZGVkIGF0IEVPRlxuICAvLyBjYXJyaWVzIG5vIG5ld2xpbmUgb2YgaXRzIG93biBhbmQgbmVlZHMgYm90aCwgb3IgYC0tLWAgd291bGQgZnVzZSB3aXRoIHRoZSBmaXJzdCBiYWRnZSBhbmRcbiAgLy8gZGVzdHJveSB0aGVtIGJvdGguIEEgQk9NIG5lZWRzIG5vIHNlcGFyYXRvcjogaXQgaXMgYSBieXRlIG1hcmtlciwgbm90IGEgbGluZS5cbiAgY29uc3Qgc2VwYXJhdG9yID0gZnJvbnRNYXR0ZXIgPyAoL1xccj9cXG4kL3UudGVzdChmcm9udE1hdHRlcikgPyBsaW5lRW5kaW5nIDogYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCkgOiAnJztcbiAgY29uc3QgcmVzdWx0ID1cbiAgICBwcmVmaXggKyBzZXBhcmF0b3IgKyBbaGVhZCwgYmFkZ2VzLmpvaW4obGluZUVuZGluZyksIGJvZHldLmZpbHRlcihCb29sZWFuKS5qb2luKGAke2xpbmVFbmRpbmd9JHtsaW5lRW5kaW5nfWApO1xuICByZXR1cm4gZW5kc1dpdGhOZXdsaW5lID8gYCR7cmVzdWx0fSR7bGluZUVuZGluZ31gIDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgbm9kZSdzIHN0YXJ0IG9mZnNldCwgZXh0ZW5kZWQgYmFjayBvdmVyIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2Ugb24gaXRzIG93biBsaW5lLiBDb21tb25NYXJrXG4gKiBhbGxvd3Mgb25lIHRvIHRocmVlIHNwYWNlcyBvZiBpbmRlbnRhdGlvbiBiZWZvcmUgYSBibG9jaywgYW5kIG1kYXN0IHJlcG9ydHMgdGhlIG9mZnNldCBBRlRFUlxuICogdGhlbSDigJQgc28gc2xpY2luZyBmcm9tIGl0IHNpbGVudGx5IHJlaW5kZW50cyBjb250ZW50IHRoaXMgZ2VuZXJhdG9yIHByb21pc2VzIHRvIGNvcHkgdmVyYmF0aW0uXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50OiBzdHJpbmcsIG5vZGU6IFJvb3RDb250ZW50KTogbnVtYmVyIHtcbiAgY29uc3Qgc3RhcnQgPSBub2RlLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQhO1xuICBjb25zdCBsaW5lU3RhcnQgPSBjb250ZW50Lmxhc3RJbmRleE9mKCdcXG4nLCBzdGFydCAtIDEpICsgMTtcbiAgcmV0dXJuIC9eWyBcXHRdKiQvdS50ZXN0KGNvbnRlbnQuc2xpY2UobGluZVN0YXJ0LCBzdGFydCkpID8gbGluZVN0YXJ0IDogc3RhcnQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgbm9kZSBvcGVucyB0aGUgUkVBRE1FIHdpdGggYSB0aXRsZS4gT25seSB0aGUgRklSU1QgcGllY2Ugb2YgY29udGVudCBjYW4gYmUgb25lOiBhXG4gKiB0aXRsZSBpcyB3aGF0IGEgUkVBRE1FIG9wZW5zIHdpdGgsIGFuZCBhbmNob3JpbmcgdGhlIGJhZGdlcyB0byBhIGhlYWRpbmcgZnVydGhlciBkb3duIHdvdWxkIGJ1cnlcbiAqIHRoZW0gYmVsb3cgY29udGVudCB0aGUgYXV0aG9yIHB1dCBmaXJzdC5cbiAqL1xuZnVuY3Rpb24gaXNUaXRsZU5vZGUobm9kZTogUm9vdENvbnRlbnQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChub2RlLnR5cGUgPT09ICdoZWFkaW5nJykgcmV0dXJuIHRydWU7XG4gIC8vIE1hbnkgUkVBRE1FcyBjZW50ZXIgdGhlaXIgdGl0bGUgaW4gSFRNTCAoYDxoMT5gLCBvciBhIGA8ZGl2PmAvYDxwPmAgd3JhcHBpbmcgb25lKSwgd2hpY2ggdGhlXG4gIC8vIHBhcnNlciByZXBvcnRzIGFzIG9uZSBvcGFxdWUgSFRNTCBibG9jazsgdGhlIGJhZGdlcyBnbyBhZnRlciB0aGUgd2hvbGUgYmxvY2suXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdodG1sJyAmJiBjb250YWluc1JlbmRlcmVkSDEobm9kZS52YWx1ZSk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgSFRNTCBibG9jayB1bmFtYmlndW91c2x5IFJFTkRFUlMgYW4gYDxoMT5gIOKAlCB0aGUgY2VudGVyZWQtdGl0bGUgbGF5b3V0IG1hbnkgUkVBRE1Fc1xuICogdXNlIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgYSBnZW5lcmFsIEhUTUwgcGFyc2VyLiBEZWNpZGluZyB0aGlzIGV4YWN0bHkgcmVxdWlyZXMgdGhlIHJlYWwgdG9rZW5pemVyJ3NcbiAqIHN0YXRlcyDigJQgcmF3IHRleHQsIFJDREFUQSwgc2NyaXB0IGRhdGEsIGF0dHJpYnV0ZSB2YWx1ZXMsIHRlbXBsYXRlIGNvbnRlbnRzLCBkZWNsYXJhdGlvbnMg4oCUIGFuZFxuICogYXBwcm94aW1hdGluZyB0aGVtIHdpdGggcmVnZXhlcyBpcyB0aGUgc2FtZSBsb3NpbmcgZ2FtZSB0aGUgTWFya2Rvd24gc2Nhbm5pbmcgdGhpcyBtb2R1bGVcbiAqIHJlcGxhY2VkIHdhcyBwbGF5aW5nLiBTbyB0aGUgcnVsZSBpczogdG9rZW5pemUgb25seSB0aGUgc2ltcGxlIGNhc2UsIGFuZCB0cmVhdCBhbnl0aGluZyBjYXJyeWluZ1xuICogYSBjb25zdHJ1Y3Qgd2hvc2UgcGFyc2luZyBkZXBlbmRzIG9uIHRob3NlIHN0YXRlcyBhcyBOT1QgYSB0aXRsZS4gQmVpbmcgd3JvbmcgdGhhdCB3YXkgcHV0cyB0aGVcbiAqIGJhZGdlcyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCB3aGljaCBpcyBtZXJlbHkgdW5oZWxwZnVsOyBiZWluZyB3cm9uZyB0aGUgb3RoZXIgd2F5IHJld3JpdGVzIHRoZVxuICogdXNlcidzIFJFQURNRSBhcm91bmQgdGhlIHdyb25nIGFuY2hvci5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNSZW5kZXJlZEgxKGh0bWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBDb21tZW50cyBjYW5ub3QgbmVzdCBhbmQgZW5kIHVuYW1iaWd1b3VzbHksIHNvIHRoZXkgYXJlIHNpbXBseSByZW1vdmVkIHJhdGhlciB0aGFuIGRpc3F1YWxpZnlpbmcuXG4gIGNvbnN0IHdpdGhvdXRDb21tZW50cyA9IGh0bWwucmVwbGFjZUFsbCgvPCEtLVtcXHNcXFNdKj8oPzotLT58JCkvZ3UsICcnKTtcbiAgLy8gQ0RBVEEsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBkZWNsYXJhdGlvbnMsIGVsZW1lbnRzIHdob3NlIGNvbnRlbnQgaXMgcmF3IHRleHQgLyBSQ0RBVEEgL1xuICAvLyBzY3JpcHQgZGF0YSwgYW5kIGA8dGVtcGxhdGU+YCAod2hvc2UgY29udGVudHMgYXJlIGluZXJ0KS4gQSBxdW90ZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgYDxgXG4gIC8vIG1ha2VzIGV2ZW4gbG9jYXRpbmcgdGhlc2UgdW5yZWxpYWJsZSwgc28gaXQgZGlzcXVhbGlmaWVzIHRoZSBibG9jayB0b28uXG4gIGNvbnN0IGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4gPVxuICAgIC88IVxcW0NEQVRBXFxbfDxcXD98PCFbYS16QS1aXXw8XFwvPyg/OnNjcmlwdHxzdHlsZXx0ZXh0YXJlYXx0aXRsZXxpZnJhbWV8bm9mcmFtZXN8bm9lbWJlZHx4bXB8dGVtcGxhdGUpXFxifFwiW15cIl0qPFteXCJdKlwifCdbXiddKjxbXiddKicvaXU7XG4gIGlmIChhbWJpZ3VvdXNDb25zdHJ1Y3RQYXR0ZXJuLnRlc3Qod2l0aG91dENvbW1lbnRzKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBRdW90aW5nIGlzIHNpZ25pZmljYW50IG9ubHkgaW5zaWRlIGEgc3RhcnQgdGFnLCBzbyBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgY29uc3VtZWQgd2l0aCBpdHMgb3duXG4gIC8vIHRhZyB3aGlsZSBxdW90YXRpb24gbWFya3MgaW4gb3JkaW5hcnkgdGV4dCBzdGF5IHRleHQ6IGA8ZGl2IHRpdGxlPVwiJmx0O2gxJmd0O1wiPmAgZG9lcyBub3QgY291bnQsXG4gIC8vIGBcIjxoMT5Qcm9qZWN0PC9oMT5cImAgZG9lcy5cbiAgY29uc3Qgc3RhcnRUYWdQYXR0ZXJuID0gLzwoW2EtekEtWl1bXlxccy8+XSopKD86XCJbXlwiXSpcInwnW14nXSonfFtePlwiJ10pKj4vZ3U7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygd2l0aG91dENvbW1lbnRzLm1hdGNoQWxsKHN0YXJ0VGFnUGF0dGVybikpIHtcbiAgICBpZiAobWF0Y2hbMV0/LnRvTG93ZXJDYXNlKCkgPT09ICdoMScpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSBwYXJhZ3JhcGggb2YgYmFkZ2VzIGFuZCBub3RoaW5nIGVsc2Ug4oCUIHRoZSBvbmx5IGNvbnRlbnQgd2JmeSBwdXRzIGluIHRoZSBibG9jay4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VCbG9ja05vZGUobm9kZTogUm9vdENvbnRlbnQpOiBub2RlIGlzIFBhcmFncmFwaCB7XG4gIHJldHVybiAoXG4gICAgbm9kZS50eXBlID09PSAncGFyYWdyYXBoJyAmJlxuICAgIG5vZGUuY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSkgJiZcbiAgICBub2RlLmNoaWxkcmVuLmV2ZXJ5KFxuICAgICAgKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkgfHwgY2hpbGQudHlwZSA9PT0gJ2JyZWFrJyB8fCAoY2hpbGQudHlwZSA9PT0gJ3RleHQnICYmICFjaGlsZC52YWx1ZS50cmltKCkpXG4gICAgKVxuICApO1xufVxuXG4vKiogQSBiYWRnZSBpcyBvbmUgYFshW2FsdF0oaW1hZ2UpXShsaW5rKWAsIHRoZSBvbmx5IHNoYXBlIHdiZnkgZXZlciB3cml0ZXMuICovXG5mdW5jdGlvbiBpc0JhZGdlTm9kZShub2RlOiBSb290Q29udGVudCB8IFBocmFzaW5nQ29udGVudCk6IG5vZGUgaXMgTGluayAmIHsgY2hpbGRyZW46IFtJbWFnZV0gfSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdsaW5rJyAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBub2RlLmNoaWxkcmVuWzBdPy50eXBlID09PSAnaW1hZ2UnO1xufVxuXG4vKipcbiAqIFRoZSBiYWRnZXMgaW4gdGhlIGJsb2NrLCBhcyB0aGUgZXhhY3Qgc291cmNlIHRleHQgdGhhdCBwcm9kdWNlZCB0aGVtOiBhIGJhZGdlIHdiZnkgZG9lcyBub3QgbWFuYWdlXG4gKiBpcyB3cml0dGVuIGJhY2sgYnl0ZSBmb3IgYnl0ZSBpbnN0ZWFkIG9mIGJlaW5nIHJlLXNlcmlhbGl6ZWQgZnJvbSB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEJhZGdlcyhub2RlOiBQYXJhZ3JhcGgsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG5vZGUuY2hpbGRyZW5cbiAgICAuZmlsdGVyKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKVxuICAgIC5tYXAoKGNoaWxkKSA9PiBjb250ZW50LnNsaWNlKGNoaWxkLnBvc2l0aW9uIS5zdGFydC5vZmZzZXQsIGNoaWxkLnBvc2l0aW9uIS5lbmQub2Zmc2V0KSk7XG59XG5cbi8qKlxuICogUGVyY2VudC1lbmNvZGVzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgd291bGQgZW5kIGEgTWFya2Rvd24gZGVzdGluYXRpb24gZWFybHkuIEEgd29ya2Zsb3cgZmlsZSBtYXkgYmVcbiAqIG5hbWVkIGFueXRoaW5nIHdpdGggYSBgLnltbGAgZXh0ZW5zaW9uLCBhbmQgb25lIGNvbnRhaW5pbmcgYChgIG9yIGApYCBwcm9kdWNlZCBhIGJhZGdlIHRoYXQgd2JmeSdzXG4gKiBvd24gYmFkZ2UgcGF0dGVybiBjb3VsZCBub3QgcmVhZCBiYWNrIOKAlCBzbyB0aGUgbGluZSBsZWZ0IHRoZSBibG9jayBhbmQgdGhlIGJhZGdlIHdhcyBkdXBsaWNhdGVkLlxuICovXG5mdW5jdGlvbiBlbmNvZGVVcmxQYXRoKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWygpXFxzXS9ndSwgKGNoYXJhY3RlcikgPT4gYCUke2NoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKSEudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9YCk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiYWRnZSBpcyBvbmUgd2JmeSB3cml0ZXMgaXRzZWxmLCBhbmQgc28gbWF5IGJlIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNNYW5hZ2VkQmFkZ2UoYmFkZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYmFkZ2UgPT09IHNlbWFudGljUmVsZWFzZUJhZGdlIHx8IG1hbmFnZWRCYWRnZVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChiYWRnZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lRW5kaW5nKGNvbnRlbnQ6IHN0cmluZyk6ICdcXG4nIHwgJ1xcclxcbicge1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxyXFxuJykgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcblxuY29uc3Qgc2hhcmVkUHJlc2V0ID0gJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb25jJztcbmNvbnN0IGdlbmVyYXRlZFNldHRpbmdzID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFtzaGFyZWRQcmVzZXRdLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IFBhcnRpYWw8dHlwZW9mIGdlbmVyYXRlZFNldHRpbmdzPiAmIHtcbiAgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXTtcbn07XG5cbmNvbnN0IG1hbmFnZWRGaWxlTmFtZSA9ICdyZW5vdmF0ZS5qc29uYyc7XG5cbi8vIHdiZnkgc3VwcG9ydHMgb25lIGNhbm9uaWNhbCBSZW5vdmF0ZSBsb2NhdGlvbi4gTm9uLWNhbm9uaWNhbCBjb25maWdzIGFyZSBmaXhlZCBpbiB0aGUgdGFyZ2V0XG4vLyByZXBvc2l0b3J5IGluc3RlYWQgb2YgYmVpbmcgcGFyc2VkLCBtZXJnZWQsIG9yIGRlbGV0ZWQgaGVyZS5cbmNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzID0gW1xuICAncmVub3ZhdGUuanNvbicsXG4gICdyZW5vdmF0ZS5qc29uNScsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb24nLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uYycsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb241JyxcbiAgJy5yZW5vdmF0ZXJjJyxcbiAgJy5yZW5vdmF0ZXJjLmpzb24nLFxuICAnLnJlbm92YXRlcmMuanNvbjUnLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIG1hbmFnZWRGaWxlTmFtZSk7XG4gICAgY29uc3QgbWFuYWdlZEZpbGVTdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKG1hbmFnZWRGaWxlU3RhdHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGhzLm1hcChhc3luYyAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChjYW5kaWRhdGUpLmNhdGNoKCgpID0+IHt9KSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA9IG5vbkNhbm9uaWNhbENvbmZpZ0NhbmRpZGF0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCk7XG4gICAgaWYgKG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggfHwgY29uZmlnLnBhY2thZ2VKc29uPy5yZW5vdmF0ZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIHJlcG9zaXRvcnkgaGFzIGEgbm9uLWNhbm9uaWNhbCBSZW5vdmF0ZSBjb25maWcke1xuICAgICAgICAgIG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggPyBgIGF0ICR7bm9uQ2Fub25pY2FsQ29uZmlnUGF0aH1gIDogJyBpbiBwYWNrYWdlLmpzb24nXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFNldHRpbmdzPihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2xkU2V0dGluZ3M/LmV4dGVuZHMgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leHRlbmRzKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcImV4dGVuZHNcIiBpcyBub3QgYW4gYXJyYXkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZWRQcmVzZXQgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcz8uZmluZChcbiAgICAgIChwcmVzZXQpID0+IHByZXNldC5zdGFydHNXaXRoKCdnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczonKSAmJiBwcmVzZXQgIT09IHNoYXJlZFByZXNldFxuICAgICk7XG4gICAgaWYgKHJlbW92ZWRQcmVzZXQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgXCIke3JlbW92ZWRQcmVzZXR9XCIgbm8gbG9uZ2VyIGV4aXN0czsgcmVtb3ZlIGl0IG1hbnVhbGx5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gYnVpbGRTZXR0aW5ncyhjb25maWcsIG9sZFNldHRpbmdzKTtcbiAgICBjb25zdCB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9ID0ganNvbmNVdGlsLnN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgICBvbGRDb250ZW50LFxuICAgICAgbmV3U2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgbm9ybWFsaXplKGNvbnRlbnQpID09PSBub3JtYWxpemUob2xkQ29udGVudCkpIHJldHVybjtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybjtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNMb3NpbmdDb21tZW50cykge1xuICAgICAgY29uc29sZS53YXJuKGBDb21tZW50cyBpbnNpZGUgXCIke2tleX1cIiB3ZXJlIGRyb3BwZWQgd2hpbGUgcmV3cml0aW5nIGl0IGluICR7ZmlsZVBhdGh9LmApO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQpOiBTZXR0aW5ncyB7XG4gIGNvbnN0IHNldHRpbmdzID0gb2xkU2V0dGluZ3NcbiAgICA/IChtZXJnZS5hbGwoW2dlbmVyYXRlZFNldHRpbmdzLCBvbGRTZXR0aW5ncywgZ2VuZXJhdGVkU2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3MpXG4gICAgOiBzdHJ1Y3R1cmVkQ2xvbmUoZ2VuZXJhdGVkU2V0dGluZ3MpO1xuICBjb25zdCBleGlzdGluZ0V4dGVuZHMgPSBvbGRTZXR0aW5ncz8uZXh0ZW5kcyA/PyBbXTtcbiAgc2V0dGluZ3MuZXh0ZW5kcyA9IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlnc1xuICAgID8gZXhpc3RpbmdFeHRlbmRzLmZpbHRlcigocHJlc2V0KSA9PiBwcmVzZXQgIT09IHNoYXJlZFByZXNldClcbiAgICA6IGV4aXN0aW5nRXh0ZW5kcy5pbmNsdWRlcyhzaGFyZWRQcmVzZXQpXG4gICAgICA/IGV4aXN0aW5nRXh0ZW5kc1xuICAgICAgOiBbc2hhcmVkUHJlc2V0LCAuLi5leGlzdGluZ0V4dGVuZHNdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICByZXR1cm4gdHJpbW1lZENvbnRlbnQgPyB0cmltbWVkQ29udGVudCArICdcXG4nIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIC8vIGBhcHAvKipgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgZXZlbiB0aG91Z2ggdGhlIGRvZXNDb250YWluKlNjcmlwdCBzaWduYWxzIHNjYW4gaXQ6IGFwcFxuICAvLyBkaXJlY3RvcmllcyBiZWxvbmcgdG8gZnJhbWV3b3JrIHBhY2thZ2VzIChOZXh0LmpzL0JsaXR6KSwgd2hpY2ggb3duIHRoZWlyIHRzY29uZmlnXG4gIC8vIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pLCBhbmQgY2hlY2tpbmcgZnJhbWV3b3JrIHNvdXJjZXMgdW5kZXIgdGhpcyBwcm9qZWN0J3MgY29tcGlsZXJcbiAgLy8gb3B0aW9ucyB3b3VsZCBwcm9kdWNlIGZhbHNlIGVycm9ycy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29yayBhbmQgb3ducyBpdHMgdHNjb25maWcganVzdCBsaWtlIE5leHQvQmxpdHosXG4gICAgLy8gc28gaXQgbXVzdCBza2lwIHRoZSBzdGFuZGFyZCBnZW5lcmF0aW9uIHRoYXQgd291bGQgb3ZlcndyaXRlIHRoZSBmcmFtZXdvcmsncyBvd24gc2V0dGluZ3MuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBhd2FpdCBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IChjb25maWcuaXNSb290ID8gYnVpbGRSb290SnNvbk9iaihjb25maWcpIDogc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2V0Um9vdERpcihjb25maWcpO1xuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvcmlnaW5hbFNldHRpbmdzSnNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIEEgZmlsZSB3aXRoIG5vIGNvbmZpZ3VyYXRpb24gKGVtcHR5IG9yIGNvbW1lbnQtb25seSkgaXMgdHJlYXRlZCBsaWtlIGEgbWlzc2luZyBvbmUsIGFzIHRzYyBkb2VzLlxuICAgIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICAgICAgLy8gQW4gZXhpc3RpbmcgdHNjb25maWcuanNvbiB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkOiB3cml0aW5nIHRoZVxuICAgICAgLy8gZ2VuZXJhdGVkIHNldHRpbmdzIHdpdGhvdXQgbWVyZ2luZyB3b3VsZCBzaWxlbnRseSBkaXNjYXJkIHRoZSBwcm9qZWN0J3MgY29uZmlndXJhdGlvbi5cbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSkpO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgICAgcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhjb25maWcsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcuanNvbiBpcyBhIGxpbnQvdHlwZWNoZWNrIHByb2plY3QsIG5vdCB0aGUgZW1pdFxuICAgICAgLy8gY29udHJhY3QuIEl0IG11c3Qga2VlcCByb290RGlyIGJyb2FkIGVub3VnaCBmb3Igcm9vdCBjb25maWcgZmlsZXMsXG4gICAgICAvLyBzY3JpcHRzLCBzcmMsIGFuZCB0ZXN0cy4gYnVpbGQtdHMgb3ducyBlbWl0IGFuZCBjcmVhdGVzIGEgdGVtcG9yYXJ5XG4gICAgICAvLyBzcmMtb25seSB0c2NvbmZpZyB3aXRoIG5vRW1pdD1mYWxzZSwgZW1pdERlY2xhcmF0aW9uT25seT10cnVlLFxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiLCBhbmQgaW5jbHVkZT1bXCJzcmMvKiovKlwiXSwgc28gcHJlc2VydmluZyBub0VtaXQ9ZmFsc2Ugb3JcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiBoZXJlIHdvdWxkIG9ubHkgYnJlYWsgbm9uLXNyYyB0eXBlLWF3YXJlIGxpbnQgY292ZXJhZ2UuXG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgLi4uZXhpc3RpbmdFbWl0TWV0YWRhdGEgfTtcblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzLCBnZW5lcmF0ZWRUeXBlcyksIC4uLmdlbmVyYXRlZFR5cGVzXSldO1xuICAgICAgaWYgKG1lcmdlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzID0gbWVyZ2VkVHlwZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZERlbGV0ZVR5cGVSb290cyhnZW5lcmF0ZWRUeXBlcykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlUm9vdHM7XG4gICAgICB9XG4gICAgfVxuICAgIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcobmV3U2V0dGluZ3MsIGNvbmZpZyk7XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy52ZXJiYXRpbU1vZHVsZVN5bnRheDtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktdXAtdG8tZGF0ZSB0c2NvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChvcmlnaW5hbFNldHRpbmdzSnNvbiA9PT0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBtb25vcmVwby1yb290IHRzY29uZmlnLCB3aG9zZSBpbmNsdWRlL2V4Y2x1ZGUgY292ZXIgZXZlcnkgREVDTEFSRUQgd29ya3NwYWNlIGxheW91dCAoZS5nLlxuICogYGFwcHMvKmAgYWxvbmdzaWRlIGBwYWNrYWdlcy8qYCkgc28gdHlwZS1hd2FyZSBsaW50aW5nIHJ1biBmcm9tIHRoZSByb290IHNlZXMgYWxsIHdvcmtzcGFjZVxuICogc291cmNlcywgbm90IGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRSb290SnNvbk9iaihjb25maWc6IFBhY2thZ2VDb25maWcpOiBUc0NvbmZpZ0pzb24ge1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMoY29uZmlnKVxuICAgIDogeyBleGNsdWRlczogW10sIGluY2x1ZGVzOiBbXSB9O1xuICBjb25zdCBzZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gIHNldHRpbmdzLmV4Y2x1ZGUgPSBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvZml4dHVyZXNgKSxcbiAgICAgIC8vIE5lZ2F0aXZlIHdvcmtzcGFjZSBwYXR0ZXJucyAoZS5nLiBgIXBhY2thZ2VzL2V4Y2x1ZGVkYCkgb3B0IHdvcmtzcGFjZSBzdWJ0cmVlcyBvdXQgb2YgdGhlXG4gICAgICAvLyBtb25vcmVwbywgc28gdGhlaXIgc291cmNlcyBtdXN0IG5vdCBlbnRlciB0aGUgcm9vdCB0eXBlLWNoZWNrIHByb2plY3QgZWl0aGVyLiBBIG5lZ2F0aW9uXG4gICAgICAvLyB3aG9zZSBkaXJlY3RvcnkgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgeWllbGRzIHBhY2thZ2Utb3duZWQgc3VicGF0aCBlbnRyaWVzXG4gICAgICAvLyBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBzdWJ0cmVlIChzZWUgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMpLlxuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuZXhjbHVkZXMsXG4gICAgICAvLyBUaGUgbWFuYWdlZCBpbmNsdWRlcyBhYm92ZSBkZWxpYmVyYXRlbHkgb21pdCBmcmFtZXdvcmsgYGFwcC8qKmAgZGlyZWN0b3JpZXMgKHNlZVxuICAgICAgLy8gc3ViSnNvbk9iai5pbmNsdWRlJ3MgY29tbWVudCksIGJ1dCBhIHJlcG8tYXV0aG9yZWQgYnJvYWQgaW5jbHVkZSBzdWNoIGFzIGBlMmUvKipcXC8qYFxuICAgICAgLy8gY2FuIHN0aWxsIGRyYWcgYSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIHNvdXJjZXMgaW50byB0aGUgcm9vdCBwcm9qZWN0LCB3aGVyZSB0aGV5XG4gICAgICAvLyBmYWlsIHVuZGVyIHRoZSByb290IGNvbXBpbGVyIG9wdGlvbnMg4oCUIHRoZWlyIGJhcmUgYG5leHQvKmAgaW1wb3J0cyByZXNvbHZlIG9ubHkgdGhyb3VnaFxuICAgICAgLy8gdGhlIGZyYW1ld29yayB3b3Jrc3BhY2UncyBvd24gdHNjb25maWcgYHBhdGhzYC4gRXhjbHVkZSB0aG9zZSBhcHAgZGlyZWN0b3JpZXMgc28gdGhlXG4gICAgICAvLyByb290IHByb2plY3QgbmV2ZXIgdHlwZS1jaGVja3MgdGhlbSwgbm8gbWF0dGVyIGhvdyBicm9hZCB0aGUgcmVwbydzIGluY2x1ZGUgZ2xvYnMgYXJlLlxuICAgICAgLi4uZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnKSxcbiAgICAgIC4uLihzZXR0aW5ncy5leGNsdWRlID8/IFtdKSxcbiAgICBdKSxcbiAgXS50b1NvcnRlZCgpO1xuICBzZXR0aW5ncy5pbmNsdWRlID0gW1xuICAgIC4uLihzZXR0aW5ncy5pbmNsdWRlID8/IFtdKSxcbiAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5pbmNsdWRlcy5mbGF0TWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBbXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS8qLmNvbmZpZy50c2AsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zY3JpcHRzLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc3JjLyoqLypgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC8qKi8qYCxcbiAgICBdKSxcbiAgXTtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG4vLyBGcmFtZXdvcmsgcGFja2FnZXMgb3duIHRoZWlyIHRzY29uZmlnIChnZW5lcmF0ZVRzY29uZmlnIHNraXBzIHRoZW0pIGFuZCBzaGltIGJhcmUgaW1wb3J0cyBzdWNoIGFzXG4vLyBgbmV4dC9uYXZpZ2F0aW9uYCB0aHJvdWdoIHBhY2thZ2UtbG9jYWwgYHBhdGhzYDsgdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrXG4vLyBhbmQgYmVoYXZlcyB0aGUgc2FtZS4gVGhlaXIgYXBwIHNvdXJjZXMgdGhlcmVmb3JlIG9ubHkgdHlwZS1jaGVjayB1bmRlciB0aGVpciBvd24gY29uZmlnLlxuY29uc3QgZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzID0gWydibGl0eicsICduZXh0JywgJ3ZpbmV4dCddO1xuXG4vLyBBIGZyYW1ld29yayBhcHAgbGl2ZXMgaW4gYGFwcC9gIG9yLCB1bmRlciB0aGUgc3JjLWRpcmVjdG9yeSBsYXlvdXQsIGBzcmMvYXBwL2AuIFRoZSByb290IHByb2plY3Rcbi8vIGluY2x1ZGVzIGA8d29ya3NwYWNlPi9zcmMvKiovKmAsIHNvIGBzcmMvYXBwYCBsZWFrcyBpbiBqdXN0IGFzIGEgcmVwby13aWRlIGdsb2IgY2FuIHB1bGwgaW4gYGFwcGAuXG5jb25zdCBmcmFtZXdvcmtBcHBEaXJOYW1lcyA9IFsnYXBwJywgJ3NyYy9hcHAnXTtcblxuLyoqIFJvb3QgYGV4Y2x1ZGVgIGVudHJpZXMgKHBvc2l4LCByZWxhdGl2ZSB0byB0aGUgcm9vdCkgZm9yIGV2ZXJ5IGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0RnJhbWV3b3JrV29ya3NwYWNlQXBwRXhjbHVkZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykgcmV0dXJuIFtdO1xuICBjb25zdCBleGNsdWRlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VEaXJQYXRoIG9mIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykpIHtcbiAgICBpZiAoIWRlcGVuZHNPbkZyYW1ld29yayhwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBhcHBEaXJOYW1lIG9mIGZyYW1ld29ya0FwcERpck5hbWVzKSB7XG4gICAgICBjb25zdCBhcHBEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsIGFwcERpck5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYXBwRGlyUGF0aCkpIGV4Y2x1ZGVzLnB1c2gocGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgYXBwRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXhjbHVkZXM7XG59XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbkZyYW1ld29yayhtYW5pZmVzdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgbWFuaWZlc3Q6IFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24gfCBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQSBtYW5pZmVzdCB0aGF0IHBhcnNlcyB0byBhIG5vbi1vYmplY3QgKGUuZy4gYSBmaWxlIGxpdGVyYWxseSBjb250YWluaW5nIGBudWxsYCkgZGVjbGFyZXMgbm9cbiAgLy8gZGVwZW5kZW5jaWVzOyBndWFyZCB0aGUgcHJvcGVydHkgYWNjZXNzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb3V0c2lkZSB0aGUgdHJ5IGFib3ZlLlxuICBpZiAoIW1hbmlmZXN0IHx8IHR5cGVvZiBtYW5pZmVzdCAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0geyAuLi5tYW5pZmVzdC5kZXBlbmRlbmNpZXMsIC4uLm1hbmlmZXN0LmRldkRlcGVuZGVuY2llcyB9O1xuICByZXR1cm4gZnJhbWV3b3JrRGVwZW5kZW5jeU5hbWVzLnNvbWUoKGRlcGVuZGVuY3lOYW1lKSA9PiBkZXBlbmRlbmNpZXNbZGVwZW5kZW5jeU5hbWVdKTtcbn1cblxuY29uc3QgbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcyA9IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddO1xuXG4vKipcbiAqIFJvb3QgaW5jbHVkZS9leGNsdWRlIGVudHJpZXMgd2JmeSBnZW5lcmF0ZWQgZm9yIGFuIGVhcmxpZXIgd29ya3NwYWNlIGxheW91dCAoZS5nLiBgcGFja2FnZXMvKmBcbiAqIGdsb2JzIGluIGEgcmVwbyB0aGF0IG5vdyBkZWNsYXJlcyBvbmx5IGBhcHBzLypgKSBtdXN0IG5vdCBzdXJ2aXZlIHRoZSBtZXJnZSB3aXRoIHRoZSBleGlzdGluZ1xuICogdHNjb25maWcsIG9yIHRoZSBvYnNvbGV0ZSBkaXJlY3RvcmllcyB3b3VsZCBrZWVwIGVudGVyaW5nIHJvb3QgdHlwZSBjaGVja2luZyBmb3JldmVyLiBBIHByZWZpeFxuICogY291bnRzIGFzIHdiZnktbWFuYWdlZCBvbmx5IHdoZW4gdGhlIENPTVBMRVRFIGdlbmVyYXRlZCBpbmNsdWRlIHNldCBmb3IgaXQgaXMgcHJlc2VudCBhbmQgbm9cbiAqIGxvbmdlciBnZW5lcmF0ZWQg4oCUIGEgdXNlci1hdXRob3JlZCBlbnRyeSBzdWNoIGFzIGEgbG9uZSBgdG9vbHMvKlxcL3NyYy8qKlxcLypgIG5ldmVyIHF1YWxpZmllcy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU3RhbGVNYW5hZ2VkV29ya3NwYWNlRW50cmllcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBvbGRTZXR0aW5nczogVHNDb25maWdKc29uLFxuICBuZXdTZXR0aW5nczogVHNDb25maWdKc29uXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhbGVQcmVmaXhlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5pbmNsdWRlKSkge1xuICAgIGNvbnN0IG9sZEluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBzdHJpbmcgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgZ2VuZXJhdGVkSW5jbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuaW5jbHVkZSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBvbGRJbmNsdWRlKSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KTtcbiAgICAgIGlmICh3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCBzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGlzQ29tcGxldGUgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmV2ZXJ5KChzdWZmaXgpID0+XG4gICAgICAgIG9sZEluY2x1ZGUuaW5jbHVkZXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzU3RpbGxHZW5lcmF0ZWQgPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLnNvbWUoKHN1ZmZpeCkgPT5cbiAgICAgICAgZ2VuZXJhdGVkSW5jbHVkZS5oYXMoYCR7d29ya3NwYWNlUHJlZml4fS8ke3N1ZmZpeH1gKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0NvbXBsZXRlICYmICFpc1N0aWxsR2VuZXJhdGVkKSBzdGFsZVByZWZpeGVzLmFkZCh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgIH1cbiAgICBpZiAoc3RhbGVQcmVmaXhlcy5zaXplID4gMCkge1xuICAgICAgb2xkU2V0dGluZ3MuaW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09IHVuZGVmaW5lZCB8fCAhc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuZXhjbHVkZSkpIHJldHVybjtcbiAgY29uc3QgZ2VuZXJhdGVkRXhjbHVkZSA9IG5ldyBTZXQobmV3U2V0dGluZ3MuZXhjbHVkZSk7XG4gIGNvbnN0IHdvcmtzcGFjZURpclBhdGhzID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpLm1hcCgod29ya3NwYWNlRGlyUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpLCB3b3Jrc3BhY2VEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKVxuICAgICAgKVxuICAgIDogW107XG4gIG9sZFNldHRpbmdzLmV4Y2x1ZGUgPSBvbGRTZXR0aW5ncy5leGNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ICE9PSAnc3RyaW5nJyB8fCBnZW5lcmF0ZWRFeGNsdWRlLmhhcyhlbnRyeSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChlbnRyeS5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSkge1xuICAgICAgcmV0dXJuICFzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtJy90ZXN0L2ZpeHR1cmVzJy5sZW5ndGgpKTtcbiAgICB9XG4gICAgLy8gQSBmcmFtZXdvcmsgYXBwIGV4Y2x1ZGUgKGA8d29ya3NwYWNlPi9hcHBgLCBgPHdvcmtzcGFjZT4vc3JjL2FwcGApIGZvciBhIHN0aWxsLWRlY2xhcmVkXG4gICAgLy8gd29ya3NwYWNlIGlzIHBydW5lZCBieSBjb3ZlcnNXb3Jrc3BhY2VEaXIgYmVsb3cgd2hlbiBubyBsb25nZXIgZ2VuZXJhdGVkOyB0aGlzIGNhdGNoZXMgdGhlXG4gICAgLy8gcmVtYWluaW5nIGNhc2UsIHdoZXJlIHRoZSB3b3Jrc3BhY2UgaXRzZWxmIHdhcyByZW1vdmVkIGFuZCBpdHMgcHJlZml4IGlzIHRoZXJlZm9yZSBzdGFsZS5cbiAgICAvLyAoQSB3cm9uZyBzdWZmaXggc3RyaXAgeWllbGRzIGEgcHJlZml4IGFic2VudCBmcm9tIHN0YWxlUHJlZml4ZXMsIHNvIHRlc3RpbmcgZXZlcnkgbmFtZSBpcyBzYWZlLilcbiAgICBpZiAoXG4gICAgICBmcmFtZXdvcmtBcHBEaXJOYW1lcy5zb21lKFxuICAgICAgICAoYXBwRGlyTmFtZSkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke2FwcERpck5hbWV9YCkgJiYgc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLShhcHBEaXJOYW1lLmxlbmd0aCArIDEpKSlcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnksIHdvcmtzcGFjZURpclBhdGhzKTtcbiAgfSk7XG59XG5cbi8vIFdoZXRoZXIgYW4gZXhjbHVkZSBlbnRyeSBpcyBhIHdvcmtzcGFjZSBuZWdhdGlvbiAoYCFhcHBzL2V4Y2x1ZGVkYCkgd2hvc2UgbmVnYXRpb24gaXMgZ29uZTogdGhlXG4vLyBkaXJlY3RvcnkgaXMgYSB3b3Jrc3BhY2UgYWdhaW4gYW5kIG11c3QgcmUtZW50ZXIgdGhlIHJvb3QgcHJvamVjdC4gd2JmeSB3cml0ZXMgc3VjaCBhIG5lZ2F0aW9uIGFzXG4vLyBhIGRpcmVjdG9yeSBwYXRoLCBhcyBhIGRpcmVjdG9yeSBQQVRURVJOIHdoZW4gaXQgZXhjbHVkZXMgZXhhY3RseSB3aGF0IGl0IG1hdGNoZXMgKGBhcHBzLypiYCksIG9yXG4vLyBhcyBhbiBhbmNlc3RvcidzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgKGBhcHBzL3gvc3JjYCkg4oCUIHNvIHRoZSBlbnRyeSBtYXkgY292ZXIgYSBkaXNjb3ZlcmVkXG4vLyB3b3Jrc3BhY2UgZGlyZWN0b3J5IG9yIHNpdCB1bmRlciBvbmUuIEEgZ2xvYnN0YXIgc2VnbWVudCBtYXJrcyBhIGh5Z2llbmUgZ2xvYiAobm9kZV9tb2R1bGVzLCBlMmVcbi8vIGFuZCBmcmllbmRzKSwgd2hpY2ggaXMgbmV2ZXIgbmVnYXRpb24tZGVyaXZlZCBhbmQgbXVzdCBzdXJ2aXZlLlxuZnVuY3Rpb24gY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5OiBzdHJpbmcsIHdvcmtzcGFjZURpclBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBpZiAoZW50cnkuc3BsaXQoJy8nKS5pbmNsdWRlcygnKionKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWdleFNvdXJjZSA9IGVudHJ5XG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudFxuICAgICAgICAucmVwbGFjZUFsbCgvWy4rXiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJyonLCAnW14vXSonKVxuICAgICAgICAucmVwbGFjZUFsbCgnPycsICdbXi9dJylcbiAgICApXG4gICAgLmpvaW4oJy8nKTtcbiAgY29uc3QgZW50cnlQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7cmVnZXhTb3VyY2V9KD86Ly4qKT8kYCwgJ3UnKTtcbiAgcmV0dXJuIHdvcmtzcGFjZURpclBhdGhzLnNvbWUoXG4gICAgKHdvcmtzcGFjZURpclBhdGgpID0+IGVudHJ5UGF0dGVybi50ZXN0KHdvcmtzcGFjZURpclBhdGgpIHx8IGVudHJ5LnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYClcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2hlZFN1ZmZpeCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZmluZCgoc3VmZml4KSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7c3VmZml4fWApKTtcbiAgaWYgKCFtYXRjaGVkU3VmZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB3b3Jrc3BhY2VQcmVmaXggPSBlbnRyeS5zbGljZSgwLCAtKG1hdGNoZWRTdWZmaXgubGVuZ3RoICsgMSkpO1xuICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSAnJyA/IHVuZGVmaW5lZCA6IHdvcmtzcGFjZVByZWZpeDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gIC8vIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZ3MgdGhhdCBvbGRlciBwcm9qZWN0cyBjb21tb25seSBpbmhlcml0ZWQuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHJldHVybjtcbiAgY29uc3Qgc2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgaWYgKCFzZXR0aW5ncykge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBjbGVhbmluZyB1cCAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzKTtcbiAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5ncywgY29uZmlnKTtcbiAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAvLyBhbHJlYWR5LWNsZWFuIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSkpO1xufVxuXG4vKipcbiAqIGJ1bi10eXBlcyByZWZlcmVuY2VzIHVuZGljaS10eXBlcyB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KSwgc29cbiAqIEJ1bidzIGlzb2xhdGVkIGxpbmtlciAoZXNwZWNpYWxseSB3aXRoIHRoZSBnbG9iYWwgc3RvcmUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSkgY2Fubm90IHJlc29sdmVcbiAqIGl0IGZyb20gYnVuLXR5cGVzJyBsb2NhdGlvbiwgd2hpY2ggc2lsZW50bHkgZGVncmFkZXMgZ2xvYmFsIGZldGNoIHR5cGVzIHN1Y2ggYXMgUmVzcG9uc2UuIE1hcCBpdFxuICogdG8gdGhlIGNvcHkgdGhhdCBidW5maWcudG9tbCdzIHB1YmxpY0hvaXN0UGF0dGVybiBwbGFjZXMgaW4gdGhlIHJvb3Qgbm9kZV9tb2R1bGVzLlxuICovXG5mdW5jdGlvbiBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBNYXAgdW5kaWNpLXR5cGVzIG9ubHkgd2hlbiBidW4tdHlwZXMgYWN0dWFsbHkgbG9hZHM6IGFuIGV4cGxpY2l0IGB0eXBlc2AgbGlzdCBsb2FkcyBpdCBpZmYgaXRcbiAgLy8gY29udGFpbnMgXCJidW5cIiAoZXZlbiBvbiBSZWFjdCBOYXRpdmUsIHdob3NlIHByb2plY3RzIG1heSBvcHQgaW4gYnkgaGFuZCk7IHdpdGggYHR5cGVzYFxuICAvLyBvbWl0dGVkLCBUeXBlU2NyaXB0J3MgYXV0b21hdGljIEB0eXBlcyBpbmNsdXNpb24gbG9hZHMgaXQgYmVjYXVzZSB3YmZ5IGluc3RhbGxzIEB0eXBlcy9idW5cbiAgLy8gZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcHJvamVjdCBleGNlcHQgUmVhY3QgTmF0aXZlLCB3aGljaCB1c2VzIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUgaW5zdGVhZC5cbiAgY29uc3QgdHlwZXMgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzO1xuICBpZiAodHlwZXMgPyAhdHlwZXMuaW5jbHVkZXMoJ2J1bicpIDogY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkgcmV0dXJuO1xuICBjb25zdCBjb3JyZWN0TWFwcGluZyA9IGAke2dldFJvb3REaXIoY29uZmlnKX0vbm9kZV9tb2R1bGVzL3VuZGljaS10eXBlcy9pbmRleC5kLnRzYDtcbiAgY29uc3QgZXhpc3RpbmdNYXBwaW5nID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5wYXRocz8uWyd1bmRpY2ktdHlwZXMnXTtcbiAgaWYgKGV4aXN0aW5nTWFwcGluZykge1xuICAgIC8vIFJld3JpdGUgdGhlIGdlbmVyYXRlZCBtYXBwaW5nIHdoZW4gYSB3b3Jrc3BhY2UgbW92ZXMgdG8gYSBkaWZmZXJlbnQgcm9vdCBkZXB0aC4gQW55IG90aGVyXG4gICAgLy8gdmFsdWUgaXMgYSBkZWxpYmVyYXRlIHJlcG8tbG9jYWwgbWFwcGluZyAoZS5nLiBwYXRjaGVkIHR5cGVzKSBhbmQgbXVzdCBiZSBrZXB0LlxuICAgIGlmIChcbiAgICAgIGV4aXN0aW5nTWFwcGluZy5sZW5ndGggPT09IDEgJiZcbiAgICAgIHR5cGVvZiBleGlzdGluZ01hcHBpbmdbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICAvKD86XnxcXC8pbm9kZV9tb2R1bGVzXFwvdW5kaWNpLXR5cGVzXFwvaW5kZXhcXC5kXFwudHMkL3UudGVzdChleGlzdGluZ01hcHBpbmdbMF0pXG4gICAgKSB7XG4gICAgICBzZXR0aW5ncy5jb21waWxlck9wdGlvbnMhLnBhdGhzIVsndW5kaWNpLXR5cGVzJ10gPSBbY29ycmVjdE1hcHBpbmddO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBzZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICBzZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMgPSB7XG4gICAgLi4uc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnBhdGhzLFxuICAgICd1bmRpY2ktdHlwZXMnOiBbY29ycmVjdE1hcHBpbmddLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICAvLyBPbWl0dGluZyBpbmNsdWRlIGxldHMgZnJhbWV3b3JrIHRzY29uZmlncyBrZWVwIFR5cGVTY3JpcHQncyBkZWZhdWx0XG4gIC8vIFwiYWxsIFRTL1RTWCBmaWxlc1wiIGJlaGF2aW9yLCB3aGljaCBhbHJlYWR5IGNvdmVycyBzY3JpcHRzLlxuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUpIHJldHVybjtcbiAgaWYgKHNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoJ3NjcmlwdHMvKiovKicpKSByZXR1cm47XG5cbiAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKCdzY3JpcHRzLyoqLyonKTtcbiAgc2V0dGluZ3MuaW5jbHVkZS5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBjb25zdCBtb2R1bGVSZXNvbHV0aW9uID0gbG93ZXJDYXNlU2V0dGluZyhjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbik7XG4gIGlmIChtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHwgbW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCcgfHwgbW9kdWxlUmVzb2x1dGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNldHRpbmdzLmV4dGVuZHMpIHtcbiAgICAgIC8vIEFuIGV4dGVuZGVkIGNvbmZpZyBtYXkgYWxyZWFkeSBzdXBwbHkgYSB2YWxpZCBtb2R1bGUvcmVzb2x2ZXIgcGFpciwgc28gb25seVxuICAgICAgLy8gcmVtb3ZlIHRoZSByZW1vdmVkLWluLVRTNiBub2RlMTAgc3BlbGxpbmdzIGluc3RlYWQgb2YgZm9yY2luZyBidW5kbGVyIG9uIGl0LlxuICAgICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZXh0LmpzIHdyaXRlcyBcIm5vZGVcIiBkdXJpbmcgYnVpbGQgd2hlbiB0aGlzIG9wdGlvbiBpcyBtaXNzaW5nLCBidXRcbiAgICAgIC8vIHRzZ29saW50IHRyZWF0cyB0aGF0IHNwZWxsaW5nIGFzIHRoZSByZW1vdmVkIG5vZGUxMCByZXNvbHZlci5cbiAgICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gJ2J1bmRsZXInO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyB0c2dvbGludCBmb2xsb3dzIFR5cGVTY3JpcHQgNiB2YWxpZGF0aW9uLCB3aGVyZSBiYXNlVXJsIGlzIHJlbW92ZWQgYW5kXG4gIC8vIHBhdGggdGFyZ2V0cyBtdXN0IGJlIGV4cGxpY2l0bHkgcmVsYXRpdmUuIE5leHQuanMgc3RpbGwgYWNjZXB0cyB0aGUgYWxpYXNcbiAgLy8gc2hhcGUgYWZ0ZXIgZWFjaCB0YXJnZXQgaXMgd3JpdHRlbiB3aXRoIGEgbGVhZGluZyAuLy5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5iYXNlVXJsO1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucy5wYXRocykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlck9wdGlvbnMucGF0aHMpKSB7XG4gICAgY29tcGlsZXJPcHRpb25zLnBhdGhzW2FsaWFzXSA9IG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHRhcmdldHMubWFwKCh0YXJnZXQpID0+IHtcbiAgICBpZiAodGFyZ2V0LnN0YXJ0c1dpdGgoJy4vJykgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoJy4uLycpIHx8IHBhdGguaXNBYnNvbHV0ZSh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0O1xuICAgIHJldHVybiBgLi8ke3RhcmdldH1gO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgLy8gVGhlIHVuZGljaS10eXBlcyBwYXRoIG1hcHBpbmcgbXVzdCByZWFjaCB0aGUgbW9ub3JlcG8gcm9vdCdzIG5vZGVfbW9kdWxlcyAoYnVuZmlnLnRvbWwnc1xuICAvLyBwdWJsaWNIb2lzdFBhdHRlcm4gaG9pc3RzIHRoZSBwYWNrYWdlIHRoZXJlKSwgYW5kIHdvcmtzcGFjZSBwYXR0ZXJucyBtYXkgYmUgYXJiaXRyYXJpbHkgZGVlcFxuICAvLyAoZS5nLiBgZXhhbXBsZXMvKipgKSwgc28gYSBmaXhlZCB0d28tbGV2ZWwgcHJvYmUgaXMgbm90IGVub3VnaC4gUHJlZmVyIHRoZSBuZWFyZXN0IGFuY2VzdG9yXG4gIC8vIG1hbmlmZXN0IHRoYXQgZGVjbGFyZXMgd29ya3NwYWNlcyAodGhlIG1vbm9yZXBvIHJvb3QpOyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBuZWFyZXN0XG4gIC8vIGFuY2VzdG9yIG1hbmlmZXN0LiBTdG9wIGF0IHRoZSBmaXJzdCBnaXQgcmVwb3NpdG9yeSBib3VuZGFyeSBzbyBhbiB1bnJlbGF0ZWQgZW5jbG9zaW5nXG4gIC8vIHJlcG9zaXRvcnkncyBtYW5pZmVzdCBjYW4gbmV2ZXIgYmUgY2hvc2VuLlxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKTtcbiAgbGV0IHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGFuY2VzdG9yRGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTsgOyBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKSkge1xuICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHBhdGgucmVzb2x2ZShhbmNlc3RvckRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgICByb290RGlyUGF0aCA/Pz0gYW5jZXN0b3JEaXJQYXRoO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgICAvLyBCdW4gbm8tb3AgcGF0dGVybnMgKGUuZy4gYHdvcmtzcGFjZXM6IFtcIlwiXWApIGRvIG5vdCBtYWtlIGEgbWFuaWZlc3QgYSB3b3Jrc3BhY2Ugcm9vdC5cbiAgICAgICAgaWYgKGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKG1hbmlmZXN0LndvcmtzcGFjZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByb290RGlyUGF0aCA9IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEFuIHVucGFyc2FibGUgbWFuaWZlc3Qgc3RpbGwgbWFya3MgYSBwcm9qZWN0IGRpcmVjdG9yeTsga2VlcCBjbGltYmluZyBmb3IgYSB3b3Jrc3BhY2Ugcm9vdC5cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXNSZXBvQm91bmRhcnkgPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShhbmNlc3RvckRpclBhdGgsICcuZ2l0JykpO1xuICAgIGNvbnN0IGlzRmlsZXN5c3RlbVJvb3QgPSBhbmNlc3RvckRpclBhdGggPT09IHBhdGguZGlybmFtZShhbmNlc3RvckRpclBhdGgpO1xuICAgIGlmIChpc1JlcG9Cb3VuZGFyeSB8fCBpc0ZpbGVzeXN0ZW1Sb290KSBicmVhaztcbiAgfVxuICBpZiAoIXJvb3REaXJQYXRoKSByZXR1cm4gJy4nO1xuICByZXR1cm4gcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCByb290RGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykgfHwgJy4nO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBhZGRJbmNsdWRlUGF0aChzZXR0aW5nczogVHNDb25maWdKc29uLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0dGluZ3MuaW5jbHVkZSA/Pz0gW107XG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcyhkaXJQYXRoKSkge1xuICAgIHNldHRpbmdzLmluY2x1ZGUucHVzaChkaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlczogc3RyaW5nW10sIGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2VuZXJhdGVkVHlwZVNldCA9IG5ldyBTZXQoZ2VuZXJhdGVkVHlwZXMpO1xuICByZXR1cm4gZXhpc3RpbmdUeXBlcy5maWx0ZXIoKHR5cGVOYW1lKSA9PiB7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIHBhY2thZ2UtcHJvdmlkZWQgdGVzdCBnbG9iYWxzLiBEcm9wIHN0YWxlIGVudHJpZXMgd2hlbiB0aGVcbiAgICAvLyBjb3JyZXNwb25kaW5nIGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIHByZXNlbnQgc28gVHlwZVNjcmlwdCB3b24ndCByZXF1aXJlXG4gICAgLy8gbWlzc2luZyBwYWNrYWdlcyBzdWNoIGFzIHZpdGVzdC5cbiAgICBpZiAoaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZSkgJiYgIWdlbmVyYXRlZFR5cGVTZXQuaGFzKHR5cGVOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lID09PSAnamVzdCcgfHwgdHlwZU5hbWUgPT09ICdtb2NoYScgfHwgdHlwZU5hbWUgPT09ICd2aXRlc3QvZ2xvYmFscyc7XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZVNldHRpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgLy8gUmVhY3QgTmF0aXZlIGdldHMgaXRzIGFtYmllbnQgdHlwZXMgZnJvbSBAdHNjb25maWcvcmVhY3QtbmF0aXZlIChyZWFjdC1uYXRpdmUsIGplc3QpLlxuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbmA7XG5cbmNvbnN0IGNsYXVkZVNldHRpbmdzRmlsZVBhdGggPSAnLmNsYXVkZS9zZXR0aW5ncy5qc29uJztcblxuLyoqXG4gKiBDbGF1ZGUgQ29kZSBpbmplY3RzIGl0cyBvd24gYXR0cmlidXRpb24gZGlyZWN0aXZlIChhIGBDby1BdXRob3JlZC1CeWAgdHJhaWxlciwgYSBcIkdlbmVyYXRlZCB3aXRoXCJcbiAqIGZvb3RlciwgYW5kIGEgc2Vzc2lvbiBsaW5rKSBpbnRvIHRoZSB0b29sIGRlc2NyaXB0aW9ucyBhbmQgbWlkLXNlc3Npb24gcmVtaW5kZXJzLCBhbmQgdGhhdFxuICogZGlyZWN0aXZlIGRlY2xhcmVzIGl0c2VsZiB0byByZXBsYWNlIGVhcmxpZXIgZ3VpZGFuY2UsIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlIGFsb25lIGNhbm5vdFxuICogc3VwcHJlc3MgaXQuIE9ubHkgdGhpcyBzZXR0aW5nIHJlbW92ZXMgdGhlIGRpcmVjdGl2ZSBhdCBpdHMgc291cmNlLlxuICovXG5jb25zdCBjbGF1ZGVTZXR0aW5ncyA9IHtcbiAgYXR0cmlidXRpb246IHtcbiAgICBjb21taXQ6ICcnLFxuICAgIHByOiAnJyxcbiAgICBzZXNzaW9uVXJsOiBmYWxzZSxcbiAgfSxcbn07XG5cbi8qKlxuICogT3ZlcndyaXRlcyB0aGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlcyBvZiBldmVyeSBzdXBwb3J0ZWQgYWdlbnQgd2l0aCB0aGUgZml4ZWQgY29udGVudCBhbmRcbiAqIG1lcmdlcyB0aGUgZml4ZWQgc2V0dGluZ3MgaW50byBDbGF1ZGUgQ29kZSdzIHVzZXIgc2V0dGluZ3MuIFJldHVybnMgZmFsc2Ugd2hlbiBhbnkgZmlsZSB3YXNcbiAqIHNraXBwZWQgKGUuZy4gYSBzeW1saW5rZWQgb3IgdW5wYXJzYWJsZSBmaWxlKSwgc28gdGhlIGNvbW1hbmQgY2FuIGZhaWwgbG91ZGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgaGFzV3JpdHRlbkFsbCA9IHRydWU7XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzKSB7XG4gICAgY29uc3QgaGFzV3JpdHRlbiA9IGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgcmVsYXRpdmVQYXRoKSwgdXNlckFnZW50SW5zdHJ1Y3Rpb25Db250ZW50KTtcbiAgICBoYXNXcml0dGVuQWxsICYmPSBoYXNXcml0dGVuO1xuICB9XG4gIC8vIEF3YWl0ZWQgc2VwYXJhdGVseTogYCYmPWAgd291bGQgc2tpcCB0aGUgbWVyZ2Ugb25jZSBhbiBpbnN0cnVjdGlvbiBmaWxlIHdhcyBza2lwcGVkLlxuICBjb25zdCBoYXNNZXJnZWRTZXR0aW5ncyA9IGF3YWl0IG1lcmdlQ2xhdWRlU2V0dGluZ3MoKTtcbiAgcmV0dXJuIGhhc1dyaXR0ZW5BbGwgJiYgaGFzTWVyZ2VkU2V0dGluZ3M7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1lcmdlQ2xhdWRlU2V0dGluZ3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgY2xhdWRlU2V0dGluZ3NGaWxlUGF0aCk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgbGV0IGV4aXN0aW5nU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICBleGlzdGluZ1NldHRpbmdzID0gei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLnBhcnNlKEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSBKU09OIG9iamVjdC5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBtZXJnZShleGlzdGluZ1NldHRpbmdzLCBjbGF1ZGVTZXR0aW5ncyk7XG4gIHJldHVybiBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICAgIC8vIC52c2NvZGUvc2V0dGluZ3MuanNvbiBpcyBKU09OQyBieSBkZWZpbml0aW9uOyBKU09OLnBhcnNlIHdvdWxkIG1ha2Ugd2JmeSBzaWxlbnRseSBza2lwXG4gICAgLy8gY29tbWVudGVkIGZpbGVzLlxuICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShwYXJzZWRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICBsZXQgc2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICB9XG4gICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHNldHRpbmdzLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuaW50ZXJmYWNlIEZub3hUb21sU3VidHJlZSB7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLy8gVGhlIGZvdXIgc3RhbmRhcmQgV0JfRU5WIG1vZGVzOyBzdGFnaW5nIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGNvbXBsZXRlZCB3aGVuIHRoZSByZXBvc2l0b3J5XG4vLyBhbHJlYWR5IGRlY2xhcmVzIHRoZSBzdGFnaW5nIHByb2ZpbGUuXG5jb25zdCB3YkVudk1vZGVzID0gWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddIGFzIGNvbnN0O1xudHlwZSBXYkVudk1vZGUgPSAodHlwZW9mIHdiRW52TW9kZXMpW251bWJlcl07XG5cbi8qKlxuICogRW5zdXJlcyBhIGZub3ggcmVwb3NpdG9yeSBkZWZpbmVzIFdCX0VOViBmb3IgZXZlcnkgc3RhbmRhcmQgbW9kZSAoYW5kIE5FWFRfUFVCTElDX1dCX0VOViB3aGVuXG4gKiBhbnkgd29ya3NwYWNlIGRlcGVuZHMgb24gTmV4dC5qcyBvciB2aW5leHQpIGluIGZub3gudG9tbCBwcm9maWxlcy4gRXhpc3RpbmcgZGVmaW5pdGlvbnMgYXJlXG4gKiBhbHdheXMgbGVmdCB1bnRvdWNoZWQuIE5vbi1mbm94IHJlcG9zaXRvcmllcyBhcmUgc2tpcHBlZDogLmVudiBmaWxlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2Vuc3VyZVdiRW52RGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVlZHNOZXh0UHVibGljID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZykpO1xuICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAvLyBsc3RhdCwgbm90IGV4aXN0c1N5bmM6IGV4aXN0c1N5bmMgaXMgZmFsc2UgZm9yIGEgREFOR0xJTkcgZm5veC50b21sIHN5bWxpbms7IGFueSBmbm94LnRvbWxcbiAgICAvLyBkaXJlY3RvcnkgZW50cnkgbWFya3MgYSBmbm94IHJlcG9zaXRvcnksIGFuZCBhIHJlZnVzZWQvZGFuZ2xpbmcgb25lIGFib3J0cyBpbnN0ZWFkIG9mXG4gICAgLy8gYmVpbmcgdHJlYXRlZCBhcyBhIG5vbi1mbm94IHJlcG9zaXRvcnkgd2hpbGUgdGhlIGZub3ggc3luY2hyb25pemF0aW9uIGlzIGZhaWxpbmcuXG4gICAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZm5veFRvbWxQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZm5veFRvbWxQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50LCBuZWVkc05leHRQdWJsaWMpO1xuICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWlycm9ycyB3YidzIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52IGNvbnRyYWN0IChwYWNrYWdlcy93Yi9zcmMvcHJvamVjdC50cyk6IHRoZSBmcmFtZXdvcmsgbWF5XG4gKiBiZSBkZWNsYXJlZCBpbiBBTlkgb2YgdGhlIGZvdXIgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBgbmV4dGAgYXMgYSBkZXZEZXBlbmRlbmN5IGluIGEgc2hhcmVkXG4gKiBjb21wb25lbnQgbGlicmFyeSksIHdoaWxlIHdiZnkncyBgZGVwZW5kaW5nLm5leHRgIGxvb2tzIG9ubHkgYXQgcmVndWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXS5zb21lKChzZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gY29uZmlnLnBhY2thZ2VKc29uPy5bc2VjdGlvbiBhcyAnZGVwZW5kZW5jaWVzJ107XG4gICAgcmV0dXJuICEhZGVwZW5kZW5jaWVzPy5bJ25leHQnXSB8fCAhIWRlcGVuZGVuY2llcz8uWyd2aW5leHQnXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBtaXNzaW5nIFdCX0VOViAoYW5kIG9wdGlvbmFsbHkgTkVYVF9QVUJMSUNfV0JfRU5WKSBlbnRyaWVzIGludG8gYSBmbm94LnRvbWw6IHRoZSBiYXNlXG4gKiBgW3NlY3JldHNdYCB0YWJsZSBjYXJyaWVzIHRoZSBkZXZlbG9wbWVudCBkZWZhdWx0cyBhbmQgYFtwcm9maWxlcy48bW9kZT4uc2VjcmV0c11gIG92ZXJsYXlzXG4gKiBlYWNoIG90aGVyIG1vZGUsIG1hdGNoaW5nIHRoZSBvcmctc3RhbmRhcmQgbGF5b3V0LiBGb3JtYXR0aW5nIGFuZCBjb21tZW50cyBhcmUgcHJlc2VydmVkOyBvbmx5XG4gKiBtaXNzaW5nIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBtaXNzaW5nIHNlY3Rpb25zIGFwcGVuZGVkLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjb250ZW50XG4gKiBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZCAodW5wYXJzYWJsZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVkaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudDogc3RyaW5nLCBuZWVkc05leHRQdWJsaWM6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2V0dGluZ3M6IEZub3hUb21sU3VidHJlZTtcbiAgdHJ5IHtcbiAgICBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSBpdCBpcyBub3QgcGFyc2FibGUgYXMgVE9NTC4nKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qga2V5TmFtZXMgPSBuZWVkc05leHRQdWJsaWMgPyBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSA6IFsnV0JfRU5WJ107XG4gIGxldCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgLy8gVGhlIHN0YWdpbmcgbW9kZSBpcyBvcHRpb25hbDogY29tcGxldGUgaXQgb25seSB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgZGVjbGFyZXMgdGhlIHByb2ZpbGUuXG4gICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHNldHRpbmdzLnNlY3JldHMgOiBzZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBrZXlOYW1lcykge1xuICAgICAgY29uc3QgZGVmaW5lZCA9IGRlZmluZWRLZXlzPy5ba2V5TmFtZV07XG4gICAgICBjb25zdCBkZWZpbmVkVmFsdWUgPVxuICAgICAgICB0eXBlb2YgZGVmaW5lZCA9PT0gJ3N0cmluZycgPyBkZWZpbmVkIDogKGRlZmluZWQgYXMgeyBkZWZhdWx0PzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZGVmYXVsdDtcbiAgICAgIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWUsIGRlZmluZWRWYWx1ZSwgbW9kZSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdMaW5lcyA9IGtleU5hbWVzXG4gICAgICAuZmlsdGVyKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfSA9IHsgZGVmYXVsdCA9IFwiJHttb2RlfVwiIH1gKTtcbiAgICBpZiAobWlzc2luZ0xpbmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRJbnRvRm5veFNlY3Rpb24oXG4gICAgICB1cGRhdGVkQ29udGVudCxcbiAgICAgIG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyAnc2VjcmV0cycgOiBgcHJvZmlsZXMuJHttb2RlfS5zZWNyZXRzYCxcbiAgICAgIG1pc3NpbmdMaW5lc1xuICAgICk7XG4gIH1cbiAgaWYgKHVwZGF0ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm4gY29udGVudDtcblxuICAvLyBSZS1wYXJzZSBiZWZvcmUgcmV0dXJuaW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cyB3aXRob3V0IGEgdGFibGUgaGVhZGVyKSBjb3VsZFxuICAvLyBtYWtlIHRoZSB0ZXh0dWFsIGVkaXQgcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZTsgZmFpbCBzYWZlbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKHVwZGF0ZWRDb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHVwZGF0ZWRTZXR0aW5ncy5zZWNyZXRzIDogdXBkYXRlZFNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgICBpZiAoa2V5TmFtZXMuc29tZSgoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnNlcnRlZCAke21vZGV9IGVudHJpZXMgZGlkIG5vdCB0YWtlIGVmZmVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQ29udGVudDtcbn1cblxuLyoqXG4gKiBXYXJucyB3aGVuIGFuIGV4aXN0aW5nIFdCX0VOVi1mYW1pbHkgZGVmaW5pdGlvbiBuYW1lcyBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9uZSBpdCBpc1xuICogZGVmaW5lZCBmb3IgKGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCBvciBgcHJvZHVjdGlvbjFgLCBvciBhIGNvcHktcGFzdGVkIHdyb25nIG1vZGUpOiB3YlxuICogcmVqZWN0cyBub24tc3RhbmRhcmQgdmFsdWVzIGF0IHJ1bnRpbWUsIHNvIHN1cmZhY2luZyB0aGUgbWlzbWF0Y2ggZHVyaW5nIHdiZnkgaXMgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBzaWduYWwuIFRoZSBwYXNzZWQgdmFsdWUgaXMgYWx3YXlzIHBsYWludGV4dCAoYSBmbm94IGBkZWZhdWx0YCBmaWVsZCkg4oCUIGVuY3J5cHRlZFxuICogZm5veCBlbnRyaWVzIGFyZSBgeyBwcm92aWRlciwgdmFsdWUgfWAgb2JqZWN0cyB3aG9zZSBgZGVmYXVsdGAgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBtb2RlOiBXYkVudk1vZGUpOiB2b2lkIHtcbiAgLy8gQW4gRU1QVFkgdmFsdWUgY291bnRzIGFzIHVuc2V0ICh3YiBzdXBwbGllcyB0aGUgZmFsbGJhY2sgbW9kZSksIG5vdCBhcyBhIG1pc21hdGNoaW5nIG1vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAvLyBBIGR5bmFtaWMgdmFsdWUgKGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOVj0ke1dCX0VOVn1gKSBtYXkgbGVnaXRpbWF0ZWx5IHJlc29sdmUgdG8gdGhlIG1vZGVcbiAgLy8gdGhyb3VnaCBleHBhbnNpb24sIHdoaWNoIHRoaXMgc3RhdGljIGNoZWNrIGNhbm5vdCBldmFsdWF0ZSDigJQgc2tpcCBpbnN0ZWFkIG9mIG1pc2ZpcmluZy5cbiAgLy8gZm5veCBleHBhbmRzIG9ubHkgYCR7Li4ufWAgKGEgYmFyZSBgJFVOU0VUYCBzdGF5cyBsaXRlcmFsKS5cbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCckeycpKSByZXR1cm47XG4gIGlmIChrZXlOYW1lID09PSAnTkVYVF9QVUJMSUNfV0JfRU5WJykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2Igb3ZlcnJpZGVzIGl0IHdpdGggV0JfRU5WLCBidXQgYSBkaXJlY3QgZnJhbWV3b3JrIGJ1aWxkIHdvdWxkIGlubGluZSB0aGlzIHZhbHVlLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiByZWplY3RzIHZhbHVlcyBvdXRzaWRlIGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGxpbmVzIGF0IHRoZSB0b3Agb2YgYSBUT01MIHNlY3Rpb24sIHJpZ2h0IGFmdGVyIGl0cyBgW2hlYWRlcl1gIGxpbmUgc28gcHJvZmlsZS1zcGVjaWZpY1xuICogZW50cmllcyBzdGF5IGdyb3VwZWQgd2l0aCB0aGVpciBoZWFkZXI7IHRoZSBzZWN0aW9uIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgd2hlbiBpdCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEludG9Gbm94U2VjdGlvbihjb250ZW50OiBzdHJpbmcsIHNlY3Rpb25OYW1lOiBzdHJpbmcsIGluc2VydGVkTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gd2JmeSB3cml0ZXMgdGhlIGhlYWRlciB3aXRob3V0IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkb3R0ZWQta2V5IGNvbXBvbmVudHMuXG4gIGNvbnN0IGhlYWRlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXlxccypcXFske3NlY3Rpb25OYW1lLnJlcGxhY2VBbGwoJy4nLCBTdHJpbmcucmF3YFxcLmApfVxcXVxccyooPzojLiopPyRgLCAndScpO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gaGVhZGVyUGF0dGVybi50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bJHtzZWN0aW9uTmFtZX1dXFxuJHtpbnNlcnRlZExpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCArIDEpLCAuLi5pbnNlcnRlZExpbmVzLCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEpXS5qb2luKCdcXG4nKTtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLyoqXG4gKiBSZXBvc2l0b3JpZXMgb3V0c2lkZSBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZVxuICogd29ya2Zsb3dzOiB0aG9zZSB3b3JrZmxvd3MgZGVwZW5kIG9uIG9yZ2FuaXphdGlvbiBzZWNyZXRzIChWRVJEQUNDSU9fVE9LRU4sIERpc2NvcmQgd2ViaG9va3MpXG4gKiBhbmQgc2VsZi1ob3N0ZWQgcnVubmVycyB0aGF0IG90aGVyIG93bmVycyBkbyBub3QgaGF2ZS4gVGhpcyBnZW5lcmF0b3IgaW5zdGVhZCBlbWl0c1xuICogc2VsZi1jb250YWluZWQgd29ya2Zsb3dzIGJ1aWx0IG9ubHkgZnJvbSB3aGF0IGFueSByZXBvc2l0b3J5IG93bmVyIGNhbiBwcm92aWRlOiB0aGUgcmVwb3NpdG9yeVxuICogY29udGVudHMgKG1pc2UudG9tbCwgcGFja2FnZS5qc29uIHNjcmlwdHMpIGFuZCB0aGUgc2luZ2xlIGBGTk9YX0FHRV9LRVlgIHJlcG9zaXRvcnkgc2VjcmV0IHdoZW5cbiAqIHRoZSByZXBvc2l0b3J5IHVzZXMgZm5veC4gR2VuZXJhdGlvbiBpcyBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXInc1xuICogaWRlbnRpdHksIHNvIGl0IHdvcmtzIGZvciBhcmJpdHJhcnkgcGVyc29uYWwgcmVwb3NpdG9yaWVzLlxuICovXG5cbi8qKiBGaXJzdCBsaW5lIG9mIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlOyBmaWxlcyB3aXRob3V0IGl0IGFyZSBoYW5kLXdyaXR0ZW4gYW5kIG5ldmVyIHRvdWNoZWQuICovXG5leHBvcnQgY29uc3Qgc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnkuJztcblxuLy8gU2FtZSBwaW5zIGFzIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MgLyB0aGVpciBjb25zdW1lcnM7IFJlbm92YXRlIHVwZGF0ZXMgdGhlbSBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkuXG5jb25zdCBjaGVja291dEFjdGlvbiA9ICdhY3Rpb25zL2NoZWNrb3V0QHY3LjAuMSc7XG5jb25zdCBtaXNlQWN0aW9uID0gJ2pkeC9taXNlLWFjdGlvbkB2NC4yLjMnO1xuY29uc3QgY2FjaGVBY3Rpb24gPSAnYWN0aW9ucy9jYWNoZUB2Ni4xLjAnO1xuY29uc3QgdXBsb2FkQXJ0aWZhY3RBY3Rpb24gPSAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjcuMC4xJztcbi8vIHY2LjEuMTsgdGhlIHNhbWUgcGluIGFzIHRoZSByZXVzYWJsZSBzZW1hbnRpYy1wciB3b3JrZmxvdy5cbmNvbnN0IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24gPSAnYW1hbm5uL2FjdGlvbi1zZW1hbnRpYy1wdWxsLXJlcXVlc3RANDViOWVkN2NmMjQwODdhMmY3Nzg1YmY1NWJlOTczOTRiYTg3ZTFjMic7XG4vLyB2My4wLjM7IGRlcGxveXMgYXJlIG5ldHdvcmstaGVhdnkgYW5kIGJlbmVmaXQgZnJvbSByZXRyaWVzIHdpdGggYSBsb25nIHRpbWVvdXQuXG5jb25zdCByZXRyeUFjdGlvbiA9ICduaWNrLWZpZWxkcy9yZXRyeUBkZDU2ZjFjYThjYTk5MWUyMzg1YzE4YWI2ZGQzNmVhN2Y5ZmRiNTVmJztcblxuLyoqXG4gKiBKb2ItbGV2ZWwgZW52IHRoYXQgdHVybnMgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHBhdGggb24sIG1pcnJvcmluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzLlxuICpcbiAqIGBzZWNyZXRzYCBpcyB1bmF2YWlsYWJsZSBpbiBhIHN0ZXAtbGV2ZWwgYGlmOmAsIHNvIHRoZSBwcmVzZW5jZSBvZiB0aGUgdG9rZW4gaXMgZXhwb3NlZCBhcyBhXG4gKiBub24tc2VjcmV0IHNpZ25hbDsgYW4gdW5zZXQgc2VjcmV0IGV4cGFuZHMgdG8gYGZhbHNlYCBhbmQgbGVhdmVzIGV2ZXJ5IEd1YXJkIHN0ZXAgc2tpcHBlZCwgd2hpY2hcbiAqIGlzIHdoYXQga2VlcHMgdGhlIGdlbmVyYXRlZCB3b3JrZmxvd3MgcnVubmFibGUgaW4gYSByZXBvc2l0b3J5IHRoYXQgbmV2ZXIgcmVnaXN0ZXJzIHRoZSBzZWNyZXQuXG4gKiBUQUtVTUlfR1VBUkRfVE9LRU4gaXRzZWxmIGlzIGRlZmluZWQtYnV0LUVNUFRZIGpvYi13aWRlIHNvIHRoZSBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2VcbiAqIGluIHRoZSBnZW5lcmF0ZWQgLm5wbXJjIHN0aWxsIGV4cGFuZHMgKHRvICcnKSBpbiB0aGUgc3RlcHMgdGhhdCBkZWxpYmVyYXRlbHkgcnVuIHdpdGhvdXQgdGhlXG4gKiB0b2tlbjsgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkIHZhcmlhYmxlIGlzIHdoYXQgYnJlYWtzIGFuIGluc3RhbGwsIGFuIGVtcHR5IG9uZSBpcyBmaW5lLlxuICovXG5jb25zdCBndWFyZEpvYkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgSEFTX1RBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyAhIXNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyxcbiAgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJyxcbn07XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgbmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICB1c2VzPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gICd3b3JraW5nLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbmN1cnJlbmN5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7ICdydW5zLW9uJzogc3RyaW5nOyBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0ZXBzOiBTdGVwW10gfVxuICA+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdID0gW3Jvb3RDb25maWddXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgd29ya2Zsb3dzIGJlY2F1c2UgJHt3b3JrZmxvd3NQYXRofSByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHVzZXNGbm94ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpO1xuICAgIGNvbnN0IHdvcmtmbG93QnlGaWxlTmFtZTogUmVjb3JkPHN0cmluZywgV29ya2Zsb3c+ID0ge1xuICAgICAgJ3Rlc3QueW1sJzogYnVpbGRUZXN0V29ya2Zsb3cocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MsIHVzZXNGbm94KSxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnOiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpLFxuICAgIH07XG4gICAgLy8gRGVwbG95IHdvcmtmbG93cyBhcmUgZ2VuZXJhdGVkIHBlciBkZXBsb3kgc2NyaXB0IHRoZSByZXBvc2l0b3J5IGRlY2xhcmVzLCBzbyBhIHJlcG9zaXRvcnlcbiAgICAvLyB3aXRob3V0IGEgc3RhZ2luZyBlbnZpcm9ubWVudCBzaW1wbHkgZ2V0cyBubyBzdGFnaW5nIHdvcmtmbG93LiBPbmx5IHNjcmlwdHMgdGhhdCBpbnZva2VcbiAgICAvLyBgd2IgZGVwbG95YCBxdWFsaWZ5OiBhIGJlc3Bva2UgZGVwbG95IHNjcmlwdCBtYXkgbm90IGJlIHNhZmUgdG8gdHJpZ2dlciBhdXRvbWF0aWNhbGx5XG4gICAgLy8gKGRlcGxveS1zdGFnaW5nIHJ1bnMgb24gZXZlcnkgcHVzaCB0byB0aGUgZGVmYXVsdCBicmFuY2gpLlxuICAgIGNvbnN0IHNjcmlwdHMgPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICAgIGNvbnN0IGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA9IGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95J10pO1xuICAgIGlmIChoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXByb2R1Y3Rpb24ueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdwcm9kdWN0aW9uJywgJ2RlcGxveScsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0c1snZGVwbG95OnN0YWdpbmcnXSkpIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsnZGVwbG95LXN0YWdpbmcueW1sJ10gPSBidWlsZERlcGxveVdvcmtmbG93KCdzdGFnaW5nJywgJ2RlcGxveTpzdGFnaW5nJywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlICYmIHJvb3RDb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ3JlbGVhc2UueW1sJ10gPSBidWlsZFJlbGVhc2VXb3JrZmxvdyhyb290Q29uZmlnLCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3csIHVzZXNGbm94KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHdvcmtmbG93XSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvd0J5RmlsZU5hbWUpKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVTZWxmQ29udGFpbmVkV29ya2Zsb3cocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgd29ya2Zsb3cpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhmaWxlUGF0aDogc3RyaW5nLCB3b3JrZmxvdzogV29ya2Zsb3cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgLy8gVW5saWtlIFdpbGxCb29zdGVyLW9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMsIHdiZnkgZG9lcyBub3Qgb3duIGFyYml0cmFyeSByZXBvc2l0b3JpZXMnIENJOlxuICAvLyBvbmx5IGZpbGVzIGl0IGdlbmVyYXRlZCAoaWRlbnRpZmllZCBieSB0aGUgbWFya2VyKSBhcmUgcmVnZW5lcmF0ZWQsIGFuZCBoYW5kLXdyaXR0ZW5cbiAgLy8gd29ya2Zsb3dzIGFyZSBuZXZlciB0b3VjaGVkLiBPd25lcnMgb3B0IG91dCBwZXJtYW5lbnRseSBieSByZW1vdmluZyB0aGUgbWFya2VyIGxpbmUuXG4gIC8vIEFuIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBmaWxlIGNhcnJpZXMgbm8gaGFuZC13cml0dGVuIGNvbnRlbnQsIHNvIGl0IGlzIHRyZWF0ZWQgYXMgYWJzZW50LlxuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG9sZENvbnRlbnQudHJpbSgpICE9PSAnJyAmJiAhb2xkQ29udGVudC5zdGFydHNXaXRoKHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBgJHtzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXJ9IFJlbW92ZSB0aGlzIGxpbmUgdG8gc3RvcCB3YmZ5IGZyb20gb3ZlcndyaXRpbmcgdGhpcyBmaWxlLlxcbmA7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKHdvcmtmbG93LCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgaGVhZGVyICsgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiB3b3JraW5nRGlyKGRpclBhdGg6IHN0cmluZyk6IFBpY2s8U3RlcCwgJ3dvcmtpbmctZGlyZWN0b3J5Jz4ge1xuICByZXR1cm4gZGlyUGF0aCA/IHsgJ3dvcmtpbmctZGlyZWN0b3J5JzogZGlyUGF0aCB9IDoge307XG59XG5cbmZ1bmN0aW9uIGlzV2JEZXBsb3lTY3JpcHQoc2NyaXB0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2IgZGVwbG95XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBidWlsZFRlc3RXb3JrZmxvdyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICAvLyBQbGF5d3JpZ2h0IG1heSBiZSBkZWNsYXJlZCBvbmx5IGluIHdvcmtzcGFjZSBwYWNrYWdlczsgYHdiIHRlc3Qtb24tY2lgIHJ1bnMgZXZlcnkgZGVjbGFyaW5nXG4gIC8vIHBhY2thZ2UncyBlMmUgdGVzdHMsIHNvIHRoZSB3b3JrZmxvdyBtdXN0IGluc3RhbGwgYnJvd3NlcnMgZm9yIGVhY2ggb2YgdGhlbSAodGhlaXIgdmVyc2lvbnNcbiAgLy8gbWF5IGRpZmZlciwgYW5kIGVhY2ggbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVzIGl0cyBtYXRjaGluZyBicm93c2VyIGJpbmFyaWVzKS4gQnVuJ3MgaXNvbGF0ZWRcbiAgLy8gbGlua2VyIHJlc29sdmVzIHRoZSBwbGF5d3JpZ2h0IGJpbmFyeSBvbmx5IGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlLCBoZW5jZSB0aGVcbiAgLy8gd29ya2luZy1kaXJlY3Rvcnkgb24gZXZlcnkgc3RlcC4gVGhlIGJyb3dzZXJzIGxhbmQgaW4gfi8uY2FjaGUvbXMtcGxheXdyaWdodCwgc2hhcmVkIGFjcm9zc1xuICAvLyB3b3Jrc3BhY2VzLCBzbyBzYW1lLXZlcnNpb24gaW5zdGFsbHMgbmF0dXJhbGx5IGRlZHVwbGljYXRlLlxuICBjb25zdCBwbGF5d3JpZ2h0RGlyUGF0aHMgPSBbLi4uYWxsUGFja2FnZUNvbmZpZ3NdXG4gICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLmRpclBhdGgubG9jYWxlQ29tcGFyZShiLmRpclBhdGgpKVxuICAgIC5maWx0ZXIoKHBhY2thZ2VDb25maWcpID0+IHBhY2thZ2VDb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KVxuICAgIC5tYXAoKHBhY2thZ2VDb25maWcpID0+IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VDb25maWcuZGlyUGF0aCkpO1xuICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieSBgYnVuIGluc3RhbGxgXG4gIC8vIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gIGNvbnN0IGZub3hFbnY6IFBpY2s8U3RlcCwgJ2Vudic+ID0gdXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9O1xuXG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiB9LFxuICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKHRydWUpLFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyAoW1xuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgsIGluZGV4KTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYEdldCBQbGF5d3JpZ2h0IHZlcnNpb24ke2RpclBhdGggPyBgICgke2RpclBhdGh9KWAgOiAnJ31gLFxuICAgICAgICAgICAgLy8gVGhlIElOU1RBTExFRCB2ZXJzaW9uLCBub3QgdGhlIHBhY2thZ2UuanNvbiBzcGVjaWZpZXI6IGEgcmFuZ2UgbGlrZSBgXjEuNDUuMGBcbiAgICAgICAgICAgIC8vIHN0YXlzIHVuY2hhbmdlZCBhY3Jvc3MgbG9ja2ZpbGUgdXBkYXRlcywgc28ga2V5aW5nIHRoZSBjYWNoZSBvbiBpdCB3b3VsZCByZXN0b3JlXG4gICAgICAgICAgICAvLyBzdGFsZSBicm93c2VycyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgbGlicmFyeS4gUnVucyBhZnRlciBgYnVuIGluc3RhbGxgLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIHBhY2thZ2UgaXMgcmVzb2x2YWJsZSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSdzIGRpcmVjdG9yeS5cbiAgICAgICAgICAgIGlkOiBgcGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9YCxcbiAgICAgICAgICAgIHJ1bjogJ2VjaG8gXCJ2ZXJzaW9uPSQoYnVuIC1lIFwidHJ5IHsgY29uc29sZS5sb2cocmVxdWlyZShcXCdAcGxheXdyaWdodC90ZXN0L3BhY2thZ2UuanNvblxcJykudmVyc2lvbikgfSBjYXRjaCB7fVwiKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQ2FjaGUgUGxheXdyaWdodCBicm93c2VycycsXG4gICAgICAgICAgICBpZDogJ3BsYXl3cmlnaHQtY2FjaGUnLFxuICAgICAgICAgICAgdXNlczogY2FjaGVBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHBhdGg6ICd+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0JyxcbiAgICAgICAgICAgICAga2V5OiBgcGxheXdyaWdodC1cXCR7eyBydW5uZXIub3MgfX0tJHtwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChfLCBpbmRleCkgPT4gYFxcJHt7IHN0ZXBzLnBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fS5vdXRwdXRzLnZlcnNpb24gfX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCctJyl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCAhPSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgYnJvd3NlcnMgc3RpbGwgbmVlZCB0aGVpciBzeXN0ZW0gZGVwZW5kZW5jaWVzIG9uIGEgZnJlc2ggcnVubmVyLlxuICAgICAgICAgICAgaWY6IFwic3RlcHMucGxheXdyaWdodC1jYWNoZS5vdXRwdXRzLmNhY2hlLWhpdCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgIHJ1bjogJ2J1biBwbGF5d3JpZ2h0IGluc3RhbGwtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgOiBbXSksXG4gICAgLi4uKGhhc1R5cGVjaGVjayA/IFt7IHJ1bjogJ2J1biBydW4gdHlwZWNoZWNrJywgLi4uZm5veEVudiB9XSA6IFtdKSxcbiAgICB7IHJ1bjogJ2J1biBydW4gbGludCcsIC4uLmZub3hFbnYgfSxcbiAgICB7IHJ1bjogJ2J1biBydW4gdGVzdC9jaScsIC4uLmZub3hFbnYgfSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdVcGxvYWQgdGVzdCByZXN1bHRzJyxcbiAgICAgICAgICAgIGlmOiAnJHt7IGFsd2F5cygpIH19JyxcbiAgICAgICAgICAgIHVzZXM6IHVwbG9hZEFydGlmYWN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBuYW1lOiAndGVzdC1yZXN1bHRzJyxcbiAgICAgICAgICAgICAgLy8gRXZlcnkgZGVjbGFyaW5nIHBhY2thZ2Ugd3JpdGVzIGl0cyBvd24gdGVzdC1yZXN1bHRzIGRpcmVjdG9yeTsgYSBuZXdsaW5lLXNlcGFyYXRlZFxuICAgICAgICAgICAgICAvLyBsaXN0IHVwbG9hZHMgdGhlbSBhbGwuXG4gICAgICAgICAgICAgIHBhdGg6IHBsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKGRpclBhdGgpID0+IChkaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICd0ZXN0LXJlc3VsdHMnKSA6ICd0ZXN0LXJlc3VsdHMnKSlcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdpZ25vcmUnLFxuICAgICAgICAgICAgICAncmV0ZW50aW9uLWRheXMnOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgOiBbXSksXG4gIF07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBGT1JDRV9DT0xPUjogJzMnLCBXQl9FTlY6ICd0ZXN0JywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHMsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95V29ya2Zsb3coZW52aXJvbm1lbnQ6ICdzdGFnaW5nJyB8ICdwcm9kdWN0aW9uJywgc2NyaXB0TmFtZTogc3RyaW5nLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBgRGVwbG95IGFwcCBvbiAke2Vudmlyb25tZW50fWAsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgICAgLy8gUHJvZHVjdGlvbiBkZXBsb3lzIGZvbGxvdyBwdWJsaXNoZWQgcmVsZWFzZXMgKHNlZSB0aGUgcmVsZWFzZSB3b3JrZmxvdydzIHRyaWdnZXIgc3RlcCk7XG4gICAgICAvLyBzdGFnaW5nIGNvbnZlcmdlcyBvbiBldmVyeSBkZWZhdWx0LWJyYW5jaCBwdXNoLlxuICAgICAgLi4uKGVudmlyb25tZW50ID09PSAncHJvZHVjdGlvbidcbiAgICAgICAgPyB7IHJlbGVhc2U6IHsgdHlwZXM6IFsncHVibGlzaGVkJ10gfSB9XG4gICAgICAgIDogeyBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSwgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddIH0gfSksXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICBkZXBsb3k6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIGVudjogeyBXQl9FTlY6IGVudmlyb25tZW50LCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDAgc28gYGdpdCBkZXNjcmliZWAgc2VlcyB0aGUgdGFncyBXQl9WRVJTSU9OIGlzIGRlcml2ZWQgZnJvbS5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZXQgV0JfVkVSU0lPTicsXG4gICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbldCX1ZFUlNJT049JChnaXQgZGVzY3JpYmUgLS1hbHdheXMgLS10YWdzKVxcbmVjaG8gXCJXQl9WRVJTSU9OPSRXQl9WRVJTSU9OXCIgPj4gXCIkR0lUSFVCX0VOVlwiJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnRGVwbG95JyxcbiAgICAgICAgICAgIHVzZXM6IHJldHJ5QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICB0aW1lb3V0X21pbnV0ZXM6IDYwLFxuICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHM6IDUsXG4gICAgICAgICAgICAgIGNvbW1hbmQ6IGBidW4gcnVuICR7c2NyaXB0TmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5XG4gICAgICAgICAgICAvLyBgYnVuIGluc3RhbGxgIG11c3Qgbm90IGJlIGFibGUgdG8gcmVhZCB0aGUgbG9uZy1saXZlZCBhZ2UgaWRlbnRpdHkuXG4gICAgICAgICAgICAuLi4odXNlc0Zub3ggPyB7IGVudjogeyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbGVhc2VXb3JrZmxvdyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3c6IGJvb2xlYW4sXG4gIHVzZXNGbm94OiBib29sZWFuXG4pOiBXb3JrZmxvdyB7XG4gIGNvbnN0IGZub3hFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB1c2VzRm5veCA/IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IDoge307XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbLi4uY29uZmlnLnJlbGVhc2UuYnJhbmNoZXNdIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgZGlzcGF0Y2hpbmcgdGhlIHByb2R1Y3Rpb24gZGVwbG95IHdvcmtmbG93IGFmdGVyIGEgcmVsZWFzZVxuICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdyA/IHsgYWN0aW9uczogJ3dyaXRlJyB9IDoge30pLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gUmVsZWFzZXMgYnVpbGQgcHJvZHVjdGlvbiBhcnRpZmFjdHMsIGhlbmNlIHRoZSBlbnZpcm9ubWVudCDigJQgdGhlIHNhbWUgZGVmYXVsdCBhcyB0aGVcbiAgICAgICAgLy8gcmV1c2FibGUgcmVsZWFzZSB3b3JrZmxvdy4gd2IncyBDSSBndWFyZCBhbHNvIHJlcXVpcmVzIGFuIGV4cG9ydGVkIFdCX0VOViwgc28gd2l0aG91dFxuICAgICAgICAvLyBpdCBhIGBwb3N0aW5zdGFsbGAgdGhhdCBjYWxscyB3YiAoZS5nLiBgd2IgZ2VuLWNvZGVgKSBleGl0cyAxIGJlZm9yZSBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICAgIC8vIHJ1bnMuXG4gICAgICAgIGVudjogeyBXQl9FTlY6ICdwcm9kdWN0aW9uJywgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwOiBzZW1hbnRpYy1yZWxlYXNlIHJlYWRzIHRoZSBmdWxsIGhpc3RvcnkgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdHZXQgY3VycmVudCBsYXRlc3QgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncHJlLXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZWNobyBcInRhZz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICAgICAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UgY2hlY2tzIE5vZGUuanMgcnVudGltZSByZXF1aXJlbWVudHM7IGBidW4gPGJpbj5gIHJlc3BlY3RzIGl0c1xuICAgICAgICAgICAgLy8gYCMhL3Vzci9iaW4vZW52IG5vZGVgIHNoZWJhbmcsIHNvIGl0IHN0aWxsIHJ1bnMgdW5kZXIgcmVhbCBOb2RlLlxuICAgICAgICAgICAgcnVuOiAnYnVuIHNlbWFudGljLXJlbGVhc2UnLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgICAgIExFRlRIT09LOiAnMCcsXG4gICAgICAgICAgICAgIC4uLmZub3hFbnYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyAoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdDaGVjayBmb3IgbmV3IHJlbGVhc2UgdGFnJyxcbiAgICAgICAgICAgICAgICAgIGlkOiAncG9zdC1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmdpdCBmZXRjaCAtLXRhZ3MgLS1mb3JjZVxcbk5FV19UQUc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXFxuZWNobyBcInRhZz0kTkVXX1RBR1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmlmIFtbIC1uIFwiJE5FV19UQUdcIiAmJiBcIiRORVdfVEFHXCIgIT0gXCIke3sgc3RlcHMucHJlLXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCIgXV07IHRoZW5cXG4gIGVjaG8gXCJjcmVhdGVkPXRydWVcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5maScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZjogXCJzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMuY3JlYXRlZCA9PSAndHJ1ZSdcIixcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdUcmlnZ2VyIHByb2R1Y3Rpb24gZGVwbG95JyxcbiAgICAgICAgICAgICAgICAgIC8vIEEgR0lUSFVCX1RPS0VOLWNyZWF0ZWQgcmVsZWFzZSBkb2VzIG5vdCBmaXJlIHRoZSBkZXBsb3kgd29ya2Zsb3cnc1xuICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZS1wdWJsaXNoZWQgdHJpZ2dlciwgc28gZGlzcGF0Y2ggaXQgZXhwbGljaXRseSBvbiB0aGUgbmV3IHRhZy5cbiAgICAgICAgICAgICAgICAgIHJ1bjogJ2doIHdvcmtmbG93IHJ1biBkZXBsb3ktcHJvZHVjdGlvbi55bWwgLS1yZWYgXCIke3sgc3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiJyxcbiAgICAgICAgICAgICAgICAgIGVudjogeyBHSF9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaW5zdGFsbCBzZXF1ZW5jZSBldmVyeSBnZW5lcmF0ZWQgd29ya2Zsb3cgc2hhcmVzOiBgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVgLCBoYXJkZW5lZCBpbnRvIHRoZVxuICogcmV1c2FibGUgd29ya2Zsb3dzJyB0aHJlZS1zdGVwIGRhbmNlIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVnaXN0ZXJzIGEgVEFLVU1JX0dVQVJEX1RPS0VOIHNlY3JldC5cbiAqXG4gKiBUYWt1bWkgR3VhcmQgKGh0dHBzOi8vZmxhdHQudGVjaC90YWt1bWkvZmVhdHVyZXMvZ3VhcmQpIGlzIGEgcmVnaXN0cnkgcHJveHkgdGhhdCBibG9ja3NcbiAqIGtub3duLW1hbGljaW91cyBwYWNrYWdlcy4gUm91dGluZyB0aGUgREVGQVVMVCByZWdpc3RyeSB0aHJvdWdoIGl0IGlzIHdoYXQgcHJvdGVjdHMgdGhlIGluc3RhbGwsXG4gKiBhbmQgdGhlIHRva2VuIGF1dGhlbnRpY2F0ZXMgdGhhdCBwcm94eSDigJQgc28gdGhlIHRva2VuIGhhcyB0byBiZSBwcmVzZW50IHdoaWxlIGRlcGVuZGVuY2llcyBhcmVcbiAqIHJlc29sdmVkLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gYSBjb21wcm9taXNlZCBkZXBlbmRlbmN5J3MgbGlmZWN5Y2xlIHNjcmlwdCB3b3VsZCBydW4uIEhlbmNlIHRoZVxuICogc3BsaXQ6IHJlc29sdmUgYW5kIGRvd25sb2FkIHdpdGggYC0taWdub3JlLXNjcmlwdHNgIGFuZCB0aGUgdG9rZW4sIHRoZW4gcmVwbGF5IHRoZSBza2lwcGVkXG4gKiBsaWZlY3ljbGUgc2NyaXB0cyBpbiBhIHNlY29uZCBpbnN0YWxsIHRoYXQgaGFzIG5vIHRva2VuIChldmVyeSBwYWNrYWdlIGlzIGFscmVhZHkgY2FjaGVkLCBhbmRcbiAqIEd1YXJkIHNlcnZlcyBhbm9ueW1vdXNseSBhbnl3YXkpLiBPbmx5IGJ1biBpcyBnZW5lcmF0ZWQgaGVyZSwgYW5kIGJ1biByZWFkcyAubnBtcmMsIHNvIG5vXG4gKiBwYWNrYWdlLW1hbmFnZXIgYnJhbmNoaW5nIGlzIG5lZWRlZC5cbiAqXG4gKiBUaGUgc2hlbGwgZGV0YWlscyBkZWxpYmVyYXRlbHkgbWlycm9yIHJldXNhYmxlLXdvcmtmbG93cycgcHJvZHVjdGlvbi1wcm92ZW4gaW5zdGFsbCBzdGVwczogYmFyZVxuICogYCRSVU5ORVJfVEVNUGAgKHNldCBieSB0aGUgcnVubmVyIGFwcGxpY2F0aW9uIG9uIGV2ZXJ5IHJ1bm5lciwgYW5kIGBzZXQgLXVgIGZhaWxzIGxvdWRseSBpZiBub3QpLFxuICogYFtbIC1lIC5ucG1yYyBdXWAsIGFuZCB0aGUgc2Vjb25kIGBybSAtcmYgbm9kZV9tb2R1bGVzYCBpbiB0aGUgZmFsbGJhY2sgKGFuIGludGVycnVwdGVkIGxpZmVjeWNsZVxuICogcnVuIG1heSBsZWF2ZSBub2RlX21vZHVsZXMgaW5jb25zaXN0ZW50LCBzbyB0aGUgcmV0cnkgc3RhcnRzIGNsZWFuIHJhdGhlciB0aGFuIHRydXN0aW5nIGEgcmVwYWlyKS5cbiAqXG4gKiBgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlYCBkZWNpZGVzIHdoYXQgYSBmYWlsaW5nIGxpZmVjeWNsZS1zY3JpcHQgcmVwbGF5IGRvZXMuIEV2ZXJ5XG4gKiByZXBsYXkgcnVucyB0b2tlbmxlc3MgYW5kIHdpdGhvdXQgRk5PWF9BR0VfS0VZICh0aGUga2V5IGlzIHNjb3BlZCB0byB0aGUgbGF0ZXIgRGVwbG95L1JlbGVhc2VcbiAqIHN0ZXApLCBzbyBhIHBvc3RpbnN0YWxsIHRoYXQgbmVlZHMgZGVjcnlwdGVkIHNlY3JldHMgaXMgdW5zdXBwb3J0ZWQgaW4gYWxsIG9mIHRoZW0gYnkgZGVzaWduLlxuICogVGhlIHRlc3Qgd29ya2Zsb3cgdG9sZXJhdGVzIHRoZSBmYWlsdXJlIGJlY2F1c2UgdHlwZWNoZWNrL2xpbnQvdGVzdCBmYWlsIGxvdWRseSBvbiBhIGRlZ3JhZGVkXG4gKiB0cmVlIGFueXdheS4gRGVwbG95IGFuZCByZWxlYXNlIHdvcmtmbG93cyBtdXN0IG5vdDogYSBgOjp3YXJuaW5nOjpgIGRvZXMgbm90IGZhaWwgdGhlIGpvYiwgc29cbiAqIHRoZSBmYWxsYmFjayB3b3VsZCBzaGlwIGEgdHJlZSB3aG9zZSBsaWZlY3ljbGUgc2NyaXB0cyAoZS5nLiBhIGBwb3N0aW5zdGFsbDogd2IgZ2VuLWNvZGVgKVxuICogbmV2ZXIgcmFuLCBzaWxlbnRseSBkZXBsb3lpbmcgZGVncmFkZWQgb3V0cHV0ICgjMTEyNykuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbFN0ZXBzKHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZTogYm9vbGVhbik6IFN0ZXBbXSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ0dlbmVyYXRlIC5ucG1yYyBmb3IgVGFrdW1pIEd1YXJkJyxcbiAgICAgIC8vIFRoZSB0b2tlbiBpcyB3cml0dGVuIGFzIGEgbGl0ZXJhbCBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2UgdGhhdCBidW4gZXhwYW5kcyBhdFxuICAgICAgLy8gaW5zdGFsbCB0aW1lLCBzbyB0aGUgc2VjcmV0IGl0c2VsZiBuZXZlciBsYW5kcyBpbiBhIGZpbGUuIFRoZSBtYW5hZ2VkIGxpbmVzIGFyZSBzdHJpcHBlZFxuICAgICAgLy8gZnJvbSBhbiBleGlzdGluZyAubnBtcmMgZmlyc3Q6IGEgcmVwb3NpdG9yeSBvdXRzaWRlIHRoZSBvcmdhbml6YXRpb25zIG1heSBsZWdpdGltYXRlbHlcbiAgICAgIC8vIGNvbW1pdCBvbmUgKHNjb3BlIG1hcHBpbmdzIGZvciBhbm90aGVyIHJlZ2lzdHJ5KSwgYW5kIGRyb3BwaW5nIG9ubHkgdGhlc2UgdHdvIGxpbmVzIGtlZXBzXG4gICAgICAvLyB0aGUgcmVzdCBvZiBpdCBpbiBlZmZlY3QuIFJlcGxhY2luZyB0aGUgZmlsZSB3aXRoIGBtdmAgcmF0aGVyIHRoYW4gYXBwZW5kaW5nIGluIHBsYWNlIHN0b3BzXG4gICAgICAvLyBhIGNvbW1pdHRlZCBzeW1saW5rIGZyb20gcmVkaXJlY3RpbmcgdGhlIHdyaXRlIGludG8sIHNheSwgYSBwZXJzaXN0ZW50IGhvbWUgbnBtcmMuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuTlBNUkM9XCIkKG1rdGVtcCBcIiRSVU5ORVJfVEVNUC9ucG1yYy5YWFhYWFhcIilcIlxuaWYgW1sgLWUgLm5wbXJjIF1dOyB0aGVuXG4gIGdyZXAgLXZFICdecmVnaXN0cnk9fF4vL25wbVxcXFwuZmxhdHRcXFxcLnRlY2gvOl9hdXRoVG9rZW4nIC5ucG1yYyA+IFwiJE5QTVJDXCIgfHwgdHJ1ZVxuZmlcbmVjaG8gJ3JlZ2lzdHJ5PWh0dHBzOi8vbnBtLmZsYXR0LnRlY2gvJyA+PiBcIiROUE1SQ1wiXG5lY2hvICcvL25wbS5mbGF0dC50ZWNoLzpfYXV0aFRva2VuPVxcJHtUQUtVTUlfR1VBUkRfVE9LRU59JyA+PiBcIiROUE1SQ1wiXG5ybSAtZiAubnBtcmNcbm12IFwiJE5QTVJDXCIgLm5wbXJjYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAvLyAtLWZyb3plbi1sb2NrZmlsZTogYSBwbGFpbiBgYnVuIGluc3RhbGxgIHNpbGVudGx5IHJlcGFpcnMgYSBidW4ubG9jayB0aGF0IGlzIHN0YWxlIGFnYWluc3RcbiAgICAgIC8vIHBhY2thZ2UuanNvbiwgc28gQ0kgd291bGQgcnVuIGRlcGVuZGVuY3kgcmVzb2x1dGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHJldmlld2VkICgjMTEyNikuXG4gICAgICAvLyBXaXRoIE5PIGJ1bi5sb2NrIGF0IGFsbCwgLS1mcm96ZW4tbG9ja2ZpbGUgc2lsZW50bHkgaW5zdGFsbHMgZnJlc2gsIHVucGlubmVkIHJlc29sdXRpb25zXG4gICAgICAvLyAoQnVuIDEuMy4xNCBleGl0cyAwIGFuZCB3cml0ZXMgbm8gbG9ja2ZpbGUpLCBzbyBhIG1pc3NpbmcgbG9ja2ZpbGUgbXVzdCBmYWlsIGV4cGxpY2l0bHkuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgW1sgISAtZSBidW4ubG9jayBdXTsgdGhlblxuICBlY2hvIFwiOjplcnJvcjo6YnVuLmxvY2sgaXMgbWlzc2luZzsgY29tbWl0IGl0IHNvIENJIGluc3RhbGxzIHN0YXkgcmVwcm9kdWNpYmxlXCJcbiAgZXhpdCAxXG5maVxuaWYgW1sgXCIkSEFTX1RBS1VNSV9HVUFSRF9UT0tFTlwiID09IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbmVsc2VcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGVcbmZpYCxcbiAgICAgIC8vIFN0ZXAtc2NvcGVkOiBhIGpvYi1sZXZlbCB0b2tlbiB3b3VsZCBiZSByZWFkYWJsZSBieSBldmVyeSBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHQgdGhlXG4gICAgICAvLyB0b2tlbmxlc3MgcmVwbGF5IGJlbG93IHJ1bnMuXG4gICAgICBlbnY6IHsgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1J1biBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHdpdGhvdXQgcmVnaXN0cnkgY3JlZGVudGlhbHMnLFxuICAgICAgLy8gQSByZXBlYXRlZCBgYnVuIGluc3RhbGxgIGlzIGEgbm8tb3AgdGhhdCByZXBsYXlzIG5vdGhpbmcsIHNvIG5vZGVfbW9kdWxlcyBoYXMgdG8gZ28gZmlyc3QuXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxucm0gLXJmIG5vZGVfbW9kdWxlc1xuYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUke1xuICAgICAgICB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVcbiAgICAgICAgICA/IGAgfHwge1xuICBlY2hvIFwiOjp3YXJuaW5nOjpMaWZlY3ljbGUgc2NyaXB0cyBmYWlsZWQ7IGNvbXBsZXRpbmcgdGhlIGluc3RhbGwgd2l0aG91dCB0aGVtXCJcbiAgcm0gLXJmIG5vZGVfbW9kdWxlc1xuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG59YFxuICAgICAgICAgIDogJydcbiAgICAgIH1gLFxuICAgIH0sXG4gICAge1xuICAgICAgaWY6IFwiJHt7IGVudi5IQVNfVEFLVU1JX0dVQVJEX1RPS0VOID09ICd0cnVlJyB9fVwiLFxuICAgICAgbmFtZTogJ1JlbW92ZSB0aGUgZ2VuZXJhdGVkIC5ucG1yYycsXG4gICAgICAvLyBOb3RoaW5nIGFmdGVyIHRoZSBpbnN0YWxsIG5lZWRzIHRoZSBwcm94eSwgYW5kIGxlYXZpbmcgaXQgaW4gcGxhY2Ugd291bGQgYnJlYWsgdGhlIG9uZVxuICAgICAgLy8gdGhpbmcgR3VhcmQgcmVmdXNlcyB0byBzZXJ2ZTogaXQgYW5zd2VycyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1LCBzbyBhIHJlbGVhc2Ugd29ya2Zsb3dcbiAgICAgIC8vIHdob3NlIHBhY2thZ2UgbGFja3MgYW4gZXhwbGljaXQgcHVibGlzaENvbmZpZy5yZWdpc3RyeSB3b3VsZCBmYWlsIHRvIHB1Ymxpc2guXG4gICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuaWYgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAubnBtcmMgPiAvZGV2L251bGwgMj4mMTsgdGhlblxuICBnaXQgY2hlY2tvdXQgLS0gLm5wbXJjXG5lbHNlXG4gIHJtIC1mIC5ucG1yY1xuZmlgLFxuICAgIH0sXG4gIF07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCk6IFdvcmtmbG93IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHsgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBUaGUgYWN0aW9uIHJlYWRzIHRoZSBwdWxsIHJlcXVlc3QsIGFuZCBpdHMgYHdpcGAgc3VwcG9ydCBwb3N0cyBhIGNvbW1pdCBzdGF0dXM7IG5laXRoZXJcbiAgICAgICAgLy8gcGVybWlzc2lvbiBpcyBncmFudGVkIHdoZW4gdGhlIHJlcG9zaXRvcnkgcmVzdHJpY3RzIGRlZmF1bHQgd29ya2Zsb3cgcGVybWlzc2lvbnMuXG4gICAgICAgIHBlcm1pc3Npb25zOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLCBzdGF0dXNlczogJ3dyaXRlJyB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXM6IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7IHdpcDogdHJ1ZSB9LFxuICAgICAgICAgICAgZW52OiB7IEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIE1pc2VUb21sIHtcbiAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gVGhlIG9sZGVzdCBCdW4gcnVudGltZSB3YmZ5IHN1cHBvcnRzLlxuZXhwb3J0IGNvbnN0IG1pbmltdW1CdW5WZXJzaW9uID0gJzEuNC4wJztcblxuLyoqXG4gKiBFbnN1cmVzIG1pc2UudG9tbCBtYW5hZ2VzIHRoZSBOb2RlLmpzIGFuZCAod2hlbiBmbm94LnRvbWwgZXhpc3RzKSBmbm94IHRvb2wgdmVyc2lvbnMgd2hpbGVcbiAqIHByZXNlcnZpbmcgdGhlIEJ1biBwaW4gYW5kIHVucmVsYXRlZCBtaXNlIHNldHRpbmdzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNaXNlVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU1pc2VUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1pc2VUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ21pc2UudG9tbCcpO1xuICAgIC8vIEEgcGFyc2UgZmFpbHVyZSBtdXN0IGFib3J0IGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIHt9OiByZWdlbmVyYXRpbmcgZnJvbSBhbiBlbXB0eSBvYmplY3RcbiAgICAvLyB3b3VsZCBzaWxlbnRseSByZXBsYWNlIHRoZSB1c2VyJ3MgZXhpc3RpbmcgKGFsYmVpdCBicm9rZW4pIG1pc2UudG9tbC5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHBhcnNlTWlzZVRvbWwobWlzZVRvbWxQYXRoKTtcbiAgICBjb25zdCB0b29scyA9IHsgLi4uc2V0dGluZ3MudG9vbHMgfTtcblxuICAgIC8vIEVuc3VyZSBOb2RlLmpzIGlzIGFsd2F5cyBwaW5uZWQ6IGdlbmVyYXRlZCBob29rcyBhbmQgQ0kgcnVuIGBtaXNlIGluc3RhbGxgLCBhbmQgYW4gdW5waW5uZWRcbiAgICAvLyBOb2RlIHdvdWxkIGNvbWUgZnJvbSB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIG9uIFBBVEguXG4gICAgLy8gTGlmdC10aGVuLXBpbjogdGhlIGxpZnQgb25seSB0b3VjaGVzIGV4YWN0IHBpbnMgYW5kIHRoZSBwaW4gb25seSB0b3VjaGVzIHNlbGVjdG9ycywgc29cbiAgICAvLyBvcmRlcmluZyB0aGUgbGlmdCBmaXJzdCBhdm9pZHMgcmVzb2x2aW5nIGBtaXNlIGxhdGVzdCBub2RlQGx0c2AgdHdpY2UgZm9yIHVucGlubmVkIHJlcG9zLlxuICAgIHRvb2xzLm5vZGUgPSBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgJ25vZGUnLFxuICAgICAgbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcignbm9kZUBsdHMnLCB0b29scy5ub2RlLCBjb25maWcuZGlyUGF0aCksXG4gICAgICBjb25maWcuZGlyUGF0aFxuICAgICk7XG4gICAgLy8gQnVuIGlzIG5ldmVyIGFkZGVkIG9yIGNoYW5nZWQ6IGEgbWlzc2luZyBwaW4gc3RheXMgbWlzc2luZyAoZGV2ZWxvcGVycyBpbnN0YWxsIEJ1biBnbG9iYWxseVxuICAgIC8vIHRvIHJ1biB3YmZ5KSwgYW5kIGhhc1N1cHBvcnRlZEJ1blBpbigpIGhhcyBhbHJlYWR5IHJlamVjdGVkIGFueSBwaW4gdGhhdCBpcyBub3Qgb25lIGV4YWN0XG4gICAgLy8gc3VwcG9ydGVkIHZlcnNpb24uXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICB0b29scy5mbm94ID0gcGluQ29uY3JldGVUb29sVmVyc2lvbihcbiAgICAgICAgJ2Zub3gnLFxuICAgICAgICBsaWZ0T3V0ZGF0ZWRUb29sVmVyc2lvbldpdGhpbk1ham9yKCdmbm94JywgdG9vbHMuZm5veCwgY29uZmlnLmRpclBhdGgpLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKTtcbiAgICB9XG4gICAgc2V0dGluZ3MudG9vbHMgPSB0b29scztcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gQnVuIDEuNCBwcm92aWRlcyBUT01MLnN0cmluZ2lmeSBiZWZvcmUgdGhlIGFnZS1nYXRlZCBAdHlwZXMvYnVuIHZlcnNpb24gZGVjbGFyZXMgaXQuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShtaXNlVG9tbFBhdGgsIEJ1bi5UT01MLnN0cmluZ2lmeShzZXR0aW5ncykpO1xuICB9KTtcbn1cblxuLyoqIFdoZXRoZXIgbWlzZS50b21sIG9taXRzIEJ1biBvciBwaW5zIGl0IHRvIG9uZSBleGFjdCB2ZXJzaW9uIHRoYXQgd2JmeSBzdXBwb3J0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNTdXBwb3J0ZWRCdW5QaW4oZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBidW5WZXJzaW9uOiB1bmtub3duO1xuICB0cnkge1xuICAgIGJ1blZlcnNpb24gPSBwYXJzZU1pc2VUb21sKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbWlzZS50b21sJykpLnRvb2xzPy5idW47XG4gIH0gY2F0Y2gge1xuICAgIC8vIExldCBnZW5lcmF0ZU1pc2VUb21sIHJlcG9ydCB0aGUgdW5yZWFkYWJsZSBvciBtYWxmb3JtZWQgZmlsZS5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIGJ1blZlcnNpb24gPT09IHVuZGVmaW5lZCB8fFxuICAgICh0eXBlb2YgYnVuVmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgISFzZW12ZXIudmFsaWQoYnVuVmVyc2lvbikgJiYgc2VtdmVyLmd0ZShidW5WZXJzaW9uLCBtaW5pbXVtQnVuVmVyc2lvbikpXG4gICk7XG59XG5cbi8qKlxuICogTGlmdHMgYW4gZXhhY3QgdG9vbCBwaW4gYmVsb3cgdGhlIGxhdGVzdCByZXNvbHZhYmxlIHZlcnNpb24g4oCUIHdpdGhpbiB0aGUgU0FNRSBtYWpvciDigJQgdG8gdGhhdFxuICogdmVyc2lvbiAoTm9kZS5qcyByZXNvbHZlcyBhZ2FpbnN0IHRoZSBsYXRlc3QgTFRTKTogdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlIHN0YW5kYXJkIHRyYWNrcyB0aGVcbiAqIGN1cnJlbnQgdG9vbGNoYWluIGFjcm9zcyByZXBvc2l0b3JpZXMgYW5kIFJlbm92YXRlIGRvZXMgbm90IG1hbmFnZSBtaXNlLnRvbWwgcGlucywgc29cbiAqIHBhdGNoL21pbm9yIGRyaWZ0IChlLmcuIG5vZGUgMjQuMTYuMCB2cyAyNC4xOC4wLCBmbm94IDEuMzAuMCB2cyAxLjMxLjApIG5ldmVyIHNlbGYtaGVhbHMuIEEgcGluXG4gKiBvbiBhbiBvbGRlciBtYWpvciBpcyBhIGRlbGliZXJhdGUgY29tcGF0aWJpbGl0eSBjaG9pY2UgYW5kIGlzIGtlcHQsIGFzIGFyZSBub24tZXhhY3QgYW5kXG4gKiBub24tc3RyaW5nIGZvcm1zLiBXaGVuIG1pc2UgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgcGluIGlzIGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3Ioc2VsZWN0b3I6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc2VtdmVyLnZhbGlkKHZlcnNpb24pKSByZXR1cm4gdmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbWlzZScsIFsnbGF0ZXN0Jywgc2VsZWN0b3JdLCBjd2QpO1xuICByZXR1cm4gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pICYmXG4gICAgc2VtdmVyLm1ham9yKGxhdGVzdFZlcnNpb24pID09PSBzZW12ZXIubWFqb3IodmVyc2lvbikgJiZcbiAgICBzZW12ZXIubHQodmVyc2lvbiwgbGF0ZXN0VmVyc2lvbilcbiAgICA/IGxhdGVzdFZlcnNpb25cbiAgICA6IHZlcnNpb247XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW4gdW5waW5uZWQgc2VsZWN0b3IgKGBsYXRlc3RgLCBhIHJhbmdlIHN1Y2ggYXMgXCIyNFwiLCBhbiBhbGlhcywgb3IgYSBtaXNzaW5nIGVudHJ5KVxuICogd2l0aCB0aGUgbmV3ZXN0IGNvbmNyZXRlIHZlcnNpb24gbWlzZSByZXNvbHZlcyBmb3IgaXQsIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlXG4gKiBzdGFuZGFyZCByZXF1aXJlcyBjb25jcmV0ZSBwaW5zOiBDSSBpbnN0YWxscyB3aGF0ZXZlciBhbiB1bnBpbm5lZCBzZWxlY3RvciByZXNvbHZlcyB0byBhdCBydW5cbiAqIHRpbWUsIHNvIGJ1aWxkcyBkcmlmdCBhY3Jvc3MgcnVucy4gRXhhY3QgdmVyc2lvbnMgYXJlIGtlcHQgYXMtaXMsIGFuZCBub24tc3RyaW5nIGZvcm1zIChtaXNlJ3NcbiAqIGFycmF5IGFuZCBgeyB2ZXJzaW9uID0gXCLigKZcIiB9YCBmb3JtcykgYXJlIHVzZXItbWFuYWdlZCBhbmQgbGVmdCB1bnRvdWNoZWQuIFdoZW4gbWlzZSBpc1xuICogdW5hdmFpbGFibGUgb3IgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgaXMga2VwdCDigJRcbiAqIGFuIHVucGlubmVkIHRvb2wgaXMgYmV0dGVyIHRoYW4gYSBicm9rZW4gY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcGluQ29uY3JldGVUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBzZW12ZXIudmFsaWQodmVyc2lvbikpKSByZXR1cm4gdmVyc2lvbjtcbiAgLy8gTm9ybWFsaXplIHNlbGVjdG9yIGZvcm1zIGBtaXNlIGxhdGVzdGAgY2Fubm90IHJlc29sdmUgZXZlbiB0aG91Z2ggbWlzZSBjb25maWd1cmF0aW9uIGFjY2VwdHNcbiAgLy8gdGhlbTogYHByZWZpeDoyNGAgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgd2hpbGUgYDI0YCByZXNvbHZlcywgYW5kIGBsdHMvKmAgeWllbGRzIGVtcHR5IG91dHB1dFxuICAvLyB3aGlsZSBgbHRzYCByZXNvbHZlcy4gTW9kaWZpZXIgc2VsZWN0b3JzIHN1Y2ggYXMgYHN1Yi0yOmx0c2Agc3RheSB1bnJlc29sdmFibGUgYW5kIGZhbGwgYmFja1xuICAvLyB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVsb3cuXG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnID8gdmVyc2lvbi5yZXBsYWNlKC9ecHJlZml4Oi91LCAnJykucmVwbGFjZSgvXFwvXFwqJC91LCAnJykgOiB1bmRlZmluZWQ7XG4gIC8vIFdpdGggbm8gbWVhbmluZ2Z1bCBzZWxlY3RvciwgTm9kZS5qcyBwaW5zIHRvIHRoZSBsYXRlc3QgTFRTIChtYXRjaGluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzJ1xuICAvLyBgbHRzLypgIGZhbGxiYWNrKSByYXRoZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UuXG4gIGNvbnN0IGRlZmF1bHRTZWxlY3RvciA9IHRvb2wgPT09ICdub2RlJyA/ICdub2RlQGx0cycgOiB0b29sO1xuICBjb25zdCBzZWxlY3RvciA9IHJhbmdlICYmIHJhbmdlICE9PSAnbGF0ZXN0JyA/IGAke3Rvb2x9QCR7cmFuZ2V9YCA6IGRlZmF1bHRTZWxlY3RvcjtcbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSA/IHJlc29sdmVkVmVyc2lvbiA6ICh2ZXJzaW9uID8/ICdsYXRlc3QnKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNaXNlVG9tbChtaXNlVG9tbFBhdGg6IHN0cmluZyk6IE1pc2VUb21sIHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKG1pc2VUb21sUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IGEgcmVwb3NpdG9yeSB3aXRob3V0IG1pc2UudG9tbCBzdGFydHMgZnJvbSBhbiBlbXB0eSBjb25maWd1cmF0aW9uOyBhbiB1bnJlYWRhYmxlIGZpbGVcbiAgICAvLyAoZS5nLiBwZXJtaXNzaW9ucykgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggZ2VuZXJhdGVkIHNldHRpbmdzLlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHt9O1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBNaXNlVG9tbDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZywgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuLyoqXG4gKiBCdW4gcmVhZHMgcmVnaXN0cnkgc2NvcGUgbWFwcGluZ3MgZnJvbSBhIHBoeXNpY2FsIHJlcG9zaXRvcnkgLm5wbXJjIGR1cmluZyBSZW5vdmF0ZSBhcnRpZmFjdFxuICogdXBkYXRlczsgUmVub3ZhdGUncyBucG1yYyBzZXR0aW5nIGlzIHVzZWQgb25seSBieSBpdHMgZGF0YXNvdXJjZSBsYXllci4gS2VlcCB0aGUgbm9uLXNlY3JldFxuICogbWFwcGluZyBpbiByZXBvc2l0b3JpZXMgdGhhdCByZXNvbHZlIHByaXZhdGUgcGFja2FnZXMsIHdoaWxlIGF1dGhlbnRpY2F0aW9uIHJlbWFpbnMgaW4gdGhlXG4gKiBkZXZlbG9wZXIncyB+Ly5ucG1yYyBsb2NhbGx5IGFuZCBpbiB0ZW1wb3JhcnkgQ0kgb3IgTWVuZCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9BdXRob3IgPSBjb25maWdzWzBdPy5yZXBvQXV0aG9yO1xuICBpZiAocmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyJyAmJiByZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgY29uc3QgbnBtcmNQYXRocyA9IG5ldyBTZXQoY29uZmlncy5tYXAoKGNvbmZpZykgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJykpKTtcbiAgY29uc3Qgcm9vdENvbmZpZyA9IGNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaXNSb290KTtcbiAgaWYgKHJvb3RDb25maWcgJiYgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKHJvb3RDb25maWcpKSB7XG4gICAgY29uc3Qgcm9vdE5wbXJjUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcubnBtcmMnKTtcbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHJvb3ROcG1yY1BhdGgsIHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyk7XG4gICAgbnBtcmNQYXRocy5kZWxldGUocm9vdE5wbXJjUGF0aCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSBhd2FpdCByZW1vdmVOcG1yYyhucG1yY1BhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVOcG1yYyhucG1yY1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChucG1yY1BhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgaWYgKGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChucG1yY1BhdGgpKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIG5vbi1jYW5vbmljYWwgcmVwb3NpdG9yeSBucG1yYyAke25wbXJjUGF0aH0uYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0OiAnYnJhbmNoJztcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnO1xuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGluY2x1ZGU6IHN0cmluZ1tdO1xuICAgICAgZXhjbHVkZTogc3RyaW5nW107XG4gICAgfTtcbiAgfTtcbiAgcnVsZXM6IChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0aW9uJyB8ICdub25fZmFzdF9mb3J3YXJkJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBib29sZWFuO1xuICAgICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiB7XG4gICAgICAgICAgICBjb250ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogbnVtYmVyO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiBudW1iZXI7XG4gICAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXTtcbiAgICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogYm9vbGVhbjtcbiAgICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ107XG4gICAgICAgIH07XG4gICAgICB9XG4gIClbXTtcbiAgYnlwYXNzX2FjdG9yczoge1xuICAgIGFjdG9yX2lkOiBudW1iZXI7XG4gICAgYWN0b3JfdHlwZTogJ1RlYW0nO1xuICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JztcbiAgfVtdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNvdXJjZV90eXBlPzogc3RyaW5nO1xufVxuXG5jb25zdCBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSID0ge1xuICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCA9IDE1XzM2ODtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3NlbWFudGljLXByIC8gc2VtYW50aWMtcHInLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ25vbl9mYXN0X2ZvcndhcmQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IDAsXG4gICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXSxcbiAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBmYWxzZSxcbiAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBieXBhc3NfYWN0b3JzOiBbXG4gICAge1xuICAgICAgYWN0b3JfaWQ6IDE3Xzc3N180OTUsXG4gICAgICBhY3Rvcl90eXBlOiAnVGVhbScsXG4gICAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicpIHJldHVybjtcbiAgICAvLyBUaGUgcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gaG9zdHMgd29ya2Zsb3dfY2FsbCBkZWZpbml0aW9ucywgc28gdGhlXG4gICAgLy8gUHJvdGVjdCBtYWluIHJ1bGVzZXQgd291bGQgcmVxdWlyZSB0ZXN0L3NlbWFudGljLXByIGNoZWNrcyB0aGF0IG5ldmVyIHJ1biB0aGVyZS5cbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8oY29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIFJlcG9zaXRvcnkgcnVsZXNldHMgcmVxdWlyZSBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB3aGljaCBsb2NhbCBydW5zXG4gICAgICAvLyBtYXkgbm90IGhhdmUgZXZlbiB3aGVuIGZpbGUtZ2VuZXJhdGlvbiBhbmQgcHVzaGVzIGFyZSBhbGxvd2VkLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgY29uc3QgcnVsZXNldCA9IHN0cnVjdHVyZWRDbG9uZShQUk9URUNUX01BSU5fUlVMRVNFVCk7XG4gIGlmIChjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlc2V0LnJ1bGVzKSB7XG4gICAgICBpZiAocnVsZS50eXBlICE9PSAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGNvbnRleHQgaXMgYDxjYWxsZXIgam9iIGlkPiAvIDxyZXVzYWJsZSBqb2IgaWQ+YCBvZiB0aGUgd2JmeS1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbC5cbiAgICAgIHJ1bGUucGFyYW1ldGVycy5yZXF1aXJlZF9zdGF0dXNfY2hlY2tzLnB1c2goe1xuICAgICAgICBjb250ZXh0OiAndGVzdC1ydXN0IC8gdGVzdC1ydXN0JyxcbiAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydWxlc2V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0ID0gYXdhaXQgZmluZFJlcG9zaXRvcnlSdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBydWxlc2V0Lm5hbWUpO1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXRJZCA9IGV4aXN0aW5nUnVsZXNldD8uaWQ7XG5cbiAgYXdhaXQgd2l0aFJldHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChleGlzdGluZ1J1bGVzZXRJZCkge1xuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgcnVsZXNldF9pZDogZXhpc3RpbmdSdWxlc2V0SWQsXG4gICAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5UnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdpdGhSZXRyeShcbiAgICAoKSA9PlxuICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgaW5jbHVkZXNfcGFyZW50czogZmFsc2UsXG4gICAgICAgIHRhcmdldHM6ICdicmFuY2gnLFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSksXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHJ1bGVzZXRzID0gcmVzcG9uc2UuZGF0YTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzZXRzKSkgcmV0dXJuO1xuICByZXR1cm4gcnVsZXNldHMuZmluZCgocnVsZXNldCkgPT4gcnVsZXNldC5uYW1lID09PSBydWxlc2V0TmFtZSAmJiBydWxlc2V0LnNvdXJjZV90eXBlID09PSAnUmVwb3NpdG9yeScpO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwR2l0SHViU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbjwhLS0gV3JpdGUgZm9yIGEgcmV2aWV3ZXIgd2hvIGhhcyBub3QgZm9sbG93ZWQgdGhlIHdvcmsuIFNjYWxlIGVhY2ggc2VjdGlvbiB0byB0aGUgY2hhbmdlOiBhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lLiBEZWxldGUgdGhpcyBjb21tZW50IGFuZCB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYmVsb3cuIC0tPlxuXG4jIyBXaHlcblxuPCEtLSBUaGUgcHJvYmxlbSwgd2l0aCB0aGUgbnVtYmVycyBvciBvYnNlcnZhdGlvbnMgYmVoaW5kIGl0LCBhbmQgd2h5IHRoaXMgYXBwcm9hY2ggb3ZlciB0aGUgYWx0ZXJuYXRpdmVzLiAtLT5cblxuIyMgQ3VzdG9tZXIgU3VtbWFyeVxuXG48IS0tIEJlaGF2aW9yLCB3b3JrZmxvdywgb3IgdXNlci12aXNpYmxlIGNoYW5nZXMsIHdyaXR0ZW4gZm9yIHJlYWRlcnMgd2hvIGtub3cgbm90aGluZyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24uIC0tPlxuXG4jIyBUZWNobmljYWwgU3VtbWFyeVxuXG48IS0tIERlY2lzaW9ucyBhbmQgdGhlaXIgcmVhc29ucywgZGF0YSBmbG93LCB3aGVyZSB0byBsb29rICh0aGUgZmlsZXMgdGhhdCBtYXR0ZXIgbW9zdCksIGFuZCB3aGF0IHRvIGNoZWNrIGhhcmRlc3Q6IHRoZSBwYXJ0cyB3aG9zZSBjb3JyZWN0bmVzcyBpcyBhcmd1ZWQgcmF0aGVyIHRoYW4gcHJvdmVuLiAtLT5cblxuIyMgVGVzdGluZ1xuXG48IS0tIENvbW1hbmRzIHJ1biwgdGVzdHMgYWRkZWQsIGFuZCB3aGF0IHdhcyBOT1QgZXhlcmNpc2VkIGFuZCB3aHkuIC0tPlxuXG4jIyBOb3Rlc1xuXG48IS0tIEtub3duIGxpbWl0YXRpb25zLCBjb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24sIGZvbGxvdy11cCB3b3JrLiBEZWxldGUgdGhpcyBzZWN0aW9uIGlmIHRoZXJlIGlzIG5vbmUuIC0tPlxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9idWcubWQnOiBgXG4tLS1cbm5hbWU6IEJ1ZyAvIFByb2JsZW1cbmFib3V0OiBTb21ldGhpbmcgYmVoYXZlcyB3cm9uZ2x5XG50aXRsZTogJ2ZpeDogJ1xubGFiZWxzOiAndDogZml4IDpidWc6J1xuLS0tXG5cbjwhLS0gS2VlcCBQcm9ibGVtIGFuZCBQcm9wb3NhbDsgZGVsZXRlIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuIERlbGV0ZSB0aGVzZSBjb21tZW50cy4gLS0+XG5cbiMjIFByb2JsZW1cblxuPCEtLSBXaGF0IGhhcHBlbnMsIGFuZCB3aGF0IHNob3VsZCBoYXBwZW4gaW5zdGVhZC4gLS0+XG5cbiMjIEV2aWRlbmNlXG5cbjwhLS0gUmVwcm9kdWN0aW9uIHN0ZXBzLCBsb2dzLCBydW4gSURzLCBvciBsaW5rcy4gLS0+XG5cbiMjIEltcGFjdFxuXG48IS0tIFdobyBvciB3aGF0IGlzIGFmZmVjdGVkLCBhbmQgaG93IGJhZGx5LiAtLT5cblxuIyMgUHJvcG9zYWxcblxuPCEtLSBUaGUgZml4IHlvdSBoYXZlIGluIG1pbmQsIGFuZCB0aGUgcm9vdCBjYXVzZSBpZiBrbm93bi4gLS0+XG5gLnRyaW0oKSxcbiAgLy8gVGhlIGhlYWRpbmdzIG1pcnJvciB0aGUgc3BlYy1ib29zdGVyIGNoZWNrbGlzdCBpbiBXaWxsQm9vc3Rlci9yZXZpZXctYm9vc3Rlcjsgb25seVxuICAvLyBcIlNjb3BlIGFuZCBub24tZ29hbHNcIiBpcyBtb3ZlZCBkb3duIHNvIHRoZSB0aHJlZSBzZWN0aW9ucyBhIHNtYWxsIGNoYW5nZSBuZWVkcyBzdGF5IGNvbnRpZ3VvdXMuXG4gICdJU1NVRV9URU1QTEFURS9jaGFuZ2UubWQnOiBgXG4tLS1cbm5hbWU6IENoYW5nZSAvIEZlYXR1cmVcbmFib3V0OiBQcm9wb3NlIGEgY2hhbmdlIHRoYXQgYSB0aGlyZCBwYXJ0eSBjb3VsZCBpbXBsZW1lbnQgd2l0aG91dCBhc2tpbmcgYSBxdWVzdGlvblxudGl0bGU6ICdmZWF0OiAnXG5sYWJlbHM6ICd0OiBmZWF0IDpzcGFya2xlczonXG4tLS1cblxuPCEtLSBLZWVwIHRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBmb3IgYW55IGNoYW5nZSBhbmQgYWRkIHRoZSBvdGhlcnMgYXMgdGhlIGNoYW5nZSBncm93czsgYSBsYXJnZSBjaGFuZ2UgZmlsbHMgYWxsIG9mIHRoZW0gKHNwZWMtYm9vc3RlciByZXZpZXdzIGFnYWluc3QgdGhpcyBsaXN0KS4gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuIyMgQmFja2dyb3VuZCBhbmQgZ29hbFxuXG48IS0tIFRoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCwgZm9yIHdob20sIGFuZCB3aGF0IG91dGNvbWUgY291bnRzIGFzIHN1Y2Nlc3MuIC0tPlxuXG4jIyBCZWhhdmlvclxuXG48IS0tIEV2ZXJ5IG9ic2VydmFibGUgYmVoYXZpb3I6IGlucHV0cywgb3V0cHV0cywgZXJyb3IgY2FzZXMsIGVkZ2UgY2FzZXMsIGludGVyYWN0aW9ucyB3aXRoIGV4aXN0aW5nIGJlaGF2aW9yLiAtLT5cblxuIyMgQWNjZXB0YW5jZSBjcml0ZXJpYVxuXG48IS0tIENoZWNrYWJsZSBjb25kaXRpb25zIHRoYXQgZGVjaWRlIHdoZXRoZXIgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRvbmUuIC0tPlxuXG4jIyBTY29wZSBhbmQgbm9uLWdvYWxzXG5cbjwhLS0gV2hhdCB0aGUgY2hhbmdlIGNvdmVycyBhbmQgd2hhdCBpdCBkZWxpYmVyYXRlbHkgbGVhdmVzIG91dC4gLS0+XG5cbiMjIERlc2lnbiBjb25zdHJhaW50c1xuXG48IS0tIERhdGEsIEFQSSwgc2NoZW1hLCBVSSwgY29uZmlndXJhdGlvbiwgbmFtaW5nLCBhbmQgdGhlIGV4aXN0aW5nIGNvZGUgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgZml0OyBldmVyeXRoaW5nIGVsc2UgaXMgbGVmdCB0byB0aGUgaW1wbGVtZW50ZXIuIC0tPlxuXG4jIyBDb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb25cblxuPCEtLSBFeGlzdGluZyBkYXRhLCB1c2VycywgY2FsbGVycywgb3IgY29uZmlndXJhdGlvbnMgYWZmZWN0ZWQsIGFuZCBob3cgdGhlIHRyYW5zaXRpb24gaGFwcGVucy4gLS0+XG5cbiMjIFZlcmlmaWNhdGlvblxuXG48IS0tIEhvdyB0aGUgY2hhbmdlIGlzIHRlc3RlZCBvciBkZW1vbnN0cmF0ZWQsIGluY2x1ZGluZyB3aGF0IG5lZWRzIG5vIHRlc3QgYW5kIHdoeS4gLS0+XG5cbiMjIE9wZW4gcXVlc3Rpb25zXG5cbjwhLS0gVW5kZWNpZGVkIHBvaW50cywgZWFjaCB3aXRoIGl0cyBvcHRpb25zLiBFbXB0eSBvbmNlIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGltcGxlbWVudGFibGUuIC0tPlxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9jb25maWcueW1sJzogJ2JsYW5rX2lzc3Vlc19lbmFibGVkOiB0cnVlJyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUZW1wbGF0ZXMgYXJlIHJlcG9zaXRvcnktbGV2ZWwgZmlsZXMsIHNvIGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIG11c3Qgbm90IGNyZWF0ZSB0aGVtLlxuICAgIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvIHx8ICFjb25maWcuaXNSb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3QgYWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm4gPSBTdHJpbmcucmF3YCg/OldpbGxCb29zdGVyfFdpbGxCb29zdGVyTGFiKWA7XG5jb25zdCBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zID0gW1xuICBuZXcgUmVnRXhwKGBeJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKGBeZ2l0aHViOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9odHRwczovL2dpdGh1YlxcXFwuY29tLyR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/c3NoOi8vZ2l0QGdpdGh1YlxcXFwuY29tWzovXSR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsXG4gICAgJ3UnXG4gICksXG4gIG5ldyBSZWdFeHAoYF4oPzpnaXRcXFxcKyk/Z2l0QGdpdGh1YlxcXFwuY29tOiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzpcXFxcLmdpdCk/KD86I1xcXFxTKyk/JGAsICd1JyksXG5dO1xuXG5pbnRlcmZhY2UgRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2Uge1xuICBkZXBlbmRlbmN5TmFtZTogc3RyaW5nO1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIHNlY3Rpb25OYW1lOiAodHlwZW9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cylbbnVtYmVyXTtcbiAgc3BlY2lmaWVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzID0gY29uZmlncy5mbGF0TWFwKGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyk7XG4gIGlmIChkaXNhbGxvd2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXRhaWxzID0gZGlzYWxsb3dlZFNvdXJjZXNcbiAgICAubWFwKFxuICAgICAgKHsgZGVwZW5kZW5jeU5hbWUsIGRpclBhdGgsIHNlY3Rpb25OYW1lLCBzcGVjaWZpZXIgfSkgPT5cbiAgICAgICAgYC0gJHtwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpfTogJHtzZWN0aW9uTmFtZX0uJHtkZXBlbmRlbmN5TmFtZX0gdXNlcyAke3NwZWNpZmllcn1gXG4gICAgKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYERpc2FsbG93ZWQgR2l0IGRlcGVuZGVuY3kgc291cmNlcyBmb3VuZC5cXG5Pbmx5IFdpbGxCb29zdGVyIGFuZCBXaWxsQm9vc3RlckxhYiBHaXRIdWIgZGVwZW5kZW5jaWVzIGFyZSBhbGxvd2VkLlxcbiR7ZGV0YWlsc31gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIGlmICghcGFja2FnZUpzb24pIHJldHVybiBbXTtcblxuICBjb25zdCBkaXNhbGxvd2VkU291cmNlczogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb25OYW1lIG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBwYWNrYWdlSnNvbltzZWN0aW9uTmFtZV07XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCBzcGVjaWZpZXJdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXNwZWNpZmllcikgY29udGludWU7XG4gICAgICBpZiAoIWlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcbiAgICAgIGlmIChpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuXG4gICAgICBkaXNhbGxvd2VkU291cmNlcy5wdXNoKHtcbiAgICAgICAgZGVwZW5kZW5jeU5hbWUsXG4gICAgICAgIGRpclBhdGg6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBzZWN0aW9uTmFtZSxcbiAgICAgICAgc3BlY2lmaWVyLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXNhbGxvd2VkU291cmNlcztcbn1cblxuZnVuY3Rpb24gaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86Yml0YnVja2V0fGdpc3R8Z2l0aHVifGdpdGxhYik6L3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15odHRwcz86XFwvXFwvKD86Yml0YnVja2V0XFwub3JnfGdpdGh1YlxcLmNvbXxnaXRsYWJcXC5jb20pXFwvL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpodHRwcz98c3NoKTpcXC9cXC9cXFMrXFwuZ2l0KD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXlteQFxcc10rQFteOlxcc10rOlxcUysoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQ6JykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0KycpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ3NzaDovL2dpdEAnKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bYS16QS1aMC05XVtcXHcuLV0qXFwvW1xcdy4tXSsoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuZnVuY3Rpb24gaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3Qoc3BlY2lmaWVyKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvciwgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeyBub3JtYWxpemVCdW5Mb2NrZmlsZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhDaGFrcmFUb2FzdGVyIH0gZnJvbSAnLi9maXhlcnMvY2hha3JhVG9hc3Rlci5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCwgcmVhZEJ1bkdsb2JhbFN0b3JlLCByZXNvbHZlQnVuR2xvYmFsU3RvcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVGbm94VG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9mbm94VG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzLCByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dsb2JhbFJlbGVhc2VBZ2VHYXRlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9vayB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uLCBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhSYWlsd2F5aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUsIHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb25jLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBlbnN1cmVXYkVudkRlZmluaXRpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3diRW52LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9zZWxmQ29udGFpbmVkV29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWlzZVRvbWwsIGhhc1N1cHBvcnRlZEJ1blBpbiwgbWluaW11bUJ1blZlcnNpb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbWlzZVRvbWwuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbnBtcmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyB9IGZyb20gJy4vZ2l0aHViL3J1bGVzZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZywgZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvciB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tICcuL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VUeXBlU2NyaXB0QXBpIH0gZnJvbSAnLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uLCBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuLyoqXG4gKiBBcHBsaWVzIG9ubHkgdGhlIGdsb2JhbCByZWxlYXNlLWFnZSBnYXRlLCB3aXRob3V0IHRvdWNoaW5nIGFueSByZXBvc2l0b3J5LiBTcGVsbGVkIG91dCBpbiBmdWxsXG4gKiByYXRoZXIgdGhhbiBzaG9ydGVuZWQgKGUuZy4gYGdhdGVgKSBiZWNhdXNlIHRoZSBkZWZhdWx0IGNvbW1hbmQgdGFrZXMgcG9zaXRpb25hbCBwYXRoczogYSBzaG9ydFxuICogbmFtZSB3b3VsZCBzd2FsbG93IGEgZGlyZWN0b3J5IHRoYXQgaGFwcGVucyB0byBzaGFyZSBpdC5cbiAqL1xuY29uc3QgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQgPSAnYXBwbHktcmVsZWFzZS1hZ2UtZ2F0ZSc7XG4vKiogU2FtZSBuYW1pbmcgcmF0aW9uYWxlIGFzIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLiAqL1xuY29uc3QgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCA9ICdnZW5lcmF0ZS11c2VyLWFnZW50LWNvbmZpZ3MnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKFxuICAgICAgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQsXG4gICAgICBcIkFwcGx5IG9ubHkgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoaXMgbWFjaGluZSdzIGdsb2JhbCBwYWNrYWdlLW1hbmFnZXIgY29uZmlnc1wiXG4gICAgKVxuICAgIC5jb21tYW5kKFxuICAgICAgZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCxcbiAgICAgIFwiT3ZlcndyaXRlIHRoaXMgdXNlcidzIGFnZW50IGluc3RydWN0aW9uIGZpbGVzICh+Ly5jb2RleC9BR0VOVFMubWQsIH4vLmNsYXVkZS9DTEFVREUubWQsIH4vLmdlbWluaS9HRU1JTkkubWQpIHdpdGggdGhlIG9yZ2FuaXphdGlvbidzIGZpeGVkIGNvbnRlbnQgYW5kIG1lcmdlIHRoZSBvcmdhbml6YXRpb24ncyBzZXR0aW5ncyBpbnRvIH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uXCJcbiAgICApXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGZvcmNlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbHkgd2JmeSBldmVuIHdoZW4gdGhlIHJlcG9zaXRvcnkgYWxyZWFkeSByZWNvcmRzIHRoaXMgd2JmeSB2ZXJzaW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdmJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnU2tpcCBhZGRpbmcgbWFuYWdlZCBkZXBlbmRlbmNpZXMgYW5kIHRoZSBsaW5rZXIgcHJvYmUgKHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlZnJlc2hpbmcgdGhlIGxvY2tmaWxlIHN0aWxsIHJ1bnMpJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0V2JmeVZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG5cbiAgLy8gRGVsaWJlcmF0ZWx5IGJlZm9yZSB0aGUgQnVuIGNoZWNrIGluIHdpbGxib29zdGVyaWZ5UGF0aHMoKTogdGhlIGdhdGUgbXVzdCBiZSBhcHBsaWFibGUgb24gYVxuICAvLyBtYWNoaW5lIHdob3NlIEJ1biBpcyBvdXRkYXRlZCwgd2hpY2ggaXMgZXhhY3RseSBhIG1hY2hpbmUgdGhhdCBzdGlsbCBuZWVkcyBnYXRpbmcuXG4gIGlmIChhcmd2Ll9bMF0gPT09IGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kKSB7XG4gICAgaWYgKCFlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhcmd2Ll9bMF0gPT09IGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQpIHtcbiAgICBpZiAoIShhd2FpdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKSkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICB0cnkge1xuICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gYXdhaXQgd2lsbGJvb3N0ZXJpZnlQYXRocyhhcmd2LnBhdGhzIGFzIHN0cmluZ1tdLCBhcmd2LnNraXBEZXBzLCBhcmd2LmZvcmNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBUaGUgVHlwZVNjcmlwdCBjb21waWxlciBzZXJ2ZXIgc3Bhd25lZCBmb3IgQVNUIHBhcnNpbmcga2VlcHMgYW4gb3BlbiBJUENcbiAgICAvLyBjaGFubmVsIHRoYXQgd291bGQgb3RoZXJ3aXNlIHByZXZlbnQgdGhlIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gICAgYXdhaXQgZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3aWxsYm9vc3RlcmlmeVBhdGhzKHBhdGhzOiBzdHJpbmdbXSwgc2tpcERlcHM6IGJvb2xlYW4sIGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIEJlZm9yZSBhbnl0aGluZyBlbHNlIOKAlCBldmVuIHRoZSBCdW4gY2hlY2sgYmVsb3c6IHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIGdsb2JhbFxuICAvLyBwYWNrYWdlLW1hbmFnZXIgY29uZmlncyBtdXN0IHJlY2VpdmUgdGhlIG9yZydzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IG9uIEVWRVJZIHJ1bixcbiAgLy8gYmVjYXVzZSB0aGV5IGFyZSB3aGF0IGd1YXJkcyBicmFuZC1uZXcgbG9jYWwgcHJvamVjdHMgdGhhdCBoYXZlIG5vIHdiZnktZ2VuZXJhdGVkIHJlcG9zaXRvcnlcbiAgLy8gY29uZmlnIHlldCwgYW5kIHRoYXQgcHJvdGVjdGlvbiBtdXN0IHdvcmsgYmVmb3JlIHRoZSBzdXBwb3J0ZWQtdmVyc2lvbiBjaGVjay5cbiAgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk7XG5cbiAgLy8gd2JmeSBtYW5hZ2VzIHJlcG9zaXRvcmllcyB0aHJvdWdoIEJ1biArIG1pc2UgYW5kIHVzZXMgQnVuIDEuNCBydW50aW1lIEFQSXMuIFRoZSB2ZXJzaW9uIGZsb29yXG4gIC8vIGFsc28gZW5zdXJlcyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIG9wdGlvbnMgcHJvZHVjZSB0aGUgaW5zdGFsbCBsYXlvdXQgd2JmeSB2YWxpZGF0ZXMuIEl0XG4gIC8vIHN0YXlzIHVuY29uZGl0aW9uYWwgZXZlbiB0aG91Z2ggdGhlIGFscmVhZHktYXBwbGllZCBjaGVjayBiZWxvdyBjYW4gbWFrZSBhIHJ1biBhIG5vLW9wOiBhblxuICAvLyBvdXRkYXRlZCBCdW4gaXMgYSBicm9rZW4gZW52aXJvbm1lbnQgd2JmeSBtdXN0IHJlcG9ydCwgYW5kIGhpZGluZyBpdCB3aGVuZXZlciBldmVyeSBwYXRoXG4gIC8vIGhhcHBlbnMgdG8gYmUgc2tpcHBlZCB3b3VsZCBzdXJmYWNlIGl0IG9ubHkgbGF0ZXIuXG4gIGNvbnN0IGJ1blZlcnNpb24gPSBCdW4udmVyc2lvbjtcbiAgaWYgKEJ1bi5zZW12ZXIub3JkZXIoYnVuVmVyc2lvbiwgbWluaW11bUJ1blZlcnNpb24pIDwgMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHdiZnkgcmVxdWlyZXMgQnVuID49ICR7bWluaW11bUJ1blZlcnNpb259IChmb3VuZCAke2J1blZlcnNpb259KS4gVXBncmFkZSBCdW4gYW5kIHJlLXJ1bi5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEEgYC1kaXJ0eS1sb2NhbGAgbGFiZWwgaWRlbnRpZmllcyBhbiBlZGl0ZWQgY2hlY2tvdXQsIHdob3NlIG5leHQgYnVpbGQgcHJvZHVjZXMgZGlmZmVyZW50IGZpbGVzXG4gIC8vIHVuZGVyIHRoZSBzYW1lIGxhYmVsLCBzbyBzdWNoIGEgcnVuIGlzIG5ldmVyIHRyZWF0ZWQgYXMgYWxyZWFkeSBhcHBsaWVkLlxuICBjb25zdCB2ZXJzaW9uTGFiZWwgPSBnZXRXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gIGNvbnN0IHNraXBwYWJsZVZlcnNpb25MYWJlbCA9XG4gICAgIWZvcmNlICYmIHZlcnNpb25MYWJlbCAmJiAhdmVyc2lvbkxhYmVsLmVuZHNXaXRoKCctZGlydHktbG9jYWwnKSA/IHZlcnNpb25MYWJlbCA6IHVuZGVmaW5lZDtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBpbnB1dERpclBhdGggb2YgcGF0aHMpIHtcbiAgICAvLyBOb3JtYWxpemUgb25jZSBhdCB0aGUgQ0xJIGJvdW5kYXJ5LiBHZW5lcmF0b3JzIHVzZSBkaXJQYXRoIGZvciBjd2QgYW5kIGJhc2VuYW1lIGRlY2lzaW9ucztcbiAgICAvLyBsZWF2aW5nIHRoZSBzdXBwb3J0ZWQgZGVmYXVsdCBgLmAgdW5yZXNvbHZlZCB3b3VsZCBnZW5lcmF0ZSBhbiBpbnZhbGlkIHBhY2thZ2UgbmFtZSBvZiBgLmAuXG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoaW5wdXREaXJQYXRoKTtcbiAgICAvLyBDb25maW5lIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlIHRvIHRoaXMgcmVwb3NpdG9yeSAoc2VlIGZzVXRpbC5nZW5lcmF0ZUZpbGUpLiBTZXQgQkVGT1JFIGFueVxuICAgIC8vIGZpeGVyIHdyaXRlcywgYW5kIHJlc2V0IG9uIGV2ZXJ5IGl0ZXJhdGlvbiBzbyBhIG11bHRpLXBhdGggcnVuIG5ldmVyIGtlZXBzIHRoZSBwcmV2aW91cyByb290LlxuICAgIGZzVXRpbC5zZXRSb290RGlyUGF0aChmcy5leGlzdHNTeW5jKHJvb3REaXJQYXRoKSA/IHJvb3REaXJQYXRoIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIEEgcmVwb3NpdG9yeSBwcmVjb25kaXRpb24sIGNoZWNrZWQgYmVmb3JlIHRoZSBhbHJlYWR5LWFwcGxpZWQgc2tpcCBiZWxvdyBhbmQgYmVmb3JlIGFueSBmaWxlXG4gICAgLy8gaXMgd3JpdHRlbjogYW4gdW5zdXBwb3J0ZWQgcGluIG11c3QgYmUgcmVwb3J0ZWQgb24gZXZlcnkgcnVuIGFuZCBtdXN0IG5vdCBzdGFtcCB0aGUgYmFkZ2UuXG4gICAgaWYgKCFoYXNTdXBwb3J0ZWRCdW5QaW4ocm9vdERpclBhdGgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU2tpcCAke3Jvb3REaXJQYXRofTogbWlzZS50b21sIG11c3QgcGluIEJ1biB0byBvbmUgZXhhY3QgdmVyc2lvbiA+PSAke21pbmltdW1CdW5WZXJzaW9ufSBvciBvbWl0IGl0LiBVcGRhdGUgdGhlIHBpbiBhbmQgcmUtcnVuLmBcbiAgICAgICk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgYmFkZ2UgcmVjb3JkcyB0aGUgYnVpbGQgdGhhdCBnZW5lcmF0ZWQgdGhlIHJlcG9zaXRvcnkncyBjb25maWd1cmF0aW9uLCBzbyB0aGUgc2FtZSBidWlsZFxuICAgIC8vIHdvdWxkIG9ubHkgcmV3cml0ZSB3aGF0IGlzIGFscmVhZHkgdGhlcmUuIFNraXBwaW5nIGlzIGEgZGVsaWJlcmF0ZSB0cmFkZTogdGhlIHBhcnRzIG9mIGEgcnVuXG4gICAgLy8gdGhhdCBkZXBlbmQgb24gc3RhdGUgT1VUU0lERSB0aGUgcmVwb3NpdG9yeSAoR2l0SHViIHNldHRpbmdzLCBkZXBlbmRlbmN5IHVwZGF0ZXMsIHRoZSBmZXRjaGVkXG4gICAgLy8gLmdpdGlnbm9yZSkgZG8gZ2V0IHNraXBwZWQgdG9vLCB3aGljaCBpcyB3aGF0IC0tZm9yY2UgaXMgZm9yLlxuICAgIGlmIChza2lwcGFibGVWZXJzaW9uTGFiZWwgJiYgKGF3YWl0IHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChyb290RGlyUGF0aCkpID09PSBza2lwcGFibGVWZXJzaW9uTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCAke3Jvb3REaXJQYXRofTogd2JmeSAke3NraXBwYWJsZVZlcnNpb25MYWJlbH0gaXMgYWxyZWFkeSBhcHBsaWVkLiBQYXNzIC0tZm9yY2UgdG8gcmUtYXBwbHkuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHBhY2thZ2VzU3ViRGlyUGF0aHMgPSBkaXJlbnRzXG4gICAgICAuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpXG4gICAgICAubWFwKChkKSA9PiBwYXRoLnJlc29sdmUocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcbiAgICAvLyBBbHNvIGNvdmVyIHdvcmtzcGFjZXMgZGVjbGFyZWQgb3V0c2lkZSBwYWNrYWdlcy8qIChlLmcuIGFwcHMvKik6IHRoZXkgcmVjZWl2ZSB0aGUgc2FtZVxuICAgIC8vIG1hbmFnZWQgY29uZmlncyAodHNjb25maWcuanNvbiwgcGFja2FnZS5qc29uIGNvbnZlbnRpb25zLCDigKYpIGFzIHBhY2thZ2VzLyogY2hpbGRyZW4uXG4gICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID1cbiAgICAgIGlnbm9yZUVycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddXG4gICAgICApID8/IHt9O1xuICAgIGNvbnN0IHdvcmtzcGFjZVN1YkRpclBhdGhzID0gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoe1xuICAgICAgZGlyUGF0aDogcm9vdERpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IHBhY2thZ2VzU3ViRGlyUGF0aHMuc29tZSgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IFsuLi5uZXcgU2V0KFsuLi5wYWNrYWdlc1N1YkRpclBhdGhzLCAuLi53b3Jrc3BhY2VTdWJEaXJQYXRoc10pXS5maWx0ZXIoXG4gICAgICAoc3ViRGlyUGF0aCkgPT4gc3ViRGlyUGF0aCAhPT0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoKVxuICAgICk7XG5cbiAgICAvLyBSZWZ1c2VkIHdyaXRlcyBvbiBjb3JlIG1hbmFnZWQgZmlsZXMgd291bGQgbGVhdmUgdGhlIHJlcG9zaXRvcnkgcGFydGlhbGx5IHVwZGF0ZWQsIHNvIHNraXBcbiAgICAvLyBpdCBCRUZPUkUgYW55IG11dGF0aW9uIHdoZW4gb25lIG9mIHRoZW0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gICAgY29uc3QgbWFuYWdlZEZpbGVQYXRocyA9IFtcbiAgICAgIC4uLlsnLmdpdGF0dHJpYnV0ZXMnLCAnYnVuZmlnLnRvbWwnLCAnbGVmdGhvb2sueW1sJywgJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIG5hbWUpXG4gICAgICApLFxuICAgICAgLi4uc3ViRGlyUGF0aHMuZmxhdE1hcCgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgWydwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT4gcGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsIG5hbWUpKVxuICAgICAgKSxcbiAgICBdO1xuICAgIGNvbnN0IHdyaXRhYmxlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFuYWdlZEZpbGVQYXRocy5tYXAoKGZpbGVQYXRoKSA9PiBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpXG4gICAgKTtcbiAgICBpZiAod3JpdGFibGVSZXN1bHRzLmluY2x1ZGVzKGZhbHNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogYSBtYW5hZ2VkIGNvbmZpZyBmaWxlIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmxpZ2h0RXJyb3JzID0gW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10uZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gW107XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKHsgcGFja2FnZUpzb24gfSk7XG4gICAgICAgIHJldHVybiBlcnJvciA/IFtgJHtkaXJQYXRofTogJHtlcnJvcn1gXSA6IFtdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbYCR7cGFja2FnZUpzb25QYXRofSBpcyBpbnZhbGlkYF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHByZWZsaWdodEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OlxcbiR7cHJlZmxpZ2h0RXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTGV0IGdldFBhY2thZ2VDb25maWcgZGVyaXZlIGlzUm9vdCBmb3IgdGhlIGVudHJ5IHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgaXMgYVxuICAgIC8vIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIHRhcmdldCBtdXN0IGtlZXAgaXRzIGNoaWxkIGNsYXNzaWZpY2F0aW9uLCBzbyBmb3JjaW5nXG4gICAgLy8gYGlzUm9vdDogdHJ1ZWAgaGVyZSB3b3VsZCBhcHBseSByb290LW9ubHkgcHJvY2Vzc2luZyAobGVmdGhvb2sgaW5zdGFsbCwgcm9vdCB0c2NvbmZpZyxcbiAgICAvLyBBR0VOVFMubWQsIOKApikgdG8gYSBzdWJwYWNrYWdlLlxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlIChpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKikgaXMgYSBjaGlsZFxuICAgIC8vIHBhY2thZ2U7IHRoZSBwYWNrYWdlcy8qIGhldXJpc3RpYyBpbnNpZGUgZ2V0UGFja2FnZUNvbmZpZyB3b3VsZCBtaXNjbGFzc2lmeSBhcHBzLyogYXMgcm9vdHMuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHsgaXNSb290OiBmYWxzZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCA9IHN1YkRpclBhdGhzLmZpbmQoXG4gICAgICAoc3ViRGlyUGF0aCwgaW5kZXgpID0+ICFudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzW2luZGV4XSAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgKTtcbiAgICBpZiAoaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiAke2ludmFsaWRTdWJQYWNrYWdlRGlyUGF0aH0vcGFja2FnZS5qc29uIGlzIGludmFsaWQuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuICAgIC8vIFRoZSBtYW5hZ2VkIGlnbm9yZSBydWxlIGlzIHVuYW5jaG9yZWQsIHNvIGEgbmVzdGVkIGNvcHkgKGUuZy4gd29ya2Vycy9hcGkvLmVudi5jbG91ZGZsYXJlKSBpc1xuICAgIC8vIGFzIG11Y2ggYSBsZWFrIGFzIGEgcm9vdCBvbmU7IHRoZSB3aWxkY2FyZCBwYXRoc3BlYyBjb3ZlcnMgZXZlcnkgZGVwdGggaW4gb25lIHF1ZXJ5LlxuICAgIGNvbnN0IHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMgPSBhbGxQYWNrYWdlQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5pc0Nsb3VkZmxhcmUpXG4gICAgICA/IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICAgICAnZ2l0JyxcbiAgICAgICAgICBbJy1jJywgJ2NvcmUucXVvdGVQYXRoPWZhbHNlJywgJ2xzLWZpbGVzJywgJy0tJywgJy5lbnYuY2xvdWRmbGFyZScsICcqLy5lbnYuY2xvdWRmbGFyZSddLFxuICAgICAgICAgIHJvb3RDb25maWcuZGlyUGF0aFxuICAgICAgICApXG4gICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpKVxuICAgICAgOiBbXTtcbiAgICBpZiAodHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU0VDVVJJVFkgRVJST1I6IENsb3VkZmxhcmUgY3JlZGVudGlhbHMgbXVzdCBiZSB1bnRyYWNrZWQuIFJlbW92ZSAke3RyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMuam9pbihcbiAgICAgICAgICAnLCAnXG4gICAgICAgICl9IGZyb20gR2l0LCBwdXJnZSB0aGUgdG9rZW4gZnJvbSBoaXN0b3J5LCBhbmQgcm90YXRlIENMT1VERkxBUkVfQVBJX1RPS0VOIGJlZm9yZSByZXJ1bm5pbmcgd2JmeS5gXG4gICAgICApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGF3YWl0IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gTWFuYWdlZCByZXBvc2l0b3JpZXMgdXNlIEJ1biB3aXRoIG1pc2UgKGFuZCBvcHRpb25hbGx5IGZub3gpLlxuICAgIGNvbnN0IHByZXZpb3VzQnVuR2xvYmFsU3RvcmUgPSByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGgpO1xuICAgIC8vIFJvb3QtbGV2ZWwgaW5zdGFsbCBsYXlvdXQgbXVzdCBjb3ZlciB3b3Jrc3BhY2UgYXBwcyB0b286IE5leHQuanMgY29tbW9ubHkgbGl2ZXMgdW5kZXJcbiAgICAvLyBwYWNrYWdlcy8qIG9yIGFwcHMvKiB3aGlsZSBidW5maWcudG9tbCBleGlzdHMgb25seSBhdCB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgIGNvbnN0IHVzZUdsb2JhbFN0b3JlID0gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKGFsbFBhY2thZ2VDb25maWdzLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCBza2lwRGVwcyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBnZW5lcmF0ZU1pc2VUb21sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZyk7XG4gICAgLy8gUnVuIGFmdGVyIGdlbmVyYXRlRm5veFRvbWwgc28gaXRzIHRyYW5zYWN0aW9uYWwgcmVjaXBpZW50IHN5bmMgY2Fubm90IHJlc3RvcmUgYSBzbmFwc2hvdFxuICAgIC8vIG92ZXIgZGVmaW5pdGlvbnMgaW5zZXJ0ZWQgaGVyZS5cbiAgICBhd2FpdCBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICAvLyBwcm9taXNlUG9vbC5ydW4gcmVzb2x2ZXMgd2hlbiBhIHRhc2sgU1RBUlRTLCBzbyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGlzIG5vdFxuICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgb24gZGlzayB5ZXQ7IHRoZSBwcm9iZSBiZWxvdyBtdXN0IG5vdCB2YWxpZGF0ZSBhIHN0YWxlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgLy8gVGhlIGxheW91dCBtdXN0IGJlIHZlcmlmaWVkIGluc3RhbGxhYmxlIEJFRk9SRSBhbnkgYGJ1biBhZGRgIG11dGF0ZXMgcGFja2FnZS5qc29uIGZpbGVzOlxuICAgIC8vIHBlci1wYWNrYWdlIGluc3RhbGxzIHRvbGVyYXRlIGZhaWx1cmVzIChzcGF3blN5bmMgZGlzY2FyZHMgdGhlaXIgc3RhdHVzKSwgc28gYSBsYXlvdXQgdGhhdFxuICAgIC8vIGNhbm5vdCBpbnN0YWxsIHdvdWxkIHNpbGVudGx5IGRyb3AgZXZlcnkgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAvLyBBIGRvY3Mtb25seSByZXBvc2l0b3J5IGhhcyBubyBtYW5pZmVzdCB0byBwcm9iZSBvbiBpdHMgZmlyc3QgcnVuOyBnZW5lcmF0ZVBhY2thZ2VKc29uIGJlbG93XG4gICAgLy8gY3JlYXRlcyBpdCBiZWZvcmUgdGhlIGF1dGhvcml0YXRpdmUgcmVmcmVzaEJ1bkxvY2sgY2hlY2suXG4gICAgaWYgKFxuICAgICAgIXNraXBEZXBzICYmXG4gICAgICByb290Q29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICFwcm9iZUlzb2xhdGVkQnVuSW5zdGFsbChyb290RGlyUGF0aCwgcm9vdENvbmZpZywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgdXNlR2xvYmFsU3RvcmUpXG4gICAgKSB7XG4gICAgICAvLyByZWZyZXNoQnVuTG9jayBiZWxvdyBpcyB0aGUgYXV0aG9yaXR5IG9uIHdoZXRoZXIgdGhlIGZpbmFsIGluc3RhbGwgZmFpbGVkLlxuICAgICAgY29uc29sZS53YXJuKGBidW4gaW5zdGFsbCBjdXJyZW50bHkgZmFpbHMgaW4gJHtyb290RGlyUGF0aH0gdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgLy8gT3RoZXIgb3duZXJzIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZSB3b3JrZmxvd3MgKHRoZWlyIHNlY3JldHMgYW5kIHJ1bm5lcnNcbiAgICAvLyBkbyBub3QgZXhpc3QgdGhlcmUpLCBzbyBhbnkgb3RoZXIgR2l0SHViLWhvc3RlZCBOb2RlLmpzIHJlcG9zaXRvcnkgZ2V0cyBzZWxmLWNvbnRhaW5lZFxuICAgIC8vIHdvcmtmbG93cyBpbnN0ZWFkIOKAlCBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXIncyBpZGVudGl0eS5cbiAgICAvLyByb290Q29uZmlnLmlzUm9vdDogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gKGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmApIGtlZXBzXG4gICAgLy8gaXNSb290IGZhbHNlLCBhbmQgR2l0SHViIGlnbm9yZXMgd29ya2Zsb3cgZmlsZXMgbmVzdGVkIHVuZGVyIGEgcGFja2FnZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA9XG4gICAgICAhc2hvdWxkUnVuV29ya2Zsb3dzICYmXG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgISFyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSAmJlxuICAgICAgcm9vdENvbmZpZy5pc1Jvb3Q7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZml4UmFpbHdheWlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICAuLi4oc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA/IFtnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3Mocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLy8gR2l0IGhvb2tzIGFyZSByZXBvc2l0b3J5LWxldmVsIHN0YXRlOiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCB3cml0ZSBhXG4gICAgICAvLyBjaGlsZCBsZWZ0aG9vay55bWwgb3IgcmVwbGFjZSB0aGUgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyBob29rIGluc3RhbGxhdGlvbi5cbiAgICAgIC4uLihyb290Q29uZmlnLmlzUm9vdCA/IFtnZW5lcmF0ZUxlZnRob29rKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIC8vIEFmdGVyIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgKGFuZCBpdHMgcG9vbGVkIHdyaXRlcykgc28gdGhlIGluc3RydWN0aW9uIGZpbGVzIGRlc2NyaWJlIHRoZVxuICAgIC8vIGZpbmFsaXplZCB3b3JrZmxvdyBmaWxlcyBpbnN0ZWFkIG9mIGxhZ2dpbmcgb25lIHJ1biBiZWhpbmQuXG4gICAgYXdhaXQgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBza2lwRGVwcyk7XG5cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJiBkb2VzQ29udGFpbkpzT3JUcyhyb290Q29uZmlnKSkge1xuICAgICAgICAvLyBNb25vcmVwbyB2ZXJpZmljYXRpb24gY2FuIGludm9rZSBveGxpbnQgZnJvbSBldmVyeSB3b3Jrc3BhY2UuIEdpdmVcbiAgICAgICAgLy8gbm9uLWNvZGUgcGFja2FnZXMgYSBsb2NhbCBjb25maWcgc28gb3hsaW50IGRvZXMgbm90IGNsaW1iIHRvIHRoZVxuICAgICAgICAvLyByb290IGNvbmZpZyBhbmQgcmVqZWN0IHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMgZnJvbSBhIHBhY2thZ2UgY3dkLlxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgLy8gUnVuIGFmdGVyIGV2ZXJ5IHBvb2xlZCBnZW5lcmF0b3Igd3JpdGUgc28gbm9ybWFsaXphdGlvbiBjYW5ub3Qgb3ZlcndyaXRlIGEgY29uY3VycmVudFxuICAgIC8vIHVwZGF0ZSwgYW5kIGJlZm9yZSBjbGVhbnVwIHNvIGZvcm1hdHRlciBtZXRhZGF0YSBjYWNoZXMgb2JzZXJ2ZSB0aGUgY2hhbmdlZCBmaWxlcy5cbiAgICByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMocm9vdERpclBhdGgpO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIHRyeSB7XG4gICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgZmFpbGVkIGluc3RhbGwgbXVzdCBmYWlsIHRoZSBDTEk6IGV4aXRpbmcgMCB3aXRoIGEgc3RhbGUgb3IgbWlzc2luZyBCdW4gbG9ja2ZpbGUgd291bGRcbiAgICAgIC8vIGhpZGUgYSBicm9rZW4gbWFuYWdlZCBjb25maWd1cmF0aW9uLlxuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlZnJlc2ggdGhlIEJ1biBsb2NrZmlsZTonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJ1biB3cml0ZXMgYnVuLmxvY2sgYmVmb3JlIGxpZmVjeWNsZSBzY3JpcHRzLCBzbyBhIGZhaWxlZCBpbnN0YWxsIGNhbiBzdGlsbCBsZWF2ZSBHdWFyZFxuICAgICAgLy8gVVJMcyBiZWhpbmQuIE5vcm1hbGl6ZSBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgb3V0cHV0IHdpdGhvdXQgcmVwbGFjaW5nIHRoZSBpbnN0YWxsIGVycm9yLlxuICAgICAgY29uc3Qgbm9ybWFsaXplZExvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgICAgIGlmIChub3JtYWxpemVkTG9ja2ZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICR7bm9ybWFsaXplZExvY2tmaWxlUGF0aH0gdG8ga2VlcCBpdCByZWdpc3RyeS1hZ25vc3RpYy5gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIG5vcm1hbGl6ZSB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICBzcGF3blN5bmMoJ2J1bicsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnO1xufVxuXG4vKipcbiAqIFByb2JlcyBgYnVuIGluc3RhbGxgIHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuIEFuIGluY29tcGF0aWJpbGl0eSBtdXN0IGJlIGZpeGVkIGluIHRoZVxuICogcmVwb3NpdG9yeSBvciBpbiB3YmZ5J3MgbWFuYWdlZCBsaXN0cywgbmV2ZXIgYnkgc3dpdGNoaW5nIHRoZSBsaW5rZXIuIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVcbiAqIGluc3RhbGwgZmFpbHMuXG4gKi9cbmZ1bmN0aW9uIHByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICB1c2VHbG9iYWxTdG9yZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIC8vIEEgbGF5b3V0IHN3aXRjaCBtdXN0IHByb2JlIGZyb20gYSBjbGVhbiB0cmVlIGJlY2F1c2UgQnVuIGRvZXMgbm90IHJlbW92ZSB0aGUgcHJldmlvdXMgbGF5b3V0J3MgbGVmdG92ZXJzLlxuICBpZiAocHJldmlvdXNHbG9iYWxTdG9yZSAhPT0gdXNlR2xvYmFsU3RvcmUpIHtcbiAgICByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aCwgcm9vdENvbmZpZyk7XG4gIH1cbiAgLy8gUmV0cnkgb25jZSBzbyBhIHRyYW5zaWVudCBmYWlsdXJlIChyZWdpc3RyeSBoaWNjdXAsIGZsYWt5IGxpZmVjeWNsZSBzY3JpcHQpIGRvZXMgbm90XG4gIC8vIG1hc3F1ZXJhZGUgYXMgYSBsYXlvdXQgaW5jb21wYXRpYmlsaXR5LlxuICBpZiAoc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBDbGVhbiB1cCB0aGUgZmFpbGVkIGF0dGVtcHQgc28gbGF0ZXIgaW5zdGFsbHMgZG8gbm90IHJ1biBvbiBhIHBvbGx1dGVkIHRyZWUuXG4gIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aDogc3RyaW5nLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIENvdmVyIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZTogbGVmdG92ZXJzIGNhbiBrZWVwIHBoYW50b20gZGVwZW5kZW5jaWVzIHJlc29sdmFibGUuXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aHMgPSBbXG4gICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJyksXG4gICAgLi4uWy4uLmdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLnZhbHVlcygpXS5tYXAoKHdvcmtzcGFjZURpcikgPT5cbiAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgd29ya3NwYWNlRGlyLCAnbm9kZV9tb2R1bGVzJylcbiAgICApLFxuICBdO1xuICAvLyBOZXZlciBkZWxldGUgdGhyb3VnaCBhIHdvcmtzcGFjZSBzeW1saW5rIHRoYXQgZXNjYXBlcyB0aGlzIHJlcG9zaXRvcnkuXG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNQYXRoIG9mIG5vZGVNb2R1bGVzUGF0aHMpIHtcbiAgICBjb25zdCByZWFsUGFyZW50RGlyUGF0aCA9IGlnbm9yZUVycm9yKCgpID0+IGZzLnJlYWxwYXRoU3luYyhwYXRoLmRpcm5hbWUobm9kZU1vZHVsZXNQYXRoKSkpO1xuICAgIGlmIChcbiAgICAgICFyZWFsUGFyZW50RGlyUGF0aCB8fFxuICAgICAgKHJlYWxQYXJlbnREaXJQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiYgIXJlYWxQYXJlbnREaXJQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoLCAxKTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzQyLDQzLDQ0LDQ1LDQ2LDQ3XSwibWFwcGluZ3MiOiIreUJBQUEsZUFBc0IsR0FBTSxFQUFxQyxDQUMvRCxPQUFPLElBQUksUUFBUyxHQUFZLFdBQVcsRUFBUyxDQUFZLENBQUMsQ0FDbkUsQ0NjQSxTQUFnQixFQUFlLEVBQTRCLENBQ3pELEdBQUksQ0FDRixPQUFPLEVBQUcsQ0FDWixNQUFRLENBRVIsQ0FDRixDQWFBLGVBQXNCLEdBQW9CLEVBQThDLENBQ3RGLEdBQUksQ0FDRixPQUFPLE1BQU0sRUFBRyxDQUNsQixNQUFRLENBRVIsQ0FDRixDQXFDQSxlQUFzQixHQUNwQixFQUNBLENBQ0UsY0FDQSxjQUNBLGFBQWEsRUFDYixjQUNB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
556
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInBhcnNlSnNvbmMiLCJmc3AiLCJyZWxlYXNlQWdlR2F0ZS5kYXlzIiwicmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMiLCJuZXdDb250ZW50IiwiY29tbW9uQ29udGVudCIsIm5ld0NvbnRlbnQiLCJjaGlsZF9wcm9jZXNzIiwiY29tbW9uQ29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJzb3J0T2JqZWN0S2V5cyIsImdpdEhvb2tzIiwiZGV0ZWN0TmV3bGluZSIsImRlcGVuZGVuY3lTZWN0aW9uS2V5cyIsImNvcmUiLCJtYW5hZ2VkQ29uZmlnQmxvY2tzIiwiZ2V0Q29uZmlnQ29udGVudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9qc29uY1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3N0cmluZ1V0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTYzNTFiOTJmODI2MTU2ZjQvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3diRW52LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWlzZVRvbWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9ucG1yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICAgKiBGb3IgZXhhbXBsZSwgYHJldHJ5Q291bnQ6IDNgIHJ1bnMgdGhlIGZ1bmN0aW9uIGF0IG1vc3QgMyB0aW1lczogMSBpbml0aWFsIGF0dGVtcHQgYW5kIHVwIHRvIDIgcmV0cmllcy5cbiAgICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbi8qKiBUaGUgYHdvcmtzcGFjZXNgIGZpZWxkIG9mIGEgcm9vdCBwYWNrYWdlLmpzb246IHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZXNEZWNsYXJhdGlvbiA9IHN0cmluZ1tdIHwgeyBwYWNrYWdlcz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSB0aGF0IEJ1biB3b3VsZCBsaW5rXG4gKiBmb3IgdGhlIGdpdmVuIHJvb3QgcGFja2FnZS5qc29uIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbi4gQ2Fub25pY2FsaXplcyB0aGUgZGVjbGFyZWQgcGF0dGVybnNcbiAqIChzZWUgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMpLCBkcm9wcyBwYXR0ZXJucyBlc2NhcGluZyB0aGUgcmVwb3NpdG9yeSAoc2VlXG4gKiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4pLCBhbmQgcmVzb2x2ZXMgdGhlIHJlc3Qgd2l0aCBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhcbiAgICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybilcbiAgICApLFxuICAgIHJvb3REaXJQYXRoXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHRvIHBhY2thZ2UuanNvbiBwYXRocyBtaW1pY2tpbmcgQnVuJ3MgU0VRVUVOVElBTCBldmFsdWF0aW9uLFxuICogZGVyaXZlZCBlbXBpcmljYWxseSB3aXRoIEJ1biAxLjMuMTQgKGZpeHR1cmUgcmVwb3Mgb2JzZXJ2ZWQgdmlhIGBidW4gaW5zdGFsbCAtLWxvY2tmaWxlLW9ubHlgO1xuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDQgLyBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNSk6XG4gKiAxLiBQYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyIGludG8gYW4gYWNjdW11bGF0aW5nIHNldDogYSBwb3NpdGl2ZSBnbG9iXG4gKiAgICBwYXR0ZXJuIGFkZHMgZXZlcnkgcGFja2FnZS5qc29uIGl0IG1hdGNoZXM7IGEgbmVnYXRpb24gZGVsZXRlcyBpdHMgbWF0Y2hlcyBmcm9tIHRoZSBzZXRcbiAqICAgIGFjY3VtdWxhdGVkIFNPIEZBUiwgc28gYSBsYXRlciBwb3NpdGl2ZSByZS1hZGRzIHRoZW0gKGBbXCIhYXBwcy9leGNsdWRlZFwiLCBcImFwcHMvKlwiXWAgbGlua3NcbiAqICAgIGFwcHMvZXhjbHVkZWQsIHdoaWxlIGBbXCJhcHBzLypcIiwgXCIhYXBwcy9leGNsdWRlZFwiXWAgZG9lcyBub3QpLlxuICogMi4gQSBuZWdhdGlvbiB3aG9zZSBub3JtYWxpemVkIGJvZHkgaGFzIEVYQUNUTFkgdHdvIHNlZ21lbnRzLCB3aG9zZSBsYXN0IHNlZ21lbnQgaXMgYSBzdGFyLXJ1blxuICogICAgKGAqYCwgYCoqYCwgYCoqKmAsIOKApiksIGFuZCB3aG9zZSBmaXJzdCBzZWdtZW50IGlzIE5PVCBpdHNlbGYgYSBzdGFyLXJ1biBmaXJzdCBzZWVkcyB0aGVcbiAqICAgIGltcGxpY2l0IGJhc2VsaW5lIGludG8gdGhlIHNldCwgdGhlbiBkZWxldGVzIGl0cyBvd24gbWF0Y2hlczogYSBgKipgIGxhc3Qgc2VnbWVudCBzZWVkc1xuICogICAgYCoqYCAocGFja2FnZXMgYXQgYW55IGRlcHRoKSwgYW55IG90aGVyIHN0YXItcnVuIHNlZWRzIGAqXFwvKmAgKGRlcHRoIDIgb25seSkuIFNlZWRpbmdcbiAqICAgIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnMgKGBbXCJhcHBzLypcIiwgXCIhb3RoZXIvKlwiXWAgbGlua3MgZXZlcnkgZGVwdGgtMlxuICogICAgcGFja2FnZSBvdXRzaWRlIG90aGVyLykuIE5vIG90aGVyIG5lZ2F0aW9uIHNoYXBlIHNlZWRzOiBgISpgLCBgISoqYCwgYCEqXFwvKmAsIGAhKlxcLyoqYCxcbiAqICAgIGAhKipcXC8qYCwgYCFhL2IvKmAsIGAhYS9iLyoqYCwgYCFkaXJgLCBhbmQgYCFkaXIvKnhgIGVhY2ggbGluayBub3RoaW5nIG9uIHRoZWlyIG93bi5cbiAqICAgIGA/YCwgYnJhY2UsIGFuZCBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmUgRVJSQVRJQ0FMTFkgKGBbXCIhb3RoZXIvP1wiXWAgbGlua3NcbiAqICAgIHBhY2thZ2VzL2EgeWV0IG5vdCB0aGUgZXF1YWxseSBiYXNlbGluZS1zaGFwZWQgb3RoZXIveXksIGBbXCIhb3RoZXIvPz9cIl1gIGxpbmtzIG5vdGhpbmcsIGFuZFxuICogICAgYFtcIiE/Lz9cIl1gIGxpbmtzIHRoZSB2ZXJ5IG90aGVyL3ggaXQgbWF0Y2hlcyksIHNvIG5vIGNvbnNpc3RlbnQgcnVsZSBjYW4gbW9kZWwgdGhlbTsgdGhleVxuICogICAgYXJlIGRlbGliZXJhdGVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nIOKAlCBzZWUgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSBhbmQgIzEwMDUuXG4gKiAzLiBBIG5vbi1nbG9iIHBvc2l0aXZlIHBhdHRlcm4gUElOUyBpdHMgZGlyZWN0b3J5OiBpdCBzdGF5cyBhIHdvcmtzcGFjZSByZWdhcmRsZXNzIG9mIHdoZXJlIGFcbiAqICAgIG1hdGNoaW5nIG5lZ2F0aW9uIGFwcGVhcnMgKGBbXCJvdGhlci94XCIsIFwiIW90aGVyL3hcIl1gIGFuZCBgW1wiIW90aGVyL3hcIiwgXCJvdGhlci94XCJdYCBib3RoXG4gKiAgICBsaW5rIG90aGVyL3gpLlxuICogNC4gYCoqYCBtYXRjaGVzIHplcm8gb3IgbW9yZSBwYXRoIHNlZ21lbnRzIChgW1wiYXBwcy8qKlwiXWAgbGlua3MgdGhlIHBhY2thZ2UgYXQgYXBwcyBpdHNlbGYsIGFuZFxuICogICAgYCFhcHBzLyoqYCBkZWxldGVzIGl0KSwgbWF0Y2hpbmcgZmFzdC1nbG9iJ3MgZmlsZS1nbG9iIHNlbWFudGljcy5cbiAqIERvIG5vdCBhcHBseSBnbG9iSWdub3JlIGhlcmU6IHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIGRlZmluZWQgc29sZWx5IGJ5IHRoZSBkZWNsYXJlZCBwYXR0ZXJucyxcbiAqIGFuZCBzb3VyY2Utc2Nhbm5pbmcgaWdub3JlcyBzdWNoIGFzIGBidWlsZGAgb3IgYGRpc3RgIHdvdWxkIGhpZGUgbGVnaXRpbWF0ZWx5IG5hbWVkIHdvcmtzcGFjZVxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJuczogc3RyaW5nW10sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlIHN0b3BzIEdMT0IgdHJhdmVyc2FsIHRocm91Z2ggc3ltbGlua3MsIGJ1dCBhIG5vbi1nbG9iIHBhdHRlcm5cbiAgLy8gbmFtaW5nIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBgbGlua2VkYCB3aXRoIGBsaW5rZWQgLT4gLi4vb3RoZXItcmVwb2ApIHN0aWxsIG1hdGNoZXMg4oCUXG4gIC8vIGZhc3QtZ2xvYiByZXNvbHZlcyBzdGF0aWMgcGF0dGVybnMgd2l0aCBkaXJlY3QgZnMgY2hlY2tzLCBhbmQgQnVuIGRvZXMgbGluayBzdWNoIGEgd29ya3NwYWNlLlxuICAvLyBEZWxpYmVyYXRlbHkgZGl2ZXJnZSBmcm9tIEJ1biB0aGVyZTogY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgYW5kIG1hbmlmZXN0XG4gIC8vIHJld3JpdGluZyB3b3VsZCBvdGhlcndpc2UgZGVsZXRlIGFuZCByZXdyaXRlIGZpbGVzIGluIEFOT1RIRVIgcmVwb3NpdG9yeSB0aHJvdWdoIHRoZSBzeW1saW5rLFxuICAvLyBzbyBrZWVwIG9ubHkgbWFuaWZlc3RzIHdob3NlIHJlYWwgcGF0aCBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkncyByZWFsIHJvb3QuIFNjYW5uaW5nIGVhY2hcbiAgLy8gcGF0dGVybiBzZXBhcmF0ZWx5IChubyBjcm9zcy1wYXR0ZXJuIGNhY2hpbmcpIGlzIGRlbGliZXJhdGU6IGRlY2xhcmF0aW9ucyBob2xkIGEgaGFuZGZ1bCBvZlxuICAvLyBwYXR0ZXJucywgc28gYSBjYWNoZSB3b3VsZCBjb21wbGljYXRlIHRoaXMgc2hhcmVkIGNvZGUgd2l0aG91dCBtZWFzdXJhYmxlIGdhaW4uXG4gIGNvbnN0IGdsb2JNYW5pZmVzdFBhdGhzID0gKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICAvLyBCdW4gbGlua3MgZG90LWRpcmVjdG9yeSBwYWNrYWdlcyBvbmx5IHRocm91Z2ggZnVsbHkgc3RhdGljIHBhdHRlcm5zOiB3aXRoIEJ1biAxLjMuMTQsXG4gICAgLy8gYC5oaWRkZW4veGAgcGlucyB0aGUgcGFja2FnZSB3aGlsZSBgLmhpZGRlbi8qYCwgYC4qLypgLCBhbmQgYCoqYCBhbGwgbGluayBub3RoaW5nIHVuZGVyXG4gICAgLy8gLmhpZGRlbiDigJQgZXZlbiB3aGVuIHRoZSBkb3R0ZWQgc2VnbWVudCBpdHNlbGYgaXMgbGl0ZXJhbCDigJQgc28gYW55IGR5bmFtaWMgcGF0dGVybiBtdXN0XG4gICAgLy8gZHJvcCBtYXRjaGVzIGNvbnRhaW5pbmcgYSBkb3QtbGVkIHNlZ21lbnQgKGZhc3QtZ2xvYidzIGBkb3Q6IGZhbHNlYCBvbmx5IGNvdmVycyBzZWdtZW50c1xuICAgIC8vIGEgd2lsZGNhcmQgbWF0Y2hlcykuXG4gICAgY29uc3QgZXhjbHVkZXNEb3RTZWdtZW50cyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybik7XG4gICAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgICAvLyBmYXN0LWdsb2IgMy4zLjMgcmV0dXJucyBubyBtYXRjaGVzIGZvciBmaWxlIGdsb2JzIHdpdGggYSBsb25lLWA/YCBzZWdtZW50IChlLmcuXG4gICAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCksIGFsdGhvdWdoIG1pY3JvbWF0Y2ggbWF0Y2hlcyB0aGVtIGFuZCBCdW4gMS4zLjE0IGxpbmtzIHN1Y2hcbiAgICAvLyB3b3Jrc3BhY2VzOyBmb3IgYD9gLWNhcnJ5aW5nIHBhdHRlcm5zIG9ubHkgKGEgZGlyZWN0b3J5IGdsb2IgZm9yIGUuZy4gYCoqYCB3b3VsZCBzY2FuIGV2ZXJ5XG4gICAgLy8gZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmcgdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpclxuICAgIC8vIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYiwgd2hpY2ggc3RheXMgbmVjZXNzYXJ5IGZvciBgKipgJ3MgemVyby1zZWdtZW50XG4gICAgLy8gbWF0Y2hlcyDigJQgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGRpciBpdHNlbGYgYXMgYSBkaXJlY3RvcnkuXG4gICAgY29uc3QgbWFuaWZlc3RQYXRocyA9IG5ldyBTZXQoZmcuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKHBhdHRlcm4sICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpKTtcbiAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnPycpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZmcuZ2xvYlN5bmMocGF0dGVybiwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpIG1hbmlmZXN0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCwgYnV0IEJ1biBuZXZlciB0cmVhdHMgdGhlXG4gICAgLy8gbW9ub3JlcG8gcm9vdCBhcyBpdHMgb3duIHdvcmtzcGFjZS5cbiAgICByZXR1cm4gWy4uLm1hbmlmZXN0UGF0aHNdLmZpbHRlcihcbiAgICAgIChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCAhPT0gJ3BhY2thZ2UuanNvbicgJiZcbiAgICAgICAgKCFleGNsdWRlc0RvdFNlZ21lbnRzIHx8ICFwYWNrYWdlSnNvblBhdGguc3BsaXQoJy8nKS5zb21lKChzZWdtZW50KSA9PiBzZWdtZW50LnN0YXJ0c1dpdGgoJy4nKSkpICYmXG4gICAgICAgIGlzSW5zaWRlUmVhbFJvb3QocGFja2FnZUpzb25QYXRoKVxuICAgICk7XG4gIH07XG4gIGxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNJbnNpZGVSZWFsUm9vdCA9IChwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZWFsUm9vdERpclBhdGggPz89IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpO1xuICAgICAgLy8gQ29tcGFyZSB3aG9sZSBzZWdtZW50cywgbm90IGEgYC4uYCBwcmVmaXg6IGEgZGlyZWN0b3J5IGxpdGVyYWxseSBuYW1lZCBlLmcuIGAuLnBrZ2AgaXNcbiAgICAgIC8vIGluc2lkZSB0aGUgcm9vdCwgd2hpbGUgYSBwbGFpbiBzdGFydHNXaXRoKCcuLicpIHdvdWxkIG1pc3JlYWQgaXQgYXMgcGFyZW50IHRyYXZlcnNhbC5cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIG1hbmlmZXN0IHRoYXQgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGwgaXMgbm90IGEgd29ya3NwYWNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWNjdW11bGF0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwaW5uZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKGJhc2VsaW5lR2xvYikpIGFjY3VtdWxhdGVkUGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIGFjY3VtdWxhdGVkUGF0aHMuZGVsZXRlKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuQm9keSkgPyBhY2N1bXVsYXRlZFBhdGhzIDogcGlubmVkUGF0aHM7XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIHtcbiAgICAgICAgdGFyZ2V0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uYWNjdW11bGF0ZWRQYXRocywgLi4ucGlubmVkUGF0aHNdKV0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBzZWVkcyBCdW4ncyBpbXBsaWNpdCB3b3Jrc3BhY2UgYmFzZWxpbmU6IGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZVxuICogbmVnYXRpb24gb2YgdGhlIHNlZWRpbmcgc2hhcGUgKHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyBydWxlIDIpLiBNZWFzdXJlZCB3aXRoIEJ1blxuICogMS4zLjE0LCBzZWVkaW5nIGlzIHBlci1uZWdhdGlvbiBhbmQgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJuczsgY29uY3JldGUgb3JcbiAqIG1peGVkLWxpdGVyYWwgbGFzdCBzZWdtZW50cyAoYCFhcHBzL2V4Y2x1ZGVkYCwgYCFhcHBzLypkYCkgbmV2ZXIgc2VlZCwgYW5kIGA/YCwgYnJhY2UsIGFuZFxuICogY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlZCBpbmNvbnNpc3RlbnRseSBhY3Jvc3MgZml4dHVyZXMgKHNvbWV0aW1lcyBkcm9wcGluZyBldmVuXG4gKiB1bnJlbGF0ZWQgc2libGluZyB3b3Jrc3BhY2VzKSwgc28gdGhleSBhcmUgY29uc2VydmF0aXZlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZzsgc2VlXG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIGdldFNlZWRlZEJhc2VsaW5lR2xvYihub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpKSkgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyB3aXRob3V0IEJ1bidzIG5vLW9wIG9uZXMgKGBcIlwiYCwgYSBsb25lIGBcIiFcImAsIGFuZCBgXCIuXCJgKSwgd2hpY2ggQnVuXG4gKiBpZ25vcmVzIGVudGlyZWx5IOKAlCBhIGxvbmUgYFwiIVwiYCBtdXN0IG5vdCBhY3RpdmF0ZSB0aGUgbmVnYXRpdmUtb25seSBpbXBsaWNpdCBiYXNlbGluZSwgYW5kIGBcIlwiYFxuICogbXVzdCBub3QgbWFrZSB0aGUgcmVwb3NpdG9yeSByb290IGl0c2VsZiBhIGRpc2NvdmVyZWQgd29ya3NwYWNlLiBEZWNsYXJhdGlvbiBvcmRlciBhbmRcbiAqIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGUgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKVxuICAgIC5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIC8vIEJ1biBhcHBsaWVzIGxlYWRpbmctYmFuZyBQQVJJVFkgKHZlcmlmaWVkIHdpdGggQnVuIDEuMy4xNCk6IGAhIXBgIGlzIHRoZSBwb3NpdGl2ZSBgcGBcbiAgICAgIC8vIGFuZCBgISEhcGAgdGhlIG5lZ2F0aW9uIGAhcGAsIHNvIGNhbm9uaWNhbGl6ZSB0byBhdCBtb3N0IG9uZSBiYW5nLlxuICAgICAgY29uc3QgYmFuZ0NvdW50ID0gL14hKi91LmV4ZWMod29ya3NwYWNlUGF0dGVybikhWzBdLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zbGljZShiYW5nQ291bnQpO1xuICAgICAgcmV0dXJuIGJhbmdDb3VudCAlIDIgPT09IDEgPyBgISR7cGF0dGVybkJvZHl9YCA6IHBhdHRlcm5Cb2R5O1xuICAgIH0pXG4gICAgLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICAgICAgLy8gTm9ybWFsaXplIHNvIHNwZWxsaW5ncyBsaWtlIGAuL2AsIGAuLy5gLCBhbmQgYCEuL2AgYXJlIHJlY29nbml6ZWQgYXMgdGhlIHNhbWUgbm8tb3BzXG4gICAgICAvLyAocGF0aC5wb3NpeC5ub3JtYWxpemUoJycpID09PSAnLicsIHNvIHRoZSBlbXB0eSBwYXR0ZXJuIGlzIGNvdmVyZWQgdG9vKS5cbiAgICAgIHJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keSkgIT09ICcuJztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgYC8vYCwgcmVzb2x2ZXMgYC4vYCwgYW5kIHN0cmlwcyB0cmFpbGluZyBzbGFzaGVzLCBtaXJyb3JpbmcgQnVuJ3MgcGF0aCBoYW5kbGluZy5cbiAqIEEgcHVyZSBzdGFyLXJ1biBzZWdtZW50IG9mIHRocmVlIG9yIG1vcmUgc3RhcnMgYmVoYXZlcyBsaWtlIGAqYCB1bmRlciBCdW4gKGAhb3RoZXIvKioqYFxuICogbWF0Y2hlcyBvdGhlci94KSBidXQgbm90IHVuZGVyIGZhc3QtZ2xvYiwgc28gY2Fub25pY2FsaXplIGl0IHRvIGAqYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5wb3NpeFxuICAgIC5ub3JtYWxpemUocGF0dGVybkJvZHkpXG4gICAgLnJlcGxhY2UoL1xcLyskL3UsICcnKVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gKC9eXFwqezMsfSQvdS50ZXN0KHNlZ21lbnQpID8gJyonIDogc2VnbWVudCkpXG4gICAgLmpvaW4oJy8nKTtcbn1cblxuLyoqIFRoZSBpbXBsaWNpdCBiYXNlbGluZSBnbG9iIGEgbmVnYXRpb24gc2VlZHMgdW5kZXIgQnVuJ3MgcnVsZSAyIGFib3ZlLCBvciB1bmRlZmluZWQgaWYgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWVkZWRCYXNlbGluZUdsb2IobmVnYXRpb25Cb2R5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWdtZW50cyA9IG5lZ2F0aW9uQm9keS5zcGxpdCgnLycpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbZmlyc3RTZWdtZW50LCBsYXN0U2VnbWVudF0gPSBzZWdtZW50cyBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoIS9eXFwqKyQvdS50ZXN0KGxhc3RTZWdtZW50KSB8fCAvXlxcKiskL3UudGVzdChmaXJzdFNlZ21lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbGFzdFNlZ21lbnQgPT09ICcqKicgPyAnKionIDogJyovKic7XG59XG5cbi8qKiBXb3Jrc3BhY2UgcGF0dGVybnMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkod29ya3NwYWNlcykpIHJldHVybiB3b3Jrc3BhY2VzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzPy5wYWNrYWdlcykgPyB3b3Jrc3BhY2VzLnBhY2thZ2VzIDogW107XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJuIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6XG4gKiBhYnNvbHV0ZSBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBvcGVyYXRlXG4gKiBvbiBhbm90aGVyIHJlcG9zaXRvcnkncyBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICByZXR1cm4gIXBhdGgucG9zaXguaXNBYnNvbHV0ZShwYXR0ZXJuQm9keSkgJiYgIXBhdHRlcm5Cb2R5LnNwbGl0KCcvJykuaW5jbHVkZXMoJy4uJyk7XG59XG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogQW5jaG9yZWQgdG8gYFwiLCBgIHNvIG9ubHkgYSByZWdpc3RyeSBlbnRyeSdzIGByZXNvbHZlZGAgc2xvdCBpcyBjbGVhcmVkLiBBIGRpcmVjdCB0YXJiYWxsXG4gKiBkZXBlbmRlbmN5IGNhcnJpZXMgaXRzIFVSTCBpbiB0aGUgd29ya3NwYWNlIGRlc2NyaXB0b3IgYW5kIHR1cGxlIGlkZW50aWZpZXIgaW5zdGVhZCwgYW5kIHRob3NlXG4gKiBVUkxzIG11c3QgcmVtYWluIGludGFjdC5cbiAqL1xuY29uc3QgZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4gPSAvKFwiLCApXCJodHRwczpcXC9cXC9ucG1cXC5mbGF0dFxcLnRlY2hcXC9bXlwiXSpcIi9nO1xuXG4vKipcbiAqIFJlbW92ZSBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBidW4ubG9jay5cbiAqXG4gKiBCdW4gd3JpdGVzIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIGxvY2tmaWxlIGV2ZW4gd2hlbiBhbiBpbnN0YWxsIHJ1bnMgZnJvbSBhIGNoaWxkIHBhY2thZ2UuIEluIGFcbiAqIEdpdCBjaGVja291dCB0aGUgc2VhcmNoIGNsaW1icyB0byB0aGF0IHJvb3Q7IHdpdGhvdXQgYSBjaGVja291dCBib3VuZGFyeSBpdCBpbnNwZWN0cyBvbmx5IHRoZVxuICogc3RhcnRpbmcgZGlyZWN0b3J5IHNvIGl0IGNhbm5vdCByZXdyaXRlIGFuIHVucmVsYXRlZCBhbmNlc3RvcidzIGxvY2tmaWxlLiBUaGUgcHJveHkgaXNcbiAqIGluc3RhbGwtdGltZSBwb2xpY3kgcmF0aGVyIHRoYW4gcmVwb3NpdG9yeSBzdGF0ZTogYW4gZW1wdHkgcmVzb2x2ZWQgc2xvdCBzdGlsbCBtYWtlcyBCdW4gdXNlIHRoZVxuICogY29uZmlndXJlZCBkZWZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIGxvY2tmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNoYW5nZSB3YXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVuTG9ja2ZpbGUoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NrZmlsZVBhdGggPSBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aCk7XG4gIGlmICghbG9ja2ZpbGVQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuLCAnJDFcIlwiJyk7XG4gIGlmIChub3JtYWxpemVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIEEgc2libGluZyB0ZW1wIGZpbGUgbWFrZXMgdGhlIHJlcGxhY2VtZW50IGFuIGF0b21pYyBzYW1lLWRpcmVjdG9yeSByZW5hbWUsIHNvIGFuIGludGVycnVwdGVkXG4gIC8vIHdyaXRlIGNhbm5vdCBsZWF2ZSBhIHRydW5jYXRlZCBidW4ubG9jayBiZWhpbmQuXG4gIGNvbnN0IHRlbXBvcmFyeVBhdGggPSBgJHtsb2NrZmlsZVBhdGh9Lm5vcm1hbGl6aW5nLiR7cHJvY2Vzcy5waWR9LiR7Y3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICB0cnkge1xuICAgIC8vIHN0YXQncyBtb2RlIGluY2x1ZGVzIGZpbGUtdHlwZSBiaXRzLCB3aGljaCBjaG1vZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGFjY2VwdC5cbiAgICBjb25zdCBtb2RlID0gZnMuc3RhdFN5bmMobG9ja2ZpbGVQYXRoKS5tb2RlICYgMG83Nzc7XG4gICAgZnMud3JpdGVGaWxlU3luYyh0ZW1wb3JhcnlQYXRoLCBub3JtYWxpemVkQ29udGVudCwgeyBtb2RlIH0pO1xuICAgIC8vIHdyaXRlRmlsZVN5bmMncyBtb2RlIGlzIG1hc2tlZCBieSB0aGUgcHJvY2VzcyB1bWFzazsgY2htb2QgcmVzdG9yZXMgdGhlIGV4YWN0IG9yaWdpbmFsIGJpdHMuXG4gICAgZnMuY2htb2RTeW5jKHRlbXBvcmFyeVBhdGgsIG1vZGUpO1xuICAgIGZzLnJlbmFtZVN5bmModGVtcG9yYXJ5UGF0aCwgbG9ja2ZpbGVQYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmModGVtcG9yYXJ5UGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gbG9ja2ZpbGVQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWRTdGFydERpclBhdGggPSBwYXRoLnJlc29sdmUoc3RhcnREaXJQYXRoKTtcbiAgY29uc3QgcmVwb3NpdG9yeVJvb3REaXJQYXRoID0gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChyZXNvbHZlZFN0YXJ0RGlyUGF0aCk7XG4gIGlmICghcmVwb3NpdG9yeVJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkU3RhcnREaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpID8gbG9ja2ZpbGVQYXRoIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGRpclBhdGggPSByZXNvbHZlZFN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSkgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbiAgICBpZiAoZGlyUGF0aCA9PT0gcmVwb3NpdG9yeVJvb3REaXJQYXRoKSByZXR1cm47XG5cbiAgICBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgZGlyUGF0aCA9IHN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBkaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgcmV0dXJuO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG4iLCIvKiogV2hldGhlciBhIERvY2tlcmZpbGUgY29uc3VtZXMgd2IncyBnZW5lcmF0ZWQgbm9uLXNlY3JldCBlbnZpcm9ubWVudCBkaXJlY3RseSBvciB0aHJvdWdoIGl0cyBoZWxwZXIuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3VtZXNEb2NrZXJFbnYoZG9ja2VyZmlsZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZG9ja2VyZmlsZVRleHRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLnNvbWUoKGxpbmUpID0+ICEvXlxccyojL3UudGVzdChsaW5lKSAmJiAobGluZS5pbmNsdWRlcygnLmRvY2tlci5lbnYnKSB8fCBsaW5lLmluY2x1ZGVzKCdhcHBseS1kb2NrZXItZW52LnNoJykpKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy5hbnRpZ3Jhdml0eWNsaS8qKicsXG4gIC8vIEdpdCdzIG9iamVjdCBzdG9yZSBob2xkcyBjb3BpZXMgb2YgdHJhY2tlZCBmaWxlcyAoYW5kIGBkb3Q6IHRydWVgIG1ha2VzIHRoZW0gdmlzaWJsZSksIHNvXG4gIC8vIHNjYW5uaW5nIGl0IHdvdWxkIGJvdGggc2xvdyBldmVyeSBnbG9iIGRvd24gYW5kIGxldCBzdGFsZSBibG9icyBpbmZsdWVuY2UgZGV0ZWN0aW9uLlxuICAnKiovLmdpdC8qKicsXG4gIC8vIFRoZSBvcmctc3RhbmRhcmQgdGVtcG9yYXJ5IGRpcmVjdG9yeTsgc3RhbGUgY29waWVzIHVuZGVyIGl0IChlLmcuIHJldmlldyBzY3JhdGNoIGRpcnMpIG11c3RcbiAgLy8gbm90IGluZmx1ZW5jZSBsYW5ndWFnZSBkZXRlY3Rpb24uXG4gICcqKi8udG1wLyoqJyxcbiAgJyoqLy50bXAtKi8qKicsXG4gIC8vIExvY2FsIGNhY2hlcyBjYW4gY29udGFpbiBjb21wbGV0ZSB0aGlyZC1wYXJ0eSBzb3VyY2UgY2hlY2tvdXRzLiBUcmVhdGluZyB0aG9zZSBhcyByZXBvc2l0b3J5XG4gIC8vIGNvZGUgZ2VuZXJhdGVzIHdvcmtmbG93cyBmb3IgcGF0aHMgdGhhdCBhcmUgZ2l0aWdub3JlZCBhbmQgYWJzZW50IGZyb20gZnJlc2ggQ0kgY2hlY2tvdXRzLlxuICAnKiovLmNhY2hlLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxubGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICAvKiogQ29uZmluZXMgZ2VuZXJhdGVGaWxlIHdyaXRlcyB0byB0aGUgcmVwb3NpdG9yeSByb290ZWQgYXQgcm9vdERpclBhdGggKHVuZGVmaW5lZCBkaXNhYmxlcyBpdCkuICovXG4gIHNldFJvb3REaXJQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICByZWFsUm9vdERpclBhdGggPSByb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIG9ubHkgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gT3RoZXIgZmFpbHVyZXMgKGUuZy4gcGVybWlzc2lvbnMpIGFyZVxuICAgKiByZXRocm93biBzbyBjYWxsZXJzIHJlZ2VuZXJhdGluZyBjb25maWcgZmlsZXMgbmV2ZXIgb3ZlcndyaXRlIGNvbnRlbnQgdGhleSBjb3VsZCBub3QgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciBhIHdyaXRlIHRvIGZpbGVQYXRoIHdvdWxkIHBhc3MgdGhlIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMuICovXG4gIGFzeW5jIGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlYWRzIGEgc291cmNlIGZpbGUsIHJldHVybmluZyB1bmRlZmluZWQgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBPUiB3aGVuIGl0XG4gICAqIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIGEgY29tbWl0dGVkIHN5bWxpbmsgcG9pbnRpbmcgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSBtdXN0XG4gICAqIG5vdCBnZXQgaXRzIHRhcmdldCdzIGNvbnRlbnQgY29waWVkIGludG8gYSB0cmFja2VkIGZpbGUuIEEgc3ltbGluayB3aG9zZSByZXNvbHZlZCB0YXJnZXRcbiAgICogc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5IGlzIGxlZ2l0aW1hdGUgKGUuZy4gYC5ub2RlLXZlcnNpb24gLT4gLm52bXJjYCkgYW5kIGlzIHJlYWQuXG4gICAqL1xuICBhc3luYyByZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmICghc3RhdHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGxldCByZWFsRmlsZVBhdGg6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlYWxGaWxlUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGZpbGVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgZGFuZ2xpbmcgc3ltYm9saWMgbGluay5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgcmVhbFJvb3REaXJQYXRoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcmVhbEZpbGVQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiZcbiAgICAgICAgIXJlYWxGaWxlUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIGZpbGVQYXRoIChmb3JjZSwgb3B0aW9uYWxseSByZWN1cnNpdmUpIG9ubHkgd2hlbiBpdHMgUEFSRU5UIGRpcmVjdG9yeSByZXNvbHZlcyBpbnNpZGVcbiAgICogdGhlIHJlcG9zaXRvcnksIHNvIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBhIGNvbW1pdHRlZCAuZ2l0aHViL3dvcmtmbG93cyBsaW5rKSBjYW4gbmV2ZXJcbiAgICogbWFrZSBjbGVhbnVwIGRlbGV0ZSBmaWxlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBSZW1vdmluZyBhIHN5bWxpbmsgZW50cnkgaXRzZWxmIGlzIGFsbG93ZWQ6XG4gICAqIHRoYXQgZGVsZXRlcyBvbmx5IHRoZSBsaW5rLCBuZXZlciBpdHMgdGFyZ2V0LiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlbW92YWwgd2FzIHBlcmZvcm1lZC5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZW1vdmluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IG9wdGlvbnM/LnJlY3Vyc2l2ZSA/PyBmYWxzZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFdyaXRlcyBjb250ZW50IHZlcmJhdGltLCBhcHBseWluZyB0aGUgc2FtZSBzeW1saW5rL3JlcG9zaXRvcnktY29udGFpbm1lbnQgZ3VhcmRzIGFzIGdlbmVyYXRlRmlsZS4gKi9cbiAgYXN5bmMgd3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZmlsZSB3YXMgYWN0dWFsbHkgZ2VuZXJhdGVkIChmYWxzZSB3aGVuIHRoZSBjb25maW5lbWVudCBndWFyZHMgc2tpcCBpdCkuICovXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxpbmVFbmRpbmc6ICdcXG4nIHwgJ1xcclxcbicgPSAnXFxuJyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIGB0cmltYCB0cmVhdHMgYSBCT00gYXMgd2hpdGVzcGFjZSwgc28gaXQgaXMgcmVhdHRhY2hlZCBhdCBwb3NpdGlvbiAwOiBkcm9wcGluZyBpdCB3b3VsZFxuICAgIC8vIHJld3JpdGUgdGhlIGVuY29kaW5nIG1hcmtlciBvZiBhIGZpbGUgdGhlIGdlbmVyYXRvciB3YXMgb25seSBhc2tlZCB0byB1cGRhdGUuXG4gICAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IGNvbnRlbnQuc3RhcnRzV2l0aCgn77u/JykgPyAn77u/JyA6ICcnO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgPSBgJHtieXRlT3JkZXJNYXJrfSR7bm9ybWFsaXplZENvbnRlbnR9JHtsaW5lRW5kaW5nfWA7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIE5ldmVyIHdyaXRlIHRocm91Z2ggYSBzeW1saW5rOiBhIChwb3NzaWJseSBkYW5nbGluZykgbGluayBjb21taXR0ZWQgaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5XG4gIC8vIGNvdWxkIHJlZGlyZWN0IHRoZSB3cml0ZSBvdXRzaWRlIGl0LlxuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIGlmIChzdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB3cml0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gQSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSB3b3VsZCByZWRpcmVjdCByZWFkcywgd3JpdGVzLCBhbmQgcmVtb3ZhbHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSxcbi8vIHNvIHJlcXVpcmUgdGhlIGNsb3Nlc3QgZXhpc3RpbmcgYW5jZXN0b3IgdG8gcmVzb2x2ZSBpbnNpZGUgdGhlIHJvb3Qgc2V0IGJ5IHRoZSBDTEkgZW50cnkgcG9pbnQuXG5hc3luYyBmdW5jdGlvbiBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChyZWFsUm9vdERpclBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIGxldCBhbmNlc3RvclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMoYW5jZXN0b3JQYXRoKSkge1xuICAgIGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvclBhdGgpO1xuICB9XG4gIGNvbnN0IHJlYWxBbmNlc3RvclBhdGggPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFscGF0aChhbmNlc3RvclBhdGgpO1xuICByZXR1cm4gcmVhbEFuY2VzdG9yUGF0aCA9PT0gcmVhbFJvb3REaXJQYXRoIHx8IHJlYWxBbmNlc3RvclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBBUEkgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzeW5jJztcbmltcG9ydCB0eXBlIHsgU291cmNlRmlsZSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgKEdvKSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYW5kIG5vXG4vLyBsb25nZXIgZXhwb3NlcyBhbiBpbi1wcm9jZXNzIHBhcnNlciBzdWNoIGFzIGB0cy5jcmVhdGVTb3VyY2VGaWxlYC4gUGFyc2luZyBub3dcbi8vIGhhcHBlbnMgaW4gYSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlciByZWFjaGVkIHRocm91Z2ggdGhlIGFzeW5jaHJvbm91cyBBUEksIHNvIHdlXG4vLyBrZWVwIGEgc2luZ2xlIGxhemlseS1jcmVhdGVkIGluc3RhbmNlIGFuZCByZXVzZSBpdCBhY3Jvc3MgZXZlcnkgZml4ZXIgdG8gYXZvaWRcbi8vIHBheWluZyB0aGUgcHJvY2Vzcy1zcGF3biBjb3N0IHBlciBmaWxlLlxubGV0IGFwaTogQVBJIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRBcGkoKTogQVBJIHtcbiAgcmV0dXJuIChhcGkgPz89IG5ldyBBUEkoeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSkpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHNvdXJjZSBmaWxlIGludG8gYSBUeXBlU2NyaXB0IEFTVCB1c2luZyB0aGUgYnVuZGxlZCBuYXRpdmUgY29tcGlsZXIuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGNvbXBpbGVyIGNhbm5vdCBsb2FkIHRoZSBmaWxlIChlLmcuIGl0IGlzIG1pc3NpbmdcbiAqIG9yIHVucGFyc2FibGUpIHNvIGNhbGxlcnMgY2FuIGZhbGwgYmFjayB0byBjb25zZXJ2YXRpdmUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8U291cmNlRmlsZSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0QXBpKCkudXBkYXRlU25hcHNob3QoeyBvcGVuRmlsZXM6IFtmaWxlUGF0aF0gfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IGF3YWl0IHNuYXBzaG90LmdldERlZmF1bHRQcm9qZWN0Rm9yRmlsZShmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb2plY3Q/LnByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaHV0cyBkb3duIHRoZSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlci4gVGhlIHNlcnZlciBrZWVwcyBhbiBvcGVuIElQQyBjaGFubmVsXG4gKiB0aGF0IHdvdWxkIG90aGVyd2lzZSBrZWVwIHRoZSBydW50aW1lIGV2ZW50IGxvb3AgYWxpdmUsIHNvIHdiZnkgbXVzdCBjYWxsIHRoaXNcbiAqIG9uY2UgaXRzIHJ1biBmaW5pc2hlcyBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhcGk/LmNsb3NlKCk7XG4gIGFwaSA9IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG4vLyBTZXR0aW5ncyBldmVyeSBXaWxsQm9vc3RlciBOZXh0LmpzIHByb2plY3Qgc2hvdWxkIGNhcnJ5LiBgbmFtZWAgaXMgdGhlIHRvcC1sZXZlbFxuLy8gcHJvcGVydHkga2V5IHVzZWQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHNldHRpbmcgYWxyZWFkeSBleGlzdHM7IGB0ZXh0YCBpcyBpbnNlcnRlZFxuLy8gdmVyYmF0aW0gKGEgd2hvbGUgYGtleTogdmFsdWVgIHBhaXIpIHdoZW4gdGhlIGtleSBpcyBtaXNzaW5nLlxuY29uc3QgbWFuYWdlZFByb3BlcnRpZXM6IHJlYWRvbmx5IHsgbmFtZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdID0gW1xuICB7IG5hbWU6ICdyZWFjdENvbXBpbGVyJywgdGV4dDogJ3JlYWN0Q29tcGlsZXI6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3JlYWN0U3RyaWN0TW9kZScsIHRleHQ6ICdyZWFjdFN0cmljdE1vZGU6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB0ZXh0OiAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9JyB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWyd0cycsICdtdHMnLCAnY3RzJywgJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYWN0ZWQgPSBhd2FpdCBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWQpIHJldHVybjtcbiAgICBjb25zdCB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9ID0gZXh0cmFjdGVkO1xuXG4gICAgLy8gYHByb3BlcnRpZXNgIGluY2x1ZGVzIHNwcmVhZCBhc3NpZ25tZW50cyAoYC4uLnJlc3RgKSB0aGF0IGNhcnJ5IG5vIG5hbWUsIHNvIGd1YXJkIGJlZm9yZSByZWFkaW5nIGl0LlxuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydGllcyA9IG5ldyBTZXQoXG4gICAgICBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT5cbiAgICAgICAgJ25hbWUnIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm5hbWUgPyBnZXRQcm9wZXJ0eUtleShwcm9wZXJ0eS5uYW1lLCBzb3VyY2UpIDogdW5kZWZpbmVkXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzID0gbWFuYWdlZFByb3BlcnRpZXNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5KSA9PiAhZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eS5uYW1lKSlcbiAgICAgIC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS50ZXh0KTtcbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBzb3VyY2UudGV4dDtcbiAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG9iamVjdExpdGVyYWwuZ2V0RW5kKCkgLSAxO1xuICAgIC8vIFRoZSBuYXRpdmUgVFMgQVNUIGRvZXMgbm90IHJlbGlhYmx5IGV4cG9zZSBgcHJvcGVydGllcy5oYXNUcmFpbGluZ0NvbW1hYCwgc28gc2NhbiB0aGUgc291cmNlXG4gICAgLy8gYmV0d2VlbiB0aGUgbGFzdCBwcm9wZXJ0eSBhbmQgdGhlIGNsb3NpbmcgYnJhY2UuIFN0cmlwIGNvbW1lbnRzIGZpcnN0IHNvIGEgY29tbWEgaW5zaWRlIGFcbiAgICAvLyB0cmFpbGluZyBjb21tZW50IChlLmcuIGBmb286IDEgLy8gYSwgYmApIGlzIG5vdCBtaXN0YWtlbiBmb3IgYSByZWFsIHRyYWlsaW5nIGNvbW1hLlxuICAgIGNvbnN0IGxhc3RQcm9wZXJ0eSA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5hdCgtMSk7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGxhc3RQcm9wZXJ0eVxuICAgICAgPyBzdHJpcENvbW1lbnRzKG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkpLmluY2x1ZGVzKCcsJylcbiAgICAgIDogZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgIWhhc1RyYWlsaW5nQ29tbWEgPyAnLCAnIDogJyc7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpfSR7cHJlZml4fSR7cHJvcGVydHlUZXh0cy5qb2luKCcsICcpfSR7b2xkQ29udGVudC5zbGljZShcbiAgICAgIGluc2VydGlvblBvaW50XG4gICAgKX1gO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx7IHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7IG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCBkZWNsYXJlcyB0aGUgY29uZmlnIGFzIGBjb25zdCBuZXh0Q29uZmlnOiBOZXh0Q29uZmlnID0geyAuLi4gfWAgYW5kXG4gIC8vIGV4cG9ydHMgaXQgKHBvc3NpYmx5IHdyYXBwZWQsIGUuZy4gYHdpdGhTZW50cnlDb25maWcoLi4uKWApLCBzbyB0aGUgb2JqZWN0IGxpdGVyYWwgaXMgcmFyZWx5XG4gIC8vIHRoZSBkaXJlY3Qgb3BlcmFuZCBvZiBgZXhwb3J0IGRlZmF1bHRgL2Btb2R1bGUuZXhwb3J0c2AuIENvbGxlY3QgZXZlcnkgY2FuZGlkYXRlIGFuZCBwaWNrIHRoZVxuICAvLyBtb3N0IGF1dGhvcml0YXRpdmUgb25lIGJlbG93LlxuICBsZXQgZGlyZWN0T2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwb3J0ZWRJZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMgPSBuZXcgTWFwPHN0cmluZywgYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uPigpO1xuICBjb25zdCB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGFzdC5pc0V4cG9ydEFzc2lnbm1lbnQobm9kZSkpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBhc3QuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gYXN0LlN5bnRheEtpbmQuRXF1YWxzVG9rZW4gJiZcbiAgICAgIG5vZGUubGVmdC5nZXRUZXh0KHNvdXJjZSkgPT09ICdtb2R1bGUuZXhwb3J0cydcbiAgICApIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUucmlnaHQpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLnJpZ2h0KSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUucmlnaHQuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXN0LmlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSAmJiBub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmluaXRpYWxpemVyKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsICYmIGFzdC5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLnNldChub2RlLm5hbWUuZ2V0VGV4dChzb3VyY2UpLCBvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgLy8gVGhlIGA6IE5leHRDb25maWdgIGFubm90YXRpb24gd2JmeSB3cml0ZXMgbWFya3MgdGhlIGNhbm9uaWNhbCBjb25maWcgb2JqZWN0IChhY2NlcHRpbmdcbiAgICAgICAgLy8gcXVhbGlmaWVkIG5hbWVzIHN1Y2ggYXMgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgKS5cbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblR5cGUgPSBub2RlLnR5cGU/LmdldFRleHQoc291cmNlKTtcbiAgICAgICAgaWYgKGFubm90YXRpb25UeXBlICE9PSB1bmRlZmluZWQgJiYgaXNOZXh0Q29uZmlnVHlwZShhbm5vdGF0aW9uVHlwZSkpIHtcbiAgICAgICAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzLnB1c2gob2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICBjb25zdCBvYmplY3RMaXRlcmFsID1cbiAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzWzBdID8/XG4gICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/P1xuICAgIChleHBvcnRlZElkZW50aWZpZXIgPyB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldChleHBvcnRlZElkZW50aWZpZXIpIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KCduZXh0Q29uZmlnJyk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsID8geyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN1cnJlbnQgPSB1bndyYXBQYXJlbnRoZXNlcyhub2RlKTtcbiAgcmV0dXJuIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGN1cnJlbnQpID8gY3VycmVudCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdW53cmFwUGFyZW50aGVzZXMobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuRXhwcmVzc2lvbiB7XG4gIGxldCBjdXJyZW50ID0gbm9kZTtcbiAgd2hpbGUgKGFzdC5pc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGN1cnJlbnQpKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnQuZXhwcmVzc2lvbjtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLy8gTWF0Y2ggYm90aCB0aGUgYmFyZSBgTmV4dENvbmZpZ2AgYW5kIHF1YWxpZmllZCBmb3JtcyBsaWtlIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYC5cbmZ1bmN0aW9uIGlzTmV4dENvbmZpZ1R5cGUodHlwZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZVRleHQgPT09ICdOZXh0Q29uZmlnJyB8fCB0eXBlVGV4dC5lbmRzV2l0aCgnLk5leHRDb25maWcnKTtcbn1cblxuLy8gUmV0dXJuIGEgcHJvcGVydHkga2V5IHdpdGhvdXQgc3Vycm91bmRpbmcgcXVvdGVzLCBzbyBgJ3JlYWN0Q29tcGlsZXInYCBtYXRjaGVzIGByZWFjdENvbXBpbGVyYC5cbi8vIElkZW50aWZpZXIsIHN0cmluZy1saXRlcmFsIGFuZCBudW1lcmljLWxpdGVyYWwgbmFtZXMgYWxsIGV4cG9zZSB0aGUgdW5xdW90ZWQgdmFsdWUgdmlhIGAudGV4dGAuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eUtleShuYW1lOiBhc3QuUHJvcGVydHlOYW1lLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nIHtcbiAgcmV0dXJuICd0ZXh0JyBpbiBuYW1lICYmIHR5cGVvZiBuYW1lLnRleHQgPT09ICdzdHJpbmcnID8gbmFtZS50ZXh0IDogbmFtZS5nZXRUZXh0KHNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwQ29tbWVudHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvXFwvXFwvW15cXG5dKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csICcnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeENoYWtyYVRvYXN0ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmNoYWtyYSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdG9hc3Rlci57dHMsdHN4fScsIHtcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogWycqKi8uKi8qKicsICcqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKFxuICAgICAgICBjb250ZW50LmluY2x1ZGVzKCdDcmVhdGVUb2FzdGVyUmV0dXJuJykgfHxcbiAgICAgICAgIWNvbnRlbnQuaW5jbHVkZXMoXCJmcm9tICdAY2hha3JhLXVpL3JlYWN0J1wiKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcygnZXhwb3J0IGNvbnN0IHRvYXN0ZXIgPSBjcmVhdGVUb2FzdGVyKCcpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnRcbiAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgL15pbXBvcnQgLiogZnJvbSAnQGNoYWtyYS11aVxcL3JlYWN0JzskL211LFxuICAgICAgICAgIFwiJCZcXG5pbXBvcnQgdHlwZSB7IENyZWF0ZVRvYXN0ZXJSZXR1cm4gfSBmcm9tICdAY2hha3JhLXVpL3JlYWN0JztcIlxuICAgICAgICApXG4gICAgICAgIC5yZXBsYWNlKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJywgJ2V4cG9ydCBjb25zdCB0b2FzdGVyOiBDcmVhdGVUb2FzdGVyUmV0dXJuID0gY3JlYXRlVG9hc3RlcignKTtcbiAgICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gY29udGVudCkgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgT2JqZWN0TWVtYmVyID0geyBraW5kOiAnZXh0cmEnOyBpbmRleDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdwcm9wZXJ0eSc7IGtleTogc3RyaW5nIH07XG5pbnRlcmZhY2UgUGFyc2VkT2JqZWN0IHtcbiAgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXTtcbiAgbWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG59XG5pbnRlcmZhY2UgRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB7XG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7XG4gIG5vZGU6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cbmNvbnN0IGxpdGVyYWwgPSAodmFsdWU6IHN0cmluZyk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUgfSk7XG5jb25zdCBhc0FycmF5ID0gKHZhbHVlOiBQYXJzZWRWYWx1ZVtdKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2FycmF5JywgdmFsdWUgfSk7XG5jb25zdCBhc09iamVjdCA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZFZhbHVlID0+ICh7XG4gIGtpbmQ6ICdvYmplY3QnLFxuICB2YWx1ZTogdG9QYXJzZWRPYmplY3QocHJvcGVydGllcywgZXh0cmFNZW1iZXJzKSxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHM6IGJvb2xlYW4pOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCB1c2UgPSB0b1BhcnNlZE9iamVjdCh7XG4gICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIHNjcmVlbnNob3Q6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbmx5LW9uLWZhaWx1cmUnIDogJ29uJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pO1xuXG4gIGlmIChzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cykge1xuICAgIHVzZS5wcm9wZXJ0aWVzLmJhc2VVUkwgPSBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpO1xuICAgIHVzZS5tZW1iZXJPcmRlci51bnNoaWZ0KHsga2luZDogJ3Byb3BlcnR5Jywga2V5OiAnYmFzZVVSTCcgfSk7XG4gIH1cblxuICByZXR1cm4gdG9QYXJzZWRPYmplY3Qoe1xuICAgIGZvcmJpZE9ubHk6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgICB1c2U6IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiB1c2UgfSxcbiAgICAuLi4oc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHNcbiAgICAgID8ge1xuICAgICAgICAgIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgICAgICAgICAgY29tbWFuZDogbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKSksXG4gICAgICAgICAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgICAgICAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgICAgICAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgICAgICAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICAgICAgICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZE9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgZXh0cmFNZW1iZXJzLFxuICAgIG1lbWJlck9yZGVyOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKGtleSk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSkpLFxuICAgICAgLi4uZXh0cmFNZW1iZXJzLm1hcCgoXywgaW5kZXgpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSkpLFxuICAgIF0sXG4gICAgcHJvcGVydGllcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gYXdhaXQgZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUsIGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gd2IgZGVyaXZlcyBORVhUX1BVQkxJQ19CQVNFX1VSTCBmcm9tIHRoZSByZXNvbHZlZCBwb3J0IGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzICh2aW5leHRcbiAgICAvLyBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIGBkZXBlbmRpbmcubmV4dGAgY292ZXJzIGJvdGgpLCBzbyB0aG9zZSBuZWVkIG5vIGRlY2xhcmVkXG4gICAgLy8gdmFyaWFibGU7IG90aGVyIHBhY2thZ2VzIHN0aWxsIHJlcXVpcmUgYSBkZWNsYXJhdGlvbi5cbiAgICBjb25zdCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyA9XG4gICAgICBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWcsIHBhcnNlZCkgJiZcbiAgICAgIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgKGF3YWl0IGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCkpKTtcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKTtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVBhcnNlZE9iamVjdHMoZGVmYXVsdENvbmZpZywgcGFyc2VkKTtcbiAgICBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhtZXJnZWQsIGRlZmF1bHRDb25maWcpO1xuICAgIHNldFdlYlNlcnZlckNvbW1hbmQobWVyZ2VkKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5mdW5jdGlvbiBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhjb25maWc6IFBhcnNlZE9iamVjdCwgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHVzZSA9IGNvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgY29uc3QgZGVmYXVsdFVzZSA9IGRlZmF1bHRDb25maWcucHJvcGVydGllcy51c2U7XG4gIGlmICh1c2U/LmtpbmQgIT09ICdvYmplY3QnIHx8IGRlZmF1bHRVc2U/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgWyd0cmFjZScsICdzY3JlZW5zaG90JywgJ3ZpZGVvJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB1c2UudmFsdWUucHJvcGVydGllc1trZXldID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIHBhcnNlZDogUGFyc2VkT2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8XG4gICAgcGFyc2VkLnByb3BlcnRpZXMud2ViU2VydmVyICE9PSB1bmRlZmluZWQgfHxcbiAgICBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwocGFyc2VkLnByb3BlcnRpZXMudXNlKSB8fFxuICAgIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWQgfSwgJ05FWFRfUFVCTElDX0JBU0VfVVJMJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gZG9lc09iamVjdEhhdmVCYXNlVXJsKHZhbHVlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWU/LmtpbmQgPT09ICdvYmplY3QnICYmIHZhbHVlLnZhbHVlLnByb3BlcnRpZXMuYmFzZVVSTCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh2YWx1ZTogUGFyc2VkVmFsdWUsIGxpdGVyYWxUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlLmluY2x1ZGVzKGxpdGVyYWxUZXh0KTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHJldHVybiB2YWx1ZS52YWx1ZS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSk7XG4gIHJldHVybiAoXG4gICAgdmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzLnNvbWUoKG1lbWJlcikgPT4gbWVtYmVyLmluY2x1ZGVzKGxpdGVyYWxUZXh0KSkgfHxcbiAgICBPYmplY3QudmFsdWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICAvLyBTb21lIFBsYXl3cmlnaHQgY29uZmlncyBvbmx5IGRlZmluZSBicm93c2VyIHByb2plY3RzIG9yIGZpeHR1cmVzIGFuZCBkbyBub3RcbiAgLy8gc3RhcnQgYSB3ZWIgYXBwLiBBdm9pZCBmb3JjaW5nIGFuIGFwcC1zZXJ2ZXIgVVJMIGludG8gdGhvc2UgcGFja2FnZXMuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWydmbm94LnRvbWwnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQob2JqZWN0OiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3Qgd2ViU2VydmVyID0gb2JqZWN0LnByb3BlcnRpZXMud2ViU2VydmVyO1xuICBpZiAod2ViU2VydmVyPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbW1hbmQgPSB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kO1xuICAvLyBMaWJyYXJpZXMgY2FuIHVzZSBQbGF5d3JpZ2h0J3Mgd2ViU2VydmVyIHRvIGJ1aWxkIGFuZCBsYXVuY2ggYSBmaXh0dXJlIGV2ZW4gdGhvdWdoIGB3YiBzdGFydGBcbiAgLy8gaW50ZW50aW9uYWxseSBoYXMgbm8gdGVzdCBzZXJ2ZXIgZm9yIHRoZSBsaWJyYXJ5IGl0c2VsZi4gUHJlc2VydmUgdGhvc2UgY3VzdG9tIGxpZmVjeWNsZVxuICAvLyBjb21tYW5kczsgb25seSBhZGQgdGhlIGNvbW1hbmQgd2hlbiB3YmZ5IGFscmVhZHkgb3ducyBpdC5cbiAgaWYgKGNvbW1hbmQgJiYgIWlzR2VuZXJhdGVkV2JTdGFydFRlc3RDb21tYW5kKGNvbW1hbmQpKSByZXR1cm47XG5cbiAgLy8gUGxheXdyaWdodCByZXF1aXJlcyBgY29tbWFuZGAgd2hlbmV2ZXIgYHdlYlNlcnZlcmAgZXhpc3RzOyBhbiBleHRlcm5hbGx5IG1hbmFnZWQgc2VydmVyIHNob3VsZFxuICAvLyBvbWl0IGB3ZWJTZXJ2ZXJgIGluc3RlYWQuIEtlZXAgZmlsbGluZyB0aGlzIHJlcXVpcmVkIGZpZWxkIHdoZW4gYSBwYXJ0aWFsIG1hbmFnZWQgYmxvY2sgbGFja3MgaXQuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZDogUGFyc2VkVmFsdWUpOiBib29sZWFuIHtcbiAgaWYgKGNvbW1hbmQua2luZCAhPT0gJ2xpdGVyYWwnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBjb21tYW5kLnZhbHVlLnRyaW0oKSA9PT0gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk7XG59XG5cbmZ1bmN0aW9uIGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpOiBzdHJpbmcge1xuICByZXR1cm4gYCdidW4gd2Igc3RhcnQgLS1tb2RlIHRlc3QnYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8RXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICBpZiAoYXN0LmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJndW1lbnQpKSB7XG4gICAgICAgIGZvdW5kID0gZmlyc3RBcmd1bWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIHJldHVybiBmb3VuZCA/IHsgc291cmNlLCBub2RlOiBmb3VuZCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogYXN0LkV4cHJlc3Npb24sIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZE9iamVjdCB9IDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHsgZXh0cmFNZW1iZXJzOiBbXSwgbWVtYmVyT3JkZXI6IFtdLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmIChhc3QuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSBsaXRlcmFsKGtleSk7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fFxuICAgICAgKCFhc3QuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICFhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKVxuICAgICkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQuZXh0cmFNZW1iZXJzLnB1c2gocHJvcGVydHkuZ2V0VGV4dChzb3VyY2UpKSAtIDE7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICAgIH0pO1xuICAgIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcblxuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBlbWl0dGVkUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSh2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlcik7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWVtYmVyT3JkZXIuZmxhdE1hcCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ2V4dHJhJykge1xuICAgICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RNZW1iZXIodmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzW21lbWJlci5pbmRleF0gPz8gJycsIGluZGVudCldO1xuICAgIH1cblxuICAgIGlmIChsYXN0UHJvcGVydHlJbmRleEJ5S2V5LmdldChtZW1iZXIua2V5KSAhPT0gaW5kZXgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtID0gdmFsdWUudmFsdWUucHJvcGVydGllc1ttZW1iZXIua2V5XTtcbiAgICBpZiAoIWl0ZW0gfHwgZW1pdHRlZFByb3BlcnRpZXMuaGFzKG1lbWJlci5rZXkpKSByZXR1cm4gW107XG4gICAgZW1pdHRlZFByb3BlcnRpZXMuYWRkKG1lbWJlci5rZXkpO1xuICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkobWVtYmVyLmtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCldO1xuICB9KTtcbiAgbGluZXMucHVzaChcbiAgICAuLi5PYmplY3QuZW50cmllcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFlbWl0dGVkUHJvcGVydGllcy5oYXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpKVxuICApO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIG1lbWJlcl0gb2YgbWVtYmVyT3JkZXIuZW50cmllcygpKSB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSB7XG4gICAgICBsYXN0UHJvcGVydHlJbmRleEJ5S2V5LnNldChtZW1iZXIua2V5LCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYXN0UHJvcGVydHlJbmRleEJ5S2V5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXk6IHN0cmluZywgaXRlbTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgIH1cbiAgfVxuICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RNZW1iZXIobWVtYmVyOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBtZW1iZXIuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIHN0cmluZ2lmaWVkLmVudHJpZXMoKSkge1xuICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke2xpbmV9YDtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxudHlwZSBXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbiA9ICdXaWxsQm9vc3RlcicgfCAnV2lsbEJvb3N0ZXJMYWInO1xudHlwZSBSZXBvc2l0b3J5RnVsbE5hbWUgPSBgJHtXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbn0vJHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBGbm94UmVwb3NpdG9yeVNjb3BlIHtcbiAgb3JnYW5pemF0aW9ucz86IHJlYWRvbmx5IFdpbGxCb29zdGVyT3JnYW5pemF0aW9uW107XG4gIHJlcG9zaXRvcmllcz86IHJlYWRvbmx5IFJlcG9zaXRvcnlGdWxsTmFtZVtdO1xuICAvLyBSZXN0cmljdHMgdGhlIHNjb3BlIHRvIHJlcG9zaXRvcmllcyBvZiB0aGUgZ2l2ZW4gdmlzaWJpbGl0eS4gUHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHRoZWlyXG4gIC8vIGNpcGhlcnRleHRzIHRvIHRoZSB3b3JsZCwgc28gdGhleSBtdXN0IHVzZSBhIENJIGlkZW50aXR5IHNlcGFyYXRlIGZyb20gdGhlIG9yZy1pbnRlcm5hbCBvbmU6XG4gIC8vIGxlYWtpbmcgZWl0aGVyIENJIGtleSBtdXN0IG5vdCBleHBvc2UgdGhlIG90aGVyIHNpZGUncyBzZWNyZXRzLlxuICB2aXNpYmlsaXR5PzogJ3B1YmxpYycgfCAncHJpdmF0ZSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUHJpbmNpcGFsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXlzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVwb3NpdG9yeVNjb3BlOiBGbm94UmVwb3NpdG9yeVNjb3BlO1xuICAvLyBNYXJrcyB0aGUgcHJpbmNpcGFsIGFzIGEgQ0kgaWRlbnRpdHkgYW5kIG5hbWVzIHRoZSBHaXRIdWIgc2VjcmV0IGhvbGRpbmcgaXRzIHByaXZhdGUga2V5LlxuICAvLyBFdmVyeSBmbm94LW1hbmFnZWQgcmVwb3NpdG9yeSBtdXN0IHJlc29sdmUgb25lIChnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvdGhlcndpc2U6IGFcbiAgLy8gcm9zdGVyIHdpdGhvdXQgYSBDSSByZWNpcGllbnQgd291bGQgcmUtZW5jcnlwdCBzZWNyZXRzIHRoYXQgQ0kgY2FuIG5ldmVyIGRlY3J5cHQgYWdhaW4pLCBhbmRcbiAgLy8gdGhlIHdvcmtmbG93IGdlbmVyYXRvciBkZXJpdmVzIGl0cyBjYWxsZXIgbWFwcGluZ3MgZnJvbSB0aGUgc2FtZSByZXNvbHV0aW9uIHNvIHRoZSB0d28gY2FuXG4gIC8vIG5ldmVyIGRpc2FncmVlIG9uIHdoaWNoIENJIGlkZW50aXR5IGFwcGxpZXMuXG4gIGNpQWdlS2V5U2VjcmV0TmFtZT86ICdGTk9YX0FHRV9LRVknIHwgJ1BVQkxJQ19GTk9YX0FHRV9LRVknO1xufVxuXG5pbnRlcmZhY2UgRm5veEFnZVJlY2lwaWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHVibGljS2V5OiBzdHJpbmc7XG59XG5cbi8vIFRoZSBhZ2UgcHJpbmNpcGFscyBhdXRob3JpemVkIHRvIGRlY3J5cHQgZWFjaCBmbm94LW1hbmFnZWQgcmVwb3NpdG9yeS4gVG8gZ3JhbnQgYWNjZXNzLCBhZGQgdGhlXG4vLyBwcmluY2lwYWwncyBwdWJsaWMga2V5cyBhbmQgcmVwb3NpdG9yeSBzY29wZSBoZXJlLiBPcmdhbml6YXRpb24gc2NvcGVzIGluY2x1ZGUgZXZlcnkgY3VycmVudCBhbmRcbi8vIGZ1dHVyZSByZXBvc2l0b3J5IGluIHRoYXQgb3JnYW5pemF0aW9uOyB1c2UgcmVwb3NpdG9yaWVzIGZvciBleGFjdCBvd25lci9yZXBvc2l0b3J5IGdyYW50cy4gVGhlXG4vLyBuZXh0IHdiZnkgcnVuIG9uIGVhY2ggbWF0Y2hpbmcgcmVwb3NpdG9yeSByZXdyaXRlcyBldmVyeSBtYW5hZ2VkIGZub3gudG9tbCBhbmQgcmUtZW5jcnlwdHMgaXRzXG4vLyBjb21taXR0ZWQgc2VjcmV0cyBmb3IgdGhlIHJlc3VsdGluZyByZWNpcGllbnQgc2V0LiBBIHNjb3BlJ3Mgb3B0aW9uYWwgdmlzaWJpbGl0eSBjb25zdHJhaW50XG4vLyBzZWxlY3RzIG9ubHkgcHVibGljIG9yIG9ubHkgcHJpdmF0ZSByZXBvc2l0b3JpZXMgKHVzZWQgdG8ga2VlcCB0aGUgb3JnLWludGVybmFsIGFuZCB0aGVcbi8vIHB1YmxpYy1yZXBvc2l0b3J5IENJIGlkZW50aXRpZXMgYXBhcnQpLiBSZW1vdmluZyBhIHNjb3BlIGNhbm5vdCByZXZva2UgY2lwaGVydGV4dFxuLy8gYWxyZWFkeSBhdmFpbGFibGUgZnJvbSBHaXQgaGlzdG9yeSwgc28gcm90YXRlIHRoZSBzZWNyZXQgdmFsdWVzIHRoYXQgcHJpbmNpcGFsIGNvdWxkIGRlY3J5cHQuXG4vLyBPbmx5IHB1YmxpYyBrZXlzIG1heSBhcHBlYXIgaGVyZTsgYSBDSSBpZGVudGl0eSdzIHByaXZhdGUga2V5IHN1cHBsaWVzIHRoZSBGTk9YX0FHRV9LRVkgKG9yLFxuLy8gZm9yIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG5leHBvcnQgY29uc3QgRk5PWF9BR0VfUFJJTkNJUEFMUyA9IFtcbiAge1xuICAgIG5hbWU6ICdleGthenV1JyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFqMjM1NHhodm0zZnY5eTc3dDVnNnkzcThtZXhnazJtZjAwdGdya3pncDczdHlucnZ6NTVzOGF1YXl3J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3BvbmhhcnUnLFxuICAgIHB1YmxpY0tleXM6IFtcbiAgICAgICdhZ2UxOHJ1Z2xkZjlodGM2dW01ZXBscHgyN2s1M2VwNHpuMGxoendmZmdueHpocnEwYzd6Z3Z5cTN6Y2NkeScsXG4gICAgICAnYWdlMW56Mm45OWNyanI3bnA5eGpnbHdmZmZjM2R1ZDQ1ZGhld3F6cWZ6cHp0a2R3dTRoajc0Z3E2ZWw1MzMnLFxuICAgIF0sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgLy8gVGhlIG9yZy1pbnRlcm5hbCBDSSBpZGVudGl0eSAodGhlIEZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb24gc2VjcmV0IC8gfi8uY29uZmlnL2Zub3gvYWdlLWNpLXdiLnR4dCkuXG4gICAgbmFtZTogJ2NpJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFhMmM2ZWY2YWhsNm1ta2hncXR4ZzBtZ3RkN3lzc3BudHE3cnh1c3YyNmVmeGhudWhsY2RzcjlkcGFrJ10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSwgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnRk5PWF9BR0VfS0VZJyxcbiAgfSxcbiAge1xuICAgIC8vIFRoZSBDSSBpZGVudGl0eSBkZWRpY2F0ZWQgdG8gcHVibGljIHJlcG9zaXRvcmllcyAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uXG4gICAgLy8gc2VjcmV0IC8gfi8uY29uZmlnL2Zub3gvYWdlLWNpLXdiLXB1YmxpYy50eHQpLiBTY29wZWQgdG8gV2lsbEJvb3N0ZXIgb25seSBiZWNhdXNlIHRoZVxuICAgIC8vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0IGlzIHJlZ2lzdGVyZWQgaW4gdGhhdCBvcmdhbml6YXRpb24gYWxvbmU7IGEgcHVibGljXG4gICAgLy8gV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yeSByZXNvbHZlcyBOTyBDSSBpZGVudGl0eSBhbmQgZ2VuZXJhdGVGbm94VG9tbCBmYWlscyBjbG9zZWQgb24gaXRcbiAgICAvLyAoV2lsbEJvb3N0ZXJMYWIgZG9lcyBvd24gcHVibGljIHJlcG9zaXRvcmllcywgZS5nLiBpdHMgcmV1c2FibGUtd29ya2Zsb3dzIHN5bmMgbWlycm9yLCBidXRcbiAgICAvLyBub25lIG9mIHRoZW0gdXNlIGZub3gg4oCUIHJlZ2lzdGVyIHRoZSBzZWNyZXQgdGhlcmUgYW5kIGV4dGVuZCB0aGlzIHNjb3BlIGlmIG9uZSBldmVyIGRvZXMpLlxuICAgIG5hbWU6ICdjaS1wdWJsaWMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWZoZWE4NXhqd3A4OWx3cTNqY253ajMyc3doM3YyNHB3cGFycWg1bDdxa2d2YzRheDNwMHFsNmR1MzYnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlciddLCB2aXNpYmlsaXR5OiAncHVibGljJyB9LFxuICAgIGNpQWdlS2V5U2VjcmV0TmFtZTogJ1BVQkxJQ19GTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3JlbWluJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFtdzRwejlkdWp5OWRtaGswcGFscWF3amtqN200azd6eDc4eXI5Zmp0NjNzYTVsM2U0M3VxNm53MDA0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2FyaWVzJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFubjBlaHlhZW55cThrbW5xNDI5NGt6emd4djVkbmY2cGVwMmNka3JheHpmcWxrN3hnc3JxcW42bm45J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFtcbiAgICAgICAgJ1dpbGxCb29zdGVyL2FnZW50LWNoYWxsZW5nZXMnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnRpYy13b3JrZmxvd3MtZGFzaGJvYXJkJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2NoZWVybGluZ3MnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hvZnUtd2Fsa2luZycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHknLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvanVkZ2UnLFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3N1bmFnYScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdWx4em42eTY4a3UzNGNweDVmeWE1Z2Y3cm5yd3owdWZsbnllNnV4dWhnMzRwMm5qaGdrcW1nNzNnNCddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9leGVyY29kZScsICdXaWxsQm9vc3Rlci9qdWRnZSddLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXlhbWUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMXZ4bTJnczAwM3J1d204cDZoM2h2N3hhc2p1MnM4azRteG1jMzR6bTZncmR3em5yczA5bnE2eHo1dnonXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogWydXaWxsQm9vc3Rlci9haS1vY3InLCAnV2lsbEJvb3N0ZXIvY2hvZnUtd2Fsa2luZycsICdXaWxsQm9vc3Rlci9leGVyY29kZScsICdXaWxsQm9vc3Rlci9qdWRnZSddLFxuICAgIH0sXG4gIH0sXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBGbm94QWdlUHJpbmNpcGFsW107XG5cbmludGVyZmFjZSBGbm94VG9tbCB7XG4gIGltcG9ydD86IHVua25vd247XG4gIHByb3ZpZGVycz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmxldCBmbm94U3luY0ZhaWxlZCA9IGZhbHNlO1xubGV0IG1pZ3JhdGlvbk1hcmtlclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xuXG4vKiogV2hldGhlciBhbnkgZm5veCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGZhaWxlZCBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5OyBzZXR1cFNlY3JldHMgbXVzdCBub3QgdXBsb2FkIHRoZW4uICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRm5veFN5bmNGYWlsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBmbm94U3luY0ZhaWxlZDtcbn1cblxuLyoqXG4gKiBTeW5jaHJvbml6ZXMgdGhlIGFnZSByZWNpcGllbnRzIGluIGV2ZXJ5IGZub3gudG9tbCB3aXRoIHRoZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgZm9yIHRoaXNcbiAqIHJlcG9zaXRvcnkgYW5kIHJlLWVuY3J5cHRzIHRoZSBjb21taXR0ZWQgc2VjcmV0cyB3aGVuIHRoZSByZWNpcGllbnQgc2V0IGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUZub3hUb21sKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUZub3hUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRoZSBmYWlsdXJlIGZsYWcgaXMgcGVyIHJlcG9zaXRvcnk6IHdiZnkgY2FuIHByb2Nlc3MgbXVsdGlwbGUgd29ya2luZyBkaXJlY3RvcmllcyBpbiBvbmVcbiAgICAvLyBpbnZvY2F0aW9uLCBhbmQgYW4gZWFybGllciByZXBvc2l0b3J5J3MgZmFpbHVyZSBtdXN0IG5vdCB2ZXRvIGEgbGF0ZXIgcmVwb3NpdG9yeSdzIHVwbG9hZC5cbiAgICBmbm94U3luY0ZhaWxlZCA9IGZhbHNlO1xuICAgIC8vIEEgcmVwb3NpdG9yeSBvdXRzaWRlIFdpbGxCb29zdGVyL1dpbGxCb29zdGVyTGFiIG1hbmFnZXMgaXRzIG93biByZWNpcGllbnQgc2V0IChlLmcuIGFcbiAgICAvLyBwZXJzb25hbCByZXBvc2l0b3J5IHdpdGggaXRzIG93biBDSSBpZGVudGl0eSksIHNvIHJld3JpdGluZyBpdCB0byB0aGUgb3JnIHJvc3RlciB3b3VsZCBncmFudFxuICAgIC8vIG9yZyBtZW1iZXJzIGFjY2VzcyBhbmQgcmUtZW5jcnlwdCBzZWNyZXRzIGZvciBhIENJIGtleSB0aGF0IHJlcG9zaXRvcnkgZG9lcyBub3QgdXNlLlxuICAgIC8vIHNldHVwU2VjcmV0cyBuZXZlciB1cGxvYWRzIHNlY3JldHMgZm9yIHN1Y2ggcmVwb3NpdG9yaWVzIGVpdGhlciwgc28gc2tpcCBlbnRpcmVseS5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHJldHVybjtcbiAgICBjb25zdCBhZ2VSZWNpcGllbnRzID0gZ2V0Rm5veEFnZVJlY2lwaWVudHMocm9vdENvbmZpZyk7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICAvLyBBIG5lc3RlZC1vbmx5IGZub3ggbGF5b3V0IGlzIHVuc3VwcG9ydGVkOiBzZXR1cFNlY3JldHMgd291bGQgdGFrZSB0aGUgZG90ZW52IHBhdGggYW5kXG4gICAgICAvLyBkZWxldGUgRk5PWF9BR0VfS0VZIGV2ZW4gdGhvdWdoIHRoZSBuZXN0ZWQgY29uZmlnJ3MgQ0kgc3RpbGwgbmVlZHMgaXQuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBPbmx5IGFnZS11c2luZyBjb25maWdzIGNhcnJ5IHRoYXQgcmlzay4gV2l0aG91dCBhIHJvb3QgcHJvdmlkaW5nIHRoZSBhZ2UgcHJvdmlkZXIsIGFcbiAgICAgICAgLy8gc3RyYXkgY29uZmlnIHRoYXQgZGVjbGFyZXMgbm9uZSB1c2VzIG5vIGFnZSBlbmNyeXB0aW9uIGF0IGFsbCAoZS5nLiBhIHBsYWludGV4dCB0ZXN0XG4gICAgICAgIC8vIGZpeHR1cmUgb3IgZXhhbXBsZSBjb25maWcgYW55IHJlcG9zaXRvcnkgbWF5IGxlZ2l0aW1hdGVseSBjb21taXQpLCBzbyBpdCBuZWl0aGVyIG5lZWRzXG4gICAgICAgIC8vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gbm9yIG93bnMgYW4gRk5PWF9BR0VfS0VZIGFuZCBtdXN0IG5vdCBibG9jayB0aGUgcnVuLlxuICAgICAgICBjb25zdCBzdHJheUZpbGVQYXRocyA9IGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aCkuZmlsdGVyKChmaWxlUGF0aCkgPT5cbiAgICAgICAgICBkZWNsYXJlc0Zub3hBZ2VQcm92aWRlcihmaWxlUGF0aClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN0cmF5RmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBmbm94IGNvbmZpZ3MgZXhpc3Qgd2l0aG91dCBhIHJvb3QgZm5veC50b21sOiAke3N0cmF5RmlsZVBhdGhzLmpvaW4oJywgJyl9LiBBZGQgYSByb290IGZub3gudG9tbC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRmFpbCBjbG9zZWQ6IHdpdGhvdXQgZ2l0IGluZm9ybWF0aW9uIGEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgY2Fubm90IGJlIHJ1bGVkIG91dCwgYW5kXG4gICAgICAgIC8vIHNldHVwU2VjcmV0cyB3b3VsZCBvdGhlcndpc2UgdGFrZSB0aGUgZG90ZW52IHBhdGggYW5kIGRlbGV0ZSBGTk9YX0FHRV9LRVkuXG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIGNoZWNrIGZvciBuZXN0ZWQgZm5veCBjb25maWdzIGR1ZSB0bzogJHsoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBmYWlsZWQgdmlzaWJpbGl0eSBsb29rdXAgY29sbGFwc2VzIGlzUHVibGljUmVwbyB0byBmYWxzZSwgd2hpY2ggd291bGQgc2lsZW50bHkgcmUtZW5jcnlwdFxuICAgIC8vIGEgcHVibGljIHJlcG9zaXRvcnkncyB3b3JsZC1yZWFkYWJsZSBjaXBoZXJ0ZXh0cyB0byB0aGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5IChhbmQgdmljZVxuICAgIC8vIHZlcnNhIGRyb3AgdGhlIHB1YmxpYyBvbmUpLiBGYWlsIGluc3RlYWQgb2YgZ3Vlc3Npbmcgd2hlbmV2ZXIgdmlzaWJpbGl0eSBjaGFuZ2VzIHRoZSByb3N0ZXIuXG4gICAgaWYgKCFyb290Q29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biAmJiBkb2VzRm5veFJlY2lwaWVudFNldERlcGVuZE9uVmlzaWJpbGl0eShyb290Q29uZmlnKSkge1xuICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSB0aGUgdmlzaWJpbGl0eSBvZiAke3Jvb3RDb25maWcucmVwb0F1dGhvcn0vJHtyb290Q29uZmlnLnJlcG9OYW1lfSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAoR2l0SHViIGxvb2t1cCBmYWlsZWQpIGFuZCB0aGUgQ0kgcmVjaXBpZW50IGRlcGVuZHMgb24gaXQuIENoZWNrIG5ldHdvcmsgYW5kIGdoIGF1dGhlbnRpY2F0aW9uLCB0aGVuIHJlcnVuIHdiZnkuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQm90aCBDSSBpZGVudGl0aWVzIGFyZSB2aXNpYmlsaXR5LWNvbnN0cmFpbmVkLCBzbyBhIHJlcG9zaXRvcnkgY2FuIGZhbGwgdGhyb3VnaCBCT1RIIChlLmcuIGFcbiAgICAvLyBwdWJsaWMgV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yeSwgd2hvc2Ugb3JnYW5pemF0aW9uIGhhcyBubyBQVUJMSUNfRk5PWF9BR0VfS0VZIHNlY3JldCkuXG4gICAgLy8gUmUtZW5jcnlwdGluZyBmb3IgYSByb3N0ZXIgd2l0aG91dCBhIENJIGlkZW50aXR5IHdvdWxkIGxlYXZlIENJIHVuYWJsZSB0byBkZWNyeXB0IGFueXRoaW5nLFxuICAgIC8vIGZhaWxpbmcgb25seSBhdCBydW50aW1lIGluIEFjdGlvbnM7IGZhaWwgbG91ZGx5IGhlcmUgaW5zdGVhZC5cbiAgICBpZiAoIXJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG5vIENJIGlkZW50aXR5IGlzIHNjb3BlZCB0byAke3Jvb3RDb25maWcucmVwb0F1dGhvcn0vJHtyb290Q29uZmlnLnJlcG9OYW1lfSAocHVibGljIHJlcG9zaXRvcmllcyBhcmUgc3VwcG9ydGVkIG9ubHkgaW4gdGhlIFdpbGxCb29zdGVyIG9yZ2FuaXphdGlvbikuIFByb3Zpc2lvbiB0aGUgbWF0Y2hpbmcgb3JnYW5pemF0aW9uIHNlY3JldCBhbmQgZXh0ZW5kIHRoZSBDSSBzY29wZXMgaW4gd2JmeSBmaXJzdC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgbWlncmF0aW9uIGlzIHRyYW5zYWN0aW9uYWwgb3ZlciBldmVyeSBtYW5hZ2VkIGZub3gudG9tbDogcmVydW5zIG11c3QgcmV0cnkgZnJvbSB0aGVcbiAgICAvLyBvcmlnaW5hbCBzdGF0ZSwgYW5kIGEgcGFydGlhbGx5IG1pZ3JhdGVkIHRyZWUgY291bGQgb3RoZXJ3aXNlIGJlY29tZSB1bmRlY3J5cHRhYmxlIGZvciB0aGVcbiAgICAvLyBpZGVudGl0eSBwZXJmb3JtaW5nIGEgbGF0ZXIgcmV0cnkgKGUuZy4gd2hlbiBhIHJlY2lwaWVudCBpcyBiZWluZyByZW1vdmVkKS5cbiAgICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIC8vIEEgZmFpbGVkIHN5bmNocm9uaXphdGlvbiBtdXN0IGZhaWwgdGhlIHdob2xlIHdiZnkgcnVuOiBleGl0aW5nIHplcm8gd2l0aCBzdGFsZSByZWNpcGllbnRzXG4gICAgLy8gd291bGQgbGVhdmUgc2VjcmV0cyB1bmRlY3J5cHRhYmxlIGZvciBuZXcgcmVjaXBpZW50cyB3aGlsZSBsb29raW5nIHN1Y2Nlc3NmdWwuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFueSBmbm94IGNvbmZpZyAoaW5jbHVkaW5nIGFsaWFzZXMgYW5kIGxvY2FsIG92ZXJyaWRlcykgaW4gYW4gYW5jZXN0b3IgZGlyZWN0b3J5IHdvdWxkXG4gICAgICAvLyBtZXJnZSBpbnRvIChhbmQgcG9zc2libHkgYmUgUkVXUklUVEVOIGJ5KSB0aGlzIHJlcG9zaXRvcnkncyBgZm5veCByZWVuY3J5cHRgIHRocm91Z2hcbiAgICAgIC8vIGhpZXJhcmNoaWNhbCBsb2FkaW5nLCB1c2luZyB0aGlzIHJlcG9zaXRvcnkncyByZWNpcGllbnQgc2V0IGZvciBmb3JlaWduIHNlY3JldHMuXG4gICAgICBmb3IgKGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJvb3REaXJQYXRoKTsgOyBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGFuY2VzdG9yRm5veEZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoKTtcbiAgICAgICAgaWYgKGFuY2VzdG9yRm5veEZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYW4gYW5jZXN0b3IgZGlyZWN0b3J5IGNvbnRhaW5zIGZub3ggY29uZmlncyB0aGF0IGZub3ggd291bGQgaGllcmFyY2hpY2FsbHkgbWVyZ2UgYW5kIHJld3JpdGU6ICR7YW5jZXN0b3JGbm94RmlsZU5hbWVzXG4gICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSlcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBSZW1vdmUgdGhlbSBvciBtb3ZlIHRoZSByZXBvc2l0b3J5LmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aC5kaXJuYW1lKGRpclBhdGgpID09PSBkaXJQYXRoKSBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIGZub3ggYWxzbyBsb2FkcyBjb21taXR0ZWQgY29uZmlnIGFsaWFzZXMgdGhpcyBnZW5lcmF0b3IgY2Fubm90IGtlZXAgaW4gc3luYy5cbiAgICAgIGNvbnN0IGZub3hMaWtlRmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkRmlsZVBhdGhzID0gZm5veExpa2VGaWxlUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgIT09ICdmbm94LnRvbWwnKTtcbiAgICAgIGlmICh1bnN1cHBvcnRlZEZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBvbmx5IGZub3gudG9tbCBmaWxlcyBhcmUgc3VwcG9ydGVkOiAke3Vuc3VwcG9ydGVkRmlsZVBhdGhzLmpvaW4oJywgJyl9LiBNZXJnZSB0aGVtIGludG8gdGhlIGFkamFjZW50IGZub3gudG9tbC5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpclBhdGhzID0gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHMpO1xuICAgICAgaWYgKCFkaXJQYXRocy5pbmNsdWRlcyhyb290RGlyUGF0aCkpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnZm5veC50b21sJyl9IGlzIGludmlzaWJsZSB0byBnaXQgKGdpdGlnbm9yZWQ/KS4gQ29tbWl0IGl0IG9yIHJlbW92ZSBpdC5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSBnaXRpZ25vcmVkIGZpbGVzLCBzbyBhbHNvIGluc3BlY3QgZXZlcnkgZGlyZWN0b3J5IGluIGVhY2hcbiAgICAgIC8vIG1hbmFnZWQgY29uZmlnJ3MgaGllcmFyY2h5IHRocm91Z2ggdGhlIGZpbGVzeXN0ZW06IGEgZ2l0aWdub3JlZCBhbGlhcyAoZS5nLiAuZm5veC50b21sKVxuICAgICAgLy8gb3IgYSBnaXRpZ25vcmVkIGZub3gudG9tbCBpbiBhbiBpbnRlcm1lZGlhdGUgZGlyZWN0b3J5IHdvdWxkIHN0aWxsIGJlIGxvYWRlZCBieSBmbm94IGFuZFxuICAgICAgLy8gY291bGQgb3ZlcnJpZGUgdGhlIHByb3ZpZGVyIHVzZWQgZm9yIG5lc3RlZCByZS1lbmNyeXB0aW9uLlxuICAgICAgY29uc3QgbWFuYWdlZERpclBhdGhzID0gbmV3IFNldChkaXJQYXRocyk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBoaWVyYXJjaHlEaXJQYXRoIG9mIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGgsIHJvb3REaXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHN0cmF5RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGhpZXJhcmNoeURpclBhdGgpLmZpbHRlcihcbiAgICAgICAgICAgIChuYW1lKSA9PiBuYW1lICE9PSAnZm5veC5sb2NhbC50b21sJyAmJiAhKG5hbWUgPT09ICdmbm94LnRvbWwnICYmIG1hbmFnZWREaXJQYXRocy5oYXMoaGllcmFyY2h5RGlyUGF0aCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc3RyYXlGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBmbm94IHdvdWxkIGxvYWQgdW5tYW5hZ2VkIChnaXRpZ25vcmVkPykgY29uZmlnczogJHtzdHJheUZpbGVOYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGguam9pbihoaWVyYXJjaHlEaXJQYXRoLCBuYW1lKSlcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKX0uIENvbW1pdCB0aGVtIGFzIGZub3gudG9tbCBvciByZW1vdmUgdGhlbS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBIGZub3gubG9jYWwudG9tbCBhbnl3aGVyZSBpbiB0aGUgbWVyZ2VkIGhpZXJhcmNoeSAobm90IG9ubHkgbmV4dCB0byBhIG1hbmFnZWRcbiAgICAgICAgICAvLyBjb25maWcpIGNhbiBvdmVycmlkZSBwcm92aWRlcnMuXG4gICAgICAgICAgY29uc3QgbG9jYWxJc3N1ZSA9IGZpbmRGbm94TG9jYWxUb21sSXNzdWUoaGllcmFyY2h5RGlyUGF0aCk7XG4gICAgICAgICAgaWYgKGxvY2FsSXNzdWUpIHtcbiAgICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtsb2NhbElzc3VlfS4gS2VlcCBvbmx5IG1hY2hpbmUtbG9jYWwgc2VjcmV0IG92ZXJyaWRlcyB0aGVyZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGluLW1lbW9yeSBzbmFwc2hvdHMgZG8gbm90IHN1cnZpdmUgYSBraWxsZWQgcHJvY2Vzcywgc28gYSBkdXJhYmxlIG1hcmtlciBpcyB3cml0dGVuXG4gICAgICAvLyBiZWZvcmUgdGhlIGZpcnN0IG11dGF0aW9uIGFuZCByZW1vdmVkIG9ubHkgd2hlbiB0aGUgdHJlZSBpcyBjb25zaXN0ZW50IGFnYWluLiBBIGxlZnRvdmVyXG4gICAgICAvLyBtYXJrZXIgbWVhbnMgYSBwcmV2aW91cyBydW4gd2FzIGtpbGxlZCBtaWQtbWlncmF0aW9uIChvciBjb3VsZCBub3QgcmVzdG9yZSk6IHNvbWVcbiAgICAgIC8vIGNpcGhlcnRleHRzIG1heSBub3QgbWF0Y2ggdGhlIHJlY2lwaWVudHMsIG9yIG1heSBldmVuIGJlIHVuZGVjcnlwdGFibGUgZm9yIHRoZSBleGVjdXRvcidzXG4gICAgICAvLyBpZGVudGl0eSB3aGVuIGEgcmVjaXBpZW50IHdhcyBiZWluZyByZW1vdmVkIOKAlCBzdGF0ZXMgdGhpcyBjb2RlIGNhbm5vdCByZXBhaXIgc2FmZWx5XG4gICAgICAvLyBiZWNhdXNlIHRoZSB3b3JraW5nIHRyZWUgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSAoYnJhbmNoIHN3aXRjaGVzLCBtYW51YWwgZWRpdHMpLiBUaGVcbiAgICAgIC8vIGZub3gudG9tbCBmaWxlcyBhcmUgZ2l0LXRyYWNrZWQsIHNvIHRoZSB1c2VyIHJlc3RvcmVzIHRoZW0gdmlhIGdpdCBhbmQgY2xlYXJzIHRoZSBtYXJrZXIuXG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbWlncmF0aW9uLW1hcmtlcicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMobWlncmF0aW9uTWFya2VyUGF0aCkpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGEgcHJldmlvdXMgbWlncmF0aW9uIHdhcyBpbnRlcnJ1cHRlZC4gUmVzdG9yZSB0aGUgZm5veC50b21sIGZpbGVzIHZpYSBnaXQgKGUuZy4gXFxgZ2l0IHN0YXR1c1xcYCBhbmQgXFxgZ2l0IHJlc3RvcmUgLS0gJypmbm94Ki50b21sJ1xcYCBpZiB5b3UgaGF2ZSBubyBpbnRlbnRpb25hbCBsb2NhbCBjaGFuZ2VzKSwgdGhlbiBkZWxldGUgJHttaWdyYXRpb25NYXJrZXJQYXRofSBhbmQgcmVydW4gd2JmeS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQSB0cmFja2VkIHN5bWxpbmsgbmFtZWQgZm5veC50b21sIChvciBhIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5KSB3b3VsZCBtYWtlIHRoZVxuICAgICAgLy8gcmV3cml0ZSBhbmQgYGZub3ggcmVlbmNyeXB0YCByZWFkIGFuZCBNT0RJRlkgZmlsZXMgb3V0c2lkZSB0aGlzIHJlcG9zaXRvcnkuXG4gICAgICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgICAgIGNvbnN0IHJlYWxQYXRoID0gZnMucmVhbHBhdGhTeW5jKGZub3hUb21sUGF0aCk7XG4gICAgICAgIGlmIChmcy5sc3RhdFN5bmMoZm5veFRvbWxQYXRoKS5pc1N5bWJvbGljTGluaygpIHx8ICFyZWFsUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKSkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoJHtyZWFsUGF0aH0pLiBSZXBsYWNlIGl0IHdpdGggYSByZWd1bGFyIGluLXJlcG9zaXRvcnkgZmlsZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc25hcHNob3RzLnNldChmbm94VG9tbFBhdGgsIGZzLnJlYWRGaWxlU3luYyhmbm94VG9tbFBhdGgsICd1dGY4JykpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb3J0ZWQgb3JkZXIgcHJvY2Vzc2VzIGFuY2VzdG9ycyBiZWZvcmUgZGVzY2VuZGFudHMsIHNvIGNvbmZpZ3MgaW5oZXJpdGluZyBhbiB1cGRhdGVkXG4gICAgICAvLyBwcm92aWRlciByZS1lbmNyeXB0IGFnYWluc3QgdGhlIGFscmVhZHktdXBkYXRlZCByZWNpcGllbnRzLlxuICAgICAgY29uc3QgY2hhbmdlZERpclBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IGFueUZhaWxlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGFuY2VzdG9yQ2hhbmdlZCA9IGNoYW5nZWREaXJQYXRocy5zb21lKChjaGFuZ2VkRGlyUGF0aCkgPT4gZGlyUGF0aC5zdGFydHNXaXRoKGNoYW5nZWREaXJQYXRoICsgcGF0aC5zZXApKTtcbiAgICAgICAgLy8gRXZlcnkgZGlyUGF0aCB3YXMgc25hcHNob3R0ZWQgYWJvdmUuIEEgbWlzc2luZyBzbmFwc2hvdCBtdXN0IGZhaWwgaGFyZDogZmFsbGluZyBiYWNrIHRvXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b3VsZCBmbG93IGludG8gcmVwbGFjZUFnZVJlY2lwaWVudHMgYW5kIG92ZXJ3cml0ZSB0aGUgcmVhbCBmbm94LnRvbWxcbiAgICAgICAgLy8gd2l0aCBhIHJlY2lwaWVudHMtb25seSBmaWxlLCBkZXN0cm95aW5nIGV2ZXJ5IGNvbW1pdHRlZCBzZWNyZXQuXG4gICAgICAgIGNvbnN0IHNuYXBzaG90Q29udGVudCA9IHNuYXBzaG90cy5nZXQocGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKSk7XG4gICAgICAgIGlmIChzbmFwc2hvdENvbnRlbnQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGZub3gudG9tbCBzbmFwc2hvdCBmb3IgJHtkaXJQYXRofS5gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3luY2hyb25pemVGbm94QWdlUmVjaXBpZW50cyhcbiAgICAgICAgICBkaXJQYXRoLFxuICAgICAgICAgIHJvb3REaXJQYXRoLFxuICAgICAgICAgIGRpclBhdGggPT09IHJvb3REaXJQYXRoLFxuICAgICAgICAgIGFuY2VzdG9yQ2hhbmdlZCxcbiAgICAgICAgICBzbmFwc2hvdENvbnRlbnQsXG4gICAgICAgICAgYWdlUmVjaXBpZW50c1xuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0ID09PSAnY2hhbmdlZCcpIGNoYW5nZWREaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgICBhbnlGYWlsZWQgfHw9IHJlc3VsdCA9PT0gJ2ZhaWxlZCc7XG4gICAgICB9XG4gICAgICBpZiAoYW55RmFpbGVkKSB7XG4gICAgICAgIC8vIEEgZmFpbGVkIHJlLWVuY3J5cHRpb24gbWF5IGhhdmUgcmV3cml0dGVuIHNvbWUgY2lwaGVydGV4dHMsIHNvIHJlc3RvcmUgdW5jb25kaXRpb25hbGx5LlxuICAgICAgICAvLyBUaGUgbWFya2VyIGlzIHJlbW92ZWQgb25seSB3aGVuIHJlc3RvcmF0aW9uIGZ1bGx5IHN1Y2NlZWRlZCBhbmQgdGhlIHRyZWUgaXMgY29uc2lzdGVudC5cbiAgICAgICAgLy8gUmVzdG9yZSBPTkxZIHdoZW4gdGhpcyBydW4gb3ducyB0aGUgbWFya2VyOiBldmVyeSBjb21taXR0ZWQtY29uZmlnIG11dGF0aW9uIGhhcHBlbnNcbiAgICAgICAgLy8gYWZ0ZXIgbWFya2VyIGFjcXVpc2l0aW9uLCBzbyBhIG5vbi1vd25lciAoZS5nLiBsb3NpbmcgYSByYWNlIGFnYWluc3QgYSBjb25jdXJyZW50IHdiZnkpXG4gICAgICAgIC8vIGhhcyBjaGFuZ2VkIG5vdGhpbmcgYW5kIG11c3Qgbm90IG92ZXJ3cml0ZSB0aGUgb3duZXIncyBpbi1wcm9ncmVzcyBtaWdyYXRpb24uXG4gICAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAobWlncmF0aW9uTWFya2VyT3duZWQgJiYgcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHMpKSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGR1ZSB0bzogJHsoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcn1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3luY2hyb25pemVGbm94QWdlUmVjaXBpZW50cyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBpc1Jvb3Q6IGJvb2xlYW4sXG4gIGFuY2VzdG9yUmVjaXBpZW50c0NoYW5nZWQ6IGJvb2xlYW4sXG4gIG9yaWdpbmFsQ29udGVudDogc3RyaW5nLFxuICBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W11cbik6IFByb21pc2U8J2NoYW5nZWQnIHwgJ3VuY2hhbmdlZCcgfCAnZmFpbGVkJz4ge1xuICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuXG4gIC8vIFJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gb25seSB1bmRlcnN0YW5kcyB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUgbGF5b3V0IHdpdGggb25lXG4gIC8vIHRvcC1sZXZlbCBhZ2UgcHJvdmlkZXIgbmFtZWQgYGFnZWAuIEdpdGlnbm9yZWQgY29uZmlnIGFsaWFzZXMgKGUuZy4gLmZub3gubG9jYWwudG9tbCkgdGhhdFxuICAvLyBnaXQtYmFzZWQgZGlzY292ZXJ5IGNhbm5vdCBzZWUsIGltcG9ydHMsIGRpZmZlcmVudGx5IG5hbWVkIGFnZSBwcm92aWRlcnMsIG9yIHByb3ZpZGVyXG4gIC8vIG92ZXJyaWRlcyB3b3VsZCBrZWVwIHVzaW5nIHJlY2lwaWVudCBzZXRzIHRoaXMgZ2VuZXJhdG9yIGRvZXMgbm90IHJld3JpdGUsIHNvIHRoZWlyIHNlY3JldHNcbiAgLy8gd291bGQgc2lsZW50bHkgc3RheSB1bmRlY3J5cHRhYmxlIGZvciBuZXcgcmVjaXBpZW50czsgZmFpbCBpbnN0ZWFkIG9mIHByb2NlZWRpbmcuIFRoZVxuICAvLyBnaXRpZ25vcmVkIGZub3gubG9jYWwudG9tbCBpcyBhIHN1cHBvcnRlZCBtYWNoaW5lLWxvY2FsIG92ZXJyaWRlLCBidXQgb25seSB3aGlsZSBpdCBsZWF2ZXNcbiAgLy8gcHJvdmlkZXJzIGFsb25lLlxuICBjb25zdCB1bnN1cHBvcnRlZEZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoKS5maWx0ZXIoXG4gICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LnRvbWwnICYmIG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnXG4gICk7XG4gIGlmICh1bnN1cHBvcnRlZEZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGluICR7ZGlyUGF0aH0gYmVjYXVzZSBvbmx5IGZub3gudG9tbCBhbmQgZm5veC5sb2NhbC50b21sIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlTmFtZXMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byBmbm94LnRvbWwuYFxuICAgICk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIC8vIEEgc3RhbGUgYmFja3VwIGxlZnQgYnkgYW4gaW50ZXJydXB0ZWQgZWFybGllciBydW4gbXVzdCBiZSByZXN0b3JlZCBzbyB0aGUgdXNlcidzIGxvY2FsXG4gIC8vIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdCAodGhlIG1pZ3JhdGlvbiBtYXJrZXIgc2VwYXJhdGVseSBibG9ja3MgdGhpcyBydW4gd2hlbiB0aGVcbiAgLy8gaW50ZXJydXB0aW9uIGxlZnQgdGhlIG1pZ3JhdGlvbiBpdHNlbGYgaW5jb21wbGV0ZSkuXG4gIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG5cbiAgY29uc3QgbGF5b3V0SXNzdWUgPSBmaW5kRm5veExheW91dElzc3VlKG9yaWdpbmFsQ29udGVudCk7XG4gIGlmIChsYXlvdXRJc3N1ZSkge1xuICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2Zub3hUb21sUGF0aH0gJHtsYXlvdXRJc3N1ZX0uYCk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2Uob3JpZ2luYWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgY29uc3QgcHJvZmlsZU5hbWVzID0gT2JqZWN0LmtleXMoc2V0dGluZ3MucHJvZmlsZXMgPz8ge30pO1xuICBjb25zdCBjdXJyZW50UmVjaXBpZW50cyA9IHJlYWRGbm94QWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQpO1xuXG4gIC8vIEEgbmVzdGVkIGZub3gudG9tbCB3aXRob3V0IGl0cyBvd24gYWdlIHByb3ZpZGVyIGluaGVyaXRzIHRoZSBuZWFyZXN0IGFuY2VzdG9yJ3Mgb25lIHRocm91Z2hcbiAgLy8gZm5veCdzIGhpZXJhcmNoaWNhbCBsb2FkaW5nLCBzbyBvbmx5IHRoZSByb290IGNvbmZpZyBtdXN0IGRlY2xhcmUgdGhlIHByb3ZpZGVyIOKAlCBidXQgdGhlXG4gIC8vIG5lc3RlZCBjb25maWcncyBvd24gY2lwaGVydGV4dHMgc3RpbGwgbXVzdCBiZSByZS1lbmNyeXB0ZWQgd2hlbmV2ZXIgYW4gYW5jZXN0b3IncyByZWNpcGllbnRzXG4gIC8vIGNoYW5nZWQsIGFuZCB0aGF0IG9ubHkgaGFwcGVucyB3aGVuIGBmbm94IHJlZW5jcnlwdGAgcnVucyBmcm9tIHRoZSBuZXN0ZWQgZGlyZWN0b3J5LlxuICBpZiAoIWlzUm9vdCAmJiAhY3VycmVudFJlY2lwaWVudHMpIHtcbiAgICBpZiAoYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZCkge1xuICAgICAgd3JpdGVNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIGlmICghcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aCwgcm9vdERpclBhdGgsIHByb2ZpbGVOYW1lcykpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmUtZW5jcnlwdCBmbm94IHNlY3JldHMgaW4gJHtkaXJQYXRofSBmb3IgdGhlIHVwZGF0ZWQgcmVjaXBpZW50cy4gRml4IHRoZSBlcnJvciBhbmQgcmVydW4gd2JmeS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiAnZmFpbGVkJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICd1bmNoYW5nZWQnO1xuICB9XG5cbiAgaWYgKFxuICAgIGN1cnJlbnRSZWNpcGllbnRzICYmXG4gICAgY3VycmVudFJlY2lwaWVudHMuc2l6ZSA9PT0gYWdlUmVjaXBpZW50cy5sZW5ndGggJiZcbiAgICBhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IGN1cnJlbnRSZWNpcGllbnRzLmhhcyhyZWNpcGllbnQucHVibGljS2V5KSlcbiAgKSB7XG4gICAgcmV0dXJuICd1bmNoYW5nZWQnO1xuICB9XG5cbiAgLy8gUmV3cml0ZSBvbmx5IHRoZSByZWNpcGllbnRzIGFzc2lnbm1lbnQgc28gdXNlci1hdXRob3JlZCBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBzdXJ2aXZlLlxuICAvLyBSZS1wYXJzZSBiZWZvcmUgd3JpdGluZzogYW4gdW51c3VhbCBsYXlvdXQgKGUuZy4gZG90dGVkIGtleXMpIGNvdWxkIG1ha2UgdGhlIHRleHR1YWwgZWRpdFxuICAvLyBwcm9kdWNlIGEgZHVwbGljYXRlIHRhYmxlIG9yIGxlYXZlIHRoZSBvbGQgcmVjaXBpZW50cyBpbiBlZmZlY3QuXG4gIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gcmVwbGFjZUFnZVJlY2lwaWVudHMob3JpZ2luYWxDb250ZW50LCBhZ2VSZWNpcGllbnRzKTtcbiAgY29uc3QgdXBkYXRlZFJlY2lwaWVudHMgPSBbLi4uKHJlYWRGbm94QWdlUmVjaXBpZW50cyh1cGRhdGVkQ29udGVudCkgPz8gW10pXTtcbiAgaWYgKFxuICAgIHVwZGF0ZWRSZWNpcGllbnRzLmxlbmd0aCAhPT0gYWdlUmVjaXBpZW50cy5sZW5ndGggfHxcbiAgICAhYWdlUmVjaXBpZW50cy5ldmVyeSgocmVjaXBpZW50KSA9PiB1cGRhdGVkUmVjaXBpZW50cy5pbmNsdWRlcyhyZWNpcGllbnQucHVibGljS2V5KSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXdyaXRpbmcgdGhlIGFnZSByZWNpcGllbnRzIGluICR7Zm5veFRvbWxQYXRofSBkaWQgbm90IHRha2UgZWZmZWN0OyB1cGRhdGUgdGhlbSBtYW51YWxseS5gKTtcbiAgfVxuICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuXG4gIGlmICghcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aCwgcm9vdERpclBhdGgsIHByb2ZpbGVOYW1lcykpIHtcbiAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjb25maWc6IGtlZXBpbmcgdGhlIG5ldyByZWNpcGllbnRzIHdpdGggb2xkIGNpcGhlcnRleHRzIHdvdWxkIG1ha2VcbiAgICAvLyB0aGlzIGdlbmVyYXRvciBza2lwIHJlLWVuY3J5cHRpb24gZm9yZXZlciBhbmQgbGV0IHNldHVwU2VjcmV0cyB1cGxvYWQgYSBDSSBrZXkgdGhhdFxuICAgIC8vIGNhbm5vdCBkZWNyeXB0IGFueXRoaW5nLiBUaGUgb2xkIGNpcGhlcnRleHRzIHJlbWFpbiB2YWxpZCBmb3IgdGhlIG9sZCByZWNpcGllbnRzLlxuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCBvcmlnaW5hbENvbnRlbnQpO1xuICAgIGZhaWxGbm94U3luYyhcbiAgICAgIGBGYWlsZWQgdG8gcmUtZW5jcnlwdCBmbm94IHNlY3JldHMgaW4gJHtkaXJQYXRofSBmb3IgdGhlIHVwZGF0ZWQgcmVjaXBpZW50cy4gRml4IHRoZSBlcnJvciBhbmQgcmVydW4gd2JmeS5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgcmV0dXJuICdjaGFuZ2VkJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYSBmbm94LnRvbWwgbGF5b3V0IHRoYXQgcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBhbmQgdGhlIENJLWtleVxuICogdmVyaWZpY2F0aW9uIGNhbm5vdCBjb3Zlciwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHN0YW5kYXJkIHNpbmdsZS1maWxlLCBzaW5nbGUtYWdlLXByb3ZpZGVyXG4gKiBsYXlvdXQgaXMgdXNlZC5cbiAqL1xuZnVuY3Rpb24gZmluZEZub3hMYXlvdXRJc3N1ZShmbm94VG9tbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmIChzZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCkgcmV0dXJuICd1c2VzIHRoZSB1bnN1cHBvcnRlZCBgaW1wb3J0YCBzZXR0aW5nJztcbiAgICBjb25zdCBub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm92aWRlcnMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbbmFtZSwgcHJvdmlkZXJdKSA9PiAocHJvdmlkZXI/LnR5cGUgPT09ICdhZ2UnKSAhPT0gKG5hbWUgPT09ICdhZ2UnKSlcbiAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7XG4gICAgaWYgKG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYGRlY2xhcmVzIGFnZSBwcm92aWRlcnMgbm90IG5hbWVkIFxcYGFnZVxcYCAob3IgYW4gXFxgYWdlXFxgIHByb3ZpZGVyIG9mIGFub3RoZXIgdHlwZSk6ICR7bm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmpvaW4oJywgJyl9YDtcbiAgICB9XG4gICAgY29uc3QgcHJvZmlsZXNXaXRoUHJvdmlkZXJzID0gT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MucHJvZmlsZXMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbLCBwcm9maWxlXSkgPT4gcHJvZmlsZT8ucHJvdmlkZXJzKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAocHJvZmlsZXNXaXRoUHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgdW5zdXBwb3J0ZWQgcHJvZmlsZS1zcGVjaWZpYyBwcm92aWRlcnM6ICR7cHJvZmlsZXNXaXRoUHJvdmlkZXJzLmpvaW4oJywgJyl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICdjYW5ub3QgYmUgcGFyc2VkIGFzIFRPTUwnO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIFtwcm92aWRlcnMuYWdlXS5yZWNpcGllbnRzIG9mIGEgZm5veC50b21sLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgY29uZmlnIGRlY2xhcmVzIG5vXG4gKiBhZ2UgcHJvdmlkZXIgKG5lc3RlZCBjb25maWdzIHRoZW4gaW5oZXJpdCB0aGUgcm9vdCBvbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZub3hBZ2VSZWNpcGllbnRzKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZm5veFRvbWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgICBpZiAoIXNldHRpbmdzLnByb3ZpZGVycz8uYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBzZXR0aW5ncy5wcm92aWRlcnMuYWdlLnJlY2lwaWVudHM7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuaXNBcnJheShyZWNpcGllbnRzKSA/IHJlY2lwaWVudHMuZmlsdGVyKChyKTogciBpcyBzdHJpbmcgPT4gdHlwZW9mIHIgPT09ICdzdHJpbmcnKSA6IFtdKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQW4gdW5wYXJzYWJsZSBmbm94LnRvbWwgeWllbGRzIG5vIHJlY2lwaWVudHMsIHNvIHRoZSBjYWxsZXIgcmVwb3J0cyBhbiBlcnJvci5cbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG59XG5cbnR5cGUgRm5veFJlcG9zaXRvcnlJZGVudGl0eSA9IFBpY2s8UGFja2FnZUNvbmZpZywgJ3JlcG9BdXRob3InIHwgJ3JlcG9OYW1lJyB8ICdpc1B1YmxpY1JlcG8nIHwgJ2lzUmVwb1Zpc2liaWxpdHlLbm93bic+O1xuXG4vKipcbiAqIFRoZSBHaXRIdWIgc2VjcmV0IGhvbGRpbmcgdGhlIHByaXZhdGUga2V5IG9mIHRoZSBDSSBpZGVudGl0eSBzY29wZWQgdG8gdGhlIHJlcG9zaXRvcnksIG9yXG4gKiB1bmRlZmluZWQgd2hlbiBub25lIGlzIChhbiB1bmtub3duIHZpc2liaWxpdHksIG9yIGEgcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMpLiBUaGUgc2luZ2xlXG4gKiBzb3VyY2Ugb2YgdHJ1dGggc2hhcmVkIGJ5IHRoZSByZWNpcGllbnQgc3luYyBhbmQgdGhlIHdvcmtmbG93IGdlbmVyYXRvcidzIGNhbGxlciBtYXBwaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKFxuICBjb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHlcbik6ICdGTk9YX0FHRV9LRVknIHwgJ1BVQkxJQ19GTk9YX0FHRV9LRVknIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2lQcmluY2lwYWw6IEZub3hBZ2VQcmluY2lwYWwgfCB1bmRlZmluZWQgPSBGTk9YX0FHRV9QUklOQ0lQQUxTLmZpbmQoXG4gICAgKHByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCkgPT5cbiAgICAgIHByaW5jaXBhbC5jaUFnZUtleVNlY3JldE5hbWUgJiYgbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUocHJpbmNpcGFsLnJlcG9zaXRvcnlTY29wZSwgY29uZmlnKVxuICApO1xuICByZXR1cm4gY2lQcmluY2lwYWw/LmNpQWdlS2V5U2VjcmV0TmFtZTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlY2lwaWVudCBzZXQgZGlmZmVycyBiZXR3ZWVuIHRoZSBwdWJsaWMgYW5kIHByaXZhdGUgcmVhZGluZyBvZiB0aGUgcmVwb3NpdG9yeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzRm5veFJlY2lwaWVudFNldERlcGVuZE9uVmlzaWJpbGl0eShcbiAgcm9vdENvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHB1YmxpY0tleXNGb3IgPSAoaXNQdWJsaWNSZXBvOiBib29sZWFuKTogc3RyaW5nID0+XG4gICAgZ2V0Rm5veEFnZVJlY2lwaWVudHMoeyAuLi5yb290Q29uZmlnLCBpc1B1YmxpY1JlcG8sIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHJ1ZSB9KVxuICAgICAgLm1hcCgoeyBwdWJsaWNLZXkgfSkgPT4gcHVibGljS2V5KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gcHVibGljS2V5c0Zvcih0cnVlKSAhPT0gcHVibGljS2V5c0ZvcihmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnOiBGbm94UmVwb3NpdG9yeUlkZW50aXR5KTogRm5veEFnZVJlY2lwaWVudFtdIHtcbiAgcmV0dXJuIEZOT1hfQUdFX1BSSU5DSVBBTFMuZmlsdGVyKChwcmluY2lwYWwpID0+XG4gICAgbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUocHJpbmNpcGFsLnJlcG9zaXRvcnlTY29wZSwgcm9vdENvbmZpZylcbiAgKS5mbGF0TWFwKChwcmluY2lwYWwpID0+XG4gICAgcHJpbmNpcGFsLnB1YmxpY0tleXMubWFwKChwdWJsaWNLZXksIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogcHJpbmNpcGFsLnB1YmxpY0tleXMubGVuZ3RoID09PSAxID8gcHJpbmNpcGFsLm5hbWUgOiBgJHtwcmluY2lwYWwubmFtZX0ke2luZGV4ICsgMX1gLFxuICAgICAgcHVibGljS2V5LFxuICAgIH0pKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUoc2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGUsIHJlcG9zaXRvcnk6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBib29sZWFuIHtcbiAgY29uc3Qgb3duZXIgPSByZXBvc2l0b3J5LnJlcG9BdXRob3I/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG5hbWUgPSByZXBvc2l0b3J5LnJlcG9OYW1lPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIW93bmVyIHx8ICFuYW1lKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQW4gdW5rbm93biB2aXNpYmlsaXR5IChmYWlsZWQgR2l0SHViIGxvb2t1cCkgbWF0Y2hlcyBubyB2aXNpYmlsaXR5LWNvbnN0cmFpbmVkIHNjb3BlOiBjYWxsZXJzXG4gIC8vIHRoYXQgd291bGQgcmV3cml0ZSByZWNpcGllbnRzIGZhaWwgaW5zdGVhZCBvZiBlbmNyeXB0aW5nIHRvIHRoZSB3cm9uZyBDSSBpZGVudGl0eS5cbiAgaWYgKFxuICAgIHNjb3BlLnZpc2liaWxpdHkgJiZcbiAgICAoIXJlcG9zaXRvcnkuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IChzY29wZS52aXNpYmlsaXR5ID09PSAncHVibGljJykgIT09IHJlcG9zaXRvcnkuaXNQdWJsaWNSZXBvKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIChzY29wZS5vcmdhbml6YXRpb25zPy5zb21lKChvcmdhbml6YXRpb24pID0+IG9yZ2FuaXphdGlvbi50b0xvd2VyQ2FzZSgpID09PSBvd25lcikgPz8gZmFsc2UpIHx8XG4gICAgKHNjb3BlLnJlcG9zaXRvcmllcz8uc29tZSgoZnVsbE5hbWUpID0+IGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGAke293bmVyfS8ke25hbWV9YCkgPz8gZmFsc2UpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VBZ2VSZWNpcGllbnRzKGNvbnRlbnQ6IHN0cmluZywgYWdlUmVjaXBpZW50czogcmVhZG9ubHkgRm5veEFnZVJlY2lwaWVudFtdKTogc3RyaW5nIHtcbiAgLy8gVHJhaWxpbmcgbmFtZSBjb21tZW50cyBsZXQgaHVtYW5zIHRlbGwgd2hvc2Uga2V5IGVhY2ggcmVjaXBpZW50IGlzIHdpdGhvdXQgY29uc3VsdGluZyB3YmZ5LlxuICBjb25zdCByZWNpcGllbnRzVGV4dCA9IGByZWNpcGllbnRzID0gW1xcbiR7YWdlUmVjaXBpZW50c1xuICAgIC5tYXAoKHJlY2lwaWVudCkgPT4gYCAgXCIke3JlY2lwaWVudC5wdWJsaWNLZXl9XCIsICMgJHtyZWNpcGllbnQubmFtZX1gKVxuICAgIC5qb2luKCdcXG4nKX1cXG5dYDtcbiAgLy8gd2JmeSB3cml0ZXMgYSBbcHJvdmlkZXJzLmFnZV0gdGFibGUgKHBvc3NpYmx5IHdpdGggYSB0cmFpbGluZyBjb21tZW50KS4gU2NhbiBsaW5lLXdpc2Ugc28gdGhhdFxuICAvLyBhIGBbYCBpbnNpZGUgYSBjb21tZW50IG9yIGEgc3RyaW5nIG5ldmVyIHRlcm1pbmF0ZXMgdGhlIHRhYmxlIGVhcmx5OyB0aGUgdGFibGUgZW5kcyBhdCB0aGVcbiAgLy8gbmV4dCBsaW5lLXN0YXJ0IHRhYmxlIGhlYWRlci4gVGhlIGFzc2lnbm1lbnQgbWF0Y2ggaXMgbGluZS1hbmNob3JlZCBzbyBhIGNvbW1lbnRlZC1vdXRcbiAgLy8gYCMgcmVjaXBpZW50cyA9IFsuLi5dYCBpcyBuZXZlciBtaXN0YWtlbiBmb3IgdGhlIHJlYWwgb25lLCB3aGlsZSBtdWx0aWxpbmUgYXJyYXlzIHN0aWxsIG1hdGNoXG4gIC8vIGJlY2F1c2UgdGhlIG5lZ2F0ZWQgY2xhc3MgW15cXF1dICh1bmxpa2UgYC5gKSBzcGFucyBuZXdsaW5lcy4gQW55IG90aGVyIHNwZWxsaW5nIGZhbGxzIHRocm91Z2hcbiAgLy8gdG8gdGhlIGNhbGxlcidzIHJlLXBhcnNlIHZhbGlkYXRpb24sIHdoaWNoIGZhaWxzIHRoZSBydW4gc2FmZWx5IHdpdGggaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2ZcbiAgLy8gY29ycnVwdGluZyB0aGUgZmlsZS5cbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgaGVhZGVySW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+IC9eXFxzKlxcW3Byb3ZpZGVyc1xcLmFnZVxcXVxccyooPzojLiopPyQvdS50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ICE9PSAtMSkge1xuICAgIGxldCBlbmRJbmRleCA9IGxpbmVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpbmRleCA9IGhlYWRlckluZGV4ICsgMTsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmICgvXlxccypcXFsvdS50ZXN0KGxpbmVzW2luZGV4XSA/PyAnJykpIHtcbiAgICAgICAgZW5kSW5kZXggPSBpbmRleDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlY3Rpb24gPSBsaW5lcy5zbGljZShoZWFkZXJJbmRleCwgZW5kSW5kZXgpLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IHJlcGxhY2VkU2VjdGlvbiA9IHNlY3Rpb24ucmVwbGFjZSgvXlxccypyZWNpcGllbnRzXFxzKj1cXHMqXFxbW15cXF1dKlxcXS9tdSwgcmVjaXBpZW50c1RleHQpO1xuICAgIGNvbnN0IG5ld1NlY3Rpb24gPVxuICAgICAgcmVwbGFjZWRTZWN0aW9uID09PSBzZWN0aW9uXG4gICAgICAgID8gW2xpbmVzW2hlYWRlckluZGV4XSwgcmVjaXBpZW50c1RleHQsIC4uLmxpbmVzLnNsaWNlKGhlYWRlckluZGV4ICsgMSwgZW5kSW5kZXgpXS5qb2luKCdcXG4nKVxuICAgICAgICA6IHJlcGxhY2VkU2VjdGlvbjtcbiAgICByZXR1cm4gWy4uLmxpbmVzLnNsaWNlKDAsIGhlYWRlckluZGV4KSwgbmV3U2VjdGlvbiwgLi4ubGluZXMuc2xpY2UoZW5kSW5kZXgpXS5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gYCR7Y29udGVudC50cmltRW5kKCl9XFxuXFxuW3Byb3ZpZGVycy5hZ2VdXFxudHlwZSA9IFwiYWdlXCJcXG4ke3JlY2lwaWVudHNUZXh0fVxcbmA7XG59XG5cbi8vIFJlLWVuY3J5cHRzIHRoZSBiYXNlIHNlY3JldHMgYW5kIGVhY2ggcHJvZmlsZSdzIG93biBzZWNyZXRzICgtLW5vLWRlZmF1bHRzIGtlZXBzIHRoZSBtZXJnZWRcbi8vIGJhc2Ugc2VjcmV0cyBmcm9tIGJlaW5nIGR1cGxpY2F0ZWQgaW50byBwcm9maWxlIHRhYmxlcykgZm9yIHRoZSBjdXJyZW50IHJlY2lwaWVudCBzZXQuIFRoZVxuLy8gc3Bhd25lZCBmbm94IHJ1bnMgd2l0aCBhbiBpc29sYXRlZCBIT01FL1hER19DT05GSUdfSE9NRSBiZWNhdXNlIGZub3ggbWVyZ2VzIHRoZSB1c2VyLWdsb2JhbFxuLy8gfi8uY29uZmlnL2Zub3gvY29uZmlnLnRvbWwgaW50byBldmVyeSBwcm9qZWN0IGNvbmZpZyDigJQgYSBwbGFpbiByZWVuY3J5cHQgd291bGQgcmV3cml0ZSB0aGVcbi8vIHVzZXIncyBnbG9iYWwgc2VjcmV0cyB0b28uIERlY3J5cHRpb24gdGhlcmVmb3JlIG5lZWRzIHRoZSBwZXJzb25hbCBpZGVudGl0eSBwYXNzZWQgZXhwbGljaXRseVxuLy8gdmlhIEZOT1hfQUdFX0tFWTsgRk5PWF9QUk9GSUxFIGlzIHN0cmlwcGVkIHNvIGl0IGNhbm5vdCByZWRpcmVjdCB0aGUgYmFzZSAobm8gLVApIHJ1bi5cbmZ1bmN0aW9uIHJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZywgcHJvZmlsZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBUaGUgaWRlbnRpdHkgaXMgb3B0aW9uYWw6IGEgcGxhaW50ZXh0LW9ubHkgY29uZmlnIGhhcyBub3RoaW5nIHRvIGRlY3J5cHQgYW5kIGZub3ggc3VjY2VlZHNcbiAgLy8gd2l0aG91dCBvbmUsIHdoaWxlIGV4aXN0aW5nIGNpcGhlcnRleHRzIG1ha2UgZm5veCBmYWlsIGxvdWRseSBvbiBpdHMgb3duLlxuICBjb25zdCBpZGVudGl0eSA9IHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpID8/IHByb2Nlc3MuZW52LkZOT1hfQUdFX0tFWTtcbiAgY29uc3QgZm5veENvbW1hbmQgPSByZXNvbHZlRm5veENvbW1hbmQoZGlyUGF0aCk7XG4gIGNvbnN0IGlzb2xhdGVkSG9tZURpclBhdGggPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICd3YmZ5LWZub3gtaG9tZS0nKSk7XG4gIHRyeSB7XG4gICAgLy8gSGlkZSB0aGUgbG9jYWwgb3ZlcnJpZGVzIG9mIEVWRVJZIGRpcmVjdG9yeSBmbm94IG1lcmdlcyBoaWVyYXJjaGljYWxseSAoZnJvbSB0aGUgY29tbWFuZFxuICAgIC8vIGRpcmVjdG9yeSB1cCB0byB0aGUgcmVwb3NpdG9yeSByb290KTogYW4gYW5jZXN0b3IncyBmbm94LmxvY2FsLnRvbWwgd291bGQgb3RoZXJ3aXNlIHNoYWRvd1xuICAgIC8vIGNvbW1pdHRlZCBzZWNyZXRzIG9yIGl0c2VsZiBnZXQgcmV3cml0dGVuIGJ5IHRoZSByZS1lbmNyeXB0aW9uLlxuICAgIHJldHVybiB3aXRoRm5veExvY2Fsc0hpZGRlbihyb290RGlyUGF0aCwgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbnYgPSB7XG4gICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikuZmlsdGVyKChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKCdGTk9YXycpKSksXG4gICAgICAgIC4uLihpZGVudGl0eSA/IHsgRk5PWF9BR0VfS0VZOiBpZGVudGl0eSB9IDoge30pLFxuICAgICAgICBIT01FOiBpc29sYXRlZEhvbWVEaXJQYXRoLFxuICAgICAgICBYREdfQ09ORklHX0hPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICB9O1xuICAgICAgY29uc3QgcHJvZmlsZUFyZ3NMaXN0ID0gW1tdLCAuLi5wcm9maWxlTmFtZXMubWFwKChuYW1lKSA9PiBbJy0tbm8tZGVmYXVsdHMnLCBgLS1wcm9maWxlPSR7bmFtZX1gXSldO1xuICAgICAgZm9yIChjb25zdCBwcm9maWxlQXJncyBvZiBwcm9maWxlQXJnc0xpc3QpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IFsncmVlbmNyeXB0JywgJy0tZm9yY2UnLCAnLS1uby1kYWVtb24nLCAnLS1wcm92aWRlcicsICdhZ2UnLCAuLi5wcm9maWxlQXJnc107XG4gICAgICAgIGNvbnNvbGUubG9nKGAkICR7Zm5veENvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9IGF0ICR7ZGlyUGF0aH1gKTtcbiAgICAgICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGZub3hDb21tYW5kLCBhcmdzLCB7XG4gICAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgICAgICBlbnYsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKHByb2Muc3RhdHVzID8/IDEpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmMoaXNvbGF0ZWRIb21lRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGFjdHVhbCBmbm94IGJpbmFyeS4gYGZub3hgIG9uIFBBVEggaXMgb2Z0ZW4gYSBtaXNlIHNoaW0sIGFuZCBtaXNlIHJlZnVzZXMgdG8gcnVuXG4gKiBvbmNlIEhPTUUvWERHX0NPTkZJR19IT01FIHBvaW50IGF0IHRoZSBpc29sYXRlZCBkaXJlY3RvcnkgKGl0cyB0cnVzdCBzdGF0ZSBkaXNhcHBlYXJzKSwgc28gdGhlXG4gKiBpc29sYXRlZCBzcGF3bnMgbmVlZCB0aGUgc2hpbSByZXNvbHZlZCB0byB0aGUgcmVhbCBleGVjdXRhYmxlIGJlZm9yZWhhbmQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ21pc2UnLCBbJ3doaWNoJywgJ2Zub3gnXSwgeyBjd2Q6IGRpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfSk7XG4gIGNvbnN0IHJlc29sdmVkID0gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgOiAnJztcbiAgcmV0dXJuIHJlc29sdmVkIHx8ICdmbm94Jztcbn1cblxuLy8gVGhlIHBlcnNvbmFsIGlkZW50aXR5IGZpbGUgaXMgbWFjaGluZS1nbG9iYWwsIHNvIGl0IGlzIHJlYWQgb25jZSBwZXIgcHJvY2Vzcy5cbmxldCBoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSBmYWxzZTtcbmxldCBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiByZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSkgcmV0dXJuIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5O1xuICBoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jb25maWcnLCAnZm5veCcsICdhZ2UudHh0JyksICd1dGY4Jyk7XG4gICAgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSBjb250ZW50XG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmluZCgobGluZSkgPT4gbGluZS50cmltKCkuc3RhcnRzV2l0aCgnQUdFLVNFQ1JFVC1LRVktJykpXG4gICAgICA/LnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5O1xufVxuXG4vKipcbiAqIFJ1bnMgYSBmdW5jdGlvbiB3aGlsZSB0aGUgbWFjaGluZS1sb2NhbCBmbm94LmxvY2FsLnRvbWwgZmlsZXMgb2YgdGhlIGdpdmVuIGRpcmVjdG9yaWVzIGFyZVxuICogdGVtcG9yYXJpbHkgbW92ZWQgYXNpZGU6IGZub3ggbG9hZHMgdGhlbSBhdCBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgY29tbWl0dGVkIGZub3gudG9tbCwgc28gYVxuICogbG9jYWwgb3ZlcnJpZGUgc2hhZG93aW5nIGEgY29tbWl0dGVkIHNlY3JldCB3b3VsZCBtYWtlIGBmbm94IHJlZW5jcnlwdGAgc2tpcCB0aGF0IHNlY3JldC5cbiAqL1xuZnVuY3Rpb24gd2l0aEZub3hMb2NhbHNIaWRkZW48VD4ocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aHM6IHN0cmluZ1tdLCBmdW5jOiAoKSA9PiBUKTogVCB7XG4gIGNvbnN0IGhpZGRlbkRpclBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGJhY2t1cFBhdGggPSBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgICAgICAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICAgIGZzLnJlbmFtZVN5bmMobG9jYWxQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgaGlkZGVuRGlyUGF0aHMucHVzaChkaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZnVuYygpO1xuICAgIC8vIEEgcmVzdG9yYXRpb24gY29uZmxpY3QgdGhyb3dzIGhlcmUgYW5kIHRoZXJlYnkgaW52YWxpZGF0ZXMgdGhlIHNlZW1pbmdseSBzdWNjZXNzZnVsIHJlc3VsdDpcbiAgICAvLyBhIHJlY3JlYXRlZCBvdmVycmlkZSBtYXkgaGF2ZSBzaGFkb3dlZCBjb21taXR0ZWQgc2VjcmV0cyBkdXJpbmcgdGhlIGZub3ggcnVuLCBzbyB0aGUgb3V0ZXJcbiAgICAvLyB0cmFuc2FjdGlvbiBtdXN0IHJlc3RvcmUgZXZlcnkgY29tbWl0dGVkIGZub3gudG9tbCBpbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIG1pZ3JhdGlvbi5cbiAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gVGhlIG9yaWdpbmFsIGZhaWx1cmUgbXVzdCB3aW47IGEgcmVzdG9yYXRpb24gY29uZmxpY3Qgb24gdGhpcyBwYXRoIGlzIG9ubHkgcmVwb3J0ZWQgc28gaXRcbiAgICAvLyBjYW5ub3QgbWFzayB0aGUgcm9vdCBjYXVzZS5cbiAgICB0cnkge1xuICAgICAgcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGgsIGhpZGRlbkRpclBhdGhzKTtcbiAgICB9IGNhdGNoIChyZXN0b3JlRXJyb3IpIHtcbiAgICAgIGZhaWxGbm94U3luYygocmVzdG9yZUVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBTdHJpbmcocmVzdG9yZUVycm9yKSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIE1vdmVzIHRoZSBoaWRkZW4gZm5veC5sb2NhbC50b21sIGZpbGVzIGJhY2ssIGNsZWFyaW5nIHRoZSBnaXZlbiBsaXN0IHNvIGEgc2Vjb25kIGNhbGwgaXMgYVxuLy8gbm8tb3AuIE5ldmVyIGNsb2JiZXJzIGEgZm5veC5sb2NhbC50b21sIHJlY3JlYXRlZCAoZS5nLiBieSBhbiBlZGl0b3IpIHdoaWxlIGZub3ggd2FzIHJ1bm5pbmc6XG4vLyB0aGUgYmFja3VwIGlzIGtlcHQgYW5kIHJlcG9ydGVkIGZvciBhIG1hbnVhbCBtZXJnZS5cbmZ1bmN0aW9uIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoOiBzdHJpbmcsIGhpZGRlbkRpclBhdGhzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBjb25zdCBjb25mbGljdGluZ0xvY2FsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBoaWRkZW5EaXJQYXRocy5zcGxpY2UoMCkpIHtcbiAgICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgIGNvbmZsaWN0aW5nTG9jYWxQYXRocy5wdXNoKGxvY2FsUGF0aCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucmVuYW1lU3luYyhmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKSwgbG9jYWxQYXRoKTtcbiAgfVxuICBpZiAoY29uZmxpY3RpbmdMb2NhbFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIGZvbGxvd2luZyBmbm94LmxvY2FsLnRvbWwgZmlsZXMgd2VyZSByZWNyZWF0ZWQgd2hpbGUgZm5veCB3YXMgcnVubmluZyAob3JpZ2luYWwgZmlsZXMgYXJlIHByZXNlcnZlZCB1bmRlciAke3BhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJy50bXAnLCAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcpfSDigJQgbWVyZ2UgdGhlbSBtYW51YWxseSk6ICR7Y29uZmxpY3RpbmdMb2NhbFBhdGhzLmpvaW4oJywgJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXN0b3JlcyBhIGZub3gubG9jYWwudG9tbCBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBzbyB0aGUgdXNlcidzIGxvY2FsXG4gKiBvdmVycmlkZXMgYXJlIG5ldmVyIHNpbGVudGx5IGxvc3QuXG4gKi9cbmZ1bmN0aW9uIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYmFja3VwUGF0aCkpIHJldHVybjtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQm90aCAke2xvY2FsUGF0aH0gYW5kIGl0cyBiYWNrdXAgJHtiYWNrdXBQYXRofSBleGlzdDsgcmVzb2x2ZSB0aGUgbGVmdG92ZXIgYmFja3VwIG1hbnVhbGx5LmApO1xuICB9XG4gIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGgsIGJhY2t1cFBhdGgpO1xuICBmcy5yZW5hbWVTeW5jKGJhY2t1cFBhdGgsIGxvY2FsUGF0aCk7XG59XG5cbi8vIENyZWF0ZXMgdGhlIGJhY2t1cCBkaXJlY3RvcnkgYW5kIHByb3ZlcyBubyBwYXRoIGNvbXBvbmVudCBiZWxvdyB0aGUgcmVwb3NpdG9yeSByb290IGlzIGFcbi8vIHN5bWxpbms6IGEgcmVwb3NpdG9yeS1jb250cm9sbGVkIHN5bWxpbmsgKGUuZy4gYSB0cmFja2VkIC50bXAvd2JmeS1mbm94LWxvY2FsLWJhY2t1cCBsaW5rKVxuLy8gY291bGQgb3RoZXJ3aXNlIG1vdmUgdGhlIHBsYWludGV4dCBsb2NhbCBzZWNyZXRzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIG9yIHJlc29sdmUgdGhlIGJhY2t1cFxuLy8gYmFjayBvbnRvIHRoZSBzb3VyY2UgZmlsZSBhbmQgdHVybiB0aGUgaGlkZSByZW5hbWUgaW50byBhIG5vLW9wLlxuZnVuY3Rpb24gZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aDogc3RyaW5nLCBiYWNrdXBQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguZGlybmFtZShiYWNrdXBQYXRoKTtcbiAgZnMubWtkaXJTeW5jKGJhY2t1cERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBleHBlY3RlZFJlYWxQYXRoID0gcGF0aC5qb2luKGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCksIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGJhY2t1cERpclBhdGgpKTtcbiAgaWYgKGZzLnJlYWxwYXRoU3luYyhiYWNrdXBEaXJQYXRoKSAhPT0gZXhwZWN0ZWRSZWFsUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtiYWNrdXBEaXJQYXRofSByZXNvbHZlcyB0aHJvdWdoIGEgc3ltbGluazsgcmVtb3ZlIHRoZSBzeW1saW5rZWQgY29tcG9uZW50LmApO1xuICB9XG59XG5cbi8vIFRoZSBiYWNrdXAgbGl2ZXMgdW5kZXIgdGhlIGdpdGlnbm9yZWQgLnRtcCBzbyBhIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgY2FuIG5ldmVyIGJlY29tZVxuLy8gc3RhZ2VhYmxlIChhIHNpYmxpbmcgcmVuYW1lIGxpa2UgZm5veC5sb2NhbC50b21sLndiZnktYmFrIHdvdWxkIG5vIGxvbmdlciBtYXRjaCB0aGUgZG9jdW1lbnRlZFxuLy8gYGZub3gubG9jYWwudG9tbGAgaWdub3JlIGVudHJ5IGFuZCBjb3VsZCBiZSBjb21taXR0ZWQgYnkgYGdpdCBhZGQgLUFgKS5cbmZ1bmN0aW9uIGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShcbiAgICByb290RGlyUGF0aCxcbiAgICAnLnRtcCcsXG4gICAgJ3diZnktZm5veC1sb2NhbC1iYWNrdXAnLFxuICAgIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGRpclBhdGgpLFxuICAgICdmbm94LmxvY2FsLnRvbWwnXG4gICk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlclBhdGggfHwgbWlncmF0aW9uTWFya2VyT3duZWQpIHJldHVybjtcbiAgY29uc3QgdG1wRGlyUGF0aCA9IHBhdGguZGlybmFtZShtaWdyYXRpb25NYXJrZXJQYXRoKTtcbiAgZnMubWtkaXJTeW5jKHRtcERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAvLyBSZWZ1c2UgdG8gd3JpdGUgdGhyb3VnaCBzeW1saW5rczogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgLnRtcCBzeW1saW5rIGNvdWxkIG90aGVyd2lzZVxuICAvLyByZWRpcmVjdCB0aGUgbWFya2VyIHdyaXRlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFRoZSBgd3hgIGZsYWcgbWFrZXMgdGhlIG9wZW4gaXRzZWxmIGZhaWxcbiAgLy8gb24gYW55IHByZS1leGlzdGluZyBwYXRoLCBpbmNsdWRpbmcgYSBkYW5nbGluZyBzeW1saW5rIOKAlCB3aGljaCBhbHNvIGFjcXVpcmVzIHRoZSBtYXJrZXJcbiAgLy8gYXRvbWljYWxseSwgc28gYSBjb25jdXJyZW50IHdiZnkgcnVuIGNhbm5vdCBzdGFydCBhIHNlY29uZCBtaWdyYXRpb24uXG4gIGlmIChmcy5sc3RhdFN5bmModG1wRGlyUGF0aCkuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0bXBEaXJQYXRofSBpcyBhIHN5bWxpbms7IHJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgZGlyZWN0b3J5LmApO1xuICB9XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGgsXG4gICAgICAnd2JmeSBmbm94IG1pZ3JhdGlvbiBpbiBwcm9ncmVzczsgYSBsZWZ0b3ZlciBtYXJrZXIgYmxvY2tzIG5ldyBtaWdyYXRpb25zXFxuJyxcbiAgICAgIHtcbiAgICAgICAgZmxhZzogJ3d4JyxcbiAgICAgIH1cbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQW5vdGhlciB3YmZ5IHByb2Nlc3MgYXBwZWFycyB0byBiZSBtaWdyYXRpbmcgKCR7bWlncmF0aW9uTWFya2VyUGF0aH0gZXhpc3RzKTogJHtlcnJvcn1gKTtcbiAgfVxuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IHRydWU7XG59XG5cbi8vIE9ubHkgdGhlIHJ1biB0aGF0IGFjcXVpcmVkIHRoZSBtYXJrZXIgbWF5IHJlbW92ZSBpdDogZGVsZXRpbmcgYSBmb3JlaWduIG1hcmtlciB3b3VsZCBkaXNhYmxlXG4vLyBpbnRlcnJ1cHRlZC1taWdyYXRpb24gZGV0ZWN0aW9uIGZvciBhIGNvbmN1cnJlbnRseSBydW5uaW5nIHdiZnkuXG5mdW5jdGlvbiByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpOiB2b2lkIHtcbiAgaWYgKCFtaWdyYXRpb25NYXJrZXJPd25lZCB8fCAhbWlncmF0aW9uTWFya2VyUGF0aCkgcmV0dXJuO1xuICBmcy5ybVN5bmMobWlncmF0aW9uTWFya2VyUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBib29sZWFuIHtcbiAgbGV0IHN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBzbmFwc2hvdHMpIHtcbiAgICB0cnkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgY29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHJlc3RvcmUgJHtmaWxlUGF0aH0gYWZ0ZXIgYSBmYWlsZWQgbWlncmF0aW9uOiAke2Vycm9yfWApO1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIGZhaWxGbm94U3luYyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIGZub3hTeW5jRmFpbGVkID0gdHJ1ZTtcbn1cblxuLy8gUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIGFuIHVuc3VwcG9ydGVkIGZub3gubG9jYWwudG9tbCBpbiB0aGUgZGlyZWN0b3J5LCBvciB1bmRlZmluZWQuIExvY2FsXG4vLyBvdmVycmlkZXMgbWF5IG9ubHkgaG9sZCBtYWNoaW5lLWxvY2FsIHNlY3JldCB2YWx1ZXM7IGltcG9ydHMgb3IgcHJvdmlkZXIgKHJlKWRlZmluaXRpb25zIHdvdWxkXG4vLyBzaWxlbnRseSBjaGFuZ2Ugd2hpY2ggcmVjaXBpZW50IHNldCBnb3Zlcm5zIHJlLWVuY3J5cHRpb24uXG5mdW5jdGlvbiBmaW5kRm5veExvY2FsVG9tbElzc3VlKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2FsVG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxUb21sUGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxvY2FsU2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxUb21sUGF0aCwgJ3V0ZjgnKSkgYXMgRm5veFRvbWw7XG4gIGNvbnN0IGRlZmluZXNQcm92aWRlcnMgPVxuICAgIGxvY2FsU2V0dGluZ3MuaW1wb3J0ICE9PSB1bmRlZmluZWQgfHxcbiAgICBsb2NhbFNldHRpbmdzLnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhsb2NhbFNldHRpbmdzLnByb2ZpbGVzID8/IHt9KS5zb21lKChwcm9maWxlKSA9PiBwcm9maWxlPy5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiBkZWZpbmVzUHJvdmlkZXJzID8gYCR7bG9jYWxUb21sUGF0aH0gZGVmaW5lcyBpbXBvcnRzLCBwcm92aWRlcnMsIG9yIHByb2ZpbGUgcHJvdmlkZXJzYCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMaXN0cyBldmVyeSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGNvbW1pdHRlZCAob3IgY29tbWl0dGFibGUpIGZub3gudG9tbCBhbW9uZyB0aGUgZ2l2ZW5cbiAqIGdpdC1kaXNjb3ZlcmVkIGNvbmZpZyBwYXRocyAoc2VlIGxpc3RGbm94TGlrZUZpbGVQYXRoczogZ2l0LWJhc2VkIGRpc2NvdmVyeSBleGNsdWRlcyBnaXRpZ25vcmVkXG4gKiB0cmVlcyBzdWNoIGFzIG5vZGVfbW9kdWxlcyB3aXRob3V0IGV4Y2x1ZGluZyBsZWdpdGltYXRlIHBhY2thZ2VzIG5hbWVkIGxpa2UgYnVpbGQgb3V0cHV0cykuXG4gKi9cbmZ1bmN0aW9uIGxpc3RGbm94VG9tbERpclBhdGhzKGZub3hMaWtlRmlsZVBhdGhzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZm5veExpa2VGaWxlUGF0aHNcbiAgICAgICAgLmZpbHRlcigoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpID09PSAnZm5veC50b21sJylcbiAgICAgICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmbm94IGNvbmZpZyBkZWNsYXJlcyBpdHMgb3duIGBbcHJvdmlkZXJzLmFnZV1gLCBpLmUuIHBhcnRpY2lwYXRlcyBpbiBhZ2UgZW5jcnlwdGlvbi5cbiAqIEEgY29uZmlnIHdpdGhvdXQgb25lIGVpdGhlciBpbmhlcml0cyBhIG1hbmFnZWQgcm9vdCdzIHByb3ZpZGVyIChoYW5kbGVkIGJ5IHRoZSByb290LWV4aXN0cyBwYXRoKVxuICogb3IsIHdoZW4gbm8gcm9vdCBleGlzdHMsIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIOKAlCBzbyBpdCBuZWVkcyBubyByZWNpcGllbnQgc3luY2hyb25pemF0aW9uXG4gKiBhbmQgb3ducyBubyBGTk9YX0FHRV9LRVkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5yZWFkYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gQm9vbGVhbigoQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgRm5veFRvbWwpLnByb3ZpZGVycz8uYWdlKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGFuIHVucGFyc2FibGUgY29uZmlnIG1pZ2h0IGRlY2xhcmUgYW4gYWdlIHByb3ZpZGVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIHBhdGggbGllcyBpbnNpZGUgYSB0ZXN0LWZpeHR1cmUgdHJlZSAodGVzdC9maXh0dXJlcywgdGVzdC1maXh0dXJlcyxcbiAqIF9fdGVzdHNfXyk6IGZpeHR1cmUgY29uZmlncyBhcmUgdGVzdCBJTlBVVFMsIG5vdCByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24uIGZub3ggbmV2ZXIgbG9hZHNcbiAqIHRoZW0gZm9yIHJlYWwgY29tbWFuZHMgKGhpZXJhcmNoaWNhbCBsb2FkaW5nIG9ubHkgd2Fsa3MgY3dkIGFuY2VzdG9ycyksIHJlY2lwaWVudFxuICogc3luY2hyb25pemF0aW9uIG11c3Qgbm90IHJld3JpdGUgb3IgcmUtZW5jcnlwdCB0aGVtIChzaGFyZWQtbGliLW5vZGUncyB1bmRlY3J5cHRhYmxlIGZpeHR1cmVcbiAqIGV4aXN0cyBwcmVjaXNlbHkgdG8gc3RheSB1bmRlY3J5cHRhYmxlKSwgYW5kIGEgZml4dHVyZSBtdXN0IG5vdCBmYWlsIHRoZSBzdHJheS1uZXN0ZWQtY29uZmlnXG4gKiBjaGVjayBpbiByZXBvc2l0b3JpZXMgd2l0aG91dCBhIHJvb3QgZm5veC50b21sLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXN0Rml4dHVyZUZub3hQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gYGZpeHR1cmVzYCBjb3VudHMgb25seSBkaXJlY3RseSB1bmRlciBhIHRlc3QgZGlyZWN0b3J5OiB3YmZ5IHN1cHBvcnRzIGFyYml0cmFyeSB3b3Jrc3BhY2VzLFxuICAvLyBzbyBhIGxlZ2l0aW1hdGUgYHBhY2thZ2VzL2ZpeHR1cmVzL2Agd29ya3NwYWNlIG11c3Qgc3RheSBtYW5hZ2VkIGFuZCB2ZXJpZmllZC5cbiAgY29uc3Qgc2VnbWVudHMgPSBmaWxlUGF0aC5zcGxpdCgnLycpO1xuICByZXR1cm4gc2VnbWVudHMuc29tZShcbiAgICAoc2VnbWVudCwgaW5kZXgpID0+XG4gICAgICBzZWdtZW50ID09PSAndGVzdC1maXh0dXJlcycgfHxcbiAgICAgIHNlZ21lbnQgPT09ICdfX3Rlc3RzX18nIHx8XG4gICAgICAoc2VnbWVudCA9PT0gJ2ZpeHR1cmVzJyAmJiAoc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3QnIHx8IHNlZ21lbnRzW2luZGV4IC0gMV0gPT09ICd0ZXN0cycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gLXogcHJpbnRzIE5VTC1kZWxpbWl0ZWQgdmVyYmF0aW0gcGF0aHM7IHdpdGhvdXQgaXQsIGNvcmUucXVvdGVQYXRoIEMtcXVvdGVzIG5vbi1BU0NJSSBwYXRoc1xuICAvLyAoZS5nLiBcIlxcMzQ2XFwyMjdcXDI0NS4uLlwiKSwgd2hpY2ggd291bGQgbWFrZSB0aGUgYmFzZW5hbWUgZmlsdGVyIHNpbGVudGx5IHNraXAgdGhvc2UgY29uZmlncy5cbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKFxuICAgICdnaXQnLFxuICAgIFsnbHMtZmlsZXMnLCAnLXonLCAnLS1jYWNoZWQnLCAnLS1vdGhlcnMnLCAnLS1leGNsdWRlLXN0YW5kYXJkJywgJy0tJywgJypmbm94Ki50b21sJ10sXG4gICAgeyBjd2Q6IHJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgLy8gRmFpbCBjbG9zZWQ6IHRyZWF0aW5nIGEgZ2l0IGZhaWx1cmUgYXMgXCJubyBmbm94IGNvbmZpZ3NcIiB3b3VsZCBza2lwIHN5bmNocm9uaXphdGlvbiBhbmQgbGV0XG4gIC8vIHNldHVwU2VjcmV0cyB1cGxvYWQgYSBrZXkgdGhhdCB3YXMgbmV2ZXIgdmVyaWZpZWQgYWdhaW5zdCB0aGUgcmVwb3NpdG9yeSdzIGNpcGhlcnRleHRzLlxuICBpZiAocHJvYy5zdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGdpdCBscy1maWxlcyBmYWlsZWQgaW4gJHtyb290RGlyUGF0aH06ICR7KHByb2Muc3RkZXJyIHx8IHByb2MuZXJyb3I/Lm1lc3NhZ2UgfHwgJycpLnRyaW0oKX1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXRcbiAgICAuc3BsaXQoJ1xcMCcpXG4gICAgLmZpbHRlcigobGluZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KHBhdGguYmFzZW5hbWUobGluZSkpICYmICFpc1Rlc3RGaXh0dXJlRm5veFBhdGgobGluZSkpXG4gICAgLm1hcCgobGluZSkgPT4gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCBsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMoZGlyUGF0aClcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IC9eXFwuP2Zub3goXFwuLispP1xcLnRvbWwkL3UudGVzdChuYW1lKSlcbiAgICAgIC50b1NvcnRlZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpPy5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIC8vIEZhaWwgY2xvc2VkOiBmbm94IGNhbiBzdGlsbCBsb2FkIGEgY29uZmlnIGZyb20gYSBkaXJlY3RvcnkgdGhpcyBwcm9jZXNzIGNhbm5vdCBlbnVtZXJhdGVcbiAgICAvLyAoZS5nLiBleGVjdXRlLW9ubHkgcGVybWlzc2lvbiksIHNvIGFuIGVudW1lcmF0aW9uIGZhaWx1cmUgbXVzdCBub3QgcmVhZCBhcyBcIm5vIGNvbmZpZ3NcIi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbnNwZWN0ICR7ZGlyUGF0aH0gZm9yIGZub3ggY29uZmlnczogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRpclBhdGhzID0gW2RpclBhdGhdO1xuICB3aGlsZSAoZGlyUGF0aHMuYXQoLTEpICE9PSByb290RGlyUGF0aCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZGlybmFtZShkaXJQYXRocy5hdCgtMSkgPz8gJycpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpclBhdGhzLmF0KC0xKSkgYnJlYWs7XG4gICAgZGlyUGF0aHMucHVzaChwYXJlbnQpO1xuICB9XG4gIHJldHVybiBkaXJQYXRocztcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHtcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFNlZWRlZEJhc2VsaW5lR2xvYixcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbiAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuLFxuICBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSxcbiAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG4vLyBUaGUgQnVuLWV4YWN0IHJlc29sdXRpb24gcHJpbWl0aXZlcyBsaXZlIGluIEB3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUgKHNyYy9idW5Xb3Jrc3BhY2VzLnRzKVxuLy8gc28gd2IncyByZWxlYXNlIGNvZGUgc2hhcmVzIHRoZW07IHJlLWV4cG9ydCB0aGUgb25lcyB3YmZ5IG1vZHVsZXMgYW5kIHRlc3RzIGNvbnN1bWUuXG5leHBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG4vKiogVGhlIHN1YnNldCBvZiBQYWNrYWdlQ29uZmlnIHRoYXQgd29ya3NwYWNlIGRpc2NvdmVyeSBuZWVkcywgc28gaXQgY2FuIHJ1biBiZWZvcmUgY29uZmlncyBleGlzdC4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZVJvb3RMaWtlID0gUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCcgfCAnZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMnIHwgJ3BhY2thZ2VKc29uJz47XG5cbi8qKlxuICogRXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGRpcmVjdG9yeSAoYWJzb2x1dGUsIGRlZHVwbGljYXRlZCkgb2YgdGhlIG1vbm9yZXBvIHJvb3QsIGNvdmVyaW5nXG4gKiBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qLiBVbmNhY2hlZCBiZWNhdXNlIGluZGV4LnRzIGNhbGxzIGl0IGJlZm9yZSB3YmZ5IG11dGF0ZXNcbiAqIHRoZSByb290IHBhY2thZ2UuanNvbiAoZ2V0V29ya3NwYWNlUGFja2FnZURpcnMgY2FjaGVzIHRoZSBwb3N0LW11dGF0aW9uIHN0YXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290TGlrZSkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShyb290TGlrZS5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICAgIClcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSwgaW5jbHVkaW5nIG1hbmlmZXN0c1xuICogd2l0aG91dCBhIGBuYW1lYCBmaWVsZCDigJQgd2JmeSBuYW1lcyB0aG9zZSBsYXRlciwgc28gZGVwZW5kZW5jeSBzY2FucyBtdXN0IG5vdCBza2lwIHRoZW0uXG4gKiBSZXNvbHV0aW9uIG1pbWljcyBCdW4ncyBzZXF1ZW50aWFsIHBhdHRlcm4gZXZhbHVhdGlvbjsgc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RDb25maWcpLCByb290Q29uZmlnLmRpclBhdGgpO1xufVxuXG5pbnRlcmZhY2UgV29ya3NwYWNlRGlyUGF0dGVybnMge1xuICAvKiogRGlyZWN0b3J5IHN1YnRyZWVzIChvciBwYWNrYWdlLW93bmVkIHN1YnBhdGhzKSBtYXRjaGVkIGJ5IGVmZmVjdGl2ZSBuZWdhdGlvbnMsIGZvciB0c2NvbmZpZyBgZXhjbHVkZWAgZW50cmllcy4gKi9cbiAgZXhjbHVkZXM6IHN0cmluZ1tdO1xuICAvKiogUG9zaXRpdmUgZGlyZWN0b3J5IHBhdHRlcm5zIChvciBjb25jcmV0ZSBkaXJlY3RvcmllcyBmb3IgQnVuLW9ubHkgZ2xvYiBzeW50YXgpLiAqL1xuICBpbmNsdWRlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogU29ydGVkIHdvcmtzcGFjZSBkaXJlY3RvcnkgcGF0dGVybnMgKHBvc2l4LCByZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCkgZm9yIGdlbmVyYXRvcnMgdGhhdFxuICogbmVlZCBwYXR0ZXJuLXNoYXBlZCBnbG9icyBjb3ZlcmluZyBldmVyeSB3b3Jrc3BhY2UgbGF5b3V0IOKAlCBlLmcuIHRoZSByb290IHRzY29uZmlnJ3MgYGFwcHMvKmBcbiAqIGluY2x1ZGUgZW50cmllcyDigJQgaW5zdGVhZCBvZiBjb25jcmV0ZSBkaXJlY3Rvcmllcywgd2hpY2ggd291bGQgY2h1cm4gZ2VuZXJhdGVkIGZpbGVzIHdoZW5ldmVyIGFcbiAqIHdvcmtzcGFjZSBwYWNrYWdlIGlzIGFkZGVkIG9yIHJlbW92ZWQuIEV2ZXJ5IHJldHVybmVkIHBhdHRlcm4gaXMgdmFsaWQgdHNjb25maWcgZ2xvYiBzeW50YXguXG4gKiBBIHBhdHRlcm4gY2FuIG1hdGNoIGEgc2libGluZyBkaXJlY3Rvcnkgd2l0aG91dCBhIHBhY2thZ2UuanNvbiAobm90IGEgd29ya3NwYWNlIHRvIEJ1bik7IHRoYXRcbiAqIGlzIGRlbGliZXJhdGUsIG1pcnJvcmluZyB0aGUgbG9uZy1zdGFuZGluZyBgcGFja2FnZXMvKmAgZW50cmllcycgYmVoYXZpb3IgaW4gZmF2b3Igb2Ygc3RhYmxlXG4gKiBnZW5lcmF0ZWQgb3V0cHV0LiBOZWdhdGlvbnMgZm9sbG93IEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKTogYSBuZWdhdGlvbiBzdGF5cyBwYXR0ZXJuLXNoYXBlZCB3aGlsZSBpdCBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMsIGJ1dCBpcyBjb25jcmV0aXplZCBwZXIgbWF0Y2hlZCBkaXJlY3Rvcnkgd2hlbiBhIG1hdGNoZWQgZGlyZWN0b3J5IGVuZHMgdXAgYVxuICogd29ya3NwYWNlIGFueXdheSAocmUtaW5jbHVkZWQgYnkgYSBsYXRlciBwb3NpdGl2ZSwgYSBwaW5uZWQgY29uY3JldGUgcG9zaXRpdmUsIG9yIGEgc2VlZGVkXG4gKiBiYXNlbGluZTsgIzEwMDUpIG9yIGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSwgd2hlcmUgQnVuIGV4Y2x1ZGVzIG9ubHkgdGhlXG4gKiBwYWNrYWdlIEFUIHRoYXQgZGlyZWN0b3J5LCBzbyBvbmx5IGl0cyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIGFyZSBleGNsdWRlZCAoIzEwMDQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogV29ya3NwYWNlRGlyUGF0dGVybnMge1xuICAvLyBVbmxpa2UgZGlzY292ZXJ5LCBnZW5lcmF0ZWQgb3V0cHV0IG11c3Qgbm90IGNvbnRhaW4gYSBuZXZlci1tYXRjaGluZyBgcGFja2FnZXMvKmAgZmFsbGJhY2s6XG4gIC8vIGFuIGFwcHMvKi1vbmx5IG1vbm9yZXBvIHdvdWxkIGdldCBkZWFkIGdsb2JzIGNvbW1pdHRlZCBpbnRvIGl0cyByb290IHRzY29uZmlnLiBNaXJyb3JcbiAgLy8gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zLCB3aGljaCBmb3JjZXMgYHBhY2thZ2VzLypgIG9ubHkgd2hlbiBhIG1hbmlmZXN0IGFjdHVhbGx5IG1hdGNoZXMuXG4gIGNvbnN0IGhhc1BhY2thZ2VzTGF5b3V0ID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJlxuICAgIC8vIE1pcnJvciBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMnIGJhc2VsaW5lIGdhdGUgdG9vOiB3aXRoIGFuIGltcGxpY2l0IGJhc2VsaW5lIHNlZWRlZCxcbiAgICAvLyBgcGFja2FnZXMvKmAgZW50cmllcyB3b3VsZCBiZSBkZWFkIGdsb2JzIHN1YnN1bWVkIGJ5IHRoZSBiYXNlbGluZS1kZXJpdmVkIG9uZXMuXG4gICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpICYmXG4gICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywge1xuICAgICAgY3dkOiByb290TGlrZS5kaXJQYXRoLFxuICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgfSkubGVuZ3RoID4gMDtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyh7XG4gICAgLi4ucm9vdExpa2UsXG4gICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGhhc1BhY2thZ2VzTGF5b3V0LFxuICB9KTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBuZXcgU2V0KFxuICAgIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zLCByb290TGlrZS5kaXJQYXRoKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpXG4gICAgKVxuICApO1xuICBjb25zdCBpbmNsdWRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBuZWdhdGlvbkJvZGllczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXR0ZXJuIG9mIHdvcmtzcGFjZVBhdHRlcm5zKSB7XG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpO1xuICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkoaXNOZWdhdGl2ZSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuKTtcbiAgICBpZiAoaXNOZWdhdGl2ZSkge1xuICAgICAgLy8gQSBzZWVkaW5nIG5lZ2F0aW9uIG1ha2VzIEJ1biBsaW5rIGJhc2VsaW5lLW1hdGNoZWQgZGlyZWN0b3JpZXMsIHNvIHRoZSBiYXNlbGluZSBtdXN0XG4gICAgICAvLyBlbnRlciB0aGUgZ2VuZXJhdGVkIGluY2x1ZGUgcGF0dGVybnMgZXZlbiB3aGVuIGV2ZXJ5IGRlY2xhcmVkIHBhdHRlcm4gaXMgYSBuZWdhdGlvbi5cbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIGluY2x1ZGVzLmFkZChiYXNlbGluZUdsb2IpO1xuICAgICAgbmVnYXRpb25Cb2RpZXMucHVzaChwYXR0ZXJuQm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0dGVybiBvZiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKHBhdHRlcm5Cb2R5LCByb290TGlrZS5kaXJQYXRoKSkge1xuICAgICAgICBpbmNsdWRlcy5hZGQoZGlyUGF0dGVybik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGV4Y2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbmVnYXRpb25Cb2R5IG9mIG5lZ2F0aW9uQm9kaWVzKSB7XG4gICAgZm9yIChjb25zdCBleGNsdWRlRW50cnkgb2YgdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHksIHdvcmtzcGFjZURpclBhdGhzLCByb290TGlrZS5kaXJQYXRoKSkge1xuICAgICAgZXhjbHVkZXMuYWRkKGV4Y2x1ZGVFbnRyeSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGV4Y2x1ZGVzOiBbLi4uZXhjbHVkZXNdLnRvU29ydGVkKCksIGluY2x1ZGVzOiBbLi4uaW5jbHVkZXNdLnRvU29ydGVkKCkgfTtcbn1cblxuLyoqXG4gKiB0c2NvbmZpZyBleGNsdWRlIGVudHJpZXMgZm9yIG9uZSBuZWdhdGlvbi4gUGF0dGVybi1zaGFwZWQgd2hlbiB0aGUgbmVnYXRpb24gZXhjbHVkZXMgZXhhY3RseVxuICogd2hhdCBpdCBtYXRjaGVzIChzdGFibGUgb3V0cHV0KTsgcGVyLWRpcmVjdG9yeSBvdGhlcndpc2U6IGEgZGlyZWN0b3J5IHRoYXQgaXMgYSB3b3Jrc3BhY2VcbiAqIGRlc3BpdGUgdGhlIG5lZ2F0aW9uIGlzIG5vdCBleGNsdWRlZCBhdCBhbGwsIGFuZCBuZWl0aGVyIGlzIGEgUExBSU4gKHBhY2thZ2UuanNvbi1sZXNzKVxuICogZGVzY2VuZGFudCBvZiBhIHdvcmtzcGFjZSBkaXJlY3Rvcnkg4oCUIG5lZ2F0aW5nIGEgbm9uLXBhY2thZ2UgZGlyZWN0b3J5IGlzIGEgbm8tb3AgZm9yIEJ1bixcbiAqIGFuZCB0aGUgZW5jbG9zaW5nIHdvcmtzcGFjZSBzdGF5cyBhY3RpdmUgKGUuZy4gYFsnYXBwcy8qKicsICchYXBwcy8qKicsICdhcHBzL3dlYiddYFxuICogcmUtaW5jbHVkZXMgYXBwcy93ZWIsIHdob3NlIHNyYyBtdXN0IGtlZXAgdHlwZS1jaGVja2luZzsgYSB0c2NvbmZpZyBleGNsdWRlIHdvdWxkIG92ZXJyaWRlXG4gKiB0aGUgaW5jbHVkZSkuIEEgZGVzY2VuZGFudCB3aXRoIGl0cyBvd24gbWFuaWZlc3QgdGhhdCB0aGUgbmVnYXRpb24ga2VlcHMgb3V0IG9mIHRoZSB3b3Jrc3BhY2VcbiAqIHNldCBpcyBhbiBleGNsdWRlZCBuZXN0ZWQgcGFja2FnZSBhbmQgc3RheXMgZXhjbHVkZWQuIEEgZGlyZWN0b3J5IHRoYXQgaXMgYW5cbiAqIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSBnZXRzIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgZXhjbHVkZWQsIGJlY2F1c2UgQnVuXG4gKiBleGNsdWRlcyBvbmx5IHRoZSBwYWNrYWdlIEFUIHRoYXQgZGlyZWN0b3J5IHdoaWxlIGtlZXBpbmcgZGVzY2VuZGFudCB3b3Jrc3BhY2VzICgjMTAwNCkuXG4gKi9cbmZ1bmN0aW9uIHRvRXhjbHVkZUVudHJpZXMobmVnYXRpb25Cb2R5OiBzdHJpbmcsIHdvcmtzcGFjZURpclBhdGhzOiBTZXQ8c3RyaW5nPiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaXNXb3Jrc3BhY2VBbmNlc3RvciA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiB3b3Jrc3BhY2VEaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZGlyUGF0aH0vYCkpO1xuICAvLyBPbmx5IFBMQUlOIGRpcmVjdG9yaWVzIChubyBwYWNrYWdlLmpzb24gb2YgdGhlaXIgb3duKSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBlbmNsb3NpbmdcbiAgLy8gd29ya3NwYWNlOiBhIG1hdGNoZWQgZGlyZWN0b3J5IHRoYXQgY2FycmllcyBpdHMgb3duIG1hbmlmZXN0IHlldCBpcyBhYnNlbnQgZnJvbSB0aGUgZmluYWxcbiAgLy8gd29ya3NwYWNlIHNldCBpcyBhbiBleGNsdWRlZCBuZXN0ZWQgcGFja2FnZSwgYW5kIGl0cyBleGNsdXNpb24gbXVzdCBzdXJ2aXZlLlxuICBjb25zdCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQgPSAoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgIFsuLi53b3Jrc3BhY2VEaXJQYXRoc10uc29tZSgod29ya3NwYWNlRGlyUGF0aCkgPT4gZGlyUGF0aC5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKTtcbiAgY29uc3QgbWF0Y2hlZERpclBhdGhzID0gZ2V0TWF0Y2hlZERpclBhdGhzKG5lZ2F0aW9uQm9keSwgcm9vdERpclBhdGgpO1xuICBpZiAoXG4gICAgIW1hdGNoZWREaXJQYXRocy5zb21lKFxuICAgICAgKGRpclBhdGgpID0+XG4gICAgICAgIHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1dvcmtzcGFjZUFuY2VzdG9yKGRpclBhdGgpIHx8IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudChkaXJQYXRoKVxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZWREaXJQYXRocy5mbGF0TWFwKChkaXJQYXRoKSA9PiB7XG4gICAgLy8gVGhlIGRlc2NlbmRhbnQgY2hlY2sgcHJlY2VkZXMgdGhlIGFuY2VzdG9yIG9uZTogYSBkaXJlY3RvcnkgaW5zaWRlIG9uZSB3b3Jrc3BhY2UgYnV0IGFib3ZlXG4gICAgLy8gYSBuZXN0ZWQgb25lIChlLmcuIGFwcHMvd2ViL3BsdWdpbnMgYmV0d2VlbiB3b3Jrc3BhY2VzIGFwcHMvd2ViIGFuZCBhcHBzL3dlYi9wbHVnaW5zL3gpXG4gICAgLy8gc3RpbGwgYmVsb25ncyB0byB0aGUgZW5jbG9zaW5nIGFjdGl2ZSB3b3Jrc3BhY2UsIHNvIG5vdGhpbmcgb2YgaXQgbWF5IGJlIGV4Y2x1ZGVkLlxuICAgIGlmICh3b3Jrc3BhY2VEaXJQYXRocy5oYXMoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpKSByZXR1cm4gW107XG4gICAgaWYgKGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkpIHtcbiAgICAgIHJldHVybiBbYCR7ZGlyUGF0aH0vKi5jb25maWcudHNgLCBgJHtkaXJQYXRofS9zY3JpcHRzYCwgYCR7ZGlyUGF0aH0vc3JjYCwgYCR7ZGlyUGF0aH0vdGVzdGBdO1xuICAgIH1cbiAgICByZXR1cm4gW2RpclBhdGhdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEaXJlY3RvcmllcyBhIG5lZ2F0aW9uIG1hdGNoZXMuIFRoZSBtYW5pZmVzdC1iYXNlZCBnbG9iIGNvbXBsZW1lbnRzIG9ubHlEaXJlY3RvcmllcyBiZWNhdXNlXG4gKiBmYXN0LWdsb2IncyBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gYGRpcmAgaXRzZWxmIGFzIGEgZGlyZWN0b3J5LCB3aGlsZSBib3RoIEJ1biBhbmQgdGhlXG4gKiBtYW5pZmVzdCBnbG9iIHRyZWF0IGAqKmAgYXMgemVybyBvciBtb3JlIHNlZ21lbnRzIChgYXBwcy8qKmAgY292ZXJzIHRoZSBwYWNrYWdlIGF0IGFwcHMpLlxuICovXG5mdW5jdGlvbiBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5OiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdsb2JPcHRpb25zID0geyBjd2Q6IHJvb3REaXJQYXRoLCBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH07XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi5mZy5nbG9iU3luYyhuZWdhdGlvbkJvZHksIHsgLi4uZ2xvYk9wdGlvbnMsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSxcbiAgICAgIC4uLmZnXG4gICAgICAgIC5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4obmVnYXRpb25Cb2R5LCAncGFja2FnZS5qc29uJyksIGdsb2JPcHRpb25zKVxuICAgICAgICAubWFwKChwYWNrYWdlSnNvblBhdGgpID0+IHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgICAvLyBBIHplcm8tc2VnbWVudCBgKipgIG1hdGNoIHJlYWNoZXMgdGhlIHJvb3QgaXRzZWxmLCB3aGljaCBpcyBuZXZlciBhIHdvcmtzcGFjZS5cbiAgICAgICAgLmZpbHRlcigoZGlyUGF0aCkgPT4gZGlyUGF0aCAhPT0gJy4nKSxcbiAgICBdKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGluY2x1ZGUvZXhjbHVkZSBzdXBwb3J0IG9ubHkgdGhlIGAqYCwgYD9gLCBhbmQgYCoqYCB3aWxkY2FyZHMsIHdoaWxlIEJ1biB3b3Jrc3BhY2VzXG4gKiBhY2NlcHQgZnVsbCBnbG9iIHN5bnRheCAoYnJhY2UgZXhwYW5zaW9uLCBjaGFyYWN0ZXIgY2xhc3Nlcywg4oCmKSwgc28gZXhwYW5kIEJ1bi1vbmx5IHBhdHRlcm5zIHRvXG4gKiB0aGUgY29uY3JldGUgZGlyZWN0b3JpZXMgdGhleSBtYXRjaCB0byBrZWVwIHRoZSBnZW5lcmF0ZWQgZ2xvYnMgdmFsaWQgZm9yIFR5cGVTY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCEvWygpW1xcXXt9XS91LnRlc3QocGF0dGVybkJvZHkpKSByZXR1cm4gW3BhdHRlcm5Cb2R5XTtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm5Cb2R5LCB7XG4gICAgY3dkOiByb290RGlyUGF0aCxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgb25seURpcmVjdG9yaWVzOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHRoYXQgc3RheSBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6IGFic29sdXRlXG4gKiBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyByZW1vdmVOb2RlTW9kdWxlcyBvcGVyYXRlIG9uIGFub3RoZXJcbiAqIHJlcG9zaXRvcnkncyBmaWxlcy4gRGVjbGFyYXRpb24gb3JkZXIgYW5kIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGVcbiAqIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gcG9zaXRpb24gbWF0dGVycy5cbiAqL1xuZnVuY3Rpb24gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICBjb25zdCBkZWNsYXJlZFBhdHRlcm5zID0gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpO1xuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgZm9yY2VzIGBwYWNrYWdlcy8qYCBpbnRvIGEgbW9ub3JlcG8ncyB3b3Jrc3BhY2VzIHdoZW4gYVxuICAvLyBwYWNrYWdlcy8qL3BhY2thZ2UuanNvbiBhY3R1YWxseSBtYXRjaGVzLCBidXQgaXQgbWF5IG5vdCBoYXZlIHdyaXR0ZW4gdGhlIHJvb3QgcGFja2FnZS5qc29uXG4gIC8vIHlldCwgc28gbWlycm9yIHRoYXQgbm9ybWFsaXphdGlvbiBoZXJlIOKAlCBQUkVQRU5ERUQgbGlrZSB0aGVyZSwgYmVjYXVzZSBhIHBvc2l0aXZlIHBhdHRlcm5cbiAgLy8gcGxhY2VkIGFmdGVyIGEgdXNlciBuZWdhdGlvbiB3b3VsZCByZS1pbmNsdWRlIHRoZSBuZWdhdGVkIHBhY2thZ2VzIHVuZGVyIEJ1bidzIHNlcXVlbnRpYWxcbiAgLy8gZXZhbHVhdGlvbi4gRGlzY292ZXJ5IGNhbGxlcnMgcGFzcyB0aGUgZmFsbGJhY2sgdW5jb25kaXRpb25hbGx5IGZvciBtb25vcmVwb3Mg4oCUIGFcbiAgLy8gbmV2ZXItbWF0Y2hpbmcgcGF0dGVybiBjb250cmlidXRlcyBubyBwYXRocyB0aGVyZSDigJQgd2hpbGUgcGF0dGVybi1zaGFwZWQgY2FsbGVyc1xuICAvLyAoZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMpIGdhdGUgaXQgb24gYW4gYWN0dWFsIG1hdGNoLlxuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9XG4gICAgcm9vdExpa2UuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgIWhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybihyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcylcbiAgICAgID8gWydwYWNrYWdlcy8qJywgLi4uZGVjbGFyZWRQYXR0ZXJuc11cbiAgICAgIDogZGVjbGFyZWRQYXR0ZXJucztcbiAgcmV0dXJuIHdvcmtzcGFjZVBhdHRlcm5zLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgcG9zaXRpdmUgcGF0dGVybiBhbHJlYWR5IGNvdmVycyBgcGFja2FnZXMvKmAgdW5kZXIgcGF0aCBub3JtYWxpemF0aW9uXG4gKiAoZS5nLiBgLi9wYWNrYWdlcy8qYCBvciBhIHRyYWlsaW5nLXNsYXNoIHNwZWxsaW5nKTogZm9yY2luZyBhIHRleHR1YWwgYHBhY2thZ2VzLypgIG5leHQgdG9cbiAqIHN1Y2ggYSBzcGVsbGluZyB3b3VsZCBwZXJzaXN0IGR1cGxpY2F0ZSBlcXVpdmFsZW50IHBhdHRlcm5zIGFuZCByZS1zY2FuIHRoZSBzYW1lIGRpcmVjdG9yaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHdvcmtzcGFjZXM6IFBhY2thZ2VKc29uWyd3b3Jrc3BhY2VzJ10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICAhd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIC8vIEEgYC4uYC10cmF2ZXJzaW5nIG9yIGFic29sdXRlIHNwZWxsaW5nIChlLmcuIGB4Ly4uL3BhY2thZ2VzLypgKSBpcyBkaXNjYXJkZWQgYnlcbiAgICAgIC8vIGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zLCBzbyBpdCBtdXN0IG5vdCBjb3VudCBhcyBjb3ZlcmluZyBwYWNrYWdlcy8qIOKAlCB0aGF0IHdvdWxkXG4gICAgICAvLyBzdXBwcmVzcyB0aGUgZmFsbGJhY2sgQU5EIGxvc2UgdGhlIHBhdHRlcm4sIGxlYXZpbmcgbm8gZGlzY292ZXJlZCB3b3Jrc3BhY2VzLlxuICAgICAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pICYmXG4gICAgICBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuKSA9PT0gJ3BhY2thZ2VzLyonXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMgfSBmcm9tICcuL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBQUklWQVRFX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlLyc7XG5cbmNvbnN0IHByaXZhdGVSZWdpc3RyeUhvc3QgPSAndmVyZGFjY2lvLXByb2R1Y3Rpb24tZTM4OS51cC5yYWlsd2F5LmFwcCc7XG5leHBvcnQgY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nID0gYEB3aWxsYm9vc3Rlci1wcml2YXRlOnJlZ2lzdHJ5PWh0dHBzOi8vJHtwcml2YXRlUmVnaXN0cnlIb3N0fS9gO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhpcyByZXBvc2l0b3J5IGRlYWxzIHdpdGggYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHBhY2thZ2VzIOKAlCBieSBjb252ZW50aW9uIHRoYXQgc2NvcGVcbiAqIGxpdmVzIGV4Y2x1c2l2ZWx5IG9uIHRoZSBwcml2YXRlIFZlcmRhY2NpbyByZWdpc3RyeSwgc28gZXhhY3RseSB0aGVzZSByZXBvc2l0b3JpZXMgbmVlZCB0aGVcbiAqIFZFUkRBQ0NJT19UT0tFTiBwYXNzLXRocm91Z2ggaW4gdGhlaXIgcmV1c2FibGUtd29ya2Zsb3cgY2FsbGVycy5cbiAqXG4gKiBBIHJlcG9zaXRvcnkgcXVhbGlmaWVzIHdoZW4gYW55IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gREVDTEFSRVMgYSBkZXBlbmRlbmN5IGluIHRoZSBzY29wZSAoYW55XG4gKiBkZXBlbmRlbmN5IGZpZWxkKSwgb3IgaXMgaXRzZWxmIE5BTUVEIGluIHRoZSBzY29wZSAoaXQgcHVibGlzaGVzIHRvIFZlcmRhY2NpbywgYW5kIHJlbGVhc2UueW1sXG4gKiBkZXJpdmVzIGl0cyBucG0gYXV0aCBmcm9tIHRoZSBzYW1lIHNlY3JldCkuIE5vdGhpbmcgZWxzZSBpcyBzY2FubmVkOiBsb2NrZmlsZXMgb25seSBtaXJyb3IgdGhlXG4gKiBkZWNsYXJlZCBkZXBlbmRlbmNpZXMsIGFuZCBidW5maWcudG9tbCdzIGBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzYCBtZW50aW9ucyB0aGUgc2NvcGUgZXZlbiBpblxuICogcmVwb3NpdG9yaWVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhcbiAgY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1hbmlmZXN0UmVsUGF0aHMgPSBuZXcgU2V0KFsncGFja2FnZS5qc29uJywgLi4uZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhjb25maWcpXSk7XG4gIHJldHVybiBbLi4ubWFuaWZlc3RSZWxQYXRoc10uc29tZSgocmVsUGF0aCkgPT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxQYXRoKSk7XG4gICAgaWYgKCFtYW5pZmVzdCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChtYW5pZmVzdC5uYW1lPy5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gW1xuICAgICAgbWFuaWZlc3QuZGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3QucGVlckRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMgPz8ge30pLnNvbWUoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG4gIHF1ZXVlPzogJ3NpbmdsZScgfCAnbWF4Jztcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgLy8gR2l0SHViIEFjdGlvbnMgdHJlYXRzIGBldmVudDogbnVsbGAgYXMgYSB2YWx1ZWxlc3MgZXZlbnQgbWFwcGluZywgZS5nLlxuICAvLyBgcHVsbF9yZXF1ZXN0OmAuIGB1bmRlZmluZWRgIHdvdWxkIG9taXQgdGhlIGV2ZW50IGVudGlyZWx5IHdoZW4gZHVtcGluZyBZQU1MLlxuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCAnaW5oZXJpdCc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgICAvLyBMZXQgbWFpbnRhaW5lcnMgcmUtcnVuIHRoZSB0ZXN0cyBieSBoYW5kLlxuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICAvLyBOb25lIG9mIHRoZXNlIG1heSBiZSBuYXJyb3dlZCBqdXN0IGJlY2F1c2UgdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgbmV2ZXIgcHVzaGVzOlxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgdGhlIHRlc3Qgam9iJ3Mgc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyBjYWxsIHdpdGggY2FuY2VsX290aGVyczogdHJ1ZSAodGhlIHJldXNhYmxlXG4gICAgICAvLyB0ZXN0IHdvcmtmbG93IGRlY2xhcmVzIG5vIHBlcm1pc3Npb25zIG9mIGl0cyBvd24sIHNvIGl0cyBqb2JzIHJ1biBvbiB0aGlzIHRva2VuKVxuICAgICAgYWN0aW9uczogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBgc2VtYW50aWMtcmVsZWFzZSAtLWRyeS1ydW5gLCB3aGljaCBkb2VzIGEgYGdpdCBwdXNoIC0tZHJ5LXJ1bmAgdG8gdmVyaWZ5IHdyaXRlXG4gICAgICAvLyBhY2Nlc3MgYW5kIGFib3J0cyB3aXRoIEVHSVROT1BFUk1JU1NJT04gd2l0aG91dCBpdFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgcGtnLXByZWZsaWdodCBQUiBmaWxlIGxpc3RpbmdcbiAgICAgICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAndGVzdC1ydXN0Jzoge1xuICAgIG5hbWU6ICdUZXN0IFJ1c3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LXJ1c3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBgcXVldWU6IG1heGAgaGVyZSB0b28gKCM5NzQpOiBHaXRIdWIncyBkZWZhdWx0IHF1ZXVlIChgc2luZ2xlYCkgY2FuY2VscyBhbiBhbHJlYWR5LVBFTkRJTkdcbiAgICAvLyBjYWxsZXIgcnVuIHdoZW4gYW5vdGhlciBvbmUgcXVldWVzIOKAlCBiZWZvcmUgaXRzIGpvYiAoYW5kIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIG93blxuICAgIC8vIGpvYi1sZXZlbCBgcXVldWU6IG1heGApIGV2ZXIgc3RhcnRzIOKAlCBzaWxlbnRseSBkcm9wcGluZyB0aGF0IHJlbGVhc2UgdHJpZ2dlci5cbiAgICAvLyBUaGUgY2FsbGVyLWxldmVsIGdyb3VwIG11c3QgTk9UIHJldXNlIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIGpvYi1sZXZlbCBncm91cCBuYW1lXG4gICAgLy8gKGByZWxlYXNlLSR7eyBnaXRodWIucmVwb3NpdG9yeSB9fWApOiB3b3JrZmxvdy1sZXZlbCBhbmQgam9iLWxldmVsIGdyb3VwcyBzaGFyZSBvbmVcbiAgICAvLyByZXBvc2l0b3J5LXdpZGUgbmFtZXNwYWNlLCBhbmQgaWRlbnRpY2FsIG5hbWVzIGRlYWRsb2NrIHRoZSBydW4gKFwiQ2FuY2VsaW5nIHNpbmNlIGFcbiAgICAvLyBkZWFkbG9jayBmb3IgY29uY3VycmVuY3kgZ3JvdXAgLi4uIHdhcyBkZXRlY3RlZCBiZXR3ZWVuICd0b3AgbGV2ZWwgd29ya2Zsb3cnIGFuZCAnPGpvYj4nXCIpLlxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgcXVldWU6ICdtYXgnLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG4vKipcbiAqIFBhcnNlcyBhIGB1c2VzOmAgdmFsdWUgY2FsbGluZyBvbmUgb2YgV2lsbEJvb3N0ZXIncyBvd24gcmV1c2FibGUgd29ya2Zsb3dzIChvciB0aGVcbiAqIFdpbGxCb29zdGVyTGFiIHN5bmMgbWlycm9yKSBpbnRvIHRoZSB3b3JrZmxvdyBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikgYW5kIGdpdCByZWYuIE9ubHkgdGhvc2VcbiAqIGZvbGxvdyB0aGUgY29udHJhY3Qgd2JmeSBlbmZvcmNlcyDigJQgY2FsbGVycyBvZiBhbm90aGVyIG9yZ2FuaXphdGlvbidzIHNhbWUtbmFtZWQgcmVwb3NpdG9yeSBhcmVcbiAqIGxlZnQgYWxvbmUuIEdpdEh1YiB0cmVhdHMgb3duZXIvcmVwb3NpdG9yeSBuYW1lcyBjYXNlLWluc2Vuc2l0aXZlbHksIHNvIHRoZSBjb21wYXJpc29uIGRvZXNcbiAqIHRvbywgd2hpbGUgdGhlIHdvcmtmbG93IHBhdGggYW5kIHJlZiBzdGF5IGNhc2Utc2Vuc2l0aXZlLlxuICovXG5mdW5jdGlvbiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKFxuICB1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHsgd29ya2Zsb3dOYW1lOiBzdHJpbmc7IGV4dGVuc2lvbjogc3RyaW5nOyByZWY6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbXi9dKylcXC8oW14vXSspXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvKFteL0BdKz8pXFwuKHlhP21sKUAoLispJC91LmV4ZWModXNlcyA/PyAnJyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG93bmVyID0gbWF0Y2hbMV0hLnRvTG93ZXJDYXNlKCk7XG4gIGlmICgob3duZXIgIT09ICd3aWxsYm9vc3RlcicgJiYgb3duZXIgIT09ICd3aWxsYm9vc3RlcmxhYicpIHx8IG1hdGNoWzJdIS50b0xvd2VyQ2FzZSgpICE9PSAncmV1c2FibGUtd29ya2Zsb3dzJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgd29ya2Zsb3dOYW1lOiBtYXRjaFszXSEsIGV4dGVuc2lvbjogbWF0Y2hbNF0hLCByZWY6IG1hdGNoWzVdISB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIC8vIFdpdGggLmdpdGh1YiBvciAuZ2l0aHViL3dvcmtmbG93cyBzeW1saW5rZWQgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgd3JpdGVZYW1sJ3MgZ3VhcmRzXG4gICAgLy8gYWxyZWFkeSByZWZ1c2UgdGhlIHdyaXRlcywgYnV0IHJlYWRkaXIvcm0gYmVsb3cgd291bGQgc3RpbGwgZW51bWVyYXRlIGFuZCBERUxFVEUgZmlsZXNcbiAgICAvLyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IOKAlCBzbyByZXF1aXJlIHRoZSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBpbnNpZGUgaXQgYmVmb3JlIGFueVxuICAgIC8vIHRyYXZlcnNhbCwgbWtkaXIsIG9yIGNsZWFudXAuXG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyB3b3JrZmxvd3MgYmVjYXVzZSAke3dvcmtmbG93c1BhdGh9IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIC8vIHdiZnkgd3JpdGVzIC55bWwgd29ya2Zsb3dzLCBzbyBlYWNoIGtpbmQgbWFwcyB0byBpdHMgLnltbCBmaWxlLlxuICAgIGNvbnN0IGZpbGVOYW1lc0J5S2luZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICFlbnRyeS5uYW1lLmVuZHNXaXRoKCcueW1sJykpIGNvbnRpbnVlO1xuICAgICAgZmlsZU5hbWVzQnlLaW5kLnNldChlbnRyeS5uYW1lLnNsaWNlKDAsIC0nLnltbCcubGVuZ3RoKSwgZW50cnkubmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmRhdG9yeUtpbmRzID0gWyd0ZXN0JywgJ3NlbWFudGljLXByJywgJ2Nsb3NlLWNvbW1lbnQnXTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCdyZWxlYXNlJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3Rlc3QtcnVzdCcpO1xuICAgIH1cbiAgICAvLyBBIHByZXZpb3VzIHJ1biBtYXkgaGF2ZSBtaXN0YWtlbiBhIGdpdGlnbm9yZWQgdGhpcmQtcGFydHkgY2hlY2tvdXQgZm9yIHJlcG9zaXRvcnkgUnVzdCBjb2RlLlxuICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBnZW5lcmF0ZWQtc3R5bGUgY2FsbGVyOiBhIHNhbWUtbmFtZWQgY3VzdG9tIHdvcmtmbG93IHdpdGggYW55IG90aGVyIGpvYiBzdGF5cy5cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHRlc3RSdXN0RmlsZU5hbWUgPSBmaWxlTmFtZXNCeUtpbmQuZ2V0KCd0ZXN0LXJ1c3QnKTtcbiAgICAgIGlmICh0ZXN0UnVzdEZpbGVOYW1lICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lLCAndGVzdC1ydXN0JykpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgndGVzdC1ydXN0Jyk7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCd3YmZ5Jyk7XG4gICAgZm9yIChjb25zdCBraW5kIG9mIG1hbmRhdG9yeUtpbmRzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lc0J5S2luZC5oYXMoa2luZCkpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLnNldChraW5kLCBgJHtraW5kfS55bWxgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbGVOYW1lc0J5S2luZC5oYXMoJ3N5bmMnKSkge1xuICAgICAgLy8gVGhlIHN5bmMgd29ya2Zsb3cncyBnZW5lcmF0aW9uIG93bnMgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3csIHNvIHByb2Nlc3NpbmcgaXQgYXMgYW5cbiAgICAgIC8vIGluZGVwZW5kZW50IGtpbmQgd291bGQgcmFjZSBjb25jdXJyZW50IHdyaXRlcyBvbiB0aGUgc2FtZSBwYXRoLlxuICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgnc3luYy1mb3JjZScpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tpbmQsIGZpbGVOYW1lXSBvZiBmaWxlTmFtZXNCeUtpbmQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQgYXMgS25vd25LaW5kLCBmaWxlTmFtZSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENhc2UtaW5zZW5zaXRpdmU6IEdpdEh1YiByZXBvc2l0b3J5IG5hbWVzIGFyZSwgYW5kIGEgcmVtb3RlIG1heSBzcGVsbCB0aGlzIG9uZSBhbnkgd2F5LiBHZXR0aW5nIGl0IHdyb25nXG4gIC8vIGxldHMgd2JmeSByZXdyaXRlIHRoZSByZXBvc2l0b3J5IHRoYXQgaG9zdHMgdGhlIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICByZXR1cm4gcmVwb3NpdG9yeT8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZXZlcnkgam9iIG9mIHRoZSB3b3JrZmxvdyBmaWxlIGNhbGxzIHRoZSBuYW1lZCBXaWxsQm9vc3RlciByZXVzYWJsZSB3b3JrZmxvdyAob3duZXJcbiAqIHJlc3RyaWN0ZWQgdmlhIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwpLiBVc2VkIHRvIGRlY2lkZSB3aGV0aGVyIHdiZnkgb3ducyBhIGZpbGUgZW5vdWdoIHRvXG4gKiBkZWxldGUgaXQ6IHVucGFyc2FibGUgZmlsZXMgYW5kIGZpbGVzIHdpdGggYW55IG90aGVyIGpvYiByZXR1cm4gZmFsc2Ug4oCUIGRlbGV0aW5nIGEgd2hvbGVcbiAqIHdvcmtmbG93IG9uIGEgbG9vc2UgbWF0Y2ggd291bGQgYmUgdG9vIGFnZ3Jlc3NpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCB3b3JrZmxvd05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKCcueW1sJykpIHJldHVybiBmYWxzZTtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBpc1RhcmdldENhbGwgPSAodXNlczogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgICB0eXBlb2YgdXNlcyA9PT0gJ3N0cmluZycgJiYgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSB3b3JrZmxvd05hbWU7XG4gIHRyeSB7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGpvYnMgPSBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpO1xuICAgICAgcmV0dXJuIGpvYnMubGVuZ3RoID4gMCAmJiBqb2JzLmV2ZXJ5KChqb2IpID0+IGlzVGFyZ2V0Q2FsbChqb2I/LnVzZXMpKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIFVucGFyc2FibGUgY29udGVudCBpcyBub3QgcHJvdmFibHkgYSBjYWxsZXIgb2YgdGhlIG5hbWVkIHdvcmtmbG93LlxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgd29ya2Zsb3dzUGF0aDogc3RyaW5nLFxuICBraW5kOiBLbm93bktpbmQsXG4gIGZpbGVOYW1lID0gYCR7a2luZH0ueW1sYFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKVxuICAgID8gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCdcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBBIG5vbi1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbCBpbiBhIHJlcG8gd2l0aG91dCBSdXN0IGNvZGUgbWVyZWx5IHNoYXJlcyB0aGUgbmFtZTsgbGVhdmUgaXQgYWxvbmUuXG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0JyAmJiBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFdvcmtmbG93O1xuICAgIHRyeSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHdvcmtmbG93IHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlIHRlbXBsYXRlXG4gICAgICAvLyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcmVwb3NpdG9yeSdzIHdvcmtmbG93LlxuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgWUFNTC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8geWFtbC5sb2FkIHJldHVybnMgdW5kZWZpbmVkIGZvciBlbXB0eS9jb21tZW50LW9ubHkgZmlsZXMgYW5kIG5vbi1vYmplY3RzIGZvciBzY2FsYXJcbiAgICAvLyBkb2N1bWVudHMgd2l0aG91dCB0aHJvd2luZzsgZGVlcG1lcmdlIHdvdWxkIGNyYXNoIG9uIHRoZW0uXG4gICAgaWYgKHR5cGVvZiBvbGRTZXR0aW5ncyAhPT0gJ29iamVjdCcgfHwgb2xkU2V0dGluZ3MgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IGEgd29ya2Zsb3cuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH1cblxuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgLy8gVW5saWtlIHRoZSByZWxlYXNlIGNhbGxlciwgdGhlIGRlZmF1bHQgcXVldWUgKGBzaW5nbGVgKSBpcyBpbnRlbnRpb25hbCBoZXJlOiBhIHBlbmRpbmdcbiAgICAgIC8vIGRlcGxveSB0aGF0IGlzIGNhbmNlbGxlZCBhbmQgcmVwbGFjZWQgYnkgYSBuZXdlciBvbmUgbG9zZXMgbm90aGluZyDigJQgdGhlIG5ld2VyIGRlcGxveVxuICAgICAgLy8gY29udmVyZ2VzIHRoZSBlbnZpcm9ubWVudCB0byB0aGUgbGF0ZXN0IHN0YXRlIGFueXdheS5cbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZSkge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWU7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgZW1wdHkgam9icyAoYSBiYXJlIGBqb2JOYW1lOmAgcGFyc2VzIGFzIG51bGwpLCBub24tcmV1c2FibGUgd29ya2Zsb3dzLCBhbmQgb3RoZXJcbiAgICAvLyBvcmdhbml6YXRpb25zJyByZXVzYWJsZSB3b3JrZmxvd3M6IGEgc2FtZS1uYW1lZCBgcmV1c2FibGUtd29ya2Zsb3dzYCByZXBvc2l0b3J5IGVsc2V3aGVyZVxuICAgIC8vIGZvbGxvd3MgYSBkaWZmZXJlbnQgY29udHJhY3QsIGFuZCBub3JtYWxpemluZyBpdHMgY2FsbGVycyAoc2VjcmV0IGluamVjdGlvbi9yZW1vdmFsLFxuICAgIC8vIHBlcm1pc3Npb25zKSBjb3VsZCBicmVhayB0aGVtLlxuICAgIGlmICgham9iIHx8ICFwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICAvLyBEZXBsb3kgY2FsbGVycyBuZWVkIG5vIHJlcG9zaXRvcnkgd3JpdGVzOiB0aGUgY2FsbGVkIHJldXNhYmxlIHdvcmtmbG93IGluaGVyaXRzIHRoZSBjYWxsZXInc1xuICAvLyB0b2tlbiBwZXJtaXNzaW9ucywgcmVwb3NpdG9yaWVzIGRlZmF1bHQgdGhlIHRva2VuIHRvIHdyaXRlLCBhbmQgdGhlIHJldXNhYmxlIGRlcGxveSB3b3JrZmxvd1xuICAvLyBhdCBtYWluIHBlcmZvcm1zIG5vIEdJVEhVQl9UT0tFTiB3cml0ZXMuIFRoZSByZWFkLW9ubHkgZGVmYXVsdCBpcyBpbmplY3RlZCBhdCB0aGUgSk9CIGxldmVsXG4gIC8vIChqb2IgcGVybWlzc2lvbnMgZG8gbm90IGFmZmVjdCBzaWJsaW5nIGpvYnMsIHNvIGlubGluZSBqb2JzIG9yIHBpbm5lZCBjYWxsZWVzIOKAlCB3aG9zZSB3cml0ZVxuICAvLyBuZWVkcyBhcmUgdW5hdWRpdGVkIOKAlCBrZWVwIHRoZWlycyksIGFuZCBvbmx5IHdoZW4gbmVpdGhlciB0aGUgd29ya2Zsb3cgbm9yIHRoZSBqb2IgZGVjbGFyZXNcbiAgLy8gaXRzIG93biBwZXJtaXNzaW9ucyAoT0lEQyBkZXBsb3lzIGFsd2F5cyBkbywgZm9yIGlkLXRva2VuKS4gcnVuLXNjcmlwdCBjYWxsZXJzIGFyZSBleGNsdWRlZFxuICAvLyBiZWNhdXNlIGFyYml0cmFyeSBwYWNrYWdlIHNjcmlwdHMgbWF5IHB1c2ggY29tbWl0cy5cbiAgaWYgKCFuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAgIGlmICgham9iKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgICAgIGlmICgham9iLnBlcm1pc3Npb25zICYmIGNhbGw/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveScgJiYgY2FsbC5yZWYgPT09ICdtYWluJykge1xuICAgICAgICBqb2IucGVybWlzc2lvbnMgPSB7IGNvbnRlbnRzOiAncmVhZCcgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOlxuICAgIGNhc2UgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93IGJhc2VkIG9uIHRoZSBzeW5jIHdvcmtmbG93IGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbi8vIHdiJ3MgZ2xvYmFsIG9wdGlvbnMgdGhhdCBjb25zdW1lIGEgZm9sbG93aW5nIHZhbHVlIHRva2VuIChmcm9tIHNoYXJlZE9wdGlvbnNCdWlsZGVyIHBsdXNcbi8vIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpOyBldmVyeSBvdGhlciBgLWAtcHJlZml4ZWQgdG9rZW4gYmVmb3JlIHRoZSBzdWJjb21tYW5kIGlzIGEgYm9vbGVhbi5cbmNvbnN0IHdiR2xvYmFsVmFsdWVPcHRpb25zID0gbmV3IFNldChbJy0td29ya2luZy1kaXInLCAnLXcnLCAnLS1lbnYnLCAnLS1jYXNjYWRlLWVudiddKTtcblxuLy8gU3ViY29tbWFuZHMgdGhhdCBydW4gYSBCSU5BUlkgKHNvIHRoZSBmb2xsb3dpbmcgdG9rZW4gY2FuIGJlIHRoZSB3YiBleGVjdXRhYmxlKSwgcGVyIHJ1bm5lcjogYnVuXG4vLyByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGEgcGFja2FnZSBzY3JpcHQgb2YgdGhhdCBuYW1lKSwgbnBtIGhhcyBgZXhlY2AvYHhgLFxuLy8gYW5kIHBucG0veWFybiAoQmVycnkpIGhhdmUgYGV4ZWNgL2BkbHhgLlxuY29uc3QgcnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSB7XG4gIG5wbTogbmV3IFNldChbJ2V4ZWMnLCAneCddKSxcbiAgcG5wbTogbmV3IFNldChbJ2V4ZWMnLCAnZGx4J10pLFxuICB5YXJuOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIGJ1bjogbmV3IFNldChbJ3gnXSksXG59O1xuXG4vLyBSdW5uZXIgb3B0aW9ucyB0aGF0IGNvbnN1bWUgdGhlIEZPTExPV0lORyB0b2tlbiBhcyB0aGVpciB2YWx1ZSwgc28gaXQgaXMgbm90IHRoZSB3YiBleGVjdXRhYmxlXG4vLyAoZS5nLiBgYnVuIC0tY3dkIGRpciB3YiBkZXBsb3lgLCBgbnB4IC1wIHBrZyB3YiBkZXBsb3lgKS4gQSBjb25zZXJ2YXRpdmUgc3VwZXJzZXQgYWNyb3NzXG4vLyBucG0vcG5wbS95YXJuL2J1biBhbmQgdGhlIG5weC9idW54IHBhY2thZ2UgZXhlY3V0b3JzLlxuY29uc3QgcnVubmVyVmFsdWVPcHRpb25zID0gbmV3IFNldChbXG4gICctLWN3ZCcsXG4gICctQycsXG4gICctLXByZWZpeCcsXG4gICctLWZpbHRlcicsXG4gICctRicsXG4gICctLXdvcmtzcGFjZScsXG4gICctdycsXG4gICctLWRpcicsXG4gICctcCcsXG4gICctLXBhY2thZ2UnLFxuICAnLWMnLFxuICAnLS1jYWxsJyxcbl0pO1xuXG4vKiogQWR2YW5jZSBwYXN0IGEgcnVubmVyJ3Mgb3B0aW9ucywgY29uc3VtaW5nIGEgc2VwYXJhdGUgdmFsdWUgdG9rZW4gd2hlcmUgb25lIGFwcGxpZXMuICovXG5mdW5jdGlvbiBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnM6IHN0cmluZ1tdLCBzdGFydEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBzdGFydEluZGV4O1xuICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb25zdCBvcHRpb24gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCFvcHRpb24uaW5jbHVkZXMoJz0nKSAmJiBydW5uZXJWYWx1ZU9wdGlvbnMuaGFzKG9wdGlvbikgJiYgaW5kZXggPCB0b2tlbnMubGVuZ3RoKSBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBUb2tlbml6ZSBhIHNoZWxsIGNvbW1hbmQgbGluZSBpbnRvIGNvbW1hbmQgc2VnbWVudHMsIGVhY2ggYSBsaXN0IG9mIHRva2VucyB3aXRoIHF1b3RlcyByZW1vdmVkLlxuICogQSBuZXcgc2VnbWVudCBzdGFydHMgYXQgYW4gdW5xdW90ZWQgYCYmYC9gfHxgL2A7YC9gfGAvYCZgOyBhbiB1bnF1b3RlZCBgI2Agc3RhcnRzIGEgY29tbWVudCB0b1xuICogZW5kIG9mIGxpbmU7IGEgYmFja3NsYXNoIGVzY2FwZXMgdGhlIG5leHQgY2hhcmFjdGVyIChzbyBgXFw7YCBpcyBhIGxpdGVyYWwsIG5vdCBhIHNlcGFyYXRvcik7XG4gKiBncm91cGluZyBwYXJlbnRoZXNlcyBgKGAvYClgIGFyZSB0b2tlbiBzZXBhcmF0b3JzLCBzbyBgKHdiIGRlcGxveSlgIHRva2VuaXplcyBhcyBgd2IgZGVwbG95YC5cbiAqIFNlZ21lbnRzL3Rva2VucyBtb2RlbCBjb21tYW5kIHN0cnVjdHVyZSBwcmVjaXNlbHkgZW5vdWdoIHRoYXQgcXVvdGVkIG9wZXJhdG9ycywgZXNjYXBlZFxuICogb3BlcmF0b3JzLCBjb21tZW50cywgYW5kIHN1YnNoZWxsIGdyb3VwcyBuZWl0aGVyIGZhYnJpY2F0ZSBub3IgaGlkZSBhIGB3YiBkZXBsb3lgIGludm9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU2hlbGxDb21tYW5kKHNjcmlwdDogc3RyaW5nKTogeyBzZWdtZW50czogc3RyaW5nW11bXTsgc2F3SGVyZWRvYzogYm9vbGVhbiB9IHtcbiAgY29uc3Qgc2VnbWVudHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSAnJztcbiAgbGV0IGluVG9rZW4gPSBmYWxzZTtcbiAgbGV0IHF1b3RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8vIFdoZXRoZXIgdGhlIHNjcmlwdCB1c2VzIGFueSBoZXJlZG9jLiBGYWl0aGZ1bGx5IGNsYXNzaWZ5aW5nIHdoaWNoIGJvZHkgbGluZXMgYXJlIGRhdGEgKHRoZVxuICAvLyBkZWxpbWl0ZXIgd29yZCBjYW4gYmUgcXVvdGVkL2JhY2tzbGFzaC1lc2NhcGVkLCBgPDwtYCBzdHJpcHMgbGVhZGluZyB0YWJzLCB0ZXJtaW5hdG9ycyBtYXRjaFxuICAvLyBleGFjdGx5KSBpcyBtb3JlIHRoYW4gdGhpcyBwYXJzZXIgbW9kZWxzLCBzbyBhIGhlcmVkb2MgYW55d2hlcmUgbWFrZXMgZGV0ZWN0aW9uIHJldHVybiBmYWxzZS5cbiAgbGV0IHNhd0hlcmVkb2MgPSBmYWxzZTtcbiAgLy8gSGVyZWRvYyBkZWxpbWl0ZXJzIHdob3NlIGJvZGllcyBiZWdpbiBhdCB0aGUgTkVYVCBuZXdsaW5lOiBgY2F0IDw8QSA8PEJgIHF1ZXVlcyBBIHRoZW4gQiwgYW5kXG4gIC8vIHRoZSBjb21tYW5kcyBBRlRFUiB0aGUgYDw8YCBoZWFkZXIgb24gdGhlIHNhbWUgbGluZSBzdGlsbCBleGVjdXRlLCBzbyB0aGUgaGVhZGVyIGlzIHJlY29yZGVkXG4gIC8vIGhlcmUgYW5kIHRoZSBib2RpZXMgYXJlIHNraXBwZWQgb25seSB3aGVuIHRoZSBsaW5lJ3MgbmV3bGluZSBpcyByZWFjaGVkLlxuICBsZXQgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBza2lwSGVyZWRvY0JvZGllcyA9IChmcm9tSW5kZXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgbGV0IGN1cnNvciA9IGZyb21JbmRleDtcbiAgICBmb3IgKGNvbnN0IGRlbGltaXRlciBvZiBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMpIHtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBzY3JpcHQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVTdGFydCA9IGN1cnNvciArIDE7XG4gICAgICAgIGxldCBsaW5lRW5kID0gbGluZVN0YXJ0O1xuICAgICAgICB3aGlsZSAobGluZUVuZCA8IHNjcmlwdC5sZW5ndGggJiYgc2NyaXB0W2xpbmVFbmRdICE9PSAnXFxuJykgbGluZUVuZCsrO1xuICAgICAgICBjdXJzb3IgPSBsaW5lRW5kO1xuICAgICAgICBpZiAoc2NyaXB0LnNsaWNlKGxpbmVTdGFydCwgbGluZUVuZCkudHJpbSgpID09PSBkZWxpbWl0ZXIpIGJyZWFrO1xuICAgICAgICBpZiAobGluZUVuZCA+PSBzY3JpcHQubGVuZ3RoKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzID0gW107XG4gICAgcmV0dXJuIGN1cnNvcjtcbiAgfTtcbiAgY29uc3QgZW5kVG9rZW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGluVG9rZW4pIHRva2Vucy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSAnJztcbiAgICBpblRva2VuID0gZmFsc2U7XG4gIH07XG4gIGNvbnN0IGVuZFNlZ21lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgZW5kVG9rZW4oKTtcbiAgICBzZWdtZW50cy5wdXNoKHRva2Vucyk7XG4gICAgdG9rZW5zID0gW107XG4gIH07XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzY3JpcHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gc2NyaXB0W2luZGV4XSA/PyAnJztcbiAgICBpZiAocXVvdGUpIHtcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiBxdW90ZSA9PT0gJ1wiJykge1xuICAgICAgICAvLyBJbnNpZGUgZG91YmxlIHF1b3RlcywgYmFja3NsYXNoLW5ld2xpbmUgaXMgc3RpbGwgYSBsaW5lIGNvbnRpbnVhdGlvbiAoYm90aCByZW1vdmVkKTtcbiAgICAgICAgLy8gYW55IG90aGVyIGVzY2FwZWQgY2hhcmFjdGVyIGNvbnRyaWJ1dGVzIGxpdGVyYWxseS5cbiAgICAgICAgaWYgKHNjcmlwdFtpbmRleCArIDFdID09PSAnXFxuJykgaW5kZXgrKztcbiAgICAgICAgZWxzZSBjdXJyZW50ICs9IHNjcmlwdFsrK2luZGV4XSA/PyAnJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBlbHNlIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJykge1xuICAgICAgLy8gQmFja3NsYXNoLW5ld2xpbmUgaXMgYSBsaW5lIGNvbnRpbnVhdGlvbjogdGhlIHNoZWxsIHJlbW92ZXMgYm90aCwgam9pbmluZyB0aGUgbGluZXNcbiAgICAgIC8vIHdpdGhvdXQgaW50cm9kdWNpbmcgYSB0b2tlbiBib3VuZGFyeS4gQW55IG90aGVyIGVzY2FwZWQgY2hhcmFjdGVyIGlzIGEgbGl0ZXJhbC5cbiAgICAgIGlmIChzY3JpcHRbaW5kZXggKyAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjdXJyZW50ICs9IHNjcmlwdFsrK2luZGV4XSA/PyAnJztcbiAgICAgIGluVG9rZW4gPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09IFwiJ1wiIHx8IGNoYXJhY3RlciA9PT0gJ1wiJykge1xuICAgICAgcXVvdGUgPSBjaGFyYWN0ZXI7XG4gICAgICBpblRva2VuID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBBIGA8PGAvYDw8LWAgaGVyZWRvYyByZWRpcmVjdGlvbjogaXRzIGJvZHkgbGluZXMgKHVwIHRvIHRoZSBkZWxpbWl0ZXIgbGluZSkgYXJlIERBVEEsIG5vdFxuICAgIC8vIGNvbW1hbmRzLCBzbyBgY2F0IDw8J0VPRidcXG53YiBkZXBsb3lcXG5FT0ZgIG11c3Qgbm90IHJlYWQgYHdiIGRlcGxveWAgYXMgYW4gaW52b2NhdGlvbi4gU2luY2VcbiAgICAvLyB0aGUgY2FsbGVyIGRlY2xpbmVzIG9uIEFOWSBoZXJlZG9jLCBmbGFnIGl0IHRoZSBpbnN0YW50IGA8PGAgYXBwZWFycyDigJQgYmVmb3JlIHBhcnNpbmcgdGhlXG4gICAgLy8gZGVsaW1pdGVyIHdvcmQg4oCUIHNvIGFuIGV4b3RpYyBkZWxpbWl0ZXIgKGA8PCtgKSB0aGUgd29yZCBzY2FubmVyIGNhbm5vdCByZWFkIHN0aWxsIGRlY2xpbmVzLlxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICc8JyAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gJzwnKSB7XG4gICAgICBzYXdIZXJlZG9jID0gdHJ1ZTtcbiAgICAgIGxldCBjdXJzb3IgPSBpbmRleCArIDI7XG4gICAgICBpZiAoc2NyaXB0W2N1cnNvcl0gPT09ICctJykgY3Vyc29yKys7XG4gICAgICB3aGlsZSAoL1sgXFx0XS91LnRlc3Qoc2NyaXB0W2N1cnNvcl0gPz8gJycpKSBjdXJzb3IrKztcbiAgICAgIGxldCBkZWxpbWl0ZXIgPSAnJztcbiAgICAgIC8vIFRoZSBkZWxpbWl0ZXIgd29yZCBtYXkgYmUgcXVvdGVkIChgPDwnRU9GJ2ApIG9yIGJhY2tzbGFzaC1lc2NhcGVkIChgPDxcXEVPRmApOyBlaXRoZXIgZm9ybVxuICAgICAgLy8ganVzdCBkaXNhYmxlcyBib2R5IGV4cGFuc2lvbiwgc28gY29sbGVjdCB0aGUgYmFyZSB3b3JkLiBNaXNzaW5nIHRoZSBlc2NhcGVkIGZvcm0gd291bGQgZHJvcFxuICAgICAgLy8gYHNhd0hlcmVkb2NgIGFuZCByZWFkIHRoZSBoZXJlZG9jIGJvZHkgYXMgY29tbWFuZHMuXG4gICAgICBsZXQgZGVsaW1pdGVyUXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBzY3JpcHQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlbGltaXRlckNoYXIgPSBzY3JpcHRbY3Vyc29yXSA/PyAnJztcbiAgICAgICAgaWYgKGRlbGltaXRlclF1b3RlKSB7XG4gICAgICAgICAgaWYgKGRlbGltaXRlckNoYXIgPT09IGRlbGltaXRlclF1b3RlKSBkZWxpbWl0ZXJRdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBlbHNlIGRlbGltaXRlciArPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbGltaXRlckNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICAgIC8vIEEgYmFja3NsYXNoIHF1b3RlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW50byB0aGUgZGVsaW1pdGVyIHdvcmQgKGA8PFxcRU9GYCDihpIgYEVPRmApLlxuICAgICAgICAgIGN1cnNvcisrO1xuICAgICAgICAgIGRlbGltaXRlciArPSBzY3JpcHRbY3Vyc29yXSA/PyAnJztcbiAgICAgICAgfSBlbHNlIGlmIChkZWxpbWl0ZXJDaGFyID09PSBcIidcIiB8fCBkZWxpbWl0ZXJDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgZGVsaW1pdGVyUXVvdGUgPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKC9bXFx3Li1dL3UudGVzdChkZWxpbWl0ZXJDaGFyKSkge1xuICAgICAgICAgIGRlbGltaXRlciArPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnNvcisrO1xuICAgICAgfVxuICAgICAgaWYgKGRlbGltaXRlcikge1xuICAgICAgICAvLyBUaGUgYDw8ZGVsaW1gIGhlYWRlciBpcyBhIHJlZGlyZWN0aW9uIChub3QgYSB0b2tlbik7IHJlY29yZCB0aGUgZGVsaW1pdGVyIGFuZCBrZWVwXG4gICAgICAgIC8vIHBhcnNpbmcgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIOKAlCBpdHMgYm9keSBpcyBza2lwcGVkIHdoZW4gdGhlIG5ld2xpbmUgaXMgcmVhY2hlZC5cbiAgICAgICAgZW5kVG9rZW4oKTtcbiAgICAgICAgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzLnB1c2goZGVsaW1pdGVyKTtcbiAgICAgICAgaW5kZXggPSBjdXJzb3IgLSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJyMnICYmICFpblRva2VuKSB7XG4gICAgICAvLyBDb21tZW50IHJ1bnMgdG8gZW5kIG9mIGxpbmU7IGVuZCB0aGUgY3VycmVudCBjb21tYW5kIHNlZ21lbnQgYW5kIGxldCB0aGUgbG9vcCByZXN1bWUgYXRcbiAgICAgIC8vIHRoZSBuZXdsaW5lIHNvIHRoZSBuZXh0IGxpbmUgaXMgcGFyc2VkIGFzIGl0cyBvd24gc2VnbWVudC5cbiAgICAgIGVuZFNlZ21lbnQoKTtcbiAgICAgIHdoaWxlIChpbmRleCArIDEgPCBzY3JpcHQubGVuZ3RoICYmIHNjcmlwdFtpbmRleCArIDFdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnJicgfHwgY2hhcmFjdGVyID09PSAnfCcgfHwgY2hhcmFjdGVyID09PSAnOycgfHwgY2hhcmFjdGVyID09PSAnXFxuJykge1xuICAgICAgZW5kU2VnbWVudCgpO1xuICAgICAgaWYgKChjaGFyYWN0ZXIgPT09ICcmJyB8fCBjaGFyYWN0ZXIgPT09ICd8JykgJiYgc2NyaXB0W2luZGV4ICsgMV0gPT09IGNoYXJhY3RlcikgaW5kZXgrKztcbiAgICAgIC8vIEEgbmV3bGluZSB0aGF0IGNsb3NlcyBhIGhlcmVkb2MgaGVhZGVyIGxpbmUgY29uc3VtZXMgdGhlIHF1ZXVlZCBib2RpZXMgYmVmb3JlIHRoZSBuZXh0XG4gICAgICAvLyBjb21tYW5kLlxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcbicgJiYgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzLmxlbmd0aCA+IDApIGluZGV4ID0gc2tpcEhlcmVkb2NCb2RpZXMoaW5kZXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcoJyB8fCBjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZW5kVG9rZW4oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoL1xccy91LnRlc3QoY2hhcmFjdGVyKSkge1xuICAgICAgZW5kVG9rZW4oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgICBpblRva2VuID0gdHJ1ZTtcbiAgfVxuICBlbmRTZWdtZW50KCk7XG4gIHJldHVybiB7IHNlZ21lbnRzLCBzYXdIZXJlZG9jIH07XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlcGxveSBzY3JpcHQgaW52b2tlcyBgd2Ig4oCmIGRlcGxveWAgYXQgY29tbWFuZCBwb3NpdGlvbi4gRW52IGFzc2lnbm1lbnRzLCBwYWNrYWdlXG4gKiBydW5uZXJzLCBhbmQgZ2xvYmFsIHlhcmdzIG9wdGlvbnMgKHdpdGggdGhlaXIgdmFsdWUgdG9rZW5zKSBtYXkgcHJlY2VkZSB0aGUgZGVwbG95IGNvbW1hbmQ7XG4gKiBzaGVsbCBxdW90aW5nLCBlc2NhcGluZywgY29tbWVudHMsIGFuZCBncm91cGluZyBhcmUgaG9ub3JlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQ6IHN0cmluZywgc2NyaXB0TmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgY29uc3QgeyBzZWdtZW50cywgc2F3SGVyZWRvYyB9ID0gdG9rZW5pemVTaGVsbENvbW1hbmQoZGVwbG95U2NyaXB0KTtcbiAgLy8gQSBoZXJlZG9jIG1ha2VzIGJvZHktdnMtY29tbWFuZCBjbGFzc2lmaWNhdGlvbiB1bnJlbGlhYmxlIChzZWUgdG9rZW5pemVTaGVsbENvbW1hbmQpLlxuICBpZiAoc2F3SGVyZWRvYykgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IHRva2VucyBvZiBzZWdtZW50cykge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgaW5kZXgrKztcbiAgICAvLyBMZWFkaW5nIGxhdW5jaGVycyBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgZW52YCAod2l0aCBvcHRpb25zICsgS0VZPXZhbHVlIGFzc2lnbm1lbnRzKVxuICAgIC8vIGFuZCB0aGUgUE9TSVggYGNvbW1hbmRgIGJ1aWx0aW4gKHdpdGggaXRzIGAtcGAvYC12YC9gLVZgIG9wdGlvbnMpLiBDb21tYW5kLXBvc2l0aW9uIHNoZWxsXG4gICAgLy8gcmVzZXJ2ZWQgd29yZHMgYW5kIG90aGVyIGxhdW5jaGVycyAoYGlmYC9gdGhlbmAvYGZvcmAvYHRpbWVgL2BleGVjYC9gIWAvYnJhY2UgZ3JvdXBzLCDigKYpIGFyZVxuICAgIC8vIE5PVCBtb2RlbGVkOiB0aGV5IGxlYXZlIGEgbm9uLWB3YmAgZmlyc3QgdG9rZW4sIHNvIHRoZSBzZWdtZW50IHNpbXBseSBkb2VzIG5vdCBtYXRjaC4gVGhpcyBpc1xuICAgIC8vIGEgZGVsaWJlcmF0ZSBmYWxzZS1uZWdhdGl2ZSBmb3IgZ2VuZXJhdGVkIGd1aWRhbmNlLlxuICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnZW52Jykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgICBpZiAoL15bQS1aYS16X11bQS1aYS16MC05X10qPS91LnRlc3QodG9rZW4pKSBpbmRleCsrO1xuICAgICAgICAvLyBlbnYncyBkaXJlY3RvcnkgdmFsdWUgbWF5IGJlIHNlcGFyYXRlIG9yIGF0dGFjaGVkIChgLUNkaXJgLCBgLS1jaGRpcj1kaXJgKS4gSXQgY2hhbmdlc1xuICAgICAgICAvLyB3aGVyZSB3YiBydW5zIGJ1dCBub3Qgd2hldGhlciB0aGUgY29tbWFuZCBpbnZva2VzIHdiIGRlcGxveS5cbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctQycgfHwgdG9rZW4gPT09ICctLWNoZGlyJykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLUMnKSB8fCB0b2tlbi5zdGFydHNXaXRoKCctLWNoZGlyPScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy11JykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBgY29tbWFuZCBDTURgIGV4ZWN1dGVzIENNRCwgYnV0IGBjb21tYW5kIC12YC9gLVYgQ01EYCBvbmx5IFFVRVJZIGl0cyBhdmFpbGFiaWxpdHkgd2l0aG91dFxuICAgIC8vIHJ1bm5pbmcgaXQsIHNvIGEgZGVwbG95IGJlaGluZCB0aGVtIGRvZXMgbm90IHJ1bi4gVGhlIGB2YC9gVmAgZmxhZyBtYXkgYmUgY2x1c3RlcmVkIHdpdGhcbiAgICAvLyBvdGhlciBvcHRpb24gbGV0dGVycyAoYGNvbW1hbmQgLXB2IHdiYCksIHNvIG1hdGNoIGFueSBvcHRpb24gbGV0dGVyIGNsdXN0ZXIgY29udGFpbmluZyBpdC5cbiAgICB3aGlsZSAodG9rZW5zW2luZGV4XSA9PT0gJ2NvbW1hbmQnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgbGV0IHF1ZXJpZXNPbmx5ID0gZmFsc2U7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgaWYgKC9eLVtBLVphLXpdKlt2Vl1bQS1aYS16XSokL3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgcXVlcmllc09ubHkgPSB0cnVlO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHF1ZXJpZXNPbmx5KSB7XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSBjb250aW51ZTtcbiAgICAvLyBSZXNvbHZlIGEgcnVubmVyIHByZWZpeCB0byB3aGV0aGVyIHRoZSBmb2xsb3dpbmcgdG9rZW4gaXMgYSBCSU5BUlkgKHRoZSB3YiBleGVjdXRhYmxlKSBvciBhXG4gICAgLy8gcGFja2FnZSBTQ1JJUFQgbmFtZS4gYGJ1bnhgL2BucHhgIGFuZCBgPHBtPiB4fGRseHxleGVjYCBydW4gYSBiaW5hcnk7IGA8cG0+IHJ1bnxydW4tc2NyaXB0YFxuICAgIC8vIChhbmQgYmFyZSBgbnBtIDxuYW1lPmAsIG9yIGFueSBydW5uZXIgZm9sbG93ZWQgYnkgYC0tYCkgcnVuIGEgcGFja2FnZSBzY3JpcHQg4oCUIHNvXG4gICAgLy8gYG5wbSBydW4gd2IgZGVwbG95YCBleGVjdXRlcyB0aGUgc2NyaXB0IG5hbWVkIGB3YmAsIG5vdCB0aGUgd2IgYmluYXJ5LCBhbmQgbXVzdCBiZSByZWplY3RlZC5cbiAgICBpZiAoWyducG0nLCAncG5wbScsICd5YXJuJywgJ2J1biddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBjb25zdCBydW5uZXIgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgICBjb25zdCBzdWJjb21tYW5kID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGlmIChbJ3J1bicsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoc3ViY29tbWFuZCkpIGNvbnRpbnVlOyAvLyBydW5zIGEgcGFja2FnZSBzY3JpcHQsIG5vdCB3YlxuICAgICAgLy8gRXhlY3V0b3Igc3ViY29tbWFuZHMgYXJlIHJ1bm5lci1TUEVDSUZJQzogYnVuIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYVxuICAgICAgLy8gcGFja2FnZSBzY3JpcHQgbmFtZWQgZGx4L2V4ZWMpLiBSZWFsIGJ1aWx0LWluIGV4ZWN1dG9ycyAoYGV4ZWNgL2B4YCwgYW5kIGBkbHhgIGZvciBwbnBtKVxuICAgICAgLy8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgYSBzYW1lLW5hbWVkIHNjcmlwdCwgc28gdGhleSBhcmUgTk9UIHNoYWRvdy1jaGVja2VkLiBPbmx5IGB5YXJuIGRseGAgaXNcbiAgICAgIC8vIGFtYmlndW91cyDigJQgYSBCZXJyeSBidWlsdC1pbiBidXQgYSBwYWNrYWdlIFNDUklQVCBpbiBZYXJuIENsYXNzaWMg4oCUIHNvIGEgZGVjbGFyZWQgYGRseGBcbiAgICAgIC8vIHNjcmlwdCBtYWtlcyBgeWFybiBkbHhgIGRlY2xpbmUgKGZhbGwgdGhyb3VnaCB0byB0aGUgcGFja2FnZS1zY3JpcHQgY2hlY2tzKS5cbiAgICAgIGNvbnN0IGlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQgPSBydW5uZXIgPT09ICd5YXJuJyAmJiBzdWJjb21tYW5kID09PSAnZGx4JyAmJiBzY3JpcHROYW1lcy5oYXMoJ2RseCcpO1xuICAgICAgaWYgKHJ1bm5lckV4ZWN1dG9yU3ViY29tbWFuZHNCeVJ1bm5lcltydW5uZXJdPy5oYXMoc3ViY29tbWFuZCkgJiYgIWlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQpIHtcbiAgICAgICAgaW5kZXgrKzsgLy8gYmluYXJ5IHJ1bm5lciAocG5wbSBkbHgsIGJ1biB4LCBgbnBtIGV4ZWMgLS0gd2Ig4oCmYClcbiAgICAgICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICctLScpIGluZGV4Kys7IC8vIHRoZSBleGVjdXRvcidzIG9wdGlvbmFsIGAtLWAgYmVmb3JlIHRoZSBjb21tYW5kXG4gICAgICB9IGVsc2UgaWYgKHJ1bm5lciA9PT0gJ25wbScpIHtcbiAgICAgICAgY29udGludWU7IC8vIGJhcmUgYG5wbSB3YmAgbmV2ZXIgcnVucyBhIGJpbmFyeVxuICAgICAgfSBlbHNlIGlmICh0b2tlbnNbaW5kZXhdID09PSAnd2InICYmIHNjcmlwdE5hbWVzLmhhcygnd2InKSkge1xuICAgICAgICAvLyBCYXJlIGBidW4vcG5wbS95YXJuIHdiYCBydW5zIGEgcGFja2FnZSBTQ1JJUFQgbmFtZWQgYHdiYCB3aGVuIG9uZSBleGlzdHMgKHBhc3NpbmcgYGRlcGxveWBcbiAgICAgICAgLy8gYXMgaXRzIGFyZ3VtZW50KSwgbm90IHRoZSB3YiBiaW5hcnkuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoWydidW54JywgJ25weCddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICB9XG4gICAgaWYgKHRva2Vuc1tpbmRleF0gIT09ICd3YicpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHdiQXJncyA9IHRva2Vucy5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIFNraXAgZ2xvYmFsIG9wdGlvbnMgKGFuZCBhbnkgdmFsdWUgdG9rZW4gYSB2YWx1ZS1iZWFyaW5nIG9wdGlvbiBjb25zdW1lcykgc28gdGhlIEZJUlNUXG4gICAgLy8gY29tbWFuZCB0b2tlbiBkZWNpZGVzOiBgd2IgLS1jYXNjYWRlLWVudiBwcm9kdWN0aW9uIGRlcGxveWAgYW5kIGB3YiAtdyBwYWNrYWdlcy9hcGkgZGVwbG95YFxuICAgIC8vIG1hdGNoLCB3aGlsZSBzdWJjb21tYW5kcyBvd25pbmcgdGhlaXIgb3duIGBkZXBsb3lgIChgd2IgcHJpc21hIGRlcGxveWAsIGB3YiByZXRyeSBkZXBsb3lgKVxuICAgIC8vIGRvIG5vdC4gYC0tb3B0PXZhbHVlYCBjYXJyaWVzIGl0cyB2YWx1ZSBpbmxpbmUsIHNvIG9ubHkgdGhlIHNwYWNlLXNlcGFyYXRlZCBmb3JtIHNraXBzIG9uZS5cbiAgICBsZXQgY29tbWFuZEluZGV4ID0gMDtcbiAgICB3aGlsZSAoY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCAmJiAod2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc3QgZmxhZyA9IHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnO1xuICAgICAgY29tbWFuZEluZGV4Kys7XG4gICAgICBpZiAod2JHbG9iYWxWYWx1ZU9wdGlvbnMuaGFzKGZsYWcpICYmIGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGgpIGNvbW1hbmRJbmRleCsrO1xuICAgIH1cbiAgICBpZiAod2JBcmdzW2NvbW1hbmRJbmRleF0gIT09ICdkZXBsb3knKSBjb250aW51ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgd29ya2Zsb3dzIGRpcmVjdG9yeSBob2xkcyBhIGxpdmUgY2FsbGVyIG9mIHRoZSByZXVzYWJsZSBDbG91ZGZsYXJlIGRlcGxveSB3b3JrZmxvdy5cbiAqIFlBTUwgaXMgcGFyc2VkIGFuZCBvbmx5IGBqb2JzLioudXNlc2AgdmFsdWVzIGFyZSBpbnNwZWN0ZWQgKGEgcmF3LXRleHQgc2VhcmNoIHdvdWxkIG1hdGNoXG4gKiBjb21tZW50cyBvciBgcnVuOmAgc3RyaW5ncyksIHdpdGggYSBgZGVwbG95KmAtZmlsZW5hbWUgc2hvcnRjdXQgYW5kIGEgY29uc2VydmF0aXZlIHJhdy10ZXh0XG4gKiBmYWxsYmFjayBmb3IgdW5wYXJzZWFibGUgZmlsZXMuIFVzZWQgYnkgdGhlIGFnZW50LWluc3RydWN0aW9uIGdlbmVyYXRvciBzbyBnZW5lcmF0ZWQgZ3VpZGFuY2VcbiAqIGRlc2NyaWJlcyBvbmx5IHdvcmtmbG93cyB0aGF0IGV4aXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93KHdvcmtmbG93c0RpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgZW50cmllczogZnMuRGlyZW50W107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENhc2UtaW5zZW5zaXRpdmUgb3duZXIvcmVwb3NpdG9yeSAoR2l0SHViIHRyZWF0cyB0aGVtIHNvKSwgY2FzZS1zZW5zaXRpdmUgcGF0aC9yZWYg4oCUIG1hdGNoaW5nXG4gIC8vIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwsIHVzZWQgZm9yIHRoZSB1bnBhcnNlYWJsZS1ZQU1MIHJhdy10ZXh0IGZhbGxiYWNrIG9ubHkuXG4gIGNvbnN0IGRlcGxveUNhbGxQYXR0ZXJuID0gL1teL10rXFwvcmV1c2FibGUtd29ya2Zsb3dzXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvZGVwbG95XFwueWE/bWxAL2l1O1xuICBjb25zdCBjYWxsc0RlcGxveVdvcmtmbG93ID0gKHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgICBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09ICdkZXBsb3knO1xuICByZXR1cm4gZW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIS9cXC55YT9tbCQvdS50ZXN0KGVudHJ5Lm5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIHJldHVybiB0cnVlO1xuICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c0RpclBhdGgsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh3b3JrZmxvdy5qb2JzKS5zb21lKChqb2IpID0+IGNhbGxzRGVwbG95V29ya2Zsb3coam9iPy51c2VzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGVwbG95Q2FsbFBhdHRlcm4udGVzdChjb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBUaGUgcmV1c2FibGUgd29ya2Zsb3dzIHRoYXQgZGVjbGFyZSBGTk9YX0FHRV9LRVkgYW5kIFZFUkRBQ0NJT19UT0tFTiB1bmRlclxuLy8gb24ud29ya2Zsb3dfY2FsbC5zZWNyZXRzIChzZWUgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzKS4gUGFzc2luZyBlaXRoZXIgc2VjcmV0IHRvIGFueVxuLy8gb3RoZXIgY2FsbGVlIGlzIGEgR2l0SHViIGVycm9yLlxuY29uc3QgaW5zdGFsbENhcGFibGVSZXVzYWJsZVdvcmtmbG93cyA9IG5ldyBTZXQoWydkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0JywgJ3Rlc3QnXSk7XG5jb25zdCByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICAvLyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIHJlYWRzIHdvcmtmbG93IHJ1bnM7IGNhbmNlbF9vdGhlcnMgaXMgZmFsc2UsIHNvIHJlYWQgaXMgZW5vdWdoLlxuICAndGVzdC1ydXN0JzogeyBhY3Rpb25zOiAncmVhZCcsIGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgJ3NlbWFudGljLXByJzogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3dyaXRlJyB9LFxufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIC8vIGBzZWNyZXRzOiBpbmhlcml0YCAocGFyc2VkIGJ5IGpzLXlhbWwgYXMgYSBwbGFpbiBzdHJpbmcpIGFscmVhZHkgZm9yd2FyZHMgZXZlcnkgY2FsbGVyIHNlY3JldFxuICAvLyBpbmNsdWRpbmcgdGhlIG9uZXMgaW5qZWN0ZWQgYmVsb3csIHNvIHByZXNlcnZlIGl0IHVudG91Y2hlZCDigJQgcHJvcGVydHkgYXNzaWdubWVudHMgb24gdGhlXG4gIC8vIHN0cmluZyB3b3VsZCB0aHJvdy4gQ2F2ZWF0OiBgaW5oZXJpdGAgZm9yd2FyZHMgc2VjcmV0cyB1bmRlciB0aGVpciBleGlzdGluZyBOQU1FUywgc28gaXQgY2FuXG4gIC8vIG5ldmVyIGZlZWQgUFVCTElDX0ZOT1hfQUdFX0tFWSBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVk7IGEgaGFuZC13cml0dGVuXG4gIC8vIGluaGVyaXQgY2FsbGVyIGluIGEgUFVCTElDIGZub3ggcmVwb3NpdG9yeSBtdXN0IGJlIGNvbnZlcnRlZCB0byBhbiBleHBsaWNpdCBtYXBwaW5nIG1hbnVhbGx5XG4gIC8vICh3YmZ5IG5ldmVyIGdlbmVyYXRlcyB0aGUgaW5oZXJpdCBmb3JtLCBhbmQgaGFuZC13cml0dGVuIGRldmlhdGlvbnMgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbiAgLy8gcmVwb3NpdG9yeSBieSBwb2xpY3kpLlxuICBjb25zdCBzZWNyZXRzID0gam9iLnNlY3JldHMgPT09ICdpbmhlcml0JyA/IHVuZGVmaW5lZCA6IChqb2Iuc2VjcmV0cyA9IGpvYi5zZWNyZXRzID8/IHt9KTtcblxuICBpZiAoc2VjcmV0cyAmJiAoa2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICdyZWxlYXNlJykpIHtcbiAgICBzZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBmbm94LnRvbWwgY2FycmllcyBhZ2UtZW5jcnlwdGVkIGFwcCBzZWNyZXRzOyBDSSBkZWNyeXB0cyB0aGVtIHdpdGggdGhlIEZOT1hfQUdFX0tFWSAob3IsIGZvclxuICAvLyBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuICAvLyBLZXkgdGhlIGluamVjdGlvbiBvbiB0aGUgKmNhbGxlZCogcmV1c2FibGUgd29ya2Zsb3csIG5vdCB0aGUgY2FsbGVyJ3MgZmlsZW5hbWU6IGNhbGxlcnMgbWF5IGhhdmVcbiAgLy8gYXJiaXRyYXJ5IG5hbWVzIChlLmcuIHNjaGVkdWxlZCBydW4tc2NyaXB0IGNhbGxlcnMpLCBhbmQgR2l0SHViIHJlamVjdHMgcGFzc2luZyBhIHNlY3JldCB0aGF0IHRoZVxuICAvLyBjYWxsZWUgZG9lcyBub3QgZGVjbGFyZS5cbiAgLy8gT25seSBhbiBAbWFpbiBjYWxsZWUgaXMga25vd24gdG8gZm9sbG93IHRoZSBjdXJyZW50IHNlY3JldCBjb250cmFjdDogYSB3b3JrZmxvdyBwaW5uZWQgdG8gYW5cbiAgLy8gb2xkZXIgdGFnIG9yIFNIQSBtYXkgc3RpbGwgZGVjbGFyZSBOUE1fVE9LRU4gKGFuZCBub3QgVkVSREFDQ0lPX1RPS0VOKSwgYW5kIEdpdEh1YiByZWplY3RzIGFcbiAgLy8gY2FsbGVyIHdob3NlIHNlY3JldHMgZG8gbm90IG1hdGNoIHRoZSBzZWxlY3RlZCByZXZpc2lvbidzIGRlY2xhcmF0aW9ucywgc28gcGlubmVkIGNhbGxlcnMga2VlcFxuICAvLyB0aGVpciBzZWNyZXRzIHVudG91Y2hlZC5cbiAgY29uc3Qgb3JnV29ya2Zsb3dDYWxsID0gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcyk7XG4gIGNvbnN0IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPSBvcmdXb3JrZmxvd0NhbGw/LnJlZiA9PT0gJ21haW4nID8gb3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVxdWlyZWRQZXJtaXNzaW9ucyA9IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPyByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnNbY2FsbGVkUmV1c2FibGVXb3JrZmxvd10gOiB1bmRlZmluZWQ7XG4gIGlmIChyZXF1aXJlZFBlcm1pc3Npb25zKSBqb2IucGVybWlzc2lvbnMgPSB7IC4uLnJlcXVpcmVkUGVybWlzc2lvbnMgfTtcbiAgaWYgKHNlY3JldHMgJiYgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyAmJiBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzLmhhcyhjYWxsZWRSZXVzYWJsZVdvcmtmbG93KSkge1xuICAgIC8vIFRoZSBjYWxsZWUgcm91dGVzIHB1YmxpYyAoZGVmYXVsdC1yZWdpc3RyeSkgaW5zdGFsbHMgdGhyb3VnaCB0aGUgVGFrdW1pIEd1YXJkXG4gICAgLy8gbWFsaWNpb3VzLXBhY2thZ2UtYmxvY2tpbmcgcHJveHkgd2hlbiB0aGlzIHRva2VuIHJlc29sdmVzOyBhbiB1bnNldCBvcmdhbml6YXRpb24gc2VjcmV0XG4gICAgLy8gZXhwYW5kcyB0byAnJyBhbmQgdGhlIGNhbGxlZSB0cmVhdHMgdGhhdCBhcyBcImZlYXR1cmUgb2ZmXCIsIHNvIHBhc3NpbmcgaXQgaXMgYWx3YXlzIHNhZmUuXG4gICAgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gPSAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JztcbiAgICAvLyBUaGUgY2FsbGVlIGdlbmVyYXRlcyB0aGUgd29ya3NwYWNlIC5ucG1yYyBmb3IgQHdpbGxib29zdGVyLXByaXZhdGUvKiBmcm9tIFZFUkRBQ0NJT19UT0tFTlxuICAgIC8vIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4gT25seSByZXBvc2l0b3JpZXMgdGhhdCBhY3R1YWxseSByZXNvbHZlIHByaXZhdGUgcGFja2FnZXNcbiAgICAvLyAob3IgcHVibGlzaCB0byBWZXJkYWNjaW8pIGdldCB0aGUgcGFzcy10aHJvdWdoOiBldmVyeXdoZXJlIGVsc2UgdGhlIGNyZWRlbnRpYWwgd291bGQgZmxvd1xuICAgIC8vIGludG8gQ0kgcnVucyB0aGF0IG5ldmVyIHVzZSBpdCwgc28gdGhlIGxpbmUgaXMgcmVtb3ZlZCBpbnN0ZWFkLiBUaGUgR2l0SHViIHNlY3JldCBpdHNlbGYgaXNcbiAgICAvLyBhbHdheXMgcmVnaXN0ZXJlZCBtYW51YWxseSBhbmQgc3RheXMgcmVnaXN0ZXJlZCBlaXRoZXIgd2F5LlxuICAgIGlmIChyZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoY29uZmlnKSkge1xuICAgICAgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gPSAnJHt7IHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOIH19JztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIFB1YmxpYyByZXBvc2l0b3JpZXMgY29tbWl0IHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzLCBzbyB0aGV5IGRlY3J5cHQgd2l0aCBhIGRlZGljYXRlZFxuICAgICAgLy8gQ0kgaWRlbnRpdHkgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQpIGluc3RlYWQgb2YgdGhlIG9yZy1pbnRlcm5hbFxuICAgICAgLy8gb25lOyB0aGUgY2FsbGVlIHN0aWxsIHJlY2VpdmVzIGl0IHVuZGVyIGl0cyBkZWNsYXJlZCBGTk9YX0FHRV9LRVkgbmFtZS4gV2hlbiBubyBDSVxuICAgICAgLy8gaWRlbnRpdHkgcmVzb2x2ZXMgKHNlZSBmbm94QWdlS2V5TWFwcGluZyksIGxlYXZlIGFueSBleGlzdGluZyBtYXBwaW5nIHVudG91Y2hlZCBhbmQgYWRkXG4gICAgICAvLyBub25lOiBjcmVhdGluZyBvciByZXdyaXRpbmcgb25lIG9uIGluY29tcGxldGUgaW5mb3JtYXRpb24gd291bGQgbWFwIGEgcG9zc2libHktcHVibGljXG4gICAgICAvLyByZXBvc2l0b3J5IHRvIHRoZSB3cm9uZyBpZGVudGl0eSwgYW5kIGEgZm5veCByZWNpcGllbnQgc3luYyBmYWlsdXJlIGRvZXMgbm90IHN0b3AgdGhpc1xuICAgICAgLy8gZ2VuZXJhdG9yIGZyb20gd3JpdGluZyBmaWxlcyDigJQgdGhlIGZhaWxlZCBydW4ncyByZXJ1biBmaWxscyB0aGUgbWFwcGluZyBpbi5cbiAgICAgIGNvbnN0IG1hcHBpbmcgPSBmbm94QWdlS2V5TWFwcGluZyhjb25maWcpO1xuICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgc2VjcmV0cy5GTk9YX0FHRV9LRVkgPSBtYXBwaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcpIHtcbiAgICBjb25zdCBbcnVzdERpclBhdGhdID0gY29uZmlnLmNhcmdvVG9tbERpclBhdGhzO1xuICAgIGlmIChydXN0RGlyUGF0aCAmJiBydXN0RGlyUGF0aCAhPT0gJy4nKSB7XG4gICAgICBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeSA9IHJ1c3REaXJQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLndpdGgud29ya2luZ19kaXJlY3Rvcnk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjb25zdHJ1Y3QgZnJvbSB0aGUgcGFyc2VkIGNhbGwgc28gYSBkaWZmZXJlbnRseSBjYXNlZCBvd25lciAoR2l0SHViIGlzIGNhc2UtaW5zZW5zaXRpdmVcbiAgLy8gdGhlcmUpIGlzIGFsc28gbm9ybWFsaXplZCB0byB0aGUgcmVwb3NpdG9yeSdzIG93biBvcmdhbml6YXRpb24gLyBtaXJyb3IuXG4gIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH0gZWxzZSBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3RlckxhYi9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEFuIGV4aXN0aW5nIGdpdGh1Yl9ob3N0ZWRfcnVubmVyIG9uIGEgUFJJVkFURSByZXBvc2l0b3J5IGlzIHByZXNlcnZlZCBvbiBwdXJwb3NlOiB0aGUgaW5wdXRcbiAgICAvLyBleGlzdHMgcHJlY2lzZWx5IHNvIGEgcHJpdmF0ZSBjYWxsZXIgY2FuIG9wdCBpbnRvIEdpdEh1Yi1ob3N0ZWQgcnVubmVycywgYW5kIHdiZnkgbXVzdCBub3RcbiAgICAvLyByZXZlcnQgdGhhdCBtYW51YWwgY2hvaWNlIChvbmx5IHRoZSBvdGhlciBraW5kcyBiZWxvdyBuZXZlciB0YWtlIHRoZSBpbnB1dCkuXG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoc2VjcmV0cykge1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoc2VjcmV0cyk7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0IGV4cHJlc3Npb24gdGhlIGNhbGxlciBtYXBzIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSwgb3IgdW5kZWZpbmVkXG4gKiB3aGVuIHRoZSByZXBvc2l0b3J5IHN0YXRlIGRvZXMgbm90IGlkZW50aWZ5IGEgdXNhYmxlIENJIGlkZW50aXR5IOKAlCBhbiB1bmtub3duIHZpc2liaWxpdHksIGFcbiAqIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzIChkZXJpdmluZyBmcm9tIHRoZSBzYW1lIHByaW5jaXBhbCByb3N0ZXIgYXMgdGhlIHJlY2lwaWVudCBzeW5jXG4gKiBrZWVwcyB0aGUgdHdvIGZyb20gZXZlciBkaXNhZ3JlZWluZyksIG9yIGEgZmFpbGVkIGZub3ggcmVjaXBpZW50IHN5bmMsIHdob3NlIGNpcGhlcnRleHRzIG1heVxuICogc3RpbGwgdGFyZ2V0IHRoZSBwcmV2aW91cyBpZGVudGl0eS4gVGhlIGNhbGxlciBtdXN0IHRoZW4gcHJlc2VydmUgYW55IGV4aXN0aW5nIG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCBoYXNGbm94U3luY0ZhaWxlZCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzZWNyZXROYW1lID0gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoY29uZmlnKTtcbiAgcmV0dXJuIHNlY3JldE5hbWUgJiYgYFxcJHt7IHNlY3JldHMuJHtzZWNyZXROYW1lfSB9fWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSBwZXJtaXNzaW9ucyBvYmplY3QgZW1wdGllZCBieSB0aGUgcGVyLWtpbmQgZGVsZXRpb25zIChlLmcuIGFuIGV4aXN0aW5nIHRlc3QtcnVzdCBjYWxsZXJcbiAgLy8gd2hvc2Ugb25seSBlbnRyeSB3YXMgYGFjdGlvbnNgKSBtdXN0IGJlIGRyb3BwZWQgZW50aXJlbHk6IGBwZXJtaXNzaW9uczoge31gIHN0cmlwcyBFVkVSWVxuICAvLyB0b2tlbiBwZXJtaXNzaW9uIGZyb20gdGhlIHdvcmtmbG93LCB1bmxpa2UgdGhlIGFic2VudCBrZXkgd2hpY2gga2VlcHMgdGhlIGRlZmF1bHRzLlxuICBpZiAobmV3U2V0dGluZ3MucGVybWlzc2lvbnMgJiYgT2JqZWN0LmtleXMobmV3U2V0dGluZ3MucGVybWlzc2lvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucztcbiAgfVxuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgY29udGVudFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgICAgLy8gVGhlIHdvcmQgYm91bmRhcnkgYW5kIHRyYWlsaW5nLXdoaXRlc3BhY2UgZ3VhcmQga2VlcCB3b3JkcyBtZXJlbHkgZW5kaW5nIGluIHRoZVxuICAgICAgLy8gYWJicmV2aWF0aW9uIGxldHRlcnMgKGUuZy4gXCJjb29raWUuXCIsIFwibGVnLlwiKSBpbnRhY3QuXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmNmLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiZWdcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmUuZy4nKVxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmllXFwuKD89XFxzfCQpL2csICckMS8vJDJpLmUuJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIC8vIFRoZSBkb3QgbXVzdCBiZSBlc2NhcGVkOiBhbiB1bmVzY2FwZWQgYC5gIG1hdGNoZXMgQU5ZIGNoYXJhY3Rlciwgc28gYGxlZ2l0YCBsb3N0IGl0cyBgbGAgYW5kIGBlYC5cbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvXFwuZ2l0JC91LCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgcmV0dXJuIHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDA0O1xufVxuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgLy8gR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBzbyBjcmVkZW50aWFsIHNlbGVjdGlvbiAoYW5kIHRoZSBjYWNoZSBrZXkpIG11c3RcbiAgLy8gbm90IGRlcGVuZCBvbiBob3cgYSByZW1vdGUgVVJMIGhhcHBlbnMgdG8gc3BlbGwgdGhlIG9yZ2FuaXphdGlvbi5cbiAgY29uc3Qga2V5ID0gb3duZXI/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvbiBwdXJwb3NlOiBhIG5vbmNhbm9uaWNhbGx5IGNhc2VkIHJlbW90ZSAoZS5nLiBnaXRodWIuY29tL3dpbGxib29zdGVybGFiL+KApilcbiAgLy8gbXVzdCBzdGlsbCBzZWxlY3QgdGhlIG9yZ2FuaXphdGlvbidzIG93biBQQVQg4oCUIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgZ2VuZXJpYyBicmFuY2ggd291bGRcbiAgLy8gcHJlZmVyIHRoZSBPVEhFUiBvcmdhbml6YXRpb24ncyBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHRoaXMgb3JnYW5pemF0aW9uJ3MgcHJpdmF0ZVxuICAvLyByZXBvc2l0b3JpZXMuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPd25lciA9IG93bmVyPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRPd25lciA9PT0gJ3dpbGxib29zdGVybGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBhcHBseUVkaXRzLCBjcmVhdGVTY2FubmVyLCBmaW5kTm9kZUF0TG9jYXRpb24sIG1vZGlmeSwgcGFyc2UgYXMgcGFyc2VKc29uYywgcGFyc2VUcmVlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuLy8ganNvbmMtcGFyc2VyIGRlY2xhcmVzIFN5bnRheEtpbmQvU2NhbkVycm9yIGFzIGFtYmllbnQgY29uc3QgZW51bXMsIHdoaWNoIGNhbm5vdCBiZSBpbXBvcnRlZFxuLy8gdW5kZXIgdmVyYmF0aW1Nb2R1bGVTeW50YXg7IG1pcnJvciB0aGUgbmVlZGVkIG1lbWJlciB2YWx1ZXMgbG9jYWxseS5cbmNvbnN0IHN5bnRheEtpbmQgPSB7IGxpbmVDb21tZW50VHJpdmlhOiAxMiwgYmxvY2tDb21tZW50VHJpdmlhOiAxMywgbGluZUJyZWFrVHJpdmlhOiAxNCwgdHJpdmlhOiAxNSwgZW9mOiAxNyB9O1xuY29uc3Qgc2NhbkVycm9yTm9uZSA9IDA7XG5cbmV4cG9ydCBjb25zdCBqc29uY1V0aWwgPSB7XG4gIC8qKlxuICAgKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGhvbGRzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsIOKAlCBvbmx5IHdoaXRlc3BhY2UsIGNvbXBsZXRlIGNvbW1lbnRzLFxuICAgKiBhbmQvb3IgYSBCT00uIHRzYyB0cmVhdHMgc3VjaCBhIHRzY29uZmlnLmpzb24gYXMgYW4gZW1wdHkgY29uZmlnLCBzbyBnZW5lcmF0b3JzIHNob3VsZCB0cmVhdFxuICAgKiBpdCBsaWtlIGEgbWlzc2luZyBmaWxlIChhbmQgZ2VuZXJhdGUgZGVmYXVsdHMpIGluc3RlYWQgb2YgcmVmdXNpbmcgdG8gbWFuYWdlIGl0LiBMZXhpY2FsbHlcbiAgICogYnJva2VuIHRyaXZpYSAoZS5nLiBhbiB1bnRlcm1pbmF0ZWQgYmxvY2sgY29tbWVudCkgaXMgTk9UIHRyaXZpYS1vbmx5OiB0aGUgZmlsZSBtdXN0IGJlIGxlZnRcbiAgICogdW50b3VjaGVkIHJhdGhlciB0aGFuIG92ZXJ3cml0dGVuIHdpdGggZGVmYXVsdHMuXG4gICAqL1xuICBpc1RyaXZpYU9ubHkoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUgfHxcbiAgICAgICAgKGtpbmQgIT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQudHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC5saW5lQnJlYWtUcml2aWEpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIFBhcnNlcyBhIEpTT05DIChKU09OIHdpdGggY29tbWVudHMpIG9iamVjdCBmcm9tIGNvbmZpZyBmaWxlcyBzdWNoIGFzIHRzY29uZmlnLmpzb24sXG4gICAqIHB5cmlnaHRjb25maWcuanNvbiwgcmVub3ZhdGUuanNvbiwgLnZzY29kZS9zZXR0aW5ncy5qc29uLCBhbmQgd3JhbmdsZXIuanNvbmMuXG4gICAqXG4gICAqIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgcmV0dXJucyBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsIHdoaWNoIG11c3RcbiAgICogbm90IGJlIHRyZWF0ZWQgYXMgdGhlIGZpbGUncyBjb25maWd1cmF0aW9uOyByZWplY3QgYW55IHBhcnNlIGVycm9yIGluc3RlYWQuIEEgbGVhZGluZyBCT00gaXNcbiAgICogc3RyaXBwZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGFjY2VwdHMgQk9NJ2QgY29uZmlnIGZpbGVzIHdoaWxlIGpzb25jLXBhcnNlciByZXBvcnRzIHRoZSBCT00gYXNcbiAgICogYSBwYXJzZSBlcnJvci5cbiAgICovXG4gIHBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUIGV4dGVuZHMgb2JqZWN0Pihjb250ZW50OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXJzZUVycm9yczogUGFyc2VFcnJvcltdID0gW107XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUpzb25jKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJyksIHBhcnNlRXJyb3JzLCB7IGFsbG93VHJhaWxpbmdDb21tYTogdHJ1ZSB9KSBhc1xuICAgICAgfCBUXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBjYXJyaWVzIGF0IGxlYXN0IG9uZSBjb21tZW50LCBpLmUuIGNvbnRlbnQgSlNPTi5zdHJpbmdpZnkgd291bGQgZHJvcC4gKi9cbiAgY29udGFpbnNDb21tZW50KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICAvLyBBIGxleGljYWwgZXJyb3IgbWVhbnMgdGhlIHJlbWFpbmluZyB0b2tlbnMgYXJlIHVucmVsaWFibGU7IHJlcG9ydCBubyBjb21tZW50IHJhdGhlciB0aGFuXG4gICAgICAvLyBndWVzc2luZywgc2luY2UgY2FsbGVycyBvbmx5IHVzZSB0aGlzIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHdhcm4gYWJvdXQgZHJvcHBlZCBjb21tZW50cy5cbiAgICAgIGlmICgoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGtpbmQgPT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgfHwga2luZCA9PT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGBzZXR0aW5nc2AgaW50byBgb2xkQ29udGVudGAsIGVkaXRpbmcgb25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzXG4gICAqIGNoYW5nZWQgc28gdGhlIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIG9mIGFuIGV4aXN0aW5nIGZpbGUgc3Vydml2ZS4gQ2FsbGVycyBuZXZlciBkcm9wXG4gICAqIHByb3BlcnRpZXMgKGdlbmVyYXRlZCBzZXR0aW5ncyBhcmUgbWVyZ2VkIE9OIFRPUCBvZiB0aGUgZXhpc3Rpbmcgb25lcyksIHNvIHJlbW92YWxzIGFyZSBub3RcbiAgICogaGFuZGxlZDogYSBwcm9wZXJ0eSBtaXNzaW5nIGZyb20gYHNldHRpbmdzYCBpcyBsZWZ0IHVudG91Y2hlZCByYXRoZXIgdGhhbiBkZWxldGVkLlxuICAgKlxuICAgKiBUcml2aWEtb25seSBjb250ZW50IGtlZXBzIGl0cyBjb21tZW50cyBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW5cbiAgICogYmVpbmcgcmVwbGFjZWQgb3V0cmlnaHQgb3IgcnVuIHRocm91Z2ggbW9kaWZ5KCkgKHdoaWNoIHdvdWxkIG1vdmUgdGhlIG9iamVjdCBpbiBmcm9udCBvZiB0aGVtKS5cbiAgICovXG4gIHN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgb2xkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB7IGNvbnRlbnQ6IHN0cmluZzsga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSB9IHtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSwga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2xkQ29udGVudCk7XG4gICAgLy8gRHJvcCBhIGxlYWRpbmcgQk9NOiBtb2RpZnkoKSBpbnNlcnRzIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IEJFRk9SRSBhbnkgbGVhZGluZyB0cml2aWEsIHdoaWNoXG4gICAgLy8gd291bGQgbGVhdmUgdGhlIEJPTSBzdHJhbmRlZCBtaWQtZmlsZSB3aGVyZSBpdCBpcyBhIHN5bnRheCBlcnJvciByYXRoZXIgdGhhbiBhbiBpZ25vcmVkIG1hcmsuXG4gICAgbGV0IGNvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpO1xuICAgIGlmIChqc29uY1V0aWwuaXNUcml2aWFPbmx5KGNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBjb250ZW50LnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IGAke2hlYWRlciA/IGhlYWRlciArICdcXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKX1gLFxuICAgICAgICBrZXlzTG9zaW5nQ29tbWVudHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbW9kaWZ5T3B0aW9ucyA9IHsgZm9ybWF0dGluZ09wdGlvbnM6IGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQpIH07XG4gICAgY29uc3Qga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5ld0VudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncykpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkU2V0dGluZ3M/LltrZXldO1xuICAgICAgLy8gQ29tcGFyZSBzZXJpYWxpemVkIGZvcm1zIHNvIGRlZXAtZXF1YWwgdmFsdWVzIChlLmcuIGEgcmUtbWVyZ2VkIGBleHRlbmRzYCBhcnJheSkgZG8gbm90XG4gICAgICAvLyByZXdyaXRlIHRoZSBwcm9wZXJ0eSBhbmQgcmVmbG93IGl0cyBmb3JtYXR0aW5nLlxuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2luZyBhIHdob2xlIGFycmF5IHdvdWxkIGRpc2NhcmQgdGhlIGNvbW1lbnRzIGJldHdlZW4gaXRzIGVsZW1lbnRzLCBzbyBncm93IGl0IHdpdGhcbiAgICAgIC8vIHBlci1lbGVtZW50IGluc2VydGlvbnMgd2hlbmV2ZXIgdGhlIG5ldyB2YWx1ZSBvbmx5IGFkZHMgdG8gaXQuXG4gICAgICBjb25zdCBpbnNlcnRpb25zID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZSwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBpbnNlcnRpb24gb2YgaW5zZXJ0aW9ucyA/PyBbXSkge1xuICAgICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIG1vZGlmeShjb250ZW50LCBba2V5LCBpbnNlcnRpb24uaW5kZXhdLCBpbnNlcnRpb24udmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgaXNBcnJheUluc2VydGlvbjogdHJ1ZSB9KVxuICAgICAgICApO1xuICAgICAgICBjb250ZW50ID0gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50LCBrZXksIGluc2VydGlvbi5pbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zZXJ0aW9ucykgY29udGludWU7XG4gICAgICAvLyBSZXdyaXRpbmcgdGhlIHdob2xlIHZhbHVlIGlzIHRoZSBvbmx5IG9wdGlvbiBsZWZ0ICh0aGUgbmV3IG9uZSBkcm9wcyBvciByZW9yZGVycyBlbGVtZW50cyksXG4gICAgICAvLyBhbmQgaXQgdGFrZXMgYW55IGNvbW1lbnQgbmVzdGVkIGluc2lkZSBpdCBhbG9uZy4gUmVwb3J0IHRoYXQgcmF0aGVyIHRoYW4gbG9zaW5nIGl0IHF1aWV0bHkuXG4gICAgICBjb25zdCByZXBsYWNlZFRleHQgPSB2YWx1ZVRleHRPZihjb250ZW50LCBrZXkpO1xuICAgICAgaWYgKHJlcGxhY2VkVGV4dCAhPT0gdW5kZWZpbmVkICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQocmVwbGFjZWRUZXh0KSkga2V5c0xvc2luZ0NvbW1lbnRzLnB1c2goa2V5KTtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIG1vZGlmeU9wdGlvbnMpKTtcbiAgICB9XG4gICAgLy8gUHJlcGVuZCByYXRoZXIgdGhhbiBhcHBlbmQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmV3OiBhcHBlbmRpbmcgZGV0YWNoZXMgYSB0cmFpbGluZ1xuICAgIC8vIHNhbWUtbGluZSBjb21tZW50IGZyb20gdGhlIGxhc3QgcHJvcGVydHksIGxlYXZpbmcgaXQgdG8gZGVzY3JpYmUgdGhlIGdlbmVyYXRlZCB2YWx1ZVxuICAgIC8vIGluc3RlYWQuIEluc2VydGluZyBpbiByZXZlcnNlIGtlZXBzIHRoZSBvcmRlciB0aGUgc2V0dGluZ3MgZGVjbGFyZSB0aGVtIGluLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMudG9SZXZlcnNlZCgpKSB7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGdldEluc2VydGlvbkluZGV4OiAoKSA9PiAwIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH07XG4gIH0sXG59O1xuXG4vKiogUmV0dXJucyB0aGUgc291cmNlIHRleHQgb2YgYSB0b3AtbGV2ZWwgcHJvcGVydHkncyB2YWx1ZSwgY29tbWVudHMgYW5kIGFsbC4gKi9cbmZ1bmN0aW9uIHZhbHVlVGV4dE9mKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBub2RlID0gcm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pO1xuICByZXR1cm4gbm9kZSAmJiBjb250ZW50LnNsaWNlKG5vZGUub2Zmc2V0LCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoKTtcbn1cblxuLy8gVGhlIHdob2xlIHNhbWUtbGluZSBjb21tZW50IHNlcXVlbmNlLCBub3QganVzdCB0aGUgZmlyc3Qgb25lOiBhIGxpbmUgY29tbWVudCBlbmRzIGl0IChpdCBydW5zIHRvXG4vLyB0aGUgbmV3bGluZSksIGJ1dCBhbnkgbnVtYmVyIG9mIGJsb2NrIGNvbW1lbnRzIGNhbiBwcmVjZWRlIGl0LCBhbmQgbW92aW5nIG9ubHkgdGhlIGZpcnN0IHdvdWxkXG4vLyBsZWF2ZSB0aGUgcmVzdCBkZXNjcmliaW5nIHRoZSB3cm9uZyBlbGVtZW50LlxuY29uc3QgdHJhaWxpbmdDb21tZW50UGF0dGVybiA9IC9eKD86W15cXFNcXG5dKlxcL1xcKltcXFNcXHNdKj9cXCpcXC8pKig/OlteXFxTXFxuXSpcXC9cXC9bXlxcbl0qKT8vdTtcblxuLyoqXG4gKiBSZWF0dGFjaGVzIGEgc2FtZS1saW5lIGNvbW1lbnQgdG8gdGhlIGVsZW1lbnQgaXQgZGVzY3JpYmVzLiBJbnNlcnRpbmcgaW50byBhbiBhcnJheSBwbGFjZXMgdGhlXG4gKiBuZXcgZWxlbWVudCBCRUZPUkUgdGhlIHRyaXZpYSB0aGF0IGZvbGxvd3MgaXRzIHByZWRlY2Vzc29yLCBzbyBhcHBlbmRpbmcgYWZ0ZXJcbiAqIGB7IC4uLiB9IC8vIHdoeSB0aGlzIHJ1bGUgZXhpc3RzYCBsZWF2ZXMgdGhhdCBjb21tZW50IGV4cGxhaW5pbmcgdGhlIGdlbmVyYXRlZCBlbGVtZW50IGluc3RlYWQuXG4gKiBBIGZyZXNobHkgc2VyaWFsaXplZCBlbGVtZW50IG5ldmVyIGNhcnJpZXMgYSBjb21tZW50IG9mIGl0cyBvd24sIHNvIGFueXRoaW5nIHRyYWlsaW5nIHRoZVxuICogaW5zZXJ0aW9uIGJlbG9uZ2VkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBpbnNlcnRlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaW5zZXJ0ZWRJbmRleCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IGVsZW1lbnRzID0gKHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKSk/LmNoaWxkcmVuO1xuICBjb25zdCBpbnNlcnRlZCA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleF07XG4gIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4IC0gMV07XG4gIGlmICghaW5zZXJ0ZWQgfHwgIXByZXZpb3VzKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5zZXJ0ZWRFbmQgPSBpbnNlcnRlZC5vZmZzZXQgKyBpbnNlcnRlZC5sZW5ndGg7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuLmV4ZWMoY29udGVudC5zbGljZShpbnNlcnRlZEVuZCkpPy5bMF07XG4gIGlmICghY29tbWVudCkgcmV0dXJuIGNvbnRlbnQ7XG4gIC8vIExhbmQgdGhlIGNvbW1lbnQgYWZ0ZXIgdGhlIHNlcGFyYXRpbmcgY29tbWEgc28gdGhlIGVsZW1lbnQga2VlcHMgaXRzIG93biBsaW5lIGludGFjdC5cbiAgY29uc3QgcHJldmlvdXNFbmQgPSBwcmV2aW91cy5vZmZzZXQgKyBwcmV2aW91cy5sZW5ndGg7XG4gIGNvbnN0IHJlc3RvcmVPZmZzZXQgPSBwcmV2aW91c0VuZCArICgvXlxccyosL3UuZXhlYyhjb250ZW50LnNsaWNlKHByZXZpb3VzRW5kKSk/LlswXS5sZW5ndGggPz8gMCk7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCByZXN0b3JlT2Zmc2V0KSArXG4gICAgY29tbWVudCArXG4gICAgY29udGVudC5zbGljZShyZXN0b3JlT2Zmc2V0LCBpbnNlcnRlZEVuZCkgK1xuICAgIGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQgKyBjb21tZW50Lmxlbmd0aClcbiAgKTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBpbmRlbnRhdGlvbiB0aGUgZmlsZSBhbHJlYWR5IHVzZXMsIHNvIGEgc2VtYW50aWMgY2hhbmdlIGRvZXMgbm90IHJlaW5kZW50IHVucmVsYXRlZFxuICogbGluZXMuIFRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgaW5kZW50ZWQgbGluZSwgYmVjYXVzZSBhIGRlY29yYXRlZFxuICogYmxvY2sgY29tbWVudCAoYCAqIC4uLmApIHdvdWxkIG90aGVyd2lzZSBwYXNzIGZvciB0aGUgZmlsZSdzIGluZGVudGF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSB0d29cbiAqIHNwYWNlcyBldmVyeSBnZW5lcmF0ZWQgY29uZmlnIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQ6IHN0cmluZyk6IHsgaW5zZXJ0U3BhY2VzOiBib29sZWFuOyB0YWJTaXplOiBudW1iZXIgfSB7XG4gIGNvbnN0IGZpcnN0UHJvcGVydHkgPSBwYXJzZVRyZWUoY29udGVudCk/LmNoaWxkcmVuPy5bMF07XG4gIGNvbnN0IGluZGVudGF0aW9uID1cbiAgICBmaXJzdFByb3BlcnR5ICYmIGNvbnRlbnQuc2xpY2UoY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpICsgMSwgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpO1xuICBpZiAoIWluZGVudGF0aW9uIHx8ICEvXltcXHQgXSskL3UudGVzdChpbmRlbnRhdGlvbikpIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogMiB9O1xuICBpZiAoaW5kZW50YXRpb24uc3RhcnRzV2l0aCgnXFx0JykpIHJldHVybiB7IGluc2VydFNwYWNlczogZmFsc2UsIHRhYlNpemU6IDEgfTtcbiAgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiBpbmRlbnRhdGlvbi5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBpbnNlcnQgaW50byBgb2xkVmFsdWVgIHRvIHR1cm4gaXQgaW50byBgbmV3VmFsdWVgLCBvciB1bmRlZmluZWQgd2hlblxuICogdGhhdCBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgYG5ld1ZhbHVlYCBkcm9wcyBvciByZW9yZGVycyBhbiBleGlzdGluZyBlbGVtZW50ICh0aGUgY2FsbGVyIG11c3RcbiAqIHRoZW4gcmVwbGFjZSB0aGUgYXJyYXkgd2hvbGVzYWxlKS4gSW5kaWNlcyBhZGRyZXNzIHRoZSBhcnJheSBhcyBpdCBncm93cywgc28gYXBwbHlpbmcgdGhlXG4gKiBpbnNlcnRpb25zIGxlZnQgdG8gcmlnaHQgeWllbGRzIGBuZXdWYWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlOiB1bmtub3duW10sIG5ld1ZhbHVlOiB1bmtub3duW10pOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc2VydGlvbnM6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdID0gW107XG4gIGxldCBvbGRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgW25ld0luZGV4LCBlbGVtZW50XSBvZiBuZXdWYWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAob2xkSW5kZXggPCBvbGRWYWx1ZS5sZW5ndGggJiYgSlNPTi5zdHJpbmdpZnkob2xkVmFsdWVbb2xkSW5kZXhdKSA9PT0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpIHtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaW5zZXJ0aW9ucy5wdXNoKHsgaW5kZXg6IG5ld0luZGV4LCB2YWx1ZTogZWxlbWVudCB9KTtcbiAgfVxuICByZXR1cm4gb2xkSW5kZXggPT09IG9sZFZhbHVlLmxlbmd0aCA/IGluc2VydGlvbnMgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBSZWNvZ25pemVzIHRoZSBtYW5hZ2VkIGB3YiBnZW4tY29kZWAgc2VnbWVudCwgYSBvbmUtbGV2ZWwgcGFja2FnZS1zY3JpcHQgd3JhcHBlciBhcm91bmQgaXQsIGFuZFxuICogY3VzdG9tIHNlZ21lbnRzIHRoYXQgd2JmeSBsZWF2ZXMgYWxvbmUuXG4gKi9cbnR5cGUgU2NyaXB0U2VnbWVudEtpbmQgPSAnY3VzdG9tJyB8ICdnZW5Db2RlJyB8ICdnZW5Db2RlV3JhcHBlcic7XG5cbmNvbnN0IGdlbkNvZGVTZWdtZW50UGF0dGVybiA9IC9eYnVuXFxzK3diXFxzK2dlbi1jb2RlJC91O1xuXG4vLyBBIHJ1bm5lciBkZWxlZ2F0aW5nIHRvIG9uZSBvZiB0aGlzIHBhY2thZ2UncyBvd24gc2NyaXB0cywgZS5nLiBgYnVuIHJ1biBnZW4tdHlwZXNgLlxuY29uc3Qgc2NyaXB0UnVubmVyUGF0dGVybiA9IC9eYnVuXFxzK3J1blxccysoXFxTKykkL3U7XG5cbi8vIEFueXRoaW5nIHdiZnkncyBgJiZgIHNwbGl0IGNhbm5vdCBtb2RlbCAocGlwZXMsIHNlcXVlbmNpbmcsIHJlZGlyZWN0aW9ucywgcXVvdGluZywgc3Vic3RpdHV0aW9ucywgZGlyZWN0b3J5XG4vLyBjaGFuZ2VzKS4gU2NyaXB0cyBjb250YWluaW5nIGl0IGFyZSBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG5jb25zdCB1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybiA9IC9bXFxuO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3U7XG5cbi8qKlxuICogU3BsaXRzIGEgc2NyaXB0IGludG8gYCYmYC1zZXBhcmF0ZWQgc2VnbWVudHMsIG9yIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCB1c2VzIHNoZWxsIHN5bnRheCB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAodW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm47XG4gIHJldHVybiBzY3JpcHRcbiAgICAuc3BsaXQoJyYmJylcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTY3JpcHRTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIGZvbGxvd3NXcmFwcGVyID0gdHJ1ZVxuKTogU2NyaXB0U2VnbWVudEtpbmQge1xuICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgaWYgKGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KG5vcm1hbGl6ZWQpKSByZXR1cm4gJ2dlbkNvZGUnO1xuICAvLyBBIG9uZS1sZXZlbCB3cmFwcGVyIGxvb2t1cCBjb3ZlcnMgYFwicG9zdGluc3RhbGxcIjogXCJidW4gcnVuIGdlbi10eXBlc1wiYCwgdGhlIHNoYXBlIHRoZXNlIHJlcG9zaXRvcmllcyB1c2U7XG4gIC8vIGRlZXBlciBjaGFpbnMgc3RheSBjdXN0b20gc28gd2JmeSBjYW5ub3QgbG9vcCBvbiBhIHNlbGYtcmVmZXJlbnRpYWwgc2NyaXB0LlxuICBjb25zdCBzY3JpcHROYW1lID0gZm9sbG93c1dyYXBwZXIgPyBzY3JpcHRSdW5uZXJQYXR0ZXJuLmV4ZWMobm9ybWFsaXplZCk/LlsxXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiAnY3VzdG9tJztcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHRhcmdldCk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgc3RpbGwgcGVyZm9ybXMgdGhlIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiwgc28gaXQgY291bnRzIGFzIGdlbi1jb2RlOyB0cmVhdGluZyBpdCBhcyBjdXN0b20gd291bGQgYXBwZW5kIGEgc2Vjb25kIGB3YiBnZW4tY29kZWAgYW5kIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuXG4gIGlmIChzZWdtZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIG1hbmFnZWQgZ2VuZXJhdGlvbiBBTkQgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IGlzIHRoZSBpbnN0YWxsLXRpbWUgZW50cnkgcG9pbnQ6IGl0IG11c3QgYmUga2VwdCBhc1xuICAgIC8vIHdyaXR0ZW4uIFJlcGxhY2luZyBpdCB3aXRoIGEgYmFyZSBgd2IgZ2VuLWNvZGVgIHdvdWxkIGRyb3AgdGhvc2Ugc3RlcHM7IGFwcGVuZGluZyBvbmUgd291bGQgcnVuIGV2ZXJ5XG4gICAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICAgIHJldHVybiBzZWdtZW50cz8uc29tZSgoaW5uZXIpID0+IGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KGlubmVyLnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpKSlcbiAgICAgID8gJ2dlbkNvZGVXcmFwcGVyJ1xuICAgICAgOiAnY3VzdG9tJztcbiAgfVxuICByZXR1cm4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnRzWzBdID8/ICcnLCBzY3JpcHRzLCBmYWxzZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZCwgYXJncywgY3dkKVsxXTtcbn1cblxuZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dCA6IHN0ZG91dC50b1N0cmluZygpO1xuICByZXR1cm4gW3Byb2Muc3RhdHVzID8/IDEsIHN0ZG91dFRleHQudHJpbSgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICcuL3V0aWxzL3N0cmluZ1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocywgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMgfSBmcm9tICcuL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIC8vIFdoZXRoZXIgaXNQdWJsaWNSZXBvIGNvbWVzIGZyb20gYW4gYWN0dWFsIEdpdEh1YiBBUEkgcmVzcG9uc2U6IGEgZmFpbGVkIGxvb2t1cCAob2ZmbGluZSxcbiAgLy8gcmF0ZS1saW1pdGVkLCBiYWQgY3JlZGVudGlhbCkgY29sbGFwc2VzIHRvIGlzUHVibGljUmVwbz1mYWxzZSwgd2hpY2ggdmlzaWJpbGl0eS1zZW5zaXRpdmVcbiAgLy8gZ2VuZXJhdG9ycyBtdXN0IG5vdCBtaXN0YWtlIGZvciBhIGNvbmZpcm1lZCBwcml2YXRlIHJlcG9zaXRvcnkuXG4gIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQ2xvdWRmbGFyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZzogYm9vbGVhbjtcbiAgaXNSYWlsd2F5OiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvKiogRGlyZWN0b3JpZXMgY29udGFpbmluZyBDYXJnby50b21sIChyZWxhdGl2ZSB0byBkaXJQYXRoLCByb290LW1vc3QgZmlyc3QpLiBFbXB0eSBpZiB0aGUgcmVwbyBoYXMgbm8gUnVzdCBjb2RlLiAqL1xuICBjYXJnb1RvbWxEaXJQYXRoczogc3RyaW5nW107XG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblV2TG9jazogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBQeXRob24gbG9ja2ZpbGUgKHBvZXRyeS5sb2NrIC8gdXYubG9jaykgZXhpc3RzIGFueXdoZXJlIGluIHRoZSBkaXJlY3RvcnkgdHJlZS4gKi9cbiAgZG9lc0NvbnRhaW5QeXRob25Mb2NrQW55d2hlcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICAvKiogV2hldGhlciBhIE1hdmVuIHBvbS54bWwgZXhpc3RzIGFueXdoZXJlIGluIHRoZSBkaXJlY3RvcnkgdHJlZS4gKi9cbiAgZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBTbGlkZXYgZGVjayAoYCouc2xpZGV2Lm1kYCkgZXhpc3RzIGFueXdoZXJlIGluIHRoZSBkaXJlY3RvcnkgdHJlZS4gKi9cbiAgZG9lc0NvbnRhaW5TbGlkZXZNZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZzogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0UnVudGltZTogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc2xpZGV2OiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB0YXVyaTogYm9vbGVhbjtcbiAgICB2aW5leHQ6IGJvb2xlYW47XG4gICAgdml0ZTogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgICBjaGFrcmE6IGJvb2xlYW47XG4gICAgZHJpenpsZTogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEFuIGV4cGxpY2l0IGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHBsdWdpbiBlbnRyeSBwdWJsaXNoZXMgdGhlIHJvb3QgbWFuaWZlc3QgaXRzZWxmXG4gICAgICogKG5vIHBrZ1Jvb3QgcmVkaXJlY3Rpb24gYW5kIG5wbVB1Ymxpc2ggbm90IGRpc2FibGVkKS5cbiAgICAgKi9cbiAgICBucG1QdWJsaXNoZXNSb290OiBib29sZWFuO1xuICB9O1xuICBtaXNlVGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBUaGUgc2VtYW50aWMtcmVsZWFzZSBjb25maWcgZmlsZXMgd2JmeSBleHBlY3RzLCBpbiBjb3NtaWNvbmZpZydzIHJlc29sdXRpb24gb3JkZXIgKHRoZSBsZWFkaW5nXG4gKiBwYWNrYWdlLmpzb24gZW50cnkgaXMgY2hlY2tlZCBieSB0aGUgY2FsbGVyKS4gd2JmeSBnZW5lcmF0ZXMgLnJlbGVhc2VyYy5qc29uOyB0aGUgb3RoZXIgc3BlbGxpbmdzXG4gKiBhcmUgbGlzdGVkIG9ubHkgdG8gZGV0ZWN0IGEgaGFuZC13cml0dGVuIGNvbmZpZywgd2hvc2UgZm9ybWF0IEpTT04ucGFyc2UgY2Fubm90IHJlYWQgYW5kIHdob3NlXG4gKiBwbHVnaW4gbGlzdCBpcyB0aGVyZWZvcmUgc3RhdGljYWxseSB1bmluc3BlY3RhYmxlLlxuICovXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXM6IHsgZmlsZU5hbWU6IHN0cmluZzsganNvblBhcnNlYWJsZTogYm9vbGVhbiB9W10gPSBbXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy5qc29uJywganNvblBhcnNlYWJsZTogdHJ1ZSB9LFxuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYy55YW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueW1sJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuICB7IGZpbGVOYW1lOiAncmVsZWFzZS5jb25maWcuanMnLCBqc29uUGFyc2VhYmxlOiBmYWxzZSB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgaXNSb290PzogYm9vbGVhbiB9XG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXQgPSBmYWxzZTtcbiAgICBsZXQgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgPSBmYWxzZTtcbiAgICAvLyBUaGUgRklSU1QgZXhpc3Rpbmcgc2VhcmNoIHBsYWNlIHdpbnMgKGNvc21pY29uZmlnIHNob3J0LWNpcmN1aXRzKSwgc28gYSBKUy9ZQU1ML1RTIGNvbmZpZ1xuICAgIC8vIG9yIGFuIGBleHRlbmRzYCBwcmVzZXQgbWFrZXMgdGhlIGVmZmVjdGl2ZSBwbHVnaW4gbGlzdCBzdGF0aWNhbGx5IHVuaW5zcGVjdGFibGUgKG1pcnJvcnNcbiAgICAvLyByZWFkRXhwbGljaXRTZW1hbnRpY1JlbGVhc2VQbHVnaW5zIGluIHdiJ3MgcmVsZWFzZS50cykuIFRyZWF0aW5nIGl0IGFzIHVua25vd24ga2VlcHNcbiAgICAvLyBgcmVsZWFzZS5ucG1gIGNvbnNlcnZhdGl2ZWx5IHRydWUsIHNvIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyBuZXZlciBmb3JjZXNcbiAgICAvLyBgcHJpdmF0ZTogdHJ1ZWAgb24gYSBtb25vcmVwbyB0aGF0IGFjdHVhbGx5IHB1Ymxpc2hlcyB0byBucG0uXG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICB0eXBlIFJlbGVhc2VDb25maWcgPVxuICAgICAgICB8IHtcbiAgICAgICAgICAgIGJyYW5jaGVzPzogdW5rbm93bjtcbiAgICAgICAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5dKVtdO1xuICAgICAgICAgICAgZXh0ZW5kcz86IHVua25vd247XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIC8vIGNvc21pY29uZmlnIHNlYXJjaGVzIHBhY2thZ2UuanNvbidzIGByZWxlYXNlYCBrZXkgQkVGT1JFIGFueSByYy9jb25maWcgZmlsZVxuICAgICAgLy8gKHNlbWFudGljLXJlbGVhc2UgMjUgZGVsZWdhdGVzIHRvIGNvc21pY29uZmlnIDkncyBkZWZhdWx0IHNlYXJjaFBsYWNlcykuXG4gICAgICBsZXQgcmVsZWFzZUNvbmZpZyA9IChwYWNrYWdlSnNvbiBhcyB7IHJlbGVhc2U/OiBSZWxlYXNlQ29uZmlnIH0pLnJlbGVhc2U7XG4gICAgICBpZiAocmVsZWFzZUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgeyBmaWxlTmFtZSwganNvblBhcnNlYWJsZSB9IG9mIHNlbWFudGljUmVsZWFzZUNvbmZpZ1NlYXJjaFBsYWNlcykge1xuICAgICAgICAgIGNvbnN0IHJlbGVhc2VyY1BhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhyZWxlYXNlcmNQYXRoKSkgY29udGludWU7XG4gICAgICAgICAgaWYgKCFqc29uUGFyc2VhYmxlKSB7XG4gICAgICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGAucmVsZWFzZXJjYCBhbmQgYC5jb25maWcvcmVsZWFzZXJjYCBtYXkgYWxzbyBob2xkIFlBTUw7IGEgSlNPTi5wYXJzZSBmYWlsdXJlIGxhbmRzXG4gICAgICAgICAgLy8gaW4gdGhlIGNhdGNoIGJlbG93IGFuZCBtYXJrcyB0aGUgcGx1Z2luIGxpc3QgdW5rbm93biBpbnN0ZWFkIG9mIHNpbGVudGx5IHJlcG9ydGluZ1xuICAgICAgICAgIC8vIFwibm8gcGx1Z2luc1wiLlxuICAgICAgICAgIHJlbGVhc2VDb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNQYXRoLCAndXRmOCcpKSBhcyBSZWxlYXNlQ29uZmlnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlIGFjY2VwdHMgYSBzY2FsYXIgYnJhbmNoIG9yIGJyYW5jaCBvYmplY3RzICh7IG5hbWUsIHByZXJlbGVhc2UsIC4uLiB9KTtcbiAgICAgIC8vIG5vcm1hbGl6ZSB0byBwbGFpbiBicmFuY2ggbmFtZXMgZm9yIGNvbnN1bWVycyBzdWNoIGFzIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IuXG4gICAgICBjb25zdCByYXdCcmFuY2hlcyA9IHJlbGVhc2VDb25maWc/LmJyYW5jaGVzO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0gKEFycmF5LmlzQXJyYXkocmF3QnJhbmNoZXMpID8gcmF3QnJhbmNoZXMgOiByYXdCcmFuY2hlcyA9PT0gdW5kZWZpbmVkID8gW10gOiBbcmF3QnJhbmNoZXNdKVxuICAgICAgICAubWFwKChicmFuY2g6IHVua25vd24pID0+XG4gICAgICAgICAgdHlwZW9mIGJyYW5jaCA9PT0gJ3N0cmluZycgPyBicmFuY2ggOiAoYnJhbmNoIGFzIHsgbmFtZT86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/Lm5hbWVcbiAgICAgICAgKVxuICAgICAgICAuZmlsdGVyKChicmFuY2hOYW1lKTogYnJhbmNoTmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIGJyYW5jaE5hbWUgPT09ICdzdHJpbmcnKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlbGVhc2VDb25maWc/LnBsdWdpbnMpKSB7XG4gICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbkVudHJ5IG9mIHJlbGVhc2VDb25maWcucGx1Z2lucykge1xuICAgICAgICAgIGNvbnN0IFtwbHVnaW5OYW1lLCBwbHVnaW5PcHRpb25zXSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpID8gcGx1Z2luRW50cnkgOiBbcGx1Z2luRW50cnksIHVuZGVmaW5lZF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW5OYW1lICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMucHVzaChwbHVnaW5OYW1lKTtcbiAgICAgICAgICBpZiAocGx1Z2luTmFtZSAhPT0gJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpIGNvbnRpbnVlO1xuICAgICAgICAgIC8vIFdpdGggcGtnUm9vdCB0aGUgcGx1Z2luIHB1Ymxpc2hlcyBhbm90aGVyIG1hbmlmZXN0IChpdCByZXNvbHZlcyBwa2dSb290IGFnYWluc3QgdGhlXG4gICAgICAgICAgLy8gcmVwbyByb290LCBzbyBgLmAgYW5kIGAuL2AgYm90aCBtZWFuIHRoZSByb290IGl0c2VsZiksIGFuZCBucG1QdWJsaXNoOiBmYWxzZVxuICAgICAgICAgIC8vIGRpc2FibGVzIHB1Ymxpc2hpbmcgZW50aXJlbHk7IG9ubHkgdGhlIHJlbWFpbmluZyBzaGFwZSBwcm92ZXMgdGhlIFJPT1QgaXMgcHVibGlzaGVkLlxuICAgICAgICAgIGNvbnN0IHBrZ1Jvb3QgPSBwbHVnaW5PcHRpb25zPy5wa2dSb290O1xuICAgICAgICAgIGNvbnN0IHB1Ymxpc2hlc1Jvb3QgPVxuICAgICAgICAgICAgcGx1Z2luT3B0aW9ucz8ubnBtUHVibGlzaCAhPT0gZmFsc2UgJiZcbiAgICAgICAgICAgIChwa2dSb290ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKHR5cGVvZiBwa2dSb290ID09PSAnc3RyaW5nJyAmJiBwYXRoLnJlc29sdmUoZGlyUGF0aCwgcGtnUm9vdCkgPT09IHBhdGgucmVzb2x2ZShkaXJQYXRoKSkpO1xuICAgICAgICAgIHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290IHx8PSBwdWJsaXNoZXNSb290O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlbGVhc2VDb25maWcgJiYgcmVsZWFzZUNvbmZpZy5leHRlbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgfVxuICAgIC8vIFdpdGhvdXQgYW4gZXhwbGljaXQgcGx1Z2luIGxpc3QsIHNlbWFudGljLXJlbGVhc2UncyBkZWZhdWx0IGxpc3QgYXBwbGllcywgd2hpY2ggaW5jbHVkZXNcbiAgICAvLyBAc2VtYW50aWMtcmVsZWFzZS9ucG0gYW5kIEBzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YiAobWlycm9ycyByZWxlYXNlUHVibGlzaGVzVG9OcG0gaW4gd2Inc1xuICAgIC8vIHJlbGVhc2UudHMpLlxuICAgIGNvbnN0IHVzZXNTZW1hbnRpY1JlbGVhc2UgPSAhIShcbiAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMCB8fFxuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgKTtcblxuICAgIC8vIFRoZSBjYWxsZXIgbWF5IGNsYXNzaWZ5IGV4cGxpY2l0bHkgKGluZGV4LnRzIHBhc3NlcyBmYWxzZSBmb3IgZXZlcnkgZGlzY292ZXJlZCB3b3Jrc3BhY2UsXG4gICAgLy8gaW5jbHVkaW5nIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyopOyB0aGUgaGV1cmlzdGljIGNsYXNzaWZpZXMgdGhlIENMSSBlbnRyeVxuICAgIC8vIHBhdGggaXRzZWxmLCBzbyBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPGFwcD5gIGFuZCBgd2JmeSA8cmVwbz4vYXBwcy88YXBwPmAga2VlcCB0aGVpciBjaGlsZFxuICAgIC8vIGNsYXNzaWZpY2F0aW9uLlxuICAgIGNvbnN0IGlzUm9vdCA9IG9wdGlvbnM/LmlzUm9vdCA/PyAhaXNXb3Jrc3BhY2VPZkVuY2xvc2luZ1Jvb3QoZGlyUGF0aCk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIC8vIEZldGNoIHZpc2liaWxpdHkgZm9yIHRoZSBDTEkgZW50cnkgZXZlbiB3aGVuIGl0IGlzIGEgd29ya3NwYWNlIGNoaWxkIChgd2JmeVxuICAgIC8vIDxyZXBvPi9wYWNrYWdlcy88YXBwPmApOiBnZW5lcmF0b3JzIHJlYWQgaXNQdWJsaWNSZXBvIGZyb20gdGhlaXIgcm9vdENvbmZpZyBwYXJhbWV0ZXIsXG4gICAgLy8gd2hpY2ggSVMgdGhlIGNoaWxkIGNvbmZpZyBpbiB0aGF0IGludm9jYXRpb24sIHNvIGEgc3R1YiBgZmFsc2VgIHRoZXJlIHdvdWxkIGRyb3AgdGhlXG4gICAgLy8gcHVibGljLXJlcG8gcHVibGlzaENvbmZpZyBoYW5kbGluZy4gRGlzY292ZXJlZCBjaGlsZHJlbiAob3B0aW9ucy5pc1Jvb3QgPT09IGZhbHNlKSBzdGlsbFxuICAgIC8vIHNraXAgdGhlIGZldGNoIOKAlCB0aGV5IGluaGVyaXQgdGhlIGVuY2xvc2luZyByb290J3MgdmlzaWJpbGl0eSB2aWEgcm9vdENvbmZpZyBpbnN0ZWFkLlxuICAgIGlmIChvcHRpb25zPy5pc1Jvb3QgIT09IGZhbHNlKSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9GdWxsTmFtZSA9IHR5cGVvZiByZXBvSW5mbz8uZnVsbF9uYW1lID09PSAnc3RyaW5nJyA/IHJlcG9JbmZvLmZ1bGxfbmFtZSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb0F1dGhvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXBvRnVsbE5hbWUpIHtcbiAgICAgIGNvbnN0IHJlcG9QYXJ0cyA9IHJlcG9GdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlcG9QYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICByZXBvQXV0aG9yID0gcmVwb1BhcnRzWzBdO1xuICAgICAgICByZXBvTmFtZSA9IHJlcG9QYXJ0c1sxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gT25seSB0aGUgcm9vdCBmZXRjaGVzIHJlcG8gaW5mbywgYW5kIHRoYXQgZmV0Y2ggbmVlZHMgbmV0d29yayBhbmQgYSB0b2tlbiwgc28gaWRlbnRpdHktZGVyaXZlZFxuICAgIC8vIGZsYWdzIGJlbG93IHdvdWxkIG90aGVyd2lzZSBiZSBmYWxzZSBmb3IgZXZlcnkgd29ya3NwYWNlIHBhY2thZ2UgYW5kIGZvciBldmVyeSBvZmZsaW5lIG9yXG4gICAgLy8gcmF0ZS1saW1pdGVkIHJ1bi4gVGhlIGdpdCByZW1vdGUgYW5zd2VycyB0aGUgc2FtZSBxdWVzdGlvbiBsb2NhbGx5LCBmb3IgZXZlcnkgcGFja2FnZS5cbiAgICBpZiAoIXJlcG9BdXRob3IgfHwgIXJlcG9OYW1lKSB7XG4gICAgICBbcmVwb0F1dGhvciwgcmVwb05hbWVdID0gYXdhaXQgcmVzb2x2ZUxvY2FsUmVwb0lkZW50aXR5KGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG4gICAgLy8gQnVpbHQgZnJvbSB0aGUgUkVTT0xWRUQgaWRlbnRpdHkgc28gd29ya3NwYWNlIHBhY2thZ2VzIGFuZCBvZmZsaW5lIHJ1bnMgYWxzbyBnZXQgaXQ7IGNvbnN1bWVycyBkZXJpdmVcbiAgICAvLyB0aGUgb3duZXIgZnJvbSB0aGlzIGZpZWxkIChlLmcuIHRvIHNldCBgYXV0aG9yYCkuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHJlcG9BdXRob3IgJiYgcmVwb05hbWUgPyBgZ2l0aHViOiR7cmVwb0F1dGhvcn0vJHtyZXBvTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIC8vIFRhdXJpIG9mZmljaWFsbHkgc3VwcG9ydHMgSlNPTiwgSlNPTjUsIGFuZCBUT01MIGNvbmZpZ3VyYXRpb24gZm9ybWF0cy5cbiAgICBjb25zdCBkb2VzQ29udGFpblRhdXJpQ29uZmlnID0gWyd0YXVyaS5jb25mLmpzb24nLCAndGF1cmkuY29uZi5qc29uNScsICdUYXVyaS50b21sJ10uc29tZSgoZmlsZU5hbWUpID0+XG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3JjLXRhdXJpJywgZmlsZU5hbWUpKVxuICAgICk7XG4gICAgLy8gUm9vdC1sZXZlbCBcIkluUGFja2FnZXNcIiBzaWduYWxzIG11c3Qgc2VlIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy4gYXBwcy8qKSwgbm90XG4gICAgLy8ganVzdCB0aGUgY29udmVudGlvbmFsIHBhY2thZ2VzLyogZGlyZWN0b3J5LCBzbyBzY2FuIGVhY2ggZGlzY292ZXJlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5LlxuICAgIGNvbnN0IHdvcmtzcGFjZVN1YkRpclBhdGhzID0gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoe1xuICAgICAgZGlyUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzID0gKHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAgIHdvcmtzcGFjZVN1YkRpclBhdGhzLnNvbWUoKHdvcmtzcGFjZVN1YkRpclBhdGgpID0+IGNvbnRhaW5zQW55KHBhdHRlcm4sIHdvcmtzcGFjZVN1YkRpclBhdGgpKTtcbiAgICBjb25zdCBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnID0gZGV0ZWN0V3JhbmdsZXJDb25maWcoZGlyUGF0aCk7XG4gICAgY29uc3Qgd29ya2Zsb3dDb250ZW50cyA9IHJlYWRXb3JrZmxvd0ZpbGVDb250ZW50cyhkaXJQYXRoKTtcbiAgICBjb25zdCBpbXBvcnRzUGxheXdyaWdodEF0UnVudGltZSA9IGRldGVjdFBsYXl3cmlnaHRSdW50aW1lSW1wb3J0KGRpclBhdGgpO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlcG9WaXNpYmlsaXR5S25vd246IHR5cGVvZiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIHJlcG9BdXRob3IsXG4gICAgICByZXBvTmFtZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNDbG91ZGZsYXJlOiBkZXRlY3RDbG91ZGZsYXJlKHBhY2thZ2VKc29uLCBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnLCB3b3JrZmxvd0NvbnRlbnRzKSxcbiAgICAgIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcsXG4gICAgICBpc1JhaWx3YXk6IGRldGVjdFJhaWx3YXkoZGlyUGF0aCwgcGFja2FnZUpzb24sIHdvcmtmbG93Q29udGVudHMpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGRldGVjdElzV2lsbEJvb3N0ZXJDb25maWdzKGRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCwgcmVwb05hbWUpLFxuICAgICAgY2FyZ29Ub21sRGlyUGF0aHM6IGZpbmRDYXJnb1RvbWxEaXJQYXRocyhkaXJQYXRoKSxcbiAgICAgIC8vIEFsc28gaG9ub3IgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIGJleW9uZCBwYWNrYWdlcy8qIChlLmcuIGFwcHMvKik6IHRyZWF0aW5nIGFuXG4gICAgICAvLyBhcHBzLyotb25seSBtb25vcmVwbyBhcyBhIHBsYWluIHBhY2thZ2Ugd291bGQgZGVsZXRlIGl0cyBgd29ya3NwYWNlc2AgZGVjbGFyYXRpb24gaW5cbiAgICAgIC8vIGdlbmVyYXRlUGFja2FnZUpzb24gYW5kIHNraXAgbW9ub3JlcG8tb25seSBjb252ZW50aW9ucyBzdWNoIGFzIHJvb3QgYHByaXZhdGU6IHRydWVgLlxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSB8fCB3b3Jrc3BhY2VTdWJEaXJQYXRocy5sZW5ndGggPiAwLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5VdkxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd1di5sb2NrJykpLFxuICAgICAgLy8gUmVjdXJzaXZlIGxpa2UgZG9lc0NvbnRhaW5KYXZhOiBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3JpZXMga2VlcCBsYW5ndWFnZSBkaXJlY3Rvcmllc1xuICAgICAgLy8gKGUuZy4gUHl0aG9uIHRvb2xpbmcgb3IgTWF2ZW4gbW9kdWxlcykgb3V0c2lkZSB0aGUgcm9vdCBhbmQgb3V0c2lkZSBkZWNsYXJlZCB3b3Jrc3BhY2VzLlxuICAgICAgZG9lc0NvbnRhaW5QeXRob25Mb2NrQW55d2hlcmU6IGNvbnRhaW5zQW55KCcqKi97cG9ldHJ5LmxvY2ssdXYubG9ja30nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sQW55d2hlcmU6IGNvbnRhaW5zQW55KCcqKi9wb20ueG1sJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5TbGlkZXZNZDogY29udGFpbnNBbnkoJyoqLyouc2xpZGV2Lm1kJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblRhdXJpQ29uZmlnLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZ0luUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKFxuICAgICAgICAnc3JjLXRhdXJpL3t0YXVyaS5jb25mLmpzb24sdGF1cmkuY29uZi5qc29uNSxUYXVyaS50b21sfSdcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhOiBjb250YWluc0FueSgnKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnKSxcbiAgICAgIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGNvbnRhaW5zQW55SW5Xb3Jrc3BhY2VzKCcqKi8qLmphdmEnKSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGNoYWtyYTogISFkZXZEZXBlbmRlbmNpZXNbJ0BjaGFrcmEtdWkvY2xpJ10sXG4gICAgICAgIGRyaXp6bGU6ICEhZGVwZW5kZW5jaWVzWydkcml6emxlLW9ybSddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydkcml6emxlLWtpdCddLFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGdlbkkxOG5UczogISFkZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICByZWFjdDogISFkZXBlbmRlbmNpZXMucmVhY3QsXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzLm5leHQsXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0LFxuICAgICAgICBwbGF5d3JpZ2h0UnVudGltZTogaW1wb3J0c1BsYXl3cmlnaHRBdFJ1bnRpbWUsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIHNsaWRldjogISFkZXBlbmRlbmNpZXNbJ0BzbGlkZXYvY2xpJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BzbGlkZXYvY2xpJ10sXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgdGF1cmk6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2FwaSddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2FwaSddIHx8XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2NsaSddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ0B0YXVyaS1hcHBzL2NsaSddIHx8XG4gICAgICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgICAgdmluZXh0OiAhIWRlcGVuZGVuY2llcy52aW5leHQgfHwgISFkZXZEZXBlbmRlbmNpZXMudmluZXh0LFxuICAgICAgICB2aXRlOiAhIWRlcGVuZGVuY2llcy52aXRlIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpdGUsXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0XG4gICAgICAgICAgPyByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykgfHwgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgICAgICAgOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zQXJlRXhwbGljaXRcbiAgICAgICAgICA/IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSB8fCByZWxlYXNlUGx1Z2luc0FyZVVua25vd25cbiAgICAgICAgICA6IHVzZXNTZW1hbnRpY1JlbGVhc2UsXG4gICAgICAgIG5wbVB1Ymxpc2hlc1Jvb3Q6IHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290LFxuICAgICAgfSxcbiAgICAgIG1pc2VUYXNrczogYXdhaXQgcmVhZE1pc2VUYXNrcyhkaXJQYXRoKSxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCB8fFxuICAgICAgLy8gQSByZXBvc2l0b3J5IGNhbiBsZWdpdGltYXRlbHkgY29udGFpbiBvbmx5IGRvY3VtZW50YXRpb24uIEl0cyBHaXQgbWV0YWRhdGEgaXMgZW5vdWdoIHRvXG4gICAgICAvLyBlc3RhYmxpc2ggdGhhdCB0aGUgQ0xJIHRhcmdldCBpcyBhIHByb2plY3Qgcm9vdDsgcmVxdWlyaW5nIGEgbGFuZ3VhZ2UgbWFuaWZlc3QgaGVyZSB3b3VsZFxuICAgICAgLy8gbWFrZSB3YmZ5IHVuYWJsZSB0byBjcmVhdGUgdGhlIHBhY2thZ2UuanNvbiB0aGF0IGl0IG1hbmFnZXMgZm9yIHN1Y2ggcmVwb3NpdG9yaWVzLiBCb3RoXG4gICAgICAvLyBvcmRpbmFyeSBjaGVja291dHMgKGAuZ2l0YCBkaXJlY3RvcnkpIGFuZCB3b3JrdHJlZXMgKGAuZ2l0YCBmaWxlKSBzYXRpc2Z5IHRoaXMgY2hlY2suXG4gICAgICAoY29uZmlnLmlzUm9vdCAmJiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLmdpdCcpKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIHdiZnkgbWFuYWdlcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGZvciB0aGUgcGFja2FnZS4gVGhlIGZpbGUgaXMgZ2l0aWdub3JlZCBhbmQgdW50cmFja2VkXG4gKiBiZWNhdXNlIHRoZSBgd2IgZ2VuLWNvZGVgIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0IG9uIGV2ZXJ5IGluc3RhbGwsIHNvIHRoZSBwYWNrYWdlIGhhcyB0byBvd24gYSB3cmFuZ2xlclxuICogY29uZmlnIChgd3JhbmdsZXIgdHlwZXNgIGV4aXRzIG5vbi16ZXJvIHdpdGhvdXQgb25lKSwgdG8gZGVwZW5kIG9uIHdyYW5nbGVyIChhIHBhY2thZ2UgZGVwbG95aW5nIHZpYSBhXG4gKiBDSSBhY3Rpb24gY2Fubm90IHJlc29sdmUgdGhlIGNvbW1hbmQpLCBhbmQgdG8gY29uc3VtZSB0aGUgZ2VuZXJhdGVkIGZpbGUuXG4gKlxuICogSU5WQVJJQU5UIOKAlCB0aGlzIGRlY2lzaW9uIG11c3QgY29udmVyZ2UgYWNyb3NzIG1hY2hpbmVzIGhvbGRpbmcgdGhlIHNhbWUgY29tbWl0LiBJdCBtdXN0IE5FVkVSIGNvbnN1bHRcbiAqIGdpdGlnbm9yZWQgZmlsZXMgKGAuZGV2LnZhcnMqYCwgYC5lbnYqYCwgLi4uKSwgd2hpY2ggYHdiIHN0YXJ0YCBhbmQgYHdiIGRlcGxveWAgY3JlYXRlIHJvdXRpbmVseSBhbmQgd2hpY2hcbiAqIHRoZXJlZm9yZSBzdGF5IHVudHJhY2tlZCBvbiBkZXYgbWFjaGluZXMgZm9yZXZlcjogYSBmb3JtZXIgY2hlY2sgdGhhdCB0cmVhdGVkIHRoZW0gYXMgaXJyZXByb2R1Y2libGUgaW5wdXRzXG4gKiBtYWRlIHdiZnkgcnVucyBvbiBkZXYgbWFjaGluZXMgcmUtdHJhY2sgdGhlIH4xNWstbGluZSBnZW5lcmF0ZWQgZmlsZSB0aGF0IHJ1bnMgZnJvbSBjbGVhbiBjaGVja291dHMgaGFkXG4gKiB1bnRyYWNrZWQsIG9zY2lsbGF0aW5nIGV0ZXJuYWxseSAoZS5nLiBhaS1nYW1lLWJ1aWxkZXIgIzY4NCDihpIgIzc0NikuIFJlYWRpbmcgY29tbWl0dGFibGUgcmVwb3NpdG9yeSBmaWxlc1xuICogZnJvbSB0aGUgd29ya2luZyB0cmVlICh0aGUgd3JhbmdsZXIgY29uZmlnLCBwYWNrYWdlLmpzb24sIHRzY29uZmlnIOKAlCBhcyBldmVyeSB3YmZ5IGdlbmVyYXRvciBkb2VzKSBpcyBmaW5lOlxuICogYW55IGRpdmVyZ2VuY2UgdGhlcmUgaXMgdHJhbnNpZW50IGFuZCBkaXNhcHBlYXJzIG9uY2UgdGhlIGZpbGUgaXMgY29tbWl0dGVkIG9yIHJlbW92ZWQuXG4gKiBUaGUgaGF6YXJkIHRoYXQgY2hlY2sgZ3VhcmRlZCBhZ2FpbnN0IG5vIGxvbmdlciBleGlzdHM6IGB3YiBnZW4tY29kZWAgcnVucyBgd3JhbmdsZXIgdHlwZXMgLS1lbnYtZmlsZWAgd2l0aFxuICogYSBrZXkgc3R1YiBkZXJpdmVkIHNvbGVseSBmcm9tIHRoZSBjb21taXR0ZWQgZm5veC50b21sIChzZWUgd2IncyB3cml0ZVdvcmtlclR5cGVzRW52U3R1YiksIHNvIGxvY2FsIGRvdGVudlxuICogZmlsZXMgbmV2ZXIgaW5mbHVlbmNlIHRoZSBnZW5lcmF0ZWQgYEVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBjb25maWcucGFja2FnZUpzb247XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiBoYXNXcmFuZ2xlckRlcGVuZGVuY3kocGFja2FnZUpzb24pICYmIGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdwYWNrYWdlSnNvbic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2NyaXB0cyA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChzY3JpcHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdCk7XG4gICAgY29uc3QgaGFzTm9uQ2Fub25pY2FsV2JHZW5Db2RlID0gc2VnbWVudHM/LnNvbWUoKHNlZ21lbnQpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBzZWdtZW50LnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgL14oPzooPzpidW58YnVueCkoPzogLS1idW4pPyg/OiBydW4pPyApP3diIGdlbi1jb2RlJC91LnRlc3Qobm9ybWFsaXplZCkgJiZcbiAgICAgICAgY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMsIHRydWUpID09PSAnY3VzdG9tJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoaGFzTm9uQ2Fub25pY2FsV2JHZW5Db2RlKSByZXR1cm4gYCR7bmFtZX0gbXVzdCB1c2UgdGhlIGNhbm9uaWNhbCBidW4gd2IgZ2VuLWNvZGUgY29tbWFuZGA7XG4gIH1cbiAgLy8gT25seSBgYnVuIHJ1biA8c2NyaXB0PmAgaXMgcmVjb2duaXplZCBhcyBhIHdyYXBwZXI7IGFub3RoZXIgcnVubmVyIHNwZWxsaW5nIHdvdWxkIGdldCBhIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiBhcHBlbmRlZCBuZXh0IHRvIGl0IGFuZCBydW4gZXZlcnkgZ2VuZXJhdG9yIHR3aWNlIHBlciBpbnN0YWxsLiBXaXRob3V0IGEgZ2VuLWNvZGVcbiAgLy8gcGlwZWxpbmUgbm90aGluZyBpcyBhcHBlbmRlZCwgc28gdGhlIHNwZWxsaW5nIGlzIGlycmVsZXZhbnQgdGhlcmUuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdHMucG9zdGluc3RhbGwgPz8gJycpID8/IFtdKSB7XG4gICAgY29uc3Qgc2NyaXB0TmFtZSA9IC9eKD86YnVufGJ1bngpKD86XFxzKy0tYnVuKT8oPzpcXHMrcnVuKT9cXHMrKFxcUyspJC91LmV4ZWMoc2VnbWVudCk/LlsxXTtcbiAgICBjb25zdCB0YXJnZXQgPSBzY3JpcHROYW1lID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgIGlmIChcbiAgICAgIHRhcmdldCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBzZWdtZW50ICE9PSBgYnVuIHJ1biAke3NjcmlwdE5hbWV9YCAmJlxuICAgICAgKHNjcmlwdHNbJ2dlbi1jb2RlJ10gIT09IHVuZGVmaW5lZCB8fCB0YXJnZXQuaW5jbHVkZXMoJ3diIGdlbi1jb2RlJykpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYHBvc3RpbnN0YWxsIG11c3QgaW52b2tlIHRoZSAke3NjcmlwdE5hbWV9IHNjcmlwdCBhcyBidW4gcnVuICR7c2NyaXB0TmFtZX1gO1xuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgLyg/Ol58JiYpXFxzKig/Om5wbXxucHh8cG5wbXx5YXJuKVxccysoPzpydW4oPzotc2NyaXB0KT9cXHMrKT8oPzpnZW4tY29kZXx3YlxccytnZW4tY29kZSlcXHMqKD86JiZ8JCkvdS50ZXN0KFxuICAgICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA/PyAnJ1xuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuICdwb3N0aW5zdGFsbCBtdXN0IHVzZSBidW4gd2IgZ2VuLWNvZGUgaW5zdGVhZCBvZiBhIG5vbi1CdW4gZ2VuLWNvZGUgcnVubmVyJztcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHNjcmlwdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAod3JhbmdsZXJUeXBlc1RleHRQYXR0ZXJuLnRlc3Qoc2NyaXB0KSkgcmV0dXJuIGAke25hbWV9IG11c3QgdXNlIGJ1biB3YiBnZW4tY29kZSBpbnN0ZWFkIG9mIHdyYW5nbGVyIHR5cGVzYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNXcmFuZ2xlckRlcGVuZGVuY3kocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBbXG4gICAgcGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICAgIHBhY2thZ2VKc29uPy5vcHRpb25hbERlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8ucGVlckRlcGVuZGVuY2llcyxcbiAgXS5zb21lKChkZXBlbmRlbmNpZXMpID0+IGRlcGVuZGVuY2llcz8ud3JhbmdsZXIgIT09IHVuZGVmaW5lZCk7XG59XG5cbmNvbnN0IHNoZWxsV29yZFBhdHRlcm4gPSBTdHJpbmcucmF3YCg/OlwiKD86XFxcXC58W15cIlxcXFxdKSpcInwnKD86XFxcXC58W14nXFxcXF0pKid8KD86XFxcXC58W15cXHNcIidcXFxcXSkrKWA7XG5jb25zdCB3cmFuZ2xlck9wdGlvblBhdHRlcm4gPSBTdHJpbmcucmF3YFxccystLT9bQS1aYS16XVtcXHctXSooPzo9JHtzaGVsbFdvcmRQYXR0ZXJufXxcXHMrKD8hLXx0eXBlc1xcYikke3NoZWxsV29yZFBhdHRlcm59KT9gO1xuY29uc3Qgd3JhbmdsZXJUeXBlc1RleHRQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgU3RyaW5nLnJhd2BbXCInXT9cXGJ3cmFuZ2xlcig/OkBbXlxcc1wiJ10rKT9cXGJbXCInXT8oPzoke3dyYW5nbGVyT3B0aW9uUGF0dGVybn0pKlxccyt0eXBlc1xcYmAsXG4gICd1J1xuKTtcblxuLyoqXG4gKiBBIHBhY2thZ2Ugd2hvc2UgVHlwZVNjcmlwdCBwcm9qZWN0IGNhbm5vdCBpbmNsdWRlIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgKGUuZy4gb25lIG9uIGEgaGFuZC1tYWludGFpbmVkXG4gKiBtaW5pbWFsIGBFbnZgIHdpdGggYHR5cGVzOiBbXCJidW5cIl1gLCB0aGUgc3RhbmRhcmQgZXNjYXBlIHdoZW4gdGhlIGFtYmllbnQgd3JhbmdsZXIgZ2xvYmFscyBjb25mbGljdCB3aXRoIHRoZVxuICogYEB0eXBlcy9idW5gIGdsb2JhbHMgaXRzIHRlc3RzIG5lZWQpIGdhaW5zIG5vdGhpbmcgZnJvbSByZWdlbmVyYXRpbmcgdGhlIH41MDBLQiBmaWxlIG9uIGV2ZXJ5IGluc3RhbGwsIHNvIHdiZnlcbiAqIGxlYXZlcyBzdWNoIHBhY2thZ2VzIHVubWFuYWdlZCBpbnN0ZWFkIG9mIHJlLWFkZGluZyB0aGUgZ2VuZXJhdGlvbiBzdGVwLiBDb25zdW1wdGlvbiBpcyBkZXRlY3RlZCB0d28gd2F5czpcbiAqIGEgdGV4dHVhbCBgd29ya2VyLWNvbmZpZ3VyYXRpb25gIHJlZmVyZW5jZSBpbiBhbnkgdHJhY2tlZCBmaWxlIG9mIHRoZSBwYWNrYWdlIChjb3ZlcnMgaW1wb3J0cywgdHJpcGxlLXNsYXNoXG4gKiByZWZlcmVuY2VzLCBhbmQgZXhwbGljaXQgdHNjb25maWcgZW50cmllcyksIG9yIGEgYGZpbGVzYC9gaW5jbHVkZWAvYGV4Y2x1ZGVgIHNldCB0aGF0IGNhbiBtYXRjaCB0aGUgZmlsZSDigJRcbiAqIHJlc29sdmVkIHRocm91Z2ggcmVsYXRpdmUgYGV4dGVuZHNgIGNoYWlucyB3aXRoIGVhY2ggcGF0dGVybiBrZXB0IHJlbGF0aXZlIHRvIHRoZSBjb25maWcgdGhhdCBkZWNsYXJlZCBpdCxcbiAqIG1hdGNoaW5nIHRzYy4gV2hlbmV2ZXIgdGhlIGVmZmVjdGl2ZSBzZXQgY2Fubm90IGJlIGRldGVybWluZWQgKG1pc3Npbmcgb3IgdW5wYXJzZWFibGUgdHNjb25maWcsIHBhY2thZ2UtbmFtZVxuICogYGV4dGVuZHNgIHByZXNldHMsIG9yIFR5cGVTY3JpcHQncyBkZWZhdWx0IGAqKmAgaW5jbHVzaW9uKSwgdGhlIGN1cnJlbnQgbWFuYWdlZCBiZWhhdmlvciBpcyBrZXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnPik6IGJvb2xlYW4ge1xuICAvLyBgZ2l0IGdyZXBgIHNlYXJjaGVzIHRyYWNrZWQgZmlsZXMgb25seSwgc28gdGhlIGdpdGlnbm9yZWQgZ2VuZXJhdGVkIGZpbGUgaXRzZWxmIG5ldmVyIG1hdGNoZXMuXG4gIC8vIHdiZnkncyBvd24gbWFuYWdlZCBhcnRpZmFjdHMgYXJlIGV4Y2x1ZGVkOiB0aGUgYC5naXRpZ25vcmVgIHJ1bGUgKGAvd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c2ApXG4gIC8vIHdiZnkgY29tbWl0dGVkIHdoaWxlIGl0IG1hbmFnZWQgdGhlIHBhY2thZ2UgbXVzdCBub3QgY291bnQgYXMgY29uc3VtcHRpb24sIG9yIGEgb25jZS1tYW5hZ2VkXG4gIC8vIHBhY2thZ2UgY291bGQgbmV2ZXIgb3B0IG91dC5cbiAgY29uc3QgZ3JlcFJlc3VsdCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnZ2l0JyxcbiAgICAvLyB0c2NvbmZpZyBmaWxlcyBhcmUgY2xhc3NpZmllZCBieSB0aGUgcmVzb2x2ZWQgZmlsZXMvaW5jbHVkZS9leGNsdWRlIGxvZ2ljIGJlbG93IOKAlCBhIHRleHR1YWxcbiAgICAvLyBoaXQgdGhlcmUgKGUuZy4gYW4gYGV4Y2x1ZGVgIGVudHJ5KSBtdXN0IG5vdCBjb3VudCBhcyBjb25zdW1wdGlvbi5cbiAgICBbXG4gICAgICAnZ3JlcCcsXG4gICAgICAnLWwnLFxuICAgICAgJ3dvcmtlci1jb25maWd1cmF0aW9uJyxcbiAgICAgICctLScsXG4gICAgICAnLicsXG4gICAgICAnOihleGNsdWRlKS5naXRpZ25vcmUnLFxuICAgICAgJzooZXhjbHVkZSkuZ2l0YXR0cmlidXRlcycsXG4gICAgICBTdHJpbmcucmF3YDooZ2xvYixleGNsdWRlKSoqL3RzY29uZmlnKi5qc29uYCxcbiAgICBdLFxuICAgIGNvbmZpZy5kaXJQYXRoXG4gICk7XG4gIGlmIChncmVwUmVzdWx0LnRyaW0oKSkgcmV0dXJuIHRydWU7XG5cbiAgY29uc3Qgd29ya2VyVHlwZXNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cycpO1xuICBjb25zdCBmaWxlU2V0ID0gcmVzb2x2ZVRzY29uZmlnRmlsZVNldChwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyksIGNvbmZpZy5kaXJQYXRoLCA1KTtcbiAgaWYgKCFmaWxlU2V0KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbWF0Y2hlcyA9IChwYXR0ZXJuU2V0OiBUc2NvbmZpZ1BhdHRlcm5TZXQgfCB1bmRlZmluZWQpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXBhdHRlcm5TZXQgfHwgIUFycmF5LmlzQXJyYXkocGF0dGVyblNldC5wYXR0ZXJucykpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdHRlcm5TZXQuYmFzZURpclBhdGgsIHdvcmtlclR5cGVzUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgcmV0dXJuIHBhdHRlcm5TZXQucGF0dGVybnMuc29tZSgocGF0dGVybikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gYCR7Y29uZmlnRGlyfWAtcHJlZml4ZWQgcGF0dGVybnMgd2VyZSBleHBhbmRlZCB0byBhYnNvbHV0ZSBwYXRocyBhdCByZXNvbHZlIHRpbWUuXG4gICAgICBpZiAocGF0aC5pc0Fic29sdXRlKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuLCB3b3JrZXJUeXBlc1BhdGgsIHBhdHRlcm5TZXQuZXhwYW5kc0RpcmVjdG9yaWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm4sIHJlbGF0aXZlUGF0aCwgcGF0dGVyblNldC5leHBhbmRzRGlyZWN0b3JpZXMpO1xuICAgIH0pO1xuICB9O1xuICAvLyBgZmlsZXNgIGVudHJpZXMgYXJlIGFsd2F5cyBwYXJ0IG9mIHRoZSBwcm9ncmFtLCBldmVuIHdoZW4gYGV4Y2x1ZGVgIG1hdGNoZXMgdGhlbS5cbiAgaWYgKG1hdGNoZXMoZmlsZVNldC5maWxlcykpIHJldHVybiB0cnVlO1xuICBpZiAobWF0Y2hlcyhmaWxlU2V0LmV4Y2x1ZGUpKSByZXR1cm4gZmFsc2U7XG4gIC8vIE5laXRoZXIgaW5jbHVkZSBub3IgZmlsZXMgZGVjbGFyZWQ6IFR5cGVTY3JpcHQncyBkZWZhdWx0IGAqKmAgaW5jbHVzaW9uIGNvdmVycyB0aGUgZmlsZS5cbiAgaWYgKCFmaWxlU2V0LmluY2x1ZGUgJiYgIWZpbGVTZXQuZmlsZXMpIHJldHVybiB0cnVlO1xuICByZXR1cm4gbWF0Y2hlcyhmaWxlU2V0LmluY2x1ZGUpO1xufVxuXG5pbnRlcmZhY2UgVHNjb25maWdQYXR0ZXJuU2V0IHtcbiAgLyoqIERpcmVjdG9yeSBvZiB0aGUgY29uZmlnIHRoYXQgZGVjbGFyZWQgdGhlIHBhdHRlcm5zOyB0c2MgcmVzb2x2ZXMgdGhlbSByZWxhdGl2ZSB0byBpdC4gKi9cbiAgYmFzZURpclBhdGg6IHN0cmluZztcbiAgLyoqIGluY2x1ZGUvZXhjbHVkZSB0cmVhdCBhbiBleHRlbnNpb25sZXNzIG5vbi1nbG9iIHBhdHRlcm4gYXMgYSBkaXJlY3Rvcnkgc3VidHJlZTsgYGZpbGVzYCBkb2VzIG5vdC4gKi9cbiAgZXhwYW5kc0RpcmVjdG9yaWVzOiBib29sZWFuO1xuICBwYXR0ZXJuczogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFRzY29uZmlnRmlsZVNldCB7XG4gIGV4Y2x1ZGU/OiBUc2NvbmZpZ1BhdHRlcm5TZXQ7XG4gIGZpbGVzPzogVHNjb25maWdQYXR0ZXJuU2V0O1xuICBpbmNsdWRlPzogVHNjb25maWdQYXR0ZXJuU2V0O1xufVxuXG4vKiogUmVzb2x2ZXMgZmlsZXMvaW5jbHVkZS9leGNsdWRlIHRocm91Z2ggcmVsYXRpdmUgYGV4dGVuZHNgIGNoYWluczsgdW5kZWZpbmVkIHdoZW4gdW5yZWFkYWJsZS4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbnN1bWVyRGlyUGF0aDogc3RyaW5nLFxuICByZW1haW5pbmdEZXB0aDogbnVtYmVyXG4pOiBUc2NvbmZpZ0ZpbGVTZXQgfCB1bmRlZmluZWQge1xuICBpZiAocmVtYWluaW5nRGVwdGggPD0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHRzY29uZmlnID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjx7XG4gICAgZXhjbHVkZT86IHVua25vd247XG4gICAgZXh0ZW5kcz86IHVua25vd247XG4gICAgZmlsZXM/OiB1bmtub3duO1xuICAgIGluY2x1ZGU/OiB1bmtub3duO1xuICB9Pihjb250ZW50KTtcbiAgaWYgKCF0c2NvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIC8vIGAke2NvbmZpZ0Rpcn1gIHJlc29sdmVzIHRvIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIFJPT1QgKGNvbnN1bWluZykgY29uZmlnLCB3aGVyZXZlciBpdCBhcHBlYXJzLlxuICBjb25zdCB0b1BhdHRlcm5TZXQgPSAocGF0dGVybnM6IHVua25vd24sIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbik6IFRzY29uZmlnUGF0dGVyblNldCB8IHVuZGVmaW5lZCA9PlxuICAgIEFycmF5LmlzQXJyYXkocGF0dGVybnMpXG4gICAgICA/IHtcbiAgICAgICAgICBiYXNlRGlyUGF0aDogZGlyUGF0aCxcbiAgICAgICAgICBleHBhbmRzRGlyZWN0b3JpZXMsXG4gICAgICAgICAgcGF0dGVybnM6IHBhdHRlcm5zLm1hcCgocGF0dGVybikgPT5cbiAgICAgICAgICAgIHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJyAmJiBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyR7Y29uZmlnRGlyfScpXG4gICAgICAgICAgICAgID8gcGF0aC5qb2luKGNvbnN1bWVyRGlyUGF0aCwgcGF0dGVybi5zbGljZSgnJHtjb25maWdEaXJ9Jy5sZW5ndGgpKVxuICAgICAgICAgICAgICA6IHBhdHRlcm5cbiAgICAgICAgICApLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZmlsZVNldDogVHNjb25maWdGaWxlU2V0ID0ge1xuICAgIGV4Y2x1ZGU6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5leGNsdWRlLCB0cnVlKSxcbiAgICBmaWxlczogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmZpbGVzLCBmYWxzZSksXG4gICAgaW5jbHVkZTogdG9QYXR0ZXJuU2V0KHRzY29uZmlnLmluY2x1ZGUsIHRydWUpLFxuICB9O1xuICBjb25zdCBwYXJlbnRzID1cbiAgICB0eXBlb2YgdHNjb25maWcuZXh0ZW5kcyA9PT0gJ3N0cmluZycgPyBbdHNjb25maWcuZXh0ZW5kc10gOiBBcnJheS5pc0FycmF5KHRzY29uZmlnLmV4dGVuZHMpID8gdHNjb25maWcuZXh0ZW5kcyA6IFtdO1xuICAvLyBXaXRoIGFuIGBleHRlbmRzYCBhcnJheSwgbGF0ZXIgZW50cmllcyBvdmVycmlkZSBlYXJsaWVyIG9uZXMsIGFuZCB0aGUgY2hpbGQgb3ZlcnJpZGVzIGFsbCDigJRcbiAgLy8gc28gZmlsbCBlYWNoIHN0aWxsLW1pc3Npbmcga2V5IGZyb20gdGhlIGxhc3QgcGFyZW50IHRoYXQgZGVmaW5lcyBpdC5cbiAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cy50b1JldmVyc2VkKCkpIHtcbiAgICBpZiAoZmlsZVNldC5leGNsdWRlICYmIGZpbGVTZXQuZmlsZXMgJiYgZmlsZVNldC5pbmNsdWRlKSBicmVhaztcbiAgICAvLyBQYWNrYWdlLW5hbWUgZXh0ZW5kcyAoZS5nLiBgQHRzY29uZmlnL2J1bmApIGFyZSBjb21waWxlck9wdGlvbnMgcHJlc2V0cyB3aXRob3V0IGZpbGUgc2V0cy5cbiAgICBpZiAodHlwZW9mIHBhcmVudCAhPT0gJ3N0cmluZycgfHwgIXBhcmVudC5zdGFydHNXaXRoKCcuJykpIGNvbnRpbnVlO1xuICAgIGxldCBwYXJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIHBhcmVudCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhcmVudFBhdGgpICYmIGZzLmV4aXN0c1N5bmMoYCR7cGFyZW50UGF0aH0uanNvbmApKSBwYXJlbnRQYXRoICs9ICcuanNvbic7XG4gICAgY29uc3QgcGFyZW50RmlsZVNldCA9IHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQocGFyZW50UGF0aCwgY29uc3VtZXJEaXJQYXRoLCByZW1haW5pbmdEZXB0aCAtIDEpO1xuICAgIGlmICghcGFyZW50RmlsZVNldCkgY29udGludWU7XG4gICAgZmlsZVNldC5leGNsdWRlID8/PSBwYXJlbnRGaWxlU2V0LmV4Y2x1ZGU7XG4gICAgZmlsZVNldC5maWxlcyA/Pz0gcGFyZW50RmlsZVNldC5maWxlcztcbiAgICBmaWxlU2V0LmluY2x1ZGUgPz89IHBhcmVudEZpbGVTZXQuaW5jbHVkZTtcbiAgfVxuICByZXR1cm4gZmlsZVNldDtcbn1cblxuZnVuY3Rpb24gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybjogc3RyaW5nLCB0YXJnZXRQYXRoOiBzdHJpbmcsIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkID0gcGF0dGVybi5yZXBsYWNlKC9eXFwuXFwvL3UsICcnKTtcbiAgLy8gQSBiYXJlIGAuYCBpbmNsdWRlIGNvdmVycyBldmVyeXRoaW5nIHVuZGVyIHRoZSBjb25maWcncyBkaXJlY3RvcnkuXG4gIGlmIChub3JtYWxpemVkID09PSAnJyB8fCBub3JtYWxpemVkID09PSAnLicpIHJldHVybiB0cnVlO1xuICAvLyBBYnNvbHV0ZSBwYXR0ZXJucyAoZXhwYW5kZWQgYCR7Y29uZmlnRGlyfWApIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGFic29sdXRlIHRhcmdldDsgZHJvcCB0aGVcbiAgLy8gbGVhZGluZyBzbGFzaGVzIGZyb20gYm90aCBzbyB0aGUgc2VnbWVudC1idWlsdCByZWdleCBhbmNob3JzIGlkZW50aWNhbGx5LlxuICB0YXJnZXRQYXRoID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9eXFwvKy91LCAnJyk7XG4gIGNvbnN0IHNlZ21lbnRzID0gbm9ybWFsaXplZC5zcGxpdCgnLycpLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudCAhPT0gJycpO1xuICBjb25zdCByZWdleFNvdXJjZSA9IHNlZ21lbnRzXG4gICAgLm1hcCgoc2VnbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGggLSAxO1xuICAgICAgaWYgKHNlZ21lbnQgPT09ICcqKicpIHJldHVybiBpc0xhc3QgPyAnLionIDogU3RyaW5nLnJhd2AoPzpbXi9dKy8pKmA7XG4gICAgICBjb25zdCBzZWdtZW50U291cmNlID0gc2VnbWVudFxuICAgICAgICAucmVwbGFjZUFsbCgvWy4rXiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJyonLCBTdHJpbmcucmF3YFteL10qYClcbiAgICAgICAgLnJlcGxhY2VBbGwoJz8nLCBTdHJpbmcucmF3YFteL11gKTtcbiAgICAgIHJldHVybiBpc0xhc3QgPyBzZWdtZW50U291cmNlIDogYCR7c2VnbWVudFNvdXJjZX0vYDtcbiAgICB9KVxuICAgIC5qb2luKCcnKTtcbiAgLy8gdHNjIHRyZWF0cyBhbiBleHRlbnNpb25sZXNzIG5vbi1nbG9iIGluY2x1ZGUvZXhjbHVkZSBlbnRyeSBhcyBhIGRpcmVjdG9yeSB3aG9zZSBzdWJ0cmVlIGlzIGluY2x1ZGVkLlxuICBjb25zdCBsYXN0U2VnbWVudCA9IHNlZ21lbnRzLmF0KC0xKSA/PyAnJztcbiAgY29uc3QgZGlyZWN0b3J5U3VmZml4ID1cbiAgICBleHBhbmRzRGlyZWN0b3JpZXMgJiYgIS9bKj9dL3UudGVzdChsYXN0U2VnbWVudCkgJiYgIWxhc3RTZWdtZW50LmluY2x1ZGVzKCcuJykgPyBTdHJpbmcucmF3YCg/Oi8uKik/YCA6ICcnO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7cmVnZXhTb3VyY2V9JHtkaXJlY3RvcnlTdWZmaXh9JGAsICd1JykudGVzdCh0YXJnZXRQYXRoKTtcbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIHRoZSBkaXJlY3Rvcnkgb3ducyBhIFdvcmtlciwgdW5saWtlIHRoZSBpc0Nsb3VkZmxhcmUgaGV1cmlzdGljLCB3aGljaCBhbHNvIG1hdGNoZXMgYSBwYWNrYWdlIHRoYXRcbiAqIG1lcmVseSBtZW50aW9ucyB3cmFuZ2xlciBpbiBhIHNjcmlwdCBvciB3b3JrZmxvdyAoZS5nLiB0aGUgcm9vdCBvZiBhIG1vbm9yZXBvIHdob3NlIFdvcmtlciBsaXZlcyBpbiBhIHN1Yi1wYWNrYWdlKS5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0V3JhbmdsZXJDb25maWcoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ3dyYW5nbGVyLmpzb25jJywgJ3dyYW5nbGVyLmpzb24nLCAnd3JhbmdsZXIudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHdoZXRoZXIgZGlyUGF0aCBiZWxvbmdzIHRvIHRoZSB3aWxsYm9vc3Rlci1jb25maWdzIHJlcG9zaXRvcnkuIFByZWZlcnMgdGhlIGF1dGhvcml0YXRpdmVcbiAqIEdpdEh1YiByZXBvIG5hbWUsIHdoaWNoIGlzIGltbXVuZSB0byB0aGUgbG9jYWwgZGlyZWN0b3J5IGxheW91dC4gVGhhdCBuYW1lIGlzIGZldGNoZWQgb25seSBmb3IgdGhlXG4gKiByb290LCBzbyBzdWItcGFja2FnZXMgKGFuZCBvZmZsaW5lIHJvb3RzKSB3YWxrIHVwIHRvIHRoZSBuZWFyZXN0IGdpdCByb290IGFuZCBtYXRjaCBpdHMgZGlyZWN0b3J5XG4gKiBuYW1lOiBhIHNpYmxpbmcgcmVwbyBjbG9uZWQgdW5kZXIgYSBwYXJlbnQgZGlyZWN0b3J5IG5hbWVkIHdpbGxib29zdGVyLWNvbmZpZ3Mgc3RvcHMgYXQgaXRzIG93blxuICogYC5naXRgLCBzbyBpdCBpcyBub3QgbWlzY2xhc3NpZmllZC4gVGhlIHBhdGggc2VnbWVudCByZW1haW5zIGEgbGFzdCByZXNvcnQgd2hlbiBubyBnaXQgcm9vdCBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdElzV2lsbEJvb3N0ZXJDb25maWdzKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb25QYXRoOiBzdHJpbmcsIHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKHJlcG9OYW1lKSByZXR1cm4gcmVwb05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3dpbGxib29zdGVyLWNvbmZpZ3MnO1xuICBsZXQgY3VycmVudCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgd2hpbGUgKGN1cnJlbnQgIT09IHBhdGguZGlybmFtZShjdXJyZW50KSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLmdpdCcpKSkge1xuICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUoY3VycmVudCkudG9Mb3dlckNhc2UoKSA9PT0gJ3dpbGxib29zdGVyLWNvbmZpZ3MnO1xuICAgIH1cbiAgICBjdXJyZW50ID0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGgudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MvJyk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdENsb3VkZmxhcmUoXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZzogYm9vbGVhbixcbiAgd29ya2Zsb3dDb250ZW50czogc3RyaW5nW11cbik6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cztcbiAgaWYgKHNjcmlwdHMgJiYgT2JqZWN0LnZhbHVlcyhzY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC5pbmNsdWRlcygnd3JhbmdsZXInKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dDb250ZW50cy5zb21lKChjb250ZW50KSA9PiAvY2xvdWRmbGFyZXx3cmFuZ2xlci9pdS50ZXN0KGNvbnRlbnQpKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UmFpbHdheShkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgd29ya2Zsb3dDb250ZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIGlmIChzY3JpcHRzICYmIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiBzY3JpcHQuaW5jbHVkZXMoJ3JhaWx3YXknKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJhaWx3YXlpZ25vcmUnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncmFpbHdheS5qc29uJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3JhaWx3YXkudG9tbCcpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9yYWlsd2F5L2l1LnRlc3QoY29udGVudCkpO1xufVxuXG4vKiogQ29udGVudHMgb2YgdGhlIHJlYWRhYmxlIC5naXRodWIvd29ya2Zsb3dzIFlBTUwgZmlsZXMsIHJlYWQgb25jZSBmb3IgZXZlcnkgZGV0ZWN0b3IgbmVlZGluZyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKVxuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IC9cXC55YT9tbCQvaXUudGVzdChmaWxlTmFtZSkpXG4gICAgICAuZmxhdE1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gW2ZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpXTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNaXNlVGFza3MoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IHRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZGlyUGF0aCBpcyBhIGNoaWxkIHdvcmtzcGFjZSBvZiBhbiBlbmNsb3NpbmcgbW9ub3JlcG8gcm9vdDogZWl0aGVyIHRoZSBjb252ZW50aW9uYWxcbiAqIGA8cm9vdD4vcGFja2FnZXMvPG5hbWU+YCBsYXlvdXQsIG9yIGEgZGlyZWN0b3J5IG1hdGNoaW5nIGEgd29ya3NwYWNlIHBhdHRlcm4gZGVjbGFyZWQgYnkgYW5cbiAqIGFuY2VzdG9yIHBhY2thZ2UuanNvbiAocGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXAsIGUuZy4gYGV4YW1wbGVzLyoqYCkuIFRoZSB3YWxrIHN0b3BzXG4gKiBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZyByZXBvc2l0b3J5J3Mgd29ya3NwYWNlcyBjYW5cbiAqIG5ldmVyIHJlY2xhc3NpZnkgYW4gaW5kZXBlbmRlbnQgcmVwb3NpdG9yeSBhcyBhIGNoaWxkLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVzb2x2ZWREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAvLyBBIGRpcmVjdG9yeSB3aXRoIGl0cyBvd24gLmdpdCBpcyBhIHJlcG9zaXRvcnkgaW4gaXRzIG93biByaWdodCwgbmV2ZXIgYSBjaGlsZCB3b3Jrc3BhY2Ug4oCUXG4gIC8vIGNoZWNrZWQgRklSU1Qgc28gYW4gaW5kZXBlbmRlbnQgcmVwb3NpdG9yeSB1bmRlciBzb21lIGBwYWNrYWdlcy9gIGRpcmVjdG9yeSBzdGF5cyBhIHJvb3QuXG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuZ2l0JykpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuLicpKSA9PT0gJ3BhY2thZ2VzJyAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKFxuICAgIGxldCBjYW5kaWRhdGVSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShyZXNvbHZlZERpclBhdGgpO1xuICAgIDtcbiAgICBjYW5kaWRhdGVSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShjYW5kaWRhdGVSb290RGlyUGF0aClcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3RQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsIHJlc29sdmVkRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoe1xuICAgICAgICBkaXJQYXRoOiBjYW5kaWRhdGVSb290RGlyUGF0aCxcbiAgICAgICAgcGFja2FnZUpzb246IHJvb3RQYWNrYWdlSnNvbixcbiAgICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGZhbHNlLFxuICAgICAgfSkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+IHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKTtcbiAgICAgIGlmICh3b3Jrc3BhY2VEaXJQYXRocy5pbmNsdWRlcyhyZWxhdGl2ZURpclBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vIG9yIHVucGFyc2FibGUgbWFuaWZlc3QgYXQgdGhpcyBhbmNlc3Rvcjoga2VlcCB3YWxraW5nLlxuICAgIH1cbiAgICBjb25zdCBpc1JlcG9Cb3VuZGFyeSA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gY2FuZGlkYXRlUm9vdERpclBhdGggPT09IHBhdGguZGlybmFtZShjYW5kaWRhdGVSb290RGlyUGF0aCk7XG4gICAgaWYgKGlzUmVwb0JvdW5kYXJ5IHx8IGlzRmlsZXN5c3RlbVJvb3QpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDYXJnb1RvbWxEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmZ1xuICAgIC5nbG9iU3luYygnKiovQ2FyZ28udG9tbCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KVxuICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5zcGxpdCgnLycpLmxlbmd0aCAtIGIuc3BsaXQoJy8nKS5sZW5ndGggfHwgYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVzID0gZmcuZ2xvYlN5bmMoJ3thcHAsc3JjfS8qKi8qLntjanMsY3RzLGpzLGpzeCxtanMsbXRzLHRzLHRzeH0nLCB7XG4gICAgZG90OiB0cnVlLFxuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAnKiovX190ZXN0c19fLyoqJywgJyoqLyouc3BlYy4qJywgJyoqLyoudGVzdC4qJywgJyoqL3BsYXl3cmlnaHQuY29uZmlnLionXSxcbiAgfSk7XG4gIGNvbnN0IHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuID0gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKCdwbGF5d3JpZ2h0Jyk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGUpLCAndXRmOCcpO1xuICAgIGlmIChwbGF5d3JpZ2h0SW1wb3J0UGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUnVudGltZUltcG9ydFJlZ0V4cChwYWNrYWdlTmFtZTogc3RyaW5nKTogUmVnRXhwIHtcbiAgLy8gTWF0Y2ggdGhlIGJhcmUgc3BlY2lmaWVyIG9yIGFueSBzdWJwYXRoIG9mIGl0IChgcGtnYCAvIGBwa2cvc3ViYCksIGJ1dCBuZXZlciBhIGRpZmZlcmVudCBwYWNrYWdlXG4gIC8vIHRoYXQgbWVyZWx5IHNoYXJlcyB0aGUgcHJlZml4IChgcGtnLW90aGVyYCksIHNpbmNlIHRoZSBjaGFyIGFmdGVyIHRoZSBuYW1lIG11c3QgYmUgYC9gIG9yIGEgcXVvdGUuXG4gIGNvbnN0IHNwZWNpZmllciA9IFN0cmluZy5yYXdgWydcIl0ke2VzY2FwZVJlZ0V4cChwYWNrYWdlTmFtZSl9KD86L1teJ1wiXSopP1snXCJdYDtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgU3RyaW5nLnJhd2BcXGJmcm9tXFxzKyR7c3BlY2lmaWVyfXxcXGJpbXBvcnRcXHMqXFwoXFxzKiR7c3BlY2lmaWVyfVxccypcXCl8XFxicmVxdWlyZVxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKWAsXG4gICAgJ3UnXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlbW90ZVVybCA9IGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoKTtcbiAgaWYgKHJlbW90ZVVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvbi4gVGhlIG93bmVyIE1VU1QgYmUgcGFzc2VkOiBnZXRPY3Rva2l0KCkgd2l0aG91dCBpdCBwcmVmZXJzIHRoZVxuICAgIC8vIFdpbGxCb29zdGVyIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgcHJpdmF0ZSBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3JpZXMsIGNvbGxhcHNpbmcgdGhlaXJcbiAgICAvLyB2aXNpYmlsaXR5IHRvIHVua25vd24gKGFuZCBlLmcuIHNraXBwaW5nIHRoZSB3YmZ5IGNhbGxlciBnZW5lcmF0aW9uIGluZGVmaW5pdGVseSkuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG9yZykucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIC8vIFJlLWZldGNoIHVuZGVyIHRoZSByZWRpcmVjdGVkIGlkZW50aXR5IHNvIGEgcmVuYW1lZCByZXBvc2l0b3J5IHN0aWxsIGdldHMgY29tcGxldGVcbiAgICAgIC8vIG1ldGFkYXRhICh2aXNpYmlsaXR5IGluY2x1ZGVkKSBpbnN0ZWFkIG9mIGEgYmFyZSBmdWxsX25hbWUgdGhhdCB3b3VsZCBsZWF2ZVxuICAgICAgLy8gaXNSZXBvVmlzaWJpbGl0eUtub3duIGZhbHNlIG9uIGV2ZXJ5IHN1YnNlcXVlbnQgcnVuIHdpdGggdGhlIHN0YWxlIHJlbW90ZSBVUkwuXG4gICAgICBjb25zdCBbcmVkaXJlY3RlZE9yZywgcmVkaXJlY3RlZE5hbWVdID0gcmVkaXJlY3RlZEZ1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVkaXJlY3RlZE9yZyAmJiByZWRpcmVjdGVkTmFtZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChyZWRpcmVjdGVkT3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXI6IHJlZGlyZWN0ZWRPcmcsXG4gICAgICAgICAgICByZXBvOiByZWRpcmVjdGVkTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiYXJlIGlkZW50aXR5IGJlbG93OiB0aGUgcmVwb3NpdG9yeSBpcyBzdGlsbCBjYW5vbmljYWxpemVkLCBvbmx5XG4gICAgICAgICAgLy8gaXRzIHZpc2liaWxpdHkgc3RheXMgdW5rbm93bi5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZnVsbF9uYW1lOiByZWRpcmVjdGVkRnVsbE5hbWUgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBgPG9yZz4vPG5hbWU+YCBmcm9tIHRoZSBnaXQgcmVtb3RlIChmYWxsaW5nIGJhY2sgdG8gcGFja2FnZS5qc29uJ3MgYHJlcG9zaXRvcnlgKSB3aXRob3V0XG4gKiBjYWxsaW5nIHRoZSBHaXRIdWIgQVBJLiBJdCB3b3JrcyBmb3IgZXZlcnkgd29ya3NwYWNlIHBhY2thZ2UsIG5vdCBqdXN0IHRoZSByb290IOKAlCBvbmx5IHRoZSByb290XG4gKiBmZXRjaGVzIHJlcG8gaW5mbyDigJQgYW5kIGl0IGtlZXBzIHdvcmtpbmcgb2ZmbGluZSBvciByYXRlLWxpbWl0ZWQsIHdoZXJlIGFuIHVuZGVmaW5lZCBpZGVudGl0eVxuICogd291bGQgc2lsZW50bHkgcmVjbGFzc2lmeSB0aGUgcmVwb3NpdG9yeSAoZS5nLiBtYWtpbmcgd2JmeSB3cml0ZSB3aWxsYm9vc3Rlci1jb25maWdzJyBSZW5vdmF0ZVxuICogcHJlc2V0IGludG8gdGhlIHByZXNldCBpdHNlbGYgYWdhaW4pLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBQcm9taXNlPFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZF0+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSByZWFkR2l0SHViSWRlbnRpdHkocmVtb3RlVXJsKTtcbiAgICBpZiAoaWRlbnRpdHkpIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSByZWFkR2l0SHViSWRlbnRpdHkodXJsKTtcbiAgICBpZiAoaWRlbnRpdHkpIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnY29uZmlnJywgJy0tZ2V0JywgJ3JlbW90ZS5vcmlnaW4udXJsJ10sIGRpclBhdGgpIHx8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBgZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lYCBpcyBob3N0LWFnbm9zdGljLCBzbyBpdCBoYXBwaWx5IHR1cm5zIGEgR2l0TGFiIFVSTCBpbnRvIGFuIGA8b3JnPi88cmVwbz5gIHBhaXIuXG4gKiBFdmVyeXRoaW5nIGRvd25zdHJlYW0gdHJlYXRzIHRoZSByZXN1bHRpbmcgaWRlbnRpdHkgYXMgR2l0SHViICh0aGUgYGdpdGh1YjpgIHJlcG9zaXRvcnkgZmllbGQgaXMgcmV3cml0dGVuXG4gKiBpbnRvIHBhY2thZ2UuanNvbiksIHNvIHRoZSBob3N0IG11c3QgYmUgdmVyaWZpZWQgZmlyc3Q7IGEgbm9uLUdpdEh1YiByZW1vdGUgeWllbGRzIG5vIGlkZW50aXR5LCBhcyBiZWZvcmUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRHaXRIdWJJZGVudGl0eSh1cmw6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10gfCB1bmRlZmluZWQge1xuICBpZiAoIXRhcmdldHNHaXRIdWIodXJsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsKTtcbiAgcmV0dXJuIG9yZyAmJiBuYW1lID8gW2Nhbm9uaWNhbGl6ZU93bmVyKG9yZyksIG5hbWVdIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIFVSTCdzIEhPU1QgaXMgZ2l0aHViLmNvbS4gUGFyc2VkIHJhdGhlciB0aGFuIHN1YnN0cmluZy1tYXRjaGVkOiBhIHBhdGggc3VjaCBhc1xuICogYGh0dHBzOi8vZ2l0bGFiLmNvbS9naXRodWIuY29tL293bmVyL3JlcG8uZ2l0YCB3b3VsZCBvdGhlcndpc2UgYmUgdGFrZW4gZm9yIEdpdEh1YiwgYW5kIGFuIHVwcGVyY2FzZVxuICogYEdJVEhVQi5DT01gIHdvdWxkIGJlIHJlamVjdGVkLiBgZ2l0aHViOm93bmVyL3JlcG9gIGlzIG5wbSdzIHNob3J0aGFuZCBhbmQgbmFtZXMgbm8gaG9zdCwgc28gaXQgaXNcbiAqIHJlY29nbml6ZWQgc2VwYXJhdGVseTsgbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIGFjY2VwdHMgdGhlIHNhbWUgc2hvcnRoYW5kLlxuICovXG5mdW5jdGlvbiB0YXJnZXRzR2l0SHViKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICgvXmdpdGh1YjovaXUudGVzdCh1cmwpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2NwLXN0eWxlIHJlbW90ZXMgKGBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvLmdpdGApIGFyZSBub3QgdmFsaWQgVVJMcy5cbiAgY29uc3Qgc2NwSG9zdCA9IC9eW14vQF0qQChbXjovXSspOi91LmV4ZWModXJsKT8uWzFdO1xuICBpZiAoc2NwSG9zdCkgcmV0dXJuIHNjcEhvc3QudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybC5yZXBsYWNlKC9eZ2l0XFwrL3UsICcnKSkuaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBhIHJlbW90ZSBvciBtYW5pZmVzdCBVUkwgbWF5IHNwZWxsIHRoZW0gYW55IHdheSwgYnV0IHRoZSBBUEknc1xuICogYGZ1bGxfbmFtZWAgYWx3YXlzIHJldHVybmVkIHRoZSBjYW5vbmljYWwgc3BlbGxpbmcg4oCUIHdoaWNoIHRoZSBtYW55IGV4YWN0IGA9PT0gJ1dpbGxCb29zdGVyJ2AgcG9saWN5IGNoZWNrc1xuICogKG9yZ2FuaXphdGlvbiB3b3JrZmxvd3MsIGF1dGhvciBtZXRhZGF0YSwgdGhlIFdpbGxCb29zdGVyTGFiIHByZS1wdXNoIGd1YXJkKSBkZXBlbmQgb24uIENhbm9uaWNhbGl6ZSBoZXJlIHNvXG4gKiB0aGUgbG9jYWwgZmFsbGJhY2sgeWllbGRzIHRoZSBzYW1lIGlkZW50aXR5IHRoZSBBUEkgZGlkLCBpbnN0ZWFkIG9mIHNpbGVudGx5IHNraXBwaW5nIHRob3NlIHBvbGljaWVzLlxuICovXG5mdW5jdGlvbiBjYW5vbmljYWxpemVPd25lcihvd25lcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2Fub25pY2FsT3duZXJzID0gWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddO1xuICByZXR1cm4gY2Fub25pY2FsT3duZXJzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyLnRvTG93ZXJDYXNlKCkpID8/IG93bmVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdywgaW52b2tlc1diRGVwbG95IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290Q29uZmlnLmRpclBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuXG4vKipcbiAqIFJlYWRzIHRoZSByb290J3MgdXNlci1hdXRob3JlZCBBR0VOVFNfRVhUUkEubWQgb25jZSBwZXIgcHJvY2Vzczogd2JmeSBuZXZlciByZXdyaXRlcyB0aGUgZmlsZSxcbiAqIGFuZCBib3RoIHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBhbmQgR2VtaW5pIGdlbmVyYXRvcnMgbmVlZCBpdHMgY29udGVudC4gQ2FjaGluZyB0aGUgcmVzb2x2ZWRcbiAqIHZhbHVlIChub3QgdGhlIFByb21pc2UpIGlzIHJhY2UtZnJlZSBiZWNhdXNlIHRoZSB0d28gY2FsbGVycyBydW4gc2VxdWVudGlhbGx5IGluIGluZGV4LnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gIGlmICghYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuaGFzKGFnZW50c0V4dHJhUGF0aCkpIHtcbiAgICBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5zZXQoYWdlbnRzRXh0cmFQYXRoLCBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhhZ2VudHNFeHRyYVBhdGgpKTtcbiAgfVxuICByZXR1cm4gYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuZ2V0KGFnZW50c0V4dHJhUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gJ2J1bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb247XG4gIGNvbnN0IGZub3hJbnN0cnVjdGlvbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKVxuICAgID8gYFxcbi0gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzZWNyZXRzIGFyZSBtYW5hZ2VkIGluIFxcYGZub3gudG9tbFxcYCB2aWEgbWlzZSArIGZub3g7IHJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgIGluc3RlYWQgb2YgZXhwZWN0aW5nIFxcYC5lbnZcXGAgZmlsZXMuIE5ldmVyIGNyZWF0ZSBhIFxcYC5lbnZcXGAsIFxcYC5lbnYuKlxcYCwgb3IgXFxgLmRldi52YXJzXFxgIGZpbGU6IGFkZCB0aGUgdmFyaWFibGUgdG8gXFxgZm5veC50b21sXFxgIGluc3RlYWQuIFByb2ZpbGUgc2VjcmV0cyBsb2FkIG9ubHkgd2hlbiBhIHByb2ZpbGUgaXMgc2VsZWN0ZWQ6IG1vZGUtYXdhcmUgd2IgY29tbWFuZHMgKGUuZy4gXFxgd2Igc3RhcnRcXGAsIFxcYHdiIHRlc3RcXGApIGFuZCBcXGB3YiBkb3RlbnZcXGAgc2VsZWN0IGl0IHRoZW1zZWx2ZXMgKFxcYHdiIGRvdGVudlxcYCB1c2VzIFxcYFdCX0VOVlxcYCwgZWxzZSBcXGBGTk9YX1BST0ZJTEVcXGAsIGVsc2UgXFxgTk9ERV9FTlZcXGAsIGVsc2UgdGhlIGRldmVsb3BtZW50IHByb2ZpbGU7IFxcYFdCX0VOVlxcYCBhY2NlcHRzIG9ubHkgXFxgZGV2ZWxvcG1lbnRcXGAvXFxgdGVzdFxcYC9cXGBzdGFnaW5nXFxgL1xcYHByb2R1Y3Rpb25cXGAsIHNvIHVzZSBcXGBGTk9YX1BST0ZJTEVcXGAgZm9yIGFueSBvdGhlciBwcm9maWxlKSwgd2hpbGUgYmFyZSBcXGBmbm94IHJ1blxcYCBuZWVkcyBhbiBleHBsaWNpdCBcXGAtUCA8cHJvZmlsZT5cXGAuYFxuICAgIDogJyc7XG4gIC8vIG1pc2Ugb3ducyB0aGUgcGlubmVkIHRvb2wgdmVyc2lvbnMsIHNvIGEgdmVyc2lvbiBtaXNtYXRjaCBpcyBmaXhlZCBieSBlZGl0aW5nIG1pc2UudG9tbCDigJQgbm90XG4gIC8vIGJ5IGluc3RhbGxpbmcgYSBkaWZmZXJlbnQgdmVyc2lvbiBnbG9iYWxseSwgd2hpY2ggdGhlIG5leHQgYG1pc2UgaW5zdGFsbGAgc2lsZW50bHkgb3ZlcnJpZGVzLlxuICBjb25zdCBtaXNlSW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdtaXNlLnRvbWwnKSlcbiAgICA/ICdcXG4tIFRvb2wgdmVyc2lvbnMgKGUuZy4sIG5vZGUpIGFyZSBwaW5uZWQgaW4gYG1pc2UudG9tbGA7IHJ1biBgbWlzZSBpbnN0YWxsYCBhZnRlciBjaGFuZ2luZyBpdCwgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICBjb25zdCB1c2VzV2JEZXBsb3kgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydkZXBsb3knXTtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9KSkpXG4gICAgKTtcbiAgfSk7XG4gIC8vIEluZGVwZW5kZW50IGZhY3RzIHN0YXkgc2VwYXJhdGUgc2VudGVuY2VzOiB0aGUgd29ya2Zsb3cncyBvd24gZGVwbG95IG1lY2hhbmlzbSBpcyBub3RcbiAgLy8gaW5zcGVjdGVkLCBzbyB0aGUgd2ItZGVwbG95IGNsYXVzZSBtdXN0IG5vdCBjbGFpbSB0aGUgd29ya2Zsb3cgaW52b2tlcyBpdC5cbiAgY29uc3QgY2xvdWRmbGFyZUluc3RydWN0aW9uID0gb3duc1dyYW5nbGVyQ29uZmlnXG4gICAgPyBgXFxuLSBUaGlzIHByb2plY3QgcnVucyBvbiBDbG91ZGZsYXJlIFdvcmtlcnM6IHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uIGZpbGUgaG9sZHMgdGhlIFdvcmtlcidzIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBhbnkgYmluZGluZ3MgYW5kIHBlci1lbnZpcm9ubWVudCBvdmVycmlkZXMuJHtoYXNEZXBsb3lXb3JrZmxvdyA/ICcgVGhlIGRlcGxveSB3b3JrZmxvd3MgdW5kZXIgYC5naXRodWIvd29ya2Zsb3dzYCBwZXJmb3JtIGRlcGxveW1lbnRzLicgOiAnJ30ke3VzZXNXYkRlcGxveSA/ICcgVGhlIGBkZXBsb3lgIHBhY2thZ2Ugc2NyaXB0IHJ1bnMgYHdiIGRlcGxveWAuJyA6ICcnfSR7b3duc0dlbmVyYXRlZFdvcmtlclR5cGVzID8gYFxcbi0gXFxgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c1xcYCBpcyBnZW5lcmF0ZWQgYnkgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgZ2VuLWNvZGVcXGAgYW5kIGlzIGdpdGlnbm9yZWQ7IGFmdGVyIGNoYW5naW5nIGJpbmRpbmdzIG9yIHZhcnMgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24sIHJlLXJ1biBpdCBpbnN0ZWFkIG9mIGVkaXRpbmcgdGhhdCBmaWxlIGJ5IGhhbmQuYCA6ICcnfWBcbiAgICA6ICcnO1xuICAvLyBXaWxsQm9vc3RlciBSYWlsd2F5IHByb2plY3QgaWRlbnRpZmllcnMgYXJlIG1hbmFnZWQgaW4gZGVwbG95IHdvcmtmbG93IHNldHRpbmdzLlxuICBjb25zdCByYWlsd2F5SW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzUmFpbHdheVxuICAgID8gJ1xcbi0gUmFpbHdheSBwcm9qZWN0IGluZm9ybWF0aW9uIGlzIGluIHRoZSBkZXBsb3kgd29ya2Zsb3dzIHVuZGVyIGAuZ2l0aHViL3dvcmtmbG93c2AuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHBsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb24gPSBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihhbGxDb25maWdzKVxuICAgID8gYFxcbi0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0XFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmBcbiAgICA6ICcnO1xuICBjb25zdCBjb0F1dGhvckluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbiAgLSBFbmQgeW91ciBjb21taXQgbWVzc2FnZSB3aXRoIGEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYC5gXG4gICAgOiAnJztcbiAgLy8gS2V5ZWQgb24gdGhlIHJlcG9zaXRvcnkgY2xhc3NpZmljYXRpb24gcmF0aGVyIHRoYW4gb24gdGhlIHRlbXBsYXRlIGZpbGVzJyBwcmVzZW5jZTogdGhlIHNhbWVcbiAgLy8gcnVuIHdyaXRlcyB0aGUgdGVtcGxhdGVzIGZvciBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIHJlcG9zaXRvcmllcyBiZWZvcmUgdGhpcyBnZW5lcmF0b3JcbiAgLy8gcnVucywgYW5kIGhhbmQtYWRkZWQgdGVtcGxhdGVzIGVsc2V3aGVyZSBiZWxvbmcgdG8gQUdFTlRTX0VYVFJBLm1kLlxuICBjb25zdCBwclRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBcIlxcbiAgLSBCYXNlIHRoZSBQUiBib2R5IG9uIGAuZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZGAgd2hlbiBjcmVhdGluZyBvciB1cGRhdGluZyBhIFBSLCBldmVuIHdoZW4gYSBza2lsbCBvciB3b3JrZmxvdyBzdXBwbGllcyBpdHMgb3duIGJvZHkgc2tlbGV0b246IGtlZXAgdGhlIHRlbXBsYXRlJ3MgaGVhZGluZ3MgaW4gaXRzIG9yZGVyLCBmaWxsIGV2ZXJ5IHNlY3Rpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24gaXRzIHBsYWNlaG9sZGVyIGNvbW1lbnQgYXNrcyBmb3IgYXQgYSBsZW5ndGggdGhhdCBmaXRzIHRoZSBjaGFuZ2UgKGEgc2VudGVuY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBudW1iZXJlZCBzdWJzZWN0aW9ucyBmb3IgYSBsYXJnZSBvbmUpLCBkZWxldGUgdGhlIHBsYWNlaG9sZGVyIGNvbW1lbnRzIGFuZCBhbiBlbXB0eSBOb3RlcyBzZWN0aW9uLCBhbmQga2VlcCBgQ2xvc2UgIzxuPmAgb25seSB3aGVuIHRoZSBQUiByZXNvbHZlcyBhbiBleGlzdGluZyBpc3N1ZS5cIlxuICAgIDogJyc7XG4gIGNvbnN0IGlzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/ICdcXG4tIFdoZW4gY3JlYXRpbmcgYW4gaXNzdWUsIHJlYWQgdGhlIHRlbXBsYXRlcyB1bmRlciBgLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9gIGFuZCBmb2xsb3cgdGhlIGNsb3Nlc3Qgb25lOiBgYnVnLm1kYCBmb3Igd3JvbmcgYmVoYXZpb3IsIGBjaGFuZ2UubWRgIGZvciBhbnl0aGluZyB0byBidWlsZCBvciBhbHRlci4gVGhlIFlBTUwgZnJvbnQgbWF0dGVyIGJldHdlZW4gdGhlIGAtLS1gIGxpbmVzIGlzIG1ldGFkYXRhLCBub3QgYm9keSB0ZXh0OiBwcmVmaXggdGhlIHRpdGxlIGFzIGl0cyBgdGl0bGVgIHNheXMsIHBhc3MgaXRzIGBsYWJlbHNgIHZpYSBgLS1sYWJlbGAsIGFuZCBzdWJtaXQgb25seSB0aGUgY29udGVudCBiZWxvdyB0aGUgY2xvc2luZyBgLS0tYCBhcyB0aGUgYm9keS4gS2VlcCB0aGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgb2YgYGNoYW5nZS5tZGAgZm9yIGFueSBjaGFuZ2UgYW5kIGFkZCB0aGUgcmVtYWluaW5nIHNlY3Rpb25zIGFzIHRoZSBjaGFuZ2UgZ3Jvd3M7IGtlZXAgUHJvYmxlbSBhbmQgUHJvcG9zYWwgb2YgYGJ1Zy5tZGAgYW5kIGRyb3AgRXZpZGVuY2Ugb3IgSW1wYWN0IHdoZW4gdGhleSBhZGQgbm90aGluZy4gRGVsZXRlIHRoZSBwbGFjZWhvbGRlciBjb21tZW50cy4gQSBxdWVzdGlvbiBvciBhIG5vdGUgdGhhdCBmaXRzIG5laXRoZXIgdGVtcGxhdGUgbmVlZHMgbm8gdGVtcGxhdGUuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtwcm9qZWN0TmFtZX1cXGAke2Rlc2NyaXB0aW9uID8gYFxcbi0gRGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YCA6ICcnfVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gSWYgb24gXFxgbWFpblxcYCwgY3JlYXRlIGEgbmV3IGJyYW5jaDsgb3RoZXJ3aXNlIHdvcmsgb24gdGhlIGN1cnJlbnQgYnJhbmNoLlxuLSBSdW4gXFxgZ2l0XFxgIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUgdG8gYXZvaWQgXFxgaW5kZXgubG9ja1xcYCBjb25mbGljdHMuXG4tIFdyaXRlIGEgdGVzdCBvbmx5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQsIG9yIHdoZW4gYSBiZWhhdmlvciBpcyBib3RoIGxpa2VseSB0byByZWdyZXNzIEFORCBoYXMgbm8gb3RoZXIgYXV0b21hdGljIHNhZmVndWFyZCAodHlwZSBjaGVja2luZywgbGludGluZywgb3IgYW4gZXhpc3RpbmcgdGVzdC9DSSBjaGVjayB3b3VsZCBub3QgY2F0Y2ggdGhlIGJyZWFrYWdlKS4gU2tpcCB0aGUgdGVzdCB3aGVuIGFuIGV4aXN0aW5nIHNpZ25hbCBhbHJlYWR5IGNhdGNoZXMgdGhlIHJlZ3Jlc3Npb24sIHdoZW4gdGhlIGltcGxlbWVudGF0aW9uIG1lcmVseSBtYXBzIGNvbmRpdGlvbnMgdG8gY29uc3RhbnQgb3V0cHV0cyBzbyBhIHRlc3Qgd291bGQgcmVzdGF0ZSB0aGF0IG1hcHBpbmcgYW5kIGZhaWwgb25seSBvbiBpbnRlbnRpb25hbCBlZGl0cyAoYSBjaGFuZ2UgZGV0ZWN0b3IpLCBvciB3aGVuIHlvdSBhcmUgb25seSBjb25maXJtaW5nIGFuIGV4dGVybmFsIGZhY3QgKGEgbGlicmFyeSdzIGJlaGF2aW9yLCB3aGV0aGVyIGEgdmVyc2lvbiBmaXhlcyBhbiBpc3N1ZSk7IHZlcmlmeSB0aGUgbGF0dGVyIHR3byBvbmNlIG1hbnVhbGx5IGluc3RlYWQgb2YgYWRkaW5nIGEgcGVybWFuZW50IHRlc3QuXG4tIFdoZW4gd3JpdGluZyB0ZXN0cywgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIFRlc3QgZXh0ZXJuYWxseSBvYnNlcnZhYmxlIGJlaGF2aW9yIChlLmcuLCBlbWl0dGVkIGZpbGVzLCBDTEkgb3V0cHV0LCByZW5kZXJlZCByZXN1bHRzKSBhdCB0aGUgc3lzdGVtIGJvdW5kYXJ5LCBub3QgaW1wbGVtZW50YXRpb24gZGV0YWlsczogZG8gbm90IG1pcnJvciBwcm9kdWN0aW9uIGxvZ2ljLCBhc3NlcnQgdGhhdCBhIGJyYW5jaCBpcyB0YWtlbiwgb3IgZmVlZCBoYW5kLWFzc2VtYmxlZCBpbnRlcm5hbCBvYmplY3RzIHRvIGludGVybmFsIGZ1bmN0aW9ucy5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAtIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4gIC0gQXZvaWQgZml4ZWQgd2FpdHMgaW4gRTJFIHRlc3RzOyB3YWl0IGZvciBjb25kaXRpb25zIGluc3RlYWQuXG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRlc3RzIGFuZC9vciBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeVxcYCAodHlwZSBjaGVja2luZyBhbmQgbGludGluZzsgdGFrZXMgdXAgdG8gMTAgbWludXRlcyksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnktZnVsbFxcYCAoYWxsIHRlc3RzOyB0YWtlcyB1cCB0byAxIGhvdXIpIGlmIHlvdSBjaGFuZ2VkIHJ1bnRpbWUgYmVoYXZpb3Igb3IgdGVzdHMuIEZpeCBlcnJvcnMgYW5kIHJlLXJ1biB1bnRpbCBpdCBwYXNzZXMuXG4gIC0gQWdlbnQgc2hlbGxzIG1heSB0ZXJtaW5hdGUgdHJhY2tlZCBjb21tYW5kcyAoaW5jbHVkaW5nIGJhY2tncm91bmQgb25lcykgYXQgdGltZSBsaW1pdHMsIG9mdGVuIG1pbnV0ZXMsIHNvIHJ1biBjb21tYW5kcyB0aGF0IGNhbiBleGNlZWQgeW91ciBzaGVsbC1jYWxsIHRpbWVvdXQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnlcXGAgYW5kIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnktZnVsbFxcYCkgZGV0YWNoZWQgdmlhIG5vaHVwLCBmcm9tIGEgc2hlbGwgY2FsbCB0aGF0IHJldHVybnMgaW1tZWRpYXRlbHk6IFxcYG1rZGlyIC1wIC50bXA7IHJtIC1mIC50bXAvdmVyaWZ5LWZ1bGwuZXhpdDsgbm9odXAgc2ggLWMgJyR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnktZnVsbDsgZWNobyAkPyA+IC50bXAvdmVyaWZ5LWZ1bGwuZXhpdCcgPiAudG1wL3ZlcmlmeS1mdWxsLmxvZyAyPiYxICZcXGAgKHRoZSByZWRpcmVjdHMgYXJlIHJlcXVpcmVkOiBhbiBpbmhlcml0ZWQgc3Rkb3V0L3N0ZGVyciBwaXBlIHdvdWxkIGtlZXAgdGhlIGNhbGwgd2FpdGluZykuIFBvbGwgZnJvbSBzZXBhcmF0ZSBjYWxscywgZWFjaCBzaG9ydGVyIHRoYW4geW91ciBzaGVsbC1jYWxsIHRpbWVvdXQ6IFxcYGZvciBpIGluIDEgMiAzOyBkbyB0ZXN0IC1mIC50bXAvdmVyaWZ5LWZ1bGwuZXhpdCAmJiBicmVhazsgc2xlZXAgMjA7IGRvbmU7IGNhdCAudG1wL3ZlcmlmeS1mdWxsLmV4aXQgMj4vZGV2L251bGwgfHwgZWNobyBzdGlsbCBydW5uaW5nXFxgLiBSZXBlYXQgdW50aWwgdGhlIGV4aXQgZmlsZSBhcHBlYXJzIChpdHMgY29udGVudCBpcyB0aGUgZXhpdCBjb2RlKSwgdGhlbiByZWFkIHRoZSBsb2c7IGlmIGl0IG5ldmVyIGFwcGVhcnMgd2hpbGUgdGhlIGxvZyBzdG9wcyBncm93aW5nLCB0aGUgcnVuIGl0c2VsZiBkaWVkLlxuLSBPbmNlIHZlcmlmaWVkLCBjb21taXQgYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIGFuZCBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAgaWYgbm9uZSBleGlzdHMgZm9yIHRoZSBicmFuY2guXG4gIC0gRm9sbG93IHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBmb3JtYXQgKGUuZy4sIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgKS4ke2NvQXV0aG9ySW5zdHJ1Y3Rpb259XG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0czsgYXZvaWQgXFxgLS1hbWVuZFxcYC4ke3ByVGVtcGxhdGVJbnN0cnVjdGlvbn0ke2lzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbn1cbi0gSW4gYW55IGV4cGxhbmF0b3J5IHRleHQgKGNvbW1pdCBtZXNzYWdlcywgUFIgZGVzY3JpcHRpb25zLCBkb2N1bWVudGF0aW9uLCBjb2RlIGNvbW1lbnRzLCBldGMuKSwgZGVzY3JpYmUgb25seSB3aGF0IGV4aXN0cyBpbiB0aGUgZmluYWwgc25hcHNob3Q6IG5ldmVyIG1lbnRpb24gc3ltYm9scyBvciBjb25jZXB0cyB0aGF0IHdlcmUgYWRkZWQgYW5kIGxhdGVyIHJlbW92ZWQgb3IgcmVuYW1lZCBhbG9uZyB0aGUgd2F5LCBldmVuIGlmIHRoZXkgbWF0dGVyZWQgZHVyaW5nIHRoZSB3b3JrLiBJZiB5b3UgY2Fubm90IGNvbmZpcm0gdGhhdCBhbiBpZGVudGlmaWVyIG9yIGZlYXR1cmUgbmFtZSB5b3UgYXJlIGFib3V0IHRvIHdyaXRlIGV4aXN0cyBpbiB0aGUgZmluYWwgZGlmZiBvciB0aGUgY3VycmVudCBjb2RlYmFzZSwgZHJvcCB0aGF0IHN0YXRlbWVudC5cbi0gVXNlIGhlcmVkb2MgZm9yIG11bHRpLWxpbmUgY29tbWFuZCBpbnB1dCAoZS5nLiwgXFxgZ2l0IGNvbW1pdCAtRiAtXFxgLCBcXGBnaCBwciBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCwgXFxgZ2ggaXNzdWUgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uXG4tIFxcYEFHRU5UUy5tZFxcYCwgXFxgQ0xBVURFLm1kXFxgLCBcXGBHRU1JTkkubWRcXGAsIFxcYC5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGNcXGAsIGFuZCBcXGAuZ2VtaW5pL3N0eWxlZ3VpZGUubWRcXGAgYXJlIGdlbmVyYXRlZCBmcm9tIFxcYEFHRU5UU19FWFRSQS5tZFxcYCBhbmQgb3ZlcndyaXR0ZW4gb24gZXZlcnkgXFxgd2JmeVxcYCBydW47IGVkaXQgb25seSBcXGBBR0VOVFNfRVhUUkEubWRcXGAgdG8gY2hhbmdlIGFnZW50IGluc3RydWN0aW9ucy4ke21pc2VJbnN0cnVjdGlvbn0ke2lzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9ufSR7Zm5veEluc3RydWN0aW9ufSR7Y2xvdWRmbGFyZUluc3RydWN0aW9ufSR7cmFpbHdheUluc3RydWN0aW9ufSR7cGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZywgYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gVGF1cmkgZGVza3RvcCBhcHBzIHNoaXAgV2luZG93cyBidWlsZHMsIGFuZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBhcHAgY29kZSBhbmQgc2hhcmVkIGNvZGUgaXNcbiAgLy8gdG9vIGZ1enp5IHRvIHNjb3BlIHRoZSBtYWNPUy9MaW51eC1vbmx5IHJ1bGUgcGVyIHBhY2thZ2UsIHNvIHN1Y2ggcmVwb3NpdG9yaWVzIHRhcmdldCBhbGxcbiAgLy8gdGhyZWUgT1NlcyBpbnN0ZWFkLlxuICBjb25zdCBoYXNEZXNrdG9wQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy50YXVyaSB8fCBjLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKTtcbiAgLy8gQSBwdWJsaWMgcmVwb3NpdG9yeSB3aXRoIG5vIGBAd2lsbGJvb3N0ZXIvYCBwYWNrYWdlIGlzIE9TUyBmb3IgdGhlIGdlbmVyYWwgcHVibGljLCB3aG9zZSB1c2Vyc1xuICAvLyBtYXkgcnVuIFdpbmRvd3MsIHNvIG5vIE9TIHJlc3RyaWN0aW9uIGFwcGxpZXMgdGhlcmUuIEFuIHVua25vd24gdmlzaWJpbGl0eSBjb2xsYXBzZXMgdG9cbiAgLy8gaXNQdWJsaWNSZXBvPWZhbHNlIGFuZCB0aGVyZWZvcmUga2VlcHMgdGhlIHJlc3RyaWN0aXZlIGRlZmF1bHQuXG4gIGNvbnN0IGlzR2VuZXJhbFB1YmxpY09zcyA9XG4gICAgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWxsQ29uZmlncy5ldmVyeSgoYykgPT4gIWMucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIGNvbnN0IG9zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9uID0gaXNHZW5lcmFsUHVibGljT3NzXG4gICAgPyAnJ1xuICAgIDogaGFzRGVza3RvcEFwcFxuICAgICAgPyAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MsIG1hY09TLCBhbmQgTGludXguJ1xuICAgICAgOiAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSBvbmx5IHdpdGggbWFjT1MgYW5kIExpbnV4OyBkbyBub3QgaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIGNvZGUuJztcbiAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGV4ZWN1dGUgYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgYXJlIG5vdCBndWFyYW50ZWVkXG4gIC8vIHRvIGhpdCB0aGUgc2FtZSBpbnN0YW5jZSwgc28gdGhlIHNpbmdsZS1pbnN0YW5jZSBzaW1wbGlmaWNhdGlvbiBzaWxlbnRseSBsb3NlcyBzdGF0ZSB0aGVyZSDigJRcbiAgLy8gYnV0IFdvcmtlcnMgZGVsaWJlcmF0ZWx5IHJldXNlIGV4ZWN1dGlvbiBjb250ZXh0cywgc28gYmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgc3RheVxuICAvLyBsZWdpdGltYXRlIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy9yZWZlcmVuY2UvaG93LXdvcmtlcnMtd29ya3MvKS4gVGhlXG4gIC8vIHNpZ25hbHMgYXJlIGNvcnJlbGF0ZWQgUEVSIFBBQ0tBR0U6IGEgbW9ub3JlcG8gY2FuIGhvc3QgYSBzaW5nbGUtaW5zdGFuY2Ugc2VydmVyIGFwcCBuZXh0IHRvXG4gIC8vIGFuIHVucmVsYXRlZCBXb3JrZXIsIGFuZCBuZWl0aGVyIG1heSBvdmVycmlkZSB0aGUgb3RoZXIncyBydWxlLiBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnIGlzXG4gIC8vIHRoZSBhY2N1cmF0ZSBXb3JrZXJzIHNpZ25hbCAoaXNDbG91ZGZsYXJlIGFsc28gbWF0Y2hlcyBhIG1lcmUgd3JhbmdsZXIgbWVudGlvbiBpbiBhIHNjcmlwdCBvclxuICAvLyB3b3JrZmxvdykuXG4gIGNvbnN0IGhhc1dvcmtlcnNBcHAgPSBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIGNvbnN0IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwID0gYWxsQ29uZmlncy5zb21lKFxuICAgIChjKSA9PiAoYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpICYmICFjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWdcbiAgKTtcbiAgY29uc3Qgd29ya2Vyc0luc3RydWN0aW9uID1cbiAgICAnLSBDbG91ZGZsYXJlIFdvcmtlcnMgcnVuIGFjcm9zcyBtdWx0aXBsZSBlcGhlbWVyYWwgaXNvbGF0ZXMgYW5kIHR3byByZXF1ZXN0cyBtYXkgaGl0IGRpZmZlcmVudCBpbnN0YW5jZXM6IG5ldmVyIGxldCBjb3JyZWN0bmVzcyBkZXBlbmQgb24gbW9kdWxlLWxldmVsIG11dGFibGUgc3RhdGU7IHBlcnNpc3QgYXV0aG9yaXRhdGl2ZSBzaGFyZWQgc3RhdGUgaW4gYmluZGluZ3MgKEQxLCBLViwgUjIsIER1cmFibGUgT2JqZWN0cykuIEJlc3QtZWZmb3J0IGlzb2xhdGUtbG9jYWwgY2FjaGVzIG9mIG5vbi1yZXF1ZXN0LXNjb3BlZCBkYXRhIGFyZSBmaW5lLic7XG4gIGNvbnN0IHNlcnZlckluc3RhbmNlSW5zdHJ1Y3Rpb24gPSBoYXNXb3JrZXJzQXBwXG4gICAgPyBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyBgJHt3b3JrZXJzSW5zdHJ1Y3Rpb259IFRoaXMgYXBwbGllcyB0byBhbGwgY29kZSB0aGF0IHJ1bnMgb24gQ2xvdWRmbGFyZSBXb3JrZXJzICh0aGUgd3JhbmdsZXItY29uZmlndXJlZCBwYWNrYWdlcyBhbmQgYW55IHdvcmtzcGFjZSBwYWNrYWdlIHRoZXkgaW1wb3J0KTsgYXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIG90aGVyIHNlcnZlciBhcHBzLmBcbiAgICAgIDogd29ya2Vyc0luc3RydWN0aW9uXG4gICAgOiBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyAnLSBBc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLidcbiAgICAgIDogJyc7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZpbGUgbmFtZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCAoUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIG1vZHVsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaGlnaCBjb2hlc2lvbiBhbmQgbG93IGNvdXBsaW5nOyBzcGxpdCBsYXJnZSBtb2R1bGVzIHdoZW4gbmVlZGVkLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCAodG9wLWRvd24gb3JkZXIpOyBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgYWJvdmUgdGhlaXIgdXNhZ2UuXG4tIFdyaXRlIGNvbW1lbnRzIGFuZCBKU0RvYyBvbmx5IGZvciBoYXJkLXRvLXVuZGVyc3RhbmQgY29kZTogZXhwbGFpbiBcIndoeVwiIGluIGNvbW1lbnRzIGFuZCBcIndoYXRcIiBpbiBKU0RvYy5cbi0gTmV2ZXIgZXhwbGFpbiBob3cgV2lsbEJvb3N0ZXIncyBpbi1ob3VzZSB0b29scyAoZS5nLiwgXFxgd2JcXGAsIFxcYHdiZnlcXGApIHdvcmsgaW4gY29kZSBjb21tZW50cyBvciBkb2N1bWVudHMgb3V0c2lkZSB0aGUgdG9vbCdzIG93biBwYWNrYWdlLCBleGNlcHQgaW4gaW5zdHJ1Y3Rpb25zIGZvciBBSSBhZ2VudHM7IGUuZy4sIGRvIG5vdCBub3RlIHRoYXQgXFxgUE9SVFxcYCBpcyB1bnNldCBiZWNhdXNlIFxcYHdiXFxgIHBpY2tzIGEgZnJlZSBwb3J0LlxuLSBJZiBsaW50IGVycm9ycyBvciB3YXJuaW5ncyBjYW5ub3QgYmUgZml4ZWQsIHVzZSBpZ25vcmUgY29tbWVudHMgd2l0aCByZWFzb25zIChlLmcuLCBcXGAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgPHJ1bGU+IC0tIDxyZWFzb24+XFxgKS5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBXaGVuIHZhbGlkYXRpbmcgSmF2YVNjcmlwdCBvYmplY3RzIChlLmcuLCBwYXJzZWQgSlNPTiwgQVBJIHJlc3BvbnNlcyksIGFsd2F5cyB1c2UgXFxgem9kXFxgIGlmIHBvc3NpYmxlIGluc3RlYWQgb2YgaGFuZC13cml0dGVuIGNoZWNrcyBvciB0eXBlIGFzc2VydGlvbnMuXG4tIEJ1aWxkIHByb21wdHMgYXMgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCBvbiBhIHByZS1jb21wdXRhYmxlIGFycmF5IG9mIHN0cmluZ3MuXG4tIEFzc3VtZSBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBkZWZpbmVkOyBpZiB2YWxpZGF0aW9uIGlzIG5lZWRlZCwgXFxgYXNzZXJ0XFxgIGF0IHN0YXJ0dXAgdG8gZmFpbCBmYXN0LlxuLSBBc3N1bWUgbG9jYWwgdG9vbHMgc3VjaCBhcyBcXGBnaXRcXGAsIFxcYGdoXFxgLCBhbmQgXFxgZ2hxXFxgIGFyZSBpbnN0YWxsZWQgYW5kIGF1dGhlbnRpY2F0ZWQuXG4ke29zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9ufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGFkZGluZyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgcmVnaXN0ZXIgdGhlbSBpbiB0aGUgXFxgaTE4blxcYCByZXNvdXJjZSBmaWxlcyAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKSBhbmQgcmVmZXJlbmNlIHRoZW0gdmlhIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkgKGUuZy4sIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGApLmBcbiAgICA6ICcnXG59XG5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpXG4gICAgPyBgLSBQcmVmZXIgbGFtYmRhIG92ZXIgXFxgZnVuY3Rpb25cXGAgZm9yIFJlYWN0IGNvbXBvbmVudHMsIGUuZy4sIFxcYGNvbnN0IEJ1dHRvbjogUmVhY3QuRkMgPSAoKSA9PiB7XFxgLlxuLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgb3ZlciBcXGB1c2VTdGF0ZVxcYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLlxuLSBVc2UgXFxgYXV0b0ZvY3VzXFxgIHdoZXJlIGl0IHJlZHVjZXMgdXNlciBlZmZvcnQuYFxuICAgIDogJydcbn1cbiR7XG4gIC8vIHZpbmV4dCBpcyB0aGUgb3JnJ3MgY3VycmVudCB3ZWItYXBwIGZyYW1ld29yayBhbmQgZW5hYmxlcyB0aGUgUmVhY3QgQ29tcGlsZXIganVzdCBhcyBOZXh0LmpzXG4gIC8vIGRvZXMsIHNvIGl0IG11c3Qgbm90IG1pc3MgdGhpcyBydWxlLlxuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYFxuLSBUaGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHNvIFxcYHVzZUNhbGxiYWNrXFxgIGFuZCBcXGB1c2VNZW1vXFxgIGFyZSB1bm5lY2Vzc2FyeSBmb3IgcGVyZm9ybWFuY2UuXG5gXG4gICAgOiAnJ1xufVxuJHtzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9ufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpO1xufVxuIiwiIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHJlbGVhc2VBZ2VHYXRlIGZyb20gJy4uLy4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9O1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICAgIGdsb2JhbFN0b3JlPzogYm9vbGVhbjtcbiAgICBsaW5rZXI/OiBzdHJpbmc7XG4gIH07XG59XG5cbi8vIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiBpcyB0aGUgb3JnYW5pemF0aW9uJ3Mgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHBvbGljeTogdGhlXG4vLyBtYWNoaW5lcycgZ2xvYmFsIGNvbmZpZ3MgZ2V0IGl0IHRocm91Z2ggY29uZmlncy9hcHBseVJlbGVhc2VBZ2VHYXRlLnNoIChydW4gYnkgd2JmeSBpdHNlbGYsIGJ5XG4vLyByZXVzYWJsZS13b3JrZmxvd3Mgb24gQ0ksIGFuZCBieSBzZWxmLWhvc3QtdXRpbHMgb24gdGhlIHJ1bm5lcnMpLCBhbmQgcmVwb3NpdG9yaWVzIGdldCBpdCBoZXJlLlxuLy8gT25seSBvdXIgb3duIHBhY2thZ2VzIGFyZSBleGVtcHQ6IHdlIGNvbnRyb2wgd2hvIHB1Ymxpc2hlcyB0aGVtLCBzbyBhIGNvbXByb21pc2VkIHJlbGVhc2UgY2Fubm90XG4vLyByZWFjaCB1cyB0aHJvdWdoIGFuIHVwc3RyZWFtIG1haW50YWluZXIncyBzdG9sZW4gY3JlZGVudGlhbHMuIFRoYXQgY292ZXJzIGV2ZXJ5XG4vLyBAd2lsbGJvb3N0ZXItcHJpdmF0ZSBwYWNrYWdlICh0aGUgc2NvcGUgcmVzb2x2ZXMgb25seSBmcm9tIG91ciBvd24gcmVnaXN0cnkpLCBidXQgYnVuLCBucG0sIGFuZFxuLy8gWWFybiBtYXRjaCBleGNsdWRlIGVudHJpZXMgYnkgZXhhY3QgbmFtZSDigJQgbm8gQHNjb3BlLyogcGF0dGVybnMg4oCUIHNvIGVhY2ggbmV3IHBhY2thZ2UgaW4gdGhlXG4vLyBzY29wZSBtdXN0IGJlIGFkZGVkIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiB3aGVuIGl0IGlzIGZpcnN0IHB1Ymxpc2hlZC4gVGhpcmQtcGFydHlcbi8vIHBhY2thZ2VzIOKAlCBpbmNsdWRpbmdcbi8vIHRvb2xpbmcgd2JmeSBwaW5zIGl0c2VsZiDigJQgc3RheSBhZ2UtZ2F0ZWQ7IGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24gaW4gcGFja2FnZUpzb24udHNcbi8vIHBpbnMgdGhlIG5ld2VzdCByZWxlYXNlIG9sZCBlbm91Z2ggdG8gcGFzcyB0aGUgZ2F0ZSwgc28gcGlubmluZyBrZWVwcyB3b3JraW5nIHdpdGhvdXQgYW4gZXhlbXB0aW9uLlxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyA9IHJlbGVhc2VBZ2VHYXRlLmRheXMgKiAyNCAqIDYwICogNjA7XG5leHBvcnQgY29uc3QgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IHJlbGVhc2VBZ2VHYXRlLmV4Y2x1ZGVzO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcGFyc2VCdW5maWdUb21sKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk/Lmluc3RhbGw/Lmdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKFxuICBjb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHNraXBEZXBzOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVmYXVsdFVzZUdsb2JhbFN0b3JlID0gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlncyk7XG4gIHJldHVybiBza2lwRGVwcyA/IChwcmV2aW91c0dsb2JhbFN0b3JlID8/IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSkgOiBkZWZhdWx0VXNlR2xvYmFsU3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VCdW5HbG9iYWxTdG9yZShjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgLy8gQmxpdHogYnVpbGRzIG9uIE5leHQuanMgYnV0IG5lZWQgbm90IGRlY2xhcmUgaXQgZGlyZWN0bHksIGFuZCBpdHMgY29kZWdlbiBhbHNvIHBhdGNoZXMgTmV4dFxuICAvLyBpbnNpZGUgbm9kZV9tb2R1bGVzLiBCb3RoIGZyYW1ld29ya3MgdGhlcmVmb3JlIHJlcXVpcmUgcHJvamVjdC1sb2NhbCBpc29sYXRlZCBpbnN0YWxscy5cbiAgLy8gU2xpZGV2IGxvYWRzIG9wdGlvbmFsIFZ1ZSBjb21waWxlciBwZWVycyB0aHJvdWdoIGxvY2FsLXBrZy4gVGhlIGdsb2JhbCBzdG9yZSByZWFscGF0aHNcbiAgLy8gbG9jYWwtcGtnIG91dHNpZGUgdGhlIHByb2plY3QsIHNvIE5vZGUgY2Fubm90IHJlc29sdmUgYSBjb21waWxlciBkZWNsYXJlZCBieSB0aGUgcHJvamVjdC5cbiAgcmV0dXJuICFjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5zbGlkZXYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCwgdXNlR2xvYmFsU3RvcmUpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLCB1c2VHbG9iYWxTdG9yZTogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgLy8gbWluaW11bVJlbGVhc2VBZ2UgYW5kIG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgYXJlIG9yZyBwb2xpY3ksIG5ldmVyIHJlcG9zaXRvcnkgcG9saWN5OiBib3RoXG4gIC8vIGFyZSByZXdyaXR0ZW4gdG8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uJ3MgdmFsdWVzIG9uIGV2ZXJ5IHJ1biwgc28gYSBoYW5kLWVkaXRlZCAod2Vha2VuZWQpXG4gIC8vIGdhdGUgY2Fubm90IHN1cnZpdmUgcmVnZW5lcmF0aW9uLiBEcm9wcGluZyByZXBvc2l0b3J5LXNwZWNpZmljIGV4Y2x1ZGUgZW50cmllcyBpcyBmYWlsLXNhZmUg4oCUIGFuXG4gIC8vIHVuY292ZXJlZCBwYWNrYWdlIGJlY29tZXMgYWdlLWdhdGVkIGFuZCBzdXJmYWNlcyBhdCBpbnN0YWxsIHRpbWUgaW5zdGVhZCBvZiB3ZWFrZW5pbmcgdGhlIGdhdGUuXG4gIC8vIFR1cmJvcGFjayByZWplY3RzIGdsb2JhbC1zdG9yZSBzeW1saW5rcyBiZWNhdXNlIHRoZXkgcmVzb2x2ZSBvdXRzaWRlIGl0cyBmaWxlc3lzdGVtIHJvb3QuXG4gIC8vIEtlZXBpbmcgTmV4dC5qcyBpbnN0YWxscyBwcm9qZWN0LWxvY2FsIGF2b2lkcyB3aWRlbmluZyB0aGF0IHJvb3QgdG8gJEhPTUUgKG9yIGAvYCBpbiBEb2NrZXIpLFxuICAvLyB3aGljaCB3b3VsZCBleHBhbmQgZGV2ZWxvcG1lbnQgZmlsZXN5c3RlbSB3YXRjaGluZyBhbmQgYnlwYXNzIHRoZSBib3VuZGFyeSdzIGNhY2hlIGJlbmVmaXRzLlxuICBjb25zdCBnbG9iYWxTdG9yZUxpbmUgPSB1c2VHbG9iYWxTdG9yZSA/ICdnbG9iYWxTdG9yZSA9IHRydWUnIDogJ2dsb2JhbFN0b3JlID0gZmFsc2UnO1xuICAvLyBObyBgW3J1bl0gYnVuID0gdHJ1ZWA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzXG4gIC8vIHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpOyBhbnkgZXhpc3Rpbmcgc2V0dGluZyBpcyBkcm9wcGVkLlxuICAvLyBwdWJsaWNIb2lzdFBhdHRlcm4g4oCUIHRzeDogYnVpbGQtdHMgdW5kZXIgTm9kZS5qcyBzcGF3bnMgYG5vZGUgLS1pbXBvcnQgdHN4YCwgd2hpY2ggcmVzb2x2ZXNcbiAgLy8gdHN4IGZyb20gdGhlIGNvbnN1bWVyIHBhY2thZ2UncyBkaXJlY3RvcnksIG5vdCBmcm9tIGJ1aWxkLXRzJ3Mgb3duIGRlcGVuZGVuY2llcy5cbiAgLy8gdW5kaWNpLXR5cGVzOiBidW4tdHlwZXMgcmVmZXJlbmNlcyBpdCB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KTtcbiAgLy8gZ2VuZXJhdGVkIHRzY29uZmlncyBhbHNvIG1hcCB1bmRpY2ktdHlwZXMgdG8gdGhlIGhvaXN0ZWQgY29weSAoc2VlIHRzY29uZmlnLnRzKSBiZWNhdXNlIHRoZVxuICAvLyBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzIGJ1bi10eXBlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2V4dHJhY3RSYXdUZXN0U2VjdGlvbnMoZXhpc3RpbmdDb250ZW50KX1baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxuJHtnbG9iYWxTdG9yZUxpbmV9XG5saW5rZXIgPSBcImlzb2xhdGVkXCJcbnB1YmxpY0hvaXN0UGF0dGVybiA9IFtcInRzeFwiLCBcInVuZGljaS10eXBlc1wiXVxubWluaW11bVJlbGVhc2VBZ2UgPSAke2J1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kc31cbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke2J1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuLyoqXG4gKiBQcmVzZXJ2ZSB0aGUgcHJvamVjdCdzIGBbdGVzdF1gIHNlY3Rpb25zIChlLmcuIHByZWxvYWQgc2NyaXB0cyBzd2FwcGluZyBhIENsb3VkZmxhcmUgRDEgY2xpZW50XG4gKiBmb3IgYSBsb2NhbCBTUUxpdGUgb25lKSB2ZXJiYXRpbSwgY29tbWVudHMgaW5jbHVkZWQ7IHdiZnkgbWFuYWdlcyBvbmx5IHRoZSBvdGhlciBzZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSYXdUZXN0U2VjdGlvbnMoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50KSByZXR1cm4gJyc7XG5cbiAgY29uc3QgcHJlc2VydmVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpblRlc3RTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHNlY3Rpb25NYXRjaCA9IC9eXFxzKlxcWyhbXlxcXV0rKVxcXS8uZXhlYyhsaW5lKTtcbiAgICBpZiAoc2VjdGlvbk1hdGNoKSB7XG4gICAgICBpblRlc3RTZWN0aW9uID0gc2VjdGlvbk1hdGNoWzFdID09PSAndGVzdCcgfHwgKHNlY3Rpb25NYXRjaFsxXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoJ3Rlc3QuJyk7XG4gICAgfVxuICAgIGlmIChpblRlc3RTZWN0aW9uICYmIGxpbmUudHJpbSgpKSB7XG4gICAgICBwcmVzZXJ2ZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlc2VydmVkTGluZXMubGVuZ3RoID4gMCA/IGAke3ByZXNlcnZlZExpbmVzLmpvaW4oJ1xcbicpfVxcblxcbmAgOiAnJztcbn1cblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZSBkZXBsb3lzIEdpdC1iYXNlZCBwcml2YXRlIHBhY2thZ2VzIGZyb20gbm9kZV9tb2R1bGVzLCBidXQgdGhlIERvY2tlciBjb250ZXh0IHNob3VsZCBzdGF5IG5hcnJvdy5cbmNvbnN0IGluY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJucyA9IFsnQHdpbGxib29zdGVyJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4uZW52KlxuKiovLkRTX1N0b3JlXG4qKi8uY2FjaGVcbioqLy5jbGF1ZGVcbioqLy5jdXJzb3JcbioqLy5lZGl0b3Jjb25maWdcbioqLy5lc2xpbnRjYWNoZVxuKiovLmdlbWluaVxuKiovLmdpdFxuKiovLmdpdGF0dHJpYnV0ZXNcbioqLy5naXRodWJcbioqLy5naXRpZ25vcmVcbioqLy5pZGVhXG4qKi8ubGVmdGhvb2tcbioqLy5teXB5X2NhY2hlXG4qKi8ubmV4dC9jYWNoZVxuKiovLm5wbVxuKiovLnBhcmNlbC1jYWNoZVxuKiovLnBucG0tc3RvcmVcbioqLy5weXRlc3RfY2FjaGVcbioqLy5yYWlsd2F5aWdub3JlXG4qKi8ucmVsZWFzZXJjLmpzb25cbioqLy5ydWZmX2NhY2hlXG4qKi8udG1wXG4qKi8udG1wLSovKipcbioqLy50dXJib1xuKiovLnRveFxuKiovLnZzY29kZVxuKiovLnlhcm4vY2FjaGVcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG4qKi9fX3B5Y2FjaGVfX1xuKiovKi5sb2dcbioqLyoucHljXG4qKi8qLnRzYnVpbGRpbmZvXG4qKi9jb3ZlcmFnZVxuKiovbm9kZV9tb2R1bGVzLyoqXG4ke2luY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJuc1xuICAubWFwKFxuICAgIChwYXR0ZXJuKSA9PiBgISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59XG4hKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn0vKipgXG4gIClcbiAgLmpvaW4oJ1xcbicpfVxuKiovbm9kZV9tb2R1bGVzLy5jYWNoZVxuKiovcGxheXdyaWdodC1yZXBvcnRcbioqL3N0b3J5Ym9vay1zdGF0aWNcbioqL3RhcmdldFxuKiovdGVzdC1yZXN1bHRzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIG94bGludDogWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10udG9Tb3J0ZWQoKSxcbiAgb3hmbXQ6IFtcbiAgICAnYXN0cm8nLFxuICAgICdjanMnLFxuICAgICdjc3MnLFxuICAgICdjdHMnLFxuICAgICdncWwnLFxuICAgICdncmFwaHFsJyxcbiAgICAnaGJzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ2pzJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdqc3gnLFxuICAgICdsZXNzJyxcbiAgICAnbWQnLFxuICAgICdtZHgnLFxuICAgICdtanMnLFxuICAgICdtdHMnLFxuICAgICdzY3NzJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAndG9tbCcsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXJPbmx5OiBbJ2phdmEnXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUsIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueWFtbCcpO1xuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG5cbiAgICBjb25zdCBoYXNOb25DYW5vbmljYWxDb25maWcgPSAhIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChub25DYW5vbmljYWxDb25maWdGaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pKTtcbiAgICBpZiAoaGFzTm9uQ2Fub25pY2FsQ29uZmlnKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtjb25maWdGaWxlUGF0aH0gYmVjYXVzZSAke25vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRofSBpcyBub3QgYSBzdXBwb3J0ZWQgR2VtaW5pIGNvbmZpZyBsb2NhdGlvbi4gUmVuYW1lIGl0IG1hbnVhbGx5LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBoYXNOb25DYW5vbmljYWxDb25maWcgPyB1bmRlZmluZWQgOiBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGNvbmZpZ0ZpbGVQYXRoKTtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvbGRDb25maWcgPSBCdW4uWUFNTC5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgICAgLy8gTWVyZ2Ugb25seSBhIG1hcHBpbmc6IGVtcHR5LCBjb21tZW50LW9ubHksIG9yIHNjYWxhciBZQU1MIHdvdWxkIGVpdGhlciB0aHJvdyBpblxuICAgICAgICAvLyBtZXJnZS5hbGwgb3IgcG9sbHV0ZSB0aGUgY29uZmlnIHdpdGggaW5kZXgga2V5cy5cbiAgICAgICAgaWYgKG9sZENvbmZpZyAmJiB0eXBlb2Ygb2xkQ29uZmlnID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvbGRDb25maWcpKSB7XG4gICAgICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGNhbid0IGJlIHBhcnNlZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0gQnVuLllBTUwuc3RyaW5naWZ5KG5ld0NvbmZpZywgdW5kZWZpbmVkLCAyKTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQoY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnQ/LnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJyMnKSA/IHVuZGVmaW5lZCA6IGV4dHJhQ29udGVudDtcbiAgICBjb25zdCByZXZpZXdMYW5ndWFnZUluc3RydWN0aW9uID0gY29uZmlnLmlzUHVibGljUmVwb1xuICAgICAgPyAnUmV2aWV3IGluIEVuZ2xpc2ggYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjb2Rpbmcgc3RhbmRhcmRzLidcbiAgICAgIDogJ+S7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAgic7XG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSBgJHtyZXZpZXdMYW5ndWFnZUluc3RydWN0aW9ufVxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGNvbmZpZywgYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgLi4uKGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IFtdIDogW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpXSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZ2l0T3V0cHV0TWF4QnVmZmVyID0gNjQgKiAxMDI0ICogMTAyNDtcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuLy8gYC5naXRpZ25vcmUgLXRleHRgIGtlZXBzIHRoZSBtYWNPUyB0ZW1wbGF0ZSdzIGBJY29uXFxyXFxyYCBydWxlIGludGFjdDogYHRleHQ9YXV0b2Agbm9ybWFsaXphdGlvblxuLy8gc3RyaXBzIG9uZSBDUiBwZXIgY2hlY2tpbiwgZGVncmFkaW5nIHRoZSBydWxlIHVudGlsIGl0IG1hdGNoZXMgbm90aGluZy5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuLmdpdGlnbm9yZSAtdGV4dFxuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IG91dHB1dDogc3RyaW5nO1xuICB0cnkge1xuICAgIG91dHB1dCA9IGNoaWxkX3Byb2Nlc3MuZXhlY0ZpbGVTeW5jKCdnaXQnLCBbJ2xzLWZpbGVzJywgJy0tZW9sJywgJy16J10sIHtcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IGdpdE91dHB1dE1heEJ1ZmZlcixcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdHJhY2tlZCBsaW5lLWVuZGluZyByZW5vcm1hbGl6YXRpb246ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgcmVub3JtYWxpemVkQ291bnQgPSAwO1xuICBmb3IgKGNvbnN0IHJlY29yZCBvZiBvdXRwdXQuc3BsaXQoJ1xcMCcpKSB7XG4gICAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSByZWNvcmQuaW5kZXhPZignXFx0Jyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4ID09PSAtMSkgY29udGludWU7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gcmVjb3JkLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICBpZiAoIS9eaVxcLyg/OmNybGZ8bWl4ZWQpXFxzL3UudGVzdChhdHRyaWJ1dGVzKSB8fCAhL2F0dHJcXC8uKlxcYmVvbD0oPzpsZnxjcmxmKSg/Olxcc3wkKS91LnRlc3QoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlY29yZC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIGNvbnN0IHRyYWNrZWRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHN0YXRzID0gZnMubHN0YXRTeW5jKHRyYWNrZWRGaWxlUGF0aCwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgaWYgKCFzdGF0cz8uaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2l0J3Mgc3RhdCBjYWNoZSBjYW4gaGlkZSBwcmUtZXhpc3RpbmcgQ1JMRiBibG9icyBhZnRlciB3YmZ5IGludHJvZHVjZXMgdGV4dCBhdHRyaWJ1dGVzLlxuICAgIC8vIE5vcm1hbGl6ZSBieXRlcyBpbiB0aGUgd29ya3RyZWUgc28gdGhlIGNhbGxlcidzIG5vcm1hbCBgZ2l0IGFkZCAtQWAgcmVjb3JkcyB0aGUgY2Fub25pY2FsXG4gICAgLy8gYmxvYjsgdGhpcyBhbHNvIHByZXZlbnRzIFByZXR0aWVyJ3MgbWV0YWRhdGEgY2FjaGUgZnJvbSBza2lwcGluZyB0aGUgbmV3bHkgY2hhbmdlZCBmaWxlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModHJhY2tlZEZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCwgQnVmZmVyLmZyb20oY29udGVudC50b1N0cmluZygnYmluYXJ5JykucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLCAnYmluYXJ5JykpO1xuICAgIHJlbm9ybWFsaXplZENvdW50Kys7XG4gIH1cbiAgaWYgKHJlbm9ybWFsaXplZENvdW50ID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVub3JtYWxpemVkIGxpbmUgZW5kaW5ncyBpbiAke3Jlbm9ybWFsaXplZENvdW50fSB0cmFja2VkIGZpbGUocykuYCk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG5fX2dlbmVyYXRlZF9fL1xuIS5rZWVwXG4uYWlkZXIqXG4uYW50aWdyYXZpdHljbGkvXG4uY2xhdWRlLyoubG9jYWwuKlxuLmNsYXVkZS9zY2hlZHVsZWRfdGFza3MubG9ja1xuLmRldmNvbnRhaW5lci9cbi5kb2NrZXIuZW52XG4uZW52KlxuLmlkZWEvQXVnbWVudFdlYnZpZXdTdGF0ZVN0b3JlLnhtbFxuLmlkZWEvY29waWxvdC4qXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5wbGF5d3JpZ2h0LWNsaS9cbi5wbGF5d3JpZ2h0LW1jcC9cbi5zZXJlbmEvXG4udG1wL1xuLnRtcC0qL1xuLnRva2Vuc2F2ZS9cbi53Yi9cbkB3aWxsYm9vc3Rlci9cbkB3aWxsYm9vc3Rlci1wcml2YXRlL1xuKi9tb3VudC8qLmhhc2hcbkNMQVVERS5sb2NhbC5tZFxuZGlzdC9cbmRyaXp6bGUvbW91bnQvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGFjY2VwdGVkIHJlcG9zaXRvcnkgcm9vdCByZWNlaXZlcyBhIG1hbmFnZWQgcGFja2FnZS5qc29uIGxhdGVyIGluIHRoZSBzYW1lIHJ1biwgc28gaXRzXG4gICAgLy8gZGVwZW5kZW5jeSB0cmVlIG11c3QgYmUgaWdub3JlZCBldmVuIHdoZW4gdGhlIG1hbmlmZXN0IGRpZCBub3QgZXhpc3QgYXQgY29uZmlnLWRldGVjdGlvbiB0aW1lLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fCBjb25maWcuaXNSb290KSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdCBwb20ueG1sKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIGl0cyBNYXZlblxuICAgIC8vIG1vZHVsZXMgaW4gc3ViZGlyZWN0b3JpZXMsIGFuZCBkcm9wcGluZyB0aGUgbWF2ZW4gdGVtcGxhdGUgd291bGQgbGV0IHRhcmdldC8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbEFueXdoZXJlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeS4gUmVjdXJzaXZlIGRldGVjdGlvbiAobm90IGp1c3QgYSByb290XG4gICAgLy8gbG9ja2ZpbGUpOiBhIG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcnkga2VlcHMgUHl0aG9uIGRpcmVjdG9yaWVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmRcbiAgICAvLyBkcm9wcGluZyB0aGUgcHl0aG9uIHRlbXBsYXRlIHdvdWxkIGxldCBfX3B5Y2FjaGVfXy8gYW5kIC52ZW52LyBnZXQgdHJhY2tlZC5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fCBjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcudGF1cmkpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1c3QnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnKSB7XG4gICAgICAvLyAhQ2FyZ28ubG9jayBvdmVycmlkZXMgYW55IHByZS1leGlzdGluZyB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBmcm9tIGFcbiAgICAgIC8vIHBhcmVudCAuZ2l0aWdub3JlLCBzbyB0aGUgYXBwbGljYXRpb24gbG9ja2ZpbGUgc3RheXMgY29tbWl0dGFibGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCFDYXJnby5sb2NrXG5zcmMtdGF1cmkvZ2VuL3NjaGVtYXMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0Nsb3VkZmxhcmUgfHwgcm9vdENvbmZpZy5pc0Nsb3VkZmxhcmUpIHtcbiAgICAgIC8vIC5kZXYudmFycyogaG9sZCBsb2NhbCBzZWNyZXRzIGZvciB3cmFuZ2xlciBkZXYgYW5kIG11c3QgbmV2ZXIgYmUgY29tbWl0dGVkLlxuICAgICAgLy8gLmVudi5jbG91ZGZsYXJlIGNhcnJpZXMgQ0xPVURGTEFSRV9BUElfVE9LRU46IENJIHdyaXRlcyBpdCBmcm9tIGEgc2VjcmV0LCBhbmQgYSBsb2NhbFxuICAgICAgLy8gYHdiIGRlcGxveWAgbmVlZHMgYSByZWFsIHRva2VuIGluIGl0LCBzbyBjb21taXR0aW5nIGl0IHdvdWxkIGxlYWsgYWNjb3VudCBjcmVkZW50aWFscy5cbiAgICAgIC8vIEl0IGlzIGxpc3RlZCBleHBsaWNpdGx5IHNvIHRoZSBDbG91ZGZsYXJlLXNwZWNpZmljIGNyZWRlbnRpYWwgcG9saWN5IHJlbWFpbnMgdmlzaWJsZS5cbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmRldi52YXJzKlxuLmVudi5jbG91ZGZsYXJlXG4ud3JhbmdsZXIvXG5gO1xuICAgIH1cbiAgICAvLyBJZ25vcmVkIG9ubHkgd2hlcmUgcG9zdGluc3RhbGwgcmVnZW5lcmF0ZXMgaXQsIHNvIHdiZnkgbmV2ZXIgaWdub3JlcyBhIGZpbGUgdGhhdCBub3RoaW5nIHJlY3JlYXRlcy4gVGhpcyBrZWVwc1xuICAgIC8vIGl0cyB0aG91c2FuZHMgb2YgbGluZXMgb3V0IG9mIGV2ZXJ5IHdyYW5nbGVyIGJ1bXAncyBkaWZmLiBBbmNob3JlZCB3aXRoIGEgbGVhZGluZyBzbGFzaCBiZWNhdXNlIGB3cmFuZ2xlciB0eXBlc2BcbiAgICAvLyBhbmQgdGhlIG9wdC1vdXQgZGVsZXRpb24gYmVsb3cgb25seSBldmVyIHRvdWNoIHRoaXMgcGFja2FnZSdzIG93biBmaWxlLCBub3QgYSBuZXN0ZWQgb25lIGF0IGFueSBkZXB0aC5cbiAgICBpZiAoZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAvd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50c1xuYDtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnICYmICFjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIC8vIE9uIGEgZ2VudWluZSB3b3JrZXItdHlwZXMgb3B0LW91dCAobm90aGluZyBjb25zdW1lcyB0aGUgZ2VuZXJhdGVkIGZpbGU7IGdlbmVyYXRlc1dvcmtlclR5cGVzXG4gICAgICAvLyBhbG9uZSBpcyBmYWxzZSBmb3IgdW5yZWxhdGVkIHJlYXNvbnMgc3VjaCBhcyBhIG1pc3NpbmcgbG9jYWwgd3JhbmdsZXIgZGVwZW5kZW5jeSwgd2hlcmUgdGhlXG4gICAgICAvLyBmaWxlIG1heSBzdGlsbCBiZSBjb25zdW1lZCkgdGhlIGlnbm9yZSBydWxlXG4gICAgICAvLyBhYm92ZSBkaXNhcHBlYXJzLCBzbyBhbiBhbHJlYWR5LWdlbmVyYXRlZCBmaWxlIHdvdWxkIHN1cmZhY2UgYXMgdW50cmFja2VkIG5vaXNlIG9uIGV2ZXJ5XG4gICAgICAvLyBjaGVja291dCDigJQgZGVsZXRlIGl0LiBObyByZXBvc2l0b3J5IHRyYWNrcyB0aGUgZmlsZSAoZG9jcy9leHBlY3RlZC1yZXBvc2l0b3J5LXJ1bGVzLm1kKSxcbiAgICAgIC8vIHNvIGFuIGV4aXN0aW5nIGNvcHkgaXMgYWx3YXlzIGEgZGlzcG9zYWJsZSBnZW5lcmF0ZWQgb25lLlxuICAgICAgY29uc3Qgd29ya2VyVHlwZXNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cycpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMod29ya2VyVHlwZXNQYXRoKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0od29ya2VyVHlwZXNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmluZXh0L1xuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiB3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBjYXJyaWVzIGluIHRoZSByZXBvc2l0b3J5LiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCByZXdyaXRlc1xuICogaXQgaW4gdGhlIHB1Ymxpc2hlZCB0YXJiYWxsIG9ubHkgKGl0IGlzIG5ldmVyIGNvbW1pdHRlZCBiYWNrKSwgc28gYSB3YmZ5IHJ1biBzdGFydGVkIGZyb20gYSBnaXRcbiAqIGNoZWNrb3V0IHJlcG9ydHMgdGhpcyBwbGFjZWhvbGRlciBpbnN0ZWFkIG9mIGEgcmVhbCB2ZXJzaW9uLlxuICovXG5jb25zdCB1bnJlbGVhc2VkVmVyc2lvblByZWZpeCA9ICcwLjAuMC0nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb24oKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS52ZXJzaW9uO1xufVxuXG4vKiogd2JmeSdzIGxvY2F0aW9uIGluc2lkZSBpdHMgb3duIHJlcG9zaXRvcnksIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QuICovXG5jb25zdCB3YmZ5RGlyUGF0aEluUmVwbyA9IHBhdGguam9pbigncGFja2FnZXMnLCAnd2JmeScpO1xuXG4vKipcbiAqIElkZW50aWZpZXMgdGhlIHdiZnkgYnVpbGQgdGhhdCBwcm9kdWNlZCB0aGUgZ2VuZXJhdGVkIGZpbGVzOiB0aGUgcmVsZWFzZWQgdmVyc2lvbiwgb3JcbiAqIGA8c2hvcnQgY29tbWl0IGhhc2g+Wy1kaXJ0eV0tbG9jYWxgIHdoZW4gd2JmeSBydW5zIGZyb20gaXRzIG93biBnaXQgY2hlY2tvdXQuIFVuZGVmaW5lZCB3aGVuXG4gKiBuZWl0aGVyIGlzIGF2YWlsYWJsZSAoZS5nLiBhbiB1bnJlbGVhc2VkIGJ1aWxkIGV4dHJhY3RlZCBmcm9tIGEgc291cmNlIGFyY2hpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBOZWl0aGVyIHRoZSBpbnN0YWxsZWQgcGFja2FnZS5qc29uIG5vciB0aGUgZ2l0IHN0YXRlIG9mIHdiZnkncyBvd24gY2hlY2tvdXQgY2FuIGNoYW5nZVxuICAvLyBtaWQtcnVuLCBhbmQgY29tcHV0aW5nIHRoZSBsYWJlbCBzcGF3bnMgc2V2ZXJhbCBnaXQgc3VicHJvY2Vzc2VzLCBzbyBpdCBpcyBjb21wdXRlZCBvbmNlLlxuICBpZiAoIWhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsKSB7XG4gICAgY2FjaGVkVmVyc2lvbkxhYmVsID0gY29tcHV0ZVdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgICBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25MYWJlbDtcbn1cblxubGV0IGhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsID0gZmFsc2U7XG5sZXQgY2FjaGVkVmVyc2lvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiwgZGlyUGF0aCB9ID0gcmVhZFdiZnlQYWNrYWdlSnNvbigpO1xuICBpZiAoIXZlcnNpb24uc3RhcnRzV2l0aCh1bnJlbGVhc2VkVmVyc2lvblByZWZpeCkpIHJldHVybiB2ZXJzaW9uO1xuXG4gIC8vIGdpdCByZXNvbHZlcyB0aGUgTkVBUkVTVCBlbmNsb3NpbmcgcmVwb3NpdG9yeSwgd2hpY2ggZm9yIGFuIHVucmVsZWFzZWQgYnVpbGQgcGxhY2VkIHVuZGVyIGFcbiAgLy8gdGFyZ2V0IHJlcG9zaXRvcnkgKG5vZGVfbW9kdWxlcywgb3IgYSB2ZW5kb3JlZC9leHRyYWN0ZWQgc291cmNlIHRyZWUpIGlzIHRoYXQgcmVwb3NpdG9yeSDigJQgaXRzXG4gIC8vIGNvbW1pdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHdiZnkgYnVpbGQgdGhhdCByYW4uIE9ubHkgd2JmeSdzIG93biBsb2NhdGlvbiBpbnNpZGUgaXRzIG93blxuICAvLyByZXBvc2l0b3J5IGlkZW50aWZpZXMgYSBnZW51aW5lIGNoZWNrb3V0LCBzbyBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2sgdG8gdGhlIHZlcnNpb24tbGVzcyBsYWJlbC5cbiAgY29uc3QgZ2l0Um9vdERpclBhdGggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG93LXRvcGxldmVsJ10sIGRpclBhdGgpO1xuICBpZiAoXG4gICAgIWdpdFJvb3REaXJQYXRoIHx8XG4gICAgcGF0aC5yZWxhdGl2ZShnaXRSb290RGlyUGF0aCwgZGlyUGF0aCkgIT09IHdiZnlEaXJQYXRoSW5SZXBvIHx8XG4gICAgIWlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGgpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgY29tbWl0SGFzaCA9IHJ1bkdpdChbJ3Jldi1wYXJzZScsICctLXNob3J0PTgnLCAnSEVBRCddLCBkaXJQYXRoKTtcbiAgaWYgKCFjb21taXRIYXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBUaGUgY29tbWl0IGFsb25lIHdvdWxkIG1pc2lkZW50aWZ5IGEgYnVpbGQgbWFkZSBmcm9tIGFuIGVkaXRlZCBjaGVja291dCwgc28gdW5jb21taXR0ZWQgY2hhbmdlc1xuICAvLyBhcmUgcmVwb3J0ZWQgdG9vIOKAlCBidXQgb25seSB1bmRlciBwYWNrYWdlcy8qL3NyYywgcGFja2FnZXMvKi9iaW4gYW5kIHBhY2thZ2VzLyovY29uZmlncywgdGhlXG4gIC8vIHNvdXJjZSwgZW50cnktcG9pbnQgd3JhcHBlciBhbmQgcG9saWN5IGZpbGVzIHdiZnkgYW5kIGl0cyB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1blxuICAvLyBmcm9tLiBFdmVyeXRoaW5nIHdiZnkgR0VORVJBVEVTIHdoZW4gaXQgdGFyZ2V0cyBpdHMgb3duIHJlcG9zaXRvcnkgbGl2ZXMgb3V0c2lkZSB0aG9zZSAodGhlXG4gIC8vIHJvb3QgUkVBRE1FIHRoaXMgbGFiZWwgZ29lcyBpbnRvLCBhbmQgZWFjaCBwYWNrYWdlJ3MgLmdpdGlnbm9yZSwgcGFja2FnZS5qc29uLCB0c2NvbmZpZywg4oCmKSwgc29cbiAgLy8gYSBmaXJzdCBydW4gY2Fubm90IG1ha2UgdGhlIG5leHQgb25lIHJlbGFiZWwgdGhlIGJhZGdlIGAtZGlydHktbG9jYWxgIGJ5IGl0c2VsZi5cbiAgLy8gTWFuaWZlc3RzIHN0YXkgb3V0IG9uIHB1cnBvc2UsIGV2ZW4gdGhvdWdoIGFuIGVkaXRlZCBgZXhwb3J0c2AgbWFwIGNhbiByZWRpcmVjdCB3aGljaCBjb2RlXG4gIC8vIGxvYWRzOiB3YmZ5IEdFTkVSQVRFUyBwYWNrYWdlLmpzb24sIHNvIGluY2x1ZGluZyBpdCB3b3VsZCBtYWtlIGV2ZXJ5IHJ1biByZXBvcnQgaXRzZWxmIGRpcnR5LlxuICAvLyBUaGUgbGFiZWwgaXMgYmVzdC1lZmZvcnQgYnVpbGQgcHJvdmVuYW5jZSwgbm90IGEgcmVwcm9kdWNpYmxlLWJ1aWxkIGF0dGVzdGF0aW9uLlxuICBjb25zdCBpc0RpcnR5ID0gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aCk7XG4gIGlmIChpc0RpcnR5ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc0RpcnR5KSByZXR1cm4gYCR7Y29tbWl0SGFzaH0tZGlydHktbG9jYWxgO1xuICAvLyBBbiB1bm1vZGlmaWVkIGNoZWNrb3V0IHNpdHRpbmcgb24gYSByZWxlYXNlIHRhZyBydW5zIGV4YWN0bHkgdGhlIGNvZGUgdGhhdCB3YXMgcHVibGlzaGVkIHVuZGVyXG4gIC8vIHRoYXQgdmVyc2lvbiwgc28gaXQgaXMgbGFiZWxlZCB3aXRoIHRoZSB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGNvbW1pdCB0aGF0IG9ubHkgd2JmeSBkZXZlbG9wZXJzXG4gIC8vIGNvdWxkIHJlc29sdmUgYmFjayB0byBvbmUuXG4gIHJldHVybiBmaW5kUmVsZWFzZWRWZXJzaW9uQXRIZWFkKG5hbWUsIGRpclBhdGgpID8/IGAke2NvbW1pdEhhc2h9LWxvY2FsYDtcbn1cblxuLyoqIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHRhZ3MgZWFjaCByZWxlYXNlIGA8cGFja2FnZSBuYW1lPkA8dmVyc2lvbj5gLiAqL1xuZnVuY3Rpb24gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChwYWNrYWdlTmFtZTogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IGAke3BhY2thZ2VOYW1lfUBgO1xuICAvLyBBIGNvbW1pdCBjYXJyaWVzIGF0IG1vc3Qgb25lIHJlbGVhc2UgdGFnIHBlciBwYWNrYWdlLCBzbyB0aGUgZmlyc3QgbWF0Y2ggaXMgdGhlIG9ubHkgbWF0Y2guXG4gIHJldHVybiBydW5HaXQoWyd0YWcnLCAnLS1wb2ludHMtYXQnLCAnSEVBRCddLCBjd2QpXG4gICAgPy5zcGxpdCgnXFxuJylcbiAgICAuZmluZCgodGFnKSA9PiB0YWcuc3RhcnRzV2l0aCh0YWdQcmVmaXgpKVxuICAgID8uc2xpY2UodGFnUHJlZml4Lmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBFdmVyeSByZW1vdGUgY291bnRzLCBub3QganVzdCBgb3JpZ2luYDogYSBmb3JrIGNoZWNrb3V0IGNhcnJpZXMgdGhlIGNhbm9uaWNhbCByZXBvc2l0b3J5IGFzXG4gIC8vIGB1cHN0cmVhbWAsIGFuZCBpdCBpcyBzdGlsbCBhIGdlbnVpbmUgd2JmeSBjaGVja291dCB3aG9zZSBjb21taXQgaWRlbnRpZmllcyB0aGUgYnVpbGQuXG4gIGNvbnN0IHJlbW90ZVVybHMgPSBydW5HaXQoWydyZW1vdGUnLCAnLXYnXSwgZ2l0Um9vdERpclBhdGgpO1xuICByZXR1cm4gISFyZW1vdGVVcmxzPy5zcGxpdCgnXFxuJykuc29tZSgobGluZSkgPT4gaXNDYW5vbmljYWxSZW1vdGVVcmwobGluZS5zcGxpdCgvWyBcXHRdKy91KVsxXSA/PyAnJykpO1xufVxuXG5jb25zdCBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aCA9IC9eXFwvP1dpbGxCb29zdGVyXFwvc2hhcmVkKD86XFwuZ2l0KT8kL2l1O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbW90ZSBVUkwgcG9pbnRzIGF0IHdiZnkncyBvd24gcmVwb3NpdG9yeS4gVGhlIGhvc3QgaXMgY29tcGFyZWQgYWZ0ZXIgUEFSU0lORyByYXRoZXJcbiAqIHRoYW4gbWF0Y2hlZCBpbnNpZGUgdGhlIHN0cmluZzogYW55IHBhdHRlcm4gbG9vc2UgZW5vdWdoIHRvIGFjY2VwdCBldmVyeSBVUkwgZm9ybSBnaXQgc3VwcG9ydHNcbiAqIGFsc28gYWNjZXB0ZWQgYSBsb29rYWxpa2UgdGhhdCBtZXJlbHkgY29udGFpbnMgdGhlIGhvc3QsIHN1Y2ggYXNcbiAqIGBodHRwczovL2V2aWwuZXhhbXBsZS8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCwgbGV0dGluZyBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQgY2xhaW0gdG9cbiAqIGJlIGEgZ2VudWluZSB3YmZ5IGJ1aWxkLlxuICovXG5mdW5jdGlvbiBpc0Nhbm9uaWNhbFJlbW90ZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBzY3Atc3R5bGUgKGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCkgaXMgbm90IGEgVVJMLCBzbyBpdCBpcyBtYXRjaGVkIHNlcGFyYXRlbHkuXG4gIC8vIFRoZSBsb29rYWhlYWQga2VlcHMgYSBzY2hlbWUncyBgOi8vYCBmcm9tIGJlaW5nIHJlYWQgYXMgdGhlIGBob3N0OnBhdGhgIHNlcGFyYXRvci5cbiAgY29uc3Qgc2NwTWF0Y2ggPSAvXig/OlteQC9dK0ApPyhbXi86XSspOig/IVxcLykoLiopJC91LmV4ZWModXJsKTtcbiAgaWYgKHNjcE1hdGNoKSB7XG4gICAgcmV0dXJuIHNjcE1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbScgJiYgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGgudGVzdChzY3BNYXRjaFsyXSEpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgeyBob3N0bmFtZSwgcGF0aG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3QocGF0aG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbXG4gICAgICAnc3RhdHVzJyxcbiAgICAgICctLXBvcmNlbGFpbicsXG4gICAgICAnLS11bnRyYWNrZWQtZmlsZXM9YWxsJyxcbiAgICAgICctLScsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9zcmMvKipgLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9LyovYmluLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2NvbmZpZ3MvKipgLFxuICAgIF0sXG4gICAgeyBjd2Q6IGdpdFJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gISFwcm9jLnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1bkdpdChhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIGFyZ3MsIHsgY3dkLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICByZXR1cm4gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkV2JmeVBhY2thZ2VKc29uOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJQYXRoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuLyoqIFJldHVybnMgd2JmeSdzIG93biBwYWNrYWdlIGRpcmVjdG9yeSwgd2hpY2ggYWxzbyBob2xkcyBpdHMgY29uZmlncyAoZS5nLiByZWxlYXNlQWdlR2F0ZS5qc29uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5RGlyUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFdiZnlQYWNrYWdlSnNvbigpLmRpclBhdGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRXYmZ5UGFja2FnZUpzb24oKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0ge1xuICBpZiAoY2FjaGVkV2JmeVBhY2thZ2VKc29uKSByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xuICAvLyBmaWxlVVJMVG9QYXRoLCBub3QgVVJMLnBhdGhuYW1lOiB0aGUgbGF0dGVyIGtlZXBzIHBlcmNlbnQtZW5jb2RpbmcsIHNvIGFuIGluc3RhbGxhdGlvbiBwYXRoXG4gIC8vIGNvbnRhaW5pbmcgZS5nLiBhIHNwYWNlIHdvdWxkIHJlc29sdmUgdG8gYSBub25leGlzdGVudCBkaXJlY3RvcnkgYW5kIHRoZSBzZWFyY2ggd291bGQgd2FsayB1cFxuICAvLyB0byBhbiB1bnJlbGF0ZWQgcGFja2FnZS5cbiAgbGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICAvLyBwYXRoLmRpcm5hbWUoJy8nKSA9PT0gJy8nLCBzbyB0aGUgc2VhcmNoIG11c3Qgc3RvcCBleHBsaWNpdGx5IGF0IHRoZSBmaWxlc3lzdGVtIHJvb3QuXG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHRocm93IG5ldyBFcnJvcihcIndiZnkncyBvd24gcGFja2FnZS5qc29uIGlzIG1pc3NpbmcuXCIpO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIGNhY2hlZFdiZnlQYWNrYWdlSnNvbiA9IHsgbmFtZTogcGFja2FnZUpzb24ubmFtZSwgdmVyc2lvbjogcGFja2FnZUpzb24udmVyc2lvbiwgZGlyUGF0aCB9O1xuICByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldFdiZnlEaXJQYXRoIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbi8qKlxuICogQXBwbGllcyB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgR0xPQkFMXG4gKiBwYWNrYWdlLW1hbmFnZXIgY29uZmlncy4gUmVwb3NpdG9yeSBjb25maWdzIGd1YXJkIG9ubHkgd2JmaWVkIHJlcG9zaXRvcmllczsgYSBicmFuZC1uZXcgbG9jYWxcbiAqIHByb2plY3QgaGFzIG5vIGJ1bmZpZy50b21sIHlldCwgc28gdGhlIGdsb2JhbCBmaWxlcyBhcmUgdGhlIG9ubHkgZ2F0ZSBiZXR3ZWVuIGBidW4gY3JlYXRlYCAvXG4gKiBgbnBtIGluaXRgIGFuZCBhIGZyZXNobHkgY29tcHJvbWlzZWQgcmVsZWFzZS4gVGhlIHNhbWUgc2NyaXB0IHJ1bnMgb24gQ0kgYW5kIG9uIHRoZSBzZWxmLWhvc3RlZFxuICogcnVubmVycywgc28gZXZlcnkgbWFjaGluZSBlbmRzIHVwIHdpdGggYnl0ZS1pZGVudGljYWwgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdHVzIH0gPSBzcGF3blN5bmMoJ2Jhc2gnLCBbcGF0aC5qb2luKGdldFdiZnlEaXJQYXRoKCksICdjb25maWdzJywgJ2FwcGx5UmVsZWFzZUFnZUdhdGUuc2gnKV0sIHtcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYXBwbHkgdGhlIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuJyk7XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBLZWVwIHBhY2thZ2UtbWFuYWdlciBzaGltcyBpbiB0aGUgRmlsZSBXYXRjaGVyIHByb2dyYW0gZmllbGQgc28gbm9kZSBkb2VzIG5vdFxuLy8gcGFyc2Ugd3JhcHBlciBzY3JpcHRzIHBhc3NlZCB0aHJvdWdoIGFyZ3VtZW50cy5cbmNvbnN0IG94Zm10UHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL294Zm10JztcbmNvbnN0IHByZXR0aWVyUHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhc2tPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGFyZ3M6ICctLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLm94Zm10LFxuICAgICAgbmFtZTogJ094Zm10JyxcbiAgICAgIHByb2dyYW06IG94Zm10UHJvZ3JhbSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFyZ3M6ICctLWNhY2hlIC0td3JpdGUnLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkphdmEoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5LFxuICAgICAgbmFtZTogJ1ByZXR0aWVyJyxcbiAgICAgIHByb2dyYW06IHByZXR0aWVyUHJvZ3JhbSxcbiAgICB9LFxuICBdXG4gICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5jb25kaXRpb24pXG4gICAgLmZsYXRNYXAoKHRhc2spID0+IHRhc2suZXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnModGFzay5wcm9ncmFtLCB0YXNrLmFyZ3MsIHRhc2submFtZSwgZXh0KSkpO1xuXG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4gICAgJHt0YXNrT3B0aW9ucy5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJz4sXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgIXNjcmlwdHM/LlsnZ2VuLWkxOG4tdHMnXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuICdidW4gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsJztcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsIiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS93aXJlaXRcbmNvbnN0IHdpcmVpdFNjcmlwdFByb3BlcnRpZXMgPSBbJ2NvbW1hbmQnLCAnZGVwZW5kZW5jaWVzJywgJ2ZpbGVzJywgJ291dHB1dCddXG5jb25zdCBzb3J0V2lyZWl0U2NyaXB0ID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeSh3aXJlaXRTY3JpcHRQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdkZXBlbmRlbmNpZXMnLFxuICAgIG9uQXJyYXkoKGRlcHMpID0+IGRlcHMubWFwKHNvcnRPYmplY3RCeShbJ3NjcmlwdCcsICdjYXNjYWRlJ10pKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnZW52JyxcbiAgICBvbk9iamVjdCgoZW52KSA9PlxuICAgICAgc29ydE9iamVjdEtleXMoXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhlbnYpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBzb3J0T2JqZWN0QnkoWydleHRlcm5hbCcsICdkZWZhdWx0J10pKHZhbHVlKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdzZXJ2aWNlJyxcbiAgICBwaXBlKFtzb3J0T2JqZWN0QnkoWydyZWFkeVdoZW4nXSksIG92ZXJQcm9wZXJ0eSgncmVhZHlXaGVuJywgc29ydE9iamVjdCldKSxcbiAgKSxcbl0pXG5jb25zdCBzb3J0V2lyZWl0ID0gb25PYmplY3QoKHdpcmVpdCkgPT5cbiAgc29ydE9iamVjdEtleXMoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMod2lyZWl0KS5tYXAoKFtuYW1lLCBjb25maWddKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNvcnRXaXJlaXRTY3JpcHQoY29uZmlnKSxcbiAgICAgIF0pLFxuICAgICksXG4gICksXG4pXG5jb25zdCBzb3J0RGV2RW5naW5lcyA9IG92ZXJQcm9wZXJ0eShcbiAgJ3BhY2thZ2VNYW5hZ2VyJyxcbiAgc29ydE9iamVjdEJ5KFsnbmFtZScsICd2ZXJzaW9uJywgJ29uRmFpbCddKSxcbilcblxuY29uc3QgcG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAncGVlckRlcGVuZGVuY3lSdWxlcycsXG4gICduZXZlckJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXNGaWxlJyxcbiAgJ2FsbG93ZWREZXByZWNhdGVkVmVyc2lvbnMnLFxuICAnYWxsb3dOb25BcHBsaWVkUGF0Y2hlcycsXG4gICd1cGRhdGVDb25maWcnLFxuICAnYXVkaXRDb25maWcnLFxuICAncmVxdWlyZWRTY3JpcHRzJyxcbiAgJ3N1cHBvcnRlZEFyY2hpdGVjdHVyZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ3BhdGNoZWREZXBlbmRlbmNpZXMnLFxuICAncGFja2FnZUV4dGVuc2lvbnMnLFxuXVxuXG5jb25zdCBzb3J0UG5wbUNvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkocG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzLCB0cnVlKSxcbiAgb3ZlclByb3BlcnR5KCdvdmVycmlkZXMnLCBzb3J0T2JqZWN0QnlTZW12ZXIpLFxuXSlcblxuLy8gU2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vbWlzYy9zY3JpcHRzXG5jb25zdCBkZWZhdWx0TnBtU2NyaXB0cyA9IG5ldyBTZXQoW1xuICAnaW5zdGFsbCcsXG4gICdwYWNrJyxcbiAgJ3ByZXBhcmUnLFxuICAncHVibGlzaCcsXG4gICdyZXN0YXJ0JyxcbiAgJ3Nocmlua3dyYXAnLFxuICAnc3RhcnQnLFxuICAnc3RvcCcsXG4gICd0ZXN0JyxcbiAgJ3VuaW5zdGFsbCcsXG4gICd2ZXJzaW9uJyxcbl0pXG5cbmNvbnN0IGhhc0RldkRlcGVuZGVuY3kgPSAoZGVwZW5kZW5jeSwgcGFja2FnZUpzb24pID0+IHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLCAnZGV2RGVwZW5kZW5jaWVzJykgJiZcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeSlcbiAgKVxufVxuXG5jb25zdCBydW5TUmVnRXhwID1cbiAgLyg/PD1efFtcXHMmOzw+fChdKSg/OnJ1bi1zfG5wbS1ydW4tYWxsMj8gLiooPzotLXNlcXVlbnRpYWx8LS1zZXJpYWx8LXMpKSg/PSR8W1xccyY7PD58KV0pL1xuXG5jb25zdCBpc1NlcXVlbnRpYWxTY3JpcHQgPSAoY29tbWFuZCkgPT5cbiAgY29tbWFuZC5pbmNsdWRlcygnKicpICYmIHJ1blNSZWdFeHAudGVzdChjb21tYW5kKVxuXG5jb25zdCBoYXNTZXF1ZW50aWFsU2NyaXB0ID0gKHBhY2thZ2VKc29uKSA9PiB7XG4gIGlmIChcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwnLCBwYWNrYWdlSnNvbikgJiZcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwyJywgcGFja2FnZUpzb24pXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IHNjcmlwdHMgPSBbJ3NjcmlwdHMnLCAnYmV0dGVyU2NyaXB0cyddLmZsYXRNYXAoKGZpZWxkKSA9PlxuICAgIHBhY2thZ2VKc29uW2ZpZWxkXSA/IE9iamVjdC52YWx1ZXMocGFja2FnZUpzb25bZmllbGRdKSA6IFtdLFxuICApXG4gIHJldHVybiBzY3JpcHRzLnNvbWUoKHNjcmlwdCkgPT4gaXNTZXF1ZW50aWFsU2NyaXB0KHNjcmlwdCkpXG59XG5cbmZ1bmN0aW9uIHNvcnRTY3JpcHROYW1lcyhrZXlzLCBwcmVmaXggPSAnJykge1xuICBjb25zdCBncm91cE1hcCA9IG5ldyBNYXAoKVxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHByZWZpeCA/IGtleS5zbGljZShwcmVmaXgubGVuZ3RoICsgMSkgOiBrZXlcbiAgICBjb25zdCBpZHggPSByZXN0LmluZGV4T2YoJzonKVxuICAgIGlmIChpZHggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlID0ga2V5LnNsaWNlKDAsIChwcmVmaXggPyBwcmVmaXgubGVuZ3RoICsgMSA6IDApICsgaWR4KVxuICAgICAgaWYgKCFncm91cE1hcC5oYXMoYmFzZSkpIGdyb3VwTWFwLnNldChiYXNlLCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChiYXNlKS5wdXNoKGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cE1hcC5oYXMoa2V5KSkgZ3JvdXBNYXAuc2V0KGtleSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoa2V5KS5wdXNoKGtleSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBNYXAua2V5cygpKVxuICAgIC5zb3J0KClcbiAgICAuZmxhdE1hcCgoZ3JvdXBLZXkpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ3JvdXBNYXAuZ2V0KGdyb3VwS2V5KVxuICAgICAgaWYgKFxuICAgICAgICBjaGlsZHJlbi5sZW5ndGggPiAxICYmXG4gICAgICAgIGNoaWxkcmVuLnNvbWUoKGspID0+IGsgIT09IGdyb3VwS2V5ICYmIGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGlyZWN0ID0gY2hpbGRyZW5cbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiBrID09PSBncm91cEtleSB8fCAhay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IGNoaWxkcmVuLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgcmV0dXJuIFsuLi5kaXJlY3QsIC4uLnNvcnRTY3JpcHROYW1lcyhuZXN0ZWQsIGdyb3VwS2V5KV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZHJlbi5zb3J0KClcbiAgICB9KVxufVxuXG5jb25zdCBzb3J0U2NyaXB0cyA9IG9uT2JqZWN0KChzY3JpcHRzLCBwYWNrYWdlSnNvbikgPT4ge1xuICBsZXQgbmFtZXMgPSBPYmplY3Qua2V5cyhzY3JpcHRzKVxuICBjb25zdCBwcmVmaXhhYmxlID0gbmV3IFNldCgpXG5cbiAgbmFtZXMgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICBjb25zdCBvbWl0dGVkID0gbmFtZS5yZXBsYWNlKC9eKD86cHJlfHBvc3QpLywgJycpXG4gICAgaWYgKGRlZmF1bHROcG1TY3JpcHRzLmhhcyhvbWl0dGVkKSB8fCBuYW1lcy5pbmNsdWRlcyhvbWl0dGVkKSkge1xuICAgICAgcHJlZml4YWJsZS5hZGQob21pdHRlZClcbiAgICAgIHJldHVybiBvbWl0dGVkXG4gICAgfVxuICAgIHJldHVybiBuYW1lXG4gIH0pXG5cbiAgaWYgKCFoYXNTZXF1ZW50aWFsU2NyaXB0KHBhY2thZ2VKc29uKSkge1xuICAgIG5hbWVzID0gc29ydFNjcmlwdE5hbWVzKG5hbWVzKVxuICB9XG4gIG5hbWVzID0gbmFtZXMuZmxhdE1hcCgoa2V5KSA9PlxuICAgIHByZWZpeGFibGUuaGFzKGtleSkgPyBbYHByZSR7a2V5fWAsIGtleSwgYHBvc3Qke2tleX1gXSA6IFtrZXldLFxuICApXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhzY3JpcHRzLCBuYW1lcylcbn0pXG5cbi8qXG4tIE1vdmUgYGRlZmF1bHRgIGNvbmRpdGlvbiB0byBib3R0b21cbiovXG5jb25zdCBzb3J0Q29uZGl0aW9ucyA9IChjb25kaXRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdENvbmRpdGlvbnMgPSBbXSwgcmVzdENvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnd2lyZWl0Jywgb3Zlcjogc29ydFdpcmVpdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdsMTBuJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjb250cmlidXRlcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnYWN0aXZhdGlvbkV2ZW50cycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdodXNreScsIG92ZXI6IG92ZXJQcm9wZXJ0eSgnaG9va3MnLCBzb3J0R2l0SG9va3MpIH0sXG4gIHsga2V5OiAnc2ltcGxlLWdpdC1ob29rcycsIG92ZXI6IHNvcnRHaXRIb29rcyB9LFxuICB7IGtleTogJ3ByZS1jb21taXQnIH0sXG4gIHsga2V5OiAnY29tbWl0bGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdsaW50LXN0YWdlZCcgfSxcbiAgeyBrZXk6ICduYW5vLXN0YWdlZCcgfSxcbiAgeyBrZXk6ICdjb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbm9kZW1vbkNvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2VyaWZ5Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2JhYmVsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJzbGlzdCcgfSxcbiAgeyBrZXk6ICd4bycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwcmV0dGllcicsIG92ZXI6IHNvcnRQcmV0dGllckNvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludENvbmZpZycsIG92ZXI6IHNvcnRFc2xpbnRDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRJZ25vcmUnIH0sXG4gIHsga2V5OiAnbnBtcGtnanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtUGFja2FnZUpzb25MaW50Q29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbXBhY2thZ2Vqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZWxlYXNlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbWFya0NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdzdHlsZWxpbnQnIH0sXG4gIHsga2V5OiAnYXZhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1qdW5pdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LXN0YXJlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21vY2hhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ255YycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdjOCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICd0YXAnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb2NsaWYnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ3Jlc29sdXRpb25zJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ292ZXJyaWRlcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGV2RGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0Qnkoc29ydE9iamVjdEJ5SWRlbnQsIHRydWUpIH0sXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgLy8gVE9ETzogb25seSBzb3J0IGRlcHRoID0gMlxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdvcHRpb25hbERlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdidW5kbGVkRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2J1bmRsZURlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uUGFjaycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2ZsYXQnIH0sXG4gIHsga2V5OiAncGFja2FnZU1hbmFnZXInIH0sXG4gIHsga2V5OiAnZW5naW5lcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdlbmdpbmVTdHJpY3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZGV2RW5naW5lcycsIG92ZXI6IHNvcnREZXZFbmdpbmVzIH0sXG4gIHsga2V5OiAndm9sdGEnLCBvdmVyOiBzb3J0Vm9sdGEgfSxcbiAgeyBrZXk6ICdsYW5ndWFnZU5hbWUnIH0sXG4gIHsga2V5OiAnb3MnIH0sXG4gIHsga2V5OiAnY3B1JyB9LFxuICB7IGtleTogJ3ByZWZlckdsb2JhbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwdWJsaXNoQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdpY29uJyB9LFxuICAvKiB2c2NvZGUgKi8ge1xuICAgIGtleTogJ2JhZGdlcycsXG4gICAgb3Zlcjogb25BcnJheSgoYmFkZ2UpID0+IGJhZGdlLm1hcChzb3J0VlNDb2RlQmFkZ2VPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZ2FsbGVyeUJhbm5lcicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHJldmlldycgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbWFya2Rvd24nIH0sXG4gIHsga2V5OiAncG5wbScsIG92ZXI6IHNvcnRQbnBtQ29uZmlnIH0sXG5dXG5cbmNvbnN0IGRlZmF1bHRTb3J0T3JkZXIgPSBmaWVsZHMubWFwKCh7IGtleSB9KSA9PiBrZXkpXG5jb25zdCBvdmVyRmllbGRzID0gcGlwZShcbiAgZmllbGRzXG4gICAgLm1hcCgoeyBrZXksIG92ZXIgfSkgPT4gKG92ZXIgPyBvdmVyUHJvcGVydHkoa2V5LCBvdmVyKSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbilcblxuZnVuY3Rpb24gZWRpdFN0cmluZ0pTT04oanNvbiwgb3Zlcikge1xuICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIHR5cGUgfSA9IGRldGVjdEluZGVudChqc29uKVxuICAgIGNvbnN0IGVuZENoYXJhY3RlcnMgPSBqc29uLnNsaWNlKC0xKSA9PT0gJ1xcbicgPyAnXFxuJyA6ICcnXG4gICAgY29uc3QgbmV3bGluZSA9IGRldGVjdE5ld2xpbmUoanNvbilcbiAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKVxuXG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBKU09OLnN0cmluZ2lmeShvdmVyKGpzb24pLCBudWxsLCB0eXBlID09PSAndGFiJyA/ICdcXHQnIDogaW5kZW50KSArXG4gICAgICBlbmRDaGFyYWN0ZXJzXG4gICAgaWYgKG5ld2xpbmUgPT09ICdcXHJcXG4nKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFxuL2csIG5ld2xpbmUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJldHVybiBvdmVyKGpzb24pXG59XG5cbmZ1bmN0aW9uIHNvcnRQYWNrYWdlSnNvbihqc29uSXNoLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGVkaXRTdHJpbmdKU09OKFxuICAgIGpzb25Jc2gsXG4gICAgb25PYmplY3QoKGpzb24pID0+IHtcbiAgICAgIGxldCBzb3J0T3JkZXIgPSBvcHRpb25zLnNvcnRPcmRlciB8fCBkZWZhdWx0U29ydE9yZGVyXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvcnRPcmRlcikpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24pXG4gICAgICAgIGNvbnN0IHsgcHJpdmF0ZUtleXMgPSBbXSwgcHVibGljS2V5cyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBbXG4gICdAdHNjb25maWcvYnVuJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLWx0cycsXG4gICdAdHNjb25maWcvbm9kZS10cycsXG4gICdAdHNjb25maWcvcmVhY3QtbmF0aXZlJyxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAvLyBSZWFjdCBOYXRpdmUgbmVlZHMgTWV0cm8tY29tcGF0aWJsZSBzZXR0aW5ncyAoanN4OiByZWFjdC1uYXRpdmUsIG5vZGUgcmVzb2x1dGlvbiksIHdoaWNoXG4gIC8vIEB0c2NvbmZpZy9idW4gd291bGQgb3ZlcnJpZGUgZXZlbiB0aG91Z2ggdGhlIHJlcG8gdXNlcyBCdW4gYXMgaXRzIHBhY2thZ2UgbWFuYWdlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSddO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9idW4nXTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vZHVsZSBzcGVjaWZpZXIgYSBnZW5lcmF0ZWQgY29uZmlnIGZpbGUgc2hvdWxkIHVzZSB0byBsb2FkIGFcbiAqIHdpbGxib29zdGVyLWNvbmZpZ3MgY29uZmlnIHBhY2thZ2Ugc3VjaCBhcyBgQHdpbGxib29zdGVyL294bGludC1jb25maWdgLlxuICpcbiAqIE91dHNpZGUgd2lsbGJvb3N0ZXItY29uZmlncyB0aGlzIGlzIHNpbXBseSB0aGUgcHVibGlzaGVkIHBhY2thZ2UgbmFtZS4gSW5zaWRlXG4gKiB3aWxsYm9vc3Rlci1jb25maWdzIHRoZSBwYWNrYWdlIG11c3Qgbm90IGJlIGRlY2xhcmVkIGFzIGEgZGVwZW5kZW5jeTogdGhlXG4gKiBjb25maWcgcGFja2FnZXMgaW1wb3J0IG9uZSBhbm90aGVyIChlLmcuIG94Zm10LWNvbmZpZydzIG94bGludC5jb25maWcudHNcbiAqIGltcG9ydHMgb3hsaW50LWNvbmZpZyBhbmQgdmljZSB2ZXJzYSksIHNvIGEgZGVjbGFyZWQgZWRnZSB3b3VsZCBmb3JtIGFcbiAqIGRlcGVuZGVuY3kgY3ljbGUgdGhhdCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIGNhbm5vdCB0b3BvbG9naWNhbGx5IHNvcnQuIFNpbmNlXG4gKiB0aGUgZWRnZSBpcyBhYnNlbnQsIGlzb2xhdGVkIGluc3RhbGxzIGNhbm5vdCByZXNvbHZlIHRoZSBiYXJlIHBhY2thZ2UgbmFtZSwgc29cbiAqIGltcG9ydCB0aGUgY29tbWl0dGVkIGBjb25maWcubWpzYCBidWlsZCBvdXRwdXQgdGhyb3VnaCBhIHJlbGF0aXZlIHBhdGggaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWc6IFBhY2thZ2VDb25maWcsIGNvbmZpZ1BhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuIGNvbmZpZ1BhY2thZ2VOYW1lO1xuXG4gIC8vIGUuZy4gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyAtPiAnb3hsaW50LWNvbmZpZycsIHdoaWNoIGlzIGl0cyBkaXJlY3RvcnkgdW5kZXIgYHBhY2thZ2VzL2AuXG4gIGNvbnN0IGNvbmZpZ1BhY2thZ2VEaXIgPSBjb25maWdQYWNrYWdlTmFtZS5zcGxpdCgnLycpLnBvcCgpID8/ICcnO1xuICAvLyBEZXJpdmUgdGhlIHdpbGxib29zdGVyLWNvbmZpZ3Mgcm9vdCBmcm9tIHRoZSBwYWNrYWdlIGJlaW5nIGdlbmVyYXRlZCwgbm90IGZyb20gdGhlIENMSSBlbnRyeVxuICAvLyBwYXRoOiBgd2JmeSA8cmVwbz4vcGFja2FnZXMvPHBrZz5gIGlzIGEgc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgZW50cnkgY29uZmlnIGlzIHRoZSBjaGlsZFxuICAvLyBwYWNrYWdlIHJhdGhlciB0aGFuIHRoZSByZXBvIHJvb3QsIHNvIHJlbHlpbmcgb24gdGhlIGVudHJ5IHdvdWxkIGVtaXQgYSBuZXN0ZWQsIHVucmVzb2x2YWJsZVxuICAvLyBwYXRoIGZvciBhIGRpcmVjdGx5IHRhcmdldGVkIGNvbmZpZyBwYWNrYWdlLiBFdmVyeSB3aWxsYm9vc3Rlci1jb25maWdzIHBhY2thZ2UgaXMgZWl0aGVyIHRoZVxuICAvLyByb290IG9yIGEgZGlyZWN0IGNoaWxkIHVuZGVyIGBwYWNrYWdlcy9gLCBzbyB0aGUgcm9vdCBpcyB0aGUgcGFja2FnZSBkaXIgaXRzZWxmIG9yIGl0cyBncmFuZHBhcmVudC5cbiAgY29uc3QgcmVwb1Jvb3REaXJQYXRoID0gY29uZmlnLmlzUm9vdCA/IGNvbmZpZy5kaXJQYXRoIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nKTtcbiAgY29uc3QgbG9jYWxFbnRyeSA9IHBhdGgucmVzb2x2ZShyZXBvUm9vdERpclBhdGgsICdwYWNrYWdlcycsIGNvbmZpZ1BhY2thZ2VEaXIsICdjb25maWcubWpzJyk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGxvY2FsRW50cnkpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmXG4gICAgIWNvbmZpZy5pc1Jvb3QgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24/LnByaXZhdGUgIT09IHRydWUgJiZcbiAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5wYWNrYWdlSnNvbj8uZmlsZXMpICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uLmZpbGVzLmxlbmd0aCA+IDBcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgc29ydFBhY2thZ2VKc29uIH0gZnJvbSAnc29ydC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yLCB0eXBlIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5U2NyaXB0U2VnbWVudCwgc3BsaXRTY3JpcHRTZWdtZW50cyB9IGZyb20gJy4uL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICcuLi91dGlscy9zdHJpbmdVdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbiAgaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0RGVwZW5kZW5jeSA9ICd0eXBlc2NyaXB0Jztcbi8vIFR5cGVTY3JpcHQgNydzIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIG5hdGl2ZSBjb21waWxlciBhbmQgZXhwb3NlcyBub1xuLy8gcHJvZ3JhbW1hdGljIEFQSS4gTmV4dC5qcydzIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgbmVlZHMgdGhhdCBBUEksIHNvXG4vLyBgbmV4dCBidWlsZGAgZmFpbHMgKFwidHJ5aW5nIHRvIHVzZSBUeXBlU2NyaXB0IGJ1dCBkbyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGFja2FnZShzKVwiKVxuLy8gd2l0aCBvbmx5IGB0eXBlc2NyaXB0YCB2NyBpbnN0YWxsZWQuIE5leHQuanMgcmVzb2x2ZXMgdGhlIHRzZ28gYmluYXJ5IHRocm91Z2ggdGhlXG4vLyBzZXBhcmF0ZSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgIHBhY2thZ2UsIHNvIE5leHQuanMtZmFtaWx5IHJlcG9zIG11c3QgaW5zdGFsbFxuLy8gYm90aDsgb3RoZXIgcmVwb3Mgb25seSBuZWVkIGB0eXBlc2NyaXB0YCBmb3IgYHRzY2AgdHlwZWNoZWNrcy5cbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCBsZWZ0aG9va0RlcGVuZGVuY3kgPSAnbGVmdGhvb2snO1xuY29uc3QgbWFuYWdlZERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoW1xuICB3YkRlcGVuZGVuY3ksXG4gIGJ1aWxkVHNEZXBlbmRlbmN5LFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHREZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0R29EZXBlbmRlbmN5LFxuICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAvLyBNaXhlZCBAdHlwZXMvYnVuIHZlcnNpb25zIGFjcm9zcyBhIG1vbm9yZXBvIGxvYWQgdHdvIGJ1bi10eXBlcyBjb3BpZXMsIHdoaWNoXG4gIC8vIGJyZWFrcyBnbG9iYWwgaW50ZXJmYWNlIG1lcmdpbmcgKGUuZy4gUmVzcG9uc2UvSGVhZGVycykgZHVyaW5nIHR5cGUgY2hlY2tpbmcuXG4gICdAdHlwZXMvYnVuJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBwYWNrYWdlQWdlR2F0ZU1zID0gYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzICogMTAwMDtcbmNvbnN0IG5wbVBhY2thZ2VUaW1lc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd29ya2VyVHlwZXNTY3JpcHRFcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoY29uZmlnKTtcbiAgaWYgKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpIHRocm93IG5ldyBFcnJvcih3b3JrZXJUeXBlc1NjcmlwdEVycm9yKTtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAvLyBPbiBhIGZpcnN0IHJ1biB0aGVyZSBpcyBubyBtYW5pZmVzdCBmb3IgYGJ1biBhZGRgIHRvIHVwZGF0ZSByZWxpYWJseS4gV3JpdGUgdGhlIHJlc29sdmVkXG4gIC8vIGRlcGVuZGVuY3kgdmVyc2lvbnMgaW50byB0aGUgbmV3IG1hbmlmZXN0IGRpcmVjdGx5OyB0aGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGBidW4gaW5zdGFsbGBcbiAgLy8gdGhlbiBpbnN0YWxscyB0aGVtIGFuZCByZW1haW5zIHRoZSBhdXRob3JpdGF0aXZlIGZhaWx1cmUgY2hlY2suXG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBkZXBlbmRlbmN5VXBkYXRlcyxcbiAgICBza2lwQWRkaW5nRGVwcyB8fCAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb25cbiAgKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgLy8gQSByZWZ1c2VkIHdyaXRlIChlLmcuIGEgc3ltbGlua2VkIHBhY2thZ2UuanNvbikgbXVzdCBhbHNvIGFib3J0IHRoZSBkZXBlbmRlbmN5IGluc3RhbGxhdGlvblxuICAvLyBiZWxvdzogYGJ1biBhZGRgIGZvbGxvd3MgdGhlIHN5bWxpbmsgYW5kIHdvdWxkIG1vZGlmeSB0aGUgZmlsZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSkpKSByZXR1cm47XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgICAvLyBBIG5ld2x5IGNyZWF0ZWQgbWFuaWZlc3QgaXMgYWxyZWFkeSBzb3J0ZWQgYnkgd2JmeSdzIGJ1bmRsZWQgc2VyaWFsaXplcjsgdGhlIHRhcmdldCBmb3JtYXR0ZXJcbiAgICAvLyBpcyBhdmFpbGFibGUgd2l0aG91dCBhbiBleHRyYSBmZXRjaCBvbmx5IHdoZW4gdGhpcyBydW4gc3RhcnRlZCB3aXRoIHBhY2thZ2UuanNvbi5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBmaWxlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBsZXQganNvbk9iajogUGFja2FnZUpzb24gPSB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBEb2N1bWVudGF0aW9uLW9ubHkgcmVwb3NpdG9yaWVzIGhhdmUgbm8gbWFuaWZlc3Qgb24gdGhlaXIgZmlyc3Qgd2JmeSBydW4uIFN0YXJ0aW5nIGZyb20gYW5cbiAgICAvLyBlbXB0eSBvYmplY3QgbGV0cyB0aGUgbm9ybWFsIGdlbmVyYXRvciBlc3RhYmxpc2ggdGhlIHNhbWUgbWFuYWdlZCBiYXNlbGluZSBhcyBldmVyeSBvdGhlclxuICAgIC8vIHJlcG9zaXRvcnk7IG1hbGZvcm1lZCBvciB1bnJlYWRhYmxlIGV4aXN0aW5nIG1hbmlmZXN0cyBtdXN0IHN0aWxsIGZhaWwgbG91ZGx5LlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICAvLyBSdW4gYmVmb3JlIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggcmUtYWRkcyB0c2dvIG9ubHkgZm9yIGN1cnJlbnQgTmV4dC5qcy1mYW1pbHkgcmVwb3NpdG9yaWVzLlxuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xufVxuXG4vKipcbiAqIEtlZXBzIHRoZSBwcm9qZWN0J3Mgb3duIHNlZ21lbnRzIGluIG9yZGVyLCByZXBsYWNpbmcgdGhlIGZpcnN0IG1hbmFnZWQgZ2VuLWNvZGUgc3BlbGxpbmcgd2l0aFxuICogYGJ1biB3YiBnZW4tY29kZWAgYW5kIGRyb3BwaW5nIGxhdGVyIGR1cGxpY2F0ZXMuIEFwcGVuZHMgZ2VuZXJhdGlvbiBvbmx5IHdoZW4gdGhlIHNjcmlwdFxuICogY29udGFpbmVkIG5vbmUsIHNvIG5vdGhpbmcgaXMgcmVvcmRlcmVkLlxuICovXG5mdW5jdGlvbiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50czogc3RyaW5nW10sIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtpbmRzID0gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IGdlbmVyYXRlczsgYWRkaW5nIGFub3RoZXIgaW52b2NhdGlvbiB3b3VsZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICBsZXQgZ2VuZXJhdGlvblBsYWNlZCA9IGtpbmRzLmluY2x1ZGVzKCdnZW5Db2RlV3JhcHBlcicpO1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBraW5kID0ga2luZHNbaW5kZXhdO1xuICAgIGlmIChraW5kID09PSAnY3VzdG9tJyB8fCBraW5kID09PSAnZ2VuQ29kZVdyYXBwZXInKSB7XG4gICAgICByZXN1bHQucHVzaChzZWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSB7XG4gICAgICByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gICAgICBnZW5lcmF0aW9uUGxhY2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnRzIHdoaWxlIGtlZXBpbmcgdGhlIGZpcnN0IHNlZ21lbnQncyBwb3NpdGlvbiBzbyBhIGN1c3RvbVxuICogc3RlcCB0aGF0IGNvbnN1bWVzIGdlbmVyYXRlZCBvdXRwdXQgc3RpbGwgcnVucyBhZnRlciBpdC4gUmV0dXJucyB3aXRob3V0IGNoYW5naW5nIGFuXG4gKiB1bnBhcnNlYWJsZSBzY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIG1hbmFnZXNXb3JrZXJUeXBlczogYm9vbGVhbik6IHZvaWQge1xuICAvLyBgYnVuIHdiIGdlbi1jb2RlYCByZWdlbmVyYXRlcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGl0c2VsZiwgc28gYSBwYWNrYWdlIHdpdGggYVxuICAvLyBjb2RlLWdlbmVyYXRpb24gb3Igd29ya2VyLXR5cGVzIHBpcGVsaW5lIGdldHMgb25lIG1hbmFnZWQgZ2VuZXJhdGlvbiBzZWdtZW50LlxuICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSB8fCBtYW5hZ2VzV29ya2VyVHlwZXMpIHtcbiAgICAvLyBQcm9qZWN0LW93bmVkIHN0ZXBzIGFyZSBuZXZlciBkcm9wcGVkLCBhbmQgdGhlaXIgUE9TSVRJT04gcmVsYXRpdmUgdG8gZ2VuZXJhdGlvbiBpcyBwcmVzZXJ2ZWQ6IGEgc3RlcFxuICAgIC8vIGJlZm9yZSBpdCBtYXkgcHJvZHVjZSBgd3JhbmdsZXIgdHlwZXNgJyBpbnB1dHMgKGEgd3JhbmdsZXIgY29uZmlnLCBgLmRldi52YXJzYCksIHdoaWxlIG9uZSBhZnRlciBpdCBtYXlcbiAgICAvLyBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgdHlwZXMuIFNvIHRoZSBtYW5hZ2VkIGdlbmVyYXRpb24gcmVwbGFjZXMgdGhlIGZpcnN0IG1hbmFnZWQgc2VnbWVudCBpbiBwbGFjZSwgYW5kIGlzXG4gICAgLy8gYXBwZW5kZWQgb25seSB3aGVuIHRoZSBzY3JpcHQgaGFkIG5vbmUuIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gZ2VuZXJhdGlvbiBwbHVzIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBzdXBwcmVzc2VzIHRoZSByZXBsYWNlbWVudCBlbnRpcmVseS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHNjcmlwdHMucG9zdGluc3RhbGwgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsKTtcbiAgICBjb25zdCBrZXB0U2VnbWVudHMgPSBzZWdtZW50cyAmJiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50cywgc2NyaXB0cyk7XG4gICAgaWYgKGtlcHRTZWdtZW50cykge1xuICAgICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGtlcHRTZWdtZW50cy5qb2luKCcgJiYgJyk7XG4gICAgfVxuICAgIC8vIEFueSBvdGhlciB1bnBhcnNlYWJsZSBwb3N0aW5zdGFsbCBpcyBsZWZ0IHRvIGEgaHVtYW4gcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIC8vIExlZnRob29rIGdlbmVyYXRpb24gaXMgYmVzdC1lZmZvcnQgYW5kIC5sZWZ0aG9vayBpcyBhYnNlbnQgZnJvbSBEb2NrZXIgYnVpbGQgY29udGV4dHMsIHNvIGFcbiAgICAvLyBtaXNzaW5nIG5vcm1hbGl6ZXIgaXMgdmFsaWQuIE9uY2UgcHJlc2VudCwgaXRzIGZhaWx1cmUgbXVzdCBhYm9ydCBpbnN0YWxsIHJhdGhlciB0aGFuIGxlYXZlIGFcbiAgICAvLyBHdWFyZC1waW5uZWQgbG9ja2ZpbGUgYmVoaW5kOyBrZWVwIHRoYXQgZmFpbC1mYXN0IGdyb3VwaW5nIGV4cGxpY2l0IGJlZm9yZSBhbnkgd29ya3NwYWNlIGJ1aWxkLlxuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID1cbiAgICAgICcoYnVuIGxlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSkgJiYgKHRlc3QgISAtZiAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB8fCBiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoKSc7XG4gICAgLy8gV2hlbiBAd2lsbGJvb3N0ZXIvd2IgaXMgYSB3b3Jrc3BhY2Ugb2YgdGhpcyByZXBvc2l0b3J5LCB0aGUgZ2VuZXJhdGVkIGBidW4gd2Ig4oCmYCBzY3JpcHRzIHJ1blxuICAgIC8vIGl0cyBnaXRpZ25vcmVkIGRpc3QgYnVpbGQgKGJpbi9pbmRleC5qcyBpbXBvcnRzIC4uL2Rpc3QvaW5kZXguanMpLCBzbyBhIGZyZXNoIGNoZWNrb3V0IG11c3RcbiAgICAvLyBidWlsZCBpdCBkdXJpbmcgaW5zdGFsbDsgcmVnaXN0cnkgaW5zdGFsbHMgc2hpcCBhIHByZWJ1aWx0IGRpc3QgYW5kIG5lZWQgbm8gZXh0cmEgc3RlcC5cbiAgICBjb25zdCB3YldvcmtzcGFjZURpciA9IGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmdldCh3YkRlcGVuZGVuY3kpO1xuICAgIGlmICh3YldvcmtzcGFjZURpcikge1xuICAgICAgLy8gU2luZ2xlIHF1b3RlcyAod2l0aCBlbWJlZGRlZCBxdW90ZXMgZXNjYXBlZCkgcHJldmVudCB0aGUgc2hlbGwgZnJvbSBleHBhbmRpbmcgYCQo4oCmKWAgb3JcbiAgICAgIC8vIHZhcmlhYmxlcyB0aGF0IGEgaG9zdGlsZSBkaXJlY3RvcnkgbmFtZSBjb3VsZCBzbXVnZ2xlIGludG8gdGhlIGdlbmVyYXRlZCBzY3JpcHQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSArPSBgICYmIGJ1biBydW4gLS1jd2QgJyR7d2JXb3Jrc3BhY2VEaXIucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfScgYnVpbGRgO1xuICAgIH1cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChsZWZ0aG9va0RlcGVuZGVuY3kpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKGpzb25PYmouc2NyaXB0cy5yZWxlYXNlKSkge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRSdW50aW1lKSB7XG4gICAgICAgIC8vIFJ1bnRpbWUgaW1wb3J0cyBuZWVkIHRoZSBzdGFuZGFsb25lIHBhY2thZ2UgYWZ0ZXIgRG9ja2VyIHBydW5pbmcgcmVtb3ZlcyBkZXZEZXBlbmRlbmNpZXMuXG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz89XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCA/P1xuICAgICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gPz9cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCgncGxheXdyaWdodCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby4gWWFybiB2MSdzIG9iamVjdCBmb3JtIGtlZXBzIGl0c1xuICAgICAgLy8gZGVjbGFyZWQgcGF0dGVybnMgKHdvcmtzcGFjZXMucGFja2FnZXMpOyBvbmx5IGV4dHJhcyBzdWNoIGFzIG5vaG9pc3QgYXJlIGRyb3BwZWQuXG4gICAgICAvLyBGb3JjZSBgcGFja2FnZXMvKmAgb25seSB3aGVuIGl0IGFjdHVhbGx5IG1hdGNoZXMgYSB3b3Jrc3BhY2UgbWFuaWZlc3Q6IGFuIGFwcHMvKi1vbmx5XG4gICAgICAvLyBtb25vcmVwbyBtdXN0IG5vdCBnZXQgYSBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGFwcGVuZGVkIHRvIGl0cyBkZWNsYXJhdGlvbi4gQVxuICAgICAgLy8gYmFzZWxpbmUtc2VlZGluZyBkZWNsYXJhdGlvbiBuZWVkcyBubyBmb3JjZWQgcGF0dGVybiBhdCBhbGwg4oCUIHRoZSBzZWVkZWQgYmFzZWxpbmVcbiAgICAgIC8vIChgKi8qYCBvciBgKipgKSBhbHJlYWR5IGNvdmVycyBwYWNrYWdlcy8qLiBUaGUgZm9yY2VkIHBhdHRlcm4gaXMgUFJFUEVOREVEOiBCdW5cbiAgICAgIC8vIGV2YWx1YXRlcyB3b3Jrc3BhY2UgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBhIHBvc2l0aXZlIHBhdHRlcm4gcGxhY2VkIGFmdGVyIGEgdXNlclxuICAgICAgLy8gbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcy4gQSBkZWNsYXJhdGlvbiB0aGF0IGFscmVhZHkgY292ZXJzXG4gICAgICAvLyBwYWNrYWdlcy8qIHVuZGVyIG5vcm1hbGl6YXRpb24gKGUuZy4gYC4vcGFja2FnZXMvKmApIGlzIGtlcHQgdmVyYmF0aW06IGZvcmNpbmcgYSB0ZXh0dWFsXG4gICAgICAvLyBgcGFja2FnZXMvKmAgbmV4dCB0byBpdCB3b3VsZCBwZXJzaXN0IGEgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybi5cbiAgICAgIGNvbnN0IGZvcmNlZFBhdHRlcm5zID1cbiAgICAgICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUoanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgeyBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfSkubGVuZ3RoID4gMFxuICAgICAgICAgID8gWydwYWNrYWdlcy8qJ11cbiAgICAgICAgICA6IFtdO1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gbWVyZ2UuYWxsKFtmb3JjZWRQYXR0ZXJucywgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhqc29uT2JqLndvcmtzcGFjZXMpXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIEJvdGggaW5wdXRzIGNhbiBiZSBlbXB0eSAoZS5nLiBwYWNrYWdlcy9wYWNrYWdlLmpzb24gd2l0aG91dCBhbnkgcGFja2FnZXMvKi9wYWNrYWdlLmpzb25cbiAgICAgIC8vIGFuZCBubyBkZWNsYXJlZCB3b3Jrc3BhY2VzKTsgZG8gbm90IHBlcnNpc3QgYSBtZWFuaW5nbGVzcyBgd29ya3NwYWNlczogW11gLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSAmJiBqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpeGVycy9uZXh0Q29uZmlnLnRzIGVuYWJsZXMgYHJlYWN0Q29tcGlsZXI6IHRydWVgIGZvciBldmVyeSBOZXh0LmpzIHByb2plY3QsIGFuZCBOZXh0LmpzXG4gIC8vIHJlc29sdmVzIGBiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXJgIGF0IGJ1aWxkIHRpbWUgd2hlbiBSZWFjdCBDb21waWxlciBpcyBvbi4gQWRkIGl0IGhlcmUgc29cbiAgLy8gdGhlIG1hbmFnZWQgbmV4dC5jb25maWcgbmV2ZXIgYnJlYWtzIGBuZXh0IGJ1aWxkYCB3aXRoIGFuIHVucmVzb2x2ZWQtcGFja2FnZSBlcnJvci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXInKTtcbiAgfVxuXG4gIC8vIGB3YiB2ZXJpZnkgLS1mdWxsYCBhdWRpdHMgZXZlcnkgYCouc2xpZGV2Lm1kYCBkZWNrIHdpdGggc2xpZGV2LWNoZWNrLCBzbyB0aGUgY2hlY2tlciBoYXMgdG8gYmVcbiAgLy8gaW5zdGFsbGVkIHdoZXJldmVyIGEgZGVjayBsaXZlcy5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblNsaWRldk1kKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NsaWRldi1jaGVjaycpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIC8vIEEgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBkZXBlbmRzIG9uIHRoZSB3YiBkZXZlbG9wZWQgaW4gdGhpcyByZXBvc2l0b3J5IChlLmcuXG4gICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGl0c2VsZik7IGluc3RhbGxpbmcgdGhlIGxhdGVzdCByZWdpc3RyeSByZWxlYXNlIG92ZXIgaXQgd291bGQgc2lsZW50bHlcbiAgICAvLyByZXBsYWNlIHRoZSBsb2NhbCBidWlsZCB3aXRoIGEgcHVibGlzaGVkIG9uZSwgc28gbGVhdmUgc3VjaCBhIGRlY2xhcmF0aW9uIHVudG91Y2hlZC5cbiAgICBjb25zdCB3YlNwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XTtcbiAgICBpZiAoIXdiU3BlY2lmaWVyPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIC8vIE5leHQuanMncyBgbmV4dCBidWlsZGAgaW5zcGVjdHMgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgdG8gcnVuIGl0cyB0eXBlXG4gICAgLy8gY2hlY2s7IHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBhbG9uZSBsYWNrcyB0aGUgQVBJIG5leHQgbmVlZHMsIHNvIGtlZXAgYm90aFxuICAgIC8vIGluc3RhbGxlZCBmb3IgTmV4dC5qcy1mYW1pbHkgcmVwb3MuIFNlZSB0aGUgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSBjb21tZW50IGFib3ZlLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIC8vIFJlYWN0IE5hdGl2ZSByZWxpZXMgb24gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSdzIGFtYmllbnQgdHlwZXMgaW5zdGVhZCBvZiBAdHlwZXMvYnVuLlxuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXFxiKD86YnVueHxucHh8cG5wbVxccytkbHh8eWFyblxccytkbHgpXFxzK3NlbWFudGljLXJlbGVhc2UoPzpAXFxTKyk/XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIGtlZXBBc1J1bnRpbWVdIG9mIFtcbiAgICBbd2JEZXBlbmRlbmN5LCBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgICBbYnVpbGRUc0RlcGVuZGVuY3ksIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAoa2VlcEFzUnVudGltZSkge1xuICAgICAgY29uc3QgZGV2VmVyc2lvbiA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFkZXZWZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIXJ1bnRpbWVWZXJzaW9uIHx8IGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihkZXZWZXJzaW9uLCBydW50aW1lVmVyc2lvbikpIHtcbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBkZXZWZXJzaW9uO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH0gZWxzZSBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHtcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIGltYWdlcyBydW4gbWlncmF0aW9ucyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCwganVzdCBhcyBwYWNrYWdlIG1hbmFnZXJzXG4gIC8vIHJ1biBwb3N0aW5zdGFsbCBkdXJpbmcgcHJvZHVjdGlvbiBpbnN0YWxscywgc28gYm90aCBlbnRyeSBwb2ludHMgbXVzdCByZXRhaW4gdGhlIHdiIGJpbmFyeS5cbiAgLy8gS2VlcCB0aGUgd29yZCBtYXRjaCBjb25zZXJ2YXRpdmU6IHN1cHBvcnRlZCBjdXN0b20gd3JhcHBlcnMgY2FuIHB1dCB3YiBpbnNpZGUgc2hlbGwgbG9vcHMgdGhhdFxuICAvLyB0aGUgY29tbWFuZC1wb3NpdGlvbiBwYXJzZXIgY2Fubm90IGNsYXNzaWZ5LCB3aGlsZSBhIGZhbHNlIHBvc2l0aXZlIG9ubHkgcmV0YWlucyB0aGUgQ0xJLlxuICByZXR1cm4gW2pzb25PYmouc2NyaXB0cz8ucG9zdGluc3RhbGwsIGpzb25PYmouc2NyaXB0cz8uWydkYi1taWdyYXRlJ11dLnNvbWUoXG4gICAgKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiXFxiL3UudGVzdChzY3JpcHQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmlzbWEgPSBqc29uT2JqLnByaXNtYSBhcyB7IHNlZWQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHByaXNtYT8uc2VlZCkgfHwgZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhqc29uT2JqLnNjcmlwdHM/LnNlZWQpO1xufVxuXG5mdW5jdGlvbiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHNlZWRDb21tYW5kOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gRG9ja2VyIGltYWdlcyBydW4gc2VlZCBzY3JpcHRzIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLFxuICAvLyBzbyBUeXBlU2NyaXB0IHNlZWQgcnVubmVycyBtdXN0IHJlbWFpbiBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAgcmV0dXJuIHR5cGVvZiBzZWVkQ29tbWFuZCA9PT0gJ3N0cmluZycgJiYgLyg/PCFbXFx3LV0pYnVpbGQtdHMoPyFbXFx3LV0pL3UudGVzdChzZWVkQ29tbWFuZCk7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zID0gW1xuICAnZGVwZW5kZW5jaWVzJyxcbiAgJ2RldkRlcGVuZGVuY2llcycsXG4gICdvcHRpb25hbERlcGVuZGVuY2llcycsXG4gICdwZWVyRGVwZW5kZW5jaWVzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9yY2VzIHN0b3JlLWluY29tcGF0aWJsZSBwYWNrYWdlcyB0byBzdGF5IHByb2plY3QtbG9jYWwgd2hlbiB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGVuYWJsZXNcbiAqIEJ1bidzIGdsb2JhbCBzdG9yZTogYGNoYWtyYSB0eXBlZ2VuYCAocnVuIGJ5IGB3YiBnZW4tY29kZWApXG4gKiB3cml0ZXMgZ2VuZXJhdGVkIHR5cGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0IHBhY2thZ2UsIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogbXV0YXRlIHRoZSBtYWNoaW5lLXdpZGUgc3RvcmUgc2hhcmVkIGFjcm9zcyByZXBvc2l0b3JpZXMsIGFuZCBkcml6emxlLWtpdCByZXF1aXJlcyBkcml6emxlLW9ybVxuICogd2l0aG91dCBkZWNsYXJpbmcgaXQsIHdoaWNoIHRoZSBzdG9yZSByZWFscGF0aCBwbGFjZXMgYmV5b25kIGEgcGxhaW4gbm9kZV9tb2R1bGVzIHdhbGstdXAuXG4gKiBMaXN0aW5nIHRoZW0gaW4gYHRydXN0ZWREZXBlbmRlbmNpZXNgIG1ha2VzIEJ1biBtYXRlcmlhbGl6ZSBhIHBlci1wcm9qZWN0IGNvcHkgdW5kZXJcbiAqIGBub2RlX21vZHVsZXMvLmJ1bi9gLCB3aG9zZSBzaWJsaW5nIGBub2RlX21vZHVsZXMvLmJ1bi9ub2RlX21vZHVsZXMvYCBsaW5rcyBldmVyeSBpbnN0YWxsZWRcbiAqIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgdW5kZWNsYXJlZCByZXF1aXJlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQnVuIGNvbnN1bHRzIHRydXN0ZWREZXBlbmRlbmNpZXMgaW4gdGhlIHdvcmtzcGFjZSByb290J3MgcGFja2FnZS5qc29uIG9ubHksIHNvIHRoZSBsaXN0IGlzXG4gIC8vIG1hbmFnZWQgdGhlcmUgYW5kIG11c3QgY292ZXIgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIGFueXdoZXJlIGluIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcbiAgY29uc3QgYnVuSnNvbk9iaiA9IGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbiAmIHsgdHJ1c3RlZERlcGVuZGVuY2llcz86IHN0cmluZ1tdIH07XG4gIC8vIEJ1biBpbnN0YWxscyBvcHRpb25hbCBhbmQgcGVlciBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCwgc28gYWxsIGRlY2xhcmF0aW9uIHNlY3Rpb25zIGNvdW50LlxuICAvLyBFdmVyeSBkZWNsYXJlZCByYW5nZSBpcyBrZXB0IHBlciBwYWNrYWdlOiBhIHJvb3QgZGVjbGFyYXRpb24gbXVzdCBub3QgbWFzayBhIHdvcmtzcGFjZSBvbmVcbiAgLy8gKGUuZy4gcm9vdCBAY2hha3JhLXVpL2NsaSB2MiBhbG9uZ3NpZGUgYSB3b3Jrc3BhY2Ugb24gdjMpLlxuICBjb25zdCBkZWNsYXJlZERlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMgPSAocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgdmVyc2lvblJhbmdlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltzZWN0aW9uXSA/PyB7fSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uUmFuZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgdmVyc2lvblJhbmdlcyA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldChkZXBlbmRlbmN5TmFtZSk7XG4gICAgICAgICAgaWYgKHZlcnNpb25SYW5nZXMpIHtcbiAgICAgICAgICAgIHZlcnNpb25SYW5nZXMucHVzaCh2ZXJzaW9uUmFuZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWNsYXJlZERlcGVuZGVuY2llcy5zZXQoZGVwZW5kZW5jeU5hbWUsIFt2ZXJzaW9uUmFuZ2VdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZykpIHtcbiAgICB0cnkge1xuICAgICAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoXG4gICAgICAgIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvblxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB1bnJlYWRhYmxlIHdvcmtzcGFjZSBwYWNrYWdlLmpzb25cbiAgICB9XG4gIH1cbiAgLy8gT25seSBAY2hha3JhLXVpL2NsaSB2MydzIGBjaGFrcmEgdHlwZWdlbmAgd3JpdGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0O1xuICAvLyB2MidzIGBjaGFrcmEtY2xpIHRva2Vuc2Agd3JpdGVzIGludG8gQGNoYWtyYS11aS9zdHlsZWQtc3lzdGVtIGluc3RlYWQsIHNvIHRydXN0aW5nXG4gIC8vIEBjaGFrcmEtdWkvcmVhY3QgdGhlcmUgd291bGQgZm9yY2UgYSB1c2VsZXNzIHByb2plY3QtbG9jYWwgY29weSB3aXRob3V0IGZpeGluZyBnZW4tY29kZS5cbiAgLy8gTWlycm9yIHdiIGdlbi1jb2RlJ3MgY2xhc3NpZmljYXRpb246IG9ubHkgYSByYW5nZSB3aG9zZSBsZWFkaW5nIG1ham9yIHBhcnNlcyB0byAyIHNlbGVjdHMgdGhlXG4gIC8vIHYyIGNvbW1hbmQsIHNvIGRpZ2l0bGVzcyBzcGVjcyBsaWtlIGBsYXRlc3RgIG9yIGNhdGFsb2cgcmVmZXJlbmNlcyBjb3VudCBhcyB2My5cbiAgY29uc3QgaGFzQ2hha3JhQ2xpVjMgPSAoZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KCdAY2hha3JhLXVpL2NsaScpID8/IFtdKS5zb21lKFxuICAgICh2ZXJzaW9uUmFuZ2UpID0+IC9cXGQrL3UuZXhlYyh2ZXJzaW9uUmFuZ2UpPy5bMF0gIT09ICcyJ1xuICApO1xuICBjb25zdCByZXF1aXJlZFdiZnlQYWNrYWdlcyA9IFtcbiAgICAuLi4oaGFzQ2hha3JhQ2xpVjMgJiYgZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAY2hha3JhLXVpL3JlYWN0JykgPyBbJ0BjaGFrcmEtdWkvcmVhY3QnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdkcml6emxlLWtpdCcpID8gWydkcml6emxlLWtpdCddIDogW10pLFxuICAgIC8vIFRoZXNlIGdpdC1kZXBlbmRlbmN5IGJ1aWxkcyBpbXBvcnQgcGFja2FnZXMgdGhleSBkbyBub3QgZGVjbGFyZSAoZS5nLiB6b2QpLCB3aGljaCB0aGVcbiAgICAvLyBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cDsgYSBwcm9qZWN0LWxvY2FsIGNvcHkgdW5kZXJcbiAgICAvLyBub2RlX21vZHVsZXMvLmJ1biByZXNvbHZlcyB0aGVtIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHkpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpID8gWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgPyBbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA6IFtdKSxcbiAgICAvLyBibGl0eiBhbmQgQGJsaXR6anMvYXV0aCByZXF1aXJlIHJlYWN0IChhbmQgb3RoZXIgcGVlcnMpIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHJlbHlpbmcgb25cbiAgICAvLyBob2lzdGluZywgd2hpY2ggdGhlIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwIChvYnNlcnZlZCBpblxuICAgIC8vIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW06IGBuZXh0IGJ1aWxkYCBwYWdlLWRhdGEgY29sbGVjdGlvbiBkaWVzIHdpdGggXCJDYW5ub3QgZmluZCBtb2R1bGVcbiAgICAvLyAncmVhY3QnXCIgZnJvbSBAYmxpdHpqcy9hdXRoKS4gQGJsaXR6anMvcnBjIGlzIE5PVCBsaXN0ZWQgYmVjYXVzZSBpdCBwcm9wZXJseSBkZWNsYXJlcyBpdHNcbiAgICAvLyByZWFjdC9AdGFuc3RhY2sgcGVlcnMsIHNvIEJ1biBsaW5rcyB0aGVtIGludG8gaXRzIHN0b3JlIGVudHJ5LiBAYmxpdHpqcy9uZXh0IGlzXG4gICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBsaXN0ZWQgZWl0aGVyOiB0cnVzdGluZyBpdCB3b3VsZCBydW4gaXRzIHBvc3RpbnN0YWxsIChgYmxpdHogY29kZWdlbmApLFxuICAgIC8vIHdoaWNoIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2Ug4oCUIHJlcG9zaXRvcmllcyBwYXRjaCBvdXQgdGhhdCBwb3N0aW5zdGFsbFxuICAgIC8vIHdpdGggYGJ1biBwYXRjaGAgaW5zdGVhZCwgd2hpY2ggYWxzbyBrZWVwcyB0aGUgcGFja2FnZSBwcm9qZWN0LWxvY2FsLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2JsaXR6JykgPyBbJ2JsaXR6J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGJsaXR6anMvYXV0aCcpID8gWydAYmxpdHpqcy9hdXRoJ10gOiBbXSksXG4gICAgLy8gQnVuIGRvZXMgbm90IGxpbmsgQGhvb2tmb3JtL3Jlc29sdmVycycgT1BUSU9OQUwgdmFsaWRhdG9yIHBlZXJzIChlLmcuIHpvZCkgaW50byBpdHNcbiAgICAvLyBnbG9iYWwtc3RvcmUgZW50cnkgZXZlbiB3aGVuIHRoZSBwcm9qZWN0IGluc3RhbGxzIHRoZW0sIHNvIGl0cyBzZXJ2ZXItc2lkZVxuICAgIC8vIGBpbXBvcnQgJ3pvZCdgIGZhaWxzIGZyb20gdGhlIHN0b3JlIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAaG9va2Zvcm0vcmVzb2x2ZXJzJykgPyBbJ0Bob29rZm9ybS9yZXNvbHZlcnMnXSA6IFtdKSxcbiAgICAvLyBAem9vbS9ydG1zIGluc3RhbGxzIGl0cyBuYXRpdmUgcnRtcy5ub2RlIGJpbmRpbmcgaW4gYSBsaWZlY3ljbGUgc2NyaXB0LiBXaXRob3V0IGV4cGxpY2l0XG4gICAgLy8gdHJ1c3QsIEJ1biBza2lwcyB0aGF0IHNjcmlwdCBhbmQgdGhlIHBhY2thZ2UgZmFpbHMgYXMgc29vbiBhcyB0aGUgWm9vbSBib3QgaW1wb3J0cyBpdFxuICAgIC8vIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zbWFydHNlLXpvb20tYm90KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAem9vbS9ydG1zJykgPyBbJ0B6b29tL3J0bXMnXSA6IFtdKSxcbiAgXTtcblxuICAvLyB3YmZ5IGZ1bGx5IG93bnMgdGhpcyBmaWVsZDogYSBwYWNrYWdlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIG11c3QgcnVuIGdldHMgYWRkZWQgdG8gd2JmeVxuICAvLyBpdHNlbGYgaW5zdGVhZCBvZiB0byBpbmRpdmlkdWFsIHJlcG9zaXRvcmllcywgc28gdW5tYW5hZ2VkIGVudHJpZXMgYXJlIGFsd2F5cyByZW1vdmVkIOKAlFxuICAvLyBpbmNsdWRpbmcgYW4gZXhwbGljaXRseSBlbXB0eSBkZW55LWFsbCBsaXN0LCB3aG9zZSBkZWxldGlvbiBkZWxpYmVyYXRlbHkgcmVzdG9yZXMgQnVuJ3NcbiAgLy8gZGVmYXVsdCBhbGxvdy1saXN0ICh0aGUgb3duZXJzaGlwIHBvbGljeSBjaG9zZW4gaW4gIzk3NSkuXG4gIGNvbnN0IGV4aXN0aW5nVHJ1c3RlZCA9IGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgaWYgKHJlcXVpcmVkV2JmeVBhY2thZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChleGlzdGluZ1RydXN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRGVsZXRpbmcgdGhlIGZpZWxkIHJlc3RvcmVzIEJ1bidzIGZ1bGwgZGVmYXVsdCBhbGxvdy1saXN0LCBzbyBvbmx5IGVudHJpZXMgb3V0c2lkZSB0aGF0XG4gICAgICAvLyBsaXN0IGFjdHVhbGx5IGxvc2UgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMuXG4gICAgICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCwgbmV3IFNldCgpKTtcbiAgICAgIGRlbGV0ZSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFuIGV4cGxpY2l0IHRydXN0ZWREZXBlbmRlbmNpZXMgbGlzdCBSRVBMQUNFUyBCdW4ncyBkZWZhdWx0IGFsbG93LWxpc3QgaW5zdGVhZCBvZiBleHRlbmRpbmdcbiAgLy8gaXQsIGFuZCBCdW4gcHJpbnRzIG5vIHdhcm5pbmcgZm9yIHRoZSBwb3N0aW5zdGFsbHMgaXQgY29uc2VxdWVudGx5IHNraXBzIChlLmcuIEByYWlsd2F5L2NsaVxuICAvLyBkb3dubG9hZHMgaXRzIGJpbmFyeSBpbiBwb3N0aW5zdGFsbCBhbmQgZXhpdHMgMSB3aXRob3V0IG9uZSkuIEluY2x1ZGUgdGhlIEVOVElSRSBkZWZhdWx0IGxpc3Q6XG4gIC8vIGVudHJpZXMgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQgYXJlIGluZXJ0LCBhbmQgdGhpcyBpcyB0aGUgb25seSByZXByZXNlbnRhdGlvblxuICAvLyB0aGF0IHN0YXlzIGNvcnJlY3QgZm9yIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlc29sdmVzIGFmdGVyIHRoaXNcbiAgLy8gcnVucyDigJQgYW4gaW50ZXJzZWN0aW9uIHdpdGggYSBtaXNzaW5nIG9yIHN0YWxlIGxvY2tmaWxlIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhlbS5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICAvLyBsZWZ0aG9vayBpcyBhcHBlbmRlZCBleHBsaWNpdGx5IHNvIHRoZSBkZWZhdWx0LWxpc3QgbG9va3VwIGZhaWxpbmcgY2Fubm90IGRyb3AgaXQ6IGl0IGlzXG4gIC8vIHJlcXVpcmVkIGluIGV2ZXJ5IG1hbmFnZWQgcmVwb3NpdG9yeS5cbiAgY29uc3QgbmV3VHJ1c3RlZFBhY2thZ2VzID0gbmV3IFNldChbXG4gICAgLi4ucmVxdWlyZWRXYmZ5UGFja2FnZXMsXG4gICAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICAgIC4uLihkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA/PyBbXSksXG4gIF0pO1xuICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCA/PyBbXSwgbmV3VHJ1c3RlZFBhY2thZ2VzKTtcbiAgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzID0gWy4uLm5ld1RydXN0ZWRQYWNrYWdlc10udG9Tb3J0ZWQoKTtcbn1cblxuLy8gVGhlIHBhY2thZ2VzIHdiZnkgaXRzZWxmIG1heSB3cml0ZSBpbnRvIHRydXN0ZWREZXBlbmRlbmNpZXM7IHRoZWlyIHJlbW92YWwgaXMgbWFuYWdlZCBjbGVhbnVwLFxuLy8gbmV2ZXIgYSBsb3NzIG9mIHVzZXIgcG9saWN5LlxuY29uc3Qgd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbXG4gICdAYmxpdHpqcy9hdXRoJyxcbiAgJ0BjaGFrcmEtdWkvcmVhY3QnLFxuICAnQGhvb2tmb3JtL3Jlc29sdmVycycsXG4gICdAd2lsbGJvb3N0ZXIvanVkZ2UnLFxuICAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsXG4gICdAem9vbS9ydG1zJyxcbiAgJ2JsaXR6JyxcbiAgJ2RyaXp6bGUta2l0JyxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuXSk7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGV4aXN0aW5nVHJ1c3RlZDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtlcHRQYWNrYWdlczogUmVhZG9ubHlTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIC8vIEEgZGVmYXVsdC10cnVzdGVkIGVudHJ5IG5ldmVyIGxvc2VzIGFueXRoaW5nIGJ5IHJlbW92YWw6IHdoaWxlIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCB0aGVcbiAgLy8ga2VwdCBsaXN0IChvciwgd2hlbiB0aGUgZmllbGQgaXMgZGVsZXRlZCwgQnVuJ3Mgb3duIGRlZmF1bHQgbGlzdCkgc3RpbGwgdHJ1c3RzIGl0LlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IGV4aXN0aW5nVHJ1c3RlZC5maWx0ZXIoXG4gICAgKHBrZykgPT4gIWtlcHRQYWNrYWdlcy5oYXMocGtnKSAmJiAhd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzLmhhcyhwa2cpICYmICFkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcz8uaGFzKHBrZylcbiAgKTtcbiAgaWYgKHJlbW92ZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFJlbW92aW5nIHVubWFuYWdlZCB0cnVzdGVkRGVwZW5kZW5jaWVzIGVudHJpZXM6ICR7cmVtb3ZlZFBhY2thZ2VzLmpvaW4oJywgJyl9LiB3YmZ5IG93bnMgdGhpcyBmaWVsZDsgaWYgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMgYXJlIHJlcXVpcmVkLCBhZGQgdGhlIHBhY2thZ2VzIHRvIHdiZnkgaXRzZWxmLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbi8qKiBGZXRjaGVzIEJ1bidzIGRlZmF1bHQgdHJ1c3RlZC1kZXBlbmRlbmN5IGFsbG93LWxpc3QgZnJvbSB0aGUgQnVuIHZlcnNpb24gaW5zdGFsbGluZyB0aGUgcmVwb3NpdG9yeS4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcykge1xuICAgIC8vIEJ1biBjb2xvcml6ZXMgdGhlIGxpc3QgbWFya2VycyB3aGVuIEZPUkNFX0NPTE9SIGlzIHNldCAoZS5nLiBieSB0ZXN0IHJ1bm5lcnMgb24gQ0kpLCBzb1xuICAgIC8vIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBtdXN0IGJlIHN0cmlwcGVkIGJlZm9yZSBwYXJzaW5nLlxuICAgIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnYnVuJywgWydwbScsICdkZWZhdWx0LXRydXN0ZWQnXSwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoXG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBtYXRjaGluZyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgcmVxdWlyZXMgdGhlIEVTQyBjb250cm9sIGNoYXJhY3RlclxuICAgICAgL1xcdTAwMUJcXFtbMC05O10qbS9ndSxcbiAgICAgICcnXG4gICAgKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFsuLi5zdGRvdXQubWF0Y2hBbGwoL15cXHMqLVxccysoXFxTKykkL2dtdSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdIGFzIHN0cmluZykpO1xuICAgIGlmIChwYXJzZWREZXBlbmRlbmNpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gRG8gbm90IGNhY2hlIHRoZSBmYWlsdXJlOiBhIHRhcmdldC1sb2NhbCBwcm9ibGVtIChlLmcuIGFuIHVucmVhZGFibGUgcGFja2FnZS5qc29uKSBtdXN0XG4gICAgICAvLyBub3QgZGVueSB0aGUgZGVmYXVsdCBsaXN0IHRvIGV2ZXJ5IGxhdGVyIHRhcmdldCBvZiBhIG11bHRpLXBhdGggcnVuLlxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVhZCB0aGUgZGVmYXVsdCBhbGxvdy1saXN0IHZpYSBgYnVuIHBtIGRlZmF1bHQtdHJ1c3RlZGAuJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IHBhcnNlZERlcGVuZGVuY2llcztcbiAgfVxuICByZXR1cm4gY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgLy8gRXhwbGljaXQgcm9vdCBwdWJsaXNoaW5nIGludGVudCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgd2JmeSdzIHByaXZhdGUgbW9ub3JlcG8tcm9vdCBkZWZhdWx0LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIChjb25maWcucmVsZWFzZS5ucG1QdWJsaXNoZXNSb290IHx8IGpzb25PYmoucHVibGlzaENvbmZpZykpIHtcbiAgICBkZWxldGUganNvbk9iai5wcml2YXRlO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhY29uZmlnLnJlbGVhc2UubnBtICYmICFqc29uT2JqLnB1Ymxpc2hDb25maWcpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJlZ2lzdHJ5LCBucG0gcmVzb2x2ZXMgdGhlIHB1Ymxpc2ggdGFyZ2V0IGZyb20gdGhlIHdvcmtzcGFjZSAubnBtcmMsXG4gICAgLy8gd2hvc2UgZGVmYXVsdCByZWdpc3RyeSBvbiBDSSBtYXkgYmUgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHByb3h5IOKAlCB3aGljaCByZWplY3RzXG4gICAgLy8gYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSAoc2hhcmVkIzEwNzIpLiBgPz89YCBrZWVwcyBhIGRlbGliZXJhdGVseSBkaWZmZXJlbnQgcmVnaXN0cnkuXG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5ID8/PSAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJztcbiAgfVxuICBjb25zdCBvd25lciA9IGNvbmZpZy5yZXBvQXV0aG9yO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ2J1biBydW4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgY29uc3Qgc2NyaXB0UnVubmVyID0gJ2J1biBydW4nO1xuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGAke3NjcmlwdFJ1bm5lcn0gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgaWYgKHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZykpIHtcbiAgICAvLyBQcmVzZXJ2ZSBwcm9qZWN0LXNwZWNpZmljIHN0ZXBzIGEgcmVwbyBhcHBlbmRlZCB0byB0aGUgbWFuYWdlZCBgYnVuIHdiIGdlbi1jb2RlYCAoZS5nLiBidWlsZGluZyBleHRyYSBkZXBsb3lcbiAgICAvLyBhc3NldHMpIGluc3RlYWQgb2YgZGlzY2FyZGluZyB0aGVtOyBvbmx5IHRoZSBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnQgaXMgd2JmeSdzIHRvXG4gICAgLy8gcmVnZW5lcmF0ZS4gQW4gdW5wYXJzZWFibGUgc2NyaXB0IGlzIGxlZnQgYWxvbmUgcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgICBjb25zdCBzZWdtZW50cyA9IGdlbkNvZGVTY3JpcHQgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhnZW5Db2RlU2NyaXB0KTtcbiAgICBjb25zdCBjdXN0b21TZWdtZW50cyA9IHNlZ21lbnRzPy5maWx0ZXIoXG4gICAgICAoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIGpzb25PYmouc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgKTtcbiAgICBpZiAoY3VzdG9tU2VnbWVudHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IFsnYnVuIHdiIGdlbi1jb2RlJywgLi4uY3VzdG9tU2VnbWVudHNdLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8IGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8IGNvbmZpZy5kZXBlbmRpbmcucHJpc21hO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmIGJ1biBydW4gZm9ybWF0LWNvZGVgIDogJ2J1biBydW4gZm9ybWF0LWNvZGUnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBqc29uT2JqOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpLmZpbHRlcihcbiAgICAoZGVwZW5kZW5jeSkgPT5cbiAgICAgIG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpICYmXG4gICAgICAvLyBBIHB1YmxpYyBwYWNrYWdlJ3MgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBtdXN0IG5ldmVyIGJlIHJlLW1hbmFnZWQgdmlhIGEgcmVnaXN0cnkgaW5zdGFsbFxuICAgICAgLy8gKHByaXZhdGUgb25lcyBhcmUgbm9ybWFsaXplZCB0byBgd29ya3NwYWNlOipgIGxhdGVyKS4gVGhpcyBhbHNvIGNvdmVycyBydW5uaW5nIHdiZnkgb24gYVxuICAgICAgLy8gbW9ub3JlcG8gU1VCRElSRUNUT1JZLCB3aGVyZSB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcyBhcmUgaW52aXNpYmxlIGFuZCB0aGUgd29ya3NwYWNlLW1hcFxuICAgICAgLy8gZ3VhcmQgaW4gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMgY2Fubm90IHByb3RlY3QgdGhlIHNwZWNpZmllci5cbiAgICAgIChqc29uT2JqLnByaXZhdGUgfHwgIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuICB9XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgLy8gYG1pc2Ugd2hpY2ggcHl0aG9uYCB5aWVsZHMgdGhlIHNpbmdsZSBhY3RpdmUgaW50ZXJwcmV0ZXIgcGF0aDsgYG1pc2UgY3VycmVudCBweXRob25gIGNhblxuICAvLyBwcmludCBtdWx0aXBsZSBzcGFjZS1zZXBhcmF0ZWQgdmVyc2lvbnMgKG1pc2Ugc3VwcG9ydHMgbXVsdGktdmVyc2lvbiBwaW5zKSwgd2hpY2ggd291bGQgcGFzc1xuICAvLyBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBgcG9ldHJ5IGVudiB1c2VgLiBXaGVuIG1pc2UgaXMgbWlzc2luZyBvciBweXRob24gaXNcbiAgLy8gdW5jb25maWd1cmVkLCBza2lwIGBwb2V0cnkgZW52IHVzZWAgYW5kIGZhbGwgYmFjayB0byBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyIGluc3RlYWQgb2ZcbiAgLy8gYWJvcnRpbmcgdGhlIGNoYWluLlxuICAvLyBUaGUgYHx8IHRydWVgIGNvdmVycyBvbmx5IHRoZSBtaXNlIHJlc29sdXRpb246IGEgbWlzc2luZy91bmNvbmZpZ3VyZWQgbWlzZSBmYWxscyBiYWNrIHRvXG4gIC8vIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIsIHdoaWxlIGEgZmFpbGluZyBgcG9ldHJ5IGVudiB1c2VgIHN0aWxsIGFib3J0cyB0aGUgY2hhaW4uXG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgeyBweXRob25fcGF0aD1cIiQobWlzZSB3aGljaCBweXRob24gMj4vZGV2L251bGwpXCIgfHwgdHJ1ZTsgfSAmJiB7IFsgLXogXCIkcHl0aG9uX3BhdGhcIiBdIHx8IHBvZXRyeSBlbnYgdXNlIFwiJHB5dGhvbl9wYXRoXCI7IH0gJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KSkpLFxuICBdO1xuICBzcGF3blN5bmMoJ2J1bicsIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIC8vIEEgcHJpdmF0ZSBwYWNrYWdlIHdob3NlIG1vbm9yZXBvIGNvbnRhaW5zIHRoaXMgZGVwZW5kZW5jeSBhcyBhIHdvcmtzcGFjZSBtdXN0IHJlZmVyZW5jZSBpdFxuICAgIC8vIHZpYSB0aGUgd29ya3NwYWNlIHByb3RvY29sOiBwaW5uaW5nIGEgcmVnaXN0cnkgdmVyc2lvbiBtYWtlcyBCdW4gc2hhZG93IHRoZSBzYW1lLW5hbWVcbiAgICAvLyB3b3Jrc3BhY2UgYW5kIHNraXAgaW5zdGFsbGluZyB0aGUgd29ya3NwYWNlJ3Mgb3duIGRlcGVuZGVuY2llcy4gKFB1Ymxpc2hlZCBwYWNrYWdlcyBpbnN0ZWFkXG4gICAgLy8gcGluIGEgY29uY3JldGUgdmVyc2lvbiBiZWNhdXNlIGBucG0gcHVibGlzaGAgcmVqZWN0cyBgd29ya3NwYWNlOipgIHNwZWNpZmllcnMg4oCUIGJ1dCBhblxuICAgIC8vIEVYSVNUSU5HIGB3b3Jrc3BhY2U6YCBkZWNsYXJhdGlvbiBpcyBhbHdheXMga2VwdDogb3ZlcndyaXRpbmcgaXQgd2l0aCBhIHJlZ2lzdHJ5IHJlbGVhc2VcbiAgICAvLyB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgbG9jYWwgd29ya3NwYWNlIGxpbmsuKVxuXG4gICAgLy8gQSBkZWNsYXJlZCBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGFsd2F5cyB3aW5zLCB3aGV0aGVyIG9yIG5vdCB0aGUgd29ya3NwYWNlIG1hcCBzZWVzIHRoZVxuICAgIC8vIHBhY2thZ2U6IHJ1bm5pbmcgd2JmeSBvbiBhIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSBoaWRlcyB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcywgc28gdGhlIG1hcFxuICAgIC8vIGFsb25lIGNhbm5vdCBiZSB0cnVzdGVkIHRvIGRldGVjdCBhIGxvY2FsIHdvcmtzcGFjZSBsaW5rLlxuICAgIGlmIChwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoanNvbk9iai5wcml2YXRlKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoanNvbk9iai5wcml2YXRlICYmIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZXhpc3RpbmdTcGVjaWZpZXIgfHwgZXhpc3RpbmdTcGVjaWZpZXIuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBbiBleGlzdGluZyBDT05DUkVURSBwaW4gb24gYSB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhIGRlbGliZXJhdGUgY2hvaWNlIGFuZCBtdXN0IG5vdCBiZVxuICAgICAgLy8gY29udmVydGVkIHRvIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2wuIE5vdGUgdGhlIHRyYWRlLW9mZiBlaXRoZXIgd2F5OiBucG0gKHdoaWNoXG4gICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlXG4gICAgICAvLyBhIHJlZ2lzdHJ5IHBpbiBtYWtlcyBhIGNvbGQgYnVuIGluc3RhbGwgc2hhZG93IHRoZSB3b3Jrc3BhY2UgYW5kIHNraXAgaXRzIGRlcGVuZGVuY2llcyDigJRcbiAgICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBrZWVwcyBgd29ya3NwYWNlOipgIGFuZCBzdHJpcHMgdGhlIHByb3RvY29sIG9uIHRoZSBDSSBjaGVja291dCByaWdodFxuICAgICAgLy8gYmVmb3JlIHJlbGVhc2luZyAoc2NyaXB0cy9zdHJpcFdvcmtzcGFjZVByb3RvY29sLm1qcykuIEZhbGwgdGhyb3VnaCBzbyBhIGNvbmNyZXRlIHBpblxuICAgICAgLy8ga2VlcHMgYmVpbmcgYnVtcGVkIGxpa2UgYW55IG1hbmFnZWQgZGVwZW5kZW5jeS5cbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHJvb3RDb25maWcsXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGNvbnN0IG1hbmFnZWRWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSwgbWFuYWdlZFZlcnNpb24pKSB7XG4gICAgICAgIC8vIGBidW4gYWRkIGRlcGVuZGVuY3lgIHByZXNlcnZlcyBhbiBleGlzdGluZyBleGFjdCBwaW4sIHNvIHdyaXRlIHRoZSBhZ2UtY2xlYXJlZCB2ZXJzaW9uXG4gICAgICAgIC8vIGRpcmVjdGx5LiBUaGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGluc3RhbGwgcmVmcmVzaGVzIHRoZSBsb2NrZmlsZSBhZnRlciBldmVyeSBwYWNrYWdlXG4gICAgICAgIC8vIG1hbmlmZXN0IGhhcyBjb252ZXJnZWQgb24gdGhlIGdlbmVyYXRlZCByZWxlYXNlLWFnZSBwb2xpY3kuXG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbWFuYWdlZFZlcnNpb247XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoIXNraXBBZGRpbmdEZXBzKSBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24gPT09ICcqJyAmJiBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBsYXRlc3RWZXJzaW9uO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICAvLyBUeXBlU2NyaXB0IDcncyBuYXRpdmUgY29tcGlsZXIgZHJvcHBlZCB0aGUgaW4tcHJvY2VzcyBgcGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbmBcbiAgICAvLyBoZWxwZXIsIHNvIHBhcnNlIHRoZSB0c2NvbmZpZyBpbnRvIGFuIEFTVCBhbmQgcmVhZCBpdHMgdG9wLWxldmVsIGBleHRlbmRzYCBkaXJlY3RseS5cbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoYWJzb2x1dGVGaWxlUGF0aCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkLmApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuLyoqIFJlYWRzIHRoZSB0b3AtbGV2ZWwgYGV4dGVuZHNgIGVudHJpZXMgKGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MpIGZyb20gYSBwYXJzZWQgdHNjb25maWcuICovXG5mdW5jdGlvbiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSAmJiBhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpICYmIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ2V4dGVuZHMnKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhwcm9wZXJ0eS5pbml0aWFsaXplciwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogcmVhZG9ubHkgYXN0Lk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoYXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChzdGF0ZW1lbnQpICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uLnByb3BlcnRpZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMobm9kZTogYXN0LkV4cHJlc3Npb24sIHZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGFzdC5pc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICB2YWx1ZXMucHVzaChub2RlLnRleHQpO1xuICB9IGVsc2UgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMoZWxlbWVudCwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGRlcGVuZGVuY3kpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpKSB7XG4gICAgcmV0dXJuIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSkpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lcylbMF0gPz8gJyonO1xufVxuXG4vKiogRXZlcnkgc3RhYmxlIHJlbGVhc2UgaW4gYHRpbWVzYCB0aGF0IGFscmVhZHkgY2xlYXJlZCB0aGUgYWdlIGdhdGUsIG5ld2VzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nW10ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpXG4gICAgLm1hcCgoW3ZlcnNpb25dKSA9PiB2ZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaXNoZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwdWJsaXNoZWRUaW1lID0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHVibGlzaGVkVGltZSkgJiYgRGF0ZS5ub3coKSAtIHB1Ymxpc2hlZFRpbWUgPj0gcGFja2FnZUFnZUdhdGVNcztcbn1cblxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3k6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGRlcGVuZGVuY3kucmVwbGFjZSgvQFteQC9dKyQvdSwgJycpO1xuICBjb25zdCBjYWNoZWRUaW1lcyA9IG5wbVBhY2thZ2VUaW1lc0NhY2hlLmdldChwYWNrYWdlTmFtZSk7XG4gIGlmIChjYWNoZWRUaW1lcykgcmV0dXJuIGNhY2hlZFRpbWVzO1xuXG4gIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnbnBtJyxcbiAgICBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3RpbWUnLCAnLS1qc29uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgIHByb2Nlc3MuY3dkKClcbiAgKTtcbiAgaWYgKCFzdGRvdXQpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgW1JlY29yZDxzdHJpbmcsIHN0cmluZz5dO1xuICAgIGNvbnN0IHRpbWVzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkWzBdIDogcGFyc2VkO1xuICAgIGlmICghdGltZXMpIHJldHVybiB7fTtcbiAgICBucG1QYWNrYWdlVGltZXNDYWNoZS5zZXQocGFja2FnZU5hbWUsIHRpbWVzKTtcbiAgICByZXR1cm4gdGltZXM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBLZWVwIG1hbmFnZWQgZmlyc3QtcGFydHkgcGFja2FnZXMgYWxpZ25lZCB3aXRoIEJ1bidzIGV4cGxpY2l0IGV4ZW1wdGlvbnMuIHdiZnkncyBnZW5lcmF0ZWRcbiAgLy8gY29uZmlndXJhdGlvbiBjYW4gcmVseSBvbiB0aGUgY3VycmVudCB3YiBjb250cmFjdCwgc28gaW5kZXBlbmRlbnRseSBzb2FraW5nIG9yIGRvd25ncmFkaW5nIHdiXG4gIC8vIHdvdWxkIHBhaXIgbmV3IGdlbmVyYXRlZCBmaWxlcyB3aXRoIGFuIGluY29tcGF0aWJsZSBvbGQgQ0xJLiBUaG9zZSBwYWNrYWdlcyBhcmUgcmVsZWFzZWQgYW5kXG4gIC8vIGZpeGVkIGF0IHRoZWlyIHNvdXJjZSBpbnN0ZWFkOyBvbmx5IHBhY2thZ2VzIEJ1biBpdHNlbGYgZ2F0ZXMgbWF5IGJlIHNlbGVjdGVkIGZyb20gb2xkZXIgdGFncy5cbiAgcmV0dXJuICFidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLnNvbWUoKHBhdHRlcm4pID0+IGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm4sIGRlcGVuZGVuY3kpKTtcbn1cblxuZnVuY3Rpb24gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHBhdHRlcm4gPT09IGRlcGVuZGVuY3kpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhdHRlcm4uaW5jbHVkZXMoJyonKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlQWxsKC9bLis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCkucmVwbGFjZUFsbCgnKicsICcuKicpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGAsICd1JykudGVzdChkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5vIGNhY2hlIGhlcmU6IHRoZSBvbmx5IGNhbGxlciBjaGFpbiBnb2VzIHRocm91Z2ggZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24sIHdoaWNoIGFscmVhZHlcbiAgLy8gbWVtb2l6ZXMgcGVyIGRlcGVuZGVuY3ksIHNvIHRoaXMgY2FuIHJ1biBhdCBtb3N0IG9uY2UgcGVyIGRlcGVuZGVuY3kuXG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIGRlcGVuZGVuY3ksICd2ZXJzaW9uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLCBwcm9jZXNzLmN3ZCgpKSB8fCAnKic7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gVHlwZVNjcmlwdCBpcyB2ZXJzaW9uLWNhcHBlZCBpbiBCbGl0eiByZXBvc2l0b3JpZXMsIHNvIGl0cyBpbnN0YWxsIHNwZWNpZmllciBtdXN0IGNhcnJ5IHRoZVxuICAvLyBtYW5hZ2VkIHZlcnNpb24g4oCUIGEgYmFyZSBgYnVuIGFkZGAgd291bGQgaW5zdGFsbCB0aGUgaW5jb21wYXRpYmxlIGxhdGVzdC5cbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICByZXR1cm4gYCR7ZGVwZW5kZW5jeX1AJHtnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KX1gO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmN5O1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVwb3NpdG9yeSBjb250YWlucyBhIEJsaXR6IGFwcCAodGhlIGN1cnJlbnQgcGFja2FnZSBvciB0aGUgd29ya3NwYWNlIHJvb3QpLiAqL1xuZnVuY3Rpb24gaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHJvb3RDb25maWcuZGVwZW5kaW5nLmJsaXR6O1xufVxuXG5jb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbi8qKiBNYXAgZnJvbSBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlJ3MgbmFtZSB0byBpdHMgZGlyZWN0b3J5IChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLmdldChyb290Q29uZmlnLmRpclBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHdvcmtzcGFjZURpcnNCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCksICd1dGY4JylcbiAgICAgICkgYXMgUGFja2FnZUpzb247XG4gICAgICBpZiAod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSkge1xuICAgICAgICB3b3Jrc3BhY2VEaXJzQnlOYW1lLnNldCh3b3Jrc3BhY2VQYWNrYWdlSnNvbi5uYW1lLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5wYXJzYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIHdvcmtzcGFjZVBhY2thZ2VEaXJzQ2FjaGUuc2V0KHJvb3RDb25maWcuZGlyUGF0aCwgd29ya3NwYWNlRGlyc0J5TmFtZSk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJzQnlOYW1lO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICBjb25zdCBjdXJyZW50VmFsaWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gQSBUeXBlU2NyaXB0IDcgcGluIGluIGEgQmxpdHogcmVwb3NpdG9yeSBpcyBsaWtld2lzZSBpbmNvbXBhdGlibGUgKGBuZXh0IGJ1aWxkYCBmYWlscyBvblxuICAvLyB0aGUgTmV4dC5qcyAxNSB0aGF0IEJsaXR6IHBpbnMg4oCUIHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLCBzbyByZXdyaXRlIGl0IHRvIHRoZVxuICAvLyBjYXBwZWQgcmVsZWFzZSBpbnN0ZWFkIG9mIHByZXNlcnZpbmcgaXQgdmlhIHRoZSBuby1kb3duZ3JhZGUgcnVsZSBiZWxvdy4gVGhlIHBpbiBtYXkgYmUgYVxuICAvLyBSQU5HRSAoZS5nLiBgXjcuMC4wYCksIHdoaWNoIHNlbXZlci52YWxpZCByZWplY3RzIOKAlCBqdWRnZSB0aGUgbWFqb3IgZnJvbSB0aGUgcmFuZ2UgbWluaW11bS5cbiAgY29uc3QgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uID1cbiAgICBjdXJyZW50VmFsaWRWZXJzaW9uID8/IChzZW12ZXIudmFsaWRSYW5nZShjdXJyZW50VmVyc2lvbikgPyBzZW12ZXIubWluVmVyc2lvbihjdXJyZW50VmVyc2lvbik/LnZlcnNpb24gOiB1bmRlZmluZWQpO1xuICBpZiAoXG4gICAgZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiZcbiAgICBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpICYmXG4gICAgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uICYmXG4gICAgc2VtdmVyLm1ham9yKGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbikgPj0gNyAmJlxuICAgIHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbikgJiZcbiAgICBpc05ld2VyUGFja2FnZVZlcnNpb24oY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBUaGUgZ2VuZXJhdGVkIGJ1bmZpZyBhcHBsaWVzIHRoZSBvcmdhbml6YXRpb24gYWdlIGdhdGUgZXZlbiB0byBleGFjdCBwaW5zLiBJZiBhIG1hbmFnZWRcbiAgLy8gdGhpcmQtcGFydHkgdG9vbCBpcyBuZXdlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZSB0aGF0IGNsZWFyZWQgdGhhdCBnYXRlLCBwcmVzZXJ2aW5nIHRoZSBwaW5cbiAgLy8gcHJvZHVjZXMgYSBwYWNrYWdlLmpzb24gdGhhdCBhIGZyZXNoIGluc3RhbGwgd2l0aG91dCB0aGUgb2xkIGxvY2tmaWxlIGNhbm5vdCByZXNvbHZlIChub3RhYmx5XG4gIC8vIG9wdGltaXplZCBEb2NrZXIgYnVpbGRzKS4gS2VlcCB0aGUgbm8tZG93bmdyYWRlIHBvbGljeSBvbmx5IHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgZXhlbXB0IGZyb21cbiAgLy8gdGhlIGdhdGU7IGFnZS1nYXRlZCBtYW5hZ2VkIHRvb2xzIG11c3QgY29udmVyZ2Ugb24gdGhlIHZlcnNpb24gdGhlIGdlbmVyYXRlZCBidW5maWcgYWNjZXB0cy5cbiAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIHdiZnkgb3ducyB0aGVzZSB0b29sIGRlcGVuZGVuY2llcywgYnV0IGFwcGx5aW5nIHdiZnkgc2hvdWxkIG5vdCBkb3duZ3JhZGUgYVxuICAvLyByZXBvc2l0b3J5IHRoYXQgYWxyZWFkeSBwaW5zIGEgbmV3ZXIgcmV2aWV3ZWQgcmVsZWFzZSB3aGVuIHRoZSBvcmcgcG9saWN5IGV4ZW1wdHMgaXQuXG4gIHJldHVybiBpc05ld2VyUGFja2FnZVZlcnNpb24obWFuYWdlZFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtYW5hZ2VkVmVyc2lvbjogc3RyaW5nXG4pOiBjdXJyZW50VmVyc2lvbiBpcyBzdHJpbmcge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHZhbGlkQ3VycmVudFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICBjb25zdCB2YWxpZE1hbmFnZWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKG1hbmFnZWRWZXJzaW9uKTtcbiAgcmV0dXJuIChcbiAgICBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpICYmXG4gICAgdmFsaWRDdXJyZW50VmVyc2lvbiAhPT0gbnVsbCAmJlxuICAgIHZhbGlkTWFuYWdlZFZlcnNpb24gIT09IG51bGwgJiZcbiAgICBzZW12ZXIuZ3QodmFsaWRDdXJyZW50VmVyc2lvbiwgdmFsaWRNYW5hZ2VkVmVyc2lvbilcbiAgKTtcbn1cblxuLy8gVGhlIG5ld2VzdCBUeXBlU2NyaXB0IDYgcmVsZWFzZSBhdCB0aGUgdGltZSB0aGUgQmxpdHogY2FwIHNoaXBwZWQ7IHVzZWQgb25seSB3aGVuIHRoZSByZWdpc3RyeVxuLy8gbG9va3VwIGZvciB0aGUgYWN0dWFsIG5ld2VzdCBwcmUtdjcgcmVsZWFzZSBmYWlscyAoc2VlIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbikuXG5jb25zdCBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uID0gJzYuMC4zJztcblxuZnVuY3Rpb24gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICBpZiAoZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiYgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSkge1xuICAgIC8vIEJsaXR6IHBpbnMgTmV4dC5qcyAxNSwgd2hvc2UgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCByZXF1aXJlcyB0aGUgY2xhc3NpY1xuICAgIC8vIGB0eXBlc2NyaXB0YCBjb21waWxlciBBUEk7IHRoZSBUeXBlU2NyaXB0IDcgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gYmluYXJ5XG4gICAgLy8gd2l0aG91dCB0aGF0IEFQSSwgc28gYG5leHQgYnVpbGRgIGFib3J0cyB3aXRoIFwiRmFpbGVkIHRvIGluc3RhbGwgcmVxdWlyZWQgVHlwZVNjcmlwdFxuICAgIC8vIGRlcGVuZGVuY2llc1wiIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS4gQ2FwIGB0eXBlc2NyaXB0YCBiZWxvdyA3IHVudGlsXG4gICAgLy8gQmxpdHogc3VwcG9ydHMgYSBOZXh0LmpzIHJlbGVhc2UgdGhhdCB1bmRlcnN0YW5kcyB0c2dvLiBBIGZhaWxlZCByZWdpc3RyeSBsb29rdXAgbXVzdFxuICAgIC8vIHJlc29sdmUgdG8gYSBrbm93bi1jb21wYXRpYmxlIHJlbGVhc2Ug4oCUIGZhbGxpbmcgYmFjayB0byBsYXRlc3RWZXJzaW9uIHdvdWxkIHJlaW5zdGFsbCB0aGVcbiAgICAvLyBpbmNvbXBhdGlibGUgVHlwZVNjcmlwdCA3LlxuICAgIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChsYXRlc3RWZXJzaW9uKTtcbiAgICBpZiAodmFsaWRMYXRlc3RWZXJzaW9uICYmIHNlbXZlci5tYWpvcih2YWxpZExhdGVzdFZlcnNpb24pIDwgNykgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gICAgLy8gVGhlIGNhcHBlZCBsb29rdXAgbXVzdCByZXNwZWN0IHRoZSBhZ2UgZ2F0ZSB0b286IHRoaXMgdmVyc2lvbiBpcyB3cml0dGVuIGFzIGFuIGV4YWN0IHBpbixcbiAgICAvLyBhbmQgQnVuIHJlZnVzZXMgdG8gcmVzb2x2ZSBvbmUgcHVibGlzaGVkIGluc2lkZSB0aGUgbWluaW11bS1yZWxlYXNlLWFnZSB3aW5kb3cuIFRoZXJlIGlzIG5vXG4gICAgLy8gdW5nYXRlZCBmYWxsYmFjayDigJQgd2l0aG91dCBwdWJsaWNhdGlvbiBtZXRhZGF0YSB0aGUgYWdlIG9mIGEgcmFuZ2UgcmVzdWx0IGlzIHVua25vd24sIHNvIGFcbiAgICAvLyBwYXJ0aWFsIHJlZ2lzdHJ5IGZhaWx1cmUgd291bGQgb3RoZXJ3aXNlIHdyaXRlIGEgdmVyc2lvbiBCdW4gdGhlbiByZWZ1c2VzIHRvIGluc3RhbGwuXG4gICAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHR5cGVzY3JpcHREZXBlbmRlbmN5LCAnNy4wLjAnKSA/PyBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uO1xuICB9XG4gIHJldHVybiBsYXRlc3RWZXJzaW9uO1xufVxuXG4vKipcbiAqIFRoZSBoaWdoZXN0IHJlbGVhc2Ugb2YgYHBhY2thZ2VOYW1lYCBiZWxvdyBgZXhjbHVzaXZlVXBwZXJCb3VuZGAgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZVxuICogZ2F0ZSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHJlZ2lzdHJ5IGxvb2t1cCBmYWlscyBvciBubyBzdWNoIHJlbGVhc2UgZXhpc3RzIHlldC5cbiAqL1xuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWRWZXJzaW9uQmVsb3cocGFja2FnZU5hbWU6IHN0cmluZywgZXhjbHVzaXZlVXBwZXJCb3VuZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKGdldE5wbVBhY2thZ2VUaW1lcyhwYWNrYWdlTmFtZSkpLmZpbmQoKHZlcnNpb24pID0+XG4gICAgc2VtdmVyLmx0KHZlcnNpb24sIGV4Y2x1c2l2ZVVwcGVyQm91bmQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjYW5kaWRhdGVWZXJzaW9uOiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGNhbmRpZGF0ZVZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29sc1xuICAgIC8vIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICAgIGNsZWFudXA6ICdidW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgZm9ybWF0OiBgYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgIGxpbnQ6IGBidW4gd2IgbGludGAsXG4gICAgJ2xpbnQtZml4JzogJ2J1biB3YiBsaW50IC0tZml4JyxcbiAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgIHR5cGVjaGVjazogJ2J1biB3YiB0eXBlY2hlY2snLFxuICAgIHZlcmlmeTogJ2J1biB3YiB2ZXJpZnknLFxuICAgICd2ZXJpZnktZnVsbCc6ICdidW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gIH07XG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAgfVxuICBhcHBseVRlc3RTY3JpcHQoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAga2VlcEdlbmVyYXRlZFNjcmlwdFdyYXBwZXJzKHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsndGVzdCcsICd2ZXJpZnktZnVsbCddKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBgYnVuICR7Z2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnKX1gKTtcbiAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJyAmJiBweXJpZ2h0JztcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLy8gQ0kgd29ya2Zsb3dzIChib3RoIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IGFuZCB0aGUgc2VsZi1jb250YWluZWQgdmFyaWFudCBmb3Igbm9uLVdpbGxCb29zdGVyXG4vLyByZXBvc2l0b3JpZXMpIHByZWZlciBgdGVzdC9jaWAgb3ZlciBgdGVzdGAsIHNvIHN0YW5kYXJkaXplIGl0IG9uIGB3YiB0ZXN0LW9uLWNpYCBhdCB0aGUgcm9vdCDigJRcbi8vIGB3YiB0ZXN0LW9uLWNpYCBhbHJlYWR5IGl0ZXJhdGVzIHdvcmtzcGFjZSBwYWNrYWdlcyBpdHNlbGYuXG5mdW5jdGlvbiBhcHBseVRlc3RPbkNpU2NyaXB0KHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1sndGVzdC9jaSddO1xuICAvLyBTb21lIHJlcG9zaXRvcmllcyB3cmFwIENJIHRlc3RzIHdpdGggZXh0cmEgc3RlcHMgKGUuZy4gc2VsZWN0aW5nIHNwZWMgZmlsZXMgb3IgcnVubmluZyByYXdcbiAgLy8gUGxheXdyaWdodCkgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHk7IHN1Y2ggd3JhcHBlcnMgYXJlIHByZXNlcnZlZC5cbiAgc2NyaXB0c1sndGVzdC9jaSddID0gb2xkU2NyaXB0ICYmICFpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KG9sZFNjcmlwdCkgPyBvbGRTY3JpcHQgOiAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKiogV2hldGhlciBhIHNjcmlwdCBib2R5IGlzIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIGB3YiB0ZXN0LW9uLWNpYCBpbnZvY2F0aW9ucy4gKi9cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdE9uQ2lTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdC1vbi1jaSc7XG59XG5cbi8qKlxuICogYHdiIHRlc3RgIHJ1bnMgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IHRlc3QgcnVubmVycyBvbmx5LCBzbyByZXBsYWNpbmcgdGhlIGB0ZXN0YCBzY3JpcHQgb2YgYVxuICogcGFja2FnZSB3cml0dGVuIGluIGFub3RoZXIgbGFuZ3VhZ2UgKGUuZy4gYSBNYXZlbiBvciBhbiBSU3BlYyBwYWNrYWdlIGluIGEgcG9seWdsb3QgbW9ub3JlcG8pXG4gKiBzaWxlbnRseSBkcm9wcyBpdHMgd2hvbGUgc3VpdGU6IHRoZSBnZW5lcmF0ZWQgc2NyaXB0IHRoZW4gc3VjY2VlZHMgd2l0aG91dCBydW5uaW5nIGFueXRoaW5nLlxuICogU3VjaCBhIHBhY2thZ2Uga2VlcHMgaXRzIG93biBgdGVzdGAgc2NyaXB0OyBKUy9UUyBwYWNrYWdlcyBhcmUgc3RhbmRhcmRpemVkIGFzIHVzdWFsLlxuICovXG5mdW5jdGlvbiBhcHBseVRlc3RTY3JpcHQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0c1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHMudGVzdD8udHJpbSgpO1xuICBpZiAoIW9sZFNjcmlwdCB8fCBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGlzR2VuZXJhdGVkVGVzdFNjcmlwdChvbGRTY3JpcHQpKSByZXR1cm47XG4gIHNjcmlwdHMudGVzdCA9IG9sZFNjcmlwdDtcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIEtOT1dOIGdlbmVyYXRlZCBgd2IgdGVzdGAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdCc7XG59XG5cbi8qKlxuICogS2VlcHMgYSBzY3JpcHQgdGhhdCBDSEFJTlMgZXh0cmEgY29tbWFuZHMgb250byB0aGUgZ2VuZXJhdGVkIG9uZSAoZS5nLiBhIHBvbHlnbG90IG1vbm9yZXBvXG4gKiBhcHBlbmRpbmcgaXRzIE1hdmVuIGFuZCBSU3BlYyBzdWl0ZXMgdG8gYHdiIHRlc3RgLCB3aGljaCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCBydW5uZXJzXG4gKiBvbmx5KS4gU3VjaCBhIHdyYXBwZXIgc3RpbGwgcnVucyB0aGUgZ2VuZXJhdGVkIGNvbW1hbmQsIHNvIHJlcGxhY2luZyBpdCB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZVxuICogcmVwb3NpdG9yeSdzIG93biBzdGVwcyDigJQgdGhlIHNhbWUgcmVhc29uaW5nIGFzIGBhcHBseVRlc3RPbkNpU2NyaXB0YC4gQW4gdW5yZWNvZ25pemVkIGNoYWluZWRcbiAqIHNjcmlwdCBpcyBrZXB0IHdob2xlc2FsZSByYXRoZXIgdGhhbiBsb3NpbmcgaXRzIHByb2plY3Qtb3duZWQgY29tbWFuZHMuXG4gKi9cbmZ1bmN0aW9uIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgc2NyaXB0TmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIHNjcmlwdE5hbWVzKSB7XG4gICAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tzY3JpcHROYW1lXT8udHJpbSgpO1xuICAgIGNvbnN0IGdlbmVyYXRlZFNjcmlwdCA9IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKCFvbGRTY3JpcHQgfHwgIWdlbmVyYXRlZFNjcmlwdCB8fCBvbGRTY3JpcHQgPT09IGdlbmVyYXRlZFNjcmlwdCkgY29udGludWU7XG4gICAgY29uc3QgaGVhZFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICBgXiR7ZXNjYXBlUmVnRXhwKGdlbmVyYXRlZFNjcmlwdCkucmVwbGFjZUFsbCgnICcsIFN0cmluZy5yYXdgWyBcXHRdK2ApfSg/PVsgXFxcXHRdKig/OiYmfFxcXFx8XFxcXHx8O3xcXFxcbikpYCxcbiAgICAgICd1J1xuICAgICk7XG4gICAgLy8gQSBuZXdsaW5lIHNlcGFyYXRlcyBzaGVsbCBjb21tYW5kcyBqdXN0IGxpa2UgJiYsIHx8IGFuZCA7LlxuICAgIGlmIChoZWFkUmVnRXhwLnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgLy8gQSBmdW5jdGlvbiByZXBsYWNlbWVudCBrZWVwcyBgJGAtc2hhcGVkIGNoYXJhY3RlcnMgaW4gdGhlIGdlbmVyYXRlZCBjb21tYW5kIGxpdGVyYWwuXG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0LnJlcGxhY2UoaGVhZFJlZ0V4cCwgKCkgPT4gZ2VuZXJhdGVkU2NyaXB0KTtcbiAgICB9IGVsc2UgaWYgKC8oPzomJnxcXHxcXHx8O3xcXG4pL3UudGVzdChvbGRTY3JpcHQpKSB7XG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICB3YkRiQ29tbWFuZDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm47XG5cbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItY3JlYXRlLW1pZ3JhdGlvbicsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlLWRldmAsICdtaWdyYXRlLWRldicpO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KFxuICAgIHNjcmlwdHMsXG4gICAgb2xkU2NyaXB0cyxcbiAgICAnZGItbWlncmF0ZScsXG4gICAgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeWAsXG4gICAgJ21pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeSdcbiAgKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItdmlldycsIGAke3diRGJDb21tYW5kfSBzdHVkaW9gLCAnc3R1ZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHQoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWU6IHN0cmluZyxcbiAgZ2VuZXJhdGVkU2NyaXB0OiBzdHJpbmcsXG4gIGdlbmVyYXRlZEFyZ3VtZW50czogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tuYW1lXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBtaWdyYXRpb24gY29tbWFuZHMgdG8gcHJlcGFyZSBTUUxpdGUgZGlyZWN0b3JpZXMsXG4gIC8vIGZhbiBvdXQgb3ZlciB0ZW5hbnRzLCBvciBwZXJmb3JtIGNsZWFudXAgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHkuXG4gIGNvbnN0IGdlbmVyYXRlZEJvZGllcyA9IFtgYnVuIHdiIGRiICR7Z2VuZXJhdGVkQXJndW1lbnRzfWAsIGBidW4gd2IgcHJpc21hICR7Z2VuZXJhdGVkQXJndW1lbnRzfWBdO1xuICBzY3JpcHRzW25hbWVdID0gb2xkU2NyaXB0ICYmICFnZW5lcmF0ZWRCb2RpZXMuaW5jbHVkZXMob2xkU2NyaXB0LnRyaW0oKSkgPyBvbGRTY3JpcHQgOiBnZW5lcmF0ZWRTY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICByZXR1cm4gJ3diIGRiJztcbn1cblxuZnVuY3Rpb24gaXNXYlBhY2thZ2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlSnNvbj8ubmFtZSA9PT0gd2JEZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBhcHBseU1pc2VUYXNrU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoIWhhc01pc2VUYXNrKGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICAvLyBQcmVzZXJ2ZSBhIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudiBwcmVmaXggKGUuZy4gYE1JU0VfRU5WPXRlc3RgKSBvbiBhbiBleGlzdGluZyBtaXNlIGJyaWRnZS5cbiAgICAvLyBTdWNoIGEgcHJlZml4IGlzIHJlcXVpcmVkIGZvciBtaXNlIGNvbmZpZyBlbnZpcm9ubWVudHMgKG1pc2UuPE1JU0VfRU5WPi50b21sKSwgd2hpY2ggYXJlXG4gICAgLy8gc2VsZWN0ZWQgZnJvbSBNSVNFX0VOViAqYmVmb3JlKiBtaXNlIHN0YXJ0cyBhbmQgY2Fubm90IGJlIHN3aXRjaGVkIGZyb20gaW5zaWRlIGEgdGFzazsgZHJvcHBpbmdcbiAgICAvLyBpdCB3b3VsZCBzaWxlbnRseSBydW4gdGhlIHRhc2sgaW4gdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gICAgY29uc3QgZW52UHJlZml4ID0gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgob2xkU2NyaXB0c1tuYW1lXSwgbmFtZSk7XG4gICAgaWYgKGVudlByZWZpeCA9PT0gdW5kZWZpbmVkICYmIG9sZFNjcmlwdHNbbmFtZV0gJiYgIShuYW1lIGluIHNjcmlwdHMpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW25hbWVdID0gYCR7ZW52UHJlZml4ID8/ICcnfW1pc2UgcnVuICR7bmFtZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52LXZhciBwcmVmaXggb2YgYW4gZXhpc3RpbmcgYG1pc2UgcnVuIDxuYW1lPmAgYnJpZGdlIHNjcmlwdFxuICogKHBvc3NpYmx5IGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBicmlkZ2UgaGFzIG5vIHByZWZpeCksIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNjcmlwdCBpcyBub3QgYVxuICogbWlzZSBicmlkZ2UgZm9yIHRoZSBnaXZlbiB0YXNrLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gRWFjaCBhc3NpZ25tZW50IHZhbHVlIG1heSBiZSBkb3VibGUtcXVvdGVkLCBzaW5nbGUtcXVvdGVkLCBvciBhbiB1bnF1b3RlZCBydW4gb2Ygbm9uLXdoaXRlc3BhY2UsXG4gIC8vIHNvIHByZWZpeGVzIGxpa2UgYE1JU0VfRU5WPVwiYSBiXCJgICh3aG9zZSB2YWx1ZSBjb250YWlucyBzcGFjZXMpIGFyZSBtYXRjaGVkIGluc3RlYWQgb2YgZHJvcHBlZC5cbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXigoPzpcXHcrPSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xcXFMrKVxccyspKiltaXNlIHJ1biAke2VzY2FwZVJlZ0V4cChuYW1lKX0kYCwgJ3UnKS5leGVjKFxuICAgIHNjcmlwdC50cmltKClcbiAgKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV07XG59XG5cbmZ1bmN0aW9uIGhhc01pc2VUYXNrKGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKGNvbmZpZy5taXNlVGFza3MsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXNrID0gY29uZmlnLm1pc2VUYXNrc1tuYW1lXTtcbiAgaWYgKCF0YXNrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VycyA9IFsnYnVuJywgJ3lhcm4nLCAnbnBtJywgJ3BucG0nXTtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2Vycy5zb21lKChwYWNrYWdlTWFuYWdlcikgPT5cbiAgICBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxiJHtwYWNrYWdlTWFuYWdlcn1cXHMrKD86cnVuXFxzKyk/JHtlc2NhcGVSZWdFeHAobmFtZSl9KD8hW2EtekEtWjAtOV9cXC06Ll0pYCwgJ3UnKS50ZXN0KHRhc2spXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlczoge1xuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gICAgb3JnOiBzdHJpbmc7XG4gICAgcmVwbzogc3RyaW5nO1xuICAgIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJztcbiAgfVtdID0gW1xuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicsIG9yZzogJ1dpbGxCb29zdGVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5Jywgb3JnOiAnV2lsbEJvb3N0ZXJMYWInLCByZXBvOiAnbGxtLXByb3h5JywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICBdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHByaXZhdGVQYWNrYWdlcy5tYXAoYXN5bmMgKHsgb3JnLCBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXSA/PyBqc29uT2JqLmRldkRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV07XG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBpc1Bpbm5lZFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKGV4aXN0aW5nU3BlY2lmaWVyLCBvcmcsIHJlcG8pXG4gICAgICAgID8gZXhpc3RpbmdTcGVjaWZpZXJcbiAgICAgICAgOiBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmcsIHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZXhpc3Rpbmcgc3BlY2lmaWVyIGFscmVhZHkgcGlucyBhIGdpdCByZWYgb2YgdGhlIGV4cGVjdGVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAqIHdiZnkgbXVzdCBub3QgYnVtcCBzdWNoIHBpbnM6IGEgcnVuIGludGVuZGVkIGFzIGNvbmZpZ3VyYXRpb24vcGFja2FnZS1tYW5hZ2VyIG1haW50ZW5hbmNlXG4gKiB3b3VsZCBvdGhlcndpc2UgY2hhbmdlIHRoZSBkZXBlbmRlbmN5J3MgdmVyc2lvbiBhcyBhIHNpZGUgZWZmZWN0ICh1cGRhdGluZyBwaW5zIGlzIFJlbm92YXRlJ3NcbiAqIGpvYiksIHBvc3NpYmx5IHRvIGEgY29tbWl0IHdob3NlIHByZWJ1aWx0IGFydGlmYWN0cyBhcmUgbWlzc2luZy5cbiAqL1xuZnVuY3Rpb24gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihcbiAgc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9yZzogc3RyaW5nLFxuICByZXBvOiBzdHJpbmdcbik6IHNwZWNpZmllciBpcyBzdHJpbmcge1xuICBpZiAoIXNwZWNpZmllcikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbmV3IFJlZ0V4cChTdHJpbmcucmF3YCg/Ol58WzovXSkke29yZ30vJHtyZXBvfSg/OlxcLmdpdCk/I1xcUyskYCwgJ3UnKS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKG9yZzogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmcsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOiR7b3JnfS8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuLy8gTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHRoZSB1bnF1b3RlZCBsb29wcyBiZWxvdyBrZWVwIHBhdGhzXG4vLyB3aXRoIHNwYWNlcyBpbnRhY3QuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBqb2JzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2NsZWFudXAnLFxuICAgICAgZ2xvYjogJycsXG4gICAgICBydW46ICcnLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnY2hlY2stbWlncmF0aW9ucycsXG4gICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICBydW46IGBcbmZhaWxlZD0wXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGJ1biByZWNvcmRzIGFuIGFic29sdXRlIGByZXNvbHZlZGAgVVJMIGZvciBhbiBhbHJlYWR5LWxvY2tlZCBwYWNrYWdlIHdoZW5ldmVyIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCByZWdpc3RyeSBkb2VzIG5vdCBzZXJ2ZSB0aGUgdGFyYmFsbCBob3N0IGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhIOKAlCB3aGljaCBpc1xuICAgICAgLy8gZXhhY3RseSB3aGF0IHRoZSBUYWt1bWkgR3VhcmQgcHJveHkgZG9lcy4gU28gYW4gaW5zdGFsbCBydW4gd2l0aCBHdWFyZCBhcyB0aGUgZGVmYXVsdFxuICAgICAgLy8gcmVnaXN0cnkgKENJLCBvciBhIGRldmVsb3BlciB3aG8gcHV0IGl0IGluIH4vLm5wbXJjKSBiYWtlcyBucG0uZmxhdHQudGVjaCBVUkxzIGludG9cbiAgICAgIC8vIGJ1bi5sb2NrLCBhbmQgY29tbWl0dGluZyB0aGVtIHBpbnMgYSBTSEFSRUQgbG9ja2ZpbGUgdG8gb25lIGVudmlyb25tZW50J3MgbWlycm9yOiBldmVyeVxuICAgICAgLy8gbGF0ZXIgaW5zdGFsbCBkb3dubG9hZHMgdGhyb3VnaCB0aGUgcHJveHksIGFuZCBhIGNvbGQtY2FjaGUgaW5zdGFsbCBmYWlscyBvdXRyaWdodCB3aXRoXG4gICAgICAvLyA0MDEgZm9yIGFueW9uZSB3aG9zZSBucG1yYyBjYXJyaWVzIGEgcmVnaXN0cnkubnBtanMub3JnIHRva2VuLCBiZWNhdXNlIGJ1biBzZW5kcyB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmVnaXN0cnkncyBjcmVkZW50aWFscyB0byB3aGF0ZXZlciBob3N0IHRoZSBsb2NrZmlsZSBuYW1lcy4gR3VhcmQgY292ZXJhZ2UgZG9lc1xuICAgICAgLy8gbm90IGRlcGVuZCBvbiB0aGVzZSBVUkxzIOKAlCB3aXRoIGFuIGVtcHR5IGByZXNvbHZlZGAsIGJ1biBkZXJpdmVzIHRoZSBkb3dubG9hZCBVUkwgZnJvbVxuICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgcmVnaXN0cnkg4oCUIHNvIHN0cmlwIHRoZW0uIE9ubHkgdGhlIEd1YXJkIGhvc3QgaXMgc3RyaXBwZWQ6IGEgc2NvcGVkXG4gICAgICAvLyByZWdpc3RyeSBzdWNoIGFzIFZlcmRhY2NpbyBsZWdpdGltYXRlbHkgcmVjb3JkcyBpdHMgb3duIFVSTCBmb3IgcHJpdmF0ZSBwYWNrYWdlcy5cbiAgICAgIG5hbWU6ICdub3JtYWxpemUtYnVuLWxvY2tmaWxlJyxcbiAgICAgIGdsb2I6ICdidW4ubG9jaycsXG4gICAgICBydW46ICdiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gT25seSB3aWxsYm9vc3Rlci1jb25maWdzIGdldHMgdGhpcyBqb2I6IGV2ZXJ5IG90aGVyIHJlcG9zaXRvcnkncyByZW5vdmF0ZS5qc29uYyBtZXJlbHlcbiAgICAgIC8vIGV4dGVuZHMgdGhlIHNoYXJlZCBwcmVzZXQsIGFuZCB0aGUgdmFsaWRhdG9yIGRvZXMgbm90IHJlc29sdmUgcmVtb3RlIHByZXNldHMsIHNvIHJ1bm5pbmcgaXRcbiAgICAgIC8vIHRoZXJlIHdvdWxkIHZhbGlkYXRlIHR3byBsaW5lcyBhbmQgY2F0Y2ggbm90aGluZy4gYC0tbm8tZ2xvYmFsYCB2YWxpZGF0ZXMgdGhlIHByZXNldCBhcyBhXG4gICAgICAvLyByZXBvIGNvbmZpZyBpbnN0ZWFkIG9mIGEgc2VsZi1ob3N0ZWQgZ2xvYmFsIGNvbmZpZywgYW5kIGBAbGF0ZXN0YCBrZWVwcyBucG0gZnJvbSBzaWxlbnRseVxuICAgICAgLy8gaW5zdGFsbGluZyBhbiBhbmNpZW50IFJlbm92YXRlIHRoYXQgY2Fubm90IGV2ZW4gcGFyc2UgSlNPTkMgd2hlbiB0aGUgbG9jYWwgTm9kZSBsYWdzIGJlaGluZC5cbiAgICAgIC8vIFN0YWdpbmcgYSBkZWxldGlvbiBvZiByZW5vdmF0ZS5qc29uYyBsZWF2ZXMgbm8gZmlsZSBmb3IgaW5zcGVjdGlvbiwgc28gTGVmdGhvb2sgc2tpcHMgdGhpc1xuICAgICAgLy8gam9iIGluc3RlYWQgb2YgcnVubmluZyB0aGUgdmFsaWRhdG9yIG9uIGEgbWlzc2luZyBwYXRoIOKAlCBkZWxpYmVyYXRlbHksIGJlY2F1c2UgZGVsZXRpbmcgdGhlXG4gICAgICAvLyBzaGFyZWQgcHJlc2V0IGlzIG5vdCBhbiBvcGVyYXRpb24gdGhpcyBob29rIG5lZWRzIHRvIGd1YXJkLlxuICAgICAgbmFtZTogJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycsXG4gICAgICBnbG9iOiAncmVub3ZhdGUuanNvbmMnLFxuICAgICAgcnVuOiAnbnB4IC0teWVzIC0tcGFja2FnZSByZW5vdmF0ZUBsYXRlc3QgLS0gcmVub3ZhdGUtY29uZmlnLXZhbGlkYXRvciAtLXN0cmljdCAtLW5vLWdsb2JhbCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIC8vIHByZXBhcmUgY2FsbHMgdGhpcyB3aXRob3V0IGFyZ3VtZW50cyBhZnRlciBCdW4gc2F2ZXMgdGhlIHJvb3QgbG9ja2ZpbGU7IExlZnRob29rIHBhc3NlcyBpdHNcbiAgLy8gc3RhZ2VkIHBhdGguIFRoZSB1bnByZWRpY3RhYmxlIHNpYmxpbmcgZmlsZSBtYWtlcyByZXBsYWNlbWVudCBhdG9taWMsIGBjcCAtcGAgcHJlc2VydmVzIGl0c1xuICAvLyBtb2RlLCBhbmQgdGhlIGFuY2hvcmVkIHBhdHRlcm4gY2Fubm90IGVyYXNlIGEgZGlyZWN0IHRhcmJhbGwgZGVwZW5kZW5jeSBVUkwuXG4gIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlOiBgXG4jIS9iaW4vYmFzaFxuc2V0IC1lXG5cbmlmIFtbIFwiJCNcIiAtZXEgMCBdXTsgdGhlblxuICBzZXQgLS0gYnVuLmxvY2tcbmZpXG5cbm5vcm1hbGl6ZWQ9XCJcIlxudHJhcCAnW1sgLXogXCIkbm9ybWFsaXplZFwiIF1dIHx8IHJtIC1mIFwiJG5vcm1hbGl6ZWRcIicgRVhJVFxuZm9yIGZpbGUgaW4gXCIkQFwiOyBkb1xuICBbWyAtZiBcIiRmaWxlXCIgXV0gfHwgY29udGludWVcbiAgbm9ybWFsaXplZD1cIiQobWt0ZW1wIFwiJGZpbGUud2JmeS1ub3JtYWxpemluZy5YWFhYWFhcIilcIlxuICBjcCAtcCBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiXG4gIHNlZCAtRSAncyMoXCIsIClcImh0dHBzOi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC9bXlwiXSpcIiNcXFxcMVwiXCIjZycgXCIkZmlsZVwiID4gXCIkbm9ybWFsaXplZFwiXG4gIGlmICEgY21wIC1zIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCI7IHRoZW5cbiAgICBtdiBcIiRub3JtYWxpemVkXCIgXCIkZmlsZVwiXG4gICAgZWNobyBcIlJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAkZmlsZSBzbyB0aGUgbG9ja2ZpbGUgc3RheXMgcmVnaXN0cnktYWdub3N0aWMuXCJcbiAgZmlcbiAgcm0gLWYgXCIkbm9ybWFsaXplZFwiXG4gIG5vcm1hbGl6ZWQ9XCJcIlxuZG9uZVxuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbY29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIGFsbENvbmZpZ3MpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnLCBhbGxDb25maWdzKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gnKSwgc2NyaXB0cy5ub3JtYWxpemVCdW5Mb2NrZmlsZSArICdcXG4nLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9ICdidW4gd2IgbGludCAtLXF1aWV0JztcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzXG4gICAgLmZpbHRlcigoam9iKSA9PiBqb2IubmFtZSAhPT0gJ3ZhbGlkYXRlLXJlbm92YXRlLWNvbmZpZycgfHwgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKVxuICAgIC5tYXAoKGpvYikgPT5cbiAgICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5qb2IsXG4gICAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogam9iXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbLi4uZXh0ZW5zaW9ucy5wcmV0dGllck9ubHldO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuYnVuIHJ1biAtLWN3ZCBwYWNrYWdlcy93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuICAvLyBQeXRob24tb25seSBCdW4gcmVwb3MgaW5zdGFsbCB3YiBmb3Igc2hhcmVkIHNjcmlwdHMgYnV0IG5vdCBPeGxpbnQsIHNvXG4gIC8vIHN0YWdlZC1maWxlIGhvb2tzIG11c3QgdXNlIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyBmb3JtYXR0ZXIgcGF0aCBiZWxvdy5cbiAgY29uc3QgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gIGlmIChjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbmJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcucmF3YFxucGFja2FnZV9qc29uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiXG4ke2hhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZykgPyBTdHJpbmcucmF3YHB5dGhvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5weSQnIHx8IHRydWUpXCJgIDogJyd9XG4ke2NvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sID8gU3RyaW5nLnJhd2BkYXJ0X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLmRhcnQkJyB8IGdyZXAgLXYgJ2dlbmVyYXRlZCcgfCBncmVwIC12ICdcXC5mcmVlemVkXFwuZGFydCQnIHwgZ3JlcCAtdiAnXFwuZ1xcLmRhcnQkJyB8fCB0cnVlKVwiYCA6ICcnfVxuXG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgYnVuIHNvcnQtcGFja2FnZS1qc29uICRwYWNrYWdlX2pzb25fZmlsZXNcbmZpXG4ke1xuICBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpXG4gICAgPyBgaWYgWyAtbiBcIiRweXRob25fZmlsZXNcIiBdOyB0aGVuXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcyAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGJsYWNrICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gZmxha2U4ICRweXRob25fZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sXG4gICAgPyBgaWYgWyAtbiBcIiRkYXJ0X2ZpbGVzXCIgXTsgdGhlblxuICBkYXJ0IGZvcm1hdCAkZGFydF9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuYC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGxvY2FsV2JQYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlcycsICd3YicsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGxvY2FsV2JQYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHsgbmFtZT86IHN0cmluZyB9O1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5uYW1lID09PSAnQHdpbGxib29zdGVyL3diJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWwpYDtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSAnYnVuIGluc3RhbGwnO1xuICAvLyBEbyBOT1QgYWRkIGAudmluZXh0YCBoZXJlOiBpdCBob2xkcyBvbmx5IHZpbmV4dCdzIGNvbnRlbnQtaGFzaGVkIGZvbnQgY2FjaGUgYW5kIHRoZSBkZXZcbiAgLy8gc2VydmVyJ3MgbG9jayBmaWxlIChkZWxldGluZyB0aGUgbG9jayBkaXNhYmxlcyB0aGUgZHVwbGljYXRlLWRldi1zZXJ2ZXIgZ3VhcmQgZm9yIGEgcnVubmluZ1xuICAvLyBzZXJ2ZXIpLiB2aW5leHQncyBidWlsZCBvdXRwdXQgZ29lcyB0byBgZGlzdC9gLCBhbmQgVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaXMgaGFuZGxlZCBieVxuICAvLyB0aGUgc2VwYXJhdGUgaW5zdGFsbC1sYXlvdXQgaG9vayBiZWxvdy5cbiAgLy8gU2NhbiBldmVyeSB3b3Jrc3BhY2UgY29uZmlnIChub3QganVzdCB0aGUgcm9vdCk6IGluIGEgbW9ub3JlcG8gdGhlIGFwcCB1c3VhbGx5IGxpdmVzIGluXG4gIC8vIHBhY2thZ2VzLzxhcHA+IG9yIGFwcHMvPGFwcD4sIGFuZCB0aGUgY2FjaGUgZGlyZWN0b3JpZXMgYXJlIHdvcmtzcGFjZS1yZWxhdGl2ZS5cbiAgY29uc3QgbmV4dENhY2hlRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcubmV4dCxcbiAgICAnLm5leHQnXG4gICk7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yaWVzID1cbiAgICBuZXh0Q2FjaGVEaXJQYXRocy5sZW5ndGggPiAwID8gYCAmJiBybSAtUmYgLS0gJHtuZXh0Q2FjaGVEaXJQYXRocy5tYXAocXVvdGVGb3JFdmFsdWF0ZWRTaGVsbCkuam9pbignICcpfWAgOiAnJztcbiAgLy8gQnVuIGRvZXMgbm90IHJlbGluayBhbiBleGlzdGluZyBpc29sYXRlZCB0cmVlIHdoZW4gZ2xvYmFsU3RvcmUvbGlua2VyIHNldHRpbmdzIGNoYW5nZS4gSW5zcGVjdFxuICAvLyB0aG9zZSBrZXlzIHJhdGhlciB0aGFuIGV2ZXJ5IGJ1bmZpZyBjaGFuZ2U6IG1pbmltdW1SZWxlYXNlQWdlIHVwZGF0ZXMgbXVzdCBub3QgZGVzdHJveSBhXG4gIC8vIGNvbnRyaWJ1dG9yJ3Mgd29ya2luZyBpbnN0YWxsIGJlZm9yZSBhIHBvdGVudGlhbGx5IG5ldHdvcmstZGVwZW5kZW50IHJlcGxhY2VtZW50IHN1Y2NlZWRzLlxuICBjb25zdCBub2RlTW9kdWxlc0RpclBhdGhzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoY29uZmlnLCBhbGxDb25maWdzLCAoKSA9PiB0cnVlLCAnbm9kZV9tb2R1bGVzJyk7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BpZiBnaXQgZGlmZiAtLW5vLWNvbG9yIC1VMCBPUklHX0hFQUQgSEVBRCAtLSAnKmJ1bmZpZy50b21sJyB8IGdyZXAgLS1xdWlldCAtRSAnXlsrLV0gKihnbG9iYWxTdG9yZXxsaW5rZXJ8cHVibGljSG9pc3RQYXR0ZXJuKSc7IHRoZW4gcm0gLVJmIC0tICR7bm9kZU1vZHVsZXNEaXJQYXRocy5tYXAocXVvdGVGb3JTaGVsbCkuam9pbignICcpfTsgZmlgXG4gICk7XG4gIC8vIGJ1bi5sb2NrLW9ubHkgbWVyZ2VzIChSZW5vdmF0ZSBsb2NrZmlsZSBtYWludGVuYW5jZSksIGJ1bmZpZy50b21sIC8gLm5wbXJjIGNoYW5nZXMgKGxpbmtlcixcbiAgLy8gcmVnaXN0cnksIGhvaXN0aW5nKSwgYW5kIHBhdGNoIGVkaXRzIGFsbCBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXQgdG91Y2hpbmcgcGFja2FnZS5qc29uLlxuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIocGFja2FnZVxcLmpzb258YnVuXFwubG9ja3xidW5maWdcXC50b21sfFxcLm5wbXJjfHBhdGNoZXMvKVwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yaWVzfVwiYFxuICApO1xuICAvLyBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpbiBub2RlX21vZHVsZXMvLnZpdGUgc2VsZi1pbnZhbGlkYXRlcyBvbiBsb2NrZmlsZSAvIHBhdGNoZXMgL1xuICAvLyBjb25maWcgLyBOT0RFX0VOViBjaGFuZ2VzIChzZWUgVml0ZSdzIGRlcCBwcmUtYnVuZGxpbmcgZG9jcyksIHNvIHRoZSByZXNpZHVhbCBzdGFsZSBjYXNlIGlzXG4gIC8vIGluc3RhbGwtbGF5b3V0IGNoYW5nZXMgKGJ1bmZpZy50b21sIGxpbmtlciwgLm5wbXJjKTogdGhleSBjaGFuZ2UgdGhlIGluc3RhbGxlZCB0cmVlIHdpdGhvdXRcbiAgLy8gdG91Y2hpbmcgdGhlIGxvY2tmaWxlLCBhbmQgdGhleSBhcmUgYWJzZW50IGZyb20gVml0ZSdzIGNhY2hlIGtleS5cbiAgY29uc3Qgcm1WaXRlQ2FjaGVEaXJlY3RvcmllcyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcudml0ZSxcbiAgICAnbm9kZV9tb2R1bGVzLy52aXRlJ1xuICApO1xuICBpZiAocm1WaXRlQ2FjaGVEaXJlY3Rvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoYnVuZmlnXFwudG9tbHxcXC5ucG1yYylcIiBcInJtIC1SZiAtLSAke3JtVml0ZUNhY2hlRGlyZWN0b3JpZXMubWFwKHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwpLmpvaW4oJyAnKX1cImBcbiAgICApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJ1dlxcLmxvY2tcIiBcInV2IHN5bmMgLS1mcm96ZW5cImApO1xuICB9XG4gIC8vIEJsaXR6IHJlcG9zaXRvcmllcyBkZWxpYmVyYXRlbHkgZ2V0IHRoZSBzYW1lIHdiLWRyaXZlbiBwcmlzbWEgY29tbWFuZHMgYXMgZXZlcnlvbmUgZWxzZTpcbiAgLy8gdGhlIGJsaXR6IENMSSdzIGNvZGVnZW4gcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbiBwbGFjZSwgd2hpY2ggbXVzdCBuZXZlciBydW5cbiAgLy8gdW5kZXIgQnVuJ3Mgc2hhcmVkIGdsb2JhbCBzdG9yZS4gWWFybi1lcmEgQmxpdHogcmVwb3MgZ2V0IHRoZWlyIHJvdXRlIG1hbmlmZXN0IGZyb21cbiAgLy8gYHdiIGdlbi1jb2RlYCdzIGBibGl0eiBjb2RlZ2VuYCBzdGVwLCBhbmQgY3VycmVudCB3YiByb3V0ZXMgb25seSBgd2IgcHJpc21hIHNlZWRgIHRocm91Z2hcbiAgLy8gdGhlIGJsaXR6IENMSSwgb25seSBmb3Igbm9uLUJ1biByZXBvcyAoc2VlIHBhY2thZ2VzL3diL3NyYy9zY3JpcHRzL3ByaXNtYVNjcmlwdHMudHMpOyB0aGVcbiAgLy8gcG9zdC1tZXJnZSBob29rcyBzdGF5IHdiLWRyaXZlbiBiZWNhdXNlIGBwcmlzbWEgZGVwbG95YC9gZ2VuZXJhdGVgIG5lZWQgbm8gYmxpdHogbG9hZGVyLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJidW4gd2IgcHJpc21hIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG4vLyBUaGUgZ2VuZXJhdGVkIGNvbW1hbmQgcGFzc2VzIHRocm91Z2ggVFdPIHNoZWxsIHBhcnNpbmcgc3RhZ2VzOiB0aGUgcHJlcGFyZS5zaCBsaW5lIHBhcnNlcyBpdCBhc1xuLy8gYSBkb3VibGUtcXVvdGVkIGFyZ3VtZW50IChwcm9jZXNzaW5nIFxcLCBgLCAkIGFuZCBcIiBpbW1lZGlhdGVseSksIGFuZCBydW5faWZfY2hhbmdlZCB0aGVuIGV2YWwnc1xuLy8gaXQgKHdvcmQtc3BsaXR0aW5nIGFuZCBnbG9iYmluZykuIEFuIHVucXVvdGVkIHBhdGggY29udGFpbmluZyBzcGFjZXMgKGUuZy4gYGFwcHMvbXkgYXBwLy5uZXh0YClcbi8vIHdvdWxkIHdvcmQtc3BsaXQgaW50byB1bnJlbGF0ZWQgcm0gdGFyZ2V0cywgYW5kIGAkYC9iYWNrdGljayB3b3VsZCBleHBhbmQgYXQgdGhlIGZpcnN0IHN0YWdlLlxuLy8gU286IHNpbmdsZS1xdW90ZSBmb3IgdGhlIGV2YWwgc3RhZ2UsIHRoZW4gYmFja3NsYXNoLWVzY2FwZSB0aGUgZG91YmxlLXF1b3RlLWNvbnRleHQgc3BlY2lhbHMuXG5mdW5jdGlvbiBxdW90ZUZvckV2YWx1YXRlZFNoZWxsKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBldmFsUXVvdGVkID0gcXVvdGVGb3JTaGVsbChmaWxlUGF0aCk7XG4gIHJldHVybiBldmFsUXVvdGVkLnJlcGxhY2VBbGwoL1tcXFxcYCRcIl0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5mdW5jdGlvbiBxdW90ZUZvclNoZWxsKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke2ZpbGVQYXRoLnJlcGxhY2VBbGwoXCInXCIsIFN0cmluZy5yYXdgJ1xcJydgKX0nYDtcbn1cblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlLXJlbGF0aXZlIGRpcmVjdG9yaWVzIChyb290IGZpcnN0LCBkZWR1cGxpY2F0ZWQsIGA8c3ViRGlyTmFtZT5gIGFwcGVuZGVkKSBvZiBldmVyeVxuICogd29ya3NwYWNlIHdob3NlIGNvbmZpZyBtYXRjaGVzIHRoZSBwcmVkaWNhdGUuIFRoZSBob29rIHNjcmlwdCBydW5zIGF0IHRoZSByZXBvc2l0b3J5IHJvb3QsIHNvXG4gKiBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmVkaWNhdGU6IChjb25maWc6IFBhY2thZ2VDb25maWcpID0+IGJvb2xlYW4sXG4gIHN1YkRpck5hbWU6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBhbGxDb25maWdzXG4gICAgICAgIC5maWx0ZXIoKGNvbmZpZykgPT4gcHJlZGljYXRlKGNvbmZpZykpXG4gICAgICAgIC5tYXAoKGNvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdENvbmZpZy5kaXJQYXRoLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0aXZlRGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihyZWxhdGl2ZURpclBhdGgsIHN1YkRpck5hbWUpIDogc3ViRGlyTmFtZTtcbiAgICAgICAgfSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJpbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICcuLi91dGlscy9zdHJpbmdVdGlsLmpzJztcblxuZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBveGZtdEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hmbXQgY29uZmlnIGZpbGVzIGFyZSBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGZtdENvbmZpZyA9IHJlcXVpcmUoJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IG94Zm10Q29uZmlnLmRlZmF1bHQgPz8gb3hmbXRDb25maWc7YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9JztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UsXG4gIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSxcbn0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGxpbnQnLFxuICB0b29sTmFtZTogJ294bGludCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBnZW5lcmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVwbGFjZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy4gR2VuZXJhdGVkIGZpbGVzIHdpdGhcbiAgICAvLyBtYW5hZ2VkIGJsb2NrcyBhcmUgc3RpbGwgc2FmZSB0byB1cGRhdGUuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50ICYmICFtYW5hZ2VkQ29uZmlnQmxvY2tzLmhhc01hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50KTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50XG4gICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgOiBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICB9KTtcblxuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hsaW50IG9ubHkgYXV0by1kaXNjb3ZlcnMgLnRzIGNvbmZpZyBmaWxlcywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94bGludEJhc2VDb25maWcgPSByZXF1aXJlKCcke294bGludEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnLmRlZmF1bHQgPz8gb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbmltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG5cbi8vIHN0cnVjdHVyZWRDbG9uZSBrZWVwcyBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlIG1hbmFnZWRcbi8vIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC4gVGhlIHJvb3QgY29uZmlnIGZvcmNlcyB0aGUgdHlwZS1hd2FyZVxuLy8gb3B0aW9ucyBvbiBpbnNpZGUgdGhlIG1hbmFnZWQgYmxvY2sgc28gbm8gY3VzdG9taXphdGlvbiBjYW4gc2lsZW50bHkgZGlzYWJsZSB0eXBlIGNoZWNraW5nOyBldmVyeVxuLy8gb3RoZXIgY29uZmlnIGRlbGV0ZXMgdGhlbSBiZWNhdXNlIE94bGludCByZWplY3RzIHRob3NlIHJvb3Qtb25seSBvcHRpb25zIGVsc2V3aGVyZSAodHlwZSBjaGVja2luZ1xuLy8gc3Vydml2ZXM6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgLS10eXBlLWF3YXJlIGFuZCAtLXR5cGUtY2hlY2sgZXhwbGljaXRseSkuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuZGVsZXRlIG94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnM7YDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICAvLyBweXJpZ2h0Y29uZmlnLmpzb24gYWxsb3dzIEpTT05DOyBhbiBleGlzdGluZyBmaWxlIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdFxuICAgICAgLy8gdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYmFyZSB0ZW1wbGF0ZS5cbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHB5cmlnaHRjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShuZXdTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25zdW1lc0RvY2tlckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBtYW5hZ2VkU2NyaXB0c0Jsb2NrID0gYHNjcmlwdHMvKipcbiFzY3JpcHRzL1xuIXNjcmlwdHMvKi5zaGA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhSYWlsd2F5aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFJhaWx3YXlpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheWlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgdXNlc0RvY2tlckVudiA9IGNvbnN1bWVzRG9ja2VyRW52KGNvbmZpZy5kb2NrZXJmaWxlKTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIGlmIChjb25maWcuaXNSYWlsd2F5ICYmIHVzZXNEb2NrZXJFbnYpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsICchLmRvY2tlci5lbnZcXG4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15zY3JpcHRzXFwvJC9tLCBtYW5hZ2VkU2NyaXB0c0Jsb2NrKTtcbiAgICAvLyBgcmFpbHdheSB1cGAgc3RyaXBzIGdpdGlnbm9yZWQgZmlsZXMgZnJvbSB0aGUgdXBsb2FkZWQgYnVpbGQgY29udGV4dCwgc28gdGhlIGdlbmVyYXRlZFxuICAgIC8vIG5vbi1zZWNyZXQgLmRvY2tlci5lbnYgKGB3YiBnZW4tZG9ja2VyLWVudmAgb3V0cHV0KSBuZWVkcyBhbiBleHBsaWNpdCB1bi1pZ25vcmUgdG8gcmVhY2hcbiAgICAvLyB0aGUgcmVtb3RlIERvY2tlciBidWlsZC4gQXBwZW5kZWQsIG5vdCBwcmVwZW5kZWQ6IGlnbm9yZSBmaWxlcyBhcmUgbGFzdC1tYXRjaC13aW5zLCBzbyBhXG4gICAgLy8gaGFuZC13cml0dGVuIHBhdHRlcm4gc3VjaCBhcyBgKi5lbnZgIGVhcmxpZXIgaW4gdGhlIGZpbGUgbXVzdCBub3Qgc2lsZW50bHkgcmUtZXhjbHVkZSBpdC5cbiAgICBpZiAodXNlc0RvY2tlckVudiAmJiAhL14hXFwuZG9ja2VyXFwuZW52JC9tLnRlc3QobmV3Q29udGVudCkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBgJHtuZXdDb250ZW50LnJlcGxhY2UoL1xcbj8kLywgJ1xcbicpfSEuZG9ja2VyLmVudlxcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9ja2VyZmlsZSAmJiAhdXNlc0RvY2tlckVudikge1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXiFcXC5kb2NrZXJcXC5lbnZcXG4/L20sICcnKTtcbiAgICB9XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgbmV3Q29udGVudCA/IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpIDogZnNVdGlsLnJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoKVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbWFnZSwgTGluaywgUGFyYWdyYXBoLCBQaHJhc2luZ0NvbnRlbnQsIFJvb3RDb250ZW50IH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHsgZnJvbU1hcmtkb3duIH0gZnJvbSAnbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmNvbnN0IHdiZnlCYWRnZVVybFByZWZpeCA9ICdodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3diZnktJztcbmNvbnN0IHdiZnlCYWRnZVVybFN1ZmZpeCA9ICctMWU5MGZmLnN2Zyc7XG5jb25zdCB3YmZ5QmFkZ2VMaW5rID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvdHJlZS9tYWluL3BhY2thZ2VzL3diZnknO1xuXG5jb25zdCBucG1QYWNrYWdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyc7XG5cbmNvbnN0IG1hbmFnZWRCYWRnZVBhdHRlcm5zID0gW1xuICAvXlxcWyFcXFt3YmZ5XFxdXFwoaHR0cHM6XFwvXFwvaW1nXFwuc2hpZWxkc1xcLmlvXFwvYmFkZ2VcXC93YmZ5LVteKVxcc10rLTFlOTBmZlxcLnN2Z1xcKVxcXVxcKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1dpbGxCb29zdGVyXFwvc2hhcmVkXFwvdHJlZVxcL21haW5cXC9wYWNrYWdlc1xcL3diZnlcXCkkL3UsXG4gIC9eXFxbIVxcW1teXFxdXSpcXF1cXCgoaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvW14pXFxzXStcXC9hY3Rpb25zXFwvd29ya2Zsb3dzXFwvW14pXFxzXSspXFwvYmFkZ2VcXC5zdmdcXClcXF1cXChcXDFcXCkkL3UsXG4gIC8vIEFueSBiYWRnZSBsaW5raW5nIHRvIGFuIG5wbSBwYWNrYWdlIHBhZ2UsIHdoYXRldmVyIGltYWdlIGl0IHNob3dzIGFuZCBob3dldmVyIHRoZSBsaW5rIGlzXG4gIC8vIHNwZWxsZWQ6IHRoZSBibG9jayBpcyB3YmZ5J3MsIGl0IHdyaXRlcyBhdCBtb3N0IG9uZSBucG0gYmFkZ2UsIHNvIGEgYmFkZ2UgZm9yIGEgcmVuYW1lZCBvclxuICAvLyB1bnB1Ymxpc2hlZCBwYWNrYWdlIGlzIGEgc3RhbGUgY29weSBvZiB0aGF0IG9uZSDigJQgbm90IGFub3RoZXIgYmFkZ2UgdG8ga2VlcCBiZXNpZGUgaXQuXG4gIC9eXFxbIVxcW1teXFxdXSpcXF1cXChbXilcXHNdK1xcKVxcXVxcKGh0dHBzPzpcXC9cXC8oPzp3d3dcXC4pP25wbWpzXFwuY29tXFwvcGFja2FnZVxcL1teKVxcc10qXFwpJC91LFxuXTtcblxuZnVuY3Rpb24gYnVpbGRXYmZ5QmFkZ2UobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEh5cGhlbnMgYXJlIGVzY2FwZWQgYXMgYC0tYCBwZXIgc2hpZWxkcy5pbydzIGJhZGdlIHBhdGggc3ludGF4LCBzbyBgdjEuMi4zLXJjLjFgIHN0YXlzIGludGFjdC5cbiAgcmV0dXJuIGBbIVt3YmZ5XSgke3diZnlCYWRnZVVybFByZWZpeH0ke2xhYmVsLnJlcGxhY2VBbGwoJy0nLCAnLS0nKX0ke3diZnlCYWRnZVVybFN1ZmZpeH0pXSgke3diZnlCYWRnZUxpbmt9KWA7XG59XG5cbi8qKiBUaGUgdmVyc2lvbiBsYWJlbCB0aGUgd2JmeSBiYWRnZSBpbiB0aGUgcmVwb3NpdG9yeSdzIFJFQURNRSByZWNvcmRzLCBpLmUuIHRoZSBidWlsZCB0aGF0IHdiZmllZCBpdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgLy8gQ29uZmluZWQsIGFuZCB0b2xlcmFudCBvZiBhbnkgcmVhZCBmYWlsdXJlOiBhIFJFQURNRSB0aGF0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkgKGFcbiAgLy8gY29tbWl0dGVkIHN5bWxpbmspIG9yIGNhbm5vdCBiZSByZWFkIGF0IGFsbCBzYXlzIG5vdGhpbmcgYWJvdXQgd2hpY2ggYnVpbGQgY29uZmlndXJlZCBUSElTXG4gIC8vIHJlcG9zaXRvcnksIGFuZCB0aGUgYW5zd2VyIG9ubHkgZXZlciBzdXBwcmVzc2VzIHdvcmsg4oCUIHNvIGFueXRoaW5nIGJ1dCBhIHJlYWRhYmxlIGluLXJlcG9zaXRvcnlcbiAgLy8gUkVBRE1FIG1lYW5zIFwibm90IGtub3duIHRvIGJlIGFwcGxpZWRcIiBhbmQgdGhlIHJ1biBwcm9jZWVkcy5cbiAgY29uc3QgcmVhZG1lID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ1JFQURNRS5tZCcpKS5jYXRjaCgoKSA9PiB7fSk7XG4gIGlmIChyZWFkbWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUaGUgUkVBRE1FIGlzIHBhcnNlZCByYXRoZXIgdGhhbiBzY2FubmVkLCBmb3IgdGhlIHNhbWUgcmVhc29uIHdyaXRlQmFkZ2VCbG9jayBwYXJzZXMgaXQsIGFuZFxuICAvLyBvbmx5IHRoZSBzaGFwZSB3cml0ZUJhZGdlQmxvY2sgaXRzZWxmIHdyaXRlcyBjb3VudHMgYXMgYW4gYXBwbGllZCBiYWRnZTogYSB0b3AtbGV2ZWwgcGFyYWdyYXBoXG4gIC8vIG9mIGJhZGdlcy4gQSBiYWRnZSBhbnl3aGVyZSBlbHNlIGlzIGNvbnRlbnQgdGhhdCBtZXJlbHkgbWVudGlvbnMgb25lIOKAlCBhIGZlbmNlZCBleGFtcGxlICh3YmZ5J3NcbiAgLy8gb3duIGRvY3VtZW50YXRpb24gaGFzIHRob3NlKSwgYSBibG9jayBxdW90ZSwgYSBsaXN0IGl0ZW0g4oCUIGFuZCByZWFkaW5nIGl0IGFzIGFwcGxpZWQgd291bGQgc2tpcFxuICAvLyBldmVyeSBmaXhlciBmb3IgdGhlIHJlcG9zaXRvcnkuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBmcm9tTWFya2Rvd24ocmVhZG1lKS5jaGlsZHJlbikge1xuICAgIGlmICghaXNCYWRnZUJsb2NrTm9kZShub2RlKSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBiYWRnZSBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoIWlzQmFkZ2VOb2RlKGJhZGdlKSkgY29udGludWU7XG4gICAgICBjb25zdCB7IHVybCB9ID0gYmFkZ2UuY2hpbGRyZW5bMF07XG4gICAgICBpZiAodXJsLnN0YXJ0c1dpdGgod2JmeUJhZGdlVXJsUHJlZml4KSAmJiB1cmwuZW5kc1dpdGgod2JmeUJhZGdlVXJsU3VmZml4KSkge1xuICAgICAgICByZXR1cm4gdXJsLnNsaWNlKHdiZnlCYWRnZVVybFByZWZpeC5sZW5ndGgsIC13YmZ5QmFkZ2VVcmxTdWZmaXgubGVuZ3RoKS5yZXBsYWNlQWxsKCctLScsICctJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIC8vIFRoZSB3YmZ5IGJhZGdlIG1hcmtzIGEgcmVwb3NpdG9yeSBhcyB3YmZpZWQsIHNvIGEgcmVwb3NpdG9yeSB3aXRob3V0IGEgUkVBRE1FIHN0aWxsIGdldHMgb25lLlxuICAgIC8vIHJlYWRGaWxlSWZFeGlzdHMgZmFsbHMgYmFjayBPTkxZIG9uIEVOT0VOVDogYSBSRUFETUUgdGhhdCBleGlzdHMgYnV0IGNhbm5vdCBiZSByZWFkIChlLmcuXG4gICAgLy8gcGVybWlzc2lvbnMsIEVNRklMRSkgbXVzdCBhYm9ydCB0aGUgZ2VuZXJhdG9yIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgc3R1Yi5cbiAgICBsZXQgbmV3Q29udGVudCA9XG4gICAgICAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/P1xuICAgICAgYCMgJHtjb25maWcucGFja2FnZUpzb24/Lm5hbWUgPz8gcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpKX1cXG5gO1xuXG4gICAgLy8gT3JkZXJlZCBieSB3aGF0IGEgcmVhZGVyIGNhcmVzIGFib3V0IG1vc3Q6IHRoZSBucG0gYmFkZ2UgbmFtZXMgdGhlIHBhY2thZ2UgYSByZWFkZXIgaW5zdGFsbHMsXG4gICAgLy8gdGhlbiB0aGUgd29ya2Zsb3cgYmFkZ2VzIHJlcG9ydCB3aGV0aGVyIHRoZSBjb2RlIGlzIGN1cnJlbnRseSBoZWFsdGh5LCB0aGVuIGhvdyBpdCBpc1xuICAgIC8vIHJlbGVhc2VkLCBhbmQgbGFzdCB0aGUgd2JmeSBidWlsZCB0aGF0IGNvbmZpZ3VyZWQgaXQuXG4gICAgY29uc3QgYmFkZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5wbVBhY2thZ2VOYW1lID0gYXdhaXQgZ2V0UHVibGlzaGVkTnBtUGFja2FnZU5hbWUoY29uZmlnKTtcbiAgICBpZiAobnBtUGFja2FnZU5hbWUpIGJhZGdlcy5wdXNoKGJ1aWxkTnBtQmFkZ2UobnBtUGFja2FnZU5hbWUpKTtcbiAgICBiYWRnZXMucHVzaCguLi4oYXdhaXQgYnVpbGRXb3JrZmxvd0JhZGdlcyhjb25maWcpKSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSBiYWRnZXMucHVzaChzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgYmFkZ2VzLnB1c2goYnVpbGRXYmZ5QmFkZ2UoZ2V0V2JmeVZlcnNpb25MYWJlbCgpID8/ICdhcHBsaWVkJykpO1xuXG4gICAgLy8gVGhlIGJsb2NrIGlzIHdyaXR0ZW4gaW4gb25lIHBhc3MgZnJvbSB0aGUgYmFkZ2VzIHdiZnkgbWFuYWdlcyByaWdodCBub3cuIEEgYmFkZ2UgdGhhdCBpcyBub1xuICAgIC8vIGxvbmdlciB3YW50ZWQg4oCUIGEgc3VwZXJzZWRlZCB2ZXJzaW9uLCBvciBvbmUgd2hvc2Ugd29ya2Zsb3cgaXMgZ29uZSDigJQgc2ltcGx5IGlzIG5vdCBpbiB0aGVcbiAgICAvLyBsaXN0LCBzbyBub3RoaW5nIGhhcyB0byByZW1vdmUgaXQuXG4gICAgbmV3Q29udGVudCA9IHdyaXRlQmFkZ2VCbG9jayhuZXdDb250ZW50LCBiYWRnZXMpO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQsIGdldExpbmVFbmRpbmcobmV3Q29udGVudCkpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIG5wbSBwYWNrYWdlIG5hbWUgdGhlIHJlcG9zaXRvcnkgcHVibGlzaGVzIGZyb20gaXRzIHJvb3QgbWFuaWZlc3QsIGlmIGFueS4gQSBtYW5pZmVzdCBub1xuICogcmVsZWFzZSBwdWJsaXNoZXMsIG9yIG9uZSBrZXB0IG91dCBvZiB0aGUgcmVnaXN0cnkgb24gcHVycG9zZSwgaGFzIG5vIHBhY2thZ2UgcGFnZSB0byBsaW5rIHRvLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQdWJsaXNoZWROcG1QYWNrYWdlTmFtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbj8ubmFtZSB8fCAhY29uZmlnLnJlbGVhc2UubnBtKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBgcHJpdmF0ZWAgaXMgcmVhZCB0aGUgd2F5IGdlbmVyYXRlUGFja2FnZUpzb24gd3JpdGVzIGl0OiBpdCByZW1vdmVzIHRoZSBmbGFnIGZyb20gYSBNT05PUkVQT1xuICAvLyByb290IHRoYXQgZGVjbGFyZXMgcHVibGlzaGluZyBpbnRlbnQsIHNvIHJlYWRpbmcgdGhlIGZsYWcgYWxvbmUgd291bGQgZGVueSB0aGUgYmFkZ2UgdG8gdGhlXG4gIC8vIHZlcnkgbWFuaWZlc3QgdGhlIHNhbWUgcnVuIG1ha2VzIHB1Ymxpc2hhYmxlLiBBbnl3aGVyZSBlbHNlIHRoZSBmbGFnIHN0YW5kcyBhcyB3cml0dGVuLlxuICBjb25zdCBkZWNsYXJlc1B1Ymxpc2hpbmdJbnRlbnQgPSAhIXBhY2thZ2VKc29uLnB1Ymxpc2hDb25maWcgfHwgY29uZmlnLnJlbGVhc2UubnBtUHVibGlzaGVzUm9vdDtcbiAgaWYgKHBhY2thZ2VKc29uLnByaXZhdGUgJiYgIShjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgZGVjbGFyZXNQdWJsaXNoaW5nSW50ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gVGhlIG1hbmlmZXN0IG9ubHkgc2F5cyB0aGUgcmVwb3NpdG9yeSBJTlRFTkRTIHRvIHB1Ymxpc2g6IGEgbW9ub3JlcG8gcm9vdCB0aGF0IGNvbmZpZ3VyZXNcbiAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIGZvciBpdHMgd29ya3NwYWNlcyBpcyBuZXZlciBvbiBucG0gaXRzZWxmLCBhbmQgYSBwYWNrYWdlJ3MgZmlyc3QgcmVsZWFzZVxuICAvLyBoYXMgbm90IGhhcHBlbmVkIHlldC4gQm90aCB3b3VsZCByZW5kZXIgYSBicm9rZW4gYmFkZ2UsIHNvIHRoZSByZWdpc3RyeSBkZWNpZGVzLlxuICByZXR1cm4gKGF3YWl0IGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlSnNvbi5uYW1lKSkgPyB1bmRlZmluZWQgOiBwYWNrYWdlSnNvbi5uYW1lO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlZ2lzdHJ5IGFuc3dlcnMgdGhhdCBpdCBoYXMgbm8gc3VjaCBwYWNrYWdlIOKAlCB0aGUgT05MWSBhbnN3ZXIgdGhhdCByZW1vdmVzIGEgYmFkZ2UuXG4gKiBBIGNoZWNrIHRoYXQgY2Fubm90IHJ1biAob2ZmbGluZSwgYW4gb3V0YWdlLCBhIHRpbWVvdXQpIHNheXMgbm90aGluZyBhYm91dCB0aGUgcGFja2FnZSwgYW5kXG4gKiB0cmVhdGluZyBpdCBhcyBhYnNlbnQgd291bGQgc3RyaXAgdGhlIGJhZGdlIG91dCBvZiBldmVyeSBwdWJsaXNoZWQgcmVwb3NpdG9yeSB3YmZ5IHRvdWNoZXNcbiAqIGR1cmluZyB0aGUgb3V0YWdlIGFuZCBwdXQgaXQgYmFjayBhZnRlcndhcmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBpc01pc3NpbmdGcm9tTnBtUmVnaXN0cnkocGFja2FnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIFRoZSBzY29wZSBzZXBhcmF0b3IgbXVzdCBzdXJ2aXZlIGFzIGEgcGF0aCBzZWdtZW50LCBzbyB0aGUgbmFtZSBpcyBlbmNvZGVkIHBpZWNld2lzZS5cbiAgICBjb25zdCBlbmNvZGVkTmFtZSA9IHBhY2thZ2VOYW1lLnNwbGl0KCcvJykubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbignLycpO1xuICAgIC8vIEEgYmFkZ2UgaXMgZGVjb3JhdGlvbjogYSBzdGFsbGVkIHJlZ2lzdHJ5IGNvbm5lY3Rpb24gbXVzdCBub3QgaG9sZCB0aGUgd2hvbGUgcnVuIGZvciBob3dldmVyXG4gICAgLy8gbG9uZyB0aGUgbmV0d29ya2luZyBzdGFjayB3b3VsZCB3YWl0LiBUaGUgYnVkZ2V0IGlzIGdlbmVyb3VzIGJlY2F1c2UgYSB0aW1lb3V0IGFuc3dlcnNcbiAgICAvLyBcInVua25vd25cIiwgd2hpY2gga2VlcHMgdGhlIGJhZGdlIOKAlCBhbmQgb24gYSByZXBvc2l0b3J5IHRoYXQgaXMgbm90IG9uIG5wbSB0aGF0IG1lYW5zIHdyaXRpbmdcbiAgICAvLyBvbmUgaXQgc2hvdWxkIG5vdCBoYXZlOyBhIHdiZnkgcnVuIGFscmVhZHkgc3BlbmRzIG1pbnV0ZXMgb24gaW5zdGFsbHMsIHNvIHdhaXRpbmcgYSBsaXR0bGVcbiAgICAvLyBsb25nZXIgZm9yIGEgcmVhbCBhbnN3ZXIgY29zdHMgbGVzcyB0aGFuIGFjdGluZyBvbiBhIG1pc3Npbmcgb25lLlxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyR7ZW5jb2RlZE5hbWV9YCwge1xuICAgICAgbWV0aG9kOiAnSEVBRCcsXG4gICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTBfMDAwKSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSA0MDQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZE5wbUJhZGdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFshW25wbSB2ZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL25wbS92LyR7cGFja2FnZU5hbWV9LnN2ZyldKCR7bnBtUGFja2FnZVVybFByZWZpeH0ke3BhY2thZ2VOYW1lfSlgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeS5pbmRleE9mKCc6JykgKyAxKTtcbiAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIGlmICghcmVwb3NpdG9yeSB8fCAhZnMuZXhpc3RzU3luYyh3b3JrZmxvd3NQYXRoKSkgcmV0dXJuIFtdO1xuXG4gIC8vIFdvcmtmbG93IGFuZCBSRUFETUUgZ2VuZXJhdGlvbiBydW4gY29uY3VycmVudGx5LiBEbyBub3QgcmV0YWluIGEgc3RhbGUgUnVzdCBiYWRnZSB3aGlsZSB0aGVcbiAgLy8gd29ya2Zsb3cgZ2VuZXJhdG9yIHJlbW92ZXMgYSBjYWxsZXIgY3JlYXRlZCBmcm9tIGEgZm9ybWVybHkgbWlzZGV0ZWN0ZWQgbG9jYWwgY2FjaGUg4oCUIGJ1dFxuICAvLyBtaXJyb3IgaXRzIG93bmVyc2hpcCBjaGVjazogYSBjdXN0b20gc2FtZS1uYW1lZCB3b3JrZmxvdyBzdXJ2aXZlcywgc28gaXRzIGJhZGdlIG11c3QgdG9vLlxuICAvLyBEZWNpZGVkIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRoZSBsb29wJ3MgZmlyc3QgYXdhaXQ6IHRoZSBnZW5lcmF0b3IncyBkZWxldGUgY2FuIG9ubHkgbGFuZCBhdFxuICAvLyBhbiBhd2FpdCBwb2ludCwgYW5kIGEgcG9zdC1kZWxldGUgcmVhZCB3b3VsZCBtaXNyZXBvcnQgdGhlIHdiZnktb3duZWQgY2FsbGVyIGFzIGN1c3RvbS5cbiAgLy8gTm8gZXhpc3RzU3luYyBwcmUtY2hlY2s6IHRoZSBoZWxwZXIgYWxyZWFkeSB0cmVhdHMgYSBtaXNzaW5nIGZpbGUgYXMgbm90IG93bmVkLCBhbmQgdGhpcyBydW5zXG4gIC8vIG9uY2UgcGVyIHJlcG9zaXRvcnksIHNvIHRoZSBleGNlcHRpb25hbCBFTk9FTlQgcmVhZCBjb3N0cyBub3RoaW5nIHdvcnRoIGEgcmVkdW5kYW50IHN0YXQuXG4gIGNvbnN0IGRyb3BzVGVzdFJ1c3RCYWRnZSA9XG4gICAgY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA9PT0gMCAmJiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aCwgJ3Rlc3QtcnVzdC55bWwnLCAndGVzdC1ydXN0Jyk7XG5cbiAgY29uc3QgYmFkZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpKSB7XG4gICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcbiAgICBpZiAoZmlsZU5hbWUgPT09ICd0ZXN0LXJ1c3QueW1sJyAmJiBkcm9wc1Rlc3RSdXN0QmFkZ2UpIGNvbnRpbnVlO1xuICAgIC8vIEdpdEh1YidzIGJhZGdlIGVuZHBvaW50IHJldHVybnMgNDA0IHVudGlsIHRoZSB3b3JrZmxvdyBoYXMgYXQgbGVhc3Qgb25lIHJ1biwgc28gYSBiYWRnZSBmb3IgYVxuICAgIC8vIGRpc3BhdGNoLW9ubHkgZGVwbG95IHdvcmtmbG93IHRoYXQgaGFzIG5ldmVyIHJ1biByZW5kZXJzIGFzIGEgYnJva2VuIGltYWdlLiBUZXN0IHdvcmtmbG93cyBydW5cbiAgICAvLyBvbiBldmVyeSBQUiwgc28gb25seSBkZXBsb3kgYmFkZ2VzIG5lZWQgdGhlIGd1YXJkLlxuICAgIGlmIChmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiAhKGF3YWl0IGhhc0FueVdvcmtmbG93UnVuKHJlcG9zaXRvcnksIGZpbGVOYW1lLCBjb25maWcuaXNQdWJsaWNSZXBvKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBiYWRnZU5hbWUgPSAoZmlsZU5hbWVbMF0gPz8gJycpLnRvVXBwZXJDYXNlKCkgKyBmaWxlTmFtZS5zbGljZSgxLCBmaWxlTmFtZS5pbmRleE9mKCcuJykpLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgIGNvbnN0IHdvcmtmbG93VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZW5jb2RlVXJsUGF0aChmaWxlTmFtZSl9YDtcbiAgICBiYWRnZXMucHVzaChgWyFbJHtiYWRnZU5hbWV9XSgke3dvcmtmbG93VXJsfS9iYWRnZS5zdmcpXSgke3dvcmtmbG93VXJsfSlgKTtcbiAgfVxuICByZXR1cm4gYmFkZ2VzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYXNBbnlXb3JrZmxvd1J1bihcbiAgcmVwb3NpdG9yeTogc3RyaW5nLFxuICB3b3JrZmxvd0ZpbGVOYW1lOiBzdHJpbmcsXG4gIGlzUHVibGljUmVwbzogYm9vbGVhblxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSByZXBvc2l0b3J5LnNwbGl0KCcvJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChvd25lcikucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3J1bnMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICB3b3JrZmxvd19pZDogd29ya2Zsb3dGaWxlTmFtZSxcbiAgICAgIHBlcl9wYWdlOiAxLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50ID4gMDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBGb3IgYSBQVUJMSUMgcmVwb3NpdG9yeSB0aGUgcnVucyBlbmRwb2ludCBuZWVkcyBubyBhdXRob3JpemF0aW9uLCBzbyA0MDQgcmVsaWFibHkgbWVhbnMgdGhlXG4gICAgLy8gd29ya2Zsb3cgaXMgYWJzZW50IGZyb20gdGhlIHJlbW90ZSAoZS5nLiBhZGRlZCBsb2NhbGx5LCBuZXZlciBwdXNoZWQpIOKAlCBsaWtlIHplcm8gcnVucywgaXRzXG4gICAgLy8gYmFkZ2Ugd291bGQgcmVuZGVyIGJyb2tlbi4gRm9yIGEgUFJJVkFURSByZXBvc2l0b3J5IEdpdEh1YiBhbHNvIGFuc3dlcnMgNDA0IHdoZW4gdGhlIHRva2VuXG4gICAgLy8gaXMgbWlzc2luZyBvciB1bmRlci1zY29wZWQsIHNvIDQwNCBpcyBhbWJpZ3VvdXMgdGhlcmUgYW5kIHRoZSBiYWRnZSBpcyBrZXB0LlxuICAgIGlmICgoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzID09PSA0MDQgJiYgaXNQdWJsaWNSZXBvKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gS2VlcCB0aGUgcHJlLWd1YXJkIGJlaGF2aW9yIChpbnNlcnQgdGhlIGJhZGdlKSB3aGVuIHRoZSBjaGVjayBpdHNlbGYgY2Fubm90IHJ1bi5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBiYWRnZSBibG9jayDigJQgdGhlIGJhZGdlcyB3YmZ5IGtlZXBzIGRpcmVjdGx5IHVuZGVyIHRoZSB0aXRsZSDigJQgd2l0aCBgbWFuYWdlZEJhZGdlc2AsXG4gKiBrZWVwaW5nIGFueSBiYWRnZSB0aGVyZSB0aGF0IHdiZnkgZG9lcyBub3QgbWFuYWdlLCBhbmQgcmVhc3NlbWJsZXMgdGhlIFJFQURNRSBhcm91bmQgaXQgd2l0aFxuICogZXhhY3RseSBvbmUgYmxhbmsgbGluZSBvbiBlYWNoIHNpZGUuXG4gKlxuICogQm90aCB0aGUgdGl0bGUgYW5kIHRoZSBibG9jayBhcmUgbG9jYXRlZCBpbiBhIENvbW1vbk1hcmsgc3ludGF4IHRyZWUgcmF0aGVyIHRoYW4gYnkgc2Nhbm5pbmdcbiAqIGxpbmVzOiBvbmx5IGEgcmVhbCBwYXJzZXIga25vd3Mgd2hldGhlciBhIGxpbmUgdGhhdCBsb29rcyBsaWtlIGEgYmFkZ2UgaXMgYSBiYWRnZSAoYSBwYXJhZ3JhcGggb2ZcbiAqIGxpbmtlZCBpbWFnZXMpIG9yIGNvbnRlbnQgdGhhdCBtZXJlbHkgcmVhZHMgbGlrZSBvbmUgKGFuIGluZGVudGVkIGNvZGUgYmxvY2ssIGEgYmxvY2sgcXVvdGUsIGFcbiAqIGZlbmNlZCBleGFtcGxlLCBhIG11bHRpbGluZSBjb2RlIHNwYW4sIGFuIEhUTUwgYmxvY2spLiBFdmVyeXRoaW5nIG91dHNpZGUgdGhlIGJsb2NrIGlzIGNvcGllZCBiYWNrXG4gKiB2ZXJiYXRpbSBmcm9tIHRoZSBvcmlnaW5hbCB0ZXh0IHRocm91Z2ggdGhlIHBhcnNlcidzIHBvc2l0aW9uYWwgb2Zmc2V0cywgc28gbm8gcmVmb3JtYXR0aW5nIG9mIHRoZVxuICogdXNlcidzIGNvbnRlbnQgaXMgcG9zc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUJhZGdlQmxvY2socmVhZG1lOiBzdHJpbmcsIG1hbmFnZWRCYWRnZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZUVuZGluZyA9IGdldExpbmVFbmRpbmcocmVhZG1lKTtcbiAgLy8gQSBCT00gaXMgbm90IE1hcmtkb3duOiBsZWZ0IGluIHRoZSB0ZXh0IGl0IGhpZGVzIHRoZSBgI2Agb2YgdGhlIHRpdGxlIGZyb20gdGhlIHBhcnNlciwgYW5kXG4gIC8vIHByZXBlbmRpbmcgdGhlIGJsb2NrIGFoZWFkIG9mIGl0IHdvdWxkIHN0cmlwIHRoZSBtYXJrZXIgZnJvbSB0aGUgZmlsZSdzIGZpcnN0IGJ5dGUuXG4gIGNvbnN0IGJ5dGVPcmRlck1hcmsgPSByZWFkbWUuc3RhcnRzV2l0aCgn77u/JykgPyAn77u/JyA6ICcnO1xuICAvLyBGcm9udCBtYXR0ZXIgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzYW1lIGAtLS1gIGEgU2V0ZXh0IGhlYWRpbmcgYW5kIGEgdGhlbWF0aWMgYnJlYWsgdXNlLCBzbyBpdCBpc1xuICAvLyBkZXRhY2hlZCBiZWZvcmUgcGFyc2luZyBpbnN0ZWFkIG9mIGJlaW5nIHRvbGQgYXBhcnQgYWZ0ZXJ3YXJkczsgaXQgYWxzbyBoYXMgdG8gc3RheSBmaXJzdCBpbiB0aGVcbiAgLy8gZmlsZSwgd2hpY2ggbWFrZXMgaXQgYSBwcmVmaXggaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgdGhlIEJPTSBpcy5cbiAgY29uc3Qgd2l0aG91dE1hcmsgPSByZWFkbWUuc2xpY2UoYnl0ZU9yZGVyTWFyay5sZW5ndGgpO1xuICBjb25zdCBmcm9udE1hdHRlciA9IHdpdGhvdXRNYXJrLnN0YXJ0c1dpdGgoJy0tLScpXG4gICAgPyAoL14tLS1bIFxcdF0qXFxyP1xcbltcXHNcXFNdKj9eLS0tWyBcXHRdKig/Olxccj9cXG58JCkvbXUuZXhlYyh3aXRob3V0TWFyayk/LlswXSA/PyAnJylcbiAgICA6ICcnO1xuICBjb25zdCBwcmVmaXggPSBgJHtieXRlT3JkZXJNYXJrfSR7ZnJvbnRNYXR0ZXJ9YDtcbiAgLy8gVGhlIGZpbmFsIG5ld2xpbmUgaXMgc2V0IGFzaWRlIHJhdGhlciB0aGFuIHBhcnNlZCBhcyB0cmFpbGluZyBibGFuayBzcGFjZSwgd2hpY2ggdGhlIGJsYW5rLWxpbmVcbiAgLy8gdHJpbW1pbmcgYmVsb3cgd291bGQgb3RoZXJ3aXNlIHN3YWxsb3cuXG4gIGNvbnN0IGVuZHNXaXRoTmV3bGluZSA9IC9cXHI/XFxuJC91LnRlc3QocmVhZG1lKTtcbiAgY29uc3QgY29udGVudCA9IHdpdGhvdXRNYXJrLnNsaWNlKGZyb250TWF0dGVyLmxlbmd0aCkucmVwbGFjZSgvXFxyP1xcbiQvdSwgJycpO1xuXG4gIGNvbnN0IG5vZGVzID0gZnJvbU1hcmtkb3duKGNvbnRlbnQpLmNoaWxkcmVuO1xuICAvLyBBIGxlYWRpbmcgYmFkZ2UgYmxvY2sgaXMgdGhlIHVzZXIncyBvd24gbGF5b3V0OiBpdCBzdGF5cyBhYm92ZSB0aGUgdGl0bGUsIGFuZCB3YmZ5J3MgYmxvY2sgZ29lcyBiZWxvdy5cbiAgY29uc3Qga2VlcHNMZWFkaW5nQmxvY2sgPSAhIW5vZGVzWzBdICYmIGlzQmFkZ2VCbG9ja05vZGUobm9kZXNbMF0pICYmIGlzVGl0bGVOb2RlKG5vZGVzWzFdKTtcbiAgY29uc3QgdGl0bGVJbmRleCA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gMSA6IGlzVGl0bGVOb2RlKG5vZGVzWzBdKSA/IDAgOiAtMTtcbiAgLy8gV2l0aG91dCBhIHJlY29nbml6YWJsZSB0aXRsZSB0aGUgYmxvY2sgc2l0cyBhdCB0aGUgdmVyeSB0b3AsIGFib3ZlIGV2ZXJ5dGhpbmcuXG4gIGNvbnN0IGhlYWRTdGFydE5vZGUgPSBrZWVwc0xlYWRpbmdCbG9jayA/IG5vZGVzWzBdISA6IG5vZGVzW3RpdGxlSW5kZXhdO1xuICBjb25zdCBoZWFkID1cbiAgICB0aXRsZUluZGV4ID09PSAtMVxuICAgICAgPyAnJ1xuICAgICAgOiBjb250ZW50LnNsaWNlKHN0YXJ0T2Zmc2V0V2l0aEluZGVudChjb250ZW50LCBoZWFkU3RhcnROb2RlISksIG5vZGVzW3RpdGxlSW5kZXhdIS5wb3NpdGlvbiEuZW5kLm9mZnNldCk7XG5cbiAgY29uc3QgYmxvY2tOb2RlID0gbm9kZXNbdGl0bGVJbmRleCArIDFdO1xuICBjb25zdCBleGlzdGluZyA9IGJsb2NrTm9kZSAmJiBpc0JhZGdlQmxvY2tOb2RlKGJsb2NrTm9kZSkgPyByZWFkQmFkZ2VzKGJsb2NrTm9kZSwgY29udGVudCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvZHlOb2RlID0gZXhpc3RpbmcgJiYgYmxvY2tOb2RlID8gbm9kZXNbbm9kZXMuaW5kZXhPZihibG9ja05vZGUpICsgMV0gOiBibG9ja05vZGU7XG4gIGNvbnN0IGJvZHkgPSBib2R5Tm9kZSA/IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGJvZHlOb2RlKSkgOiAnJztcblxuICAvLyBTdXBlcnNlZGluZyBhIG1hbmFnZWQgYmFkZ2UgaXMganVzdCBkcm9wcGluZyB0aGUgb2xkIG9uZTogYSB2ZXJzaW9uIG9yIHdvcmtmbG93IGNoYW5nZSBsZWF2ZXNcbiAgLy8gbm8gc3RhbGUgY29weSwgd2hpbGUgYW55IG90aGVyIGJhZGdlIGluIHRoZSBibG9jayAoaW5jbHVkaW5nIGEgbm9uLWNhbm9uaWNhbCB3YmZ5IGJhZGdlLCB3aGljaFxuICAvLyBpcyByZW1vdmVkIG1hbnVhbGx5KSBpcyBrZXB0LlxuICBjb25zdCBiYWRnZXMgPSBbLi4ubWFuYWdlZEJhZGdlcywgLi4uKGV4aXN0aW5nID8/IFtdKS5maWx0ZXIoKGJhZGdlKSA9PiAhaXNNYW5hZ2VkQmFkZ2UoYmFkZ2UpKV07XG4gIC8vIENvbnRlbnQgaXMgc2xpY2VkIGZyb20gaXRzIG5vZGUncyBzdGFydCBvZmZzZXQsIHNvIHdoYXRldmVyIGJsYW5rIHNwYWNlIGZvbGxvd2VkIHRoZSBmcm9udFxuICAvLyBtYXR0ZXIgaXMgZ29uZTsgZXhhY3RseSBvbmUgYmxhbmsgbGluZSBpcyByZXN0b3JlZCBoZXJlLiBBIGNsb3NpbmcgZGVsaW1pdGVyIHRoYXQgZW5kZWQgYXQgRU9GXG4gIC8vIGNhcnJpZXMgbm8gbmV3bGluZSBvZiBpdHMgb3duIGFuZCBuZWVkcyBib3RoLCBvciBgLS0tYCB3b3VsZCBmdXNlIHdpdGggdGhlIGZpcnN0IGJhZGdlIGFuZFxuICAvLyBkZXN0cm95IHRoZW0gYm90aC4gQSBCT00gbmVlZHMgbm8gc2VwYXJhdG9yOiBpdCBpcyBhIGJ5dGUgbWFya2VyLCBub3QgYSBsaW5lLlxuICBjb25zdCBzZXBhcmF0b3IgPSBmcm9udE1hdHRlciA/ICgvXFxyP1xcbiQvdS50ZXN0KGZyb250TWF0dGVyKSA/IGxpbmVFbmRpbmcgOiBgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKSA6ICcnO1xuICBjb25zdCByZXN1bHQgPVxuICAgIHByZWZpeCArIHNlcGFyYXRvciArIFtoZWFkLCBiYWRnZXMuam9pbihsaW5lRW5kaW5nKSwgYm9keV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCk7XG4gIHJldHVybiBlbmRzV2l0aE5ld2xpbmUgPyBgJHtyZXN1bHR9JHtsaW5lRW5kaW5nfWAgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBleHRlbmRlZCBiYWNrIG92ZXIgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBpdHMgb3duIGxpbmUuIENvbW1vbk1hcmtcbiAqIGFsbG93cyBvbmUgdG8gdGhyZWUgc3BhY2VzIG9mIGluZGVudGF0aW9uIGJlZm9yZSBhIGJsb2NrLCBhbmQgbWRhc3QgcmVwb3J0cyB0aGUgb2Zmc2V0IEFGVEVSXG4gKiB0aGVtIOKAlCBzbyBzbGljaW5nIGZyb20gaXQgc2lsZW50bHkgcmVpbmRlbnRzIGNvbnRlbnQgdGhpcyBnZW5lcmF0b3IgcHJvbWlzZXMgdG8gY29weSB2ZXJiYXRpbS5cbiAqL1xuZnVuY3Rpb24gc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQ6IHN0cmluZywgbm9kZTogUm9vdENvbnRlbnQpOiBudW1iZXIge1xuICBjb25zdCBzdGFydCA9IG5vZGUucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCE7XG4gIGNvbnN0IGxpbmVTdGFydCA9IGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIHN0YXJ0IC0gMSkgKyAxO1xuICByZXR1cm4gL15bIFxcdF0qJC91LnRlc3QoY29udGVudC5zbGljZShsaW5lU3RhcnQsIHN0YXJ0KSkgPyBsaW5lU3RhcnQgOiBzdGFydDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBub2RlIG9wZW5zIHRoZSBSRUFETUUgd2l0aCBhIHRpdGxlLiBPbmx5IHRoZSBGSVJTVCBwaWVjZSBvZiBjb250ZW50IGNhbiBiZSBvbmU6IGFcbiAqIHRpdGxlIGlzIHdoYXQgYSBSRUFETUUgb3BlbnMgd2l0aCwgYW5kIGFuY2hvcmluZyB0aGUgYmFkZ2VzIHRvIGEgaGVhZGluZyBmdXJ0aGVyIGRvd24gd291bGQgYnVyeVxuICogdGhlbSBiZWxvdyBjb250ZW50IHRoZSBhdXRob3IgcHV0IGZpcnN0LlxuICovXG5mdW5jdGlvbiBpc1RpdGxlTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ2hlYWRpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgLy8gTWFueSBSRUFETUVzIGNlbnRlciB0aGVpciB0aXRsZSBpbiBIVE1MIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLCB3aGljaCB0aGVcbiAgLy8gcGFyc2VyIHJlcG9ydHMgYXMgb25lIG9wYXF1ZSBIVE1MIGJsb2NrOyB0aGUgYmFkZ2VzIGdvIGFmdGVyIHRoZSB3aG9sZSBibG9jay5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2h0bWwnICYmIGNvbnRhaW5zUmVuZGVyZWRIMShub2RlLnZhbHVlKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBIVE1MIGJsb2NrIHVuYW1iaWd1b3VzbHkgUkVOREVSUyBhbiBgPGgxPmAg4oCUIHRoZSBjZW50ZXJlZC10aXRsZSBsYXlvdXQgbWFueSBSRUFETUVzXG4gKiB1c2UgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBhIGdlbmVyYWwgSFRNTCBwYXJzZXIuIERlY2lkaW5nIHRoaXMgZXhhY3RseSByZXF1aXJlcyB0aGUgcmVhbCB0b2tlbml6ZXInc1xuICogc3RhdGVzIOKAlCByYXcgdGV4dCwgUkNEQVRBLCBzY3JpcHQgZGF0YSwgYXR0cmlidXRlIHZhbHVlcywgdGVtcGxhdGUgY29udGVudHMsIGRlY2xhcmF0aW9ucyDigJQgYW5kXG4gKiBhcHByb3hpbWF0aW5nIHRoZW0gd2l0aCByZWdleGVzIGlzIHRoZSBzYW1lIGxvc2luZyBnYW1lIHRoZSBNYXJrZG93biBzY2FubmluZyB0aGlzIG1vZHVsZVxuICogcmVwbGFjZWQgd2FzIHBsYXlpbmcuIFNvIHRoZSBydWxlIGlzOiB0b2tlbml6ZSBvbmx5IHRoZSBzaW1wbGUgY2FzZSwgYW5kIHRyZWF0IGFueXRoaW5nIGNhcnJ5aW5nXG4gKiBhIGNvbnN0cnVjdCB3aG9zZSBwYXJzaW5nIGRlcGVuZHMgb24gdGhvc2Ugc3RhdGVzIGFzIE5PVCBhIHRpdGxlLiBCZWluZyB3cm9uZyB0aGF0IHdheSBwdXRzIHRoZVxuICogYmFkZ2VzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIHdoaWNoIGlzIG1lcmVseSB1bmhlbHBmdWw7IGJlaW5nIHdyb25nIHRoZSBvdGhlciB3YXkgcmV3cml0ZXMgdGhlXG4gKiB1c2VyJ3MgUkVBRE1FIGFyb3VuZCB0aGUgd3JvbmcgYW5jaG9yLlxuICovXG5mdW5jdGlvbiBjb250YWluc1JlbmRlcmVkSDEoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbW1lbnRzIGNhbm5vdCBuZXN0IGFuZCBlbmQgdW5hbWJpZ3VvdXNseSwgc28gdGhleSBhcmUgc2ltcGx5IHJlbW92ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZy5cbiAgY29uc3Qgd2l0aG91dENvbW1lbnRzID0gaHRtbC5yZXBsYWNlQWxsKC88IS0tW1xcc1xcU10qPyg/Oi0tPnwkKS9ndSwgJycpO1xuICAvLyBDREFUQSwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGRlY2xhcmF0aW9ucywgZWxlbWVudHMgd2hvc2UgY29udGVudCBpcyByYXcgdGV4dCAvIFJDREFUQSAvXG4gIC8vIHNjcmlwdCBkYXRhLCBhbmQgYDx0ZW1wbGF0ZT5gICh3aG9zZSBjb250ZW50cyBhcmUgaW5lcnQpLiBBIHF1b3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyBgPGBcbiAgLy8gbWFrZXMgZXZlbiBsb2NhdGluZyB0aGVzZSB1bnJlbGlhYmxlLCBzbyBpdCBkaXNxdWFsaWZpZXMgdGhlIGJsb2NrIHRvby5cbiAgY29uc3QgYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybiA9XG4gICAgLzwhXFxbQ0RBVEFcXFt8PFxcP3w8IVthLXpBLVpdfDxcXC8/KD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlfGlmcmFtZXxub2ZyYW1lc3xub2VtYmVkfHhtcHx0ZW1wbGF0ZSlcXGJ8XCJbXlwiXSo8W15cIl0qXCJ8J1teJ10qPFteJ10qJy9pdTtcbiAgaWYgKGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4udGVzdCh3aXRob3V0Q29tbWVudHMpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFF1b3RpbmcgaXMgc2lnbmlmaWNhbnQgb25seSBpbnNpZGUgYSBzdGFydCB0YWcsIHNvIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyBjb25zdW1lZCB3aXRoIGl0cyBvd25cbiAgLy8gdGFnIHdoaWxlIHF1b3RhdGlvbiBtYXJrcyBpbiBvcmRpbmFyeSB0ZXh0IHN0YXkgdGV4dDogYDxkaXYgdGl0bGU9XCImbHQ7aDEmZ3Q7XCI+YCBkb2VzIG5vdCBjb3VudCxcbiAgLy8gYFwiPGgxPlByb2plY3Q8L2gxPlwiYCBkb2VzLlxuICBjb25zdCBzdGFydFRhZ1BhdHRlcm4gPSAvPChbYS16QS1aXVteXFxzLz5dKikoPzpcIlteXCJdKlwifCdbXiddKid8W14+XCInXSkqPi9ndTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB3aXRob3V0Q29tbWVudHMubWF0Y2hBbGwoc3RhcnRUYWdQYXR0ZXJuKSkge1xuICAgIGlmIChtYXRjaFsxXT8udG9Mb3dlckNhc2UoKSA9PT0gJ2gxJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogV2hldGhlciB0aGUgbm9kZSBpcyBhIHBhcmFncmFwaCBvZiBiYWRnZXMgYW5kIG5vdGhpbmcgZWxzZSDigJQgdGhlIG9ubHkgY29udGVudCB3YmZ5IHB1dHMgaW4gdGhlIGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNCYWRnZUJsb2NrTm9kZShub2RlOiBSb290Q29udGVudCk6IG5vZGUgaXMgUGFyYWdyYXBoIHtcbiAgcmV0dXJuIChcbiAgICBub2RlLnR5cGUgPT09ICdwYXJhZ3JhcGgnICYmXG4gICAgbm9kZS5jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKSAmJlxuICAgIG5vZGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgICAoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSB8fCBjaGlsZC50eXBlID09PSAnYnJlYWsnIHx8IChjaGlsZC50eXBlID09PSAndGV4dCcgJiYgIWNoaWxkLnZhbHVlLnRyaW0oKSlcbiAgICApXG4gICk7XG59XG5cbi8qKiBBIGJhZGdlIGlzIG9uZSBgWyFbYWx0XShpbWFnZSldKGxpbmspYCwgdGhlIG9ubHkgc2hhcGUgd2JmeSBldmVyIHdyaXRlcy4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgUGhyYXNpbmdDb250ZW50KTogbm9kZSBpcyBMaW5rICYgeyBjaGlsZHJlbjogW0ltYWdlXSB9IHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2xpbmsnICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuY2hpbGRyZW5bMF0/LnR5cGUgPT09ICdpbWFnZSc7XG59XG5cbi8qKlxuICogVGhlIGJhZGdlcyBpbiB0aGUgYmxvY2ssIGFzIHRoZSBleGFjdCBzb3VyY2UgdGV4dCB0aGF0IHByb2R1Y2VkIHRoZW06IGEgYmFkZ2Ugd2JmeSBkb2VzIG5vdCBtYW5hZ2VcbiAqIGlzIHdyaXR0ZW4gYmFjayBieXRlIGZvciBieXRlIGluc3RlYWQgb2YgYmVpbmcgcmUtc2VyaWFsaXplZCBmcm9tIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiByZWFkQmFkZ2VzKG5vZGU6IFBhcmFncmFwaCwgY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpXG4gICAgLm1hcCgoY2hpbGQpID0+IGNvbnRlbnQuc2xpY2UoY2hpbGQucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCwgY2hpbGQucG9zaXRpb24hLmVuZC5vZmZzZXQpKTtcbn1cblxuLyoqXG4gKiBQZXJjZW50LWVuY29kZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBlbmQgYSBNYXJrZG93biBkZXN0aW5hdGlvbiBlYXJseS4gQSB3b3JrZmxvdyBmaWxlIG1heSBiZVxuICogbmFtZWQgYW55dGhpbmcgd2l0aCBhIGAueW1sYCBleHRlbnNpb24sIGFuZCBvbmUgY29udGFpbmluZyBgKGAgb3IgYClgIHByb2R1Y2VkIGEgYmFkZ2UgdGhhdCB3YmZ5J3NcbiAqIG93biBiYWRnZSBwYXR0ZXJuIGNvdWxkIG5vdCByZWFkIGJhY2sg4oCUIHNvIHRoZSBsaW5lIGxlZnQgdGhlIGJsb2NrIGFuZCB0aGUgYmFkZ2Ugd2FzIGR1cGxpY2F0ZWQuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVybFBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bKClcXHNdL2d1LCAoY2hhcmFjdGVyKSA9PiBgJSR7Y2hhcmFjdGVyLmNvZGVQb2ludEF0KDApIS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIG9uZSB3YmZ5IHdyaXRlcyBpdHNlbGYsIGFuZCBzbyBtYXkgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgYmxvY2suICovXG5mdW5jdGlvbiBpc01hbmFnZWRCYWRnZShiYWRnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBiYWRnZSA9PT0gc2VtYW50aWNSZWxlYXNlQmFkZ2UgfHwgbWFuYWdlZEJhZGdlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGJhZGdlKSk7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVFbmRpbmcoY29udGVudDogc3RyaW5nKTogJ1xcbicgfCAnXFxyXFxuJyB7XG4gIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXHJcXG4nKSA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuXG5jb25zdCBzaGFyZWRQcmVzZXQgPSAnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbmMnO1xuY29uc3QgZ2VuZXJhdGVkU2V0dGluZ3MgPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogW3NoYXJlZFByZXNldF0sXG59O1xuXG50eXBlIFNldHRpbmdzID0gUGFydGlhbDx0eXBlb2YgZ2VuZXJhdGVkU2V0dGluZ3M+ICYge1xuICBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdO1xufTtcblxuY29uc3QgbWFuYWdlZEZpbGVOYW1lID0gJ3Jlbm92YXRlLmpzb25jJztcblxuLy8gd2JmeSBzdXBwb3J0cyBvbmUgY2Fub25pY2FsIFJlbm92YXRlIGxvY2F0aW9uLiBOb24tY2Fub25pY2FsIGNvbmZpZ3MgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbi8vIHJlcG9zaXRvcnkgaW5zdGVhZCBvZiBiZWluZyBwYXJzZWQsIG1lcmdlZCwgb3IgZGVsZXRlZCBoZXJlLlxuY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMgPSBbXG4gICdyZW5vdmF0ZS5qc29uJyxcbiAgJ3Jlbm92YXRlLmpzb241JyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbicsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb25jJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbjUnLFxuICAnLnJlbm92YXRlcmMnLFxuICAnLnJlbm92YXRlcmMuanNvbicsXG4gICcucmVub3ZhdGVyYy5qc29uNScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgbWFuYWdlZEZpbGVOYW1lKTtcbiAgICBjb25zdCBtYW5hZ2VkRmlsZVN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAobWFuYWdlZEZpbGVTdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGNhbmRpZGF0ZSkuY2F0Y2goKCkgPT4ge30pKSA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdQYXRoID0gbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAobm9uQ2Fub25pY2FsQ29uZmlnUGF0aCB8fCBjb25maWcucGFja2FnZUpzb24/LnJlbm92YXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgcmVwb3NpdG9yeSBoYXMgYSBub24tY2Fub25pY2FsIFJlbm92YXRlIGNvbmZpZyR7XG4gICAgICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA/IGAgYXQgJHtub25DYW5vbmljYWxDb25maWdQYXRofWAgOiAnIGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgfS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8U2V0dGluZ3M+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRTZXR0aW5ncz8uZXh0ZW5kcyAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4dGVuZHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiZXh0ZW5kc1wiIGlzIG5vdCBhbiBhcnJheS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZFByZXNldCA9IG9sZFNldHRpbmdzPy5leHRlbmRzPy5maW5kKFxuICAgICAgKHByZXNldCkgPT4gcHJlc2V0LnN0YXJ0c1dpdGgoJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOicpICYmIHByZXNldCAhPT0gc2hhcmVkUHJlc2V0XG4gICAgKTtcbiAgICBpZiAocmVtb3ZlZFByZXNldCkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcIiR7cmVtb3ZlZFByZXNldH1cIiBubyBsb25nZXIgZXhpc3RzOyByZW1vdmUgaXQgbWFudWFsbHkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSBidWlsZFNldHRpbmdzKGNvbmZpZywgb2xkU2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICAgIG9sZENvbnRlbnQsXG4gICAgICBuZXdTZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBub3JtYWxpemUoY29udGVudCkgPT09IG5vcm1hbGl6ZShvbGRDb250ZW50KSkgcmV0dXJuO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IFNldHRpbmdzIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBvbGRTZXR0aW5nc1xuICAgID8gKG1lcmdlLmFsbChbZ2VuZXJhdGVkU2V0dGluZ3MsIG9sZFNldHRpbmdzLCBnZW5lcmF0ZWRTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncylcbiAgICA6IHN0cnVjdHVyZWRDbG9uZShnZW5lcmF0ZWRTZXR0aW5ncyk7XG4gIGNvbnN0IGV4aXN0aW5nRXh0ZW5kcyA9IG9sZFNldHRpbmdzPy5leHRlbmRzID8/IFtdO1xuICBzZXR0aW5ncy5leHRlbmRzID0gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzXG4gICAgPyBleGlzdGluZ0V4dGVuZHMuZmlsdGVyKChwcmVzZXQpID0+IHByZXNldCAhPT0gc2hhcmVkUHJlc2V0KVxuICAgIDogZXhpc3RpbmdFeHRlbmRzLmluY2x1ZGVzKHNoYXJlZFByZXNldClcbiAgICAgID8gZXhpc3RpbmdFeHRlbmRzXG4gICAgICA6IFtzaGFyZWRQcmVzZXQsIC4uLmV4aXN0aW5nRXh0ZW5kc107XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gIHJldHVybiB0cmltbWVkQ29udGVudCA/IHRyaW1tZWRDb250ZW50ICsgJ1xcbicgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgLy8gYGFwcC8qKmAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBldmVuIHRob3VnaCB0aGUgZG9lc0NvbnRhaW4qU2NyaXB0IHNpZ25hbHMgc2NhbiBpdDogYXBwXG4gIC8vIGRpcmVjdG9yaWVzIGJlbG9uZyB0byBmcmFtZXdvcmsgcGFja2FnZXMgKE5leHQuanMvQmxpdHopLCB3aGljaCBvd24gdGhlaXIgdHNjb25maWdcbiAgLy8gKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSksIGFuZCBjaGVja2luZyBmcmFtZXdvcmsgc291cmNlcyB1bmRlciB0aGlzIHByb2plY3QncyBjb21waWxlclxuICAvLyBvcHRpb25zIHdvdWxkIHByb2R1Y2UgZmFsc2UgZXJyb3JzLlxuICBpbmNsdWRlOiBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrIGFuZCBvd25zIGl0cyB0c2NvbmZpZyBqdXN0IGxpa2UgTmV4dC9CbGl0eixcbiAgICAvLyBzbyBpdCBtdXN0IHNraXAgdGhlIHN0YW5kYXJkIGdlbmVyYXRpb24gdGhhdCB3b3VsZCBvdmVyd3JpdGUgdGhlIGZyYW1ld29yaydzIG93biBzZXR0aW5ncy5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGF3YWl0IG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gKGNvbmZpZy5pc1Jvb3QgPyBidWlsZFJvb3RKc29uT2JqKGNvbmZpZykgOiBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgLy8gUHJpc21hIHNlZWRzIGFuZCBtaWdyYXRpb24gaGVscGVyIHNjcmlwdHMgb2Z0ZW4gbGl2ZSBvdXRzaWRlIHNyYywgYnV0XG4gICAgICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgc3RpbGwgbmVlZHMgdGhlbSBjb3ZlcmVkIGJ5IHRoZSBwcm9qZWN0IGNvbmZpZy5cbiAgICAgIGFkZEluY2x1ZGVQYXRoKG5ld1NldHRpbmdzLCAncHJpc21hLyoqLyonKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLy8gQSBmaWxlIHdpdGggbm8gY29uZmlndXJhdGlvbiAoZW1wdHkgb3IgY29tbWVudC1vbmx5KSBpcyB0cmVhdGVkIGxpa2UgYSBtaXNzaW5nIG9uZSwgYXMgdHNjIGRvZXMuXG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgICAvLyBBbiBleGlzdGluZyB0c2NvbmZpZy5qc29uIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlXG4gICAgICAvLyBnZW5lcmF0ZWQgc2V0dGluZ3Mgd2l0aG91dCBtZXJnaW5nIHdvdWxkIHNpbGVudGx5IGRpc2NhcmQgdGhlIHByb2plY3QncyBjb25maWd1cmF0aW9uLlxuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpKSk7XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBjb25zdCBleGlzdGluZ0VtaXRNZXRhZGF0YSA9IHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgICAgICByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKGNvbmZpZywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICAgIH1cbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9XG4gICAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhuZXdTZXR0aW5ncywgY29uZmlnKTtcbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS11cC10by1kYXRlIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncykpIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIG1vbm9yZXBvLXJvb3QgdHNjb25maWcsIHdob3NlIGluY2x1ZGUvZXhjbHVkZSBjb3ZlciBldmVyeSBERUNMQVJFRCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuXG4gKiBgYXBwcy8qYCBhbG9uZ3NpZGUgYHBhY2thZ2VzLypgKSBzbyB0eXBlLWF3YXJlIGxpbnRpbmcgcnVuIGZyb20gdGhlIHJvb3Qgc2VlcyBhbGwgd29ya3NwYWNlXG4gKiBzb3VyY2VzLCBub3QganVzdCB0aGUgY29udmVudGlvbmFsIHBhY2thZ2VzLyogZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBidWlsZFJvb3RKc29uT2JqKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFRzQ29uZmlnSnNvbiB7XG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhjb25maWcpXG4gICAgOiB7IGV4Y2x1ZGVzOiBbXSwgaW5jbHVkZXM6IFtdIH07XG4gIGNvbnN0IHNldHRpbmdzID0gc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgc2V0dGluZ3MuZXhjbHVkZSA9IFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC9maXh0dXJlc2ApLFxuICAgICAgLy8gTmVnYXRpdmUgd29ya3NwYWNlIHBhdHRlcm5zIChlLmcuIGAhcGFja2FnZXMvZXhjbHVkZWRgKSBvcHQgd29ya3NwYWNlIHN1YnRyZWVzIG91dCBvZiB0aGVcbiAgICAgIC8vIG1vbm9yZXBvLCBzbyB0aGVpciBzb3VyY2VzIG11c3Qgbm90IGVudGVyIHRoZSByb290IHR5cGUtY2hlY2sgcHJvamVjdCBlaXRoZXIuIEEgbmVnYXRpb25cbiAgICAgIC8vIHdob3NlIGRpcmVjdG9yeSBpcyBhbiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSB5aWVsZHMgcGFja2FnZS1vd25lZCBzdWJwYXRoIGVudHJpZXNcbiAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHdob2xlIHN1YnRyZWUgKHNlZSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykuXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5leGNsdWRlcyxcbiAgICAgIC8vIFRoZSBtYW5hZ2VkIGluY2x1ZGVzIGFib3ZlIGRlbGliZXJhdGVseSBvbWl0IGZyYW1ld29yayBgYXBwLyoqYCBkaXJlY3RvcmllcyAoc2VlXG4gICAgICAvLyBzdWJKc29uT2JqLmluY2x1ZGUncyBjb21tZW50KSwgYnV0IGEgcmVwby1hdXRob3JlZCBicm9hZCBpbmNsdWRlIHN1Y2ggYXMgYGUyZS8qKlxcLypgXG4gICAgICAvLyBjYW4gc3RpbGwgZHJhZyBhIGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgc291cmNlcyBpbnRvIHRoZSByb290IHByb2plY3QsIHdoZXJlIHRoZXlcbiAgICAgIC8vIGZhaWwgdW5kZXIgdGhlIHJvb3QgY29tcGlsZXIgb3B0aW9ucyDigJQgdGhlaXIgYmFyZSBgbmV4dC8qYCBpbXBvcnRzIHJlc29sdmUgb25seSB0aHJvdWdoXG4gICAgICAvLyB0aGUgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIG93biB0c2NvbmZpZyBgcGF0aHNgLiBFeGNsdWRlIHRob3NlIGFwcCBkaXJlY3RvcmllcyBzbyB0aGVcbiAgICAgIC8vIHJvb3QgcHJvamVjdCBuZXZlciB0eXBlLWNoZWNrcyB0aGVtLCBubyBtYXR0ZXIgaG93IGJyb2FkIHRoZSByZXBvJ3MgaW5jbHVkZSBnbG9icyBhcmUuXG4gICAgICAuLi5nZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWcpLFxuICAgICAgLi4uKHNldHRpbmdzLmV4Y2x1ZGUgPz8gW10pLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG4gIHNldHRpbmdzLmluY2x1ZGUgPSBbXG4gICAgLi4uKHNldHRpbmdzLmluY2x1ZGUgPz8gW10pLFxuICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLmZsYXRNYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IFtcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59LyouY29uZmlnLnRzYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NjcmlwdHMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zcmMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0LyoqLypgLFxuICAgIF0pLFxuICBdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbi8vIEZyYW1ld29yayBwYWNrYWdlcyBvd24gdGhlaXIgdHNjb25maWcgKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSkgYW5kIHNoaW0gYmFyZSBpbXBvcnRzIHN1Y2ggYXNcbi8vIGBuZXh0L25hdmlnYXRpb25gIHRocm91Z2ggcGFja2FnZS1sb2NhbCBgcGF0aHNgOyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmtcbi8vIGFuZCBiZWhhdmVzIHRoZSBzYW1lLiBUaGVpciBhcHAgc291cmNlcyB0aGVyZWZvcmUgb25seSB0eXBlLWNoZWNrIHVuZGVyIHRoZWlyIG93biBjb25maWcuXG5jb25zdCBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMgPSBbJ2JsaXR6JywgJ25leHQnLCAndmluZXh0J107XG5cbi8vIEEgZnJhbWV3b3JrIGFwcCBsaXZlcyBpbiBgYXBwL2Agb3IsIHVuZGVyIHRoZSBzcmMtZGlyZWN0b3J5IGxheW91dCwgYHNyYy9hcHAvYC4gVGhlIHJvb3QgcHJvamVjdFxuLy8gaW5jbHVkZXMgYDx3b3Jrc3BhY2U+L3NyYy8qKi8qYCwgc28gYHNyYy9hcHBgIGxlYWtzIGluIGp1c3QgYXMgYSByZXBvLXdpZGUgZ2xvYiBjYW4gcHVsbCBpbiBgYXBwYC5cbmNvbnN0IGZyYW1ld29ya0FwcERpck5hbWVzID0gWydhcHAnLCAnc3JjL2FwcCddO1xuXG4vKiogUm9vdCBgZXhjbHVkZWAgZW50cmllcyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSByb290KSBmb3IgZXZlcnkgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBkaXJlY3RvcnkuICovXG5mdW5jdGlvbiBnZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSByZXR1cm4gW107XG4gIGNvbnN0IGV4Y2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZURpclBhdGggb2YgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKSkge1xuICAgIGlmICghZGVwZW5kc09uRnJhbWV3b3JrKHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGFwcERpck5hbWUgb2YgZnJhbWV3b3JrQXBwRGlyTmFtZXMpIHtcbiAgICAgIGNvbnN0IGFwcERpclBhdGggPSBwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgYXBwRGlyTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhhcHBEaXJQYXRoKSkgZXhjbHVkZXMucHVzaChwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBhcHBEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBleGNsdWRlcztcbn1cblxuZnVuY3Rpb24gZGVwZW5kc09uRnJhbWV3b3JrKG1hbmlmZXN0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBtYW5pZmVzdDogUGFja2FnZUpzb24gfCBudWxsO1xuICB0cnkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBBIG1hbmlmZXN0IHRoYXQgcGFyc2VzIHRvIGEgbm9uLW9iamVjdCAoZS5nLiBhIGZpbGUgbGl0ZXJhbGx5IGNvbnRhaW5pbmcgYG51bGxgKSBkZWNsYXJlcyBub1xuICAvLyBkZXBlbmRlbmNpZXM7IGd1YXJkIHRoZSBwcm9wZXJ0eSBhY2Nlc3MsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSB0aHJvdyBvdXRzaWRlIHRoZSB0cnkgYWJvdmUuXG4gIGlmICghbWFuaWZlc3QgfHwgdHlwZW9mIG1hbmlmZXN0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7IC4uLm1hbmlmZXN0LmRlcGVuZGVuY2llcywgLi4ubWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzIH07XG4gIHJldHVybiBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMuc29tZSgoZGVwZW5kZW5jeU5hbWUpID0+IGRlcGVuZGVuY2llc1tkZXBlbmRlbmN5TmFtZV0pO1xufVxuXG5jb25zdCBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzID0gWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ107XG5cbi8qKlxuICogUm9vdCBpbmNsdWRlL2V4Y2x1ZGUgZW50cmllcyB3YmZ5IGdlbmVyYXRlZCBmb3IgYW4gZWFybGllciB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGBwYWNrYWdlcy8qYFxuICogZ2xvYnMgaW4gYSByZXBvIHRoYXQgbm93IGRlY2xhcmVzIG9ubHkgYGFwcHMvKmApIG11c3Qgbm90IHN1cnZpdmUgdGhlIG1lcmdlIHdpdGggdGhlIGV4aXN0aW5nXG4gKiB0c2NvbmZpZywgb3IgdGhlIG9ic29sZXRlIGRpcmVjdG9yaWVzIHdvdWxkIGtlZXAgZW50ZXJpbmcgcm9vdCB0eXBlIGNoZWNraW5nIGZvcmV2ZXIuIEEgcHJlZml4XG4gKiBjb3VudHMgYXMgd2JmeS1tYW5hZ2VkIG9ubHkgd2hlbiB0aGUgQ09NUExFVEUgZ2VuZXJhdGVkIGluY2x1ZGUgc2V0IGZvciBpdCBpcyBwcmVzZW50IGFuZCBub1xuICogbG9uZ2VyIGdlbmVyYXRlZCDigJQgYSB1c2VyLWF1dGhvcmVkIGVudHJ5IHN1Y2ggYXMgYSBsb25lIGB0b29scy8qXFwvc3JjLyoqXFwvKmAgbmV2ZXIgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIG9sZFNldHRpbmdzOiBUc0NvbmZpZ0pzb24sXG4gIG5ld1NldHRpbmdzOiBUc0NvbmZpZ0pzb25cbik6IHZvaWQge1xuICBjb25zdCBzdGFsZVByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmluY2x1ZGUpKSB7XG4gICAgY29uc3Qgb2xkSW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRJbmNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5pbmNsdWRlKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG9sZEluY2x1ZGUpIHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpO1xuICAgICAgaWYgKHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8IHN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaXNDb21wbGV0ZSA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZXZlcnkoKHN1ZmZpeCkgPT5cbiAgICAgICAgb2xkSW5jbHVkZS5pbmNsdWRlcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTdGlsbEdlbmVyYXRlZCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuc29tZSgoc3VmZml4KSA9PlxuICAgICAgICBnZW5lcmF0ZWRJbmNsdWRlLmhhcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgaWYgKGlzQ29tcGxldGUgJiYgIWlzU3RpbGxHZW5lcmF0ZWQpIHN0YWxlUHJlZml4ZXMuYWRkKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgfVxuICAgIGlmIChzdGFsZVByZWZpeGVzLnNpemUgPiAwKSB7XG4gICAgICBvbGRTZXR0aW5ncy5pbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgPyBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8ICFzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leGNsdWRlKSkgcmV0dXJuO1xuICBjb25zdCBnZW5lcmF0ZWRFeGNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5leGNsdWRlKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykubWFwKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLnJlbGF0aXZlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCksIHdvcmtzcGFjZURpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpXG4gICAgICApXG4gICAgOiBbXTtcbiAgb2xkU2V0dGluZ3MuZXhjbHVkZSA9IG9sZFNldHRpbmdzLmV4Y2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnIHx8IGdlbmVyYXRlZEV4Y2x1ZGUuaGFzKGVudHJ5KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGVudHJ5LmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpKSB7XG4gICAgICByZXR1cm4gIXN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0nL3Rlc3QvZml4dHVyZXMnLmxlbmd0aCkpO1xuICAgIH1cbiAgICAvLyBBIGZyYW1ld29yayBhcHAgZXhjbHVkZSAoYDx3b3Jrc3BhY2U+L2FwcGAsIGA8d29ya3NwYWNlPi9zcmMvYXBwYCkgZm9yIGEgc3RpbGwtZGVjbGFyZWRcbiAgICAvLyB3b3Jrc3BhY2UgaXMgcHJ1bmVkIGJ5IGNvdmVyc1dvcmtzcGFjZURpciBiZWxvdyB3aGVuIG5vIGxvbmdlciBnZW5lcmF0ZWQ7IHRoaXMgY2F0Y2hlcyB0aGVcbiAgICAvLyByZW1haW5pbmcgY2FzZSwgd2hlcmUgdGhlIHdvcmtzcGFjZSBpdHNlbGYgd2FzIHJlbW92ZWQgYW5kIGl0cyBwcmVmaXggaXMgdGhlcmVmb3JlIHN0YWxlLlxuICAgIC8vIChBIHdyb25nIHN1ZmZpeCBzdHJpcCB5aWVsZHMgYSBwcmVmaXggYWJzZW50IGZyb20gc3RhbGVQcmVmaXhlcywgc28gdGVzdGluZyBldmVyeSBuYW1lIGlzIHNhZmUuKVxuICAgIGlmIChcbiAgICAgIGZyYW1ld29ya0FwcERpck5hbWVzLnNvbWUoXG4gICAgICAgIChhcHBEaXJOYW1lKSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7YXBwRGlyTmFtZX1gKSAmJiBzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtKGFwcERpck5hbWUubGVuZ3RoICsgMSkpKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIWNvdmVyc1dvcmtzcGFjZURpcihlbnRyeSwgd29ya3NwYWNlRGlyUGF0aHMpO1xuICB9KTtcbn1cblxuLy8gV2hldGhlciBhbiBleGNsdWRlIGVudHJ5IGlzIGEgd29ya3NwYWNlIG5lZ2F0aW9uIChgIWFwcHMvZXhjbHVkZWRgKSB3aG9zZSBuZWdhdGlvbiBpcyBnb25lOiB0aGVcbi8vIGRpcmVjdG9yeSBpcyBhIHdvcmtzcGFjZSBhZ2FpbiBhbmQgbXVzdCByZS1lbnRlciB0aGUgcm9vdCBwcm9qZWN0LiB3YmZ5IHdyaXRlcyBzdWNoIGEgbmVnYXRpb24gYXNcbi8vIGEgZGlyZWN0b3J5IHBhdGgsIGFzIGEgZGlyZWN0b3J5IFBBVFRFUk4gd2hlbiBpdCBleGNsdWRlcyBleGFjdGx5IHdoYXQgaXQgbWF0Y2hlcyAoYGFwcHMvKmJgKSwgb3Jcbi8vIGFzIGFuIGFuY2VzdG9yJ3MgcGFja2FnZS1vd25lZCBzdWJwYXRocyAoYGFwcHMveC9zcmNgKSDigJQgc28gdGhlIGVudHJ5IG1heSBjb3ZlciBhIGRpc2NvdmVyZWRcbi8vIHdvcmtzcGFjZSBkaXJlY3Rvcnkgb3Igc2l0IHVuZGVyIG9uZS4gQSBnbG9ic3RhciBzZWdtZW50IG1hcmtzIGEgaHlnaWVuZSBnbG9iIChub2RlX21vZHVsZXMsIGUyZVxuLy8gYW5kIGZyaWVuZHMpLCB3aGljaCBpcyBuZXZlciBuZWdhdGlvbi1kZXJpdmVkIGFuZCBtdXN0IHN1cnZpdmUuXG5mdW5jdGlvbiBjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChlbnRyeS5zcGxpdCgnLycpLmluY2x1ZGVzKCcqKicpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gZW50cnlcbiAgICAuc3BsaXQoJy8nKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+XG4gICAgICBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsICdbXi9dKicpXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgJ1teL10nKVxuICAgIClcbiAgICAuam9pbignLycpO1xuICBjb25zdCBlbnRyeVBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0oPzovLiopPyRgLCAndScpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyUGF0aHMuc29tZShcbiAgICAod29ya3NwYWNlRGlyUGF0aCkgPT4gZW50cnlQYXR0ZXJuLnRlc3Qod29ya3NwYWNlRGlyUGF0aCkgfHwgZW50cnkuc3RhcnRzV2l0aChgJHt3b3Jrc3BhY2VEaXJQYXRofS9gKVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkU3VmZml4ID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5maW5kKChzdWZmaXgpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHtzdWZmaXh9YCkpO1xuICBpZiAoIW1hdGNoZWRTdWZmaXgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGVudHJ5LnNsaWNlKDAsIC0obWF0Y2hlZFN1ZmZpeC5sZW5ndGggKyAxKSk7XG4gIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09ICcnID8gdW5kZWZpbmVkIDogd29ya3NwYWNlUHJlZml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICBjb25zdCBzZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICBpZiAoIXNldHRpbmdzKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGNsZWFuaW5nIHVwICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3MpO1xuICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzLCBjb25maWcpO1xuICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gIC8vIGFscmVhZHktY2xlYW4gdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKSk7XG59XG5cbi8qKlxuICogYnVuLXR5cGVzIHJlZmVyZW5jZXMgdW5kaWNpLXR5cGVzIHdpdGhvdXQgZGVjbGFyaW5nIGl0IGFzIGEgZGVwZW5kZW5jeSAob3Zlbi1zaC9idW4jMjI4MDUpLCBzb1xuICogQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIChlc3BlY2lhbGx5IHdpdGggdGhlIGdsb2JhbCBzdG9yZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5KSBjYW5ub3QgcmVzb2x2ZVxuICogaXQgZnJvbSBidW4tdHlwZXMnIGxvY2F0aW9uLCB3aGljaCBzaWxlbnRseSBkZWdyYWRlcyBnbG9iYWwgZmV0Y2ggdHlwZXMgc3VjaCBhcyBSZXNwb25zZS4gTWFwIGl0XG4gKiB0byB0aGUgY29weSB0aGF0IGJ1bmZpZy50b21sJ3MgcHVibGljSG9pc3RQYXR0ZXJuIHBsYWNlcyBpbiB0aGUgcm9vdCBub2RlX21vZHVsZXMuXG4gKi9cbmZ1bmN0aW9uIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIE1hcCB1bmRpY2ktdHlwZXMgb25seSB3aGVuIGJ1bi10eXBlcyBhY3R1YWxseSBsb2FkczogYW4gZXhwbGljaXQgYHR5cGVzYCBsaXN0IGxvYWRzIGl0IGlmZiBpdFxuICAvLyBjb250YWlucyBcImJ1blwiIChldmVuIG9uIFJlYWN0IE5hdGl2ZSwgd2hvc2UgcHJvamVjdHMgbWF5IG9wdCBpbiBieSBoYW5kKTsgd2l0aCBgdHlwZXNgXG4gIC8vIG9taXR0ZWQsIFR5cGVTY3JpcHQncyBhdXRvbWF0aWMgQHR5cGVzIGluY2x1c2lvbiBsb2FkcyBpdCBiZWNhdXNlIHdiZnkgaW5zdGFsbHMgQHR5cGVzL2J1blxuICAvLyBmb3IgZXZlcnkgVHlwZVNjcmlwdCBwcm9qZWN0IGV4Y2VwdCBSZWFjdCBOYXRpdmUsIHdoaWNoIHVzZXMgQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSBpbnN0ZWFkLlxuICBjb25zdCB0eXBlcyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXM7XG4gIGlmICh0eXBlcyA/ICF0eXBlcy5pbmNsdWRlcygnYnVuJykgOiBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSByZXR1cm47XG4gIGNvbnN0IGNvcnJlY3RNYXBwaW5nID0gYCR7Z2V0Um9vdERpcihjb25maWcpfS9ub2RlX21vZHVsZXMvdW5kaWNpLXR5cGVzL2luZGV4LmQudHNgO1xuICBjb25zdCBleGlzdGluZ01hcHBpbmcgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnBhdGhzPy5bJ3VuZGljaS10eXBlcyddO1xuICBpZiAoZXhpc3RpbmdNYXBwaW5nKSB7XG4gICAgLy8gUmV3cml0ZSB0aGUgZ2VuZXJhdGVkIG1hcHBpbmcgd2hlbiBhIHdvcmtzcGFjZSBtb3ZlcyB0byBhIGRpZmZlcmVudCByb290IGRlcHRoLiBBbnkgb3RoZXJcbiAgICAvLyB2YWx1ZSBpcyBhIGRlbGliZXJhdGUgcmVwby1sb2NhbCBtYXBwaW5nIChlLmcuIHBhdGNoZWQgdHlwZXMpIGFuZCBtdXN0IGJlIGtlcHQuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmdNYXBwaW5nLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdHlwZW9mIGV4aXN0aW5nTWFwcGluZ1swXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIC8oPzpefFxcLylub2RlX21vZHVsZXNcXC91bmRpY2ktdHlwZXNcXC9pbmRleFxcLmRcXC50cyQvdS50ZXN0KGV4aXN0aW5nTWFwcGluZ1swXSlcbiAgICApIHtcbiAgICAgIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyEucGF0aHMhWyd1bmRpY2ktdHlwZXMnXSA9IFtjb3JyZWN0TWFwcGluZ107XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyA9IHtcbiAgICAuLi5zZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMsXG4gICAgJ3VuZGljaS10eXBlcyc6IFtjb3JyZWN0TWFwcGluZ10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIC8vIE9taXR0aW5nIGluY2x1ZGUgbGV0cyBmcmFtZXdvcmsgdHNjb25maWdzIGtlZXAgVHlwZVNjcmlwdCdzIGRlZmF1bHRcbiAgLy8gXCJhbGwgVFMvVFNYIGZpbGVzXCIgYmVoYXZpb3IsIHdoaWNoIGFscmVhZHkgY292ZXJzIHNjcmlwdHMuXG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZSkgcmV0dXJuO1xuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcygnc2NyaXB0cy8qKi8qJykpIHJldHVybjtcblxuICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goJ3NjcmlwdHMvKiovKicpO1xuICBzZXR0aW5ncy5pbmNsdWRlLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGNvbnN0IG1vZHVsZVJlc29sdXRpb24gPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uKTtcbiAgaWYgKG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoc2V0dGluZ3MuZXh0ZW5kcykge1xuICAgICAgLy8gQW4gZXh0ZW5kZWQgY29uZmlnIG1heSBhbHJlYWR5IHN1cHBseSBhIHZhbGlkIG1vZHVsZS9yZXNvbHZlciBwYWlyLCBzbyBvbmx5XG4gICAgICAvLyByZW1vdmUgdGhlIHJlbW92ZWQtaW4tVFM2IG5vZGUxMCBzcGVsbGluZ3MgaW5zdGVhZCBvZiBmb3JjaW5nIGJ1bmRsZXIgb24gaXQuXG4gICAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQuanMgd3JpdGVzIFwibm9kZVwiIGR1cmluZyBidWlsZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG1pc3NpbmcsIGJ1dFxuICAgICAgLy8gdHNnb2xpbnQgdHJlYXRzIHRoYXQgc3BlbGxpbmcgYXMgdGhlIHJlbW92ZWQgbm9kZTEwIHJlc29sdmVyLlxuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIHRzZ29saW50IGZvbGxvd3MgVHlwZVNjcmlwdCA2IHZhbGlkYXRpb24sIHdoZXJlIGJhc2VVcmwgaXMgcmVtb3ZlZCBhbmRcbiAgLy8gcGF0aCB0YXJnZXRzIG11c3QgYmUgZXhwbGljaXRseSByZWxhdGl2ZS4gTmV4dC5qcyBzdGlsbCBhY2NlcHRzIHRoZSBhbGlhc1xuICAvLyBzaGFwZSBhZnRlciBlYWNoIHRhcmdldCBpcyB3cml0dGVuIHdpdGggYSBsZWFkaW5nIC4vLlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmJhc2VVcmw7XG4gIGlmICghY29tcGlsZXJPcHRpb25zLnBhdGhzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICBjb21waWxlck9wdGlvbnMucGF0aHNbYWxpYXNdID0gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLi4vJykgfHwgcGF0aC5pc0Fic29sdXRlKHRhcmdldCkpIHJldHVybiB0YXJnZXQ7XG4gICAgcmV0dXJuIGAuLyR7dGFyZ2V0fWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNSb290KSByZXR1cm4gJy4nO1xuICAvLyBUaGUgdW5kaWNpLXR5cGVzIHBhdGggbWFwcGluZyBtdXN0IHJlYWNoIHRoZSBtb25vcmVwbyByb290J3Mgbm9kZV9tb2R1bGVzIChidW5maWcudG9tbCdzXG4gIC8vIHB1YmxpY0hvaXN0UGF0dGVybiBob2lzdHMgdGhlIHBhY2thZ2UgdGhlcmUpLCBhbmQgd29ya3NwYWNlIHBhdHRlcm5zIG1heSBiZSBhcmJpdHJhcmlseSBkZWVwXG4gIC8vIChlLmcuIGBleGFtcGxlcy8qKmApLCBzbyBhIGZpeGVkIHR3by1sZXZlbCBwcm9iZSBpcyBub3QgZW5vdWdoLiBQcmVmZXIgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgLy8gbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyB3b3Jrc3BhY2VzICh0aGUgbW9ub3JlcG8gcm9vdCk7IG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG5lYXJlc3RcbiAgLy8gYW5jZXN0b3IgbWFuaWZlc3QuIFN0b3AgYXQgdGhlIGZpcnN0IGdpdCByZXBvc2l0b3J5IGJvdW5kYXJ5IHNvIGFuIHVucmVsYXRlZCBlbmNsb3NpbmdcbiAgLy8gcmVwb3NpdG9yeSdzIG1hbmlmZXN0IGNhbiBuZXZlciBiZSBjaG9zZW4uXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpO1xuICBsZXQgcm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpOyA7IGFuY2VzdG9yRGlyUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvckRpclBhdGgpKSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIHJvb3REaXJQYXRoID8/PSBhbmNlc3RvckRpclBhdGg7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgICAgIC8vIEJ1biBuby1vcCBwYXR0ZXJucyAoZS5nLiBgd29ya3NwYWNlczogW1wiXCJdYCkgZG8gbm90IG1ha2UgYSBtYW5pZmVzdCBhIHdvcmtzcGFjZSByb290LlxuICAgICAgICBpZiAoZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMobWFuaWZlc3Qud29ya3NwYWNlcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJvb3REaXJQYXRoID0gYW5jZXN0b3JEaXJQYXRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQW4gdW5wYXJzYWJsZSBtYW5pZmVzdCBzdGlsbCBtYXJrcyBhIHByb2plY3QgZGlyZWN0b3J5OyBrZWVwIGNsaW1iaW5nIGZvciBhIHdvcmtzcGFjZSByb290LlxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpc1JlcG9Cb3VuZGFyeSA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJy5naXQnKSk7XG4gICAgY29uc3QgaXNGaWxlc3lzdGVtUm9vdCA9IGFuY2VzdG9yRGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCk7XG4gICAgaWYgKGlzUmVwb0JvdW5kYXJ5IHx8IGlzRmlsZXN5c3RlbVJvb3QpIGJyZWFrO1xuICB9XG4gIGlmICghcm9vdERpclBhdGgpIHJldHVybiAnLic7XG4gIHJldHVybiBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHJvb3REaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSB8fCAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gbG93ZXJDYXNlU2V0dGluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8Tm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCc+IHtcbiAgY29uc3QgZW1pdE9wdGlvbnMgPSB7fSBhcyBQaWNrPFxuICAgIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAgICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCdcbiAgPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZWNsYXJhdGlvbicsICdkZWNsYXJhdGlvbk1hcCcsICdzb3VyY2VNYXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcGlsZXJPcHRpb25zPy5ba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW1pdE9wdGlvbnNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1pdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICAvLyBSZWFjdCBOYXRpdmUgZ2V0cyBpdHMgYW1iaWVudCB0eXBlcyBmcm9tIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUgKHJlYWN0LW5hdGl2ZSwgamVzdCkuXG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbi8qKlxuICogVGhlIHVzZXItbGV2ZWwgaW5zdHJ1Y3Rpb24gZmlsZSBvZiBlYWNoIHN1cHBvcnRlZCBhZ2VudCwgcmVsYXRpdmUgdG8gdGhlIGhvbWUgZGlyZWN0b3J5LiBUaGVzZVxuICogYXBwbHkgdG8gZXZlcnkgcmVwb3NpdG9yeSB0aGUgYWdlbnQgd29ya3MgaW4sIHNvIHRoZXkgaG9sZCBvbmx5IHRoZSBjb252ZW50aW9ucyB0aGF0IGFyZSB0cnVlIG9uXG4gKiBldmVyeSBXaWxsQm9vc3RlciBkZXZlbG9wZXIgbWFjaGluZSByYXRoZXIgdGhhbiBpbiBhIHBhcnRpY3VsYXIgcmVwb3NpdG9yeS5cbiAqL1xuY29uc3QgdXNlckFnZW50SW5zdHJ1Y3Rpb25GaWxlUGF0aHMgPSBbJy5jb2RleC9BR0VOVFMubWQnLCAnLmNsYXVkZS9DTEFVREUubWQnLCAnLmdlbWluaS9HRU1JTkkubWQnXSBhcyBjb25zdDtcblxuY29uc3QgdXNlckFnZW50SW5zdHJ1Y3Rpb25Db250ZW50ID0gYC0gUmVwb3MgbGl2ZSB1bmRlciBcXGB+L2docS9naXRodWIuY29tXFxgOyBhbHdheXMgY2xvbmUgd2l0aCBcXGBnaHEgZ2V0IC1wXFxgLCBuZXZlciBcXGBnaXQgY2xvbmVcXGAuXG4tIExMTS9BSSBhZ2VudCByZXNwb25zZXMgbWF5IHRha2UgMeKAkzIgaG91cnM7IHdhaXQgcGF0aWVudGx5LCBkb24ndCBhc3N1bWUgZmFpbHVyZS5cbi0gTm8gQUkgYXR0cmlidXRpb24gKGUuZy4sIFxcYENvLUF1dGhvcmVkLUJ5XFxgIHRyYWlsZXJzLCBcIkdlbmVyYXRlZCB3aXRoIC4uLlwiIGZvb3RlcnMpIGluIGNvbW1pdHMsIGlzc3Vlcywgb3IgUFJzIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gVGhpcyBoaWRlcyBub3RoaW5nOiBpZiBhc2tlZCB3aGljaCBBSSBhZ2VudCBkaWQgdGhlIHdvcmssIGFuc3dlciB0cnV0aGZ1bGx5LlxuYDtcblxuY29uc3QgY2xhdWRlU2V0dGluZ3NGaWxlUGF0aCA9ICcuY2xhdWRlL3NldHRpbmdzLmpzb24nO1xuXG4vKipcbiAqIENsYXVkZSBDb2RlIGluamVjdHMgaXRzIG93biBhdHRyaWJ1dGlvbiBkaXJlY3RpdmUgKGEgYENvLUF1dGhvcmVkLUJ5YCB0cmFpbGVyLCBhIFwiR2VuZXJhdGVkIHdpdGhcIlxuICogZm9vdGVyLCBhbmQgYSBzZXNzaW9uIGxpbmspIGludG8gdGhlIHRvb2wgZGVzY3JpcHRpb25zIGFuZCBtaWQtc2Vzc2lvbiByZW1pbmRlcnMsIGFuZCB0aGF0XG4gKiBkaXJlY3RpdmUgZGVjbGFyZXMgaXRzZWxmIHRvIHJlcGxhY2UgZWFybGllciBndWlkYW5jZSwgc28gdGhlIGluc3RydWN0aW9uIGZpbGUgYWxvbmUgY2Fubm90XG4gKiBzdXBwcmVzcyBpdC4gT25seSB0aGlzIHNldHRpbmcgcmVtb3ZlcyB0aGUgZGlyZWN0aXZlIGF0IGl0cyBzb3VyY2UuXG4gKi9cbmNvbnN0IGNsYXVkZVNldHRpbmdzID0ge1xuICBhdHRyaWJ1dGlvbjoge1xuICAgIGNvbW1pdDogJycsXG4gICAgcHI6ICcnLFxuICAgIHNlc3Npb25Vcmw6IGZhbHNlLFxuICB9LFxufTtcblxuLyoqXG4gKiBPdmVyd3JpdGVzIHRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGVzIG9mIGV2ZXJ5IHN1cHBvcnRlZCBhZ2VudCB3aXRoIHRoZSBmaXhlZCBjb250ZW50IGFuZFxuICogbWVyZ2VzIHRoZSBmaXhlZCBzZXR0aW5ncyBpbnRvIENsYXVkZSBDb2RlJ3MgdXNlciBzZXR0aW5ncy4gUmV0dXJucyBmYWxzZSB3aGVuIGFueSBmaWxlIHdhc1xuICogc2tpcHBlZCAoZS5nLiBhIHN5bWxpbmtlZCBvciB1bnBhcnNhYmxlIGZpbGUpLCBzbyB0aGUgY29tbWFuZCBjYW4gZmFpbCBsb3VkbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxldCBoYXNXcml0dGVuQWxsID0gdHJ1ZTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgdXNlckFnZW50SW5zdHJ1Y3Rpb25GaWxlUGF0aHMpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpLCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc1dyaXR0ZW47XG4gIH1cbiAgLy8gQXdhaXRlZCBzZXBhcmF0ZWx5OiBgJiY9YCB3b3VsZCBza2lwIHRoZSBtZXJnZSBvbmNlIGFuIGluc3RydWN0aW9uIGZpbGUgd2FzIHNraXBwZWQuXG4gIGNvbnN0IGhhc01lcmdlZFNldHRpbmdzID0gYXdhaXQgbWVyZ2VDbGF1ZGVTZXR0aW5ncygpO1xuICByZXR1cm4gaGFzV3JpdHRlbkFsbCAmJiBoYXNNZXJnZWRTZXR0aW5ncztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWVyZ2VDbGF1ZGVTZXR0aW5ncygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCBjbGF1ZGVTZXR0aW5nc0ZpbGVQYXRoKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBsZXQgZXhpc3RpbmdTZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgaWYgKGV4aXN0aW5nQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGV4aXN0aW5nU2V0dGluZ3MgPSB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkucGFyc2UoSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBhIEpTT04gb2JqZWN0LmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBjb25zdCBzZXR0aW5ncyA9IG1lcmdlKGV4aXN0aW5nU2V0dGluZ3MsIGNsYXVkZVNldHRpbmdzKTtcbiAgcmV0dXJuIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBpZiAoZXhpc3RpbmdDb250ZW50ID09PSB1bmRlZmluZWQgfHwganNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSByZXR1cm47XG4gICAgLy8gLnZzY29kZS9zZXR0aW5ncy5qc29uIGlzIEpTT05DIGJ5IGRlZmluaXRpb247IEpTT04ucGFyc2Ugd291bGQgbWFrZSB3YmZ5IHNpbGVudGx5IHNraXBcbiAgICAvLyBjb21tZW50ZWQgZmlsZXMuXG4gICAgY29uc3QgcGFyc2VkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPG9iamVjdD4oZXhpc3RpbmdDb250ZW50KTtcbiAgICBpZiAoIXBhcnNlZFNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKHBhcnNlZFNldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgIGxldCBzZXR0aW5ncyA9IHBhcnNlZFNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgIH1cbiAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktY2xlYW4gc2V0dGluZ3MuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpID09PSBvcmlnaW5hbFNldHRpbmdzSnNvbikgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5pbnRlcmZhY2UgRm5veFRvbWxTdWJ0cmVlIHtcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIHsgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCB1bmRlZmluZWQ+O1xufVxuXG4vLyBUaGUgZm91ciBzdGFuZGFyZCBXQl9FTlYgbW9kZXM7IHN0YWdpbmcgaXMgb3B0aW9uYWwgYW5kIG9ubHkgY29tcGxldGVkIHdoZW4gdGhlIHJlcG9zaXRvcnlcbi8vIGFscmVhZHkgZGVjbGFyZXMgdGhlIHN0YWdpbmcgcHJvZmlsZS5cbmNvbnN0IHdiRW52TW9kZXMgPSBbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10gYXMgY29uc3Q7XG50eXBlIFdiRW52TW9kZSA9ICh0eXBlb2Ygd2JFbnZNb2RlcylbbnVtYmVyXTtcblxuLyoqXG4gKiBFbnN1cmVzIGEgZm5veCByZXBvc2l0b3J5IGRlZmluZXMgV0JfRU5WIGZvciBldmVyeSBzdGFuZGFyZCBtb2RlIChhbmQgTkVYVF9QVUJMSUNfV0JfRU5WIHdoZW5cbiAqIGFueSB3b3Jrc3BhY2UgZGVwZW5kcyBvbiBOZXh0LmpzIG9yIHZpbmV4dCkgaW4gZm5veC50b21sIHByb2ZpbGVzLiBFeGlzdGluZyBkZWZpbml0aW9ucyBhcmVcbiAqIGFsd2F5cyBsZWZ0IHVudG91Y2hlZC4gTm9uLWZub3ggcmVwb3NpdG9yaWVzIGFyZSBza2lwcGVkOiAuZW52IGZpbGVzIGFyZSBubyBsb25nZXIgbWFuYWdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVdiRW52RGVmaW5pdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZW5zdXJlV2JFbnZEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBuZWVkc05leHRQdWJsaWMgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoY29uZmlnKSk7XG4gICAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuICAgIC8vIGxzdGF0LCBub3QgZXhpc3RzU3luYzogZXhpc3RzU3luYyBpcyBmYWxzZSBmb3IgYSBEQU5HTElORyBmbm94LnRvbWwgc3ltbGluazsgYW55IGZub3gudG9tbFxuICAgIC8vIGRpcmVjdG9yeSBlbnRyeSBtYXJrcyBhIGZub3ggcmVwb3NpdG9yeSwgYW5kIGEgcmVmdXNlZC9kYW5nbGluZyBvbmUgYWJvcnRzIGluc3RlYWQgb2ZcbiAgICAvLyBiZWluZyB0cmVhdGVkIGFzIGEgbm9uLWZub3ggcmVwb3NpdG9yeSB3aGlsZSB0aGUgZm5veCBzeW5jaHJvbml6YXRpb24gaXMgZmFpbGluZy5cbiAgICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmbm94VG9tbFBhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhmbm94VG9tbFBhdGgpO1xuICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGluc2VydFdiRW52SW50b0Zub3hUb21sKGNvbnRlbnQsIG5lZWRzTmV4dFB1YmxpYyk7XG4gICAgaWYgKHVwZGF0ZWRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgdXBkYXRlZENvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHdiJ3MgcmVxdWlyZXNOZXh0UHVibGljV2JFbnYgY29udHJhY3QgKHBhY2thZ2VzL3diL3NyYy9wcm9qZWN0LnRzKTogdGhlIGZyYW1ld29yayBtYXlcbiAqIGJlIGRlY2xhcmVkIGluIEFOWSBvZiB0aGUgZm91ciBkZXBlbmRlbmN5IHNlY3Rpb25zIChlLmcuIGBuZXh0YCBhcyBhIGRldkRlcGVuZGVuY3kgaW4gYSBzaGFyZWRcbiAqIGNvbXBvbmVudCBsaWJyYXJ5KSwgd2hpbGUgd2JmeSdzIGBkZXBlbmRpbmcubmV4dGAgbG9va3Mgb25seSBhdCByZWd1bGFyIGRlcGVuZGVuY2llcy5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddLnNvbWUoKHNlY3Rpb24pID0+IHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBjb25maWcucGFja2FnZUpzb24/LltzZWN0aW9uIGFzICdkZXBlbmRlbmNpZXMnXTtcbiAgICByZXR1cm4gISFkZXBlbmRlbmNpZXM/LlsnbmV4dCddIHx8ICEhZGVwZW5kZW5jaWVzPy5bJ3ZpbmV4dCddO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIG1pc3NpbmcgV0JfRU5WIChhbmQgb3B0aW9uYWxseSBORVhUX1BVQkxJQ19XQl9FTlYpIGVudHJpZXMgaW50byBhIGZub3gudG9tbDogdGhlIGJhc2VcbiAqIGBbc2VjcmV0c11gIHRhYmxlIGNhcnJpZXMgdGhlIGRldmVsb3BtZW50IGRlZmF1bHRzIGFuZCBgW3Byb2ZpbGVzLjxtb2RlPi5zZWNyZXRzXWAgb3ZlcmxheXNcbiAqIGVhY2ggb3RoZXIgbW9kZSwgbWF0Y2hpbmcgdGhlIG9yZy1zdGFuZGFyZCBsYXlvdXQuIEZvcm1hdHRpbmcgYW5kIGNvbW1lbnRzIGFyZSBwcmVzZXJ2ZWQ7IG9ubHlcbiAqIG1pc3NpbmcgbGluZXMgYXJlIGluc2VydGVkIG9yIG1pc3Npbmcgc2VjdGlvbnMgYXBwZW5kZWQuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIGNvbnRlbnRcbiAqIGNhbm5vdCBiZSBzYWZlbHkgZWRpdGVkICh1bnBhcnNhYmxlIGJlZm9yZSBvciBhZnRlciB0aGUgZWRpdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50OiBzdHJpbmcsIG5lZWRzTmV4dFB1YmxpYzogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBzZXR0aW5nczogRm5veFRvbWxTdWJ0cmVlO1xuICB0cnkge1xuICAgIHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgRm5veFRvbWxTdWJ0cmVlO1xuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlIGl0IGlzIG5vdCBwYXJzYWJsZSBhcyBUT01MLicpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBrZXlOYW1lcyA9IG5lZWRzTmV4dFB1YmxpYyA/IFsnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddIDogWydXQl9FTlYnXTtcbiAgbGV0IHVwZGF0ZWRDb250ZW50ID0gY29udGVudDtcbiAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAvLyBUaGUgc3RhZ2luZyBtb2RlIGlzIG9wdGlvbmFsOiBjb21wbGV0ZSBpdCBvbmx5IHdoZW4gdGhlIHJlcG9zaXRvcnkgYWxyZWFkeSBkZWNsYXJlcyB0aGUgcHJvZmlsZS5cbiAgICBpZiAobW9kZSA9PT0gJ3N0YWdpbmcnICYmICFzZXR0aW5ncy5wcm9maWxlcz8uc3RhZ2luZykgY29udGludWU7XG4gICAgY29uc3QgZGVmaW5lZEtleXMgPSBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gc2V0dGluZ3Muc2VjcmV0cyA6IHNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgZm9yIChjb25zdCBrZXlOYW1lIG9mIGtleU5hbWVzKSB7XG4gICAgICBjb25zdCBkZWZpbmVkID0gZGVmaW5lZEtleXM/LltrZXlOYW1lXTtcbiAgICAgIGNvbnN0IGRlZmluZWRWYWx1ZSA9XG4gICAgICAgIHR5cGVvZiBkZWZpbmVkID09PSAnc3RyaW5nJyA/IGRlZmluZWQgOiAoZGVmaW5lZCBhcyB7IGRlZmF1bHQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5kZWZhdWx0O1xuICAgICAgd2Fybk9uVW5leHBlY3RlZFdiRW52VmFsdWUoa2V5TmFtZSwgZGVmaW5lZFZhbHVlLCBtb2RlKTtcbiAgICB9XG4gICAgY29uc3QgbWlzc2luZ0xpbmVzID0ga2V5TmFtZXNcbiAgICAgIC5maWx0ZXIoKGtleU5hbWUpID0+IGRlZmluZWRLZXlzPy5ba2V5TmFtZV0gPT09IHVuZGVmaW5lZClcbiAgICAgIC5tYXAoKGtleU5hbWUpID0+IGAke2tleU5hbWV9ID0geyBkZWZhdWx0ID0gXCIke21vZGV9XCIgfWApO1xuICAgIGlmIChtaXNzaW5nTGluZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICB1cGRhdGVkQ29udGVudCA9IGluc2VydEludG9Gbm94U2VjdGlvbihcbiAgICAgIHVwZGF0ZWRDb250ZW50LFxuICAgICAgbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/ICdzZWNyZXRzJyA6IGBwcm9maWxlcy4ke21vZGV9LnNlY3JldHNgLFxuICAgICAgbWlzc2luZ0xpbmVzXG4gICAgKTtcbiAgfVxuICBpZiAodXBkYXRlZENvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybiBjb250ZW50O1xuXG4gIC8vIFJlLXBhcnNlIGJlZm9yZSByZXR1cm5pbmc6IGFuIHVudXN1YWwgbGF5b3V0IChlLmcuIGRvdHRlZCBrZXlzIHdpdGhvdXQgYSB0YWJsZSBoZWFkZXIpIGNvdWxkXG4gIC8vIG1ha2UgdGhlIHRleHR1YWwgZWRpdCBwcm9kdWNlIGEgZHVwbGljYXRlIHRhYmxlOyBmYWlsIHNhZmVseSBpbnN0ZWFkIG9mIGNvcnJ1cHRpbmcgdGhlIGZpbGUuXG4gIHRyeSB7XG4gICAgY29uc3QgdXBkYXRlZFNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UodXBkYXRlZENvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgICBmb3IgKGNvbnN0IG1vZGUgb2Ygd2JFbnZNb2Rlcykge1xuICAgICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZGVmaW5lZEtleXMgPSBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gdXBkYXRlZFNldHRpbmdzLnNlY3JldHMgOiB1cGRhdGVkU2V0dGluZ3MucHJvZmlsZXM/Llttb2RlXT8uc2VjcmV0cztcbiAgICAgIGlmIChrZXlOYW1lcy5zb21lKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdGhlIGluc2VydGVkICR7bW9kZX0gZW50cmllcyBkaWQgbm90IHRha2UgZWZmZWN0YCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBpbnNlcnRpbmcgV0JfRU5WIGludG8gZm5veC50b21sIGJlY2F1c2UgJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9LmApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZWRDb250ZW50O1xufVxuXG4vKipcbiAqIFdhcm5zIHdoZW4gYW4gZXhpc3RpbmcgV0JfRU5WLWZhbWlseSBkZWZpbml0aW9uIG5hbWVzIGEgZGlmZmVyZW50IG1vZGUgdGhhbiB0aGUgb25lIGl0IGlzXG4gKiBkZWZpbmVkIGZvciAoYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gIG9yIGBwcm9kdWN0aW9uMWAsIG9yIGEgY29weS1wYXN0ZWQgd3JvbmcgbW9kZSk6IHdiXG4gKiByZWplY3RzIG5vbi1zdGFuZGFyZCB2YWx1ZXMgYXQgcnVudGltZSwgc28gc3VyZmFjaW5nIHRoZSBtaXNtYXRjaCBkdXJpbmcgd2JmeSBpcyB0aGUgZWFybGllc3RcbiAqIHBvc3NpYmxlIHNpZ25hbC4gVGhlIHBhc3NlZCB2YWx1ZSBpcyBhbHdheXMgcGxhaW50ZXh0IChhIGZub3ggYGRlZmF1bHRgIGZpZWxkKSDigJQgZW5jcnlwdGVkXG4gKiBmbm94IGVudHJpZXMgYXJlIGB7IHByb3ZpZGVyLCB2YWx1ZSB9YCBvYmplY3RzIHdob3NlIGBkZWZhdWx0YCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24sIG1vZGU6IFdiRW52TW9kZSk6IHZvaWQge1xuICAvLyBBbiBFTVBUWSB2YWx1ZSBjb3VudHMgYXMgdW5zZXQgKHdiIHN1cHBsaWVzIHRoZSBmYWxsYmFjayBtb2RlKSwgbm90IGFzIGEgbWlzbWF0Y2hpbmcgbW9kZS5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBtb2RlKSByZXR1cm47XG4gIC8vIEEgZHluYW1pYyB2YWx1ZSAoZS5nLiBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7V0JfRU5WfWApIG1heSBsZWdpdGltYXRlbHkgcmVzb2x2ZSB0byB0aGUgbW9kZVxuICAvLyB0aHJvdWdoIGV4cGFuc2lvbiwgd2hpY2ggdGhpcyBzdGF0aWMgY2hlY2sgY2Fubm90IGV2YWx1YXRlIOKAlCBza2lwIGluc3RlYWQgb2YgbWlzZmlyaW5nLlxuICAvLyBmbm94IGV4cGFuZHMgb25seSBgJHsuLi59YCAoYSBiYXJlIGAkVU5TRVRgIHN0YXlzIGxpdGVyYWwpLlxuICBpZiAodmFsdWUuaW5jbHVkZXMoJyR7JykpIHJldHVybjtcbiAgaWYgKGtleU5hbWUgPT09ICdORVhUX1BVQkxJQ19XQl9FTlYnKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiBvdmVycmlkZXMgaXQgd2l0aCBXQl9FTlYsIGJ1dCBhIGRpcmVjdCBmcmFtZXdvcmsgYnVpbGQgd291bGQgaW5saW5lIHRoaXMgdmFsdWUuYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBgJHtrZXlOYW1lfSBpbiBmbm94LnRvbWwgaXMgXCIke3ZhbHVlfVwiIGJ1dCBzaG91bGQgYmUgXCIke21vZGV9XCIgZm9yIHRoZSAke21vZGV9IG1vZGU7IHdiIHJlamVjdHMgdmFsdWVzIG91dHNpZGUgZGV2ZWxvcG1lbnQvdGVzdC9zdGFnaW5nL3Byb2R1Y3Rpb24uYFxuICApO1xufVxuXG4vKipcbiAqIEluc2VydHMgbGluZXMgYXQgdGhlIHRvcCBvZiBhIFRPTUwgc2VjdGlvbiwgcmlnaHQgYWZ0ZXIgaXRzIGBbaGVhZGVyXWAgbGluZSBzbyBwcm9maWxlLXNwZWNpZmljXG4gKiBlbnRyaWVzIHN0YXkgZ3JvdXBlZCB3aXRoIHRoZWlyIGhlYWRlcjsgdGhlIHNlY3Rpb24gaXMgYXBwZW5kZWQgYXQgdGhlIGVuZCB3aGVuIGl0IGlzIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gaW5zZXJ0SW50b0Zub3hTZWN0aW9uKGNvbnRlbnQ6IHN0cmluZywgc2VjdGlvbk5hbWU6IHN0cmluZywgaW5zZXJ0ZWRMaW5lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAvLyB3YmZ5IHdyaXRlcyB0aGUgaGVhZGVyIHdpdGhvdXQgd2hpdGVzcGFjZSBhcm91bmQgdGhlIGRvdHRlZC1rZXkgY29tcG9uZW50cy5cbiAgY29uc3QgaGVhZGVyUGF0dGVybiA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeXFxzKlxcWyR7c2VjdGlvbk5hbWUucmVwbGFjZUFsbCgnLicsIFN0cmluZy5yYXdgXFwuYCl9XFxdXFxzKig/OiMuKik/JGAsICd1Jyk7XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGhlYWRlckluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiBoZWFkZXJQYXR0ZXJuLnRlc3QobGluZSkpO1xuICBpZiAoaGVhZGVySW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIGAke2NvbnRlbnQudHJpbUVuZCgpfVxcblxcblske3NlY3Rpb25OYW1lfV1cXG4ke2luc2VydGVkTGluZXMuam9pbignXFxuJyl9XFxuYDtcbiAgfVxuICByZXR1cm4gWy4uLmxpbmVzLnNsaWNlKDAsIGhlYWRlckluZGV4ICsgMSksIC4uLmluc2VydGVkTGluZXMsIC4uLmxpbmVzLnNsaWNlKGhlYWRlckluZGV4ICsgMSldLmpvaW4oJ1xcbicpO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vKipcbiAqIFJlcG9zaXRvcmllcyBvdXRzaWRlIFdpbGxCb29zdGVyIC8gV2lsbEJvb3N0ZXJMYWIgY2Fubm90IGNhbGwgdGhlIG9yZ2FuaXphdGlvbidzIHJldXNhYmxlXG4gKiB3b3JrZmxvd3M6IHRob3NlIHdvcmtmbG93cyBkZXBlbmQgb24gb3JnYW5pemF0aW9uIHNlY3JldHMgKFZFUkRBQ0NJT19UT0tFTiwgRGlzY29yZCB3ZWJob29rcylcbiAqIGFuZCBzZWxmLWhvc3RlZCBydW5uZXJzIHRoYXQgb3RoZXIgb3duZXJzIGRvIG5vdCBoYXZlLiBUaGlzIGdlbmVyYXRvciBpbnN0ZWFkIGVtaXRzXG4gKiBzZWxmLWNvbnRhaW5lZCB3b3JrZmxvd3MgYnVpbHQgb25seSBmcm9tIHdoYXQgYW55IHJlcG9zaXRvcnkgb3duZXIgY2FuIHByb3ZpZGU6IHRoZSByZXBvc2l0b3J5XG4gKiBjb250ZW50cyAobWlzZS50b21sLCBwYWNrYWdlLmpzb24gc2NyaXB0cykgYW5kIHRoZSBzaW5nbGUgYEZOT1hfQUdFX0tFWWAgcmVwb3NpdG9yeSBzZWNyZXQgd2hlblxuICogdGhlIHJlcG9zaXRvcnkgdXNlcyBmbm94LiBHZW5lcmF0aW9uIGlzIGtleWVkIG9uIHJlcG9zaXRvcnkgc3RhdGUsIG5ldmVyIG9uIHRoZSBvd25lcidzXG4gKiBpZGVudGl0eSwgc28gaXQgd29ya3MgZm9yIGFyYml0cmFyeSBwZXJzb25hbCByZXBvc2l0b3JpZXMuXG4gKi9cblxuLyoqIEZpcnN0IGxpbmUgb2YgZXZlcnkgZ2VuZXJhdGVkIGZpbGU7IGZpbGVzIHdpdGhvdXQgaXQgYXJlIGhhbmQtd3JpdHRlbiBhbmQgbmV2ZXIgdG91Y2hlZC4gKi9cbmV4cG9ydCBjb25zdCBzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXIgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeS4nO1xuXG4vLyBTYW1lIHBpbnMgYXMgdGhlIHJldXNhYmxlIHdvcmtmbG93cyAvIHRoZWlyIGNvbnN1bWVyczsgUmVub3ZhdGUgdXBkYXRlcyB0aGVtIGluIHRoZSB0YXJnZXQgcmVwb3NpdG9yeS5cbmNvbnN0IGNoZWNrb3V0QWN0aW9uID0gJ2FjdGlvbnMvY2hlY2tvdXRAdjcuMC4xJztcbmNvbnN0IG1pc2VBY3Rpb24gPSAnamR4L21pc2UtYWN0aW9uQHY0LjIuMyc7XG5jb25zdCBjYWNoZUFjdGlvbiA9ICdhY3Rpb25zL2NhY2hlQHY2LjEuMCc7XG5jb25zdCB1cGxvYWRBcnRpZmFjdEFjdGlvbiA9ICdhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2Ny4wLjEnO1xuLy8gdjYuMS4xOyB0aGUgc2FtZSBwaW4gYXMgdGhlIHJldXNhYmxlIHNlbWFudGljLXByIHdvcmtmbG93LlxuY29uc3Qgc2VtYW50aWNQdWxsUmVxdWVzdEFjdGlvbiA9ICdhbWFubm4vYWN0aW9uLXNlbWFudGljLXB1bGwtcmVxdWVzdEA0NWI5ZWQ3Y2YyNDA4N2EyZjc3ODViZjU1YmU5NzM5NGJhODdlMWMyJztcbi8vIHYzLjAuMzsgZGVwbG95cyBhcmUgbmV0d29yay1oZWF2eSBhbmQgYmVuZWZpdCBmcm9tIHJldHJpZXMgd2l0aCBhIGxvbmcgdGltZW91dC5cbmNvbnN0IHJldHJ5QWN0aW9uID0gJ25pY2stZmllbGRzL3JldHJ5QGRkNTZmMWNhOGNhOTkxZTIzODVjMThhYjZkZDM2ZWE3ZjlmZGI1NWYnO1xuXG4vKipcbiAqIEpvYi1sZXZlbCBlbnYgdGhhdCB0dXJucyB0aGUgVGFrdW1pIEd1YXJkIGluc3RhbGwgcGF0aCBvbiwgbWlycm9yaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MuXG4gKlxuICogYHNlY3JldHNgIGlzIHVuYXZhaWxhYmxlIGluIGEgc3RlcC1sZXZlbCBgaWY6YCwgc28gdGhlIHByZXNlbmNlIG9mIHRoZSB0b2tlbiBpcyBleHBvc2VkIGFzIGFcbiAqIG5vbi1zZWNyZXQgc2lnbmFsOyBhbiB1bnNldCBzZWNyZXQgZXhwYW5kcyB0byBgZmFsc2VgIGFuZCBsZWF2ZXMgZXZlcnkgR3VhcmQgc3RlcCBza2lwcGVkLCB3aGljaFxuICogaXMgd2hhdCBrZWVwcyB0aGUgZ2VuZXJhdGVkIHdvcmtmbG93cyBydW5uYWJsZSBpbiBhIHJlcG9zaXRvcnkgdGhhdCBuZXZlciByZWdpc3RlcnMgdGhlIHNlY3JldC5cbiAqIFRBS1VNSV9HVUFSRF9UT0tFTiBpdHNlbGYgaXMgZGVmaW5lZC1idXQtRU1QVFkgam9iLXdpZGUgc28gdGhlIGAke1RBS1VNSV9HVUFSRF9UT0tFTn1gIHJlZmVyZW5jZVxuICogaW4gdGhlIGdlbmVyYXRlZCAubnBtcmMgc3RpbGwgZXhwYW5kcyAodG8gJycpIGluIHRoZSBzdGVwcyB0aGF0IGRlbGliZXJhdGVseSBydW4gd2l0aG91dCB0aGVcbiAqIHRva2VuOyBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQgdmFyaWFibGUgaXMgd2hhdCBicmVha3MgYW4gaW5zdGFsbCwgYW4gZW1wdHkgb25lIGlzIGZpbmUuXG4gKi9cbmNvbnN0IGd1YXJkSm9iRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBIQVNfVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7ICEhc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nLFxuICBUQUtVTUlfR1VBUkRfVE9LRU46ICcnLFxufTtcblxuaW50ZXJmYWNlIFN0ZXAge1xuICBuYW1lPzogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgJ3dvcmtpbmctZGlyZWN0b3J5Jz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lOiBzdHJpbmc7XG4gIG9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uY3VycmVuY3k/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHsgJ3J1bnMtb24nOiBzdHJpbmc7IHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc3RlcHM6IFN0ZXBbXSB9XG4gID47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbcm9vdENvbmZpZ11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyB3b3JrZmxvd3MgYmVjYXVzZSAke3dvcmtmbG93c1BhdGh9IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgdXNlc0Zub3ggPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSk7XG4gICAgY29uc3Qgd29ya2Zsb3dCeUZpbGVOYW1lOiBSZWNvcmQ8c3RyaW5nLCBXb3JrZmxvdz4gPSB7XG4gICAgICAndGVzdC55bWwnOiBidWlsZFRlc3RXb3JrZmxvdyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncywgdXNlc0Zub3gpLFxuICAgICAgJ3NlbWFudGljLXByLnltbCc6IGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCksXG4gICAgfTtcbiAgICAvLyBEZXBsb3kgd29ya2Zsb3dzIGFyZSBnZW5lcmF0ZWQgcGVyIGRlcGxveSBzY3JpcHQgdGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMsIHNvIGEgcmVwb3NpdG9yeVxuICAgIC8vIHdpdGhvdXQgYSBzdGFnaW5nIGVudmlyb25tZW50IHNpbXBseSBnZXRzIG5vIHN0YWdpbmcgd29ya2Zsb3cuIE9ubHkgc2NyaXB0cyB0aGF0IGludm9rZVxuICAgIC8vIGB3YiBkZXBsb3lgIHF1YWxpZnk6IGEgYmVzcG9rZSBkZXBsb3kgc2NyaXB0IG1heSBub3QgYmUgc2FmZSB0byB0cmlnZ2VyIGF1dG9tYXRpY2FsbHlcbiAgICAvLyAoZGVwbG95LXN0YWdpbmcgcnVucyBvbiBldmVyeSBwdXNoIHRvIHRoZSBkZWZhdWx0IGJyYW5jaCkuXG4gICAgY29uc3Qgc2NyaXB0cyA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gICAgY29uc3QgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93ID0gaXNXYkRlcGxveVNjcmlwdChzY3JpcHRzWydkZXBsb3knXSk7XG4gICAgaWYgKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdykge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydkZXBsb3ktcHJvZHVjdGlvbi55bWwnXSA9IGJ1aWxkRGVwbG95V29ya2Zsb3coJ3Byb2R1Y3Rpb24nLCAnZGVwbG95JywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBpZiAoaXNXYkRlcGxveVNjcmlwdChzY3JpcHRzWydkZXBsb3k6c3RhZ2luZyddKSkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydkZXBsb3ktc3RhZ2luZy55bWwnXSA9IGJ1aWxkRGVwbG95V29ya2Zsb3coJ3N0YWdpbmcnLCAnZGVwbG95OnN0YWdpbmcnLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UgJiYgcm9vdENvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsncmVsZWFzZS55bWwnXSA9IGJ1aWxkUmVsZWFzZVdvcmtmbG93KHJvb3RDb25maWcsIGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgd29ya2Zsb3ddIG9mIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93QnlGaWxlTmFtZSkpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCB3b3JrZmxvdykpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KGZpbGVQYXRoOiBzdHJpbmcsIHdvcmtmbG93OiBXb3JrZmxvdyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAvLyBVbmxpa2UgV2lsbEJvb3N0ZXItb3JnYW5pemF0aW9uIHJlcG9zaXRvcmllcywgd2JmeSBkb2VzIG5vdCBvd24gYXJiaXRyYXJ5IHJlcG9zaXRvcmllcycgQ0k6XG4gIC8vIG9ubHkgZmlsZXMgaXQgZ2VuZXJhdGVkIChpZGVudGlmaWVkIGJ5IHRoZSBtYXJrZXIpIGFyZSByZWdlbmVyYXRlZCwgYW5kIGhhbmQtd3JpdHRlblxuICAvLyB3b3JrZmxvd3MgYXJlIG5ldmVyIHRvdWNoZWQuIE93bmVycyBvcHQgb3V0IHBlcm1hbmVudGx5IGJ5IHJlbW92aW5nIHRoZSBtYXJrZXIgbGluZS5cbiAgLy8gQW4gZW1wdHkgb3Igd2hpdGVzcGFjZS1vbmx5IGZpbGUgY2FycmllcyBubyBoYW5kLXdyaXR0ZW4gY29udGVudCwgc28gaXQgaXMgdHJlYXRlZCBhcyBhYnNlbnQuXG4gIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgb2xkQ29udGVudC50cmltKCkgIT09ICcnICYmICFvbGRDb250ZW50LnN0YXJ0c1dpdGgoc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlciA9IGAke3NlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcn0gUmVtb3ZlIHRoaXMgbGluZSB0byBzdG9wIHdiZnkgZnJvbSBvdmVyd3JpdGluZyB0aGlzIGZpbGUuXFxuYDtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAod29ya2Zsb3csIHsgbGluZVdpZHRoOiAtMSB9KTtcbiAgYXdhaXQgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKGZpbGVQYXRoLCBoZWFkZXIgKyB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIHdvcmtpbmdEaXIoZGlyUGF0aDogc3RyaW5nKTogUGljazxTdGVwLCAnd29ya2luZy1kaXJlY3RvcnknPiB7XG4gIHJldHVybiBkaXJQYXRoID8geyAnd29ya2luZy1kaXJlY3RvcnknOiBkaXJQYXRoIH0gOiB7fTtcbn1cblxuZnVuY3Rpb24gaXNXYkRlcGxveVNjcmlwdChzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIC9cXGJ3YiBkZXBsb3lcXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGVzdFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSwgdXNlc0Zub3g6IGJvb2xlYW4pOiBXb3JrZmxvdyB7XG4gIC8vIFBsYXl3cmlnaHQgbWF5IGJlIGRlY2xhcmVkIG9ubHkgaW4gd29ya3NwYWNlIHBhY2thZ2VzOyBgd2IgdGVzdC1vbi1jaWAgcnVucyBldmVyeSBkZWNsYXJpbmdcbiAgLy8gcGFja2FnZSdzIGUyZSB0ZXN0cywgc28gdGhlIHdvcmtmbG93IG11c3QgaW5zdGFsbCBicm93c2VycyBmb3IgZWFjaCBvZiB0aGVtICh0aGVpciB2ZXJzaW9uc1xuICAvLyBtYXkgZGlmZmVyLCBhbmQgZWFjaCBsaWJyYXJ5IHZlcnNpb24gcmVxdWlyZXMgaXRzIG1hdGNoaW5nIGJyb3dzZXIgYmluYXJpZXMpLiBCdW4ncyBpc29sYXRlZFxuICAvLyBsaW5rZXIgcmVzb2x2ZXMgdGhlIHBsYXl3cmlnaHQgYmluYXJ5IG9ubHkgZnJvbSB0aGUgZGVjbGFyaW5nIHBhY2thZ2UsIGhlbmNlIHRoZVxuICAvLyB3b3JraW5nLWRpcmVjdG9yeSBvbiBldmVyeSBzdGVwLiBUaGUgYnJvd3NlcnMgbGFuZCBpbiB+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0LCBzaGFyZWQgYWNyb3NzXG4gIC8vIHdvcmtzcGFjZXMsIHNvIHNhbWUtdmVyc2lvbiBpbnN0YWxscyBuYXR1cmFsbHkgZGVkdXBsaWNhdGUuXG4gIGNvbnN0IHBsYXl3cmlnaHREaXJQYXRocyA9IFsuLi5hbGxQYWNrYWdlQ29uZmlnc11cbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuZGlyUGF0aC5sb2NhbGVDb21wYXJlKGIuZGlyUGF0aCkpXG4gICAgLmZpbHRlcigocGFja2FnZUNvbmZpZykgPT4gcGFja2FnZUNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpXG4gICAgLm1hcCgocGFja2FnZUNvbmZpZykgPT4gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgcGFja2FnZUNvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5IGBidW4gaW5zdGFsbGBcbiAgLy8gbXVzdCBub3QgYmUgYWJsZSB0byByZWFkIHRoZSBsb25nLWxpdmVkIGFnZSBpZGVudGl0eS5cbiAgY29uc3QgZm5veEVudjogUGljazxTdGVwLCAnZW52Jz4gPSB1c2VzRm5veCA/IHsgZW52OiB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSB9IDoge307XG5cbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uIH0sXG4gICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgLi4uYnVpbGRJbnN0YWxsU3RlcHModHJ1ZSksXG4gICAgLi4uKHBsYXl3cmlnaHREaXJQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IChbXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCwgaW5kZXgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBgR2V0IFBsYXl3cmlnaHQgdmVyc2lvbiR7ZGlyUGF0aCA/IGAgKCR7ZGlyUGF0aH0pYCA6ICcnfWAsXG4gICAgICAgICAgICAvLyBUaGUgSU5TVEFMTEVEIHZlcnNpb24sIG5vdCB0aGUgcGFja2FnZS5qc29uIHNwZWNpZmllcjogYSByYW5nZSBsaWtlIGBeMS40NS4wYFxuICAgICAgICAgICAgLy8gc3RheXMgdW5jaGFuZ2VkIGFjcm9zcyBsb2NrZmlsZSB1cGRhdGVzLCBzbyBrZXlpbmcgdGhlIGNhY2hlIG9uIGl0IHdvdWxkIHJlc3RvcmVcbiAgICAgICAgICAgIC8vIHN0YWxlIGJyb3dzZXJzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHRoZSBsaWJyYXJ5LiBSdW5zIGFmdGVyIGBidW4gaW5zdGFsbGAsIHNvIHRoZVxuICAgICAgICAgICAgLy8gcGFja2FnZSBpcyByZXNvbHZhYmxlIGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlJ3MgZGlyZWN0b3J5LlxuICAgICAgICAgICAgaWQ6IGBwbGF5d3JpZ2h0LXZlcnNpb24tJHtpbmRleH1gLFxuICAgICAgICAgICAgcnVuOiAnZWNobyBcInZlcnNpb249JChidW4gLWUgXCJ0cnkgeyBjb25zb2xlLmxvZyhyZXF1aXJlKFxcJ0BwbGF5d3JpZ2h0L3Rlc3QvcGFja2FnZS5qc29uXFwnKS52ZXJzaW9uKSB9IGNhdGNoIHt9XCIpXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdDYWNoZSBQbGF5d3JpZ2h0IGJyb3dzZXJzJyxcbiAgICAgICAgICAgIGlkOiAncGxheXdyaWdodC1jYWNoZScsXG4gICAgICAgICAgICB1c2VzOiBjYWNoZUFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgcGF0aDogJ34vLmNhY2hlL21zLXBsYXl3cmlnaHQnLFxuICAgICAgICAgICAgICBrZXk6IGBwbGF5d3JpZ2h0LVxcJHt7IHJ1bm5lci5vcyB9fS0ke3BsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKF8sIGluZGV4KSA9PiBgXFwke3sgc3RlcHMucGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9Lm91dHB1dHMudmVyc2lvbiB9fWApXG4gICAgICAgICAgICAgICAgLmpvaW4oJy0nKX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICBpZjogXCJzdGVwcy5wbGF5d3JpZ2h0LWNhY2hlLm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJ1wiLFxuICAgICAgICAgICAgcnVuOiAnYnVuIHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgLy8gVGhlIGNhY2hlZCBicm93c2VycyBzdGlsbCBuZWVkIHRoZWlyIHN5c3RlbSBkZXBlbmRlbmNpZXMgb24gYSBmcmVzaCBydW5uZXIuXG4gICAgICAgICAgICBpZjogXCJzdGVwcy5wbGF5d3JpZ2h0LWNhY2hlLm91dHB1dHMuY2FjaGUtaGl0ID09ICd0cnVlJ1wiLFxuICAgICAgICAgICAgcnVuOiAnYnVuIHBsYXl3cmlnaHQgaW5zdGFsbC1kZXBzJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICA6IFtdKSxcbiAgICAuLi4oaGFzVHlwZWNoZWNrID8gW3sgcnVuOiAnYnVuIHJ1biB0eXBlY2hlY2snLCAuLi5mbm94RW52IH1dIDogW10pLFxuICAgIHsgcnVuOiAnYnVuIHJ1biBsaW50JywgLi4uZm5veEVudiB9LFxuICAgIHsgcnVuOiAnYnVuIHJ1biB0ZXN0L2NpJywgLi4uZm5veEVudiB9LFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1VwbG9hZCB0ZXN0IHJlc3VsdHMnLFxuICAgICAgICAgICAgaWY6ICcke3sgYWx3YXlzKCkgfX0nLFxuICAgICAgICAgICAgdXNlczogdXBsb2FkQXJ0aWZhY3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIG5hbWU6ICd0ZXN0LXJlc3VsdHMnLFxuICAgICAgICAgICAgICAvLyBFdmVyeSBkZWNsYXJpbmcgcGFja2FnZSB3cml0ZXMgaXRzIG93biB0ZXN0LXJlc3VsdHMgZGlyZWN0b3J5OyBhIG5ld2xpbmUtc2VwYXJhdGVkXG4gICAgICAgICAgICAgIC8vIGxpc3QgdXBsb2FkcyB0aGVtIGFsbC5cbiAgICAgICAgICAgICAgcGF0aDogcGxheXdyaWdodERpclBhdGhzXG4gICAgICAgICAgICAgICAgLm1hcCgoZGlyUGF0aCkgPT4gKGRpclBhdGggPyBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3Rlc3QtcmVzdWx0cycpIDogJ3Rlc3QtcmVzdWx0cycpKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgJ2lmLW5vLWZpbGVzLWZvdW5kJzogJ2lnbm9yZScsXG4gICAgICAgICAgICAgICdyZXRlbnRpb24tZGF5cyc6IDE0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICA6IFtdKSxcbiAgXTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10gfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogJ3JlYWQnIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgZW52OiB7IEZPUkNFX0NPTE9SOiAnMycsIFdCX0VOVjogJ3Rlc3QnLCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwcyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGREZXBsb3lXb3JrZmxvdyhlbnZpcm9ubWVudDogJ3N0YWdpbmcnIHwgJ3Byb2R1Y3Rpb24nLCBzY3JpcHROYW1lOiBzdHJpbmcsIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGBEZXBsb3kgYXBwIG9uICR7ZW52aXJvbm1lbnR9YCxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgICAvLyBQcm9kdWN0aW9uIGRlcGxveXMgZm9sbG93IHB1Ymxpc2hlZCByZWxlYXNlcyAoc2VlIHRoZSByZWxlYXNlIHdvcmtmbG93J3MgdHJpZ2dlciBzdGVwKTtcbiAgICAgIC8vIHN0YWdpbmcgY29udmVyZ2VzIG9uIGV2ZXJ5IGRlZmF1bHQtYnJhbmNoIHB1c2guXG4gICAgICAuLi4oZW52aXJvbm1lbnQgPT09ICdwcm9kdWN0aW9uJ1xuICAgICAgICA/IHsgcmVsZWFzZTogeyB0eXBlczogWydwdWJsaXNoZWQnXSB9IH1cbiAgICAgICAgOiB7IHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddLCAncGF0aHMtaWdub3JlJzogWycqKi5tZCcsICcqKi9kb2NzLyoqJ10gfSB9KSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIGRlcGxveToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgZW52OiB7IFdCX0VOVjogZW52aXJvbm1lbnQsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgLy8gZmV0Y2gtZGVwdGggMCBzbyBgZ2l0IGRlc2NyaWJlYCBzZWVzIHRoZSB0YWdzIFdCX1ZFUlNJT04gaXMgZGVyaXZlZCBmcm9tLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1NldCBXQl9WRVJTSU9OJyxcbiAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuV0JfVkVSU0lPTj0kKGdpdCBkZXNjcmliZSAtLWFsd2F5cyAtLXRhZ3MpXFxuZWNobyBcIldCX1ZFUlNJT049JFdCX1ZFUlNJT05cIiA+PiBcIiRHSVRIVUJfRU5WXCInLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdEZXBsb3knLFxuICAgICAgICAgICAgdXNlczogcmV0cnlBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHRpbWVvdXRfbWludXRlczogNjAsXG4gICAgICAgICAgICAgIG1heF9hdHRlbXB0czogNSxcbiAgICAgICAgICAgICAgY29tbWFuZDogYGJ1biBydW4gJHtzY3JpcHROYW1lfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gU3RlcC1zY29wZWQgbGlrZSB0aGUgdGVzdCB3b3JrZmxvdzogZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyBydW4gYnlcbiAgICAgICAgICAgIC8vIGBidW4gaW5zdGFsbGAgbXVzdCBub3QgYmUgYWJsZSB0byByZWFkIHRoZSBsb25nLWxpdmVkIGFnZSBpZGVudGl0eS5cbiAgICAgICAgICAgIC4uLih1c2VzRm5veCA/IHsgZW52OiB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVsZWFzZVdvcmtmbG93KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdzogYm9vbGVhbixcbiAgdXNlc0Zub3g6IGJvb2xlYW5cbik6IFdvcmtmbG93IHtcbiAgY29uc3QgZm5veEVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHVzZXNGbm94ID8geyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gOiB7fTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsuLi5jb25maWcucmVsZWFzZS5icmFuY2hlc10gfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBkaXNwYXRjaGluZyB0aGUgcHJvZHVjdGlvbiBkZXBsb3kgd29ya2Zsb3cgYWZ0ZXIgYSByZWxlYXNlXG4gICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93ID8geyBhY3Rpb25zOiAnd3JpdGUnIH0gOiB7fSksXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBSZWxlYXNlcyBidWlsZCBwcm9kdWN0aW9uIGFydGlmYWN0cywgaGVuY2UgdGhlIGVudmlyb25tZW50IOKAlCB0aGUgc2FtZSBkZWZhdWx0IGFzIHRoZVxuICAgICAgICAvLyByZXVzYWJsZSByZWxlYXNlIHdvcmtmbG93LiB3YidzIENJIGd1YXJkIGFsc28gcmVxdWlyZXMgYW4gZXhwb3J0ZWQgV0JfRU5WLCBzbyB3aXRob3V0XG4gICAgICAgIC8vIGl0IGEgYHBvc3RpbnN0YWxsYCB0aGF0IGNhbGxzIHdiIChlLmcuIGB3YiBnZW4tY29kZWApIGV4aXRzIDEgYmVmb3JlIHNlbWFudGljLXJlbGVhc2VcbiAgICAgICAgLy8gcnVucy5cbiAgICAgICAgZW52OiB7IFdCX0VOVjogJ3Byb2R1Y3Rpb24nLCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDA6IHNlbWFudGljLXJlbGVhc2UgcmVhZHMgdGhlIGZ1bGwgaGlzdG9yeSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24uXG4gICAgICAgICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiwgd2l0aDogeyAnZmV0Y2gtZGVwdGgnOiAwIH0gfSxcbiAgICAgICAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAgICAgICAuLi5idWlsZEluc3RhbGxTdGVwcyhmYWxzZSksXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogJ0dldCBjdXJyZW50IGxhdGVzdCB0YWcnLFxuICAgICAgICAgICAgICAgICAgaWQ6ICdwcmUtcmVsZWFzZS10YWcnLFxuICAgICAgICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5lY2hvIFwidGFnPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0wIDI+L2Rldi9udWxsIHx8IGVjaG8gXFwnXFwnKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgICAgICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSBjaGVja3MgTm9kZS5qcyBydW50aW1lIHJlcXVpcmVtZW50czsgYGJ1biA8YmluPmAgcmVzcGVjdHMgaXRzXG4gICAgICAgICAgICAvLyBgIyEvdXNyL2Jpbi9lbnYgbm9kZWAgc2hlYmFuZywgc28gaXQgc3RpbGwgcnVucyB1bmRlciByZWFsIE5vZGUuXG4gICAgICAgICAgICBydW46ICdidW4gc2VtYW50aWMtcmVsZWFzZScsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgR0lUSFVCX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyxcbiAgICAgICAgICAgICAgTEVGVEhPT0s6ICcwJyxcbiAgICAgICAgICAgICAgLi4uZm5veEVudixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93XG4gICAgICAgICAgICA/IChbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogJ0NoZWNrIGZvciBuZXcgcmVsZWFzZSB0YWcnLFxuICAgICAgICAgICAgICAgICAgaWQ6ICdwb3N0LXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZ2l0IGZldGNoIC0tdGFncyAtLWZvcmNlXFxuTkVXX1RBRz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcXG5lY2hvIFwidGFnPSRORVdfVEFHXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXFxuaWYgW1sgLW4gXCIkTkVXX1RBR1wiICYmIFwiJE5FV19UQUdcIiAhPSBcIiR7eyBzdGVwcy5wcmUtcmVsZWFzZS10YWcub3V0cHV0cy50YWcgfX1cIiBdXTsgdGhlblxcbiAgZWNobyBcImNyZWF0ZWQ9dHJ1ZVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmZpJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBvc3QtcmVsZWFzZS10YWcub3V0cHV0cy5jcmVhdGVkID09ICd0cnVlJ1wiLFxuICAgICAgICAgICAgICAgICAgbmFtZTogJ1RyaWdnZXIgcHJvZHVjdGlvbiBkZXBsb3knLFxuICAgICAgICAgICAgICAgICAgLy8gQSBHSVRIVUJfVE9LRU4tY3JlYXRlZCByZWxlYXNlIGRvZXMgbm90IGZpcmUgdGhlIGRlcGxveSB3b3JrZmxvdydzXG4gICAgICAgICAgICAgICAgICAvLyByZWxlYXNlLXB1Ymxpc2hlZCB0cmlnZ2VyLCBzbyBkaXNwYXRjaCBpdCBleHBsaWNpdGx5IG9uIHRoZSBuZXcgdGFnLlxuICAgICAgICAgICAgICAgICAgcnVuOiAnZ2ggd29ya2Zsb3cgcnVuIGRlcGxveS1wcm9kdWN0aW9uLnltbCAtLXJlZiBcIiR7eyBzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCInLFxuICAgICAgICAgICAgICAgICAgZW52OiB7IEdIX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0gc2F0aXNmaWVzIFN0ZXBbXSlcbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBpbnN0YWxsIHNlcXVlbmNlIGV2ZXJ5IGdlbmVyYXRlZCB3b3JrZmxvdyBzaGFyZXM6IGBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZWAsIGhhcmRlbmVkIGludG8gdGhlXG4gKiByZXVzYWJsZSB3b3JrZmxvd3MnIHRocmVlLXN0ZXAgZGFuY2Ugd2hlbiB0aGUgcmVwb3NpdG9yeSByZWdpc3RlcnMgYSBUQUtVTUlfR1VBUkRfVE9LRU4gc2VjcmV0LlxuICpcbiAqIFRha3VtaSBHdWFyZCAoaHR0cHM6Ly9mbGF0dC50ZWNoL3Rha3VtaS9mZWF0dXJlcy9ndWFyZCkgaXMgYSByZWdpc3RyeSBwcm94eSB0aGF0IGJsb2Nrc1xuICoga25vd24tbWFsaWNpb3VzIHBhY2thZ2VzLiBSb3V0aW5nIHRoZSBERUZBVUxUIHJlZ2lzdHJ5IHRocm91Z2ggaXQgaXMgd2hhdCBwcm90ZWN0cyB0aGUgaW5zdGFsbCxcbiAqIGFuZCB0aGUgdG9rZW4gYXV0aGVudGljYXRlcyB0aGF0IHByb3h5IOKAlCBzbyB0aGUgdG9rZW4gaGFzIHRvIGJlIHByZXNlbnQgd2hpbGUgZGVwZW5kZW5jaWVzIGFyZVxuICogcmVzb2x2ZWQsIHdoaWNoIGlzIGV4YWN0bHkgd2hlbiBhIGNvbXByb21pc2VkIGRlcGVuZGVuY3kncyBsaWZlY3ljbGUgc2NyaXB0IHdvdWxkIHJ1bi4gSGVuY2UgdGhlXG4gKiBzcGxpdDogcmVzb2x2ZSBhbmQgZG93bmxvYWQgd2l0aCBgLS1pZ25vcmUtc2NyaXB0c2AgYW5kIHRoZSB0b2tlbiwgdGhlbiByZXBsYXkgdGhlIHNraXBwZWRcbiAqIGxpZmVjeWNsZSBzY3JpcHRzIGluIGEgc2Vjb25kIGluc3RhbGwgdGhhdCBoYXMgbm8gdG9rZW4gKGV2ZXJ5IHBhY2thZ2UgaXMgYWxyZWFkeSBjYWNoZWQsIGFuZFxuICogR3VhcmQgc2VydmVzIGFub255bW91c2x5IGFueXdheSkuIE9ubHkgYnVuIGlzIGdlbmVyYXRlZCBoZXJlLCBhbmQgYnVuIHJlYWRzIC5ucG1yYywgc28gbm9cbiAqIHBhY2thZ2UtbWFuYWdlciBicmFuY2hpbmcgaXMgbmVlZGVkLlxuICpcbiAqIFRoZSBzaGVsbCBkZXRhaWxzIGRlbGliZXJhdGVseSBtaXJyb3IgcmV1c2FibGUtd29ya2Zsb3dzJyBwcm9kdWN0aW9uLXByb3ZlbiBpbnN0YWxsIHN0ZXBzOiBiYXJlXG4gKiBgJFJVTk5FUl9URU1QYCAoc2V0IGJ5IHRoZSBydW5uZXIgYXBwbGljYXRpb24gb24gZXZlcnkgcnVubmVyLCBhbmQgYHNldCAtdWAgZmFpbHMgbG91ZGx5IGlmIG5vdCksXG4gKiBgW1sgLWUgLm5wbXJjIF1dYCwgYW5kIHRoZSBzZWNvbmQgYHJtIC1yZiBub2RlX21vZHVsZXNgIGluIHRoZSBmYWxsYmFjayAoYW4gaW50ZXJydXB0ZWQgbGlmZWN5Y2xlXG4gKiBydW4gbWF5IGxlYXZlIG5vZGVfbW9kdWxlcyBpbmNvbnNpc3RlbnQsIHNvIHRoZSByZXRyeSBzdGFydHMgY2xlYW4gcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYSByZXBhaXIpLlxuICpcbiAqIGB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVgIGRlY2lkZXMgd2hhdCBhIGZhaWxpbmcgbGlmZWN5Y2xlLXNjcmlwdCByZXBsYXkgZG9lcy4gRXZlcnlcbiAqIHJlcGxheSBydW5zIHRva2VubGVzcyBhbmQgd2l0aG91dCBGTk9YX0FHRV9LRVkgKHRoZSBrZXkgaXMgc2NvcGVkIHRvIHRoZSBsYXRlciBEZXBsb3kvUmVsZWFzZVxuICogc3RlcCksIHNvIGEgcG9zdGluc3RhbGwgdGhhdCBuZWVkcyBkZWNyeXB0ZWQgc2VjcmV0cyBpcyB1bnN1cHBvcnRlZCBpbiBhbGwgb2YgdGhlbSBieSBkZXNpZ24uXG4gKiBUaGUgdGVzdCB3b3JrZmxvdyB0b2xlcmF0ZXMgdGhlIGZhaWx1cmUgYmVjYXVzZSB0eXBlY2hlY2svbGludC90ZXN0IGZhaWwgbG91ZGx5IG9uIGEgZGVncmFkZWRcbiAqIHRyZWUgYW55d2F5LiBEZXBsb3kgYW5kIHJlbGVhc2Ugd29ya2Zsb3dzIG11c3Qgbm90OiBhIGA6Ondhcm5pbmc6OmAgZG9lcyBub3QgZmFpbCB0aGUgam9iLCBzb1xuICogdGhlIGZhbGxiYWNrIHdvdWxkIHNoaXAgYSB0cmVlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIChlLmcuIGEgYHBvc3RpbnN0YWxsOiB3YiBnZW4tY29kZWApXG4gKiBuZXZlciByYW4sIHNpbGVudGx5IGRlcGxveWluZyBkZWdyYWRlZCBvdXRwdXQgKCMxMTI3KS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRJbnN0YWxsU3RlcHModG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlOiBib29sZWFuKTogU3RlcFtdIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBpZjogXCIke3sgZW52LkhBU19UQUtVTUlfR1VBUkRfVE9LRU4gPT0gJ3RydWUnIH19XCIsXG4gICAgICBuYW1lOiAnR2VuZXJhdGUgLm5wbXJjIGZvciBUYWt1bWkgR3VhcmQnLFxuICAgICAgLy8gVGhlIHRva2VuIGlzIHdyaXR0ZW4gYXMgYSBsaXRlcmFsIGAke1RBS1VNSV9HVUFSRF9UT0tFTn1gIHJlZmVyZW5jZSB0aGF0IGJ1biBleHBhbmRzIGF0XG4gICAgICAvLyBpbnN0YWxsIHRpbWUsIHNvIHRoZSBzZWNyZXQgaXRzZWxmIG5ldmVyIGxhbmRzIGluIGEgZmlsZS4gVGhlIG1hbmFnZWQgbGluZXMgYXJlIHN0cmlwcGVkXG4gICAgICAvLyBmcm9tIGFuIGV4aXN0aW5nIC5ucG1yYyBmaXJzdDogYSByZXBvc2l0b3J5IG91dHNpZGUgdGhlIG9yZ2FuaXphdGlvbnMgbWF5IGxlZ2l0aW1hdGVseVxuICAgICAgLy8gY29tbWl0IG9uZSAoc2NvcGUgbWFwcGluZ3MgZm9yIGFub3RoZXIgcmVnaXN0cnkpLCBhbmQgZHJvcHBpbmcgb25seSB0aGVzZSB0d28gbGluZXMga2VlcHNcbiAgICAgIC8vIHRoZSByZXN0IG9mIGl0IGluIGVmZmVjdC4gUmVwbGFjaW5nIHRoZSBmaWxlIHdpdGggYG12YCByYXRoZXIgdGhhbiBhcHBlbmRpbmcgaW4gcGxhY2Ugc3RvcHNcbiAgICAgIC8vIGEgY29tbWl0dGVkIHN5bWxpbmsgZnJvbSByZWRpcmVjdGluZyB0aGUgd3JpdGUgaW50bywgc2F5LCBhIHBlcnNpc3RlbnQgaG9tZSBucG1yYy5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5OUE1SQz1cIiQobWt0ZW1wIFwiJFJVTk5FUl9URU1QL25wbXJjLlhYWFhYWFwiKVwiXG5pZiBbWyAtZSAubnBtcmMgXV07IHRoZW5cbiAgZ3JlcCAtdkUgJ15yZWdpc3RyeT18Xi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC86X2F1dGhUb2tlbicgLm5wbXJjID4gXCIkTlBNUkNcIiB8fCB0cnVlXG5maVxuZWNobyAncmVnaXN0cnk9aHR0cHM6Ly9ucG0uZmxhdHQudGVjaC8nID4+IFwiJE5QTVJDXCJcbmVjaG8gJy8vbnBtLmZsYXR0LnRlY2gvOl9hdXRoVG9rZW49XFwke1RBS1VNSV9HVUFSRF9UT0tFTn0nID4+IFwiJE5QTVJDXCJcbnJtIC1mIC5ucG1yY1xubXYgXCIkTlBNUkNcIiAubnBtcmNgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICAgIC8vIC0tZnJvemVuLWxvY2tmaWxlOiBhIHBsYWluIGBidW4gaW5zdGFsbGAgc2lsZW50bHkgcmVwYWlycyBhIGJ1bi5sb2NrIHRoYXQgaXMgc3RhbGUgYWdhaW5zdFxuICAgICAgLy8gcGFja2FnZS5qc29uLCBzbyBDSSB3b3VsZCBydW4gZGVwZW5kZW5jeSByZXNvbHV0aW9ucyB0aGF0IHdlcmUgbmV2ZXIgcmV2aWV3ZWQgKCMxMTI2KS5cbiAgICAgIC8vIFdpdGggTk8gYnVuLmxvY2sgYXQgYWxsLCAtLWZyb3plbi1sb2NrZmlsZSBzaWxlbnRseSBpbnN0YWxscyBmcmVzaCwgdW5waW5uZWQgcmVzb2x1dGlvbnNcbiAgICAgIC8vIChCdW4gMS4zLjE0IGV4aXRzIDAgYW5kIHdyaXRlcyBubyBsb2NrZmlsZSksIHNvIGEgbWlzc2luZyBsb2NrZmlsZSBtdXN0IGZhaWwgZXhwbGljaXRseS5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5pZiBbWyAhIC1lIGJ1bi5sb2NrIF1dOyB0aGVuXG4gIGVjaG8gXCI6OmVycm9yOjpidW4ubG9jayBpcyBtaXNzaW5nOyBjb21taXQgaXQgc28gQ0kgaW5zdGFsbHMgc3RheSByZXByb2R1Y2libGVcIlxuICBleGl0IDFcbmZpXG5pZiBbWyBcIiRIQVNfVEFLVU1JX0dVQVJEX1RPS0VOXCIgPT0gXCJ0cnVlXCIgXV07IHRoZW5cbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgLS1pZ25vcmUtc2NyaXB0c1xuZWxzZVxuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZVxuZmlgLFxuICAgICAgLy8gU3RlcC1zY29wZWQ6IGEgam9iLWxldmVsIHRva2VuIHdvdWxkIGJlIHJlYWRhYmxlIGJ5IGV2ZXJ5IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdCB0aGVcbiAgICAgIC8vIHRva2VubGVzcyByZXBsYXkgYmVsb3cgcnVucy5cbiAgICAgIGVudjogeyBUQUtVTUlfR1VBUkRfVE9LRU46ICcke3sgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZjogXCIke3sgZW52LkhBU19UQUtVTUlfR1VBUkRfVE9LRU4gPT0gJ3RydWUnIH19XCIsXG4gICAgICBuYW1lOiAnUnVuIGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgd2l0aG91dCByZWdpc3RyeSBjcmVkZW50aWFscycsXG4gICAgICAvLyBBIHJlcGVhdGVkIGBidW4gaW5zdGFsbGAgaXMgYSBuby1vcCB0aGF0IHJlcGxheXMgbm90aGluZywgc28gbm9kZV9tb2R1bGVzIGhhcyB0byBnbyBmaXJzdC5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5ybSAtcmYgbm9kZV9tb2R1bGVzXG5idW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSR7XG4gICAgICAgIHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZVxuICAgICAgICAgID8gYCB8fCB7XG4gIGVjaG8gXCI6Ondhcm5pbmc6OkxpZmVjeWNsZSBzY3JpcHRzIGZhaWxlZDsgY29tcGxldGluZyB0aGUgaW5zdGFsbCB3aXRob3V0IHRoZW1cIlxuICBybSAtcmYgbm9kZV9tb2R1bGVzXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbn1gXG4gICAgICAgICAgOiAnJ1xuICAgICAgfWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBpZjogXCIke3sgZW52LkhBU19UQUtVTUlfR1VBUkRfVE9LRU4gPT0gJ3RydWUnIH19XCIsXG4gICAgICBuYW1lOiAnUmVtb3ZlIHRoZSBnZW5lcmF0ZWQgLm5wbXJjJyxcbiAgICAgIC8vIE5vdGhpbmcgYWZ0ZXIgdGhlIGluc3RhbGwgbmVlZHMgdGhlIHByb3h5LCBhbmQgbGVhdmluZyBpdCBpbiBwbGFjZSB3b3VsZCBicmVhayB0aGUgb25lXG4gICAgICAvLyB0aGluZyBHdWFyZCByZWZ1c2VzIHRvIHNlcnZlOiBpdCBhbnN3ZXJzIGBucG0gcHVibGlzaGAgd2l0aCA0MDUsIHNvIGEgcmVsZWFzZSB3b3JrZmxvd1xuICAgICAgLy8gd2hvc2UgcGFja2FnZSBsYWNrcyBhbiBleHBsaWNpdCBwdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5IHdvdWxkIGZhaWwgdG8gcHVibGlzaC5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5pZiBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIC0tIC5ucG1yYyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuXG4gIGdpdCBjaGVja291dCAtLSAubnBtcmNcbmVsc2VcbiAgcm0gLWYgLm5wbXJjXG5maWAsXG4gICAgfSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKTogV29ya2Zsb3cge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDogeyB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10gfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIC8vIFRoZSBhY3Rpb24gcmVhZHMgdGhlIHB1bGwgcmVxdWVzdCwgYW5kIGl0cyBgd2lwYCBzdXBwb3J0IHBvc3RzIGEgY29tbWl0IHN0YXR1czsgbmVpdGhlclxuICAgICAgICAvLyBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgd2hlbiB0aGUgcmVwb3NpdG9yeSByZXN0cmljdHMgZGVmYXVsdCB3b3JrZmxvdyBwZXJtaXNzaW9ucy5cbiAgICAgICAgcGVybWlzc2lvbnM6IHsgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsIHN0YXR1c2VzOiAnd3JpdGUnIH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlczogc2VtYW50aWNQdWxsUmVxdWVzdEFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHsgd2lwOiB0cnVlIH0sXG4gICAgICAgICAgICBlbnY6IHsgR0lUSFVCX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgTWlzZVRvbWwge1xuICB0b29scz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vLyBUaGUgb2xkZXN0IEJ1biBydW50aW1lIHdiZnkgc3VwcG9ydHMuXG5leHBvcnQgY29uc3QgbWluaW11bUJ1blZlcnNpb24gPSAnMS40LjAnO1xuXG4vKipcbiAqIEVuc3VyZXMgbWlzZS50b21sIG1hbmFnZXMgdGhlIE5vZGUuanMgYW5kICh3aGVuIGZub3gudG9tbCBleGlzdHMpIGZub3ggdG9vbCB2ZXJzaW9ucyB3aGlsZVxuICogcHJlc2VydmluZyB0aGUgQnVuIHBpbiBhbmQgdW5yZWxhdGVkIG1pc2Ugc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1pc2VUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTWlzZVRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWlzZVRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJyk7XG4gICAgLy8gQSBwYXJzZSBmYWlsdXJlIG11c3QgYWJvcnQgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8ge306IHJlZ2VuZXJhdGluZyBmcm9tIGFuIGVtcHR5IG9iamVjdFxuICAgIC8vIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhlIHVzZXIncyBleGlzdGluZyAoYWxiZWl0IGJyb2tlbikgbWlzZS50b21sLlxuICAgIGNvbnN0IHNldHRpbmdzID0gcGFyc2VNaXNlVG9tbChtaXNlVG9tbFBhdGgpO1xuICAgIGNvbnN0IHRvb2xzID0geyAuLi5zZXR0aW5ncy50b29scyB9O1xuXG4gICAgLy8gRW5zdXJlIE5vZGUuanMgaXMgYWx3YXlzIHBpbm5lZDogZ2VuZXJhdGVkIGhvb2tzIGFuZCBDSSBydW4gYG1pc2UgaW5zdGFsbGAsIGFuZCBhbiB1bnBpbm5lZFxuICAgIC8vIE5vZGUgd291bGQgY29tZSBmcm9tIHdoYXRldmVyIGhhcHBlbnMgdG8gYmUgb24gUEFUSC5cbiAgICAvLyBMaWZ0LXRoZW4tcGluOiB0aGUgbGlmdCBvbmx5IHRvdWNoZXMgZXhhY3QgcGlucyBhbmQgdGhlIHBpbiBvbmx5IHRvdWNoZXMgc2VsZWN0b3JzLCBzb1xuICAgIC8vIG9yZGVyaW5nIHRoZSBsaWZ0IGZpcnN0IGF2b2lkcyByZXNvbHZpbmcgYG1pc2UgbGF0ZXN0IG5vZGVAbHRzYCB0d2ljZSBmb3IgdW5waW5uZWQgcmVwb3MuXG4gICAgdG9vbHMubm9kZSA9IHBpbkNvbmNyZXRlVG9vbFZlcnNpb24oXG4gICAgICAnbm9kZScsXG4gICAgICBsaWZ0T3V0ZGF0ZWRUb29sVmVyc2lvbldpdGhpbk1ham9yKCdub2RlQGx0cycsIHRvb2xzLm5vZGUsIGNvbmZpZy5kaXJQYXRoKSxcbiAgICAgIGNvbmZpZy5kaXJQYXRoXG4gICAgKTtcbiAgICAvLyBCdW4gaXMgbmV2ZXIgYWRkZWQgb3IgY2hhbmdlZDogYSBtaXNzaW5nIHBpbiBzdGF5cyBtaXNzaW5nIChkZXZlbG9wZXJzIGluc3RhbGwgQnVuIGdsb2JhbGx5XG4gICAgLy8gdG8gcnVuIHdiZnkpLCBhbmQgaGFzU3VwcG9ydGVkQnVuUGluKCkgaGFzIGFscmVhZHkgcmVqZWN0ZWQgYW55IHBpbiB0aGF0IGlzIG5vdCBvbmUgZXhhY3RcbiAgICAvLyBzdXBwb3J0ZWQgdmVyc2lvbi5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIHRvb2xzLmZub3ggPSBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgICAnZm5veCcsXG4gICAgICAgIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3IoJ2Zub3gnLCB0b29scy5mbm94LCBjb25maWcuZGlyUGF0aCksXG4gICAgICAgIGNvbmZpZy5kaXJQYXRoXG4gICAgICApO1xuICAgIH1cbiAgICBzZXR0aW5ncy50b29scyA9IHRvb2xzO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBCdW4gMS40IHByb3ZpZGVzIFRPTUwuc3RyaW5naWZ5IGJlZm9yZSB0aGUgYWdlLWdhdGVkIEB0eXBlcy9idW4gdmVyc2lvbiBkZWNsYXJlcyBpdC5cbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKG1pc2VUb21sUGF0aCwgQnVuLlRPTUwuc3RyaW5naWZ5KHNldHRpbmdzKSk7XG4gIH0pO1xufVxuXG4vKiogV2hldGhlciBtaXNlLnRvbWwgb21pdHMgQnVuIG9yIHBpbnMgaXQgdG8gb25lIGV4YWN0IHZlcnNpb24gdGhhdCB3YmZ5IHN1cHBvcnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1N1cHBvcnRlZEJ1blBpbihkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGJ1blZlcnNpb246IHVua25vd247XG4gIHRyeSB7XG4gICAgYnVuVmVyc2lvbiA9IHBhcnNlTWlzZVRvbWwocGF0aC5yZXNvbHZlKGRpclBhdGgsICdtaXNlLnRvbWwnKSkudG9vbHM/LmJ1bjtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTGV0IGdlbmVyYXRlTWlzZVRvbWwgcmVwb3J0IHRoZSB1bnJlYWRhYmxlIG9yIG1hbGZvcm1lZCBmaWxlLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiAoXG4gICAgYnVuVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgKHR5cGVvZiBidW5WZXJzaW9uID09PSAnc3RyaW5nJyAmJiAhIXNlbXZlci52YWxpZChidW5WZXJzaW9uKSAmJiBzZW12ZXIuZ3RlKGJ1blZlcnNpb24sIG1pbmltdW1CdW5WZXJzaW9uKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBMaWZ0cyBhbiBleGFjdCB0b29sIHBpbiBiZWxvdyB0aGUgbGF0ZXN0IHJlc29sdmFibGUgdmVyc2lvbiDigJQgd2l0aGluIHRoZSBTQU1FIG1ham9yIOKAlCB0byB0aGF0XG4gKiB2ZXJzaW9uIChOb2RlLmpzIHJlc29sdmVzIGFnYWluc3QgdGhlIGxhdGVzdCBMVFMpOiB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmUgc3RhbmRhcmQgdHJhY2tzIHRoZVxuICogY3VycmVudCB0b29sY2hhaW4gYWNyb3NzIHJlcG9zaXRvcmllcyBhbmQgUmVub3ZhdGUgZG9lcyBub3QgbWFuYWdlIG1pc2UudG9tbCBwaW5zLCBzb1xuICogcGF0Y2gvbWlub3IgZHJpZnQgKGUuZy4gbm9kZSAyNC4xNi4wIHZzIDI0LjE4LjAsIGZub3ggMS4zMC4wIHZzIDEuMzEuMCkgbmV2ZXIgc2VsZi1oZWFscy4gQSBwaW5cbiAqIG9uIGFuIG9sZGVyIG1ham9yIGlzIGEgZGVsaWJlcmF0ZSBjb21wYXRpYmlsaXR5IGNob2ljZSBhbmQgaXMga2VwdCwgYXMgYXJlIG5vbi1leGFjdCBhbmRcbiAqIG5vbi1zdHJpbmcgZm9ybXMuIFdoZW4gbWlzZSBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBwaW4gaXMga2VwdC5cbiAqL1xuZnVuY3Rpb24gbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcihzZWxlY3Rvcjogc3RyaW5nLCB2ZXJzaW9uOiB1bmtub3duLCBjd2Q6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8ICFzZW12ZXIudmFsaWQodmVyc2lvbikpIHJldHVybiB2ZXJzaW9uO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbikgJiZcbiAgICBzZW12ZXIubWFqb3IobGF0ZXN0VmVyc2lvbikgPT09IHNlbXZlci5tYWpvcih2ZXJzaW9uKSAmJlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBsYXRlc3RWZXJzaW9uKVxuICAgID8gbGF0ZXN0VmVyc2lvblxuICAgIDogdmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbiB1bnBpbm5lZCBzZWxlY3RvciAoYGxhdGVzdGAsIGEgcmFuZ2Ugc3VjaCBhcyBcIjI0XCIsIGFuIGFsaWFzLCBvciBhIG1pc3NpbmcgZW50cnkpXG4gKiB3aXRoIHRoZSBuZXdlc3QgY29uY3JldGUgdmVyc2lvbiBtaXNlIHJlc29sdmVzIGZvciBpdCwgYmVjYXVzZSB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmVcbiAqIHN0YW5kYXJkIHJlcXVpcmVzIGNvbmNyZXRlIHBpbnM6IENJIGluc3RhbGxzIHdoYXRldmVyIGFuIHVucGlubmVkIHNlbGVjdG9yIHJlc29sdmVzIHRvIGF0IHJ1blxuICogdGltZSwgc28gYnVpbGRzIGRyaWZ0IGFjcm9zcyBydW5zLiBFeGFjdCB2ZXJzaW9ucyBhcmUga2VwdCBhcy1pcywgYW5kIG5vbi1zdHJpbmcgZm9ybXMgKG1pc2Unc1xuICogYXJyYXkgYW5kIGB7IHZlcnNpb24gPSBcIuKAplwiIH1gIGZvcm1zKSBhcmUgdXNlci1tYW5hZ2VkIGFuZCBsZWZ0IHVudG91Y2hlZC4gV2hlbiBtaXNlIGlzXG4gKiB1bmF2YWlsYWJsZSBvciBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBpcyBrZXB0IOKAlFxuICogYW4gdW5waW5uZWQgdG9vbCBpcyBiZXR0ZXIgdGhhbiBhIGJyb2tlbiBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8IHNlbXZlci52YWxpZCh2ZXJzaW9uKSkpIHJldHVybiB2ZXJzaW9uO1xuICAvLyBOb3JtYWxpemUgc2VsZWN0b3IgZm9ybXMgYG1pc2UgbGF0ZXN0YCBjYW5ub3QgcmVzb2x2ZSBldmVuIHRob3VnaCBtaXNlIGNvbmZpZ3VyYXRpb24gYWNjZXB0c1xuICAvLyB0aGVtOiBgcHJlZml4OjI0YCBpcyByZWplY3RlZCBvdXRyaWdodCB3aGlsZSBgMjRgIHJlc29sdmVzLCBhbmQgYGx0cy8qYCB5aWVsZHMgZW1wdHkgb3V0cHV0XG4gIC8vIHdoaWxlIGBsdHNgIHJlc29sdmVzLiBNb2RpZmllciBzZWxlY3RvcnMgc3VjaCBhcyBgc3ViLTI6bHRzYCBzdGF5IHVucmVzb2x2YWJsZSBhbmQgZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBiZWxvdy5cbiAgY29uc3QgcmFuZ2UgPSB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgPyB2ZXJzaW9uLnJlcGxhY2UoL15wcmVmaXg6L3UsICcnKS5yZXBsYWNlKC9cXC9cXCokL3UsICcnKSA6IHVuZGVmaW5lZDtcbiAgLy8gV2l0aCBubyBtZWFuaW5nZnVsIHNlbGVjdG9yLCBOb2RlLmpzIHBpbnMgdG8gdGhlIGxhdGVzdCBMVFMgKG1hdGNoaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MnXG4gIC8vIGBsdHMvKmAgZmFsbGJhY2spIHJhdGhlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZS5cbiAgY29uc3QgZGVmYXVsdFNlbGVjdG9yID0gdG9vbCA9PT0gJ25vZGUnID8gJ25vZGVAbHRzJyA6IHRvb2w7XG4gIGNvbnN0IHNlbGVjdG9yID0gcmFuZ2UgJiYgcmFuZ2UgIT09ICdsYXRlc3QnID8gYCR7dG9vbH1AJHtyYW5nZX1gIDogZGVmYXVsdFNlbGVjdG9yO1xuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJ2xhdGVzdCcsIHNlbGVjdG9yXSwgY3dkKTtcbiAgcmV0dXJuIHNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pID8gcmVzb2x2ZWRWZXJzaW9uIDogKHZlcnNpb24gPz8gJ2xhdGVzdCcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1pc2VUb21sKG1pc2VUb21sUGF0aDogc3RyaW5nKTogTWlzZVRvbWwge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobWlzZVRvbWxQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgYSByZXBvc2l0b3J5IHdpdGhvdXQgbWlzZS50b21sIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb247IGFuIHVucmVhZGFibGUgZmlsZVxuICAgIC8vIChlLmcuIHBlcm1pc3Npb25zKSBtdXN0IGFib3J0IGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCBnZW5lcmF0ZWQgc2V0dGluZ3MuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4ge307XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nLCByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuXG4vKipcbiAqIEJ1biByZWFkcyByZWdpc3RyeSBzY29wZSBtYXBwaW5ncyBmcm9tIGEgcGh5c2ljYWwgcmVwb3NpdG9yeSAubnBtcmMgZHVyaW5nIFJlbm92YXRlIGFydGlmYWN0XG4gKiB1cGRhdGVzOyBSZW5vdmF0ZSdzIG5wbXJjIHNldHRpbmcgaXMgdXNlZCBvbmx5IGJ5IGl0cyBkYXRhc291cmNlIGxheWVyLiBLZWVwIHRoZSBub24tc2VjcmV0XG4gKiBtYXBwaW5nIGluIHJlcG9zaXRvcmllcyB0aGF0IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlcywgd2hpbGUgYXV0aGVudGljYXRpb24gcmVtYWlucyBpbiB0aGVcbiAqIGRldmVsb3BlcidzIH4vLm5wbXJjIGxvY2FsbHkgYW5kIGluIHRlbXBvcmFyeSBDSSBvciBNZW5kIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb0F1dGhvciA9IGNvbmZpZ3NbMF0/LnJlcG9BdXRob3I7XG4gIGlmIChyZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXInICYmIHJlcG9BdXRob3IgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBjb25zdCBucG1yY1BhdGhzID0gbmV3IFNldChjb25maWdzLm1hcCgoY29uZmlnKSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubnBtcmMnKSkpO1xuICBjb25zdCByb290Q29uZmlnID0gY29uZmlncy5maW5kKChjb25maWcpID0+IGNvbmZpZy5pc1Jvb3QpO1xuICBpZiAocm9vdENvbmZpZyAmJiByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMocm9vdENvbmZpZykpIHtcbiAgICBjb25zdCByb290TnBtcmNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5ucG1yYycpO1xuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocm9vdE5wbXJjUGF0aCwgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nKTtcbiAgICBucG1yY1BhdGhzLmRlbGV0ZShyb290TnBtcmNQYXRoKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbnBtcmNQYXRoIG9mIG5wbXJjUGF0aHMpIGF3YWl0IHJlbW92ZU5wbXJjKG5wbXJjUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZU5wbXJjKG5wbXJjUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5wbXJjUGF0aCkuY2F0Y2goKCkgPT4ge30pKSkgcmV0dXJuO1xuICBpZiAoYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKG5wbXJjUGF0aCkpIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbW92ZWQgbm9uLWNhbm9uaWNhbCByZXBvc2l0b3J5IG5wbXJjICR7bnBtcmNQYXRofS5gKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuLCBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvciB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0YXJnZXQ6ICdicmFuY2gnO1xuICBlbmZvcmNlbWVudDogJ2FjdGl2ZSc7XG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgaW5jbHVkZTogc3RyaW5nW107XG4gICAgICBleGNsdWRlOiBzdHJpbmdbXTtcbiAgICB9O1xuICB9O1xuICBydWxlczogKFxuICAgIHwge1xuICAgICAgICB0eXBlOiAnZGVsZXRpb24nIHwgJ25vbl9mYXN0X2ZvcndhcmQnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcyc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGJvb2xlYW47XG4gICAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IHtcbiAgICAgICAgICAgIGNvbnRleHQ6IHN0cmluZztcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBudW1iZXI7XG4gICAgICAgICAgfVtdO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IG51bWJlcjtcbiAgICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdO1xuICAgICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBib29sZWFuO1xuICAgICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgKVtdO1xuICBieXBhc3NfYWN0b3JzOiB7XG4gICAgYWN0b3JfaWQ6IG51bWJlcjtcbiAgICBhY3Rvcl90eXBlOiAnVGVhbSc7XG4gICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnO1xuICB9W107XG59XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgc291cmNlX3R5cGU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIgPSB7XG4gICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4Jyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lEID0gMTVfMzY4O1xuXG5jb25zdCBQUk9URUNUX01BSU5fUlVMRVNFVDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkID0ge1xuICBuYW1lOiAnUHJvdGVjdCBtYWluJyxcbiAgdGFyZ2V0OiAnYnJhbmNoJyxcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnLFxuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGV4Y2x1ZGU6IFtdLFxuICAgICAgaW5jbHVkZTogWyd+REVGQVVMVF9CUkFOQ0gnXSxcbiAgICB9LFxuICB9LFxuICBydWxlczogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdkZWxldGlvbicsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogZmFsc2UsXG4gICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogdHJ1ZSxcbiAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICd0ZXN0IC8gdGVzdCcsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAnc2VtYW50aWMtcHIgLyBzZW1hbnRpYy1wcicsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbm9uX2Zhc3RfZm9yd2FyZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogMCxcbiAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdLFxuICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGZhbHNlLFxuICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIGJ5cGFzc19hY3RvcnM6IFtcbiAgICB7XG4gICAgICBhY3Rvcl9pZDogMTdfNzc3XzQ5NSxcbiAgICAgIGFjdG9yX3R5cGU6ICdUZWFtJyxcbiAgICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICB9LFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwUmVwb3NpdG9yeVJ1bGVzZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJykgcmV0dXJuO1xuICAgIC8vIFRoZSByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBob3N0cyB3b3JrZmxvd19jYWxsIGRlZmluaXRpb25zLCBzbyB0aGVcbiAgICAvLyBQcm90ZWN0IG1haW4gcnVsZXNldCB3b3VsZCByZXF1aXJlIHRlc3Qvc2VtYW50aWMtcHIgY2hlY2tzIHRoYXQgbmV2ZXIgcnVuIHRoZXJlLlxuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhjb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVwc2VydFByb3RlY3RNYWluUnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gUmVwb3NpdG9yeSBydWxlc2V0cyByZXF1aXJlIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHdoaWNoIGxvY2FsIHJ1bnNcbiAgICAgIC8vIG1heSBub3QgaGF2ZSBldmVuIHdoZW4gZmlsZS1nZW5lcmF0aW9uIGFuZCBwdXNoZXMgYXJlIGFsbG93ZWQuXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWc6IFBhY2thZ2VDb25maWcpOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBjb25zdCBydWxlc2V0ID0gc3RydWN0dXJlZENsb25lKFBST1RFQ1RfTUFJTl9SVUxFU0VUKTtcbiAgaWYgKGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzZXQucnVsZXMpIHtcbiAgICAgIGlmIChydWxlLnR5cGUgIT09ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJykgY29udGludWU7XG4gICAgICAvLyBUaGUgY29udGV4dCBpcyBgPGNhbGxlciBqb2IgaWQ+IC8gPHJldXNhYmxlIGpvYiBpZD5gIG9mIHRoZSB3YmZ5LWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sLlxuICAgICAgcnVsZS5wYXJhbWV0ZXJzLnJlcXVpcmVkX3N0YXR1c19jaGVja3MucHVzaCh7XG4gICAgICAgIGNvbnRleHQ6ICd0ZXN0LXJ1c3QgLyB0ZXN0LXJ1c3QnLFxuICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ1bGVzZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwc2VydFByb3RlY3RNYWluUnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0OiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXQgPSBhd2FpdCBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIHJ1bGVzZXQubmFtZSk7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldElkID0gZXhpc3RpbmdSdWxlc2V0Py5pZDtcblxuICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nUnVsZXNldElkKSB7XG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBydWxlc2V0X2lkOiBleGlzdGluZ1J1bGVzZXRJZCxcbiAgICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXROYW1lOiBzdHJpbmdcbik6IFByb21pc2U8UmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2l0aFJldHJ5KFxuICAgICgpID0+XG4gICAgICBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICBpbmNsdWRlc19wYXJlbnRzOiBmYWxzZSxcbiAgICAgICAgdGFyZ2V0czogJ2JyYW5jaCcsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgcnVsZXNldHMgPSByZXNwb25zZS5kYXRhO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXNldHMpKSByZXR1cm47XG4gIHJldHVybiBydWxlc2V0cy5maW5kKChydWxlc2V0KSA9PiBydWxlc2V0Lm5hbWUgPT09IHJ1bGVzZXROYW1lICYmIHJ1bGVzZXQuc291cmNlX3R5cGUgPT09ICdSZXBvc2l0b3J5Jyk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgc2V0dGluZ3MgbmVlZCBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB1bmxpa2UgZmlsZSBnZW5lcmF0aW9uLlxuICAgICAgYXdhaXQgd2l0aFJldHJ5KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gTG9jYWwgd2JmeSBydW5zIG9mdGVuIGhhdmUgcHVzaCBwZXJtaXNzaW9uIHdpdGhvdXQgYWRtaW4gcGVybWlzc2lvbi5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cEdpdEh1YlNldHRpbmdzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuPCEtLSBXcml0ZSBmb3IgYSByZXZpZXdlciB3aG8gaGFzIG5vdCBmb2xsb3dlZCB0aGUgd29yay4gU2NhbGUgZWFjaCBzZWN0aW9uIHRvIHRoZSBjaGFuZ2U6IGEgc2VudGVuY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBudW1iZXJlZCBzdWJzZWN0aW9ucyBmb3IgYSBsYXJnZSBvbmUuIERlbGV0ZSB0aGlzIGNvbW1lbnQgYW5kIHRoZSBwbGFjZWhvbGRlciBjb21tZW50cyBiZWxvdy4gLS0+XG5cbiMjIFdoeVxuXG48IS0tIFRoZSBwcm9ibGVtLCB3aXRoIHRoZSBudW1iZXJzIG9yIG9ic2VydmF0aW9ucyBiZWhpbmQgaXQsIGFuZCB3aHkgdGhpcyBhcHByb2FjaCBvdmVyIHRoZSBhbHRlcm5hdGl2ZXMuIC0tPlxuXG4jIyBDdXN0b21lciBTdW1tYXJ5XG5cbjwhLS0gQmVoYXZpb3IsIHdvcmtmbG93LCBvciB1c2VyLXZpc2libGUgY2hhbmdlcywgd3JpdHRlbiBmb3IgcmVhZGVycyB3aG8ga25vdyBub3RoaW5nIGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbi4gLS0+XG5cbiMjIFRlY2huaWNhbCBTdW1tYXJ5XG5cbjwhLS0gRGVjaXNpb25zIGFuZCB0aGVpciByZWFzb25zLCBkYXRhIGZsb3csIHdoZXJlIHRvIGxvb2sgKHRoZSBmaWxlcyB0aGF0IG1hdHRlciBtb3N0KSwgYW5kIHdoYXQgdG8gY2hlY2sgaGFyZGVzdDogdGhlIHBhcnRzIHdob3NlIGNvcnJlY3RuZXNzIGlzIGFyZ3VlZCByYXRoZXIgdGhhbiBwcm92ZW4uIC0tPlxuXG4jIyBUZXN0aW5nXG5cbjwhLS0gQ29tbWFuZHMgcnVuLCB0ZXN0cyBhZGRlZCwgYW5kIHdoYXQgd2FzIE5PVCBleGVyY2lzZWQgYW5kIHdoeS4gLS0+XG5cbiMjIE5vdGVzXG5cbjwhLS0gS25vd24gbGltaXRhdGlvbnMsIGNvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvbiwgZm9sbG93LXVwIHdvcmsuIERlbGV0ZSB0aGlzIHNlY3Rpb24gaWYgdGhlcmUgaXMgbm9uZS4gLS0+XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2J1Zy5tZCc6IGBcbi0tLVxubmFtZTogQnVnIC8gUHJvYmxlbVxuYWJvdXQ6IFNvbWV0aGluZyBiZWhhdmVzIHdyb25nbHlcbnRpdGxlOiAnZml4OiAnXG5sYWJlbHM6ICd0OiBmaXggOmJ1ZzonXG4tLS1cblxuPCEtLSBLZWVwIFByb2JsZW0gYW5kIFByb3Bvc2FsOyBkZWxldGUgRXZpZGVuY2Ugb3IgSW1wYWN0IHdoZW4gdGhleSBhZGQgbm90aGluZy4gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuIyMgUHJvYmxlbVxuXG48IS0tIFdoYXQgaGFwcGVucywgYW5kIHdoYXQgc2hvdWxkIGhhcHBlbiBpbnN0ZWFkLiAtLT5cblxuIyMgRXZpZGVuY2VcblxuPCEtLSBSZXByb2R1Y3Rpb24gc3RlcHMsIGxvZ3MsIHJ1biBJRHMsIG9yIGxpbmtzLiAtLT5cblxuIyMgSW1wYWN0XG5cbjwhLS0gV2hvIG9yIHdoYXQgaXMgYWZmZWN0ZWQsIGFuZCBob3cgYmFkbHkuIC0tPlxuXG4jIyBQcm9wb3NhbFxuXG48IS0tIFRoZSBmaXggeW91IGhhdmUgaW4gbWluZCwgYW5kIHRoZSByb290IGNhdXNlIGlmIGtub3duLiAtLT5cbmAudHJpbSgpLFxuICAvLyBUaGUgaGVhZGluZ3MgbWlycm9yIHRoZSBzcGVjLWJvb3N0ZXIgY2hlY2tsaXN0IGluIFdpbGxCb29zdGVyL3Jldmlldy1ib29zdGVyOyBvbmx5XG4gIC8vIFwiU2NvcGUgYW5kIG5vbi1nb2Fsc1wiIGlzIG1vdmVkIGRvd24gc28gdGhlIHRocmVlIHNlY3Rpb25zIGEgc21hbGwgY2hhbmdlIG5lZWRzIHN0YXkgY29udGlndW91cy5cbiAgJ0lTU1VFX1RFTVBMQVRFL2NoYW5nZS5tZCc6IGBcbi0tLVxubmFtZTogQ2hhbmdlIC8gRmVhdHVyZVxuYWJvdXQ6IFByb3Bvc2UgYSBjaGFuZ2UgdGhhdCBhIHRoaXJkIHBhcnR5IGNvdWxkIGltcGxlbWVudCB3aXRob3V0IGFza2luZyBhIHF1ZXN0aW9uXG50aXRsZTogJ2ZlYXQ6ICdcbmxhYmVsczogJ3Q6IGZlYXQgOnNwYXJrbGVzOidcbi0tLVxuXG48IS0tIEtlZXAgdGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGZvciBhbnkgY2hhbmdlIGFuZCBhZGQgdGhlIG90aGVycyBhcyB0aGUgY2hhbmdlIGdyb3dzOyBhIGxhcmdlIGNoYW5nZSBmaWxscyBhbGwgb2YgdGhlbSAoc3BlYy1ib29zdGVyIHJldmlld3MgYWdhaW5zdCB0aGlzIGxpc3QpLiBEZWxldGUgdGhlc2UgY29tbWVudHMuIC0tPlxuXG4jIyBCYWNrZ3JvdW5kIGFuZCBnb2FsXG5cbjwhLS0gVGhlIHByb2JsZW0gYmVpbmcgc29sdmVkLCBmb3Igd2hvbSwgYW5kIHdoYXQgb3V0Y29tZSBjb3VudHMgYXMgc3VjY2Vzcy4gLS0+XG5cbiMjIEJlaGF2aW9yXG5cbjwhLS0gRXZlcnkgb2JzZXJ2YWJsZSBiZWhhdmlvcjogaW5wdXRzLCBvdXRwdXRzLCBlcnJvciBjYXNlcywgZWRnZSBjYXNlcywgaW50ZXJhY3Rpb25zIHdpdGggZXhpc3RpbmcgYmVoYXZpb3IuIC0tPlxuXG4jIyBBY2NlcHRhbmNlIGNyaXRlcmlhXG5cbjwhLS0gQ2hlY2thYmxlIGNvbmRpdGlvbnMgdGhhdCBkZWNpZGUgd2hldGhlciB0aGUgaW1wbGVtZW50YXRpb24gaXMgZG9uZS4gLS0+XG5cbiMjIFNjb3BlIGFuZCBub24tZ29hbHNcblxuPCEtLSBXaGF0IHRoZSBjaGFuZ2UgY292ZXJzIGFuZCB3aGF0IGl0IGRlbGliZXJhdGVseSBsZWF2ZXMgb3V0LiAtLT5cblxuIyMgRGVzaWduIGNvbnN0cmFpbnRzXG5cbjwhLS0gRGF0YSwgQVBJLCBzY2hlbWEsIFVJLCBjb25maWd1cmF0aW9uLCBuYW1pbmcsIGFuZCB0aGUgZXhpc3RpbmcgY29kZSB0aGUgaW1wbGVtZW50YXRpb24gbXVzdCBmaXQ7IGV2ZXJ5dGhpbmcgZWxzZSBpcyBsZWZ0IHRvIHRoZSBpbXBsZW1lbnRlci4gLS0+XG5cbiMjIENvbXBhdGliaWxpdHkgYW5kIG1pZ3JhdGlvblxuXG48IS0tIEV4aXN0aW5nIGRhdGEsIHVzZXJzLCBjYWxsZXJzLCBvciBjb25maWd1cmF0aW9ucyBhZmZlY3RlZCwgYW5kIGhvdyB0aGUgdHJhbnNpdGlvbiBoYXBwZW5zLiAtLT5cblxuIyMgVmVyaWZpY2F0aW9uXG5cbjwhLS0gSG93IHRoZSBjaGFuZ2UgaXMgdGVzdGVkIG9yIGRlbW9uc3RyYXRlZCwgaW5jbHVkaW5nIHdoYXQgbmVlZHMgbm8gdGVzdCBhbmQgd2h5LiAtLT5cblxuIyMgT3BlbiBxdWVzdGlvbnNcblxuPCEtLSBVbmRlY2lkZWQgcG9pbnRzLCBlYWNoIHdpdGggaXRzIG9wdGlvbnMuIEVtcHR5IG9uY2UgdGhlIHNwZWNpZmljYXRpb24gaXMgaW1wbGVtZW50YWJsZS4gLS0+XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2NvbmZpZy55bWwnOiAnYmxhbmtfaXNzdWVzX2VuYWJsZWQ6IHRydWUnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRlbXBsYXRlcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBmaWxlcywgc28gYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3QgY3JlYXRlIHRoZW0uXG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8gfHwgIWNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yLCBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeENoYWtyYVRvYXN0ZXIgfSBmcm9tICcuL2ZpeGVycy9jaGFrcmFUb2FzdGVyLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sLCByZWFkQnVuR2xvYmFsU3RvcmUsIHJlc29sdmVCdW5HbG9iYWxTdG9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUZub3hUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMsIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24sIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFJhaWx3YXlpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSwgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdXNlckFnZW50Q29uZmlncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGVuc3VyZVdiRW52RGVmaW5pdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvd2JFbnYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNaXNlVG9tbCwgaGFzU3VwcG9ydGVkQnVuUGluLCBtaW5pbXVtQnVuVmVyc2lvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9taXNlVG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9ucG1yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVR5cGVTY3JpcHRBcGkgfSBmcm9tICcuL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb24sIGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMgfSBmcm9tICcuL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgb25seSB0aGUgZ2xvYmFsIHJlbGVhc2UtYWdlIGdhdGUsIHdpdGhvdXQgdG91Y2hpbmcgYW55IHJlcG9zaXRvcnkuIFNwZWxsZWQgb3V0IGluIGZ1bGxcbiAqIHJhdGhlciB0aGFuIHNob3J0ZW5lZCAoZS5nLiBgZ2F0ZWApIGJlY2F1c2UgdGhlIGRlZmF1bHQgY29tbWFuZCB0YWtlcyBwb3NpdGlvbmFsIHBhdGhzOiBhIHNob3J0XG4gKiBuYW1lIHdvdWxkIHN3YWxsb3cgYSBkaXJlY3RvcnkgdGhhdCBoYXBwZW5zIHRvIHNoYXJlIGl0LlxuICovXG5jb25zdCBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCA9ICdhcHBseS1yZWxlYXNlLWFnZS1nYXRlJztcbi8qKiBTYW1lIG5hbWluZyByYXRpb25hbGUgYXMgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQuICovXG5jb25zdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kID0gJ2dlbmVyYXRlLXVzZXItYWdlbnQtY29uZmlncyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoXG4gICAgICBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCxcbiAgICAgIFwiQXBwbHkgb25seSB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhpcyBtYWNoaW5lJ3MgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzXCJcbiAgICApXG4gICAgLmNvbW1hbmQoXG4gICAgICBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kLFxuICAgICAgXCJPdmVyd3JpdGUgdGhpcyB1c2VyJ3MgYWdlbnQgaW5zdHJ1Y3Rpb24gZmlsZXMgKH4vLmNvZGV4L0FHRU5UUy5tZCwgfi8uY2xhdWRlL0NMQVVERS5tZCwgfi8uZ2VtaW5pL0dFTUlOSS5tZCkgd2l0aCB0aGUgb3JnYW5pemF0aW9uJ3MgZml4ZWQgY29udGVudCBhbmQgbWVyZ2UgdGhlIG9yZ2FuaXphdGlvbidzIHNldHRpbmdzIGludG8gfi8uY2xhdWRlL3NldHRpbmdzLmpzb25cIlxuICAgIClcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZm9yY2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdBcHBseSB3YmZ5IGV2ZW4gd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IHJlY29yZHMgdGhpcyB3YmZ5IHZlcnNpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2YnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdTa2lwIGFkZGluZyBtYW5hZ2VkIGRlcGVuZGVuY2llcyBhbmQgdGhlIGxpbmtlciBwcm9iZSAodGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVmcmVzaGluZyB0aGUgbG9ja2ZpbGUgc3RpbGwgcnVucyknLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRXYmZ5VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcblxuICAvLyBEZWxpYmVyYXRlbHkgYmVmb3JlIHRoZSBCdW4gY2hlY2sgaW4gd2lsbGJvb3N0ZXJpZnlQYXRocygpOiB0aGUgZ2F0ZSBtdXN0IGJlIGFwcGxpYWJsZSBvbiBhXG4gIC8vIG1hY2hpbmUgd2hvc2UgQnVuIGlzIG91dGRhdGVkLCB3aGljaCBpcyBleGFjdGx5IGEgbWFjaGluZSB0aGF0IHN0aWxsIG5lZWRzIGdhdGluZy5cbiAgaWYgKGFyZ3YuX1swXSA9PT0gYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQpIHtcbiAgICBpZiAoIWVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFyZ3YuX1swXSA9PT0gZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCkge1xuICAgIGlmICghKGF3YWl0IGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBhd2FpdCB3aWxsYm9vc3RlcmlmeVBhdGhzKGFyZ3YucGF0aHMgYXMgc3RyaW5nW10sIGFyZ3Yuc2tpcERlcHMsIGFyZ3YuZm9yY2UpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIHNlcnZlciBzcGF3bmVkIGZvciBBU1QgcGFyc2luZyBrZWVwcyBhbiBvcGVuIElQQ1xuICAgIC8vIGNoYW5uZWwgdGhhdCB3b3VsZCBvdGhlcndpc2UgcHJldmVudCB0aGUgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgICBhd2FpdCBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpbGxib29zdGVyaWZ5UGF0aHMocGF0aHM6IHN0cmluZ1tdLCBza2lwRGVwczogYm9vbGVhbiwgZm9yY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQmVmb3JlIGFueXRoaW5nIGVsc2Ug4oCUIGV2ZW4gdGhlIEJ1biBjaGVjayBiZWxvdzogdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgZ2xvYmFsXG4gIC8vIHBhY2thZ2UtbWFuYWdlciBjb25maWdzIG11c3QgcmVjZWl2ZSB0aGUgb3JnJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgb24gRVZFUlkgcnVuLFxuICAvLyBiZWNhdXNlIHRoZXkgYXJlIHdoYXQgZ3VhcmRzIGJyYW5kLW5ldyBsb2NhbCBwcm9qZWN0cyB0aGF0IGhhdmUgbm8gd2JmeS1nZW5lcmF0ZWQgcmVwb3NpdG9yeVxuICAvLyBjb25maWcgeWV0LCBhbmQgdGhhdCBwcm90ZWN0aW9uIG11c3Qgd29yayBiZWZvcmUgdGhlIHN1cHBvcnRlZC12ZXJzaW9uIGNoZWNrLlxuICBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTtcblxuICAvLyB3YmZ5IG1hbmFnZXMgcmVwb3NpdG9yaWVzIHRocm91Z2ggQnVuICsgbWlzZSBhbmQgdXNlcyBCdW4gMS40IHJ1bnRpbWUgQVBJcy4gVGhlIHZlcnNpb24gZmxvb3JcbiAgLy8gYWxzbyBlbnN1cmVzIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgb3B0aW9ucyBwcm9kdWNlIHRoZSBpbnN0YWxsIGxheW91dCB3YmZ5IHZhbGlkYXRlcy4gSXRcbiAgLy8gc3RheXMgdW5jb25kaXRpb25hbCBldmVuIHRob3VnaCB0aGUgYWxyZWFkeS1hcHBsaWVkIGNoZWNrIGJlbG93IGNhbiBtYWtlIGEgcnVuIGEgbm8tb3A6IGFuXG4gIC8vIG91dGRhdGVkIEJ1biBpcyBhIGJyb2tlbiBlbnZpcm9ubWVudCB3YmZ5IG11c3QgcmVwb3J0LCBhbmQgaGlkaW5nIGl0IHdoZW5ldmVyIGV2ZXJ5IHBhdGhcbiAgLy8gaGFwcGVucyB0byBiZSBza2lwcGVkIHdvdWxkIHN1cmZhY2UgaXQgb25seSBsYXRlci5cbiAgY29uc3QgYnVuVmVyc2lvbiA9IEJ1bi52ZXJzaW9uO1xuICBpZiAoQnVuLnNlbXZlci5vcmRlcihidW5WZXJzaW9uLCBtaW5pbXVtQnVuVmVyc2lvbikgPCAwKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2JmeSByZXF1aXJlcyBCdW4gPj0gJHttaW5pbXVtQnVuVmVyc2lvbn0gKGZvdW5kICR7YnVuVmVyc2lvbn0pLiBVcGdyYWRlIEJ1biBhbmQgcmUtcnVuLmApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQSBgLWRpcnR5LWxvY2FsYCBsYWJlbCBpZGVudGlmaWVzIGFuIGVkaXRlZCBjaGVja291dCwgd2hvc2UgbmV4dCBidWlsZCBwcm9kdWNlcyBkaWZmZXJlbnQgZmlsZXNcbiAgLy8gdW5kZXIgdGhlIHNhbWUgbGFiZWwsIHNvIHN1Y2ggYSBydW4gaXMgbmV2ZXIgdHJlYXRlZCBhcyBhbHJlYWR5IGFwcGxpZWQuXG4gIGNvbnN0IHZlcnNpb25MYWJlbCA9IGdldFdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgY29uc3Qgc2tpcHBhYmxlVmVyc2lvbkxhYmVsID1cbiAgICAhZm9yY2UgJiYgdmVyc2lvbkxhYmVsICYmICF2ZXJzaW9uTGFiZWwuZW5kc1dpdGgoJy1kaXJ0eS1sb2NhbCcpID8gdmVyc2lvbkxhYmVsIDogdW5kZWZpbmVkO1xuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGlucHV0RGlyUGF0aCBvZiBwYXRocykge1xuICAgIC8vIE5vcm1hbGl6ZSBvbmNlIGF0IHRoZSBDTEkgYm91bmRhcnkuIEdlbmVyYXRvcnMgdXNlIGRpclBhdGggZm9yIGN3ZCBhbmQgYmFzZW5hbWUgZGVjaXNpb25zO1xuICAgIC8vIGxlYXZpbmcgdGhlIHN1cHBvcnRlZCBkZWZhdWx0IGAuYCB1bnJlc29sdmVkIHdvdWxkIGdlbmVyYXRlIGFuIGludmFsaWQgcGFja2FnZSBuYW1lIG9mIGAuYC5cbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShpbnB1dERpclBhdGgpO1xuICAgIC8vIENvbmZpbmUgZXZlcnkgZ2VuZXJhdGVkIGZpbGUgdG8gdGhpcyByZXBvc2l0b3J5IChzZWUgZnNVdGlsLmdlbmVyYXRlRmlsZSkuIFNldCBCRUZPUkUgYW55XG4gICAgLy8gZml4ZXIgd3JpdGVzLCBhbmQgcmVzZXQgb24gZXZlcnkgaXRlcmF0aW9uIHNvIGEgbXVsdGktcGF0aCBydW4gbmV2ZXIga2VlcHMgdGhlIHByZXZpb3VzIHJvb3QuXG4gICAgZnNVdGlsLnNldFJvb3REaXJQYXRoKGZzLmV4aXN0c1N5bmMocm9vdERpclBhdGgpID8gcm9vdERpclBhdGggOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gQSByZXBvc2l0b3J5IHByZWNvbmRpdGlvbiwgY2hlY2tlZCBiZWZvcmUgdGhlIGFscmVhZHktYXBwbGllZCBza2lwIGJlbG93IGFuZCBiZWZvcmUgYW55IGZpbGVcbiAgICAvLyBpcyB3cml0dGVuOiBhbiB1bnN1cHBvcnRlZCBwaW4gbXVzdCBiZSByZXBvcnRlZCBvbiBldmVyeSBydW4gYW5kIG11c3Qgbm90IHN0YW1wIHRoZSBiYWRnZS5cbiAgICBpZiAoIWhhc1N1cHBvcnRlZEJ1blBpbihyb290RGlyUGF0aCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBTa2lwICR7cm9vdERpclBhdGh9OiBtaXNlLnRvbWwgbXVzdCBwaW4gQnVuIHRvIG9uZSBleGFjdCB2ZXJzaW9uID49ICR7bWluaW11bUJ1blZlcnNpb259IG9yIG9taXQgaXQuIFVwZGF0ZSB0aGUgcGluIGFuZCByZS1ydW4uYFxuICAgICAgKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIFRoZSBiYWRnZSByZWNvcmRzIHRoZSBidWlsZCB0aGF0IGdlbmVyYXRlZCB0aGUgcmVwb3NpdG9yeSdzIGNvbmZpZ3VyYXRpb24sIHNvIHRoZSBzYW1lIGJ1aWxkXG4gICAgLy8gd291bGQgb25seSByZXdyaXRlIHdoYXQgaXMgYWxyZWFkeSB0aGVyZS4gU2tpcHBpbmcgaXMgYSBkZWxpYmVyYXRlIHRyYWRlOiB0aGUgcGFydHMgb2YgYSBydW5cbiAgICAvLyB0aGF0IGRlcGVuZCBvbiBzdGF0ZSBPVVRTSURFIHRoZSByZXBvc2l0b3J5IChHaXRIdWIgc2V0dGluZ3MsIGRlcGVuZGVuY3kgdXBkYXRlcywgdGhlIGZldGNoZWRcbiAgICAvLyAuZ2l0aWdub3JlKSBkbyBnZXQgc2tpcHBlZCB0b28sIHdoaWNoIGlzIHdoYXQgLS1mb3JjZSBpcyBmb3IuXG4gICAgaWYgKHNraXBwYWJsZVZlcnNpb25MYWJlbCAmJiAoYXdhaXQgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKHJvb3REaXJQYXRoKSkgPT09IHNraXBwYWJsZVZlcnNpb25MYWJlbCkge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwICR7cm9vdERpclBhdGh9OiB3YmZ5ICR7c2tpcHBhYmxlVmVyc2lvbkxhYmVsfSBpcyBhbHJlYWR5IGFwcGxpZWQuIFBhc3MgLS1mb3JjZSB0byByZS1hcHBseS5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3QgcGFja2FnZXNTdWJEaXJQYXRocyA9IGRpcmVudHNcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSlcbiAgICAgIC5tYXAoKGQpID0+IHBhdGgucmVzb2x2ZShwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuICAgIC8vIEFsc28gY292ZXIgd29ya3NwYWNlcyBkZWNsYXJlZCBvdXRzaWRlIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdGhleSByZWNlaXZlIHRoZSBzYW1lXG4gICAgLy8gbWFuYWdlZCBjb25maWdzICh0c2NvbmZpZy5qc29uLCBwYWNrYWdlLmpzb24gY29udmVudGlvbnMsIOKApikgYXMgcGFja2FnZXMvKiBjaGlsZHJlbi5cbiAgICBjb25zdCByb290UGFja2FnZUpzb24gPVxuICAgICAgaWdub3JlRXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ11cbiAgICAgICkgPz8ge307XG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoOiByb290RGlyUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uOiByb290UGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogcGFja2FnZXNTdWJEaXJQYXRocy5zb21lKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgICApLFxuICAgIH0pO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gWy4uLm5ldyBTZXQoWy4uLnBhY2thZ2VzU3ViRGlyUGF0aHMsIC4uLndvcmtzcGFjZVN1YkRpclBhdGhzXSldLmZpbHRlcihcbiAgICAgIChzdWJEaXJQYXRoKSA9PiBzdWJEaXJQYXRoICE9PSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpXG4gICAgKTtcblxuICAgIC8vIFJlZnVzZWQgd3JpdGVzIG9uIGNvcmUgbWFuYWdlZCBmaWxlcyB3b3VsZCBsZWF2ZSB0aGUgcmVwb3NpdG9yeSBwYXJ0aWFsbHkgdXBkYXRlZCwgc28gc2tpcFxuICAgIC8vIGl0IEJFRk9SRSBhbnkgbXV0YXRpb24gd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgICBjb25zdCBtYW5hZ2VkRmlsZVBhdGhzID0gW1xuICAgICAgLi4uWycuZ2l0YXR0cmlidXRlcycsICdidW5maWcudG9tbCcsICdsZWZ0aG9vay55bWwnLCAncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgbmFtZSlcbiAgICAgICksXG4gICAgICAuLi5zdWJEaXJQYXRocy5mbGF0TWFwKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBbJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PiBwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgbmFtZSkpXG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3Qgd3JpdGFibGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtYW5hZ2VkRmlsZVBhdGhzLm1hcCgoZmlsZVBhdGgpID0+IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSlcbiAgICApO1xuICAgIGlmICh3cml0YWJsZVJlc3VsdHMuaW5jbHVkZXMoZmFsc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiBhIG1hbmFnZWQgY29uZmlnIGZpbGUgaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmbGlnaHRFcnJvcnMgPSBbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXS5mbGF0TWFwKChkaXJQYXRoKSA9PiB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddO1xuICAgICAgICBjb25zdCBlcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoeyBwYWNrYWdlSnNvbiB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9yID8gW2Ake2RpclBhdGh9OiAke2Vycm9yfWBdIDogW107XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtgJHtwYWNrYWdlSnNvblBhdGh9IGlzIGludmFsaWRgXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocHJlZmxpZ2h0RXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06XFxuJHtwcmVmbGlnaHRFcnJvcnMuam9pbignXFxuJyl9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBMZXQgZ2V0UGFja2FnZUNvbmZpZyBkZXJpdmUgaXNSb290IGZvciB0aGUgZW50cnkgcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBpcyBhXG4gICAgLy8gc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgdGFyZ2V0IG11c3Qga2VlcCBpdHMgY2hpbGQgY2xhc3NpZmljYXRpb24sIHNvIGZvcmNpbmdcbiAgICAvLyBgaXNSb290OiB0cnVlYCBoZXJlIHdvdWxkIGFwcGx5IHJvb3Qtb25seSBwcm9jZXNzaW5nIChsZWZ0aG9vayBpbnN0YWxsLCByb290IHRzY29uZmlnLFxuICAgIC8vIEFHRU5UUy5tZCwg4oCmKSB0byBhIHN1YnBhY2thZ2UuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gRXZlcnkgZGlzY292ZXJlZCB3b3Jrc3BhY2UgKGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKSBpcyBhIGNoaWxkXG4gICAgLy8gcGFja2FnZTsgdGhlIHBhY2thZ2VzLyogaGV1cmlzdGljIGluc2lkZSBnZXRQYWNrYWdlQ29uZmlnIHdvdWxkIG1pc2NsYXNzaWZ5IGFwcHMvKiBhcyByb290cy5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgeyBpc1Jvb3Q6IGZhbHNlIH0pKVxuICAgICk7XG4gICAgY29uc3QgaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoID0gc3ViRGlyUGF0aHMuZmluZChcbiAgICAgIChzdWJEaXJQYXRoLCBpbmRleCkgPT4gIW51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3NbaW5kZXhdICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICApO1xuICAgIGlmIChpbnZhbGlkU3ViUGFja2FnZURpclBhdGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06ICR7aW52YWxpZFN1YlBhY2thZ2VEaXJQYXRofS9wYWNrYWdlLmpzb24gaXMgaW52YWxpZC5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG4gICAgLy8gVGhlIG1hbmFnZWQgaWdub3JlIHJ1bGUgaXMgdW5hbmNob3JlZCwgc28gYSBuZXN0ZWQgY29weSAoZS5nLiB3b3JrZXJzL2FwaS8uZW52LmNsb3VkZmxhcmUpIGlzXG4gICAgLy8gYXMgbXVjaCBhIGxlYWsgYXMgYSByb290IG9uZTsgdGhlIHdpbGRjYXJkIHBhdGhzcGVjIGNvdmVycyBldmVyeSBkZXB0aCBpbiBvbmUgcXVlcnkuXG4gICAgY29uc3QgdHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocyA9IGFsbFBhY2thZ2VDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmlzQ2xvdWRmbGFyZSlcbiAgICAgID8gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICAgICAgICdnaXQnLFxuICAgICAgICAgIFsnLWMnLCAnY29yZS5xdW90ZVBhdGg9ZmFsc2UnLCAnbHMtZmlsZXMnLCAnLS0nLCAnLmVudi5jbG91ZGZsYXJlJywgJyovLmVudi5jbG91ZGZsYXJlJ10sXG4gICAgICAgICAgcm9vdENvbmZpZy5kaXJQYXRoXG4gICAgICAgIClcbiAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCkpXG4gICAgICA6IFtdO1xuICAgIGlmICh0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBTRUNVUklUWSBFUlJPUjogQ2xvdWRmbGFyZSBjcmVkZW50aWFscyBtdXN0IGJlIHVudHJhY2tlZC4gUmVtb3ZlICR7dHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5qb2luKFxuICAgICAgICAgICcsICdcbiAgICAgICAgKX0gZnJvbSBHaXQsIHB1cmdlIHRoZSB0b2tlbiBmcm9tIGhpc3RvcnksIGFuZCByb3RhdGUgQ0xPVURGTEFSRV9BUElfVE9LRU4gYmVmb3JlIHJlcnVubmluZyB3YmZ5LmBcbiAgICAgICk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgYXdhaXQgZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoYWxsUGFja2FnZUNvbmZpZ3MpO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICAvLyBNYW5hZ2VkIHJlcG9zaXRvcmllcyB1c2UgQnVuIHdpdGggbWlzZSAoYW5kIG9wdGlvbmFsbHkgZm5veCkuXG4gICAgY29uc3QgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSA9IHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aCk7XG4gICAgLy8gUm9vdC1sZXZlbCBpbnN0YWxsIGxheW91dCBtdXN0IGNvdmVyIHdvcmtzcGFjZSBhcHBzIHRvbzogTmV4dC5qcyBjb21tb25seSBsaXZlcyB1bmRlclxuICAgIC8vIHBhY2thZ2VzLyogb3IgYXBwcy8qIHdoaWxlIGJ1bmZpZy50b21sIGV4aXN0cyBvbmx5IGF0IHRoZSByZXBvc2l0b3J5IHJvb3QuXG4gICAgY29uc3QgdXNlR2xvYmFsU3RvcmUgPSByZXNvbHZlQnVuR2xvYmFsU3RvcmUoYWxsUGFja2FnZUNvbmZpZ3MsIHByZXZpb3VzQnVuR2xvYmFsU3RvcmUsIHNraXBEZXBzKTtcbiAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZywgdXNlR2xvYmFsU3RvcmUpO1xuICAgIGF3YWl0IGdlbmVyYXRlTWlzZVRvbWwocm9vdENvbmZpZyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVGbm94VG9tbChyb290Q29uZmlnKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZ2VuZXJhdGVGbm94VG9tbCBzbyBpdHMgdHJhbnNhY3Rpb25hbCByZWNpcGllbnQgc3luYyBjYW5ub3QgcmVzdG9yZSBhIHNuYXBzaG90XG4gICAgLy8gb3ZlciBkZWZpbml0aW9ucyBpbnNlcnRlZCBoZXJlLlxuICAgIGF3YWl0IGVuc3VyZVdiRW52RGVmaW5pdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIC8vIHByb21pc2VQb29sLnJ1biByZXNvbHZlcyB3aGVuIGEgdGFzayBTVEFSVFMsIHNvIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgaXMgbm90XG4gICAgLy8gZ3VhcmFudGVlZCB0byBiZSBvbiBkaXNrIHlldDsgdGhlIHByb2JlIGJlbG93IG11c3Qgbm90IHZhbGlkYXRlIGEgc3RhbGUgY29uZmlndXJhdGlvbi5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICAvLyBUaGUgbGF5b3V0IG11c3QgYmUgdmVyaWZpZWQgaW5zdGFsbGFibGUgQkVGT1JFIGFueSBgYnVuIGFkZGAgbXV0YXRlcyBwYWNrYWdlLmpzb24gZmlsZXM6XG4gICAgLy8gcGVyLXBhY2thZ2UgaW5zdGFsbHMgdG9sZXJhdGUgZmFpbHVyZXMgKHNwYXduU3luYyBkaXNjYXJkcyB0aGVpciBzdGF0dXMpLCBzbyBhIGxheW91dCB0aGF0XG4gICAgLy8gY2Fubm90IGluc3RhbGwgd291bGQgc2lsZW50bHkgZHJvcCBldmVyeSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLlxuICAgIC8vIEEgZG9jcy1vbmx5IHJlcG9zaXRvcnkgaGFzIG5vIG1hbmlmZXN0IHRvIHByb2JlIG9uIGl0cyBmaXJzdCBydW47IGdlbmVyYXRlUGFja2FnZUpzb24gYmVsb3dcbiAgICAvLyBjcmVhdGVzIGl0IGJlZm9yZSB0aGUgYXV0aG9yaXRhdGl2ZSByZWZyZXNoQnVuTG9jayBjaGVjay5cbiAgICBpZiAoXG4gICAgICAhc2tpcERlcHMgJiZcbiAgICAgIHJvb3RDb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJlxuICAgICAgIXByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKHJvb3REaXJQYXRoLCByb290Q29uZmlnLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCB1c2VHbG9iYWxTdG9yZSlcbiAgICApIHtcbiAgICAgIC8vIHJlZnJlc2hCdW5Mb2NrIGJlbG93IGlzIHRoZSBhdXRob3JpdHkgb24gd2hldGhlciB0aGUgZmluYWwgaW5zdGFsbCBmYWlsZWQuXG4gICAgICBjb25zb2xlLndhcm4oYGJ1biBpbnN0YWxsIGN1cnJlbnRseSBmYWlscyBpbiAke3Jvb3REaXJQYXRofSB1bmRlciB0aGUgaXNvbGF0ZWQgbGlua2VyLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICAvLyBPdGhlciBvd25lcnMgY2Fubm90IGNhbGwgdGhlIG9yZ2FuaXphdGlvbidzIHJldXNhYmxlIHdvcmtmbG93cyAodGhlaXIgc2VjcmV0cyBhbmQgcnVubmVyc1xuICAgIC8vIGRvIG5vdCBleGlzdCB0aGVyZSksIHNvIGFueSBvdGhlciBHaXRIdWItaG9zdGVkIE5vZGUuanMgcmVwb3NpdG9yeSBnZXRzIHNlbGYtY29udGFpbmVkXG4gICAgLy8gd29ya2Zsb3dzIGluc3RlYWQg4oCUIGtleWVkIG9uIHJlcG9zaXRvcnkgc3RhdGUsIG5ldmVyIG9uIHRoZSBvd25lcidzIGlkZW50aXR5LlxuICAgIC8vIHJvb3RDb25maWcuaXNSb290OiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiAoYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCkga2VlcHNcbiAgICAvLyBpc1Jvb3QgZmFsc2UsIGFuZCBHaXRIdWIgaWdub3JlcyB3b3JrZmxvdyBmaWxlcyBuZXN0ZWQgdW5kZXIgYSBwYWNrYWdlIGRpcmVjdG9yeS5cbiAgICBjb25zdCBzaG91bGRSdW5TZWxmQ29udGFpbmVkV29ya2Zsb3dzID1cbiAgICAgICFzaG91bGRSdW5Xb3JrZmxvd3MgJiZcbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAhIXJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOicpICYmXG4gICAgICByb290Q29uZmlnLmlzUm9vdDtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBmaXhSYWlsd2F5aWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIC4uLihzaG91bGRSdW5TZWxmQ29udGFpbmVkV29ya2Zsb3dzID8gW2dlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICAvLyBHaXQgaG9va3MgYXJlIHJlcG9zaXRvcnktbGV2ZWwgc3RhdGU6IGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIG11c3Qgbm90IHdyaXRlIGFcbiAgICAgIC8vIGNoaWxkIGxlZnRob29rLnltbCBvciByZXBsYWNlIHRoZSBlbmNsb3NpbmcgcmVwb3NpdG9yeSdzIGhvb2sgaW5zdGFsbGF0aW9uLlxuICAgICAgLi4uKHJvb3RDb25maWcuaXNSb290ID8gW2dlbmVyYXRlTGVmdGhvb2socm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgLy8gQWZ0ZXIgdGhlIHdvcmtmbG93IGdlbmVyYXRvciAoYW5kIGl0cyBwb29sZWQgd3JpdGVzKSBzbyB0aGUgaW5zdHJ1Y3Rpb24gZmlsZXMgZGVzY3JpYmUgdGhlXG4gICAgLy8gZmluYWxpemVkIHdvcmtmbG93IGZpbGVzIGluc3RlYWQgb2YgbGFnZ2luZyBvbmUgcnVuIGJlaGluZC5cbiAgICBhd2FpdCBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmNoYWtyYSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkphdmEoY29uZmlnKSkgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIHNraXBEZXBzKTtcblxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZXZlcnkgcG9vbGVkIGdlbmVyYXRvciB3cml0ZSBzbyBub3JtYWxpemF0aW9uIGNhbm5vdCBvdmVyd3JpdGUgYSBjb25jdXJyZW50XG4gICAgLy8gdXBkYXRlLCBhbmQgYmVmb3JlIGNsZWFudXAgc28gZm9ybWF0dGVyIG1ldGFkYXRhIGNhY2hlcyBvYnNlcnZlIHRoZSBjaGFuZ2VkIGZpbGVzLlxuICAgIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhyb290RGlyUGF0aCk7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBmYWlsZWQgaW5zdGFsbCBtdXN0IGZhaWwgdGhlIENMSTogZXhpdGluZyAwIHdpdGggYSBzdGFsZSBvciBtaXNzaW5nIEJ1biBsb2NrZmlsZSB3b3VsZFxuICAgICAgLy8gaGlkZSBhIGJyb2tlbiBtYW5hZ2VkIGNvbmZpZ3VyYXRpb24uXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gQnVuIHdyaXRlcyBidW4ubG9jayBiZWZvcmUgbGlmZWN5Y2xlIHNjcmlwdHMsIHNvIGEgZmFpbGVkIGluc3RhbGwgY2FuIHN0aWxsIGxlYXZlIEd1YXJkXG4gICAgICAvLyBVUkxzIGJlaGluZC4gTm9ybWFsaXplIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBvdXRwdXQgd2l0aG91dCByZXBsYWNpbmcgdGhlIGluc3RhbGwgZXJyb3IuXG4gICAgICBjb25zdCBub3JtYWxpemVkTG9ja2ZpbGVQYXRoID0gbm9ybWFsaXplQnVuTG9ja2ZpbGUocm9vdERpclBhdGgpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGgpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtub3JtYWxpemVkTG9ja2ZpbGVQYXRofSB0byBrZWVwIGl0IHJlZ2lzdHJ5LWFnbm9zdGljLmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbm9ybWFsaXplIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHNwYXduU3luYygnYnVuJywgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gaGFzSW52YWxpZFBhY2thZ2VDb25maWc7XG59XG5cbi8qKlxuICogUHJvYmVzIGBidW4gaW5zdGFsbGAgdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci4gQW4gaW5jb21wYXRpYmlsaXR5IG11c3QgYmUgZml4ZWQgaW4gdGhlXG4gKiByZXBvc2l0b3J5IG9yIGluIHdiZnkncyBtYW5hZ2VkIGxpc3RzLCBuZXZlciBieSBzd2l0Y2hpbmcgdGhlIGxpbmtlci4gUmV0dXJucyBmYWxzZSB3aGVuIHRoZVxuICogaW5zdGFsbCBmYWlscy5cbiAqL1xuZnVuY3Rpb24gcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgLy8gQSBsYXlvdXQgc3dpdGNoIG11c3QgcHJvYmUgZnJvbSBhIGNsZWFuIHRyZWUgYmVjYXVzZSBCdW4gZG9lcyBub3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBsYXlvdXQncyBsZWZ0b3ZlcnMuXG4gIGlmIChwcmV2aW91c0dsb2JhbFN0b3JlICE9PSB1c2VHbG9iYWxTdG9yZSkge1xuICAgIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgfVxuICAvLyBSZXRyeSBvbmNlIHNvIGEgdHJhbnNpZW50IGZhaWx1cmUgKHJlZ2lzdHJ5IGhpY2N1cCwgZmxha3kgbGlmZWN5Y2xlIHNjcmlwdCkgZG9lcyBub3RcbiAgLy8gbWFzcXVlcmFkZSBhcyBhIGxheW91dCBpbmNvbXBhdGliaWxpdHkuXG4gIGlmIChzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSkgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBmYWlsZWQgYXR0ZW1wdCBzbyBsYXRlciBpbnN0YWxscyBkbyBub3QgcnVuIG9uIGEgcG9sbHV0ZWQgdHJlZS5cbiAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoOiBzdHJpbmcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gQ292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlOiBsZWZ0b3ZlcnMgY2FuIGtlZXAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgcmVzb2x2YWJsZS5cbiAgY29uc3Qgbm9kZU1vZHVsZXNQYXRocyA9IFtcbiAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSxcbiAgICAuLi5bLi4uZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykudmFsdWVzKCldLm1hcCgod29ya3NwYWNlRGlyKSA9PlxuICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCB3b3Jrc3BhY2VEaXIsICdub2RlX21vZHVsZXMnKVxuICAgICksXG4gIF07XG4gIC8vIE5ldmVyIGRlbGV0ZSB0aHJvdWdoIGEgd29ya3NwYWNlIHN5bWxpbmsgdGhhdCBlc2NhcGVzIHRoaXMgcmVwb3NpdG9yeS5cbiAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2Ygbm9kZU1vZHVsZXNQYXRocykge1xuICAgIGNvbnN0IHJlYWxQYXJlbnREaXJQYXRoID0gaWdub3JlRXJyb3IoKCkgPT4gZnMucmVhbHBhdGhTeW5jKHBhdGguZGlybmFtZShub2RlTW9kdWxlc1BhdGgpKSk7XG4gICAgaWYgKFxuICAgICAgIXJlYWxQYXJlbnREaXJQYXRoIHx8XG4gICAgICAocmVhbFBhcmVudERpclBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJiAhcmVhbFBhcmVudERpclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpO1xuICBpZiAoc3RhdHVzID09PSAwKSByZXR1cm47XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNDIsNDMsNDQsNDUsNDYsNDddLCJtYXBwaW5ncyI6Iit5QkFBQSxl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