@willbooster/wbfy 20.28.6 → 20.28.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +6 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -195,11 +195,16 @@ ${Xi(H.markdownLike)}
|
|
|
195
195
|
max_line_length = off
|
|
196
196
|
trim_trailing_whitespace = false
|
|
197
197
|
|
|
198
|
+
[{.gitignore,.prettierignore}]
|
|
199
|
+
end_of_line = unset
|
|
200
|
+
trim_trailing_whitespace = false
|
|
201
|
+
|
|
198
202
|
[{Makefile,*.mk}]
|
|
199
203
|
indent_style = tab
|
|
200
204
|
`;async function Yi(e){return O.functionIgnoringException(`generateEditorconfig`,async()=>{let n=t.resolve(e.dirPath,`.editorconfig`);await j.runAndWaitForReturnValue(()=>A.generateFile(n,Ji))})}function Xi(e){return e.length>1?`[*.{${e.join(`,`)}}]`:`[*.${e[0]}]`}const Zi={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:`MEDIUM`,max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:[`**/__generated__`]};async function Qi(n,r){return O.functionIgnoringException(`generateGeminiConfig`,async()=>{if(!n.isRoot)return;let i=t.resolve(n.dirPath,`.gemini`),a=t.resolve(i,`config.yaml`),o=t.resolve(i,`config.yml`),s=t.resolve(i,`styleguide.md`),c=!!await e.promises.lstat(o).catch(()=>{});c&&console.warn(`Skipped generating ${a} because ${o} is not a supported Gemini config location. Rename it manually.`);let l=structuredClone(Zi),u=c?void 0:await A.readFileConfinedIfExists(a);if(u!==void 0)try{let e=Bun.YAML.parse(u);e&&typeof e==`object`&&!Array.isArray(e)&&(l=d.all([l,e,l],{arrayMerge:nn}))}catch{}let f=Bun.YAML.stringify(l,void 0,2),p=await yi(n.dirPath),m=p?.trimStart().startsWith(`#`)?void 0:p,h=`Review in ${Ci(n)} based on the following coding standards.\n\n${wi(n,r)}${m?`\n${m.trimEnd()}`:``}`;await Be([...c?[]:[()=>A.generateFile(a,f)],()=>A.generateFile(s,h)])})}const $i=`* text=auto
|
|
201
205
|
|
|
202
206
|
.gitignore -text
|
|
207
|
+
.prettierignore -text
|
|
203
208
|
|
|
204
209
|
*.lockb binary diff=lockb
|
|
205
210
|
*.vcproj text eol=crlf
|
|
@@ -513,4 +518,4 @@ ${pe(fe)}
|
|
|
513
518
|
`);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Fu(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of ju){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Iu(a)&&(Ru(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Iu(e){return Lu(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 Lu(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function Ru(e){return Nu.some(t=>t.test(e))}const zu=`apply-release-age-gate`,Bu=`generate-user-agent-configs`;async function Vu(){let e=await o(process.argv.slice(2)).command(zu,`Apply only the organization's minimum-release-age policy to this machine's global package-manager configs`).command(Bu,`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 and ~/.gemini/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(yn()).strict().argv;if(D.isVerbose=e.verbose,e._[0]===zu){sa()||(process.exitCode=1);return}if(e._[0]===Bu){await Rl()||(process.exitCode=1);return}let t=!1;try{t=await Hu(e.paths,e.skipDeps,e.force)}finally{await We()}t&&(process.exitCode=1)}async function Hu(n,r,i){sa();let a=Bun.version;if(Bun.semver.order(a,`1.4.0`)<0)return console.error(`wbfy requires Bun >= 1.4.0 (found ${a}). Upgrade Bun and re-run.`),!0;let o=xn(),s=!i&&o&&!o.endsWith(`-dirty-local`)?o:void 0,c=!1;for(let i of n){let n=t.resolve(i);if(A.setRootDirPath(e.existsSync(n)?n:void 0),s&&await Ic(n)===s&&Mi(n)){console.info(`Skip ${n}: wbfy ${s} is already applied. Pass --force to re-apply.`);continue}let a=t.join(n,`packages`),o=(await ge(()=>e.promises.readdir(a,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.resolve(a,e.name)),l=cn({dirPath:n,packageJson:he(()=>JSON.parse(e.readFileSync(t.resolve(n,`package.json`),`utf8`)))??{},doesContainSubPackageJsons:o.some(n=>e.existsSync(t.resolve(n,`package.json`)))}),u=[.../* @__PURE__ */ 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=>A.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=Wr({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(`
|
|
514
519
|
`)}`),c=!0;continue}let p=await Hr(n);if(D.isVerbose,!p){console.error(`there is no valid package.json in ${n}`),c=!0;continue}let m=await Promise.all(u.map(e=>Hr(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)],ee=g.some(e=>e.isCloudflare)?z(`git`,[`-c`,`core.quotePath=false`,`ls-files`,`--`,`.env.cloudflare`,`*/.env.cloudflare`],p.dirPath).split(`
|
|
515
520
|
`).filter(Boolean).map(e=>t.resolve(p.dirPath,e)):[];if(ee.length>0){console.error(`SECURITY ERROR: Cloudflare credentials must be untracked. Remove ${ee.join(`, `)} from Git, purge the token from history, and rotate CLOUDFLARE_API_TOKEN before rerunning wbfy.`),c=!0;continue}let _=fr(p);if(await gu(g),D.isVerbose)for(let e of g)console.info(e);Pu(g);let v=Ni(n),y=Pi(g,v,r);await Ii(p,y),await lu(p),await Dt(p),await Wl(p,g),!r&&p.doesContainPackageJson&&!Uu(n,p,v,y)&&console.warn(`bun install currently fails in ${n} under the isolated linker.`);let b=!Qn(p.repository)&&(p.repository?.startsWith(`github:WillBooster/`)||p.repository?.startsWith(`github:WillBoosterLab/`)),te=!b&&!Qn(p.repository)&&!!p.repository?.startsWith(`github:`)&&p.isRoot;await _,await Promise.all([Lc(p),qi(p),Yi(p),Qi(p,g),ea(p),Au(p),la(p),kc(p),il(p),el(p),...b?[Zn(p)]:[],...te?[eu(p,g)]:[],vu(p),Su(p),Eu(p),...p.isRoot?[ic(p,g)]:[]]),await _i(p,g);let x=[];for(let e of g)e.depending.playwrightTest&&x.push(at(e)),e.depending.next&&x.push(qe(e)),e.depending.chakra&&x.push(et(e)),await ra(e,p),(e.isRoot||e.doesContainPackageJson)&&(ca(e)&&await Ec(e),await Oo(e,p,r),e.doesContainVscodeSettingsJson&&x.push(Vl(e)),U(e)?(x.push(cl(e)),x.push(bc(e)),x.push(Cc(e,p))):!e.isRoot&&e.doesContainPackageJson&&U(p)&&x.push(Cc(e,p)),e.depending.pyright&&x.push(Oc(e)));await Promise.all(x),ta(n);try{Gu(n)}catch(e){console.error(`Failed to refresh the Bun lockfile:`,e?.message??e),c=!0}try{let e=Pe(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}Fr(`bun`,[`cleanup`],n)}return c}function Uu(e,t,n,r){return n!==r&&Wu(e,t),Ir(`bun`,[`install`],e,1)===0||(Wu(e,t),!1)}function Wu(n,r){let i=[t.resolve(n,`node_modules`),...[...Es(r).values()].map(e=>t.resolve(n,e,`node_modules`))],a=e.realpathSync(n);for(let n of i){let r=he(()=>e.realpathSync(t.dirname(n)));r&&(r===a||r.startsWith(a+t.sep))&&e.rmSync(n,{recursive:!0,force:!0})}}function Gu(e){let t=Ir(`bun`,[`install`],e,1);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await Vu();
|
|
516
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImNoaWxkX3Byb2Nlc3MiLCJpc1BsYWluT2JqZWN0IiwiZnMiLCJ5YW1sIiwieWFtbCIsInBhcnNlSnNvbmMiLCJmc3AiLCJyZWxlYXNlQWdlR2F0ZS5kYXlzIiwicmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMiLCJyZWxlYXNlQWdlR2F0ZS50ZW1wb3JhcnlFeGNsdWRlcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJjb21tb25Db250ZW50Iiwic29ydE9iamVjdEtleXMiLCJnaXRIb29rcyIsImRldGVjdE5ld2xpbmUiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJjb3JlIiwieWFtbCIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50IiwieWFtbCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL2dpdGh1YlRlbXBsYXRlcy50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy90ZXh0LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvdGVzdGluZ1J1bGVzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9idW5Xb3Jrc3BhY2VzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvd3JpdGVGaWxlQXRvbWljLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9idW5Mb2NrZmlsZS50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZG9ja2VyZmlsZS50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZ2xvYi50cyIsIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvdXRpbHMvdHlwZXNjcmlwdEFwaS50cyIsIi4uL3NyYy9maXhlcnMvbmV4dENvbmZpZy50cyIsIi4uL3NyYy9maXhlcnMvY2hha3JhVG9hc3Rlci50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Zub3hUb21sLnRzIiwiLi4vc3JjL3V0aWxzL21lcmdlVXRpbC50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3dvcmtzcGFjZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvc2hlbGxQYXJzZXIudHMiLCIuLi9zcmMvdXRpbHMveWFtbFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvd1J1bm5lclBvbGljeS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2pzb25jVXRpbC50cyIsIi4uL3NyYy91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dsb2JhbFJlbGVhc2VBZ2VHYXRlLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL3V0aWxzL2dlbkkxOG5Ucy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9zb3J0LW9iamVjdC1rZXlzQDIuMS4wLTE4ZGYyZjgzN2U2ZWMyOWEvbm9kZV9tb2R1bGVzL3NvcnQtb2JqZWN0LWtleXMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LWluZGVudEA3LjAuMi02Yjc1ZGMwZjU2NTMzYmQ5L25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2RldGVjdC1uZXdsaW5lQDQuMC4xLTVkYTlkZjY1MTI1ZWU3OTUvbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2dpdC1ob29rcy1saXN0QDQuMi4xLTZjYTJiMjY5ZDkxNjMzMmUvbm9kZV9tb2R1bGVzL2dpdC1ob29rcy1saXN0L2luZGV4Lmpzb24iLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvaXMtcGxhaW4tb2JqQDQuMS4wLTQ3ZmRkZDc3MDY0OGU1Nzcvbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9zb3J0LXBhY2thZ2UtanNvbkA0LjAuMC04M2QwYWZmY2JiOWIzYzg1L25vZGVfbW9kdWxlcy9zb3J0LXBhY2thZ2UtanNvbi9pbmRleC5qcyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9sZWZ0aG9vay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2NvbmZpZ0NvbnRlbnQudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9tYW5hZ2VkQ29uZmlnQmxvY2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGZtdENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294bGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWFkbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWxlYXNlcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb25jLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy91c2VyQWdlbnRDb25maWdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93YkVudi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21pc2VUb21sLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbnBtcmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9ydWxlc2V0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc2VjdGlvbiBvZiBhIFBSIG9yIGlzc3VlIGJvZHk6IGl0cyBoZWFkaW5nIGFuZCB3aGF0IHRoZSBzZWN0aW9uIG11c3Qgc3RhdGUuIGByZXF1aXJlbWVudGBcbiAqIHN0YXJ0cyBsb3dlcmNhc2UgYW5kIGVuZHMgd2l0aG91dCBwdW5jdHVhdGlvbiwgc28gdGhhdCBpdCByZWFkcyBib3RoIGFzIGEgcGxhY2Vob2xkZXIgc2VudGVuY2VcbiAqIChjYXBpdGFsaXplZCwgd2l0aCBhIHBlcmlvZCBhcHBlbmRlZCkgYW5kIGFzIGEgY2hlY2tsaXN0IGNsYXVzZSBhZnRlciB0aGUgaGVhZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVNlY3Rpb24ge1xuICByZWFkb25seSBoZWFkaW5nOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcXVpcmVtZW50OiBzdHJpbmc7XG59XG5cbi8qKiBTZWN0aW9ucyBvZiBhIHB1bGwgcmVxdWVzdCBib2R5LCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFBSIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHtcbiAgICBoZWFkaW5nOiAnV2h5JyxcbiAgICByZXF1aXJlbWVudDogJ3RoZSBwcm9ibGVtLCB3aXRoIHRoZSBudW1iZXJzIG9yIG9ic2VydmF0aW9ucyBiZWhpbmQgaXQsIGFuZCB3aHkgdGhpcyBhcHByb2FjaCBvdmVyIHRoZSBhbHRlcm5hdGl2ZXMnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1JlcXVpcmVtZW50cycsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICBcInRoZSByZXF1aXJlbWVudHMgdGhlIGNoYW5nZSBtdXN0IHNhdGlzZnkgYW5kIHRoZSBndWFyYW50ZWVzIGl0IG11c3Qga2VlcCBhcyB0aGV5IHN0YW5kIG5vdywgb25lIHBlciBsaW5lLCBlYWNoIG1hcmtlZCBgcmVxdWlyZWRgIChhc2tlZCBmb3IgYnkgdGhlIHJlcXVlc3Rlciwgb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24pIG9yIGBjaG9zZW5gICh0aGUgaW1wbGVtZW50ZXIncyBvd24gZGVjaXNpb24gd2l0aCB0aGUgcmVhc29uIHRoYXQgZGVjaWRlZCBpdCwgd2hpY2ggYSBzaW1wbGVyIGRlc2lnbiBtYXkgcmVwbGFjZSk7IHN0YXRlIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgaW4gdGhlIHJlcXVlc3RlcidzIHRlcm1zLCB3aGV0aGVyIHRoZXkgY2FtZSBmcm9tIGFuIGlzc3VlIG9yIGEgY29udmVyc2F0aW9uLCBhbmQga2VlcCBlYWNoIGxpbmUgYXMgaXQgaXMgdW50aWwgdGhlIHJlcXVlc3RlciBvdmVycmlkZXMgb3Igd2l0aGRyYXdzIHRoZSBpbnN0cnVjdGlvbiBiZWhpbmQgaXQgb3IgdGhlIGRlY2lzaW9uIGJlaGluZCBpdCBjaGFuZ2VzLCBhbmQgdGhlbiByZXdyaXRlIG9yIHJlbW92ZSB0aGF0IGxpbmUgaW5zdGVhZCBvZiBhZGRpbmcgb25lIGJlc2lkZSBpdFwiLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0N1c3RvbWVyIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2JlaGF2aW9yLCB3b3JrZmxvdywgb3IgdXNlci12aXNpYmxlIGNoYW5nZXMsIHdyaXR0ZW4gZm9yIHJlYWRlcnMgd2hvIGtub3cgbm90aGluZyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24nLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1RlY2huaWNhbCBTdW1tYXJ5JyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdkZWNpc2lvbnMgYW5kIHRoZWlyIHJlYXNvbnMsIGRhdGEgZmxvdywgd2hlcmUgdG8gbG9vayAodGhlIGZpbGVzIHRoYXQgbWF0dGVyIG1vc3QpLCBhbmQgd2hhdCB0byBjaGVjayBoYXJkZXN0OiB0aGUgcGFydHMgd2hvc2UgY29ycmVjdG5lc3MgaXMgYXJndWVkIHJhdGhlciB0aGFuIHByb3ZlbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVzdGluZycsXG4gICAgcmVxdWlyZW1lbnQ6ICdjb21tYW5kcyBydW4sIHRlc3RzIGFkZGVkLCBhbmQgd2hhdCB3YXMgTk9UIGV4ZXJjaXNlZCBhbmQgd2h5JyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdOb3RlcycsXG4gICAgcmVxdWlyZW1lbnQ6ICdrbm93biBsaW1pdGF0aW9ucywgY29tcGF0aWJpbGl0eSBhbmQgbWlncmF0aW9uLCBmb2xsb3ctdXAgd29yazsgZGVsZXRlIHRoaXMgc2VjdGlvbiBpZiB0aGVyZSBpcyBub25lJyxcbiAgfSxcbl07XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IHdyaXRlcyBvciByZXdyaXRlcyBhIFBSIGJvZHkgZGVyaXZlcyBpdCBmcm9tIHRoZSByZXBvc2l0b3J5J3MgUFIgdGVtcGxhdGUsIGFzXG4gKiBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy4gU3RhdGVkIG9uY2UgaGVyZSBhbmQgcmVuZGVyZWQgYnkgZXZlcnkgd3JpdGVyICh0aGVcbiAqIGdlbmVyYXRlZCBhZ2VudCBpbnN0cnVjdGlvbnMsIHRoZSBQUi1kcmFmdGluZyBza2lsbHMpIHNvIHRoZSB3cml0ZXJzIGNhbm5vdCBkcmlmdCBhcGFydDsgdGhlXG4gKiB0ZW1wbGF0ZS1sZXNzIGJyYW5jaCBsZXRzIHRoZSBzYW1lIHRleHQgc2VydmUgcmVwb3NpdG9yaWVzIG91dHNpZGUgdGhlIG9yZ2FuaXphdGlvbi5cbiAqL1xuY29uc3QgUFVMTF9SRVFVRVNUX1RFTVBMQVRFX1JVTEVTID0gYC0gQmFzZSB0aGUgUFIgYm9keSBvbiBcXGAuZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZFxcYCB3aGVuIGNyZWF0aW5nIG9yIHVwZGF0aW5nIGEgUFIsIGV2ZW4gd2hlbiBhIHNraWxsIG9yIHdvcmtmbG93IHN1cHBsaWVzIGl0cyBvd24gc2tlbGV0b246IGtlZXAgdGhlIHRlbXBsYXRlJ3MgaGVhZGluZ3MgaW4gb3JkZXIsIGZpbGwgZWFjaCBzZWN0aW9uIHdpdGggd2hhdCBpdHMgcGxhY2Vob2xkZXIgY29tbWVudCBhc2tzIGZvciBhdCBhIGxlbmd0aCBmaXR0aW5nIHRoZSBjaGFuZ2UgKGEgc2VudGVuY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBudW1iZXJlZCBzdWJzZWN0aW9ucyBmb3IgYSBsYXJnZSBvbmUpLCBhbmQgZGVsZXRlIHRoZSBwbGFjZWhvbGRlciBjb21tZW50cyBhbmQgYW4gZW1wdHkgTm90ZXMgc2VjdGlvbi4gV2l0aG91dCBhIHRlbXBsYXRlLCB1c2Ugbm8gZml4ZWQgaGVhZGluZ3M6IHN0YXRlIHRoZSBzY29wZSwgdGhlIG1vdGl2YXRpb24sIGFuZCB0aGUgdmVyaWZpY2F0aW9uIGNvbmNpc2VseS5cbi0gU3RhcnQgdGhlIGJvZHkgd2l0aCBcXGBDbG9zZSAjPG4+XFxgIG9ubHkgd2hlbiB0aGUgUFIgcmVzb2x2ZXMgYW4gZXhpc3RpbmcgaXNzdWUuYDtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgd3JpdGVzIG9yIHJld3JpdGVzIGEgUFIgYm9keSBmaWxscyB0aGUgUmVxdWlyZW1lbnRzIHNlY3Rpb24gb2ZcbiAqIGBQVUxMX1JFUVVFU1RfU0VDVElPTlNgLCBhcyBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy4gU2tpbGxzIHRoYXQgZHJhZnQgUFJcbiAqIGJvZGllcyByZW5kZXIgdGhpcyB0ZXh0IGluc3RlYWQgb2YgcmVzdGF0aW5nIGl0LCBzbyB0aGUgd3JpdGVycyBhbmQgdGhlIHJldmlld2VycyB0aGF0IHJlYWQgdGhlXG4gKiBzZWN0aW9uIGFzIHRoZSBib3VuZGFyeSBhIGZpeCBtdXN0IGtlZXAgbmV2ZXIgZGlzYWdyZWUgb24gd2hhdCBhIGxpbmUgbWVhbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfUkVRVUlSRU1FTlRTX1JVTEVTID0gYC0gUmVxdWlyZW1lbnRzIHNlY3Rpb246IHRoZSByZXF1aXJlbWVudHMgaW4gZm9yY2Ugbm93LCBvbmUgbGluZSBwZXIgcmVxdWlyZW1lbnQsIHRha2VuIGZyb20gdGhlIHJlcXVlc3RlcidzIGluc3RydWN0aW9ucyBpbiB0aGUgcmVxdWVzdGVyJ3MgdGVybXMgKHRoZSBpc3N1ZSwgdGhlIGNvbnZlcnNhdGlvbiB0aGF0IGFza2VkIGZvciB0aGUgY2hhbmdlKSwgZWFjaCBtYXJrZWQgXFxgcmVxdWlyZWRcXGAgKGFza2VkIGZvciwgb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24pIG9yIFxcYGNob3NlblxcYCAoeW91ciBvd24gZGVjaXNpb24gd2l0aCB0aGUgcmVhc29uIHRoYXQgZGVjaWRlZCBpdCwgd2hpY2ggYSBzaW1wbGVyIGRlc2lnbiBtYXkgcmVwbGFjZSkuIE5ldmVyIGluZmVyIGEgcmVxdWlyZW1lbnQgZnJvbSB0aGUgZGlmZjogd2hlbiBubyBpc3N1ZSwgUFIgbWVzc2FnZSwgb3IgY29udmVyc2F0aW9uIHN0YXRlcyB0aGUgcmVxdWVzdCwgd3JpdGUgXFxgcmVxdWlyZWQ6IG5vdCByZWNvcmRlZCDigJQgYXNrIHRoZSByZXF1ZXN0ZXJcXGAgYXMgdGhlIG9ubHkgcmVxdWVzdC1kZXJpdmVkIGxpbmUgKGEgXFxgcmVxdWlyZWRcXGAgbGluZSBmb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24gbWF5IHN0aWxsIGJlIGxpc3RlZCkgYW5kIHNheSBzbyBpbiBOb3Rlcy5cbi0gQ3VycmVudC1zdGF0ZSBydWxlOiBhbiBleGlzdGluZyBSZXF1aXJlbWVudHMgc2VjdGlvbiByZWNvcmRzIHdoYXQgdGhlIHJlcXVlc3RlciBhc2tlZCBmb3IgYW5kIHdoYXQgd2FzIGRlY2lkZWQgYXMgaXQgc3RhbmRzIG5vdzsgaXQgaXMgbmVpdGhlciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkaWZmIG5vciBhIGxvZyBvZiBob3cgdGhlIHJlcXVlc3QgZXZvbHZlZC4gS2VlcCBlYWNoIGxpbmUgYXMgaXQgaXMgdW50aWwgdGhlIHJlcXVlc3RlciBvdmVycmlkZXMgb3Igd2l0aGRyYXdzIHRoZSBpbnN0cnVjdGlvbiBiZWhpbmQgaXQgb3IgdGhlIGRlY2lzaW9uIGJlaGluZCBpdCBjaGFuZ2VzLCBhbmQgdGhlbiByZXdyaXRlIG9yIHJlbW92ZSB0aGF0IGxpbmUgaW5zdGVhZCBvZiBhcHBlbmRpbmcgYSBsaW5lIGJlc2lkZSBpdDsgd2l0aCBubyBpbnN0cnVjdGlvbnMgYXZhaWxhYmxlLCBrZWVwIHRoZSByZXF1ZXN0ZXItZGVyaXZlZCBsaW5lcyB1bmNoYW5nZWQuIE5ldmVyIG1hcmsgd2hlbiBhIGxpbmUgd2FzIGFkZGVkIChlLmcuLCBcIihhZGRlZClcIiksIGFuZCBhZGQgYSBcXGBjaG9zZW5cXGAgbGluZSBmb3IgZWFjaCBuZXcgZGVjaXNpb24uIFdoZW4gdGhlIGN1cnJlbnQgZGVzaWduIGNhbm5vdCBiZSB1bmRlcnN0b29kIHdpdGhvdXQgdGhlIGNoYW5nZSBvZiBkaXJlY3Rpb24sIHN0YXRlIGl0IGluIG9uZSBzZW50ZW5jZSBpbiBOb3Rlcy4gQSBzZWN0aW9uIHRoYXQgbWVyZWx5IGRlc2NyaWJlcyB0aGUgaW1wbGVtZW50YXRpb24sIG9yIGhvbGRzIG9ubHkgdGhlIHRlbXBsYXRlJ3MgcGxhY2Vob2xkZXIgb3IgYSBcXGByZXF1aXJlZDogbm90IHJlY29yZGVkXFxgIGxpbmUsIGlzIG5vdCBhIHJlY29yZDogd3JpdGUgaXQgYWZyZXNoIGJ5IHRoZSBydWxlIGFib3ZlLlxuLSBQbGFjZSB0aGUgc2VjdGlvbiB3aGVyZSB0aGUgdGVtcGxhdGUgcHV0cyBpdDsgd2hlbiB0aGUgdGVtcGxhdGUgaGFzIG5vIHN1Y2ggaGVhZGluZywgcmlnaHQgYWZ0ZXIgdGhlIGlzc3VlLWNsb3NpbmcgbGluZSwgb3IgYXQgdGhlIHRvcCBvZiB0aGUgYm9keSB3aGVuIHRoZXJlIGlzIG5vbmUuXG4tIE5ldmVyIGRyb3Agb3Igd2Vha2VuIGEgXFxgcmVxdWlyZWRcXGAgbGluZSB0byBmaXQgd2hhdCB3YXMgaW1wbGVtZW50ZWQ6IHdoZW4gb25lIGNhbm5vdCBob2xkIGluIHRoZSBkaWZmLCBrZWVwIGl0IGFuZCBzYXkgc28gaW4gTm90ZXMuYDtcblxuLyoqIFRoZSBjb21wbGV0ZSBydWxlcyBmb3Igd3JpdGluZyBhIFBSIGJvZHk6IHRoZSB0ZW1wbGF0ZSBydWxlcyBmb2xsb3dlZCBieSB0aGUgUmVxdWlyZW1lbnRzIHJ1bGVzLiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9CT0RZX1JVTEVTID0gYCR7UFVMTF9SRVFVRVNUX1RFTVBMQVRFX1JVTEVTfVxcbiR7UFVMTF9SRVFVRVNUX1JFUVVJUkVNRU5UU19SVUxFU31gO1xuXG4vKipcbiAqIEhvdyBhIHRvb2wgdGhhdCBjcmVhdGVzIGFuIGlzc3VlIGRlcml2ZXMgaXQgZnJvbSB0aGUgcmVwb3NpdG9yeSdzIGlzc3VlIHRlbXBsYXRlcywgYXMgbWFya2Rvd25cbiAqIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zOyBzaGFyZWQgYnkgdGhlIHNhbWUgd3JpdGVycyBhcyBgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVNgLlxuICogR3VpZGFuY2UgdGhlIHRlbXBsYXRlcyBzdGF0ZSBpbiB0aGVpciBvd24gcGxhY2Vob2xkZXIgY29tbWVudHMgKHdoaWNoIHNlY3Rpb25zIHRvIGtlZXAsIGRlbGV0aW5nXG4gKiB0aGUgY29tbWVudHMpIGlzIGRlbGliZXJhdGVseSBub3QgcmVwZWF0ZWQgaGVyZSwgc2luY2UgdGhlIHdyaXRlciByZWFkcyB0aGUgdGVtcGxhdGUgYW55d2F5LlxuICovXG5leHBvcnQgY29uc3QgSVNTVUVfVEVNUExBVEVfUlVMRVMgPSBgLSBGb2xsb3cgdGhlIGNsb3Nlc3QgdGVtcGxhdGUgdW5kZXIgXFxgLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9cXGA6IFxcYGJ1Zy5tZFxcYCBmb3Igd3JvbmcgYmVoYXZpb3IsIFxcYGNoYW5nZS5tZFxcYCBmb3IgYW55dGhpbmcgdG8gYnVpbGQgb3IgYWx0ZXI7IGEgcXVlc3Rpb24gb3Igbm90ZSBmaXR0aW5nIG5laXRoZXIsIG9yIGEgcmVwb3NpdG9yeSB3aXRob3V0IHRlbXBsYXRlcywgbmVlZHMgbm8gdGVtcGxhdGUuXG4tIFRpdGxlOiBhIENvbnZlbnRpb25hbCBDb21taXRzIHByZWZpeCBmb3IgdGhlIHR5cGUgdGhhdCBmaXRzIHRoZSBjaGFuZ2UgKFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgLCBcXGByZWZhY3RvcjpcXGAsIFxcYGRvY3M6XFxgLCBcXGBjaG9yZTpcXGAsIC4uLik7IHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSB0ZW1wbGF0ZSdzIFxcYHRpdGxlXFxgIHByZWZpeCwgcmVwbGFjZSB0aGUgdGVtcGxhdGUncyB0eXBlIGxhYmVsIChcXGB0OiAuLi5cXGApIHdpdGggdGhlIG9uZSBtYXRjaGluZyB0aGUgdHlwZS5cbi0gVGhlIFlBTUwgZnJvbnQgbWF0dGVyIGJldHdlZW4gdGhlIFxcYC0tLVxcYCBsaW5lcyBpcyBtZXRhZGF0YSwgbm90IGJvZHkgdGV4dDogcGFzcyBpdHMgXFxgbGFiZWxzXFxgIHZpYSBcXGAtLWxhYmVsXFxgIGFuZCBzdWJtaXQgb25seSB0aGUgY29udGVudCBiZWxvdyB0aGUgY2xvc2luZyBcXGAtLS1cXGAgYXMgdGhlIGJvZHkuYDtcblxuLyoqIFNlY3Rpb25zIG9mIGEgYnVnIHJlcG9ydCwgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBpc3N1ZSB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBjb25zdCBCVUdfSVNTVUVfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7IGhlYWRpbmc6ICdQcm9ibGVtJywgcmVxdWlyZW1lbnQ6ICd3aGF0IGhhcHBlbnMsIGFuZCB3aGF0IHNob3VsZCBoYXBwZW4gaW5zdGVhZCcgfSxcbiAgeyBoZWFkaW5nOiAnRXZpZGVuY2UnLCByZXF1aXJlbWVudDogJ3JlcHJvZHVjdGlvbiBzdGVwcywgbG9ncywgcnVuIElEcywgb3IgbGlua3MnIH0sXG4gIHsgaGVhZGluZzogJ0ltcGFjdCcsIHJlcXVpcmVtZW50OiAnd2hvIG9yIHdoYXQgaXMgYWZmZWN0ZWQsIGFuZCBob3cgYmFkbHknIH0sXG4gIHsgaGVhZGluZzogJ1Byb3Bvc2FsJywgcmVxdWlyZW1lbnQ6ICd0aGUgZml4IHlvdSBoYXZlIGluIG1pbmQsIGFuZCB0aGUgcm9vdCBjYXVzZSBpZiBrbm93bicgfSxcbl07XG5cbi8qKlxuICogU2VjdGlvbnMgYSBjaGFuZ2Ugc3BlY2lmaWNhdGlvbiBtdXN0IHNldHRsZSBiZWZvcmUgYSB0aGlyZCBwYXJ0eSBjYW4gaW1wbGVtZW50IGl0LCBkZWZpbmVkXG4gKiBvbmNlIHNvIHRoYXQgdGhlIGlzc3VlIHRlbXBsYXRlIGFuZCBhbnkgdG9vbCB0aGF0IGRyYWZ0cyBvciByZXZpZXdzIHNwZWNpZmljYXRpb25zIGFnYWluc3RcbiAqIHRoZXNlIHNlY3Rpb25zIGNhbm5vdCBkcmlmdCBhcGFydDsgY2hlY2tsaXN0IGNvbnN1bWVycyByZW5kZXIgaXQgd2l0aCBgcmVuZGVyU2VjdGlvbkNoZWNrbGlzdGAuXG4gKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgc3VmZmljZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIHNvIHRoZXkgY29tZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IENIQU5HRV9JU1NVRV9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHtcbiAgICBoZWFkaW5nOiAnQmFja2dyb3VuZCBhbmQgZ29hbCcsXG4gICAgcmVxdWlyZW1lbnQ6ICd0aGUgcHJvYmxlbSBiZWluZyBzb2x2ZWQsIGZvciB3aG9tLCBhbmQgd2hhdCBvdXRjb21lIGNvdW50cyBhcyBzdWNjZXNzJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdCZWhhdmlvcicsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnZXZlcnkgdXNlci0gb3IgY2FsbGVyLW9ic2VydmFibGUgYmVoYXZpb3IsIGluY2x1ZGluZyBpbnB1dHMsIG91dHB1dHMsIGVycm9yIGNhc2VzLCBlZGdlIGNhc2VzLCBhbmQgaW50ZXJhY3Rpb25zIHdpdGggZXhpc3RpbmcgYmVoYXZpb3IsIHN0YXRlZCBwcmVjaXNlbHkgZW5vdWdoIHRoYXQgdHdvIGltcGxlbWVudGVycyB3b3VsZCBidWlsZCB0aGUgc2FtZSB0aGluZycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQWNjZXB0YW5jZSBjcml0ZXJpYScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnY2hlY2thYmxlIGNvbmRpdGlvbnMgKEdpdmVuL1doZW4vVGhlbiBvciBhbiBlcXVpdmFsZW50KSB0aGF0IGRlY2lkZSB3aGV0aGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkb25lJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdTY29wZSBhbmQgbm9uLWdvYWxzJyxcbiAgICByZXF1aXJlbWVudDogJ3doYXQgdGhlIGNoYW5nZSBjb3ZlcnMgYW5kIHdoYXQgaXQgZGVsaWJlcmF0ZWx5IGxlYXZlcyBvdXQsIHNvIGFuIGltcGxlbWVudGVyIGtub3dzIHdoZXJlIHRvIHN0b3AnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0Rlc2lnbiBjb25zdHJhaW50cycsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAndGhlIGRhdGEsIEFQSSwgc2NoZW1hLCBVSSwgYW5kIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgbmFtaW5nLCBhbmQgdGhlIGV4aXN0aW5nIGNvZGUgb3IgY29udmVudGlvbnMgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgZml0IOKAlCBhcyBmYXIgYXMgdGhlIHdyaXRlciBpbnRlbmRzIHRvIGNvbnN0cmFpbiB0aGVtLCB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBleHBsaWNpdGx5IGxlZnQgdG8gdGhlIGltcGxlbWVudGVyJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdDb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24nLFxuICAgIHJlcXVpcmVtZW50OiAnd2hhdCBleGlzdGluZyBkYXRhLCB1c2VycywgY2FsbGVycywgb3IgY29uZmlndXJhdGlvbnMgYXJlIGFmZmVjdGVkIGFuZCBob3cgdGhlIHRyYW5zaXRpb24gaGFwcGVucycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVmVyaWZpY2F0aW9uJyxcbiAgICByZXF1aXJlbWVudDogJ2hvdyB0aGUgY2hhbmdlIGlzIHRlc3RlZCBvciBkZW1vbnN0cmF0ZWQsIGluY2x1ZGluZyB3aGF0IG5lZWRzIG5vIHRlc3QgYW5kIHdoeScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnT3BlbiBxdWVzdGlvbnMnLFxuICAgIHJlcXVpcmVtZW50OiAndW5kZWNpZGVkIHBvaW50cywgZWFjaCB3aXRoIGl0cyBvcHRpb25zOyBlbXB0eSBvbmNlIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGltcGxlbWVudGFibGUnLFxuICB9LFxuXTtcblxuLyoqIFJlbmRlcnMgc2VjdGlvbnMgYXMgbWFya2Rvd24gYnVsbGV0cyAoYC0gKipIZWFkaW5nKio6IHJlcXVpcmVtZW50YCkuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU2VjdGlvbkNoZWNrbGlzdChzZWN0aW9uczogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiBgLSAqKiR7c2VjdGlvbi5oZWFkaW5nfSoqOiAke3NlY3Rpb24ucmVxdWlyZW1lbnR9YCkuam9pbignXFxuJyk7XG59XG5cbi8qKiBSZW5kZXJzIHNlY3Rpb25zIGFzIG1hcmtkb3duIGhlYWRpbmdzLCBlYWNoIGZvbGxvd2VkIGJ5IGl0cyByZXF1aXJlbWVudCBhcyBhIHBsYWNlaG9sZGVyIGNvbW1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU2VjdGlvblRlbXBsYXRlKHNlY3Rpb25zOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9uc1xuICAgIC5tYXAoXG4gICAgICAoc2VjdGlvbikgPT5cbiAgICAgICAgYCMjICR7c2VjdGlvbi5oZWFkaW5nfVxcblxcbjwhLS0gJHtzZWN0aW9uLnJlcXVpcmVtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7c2VjdGlvbi5yZXF1aXJlbWVudC5zbGljZSgxKX0uIC0tPmBcbiAgICApXG4gICAgLmpvaW4oJ1xcblxcbicpO1xufVxuIiwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgLy8gYEpTT04uc3RyaW5naWZ5YCBhbnN3ZXJzIGB1bmRlZmluZWRgIGZvciBgdW5kZWZpbmVkYCwgYSBzeW1ib2wgYW5kIGEgZnVuY3Rpb24sIGFuZCB0aHJvd3NcbiAgLy8gb24gYSBiaWdpbnQgb3IgYSBjeWNsZTsgYG5ldyBFcnJvcih1bmRlZmluZWQpYCBoYXMgYW4gZW1wdHkgbWVzc2FnZSwgd2hpY2ggd291bGQgZHJvcCB0aGVcbiAgLy8gb25seSBkaWFnbm9zdGljIGEgY2FsbGVyIGhhcyBhYm91dCBzdWNoIGEgdGhyb3duIHZhbHVlLiBOZWl0aGVyIHJlcHJlc2VudGF0aW9uIG1heSB0aHJvd1xuICAvLyBvdXQgb2YgaGVyZTogdGhpcyBydW5zIGluIGEgY2F0Y2ggYmxvY2ssIHdoZXJlIGl0IHdvdWxkIHJlcGxhY2UgdGhlIGVycm9yIGl0IGNvbnZlcnRzLlxuICByZXR1cm4gbmV3IEVycm9yKGlnbm9yZUVycm9yKCgpID0+IEpTT04uc3RyaW5naWZ5KG9iaikpID8/IGlnbm9yZUVycm9yKCgpID0+IFN0cmluZyhvYmopKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWVzc2FnZSBvZiBhIHRocm93biBgRXJyb3JgOyBmb3IgYW55IG90aGVyIHRocm93biB2YWx1ZSwgYGZhbGxiYWNrYCBpZiBnaXZlbiwgb3IgZWxzZSBpdHMgc3RyaW5nIGZvcm0uXG4gKiBgZmFsbGJhY2tgIGlzIGFsc28gcmV0dXJuZWQgd2hlbiByZWFkaW5nIHRoZSBtZXNzYWdlIHRocm93cy4gTmV2ZXIgdGhyb3dzLCBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgaW4gYSBjYXRjaCBibG9jay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93biwgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBgU3RyaW5nYCB0aHJvd3MgZm9yIGFuIG9iamVjdCB3aXRob3V0IGEgcHJvdG90eXBlLCBhbmQgZXZlbiBgaW5zdGFuY2VvZmAsIGEgYG1lc3NhZ2VgIGdldHRlciwgYW5kXG4gIC8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCB0aHJvdyBmb3IgYSBwcm94eSBvciBvYmplY3Qgd2hvc2UgdHJhcHMgb3IgZ2V0dGVycyB0aHJvdy5cbiAgcmV0dXJuIChcbiAgICBpZ25vcmVFcnJvcigoKSA9PiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAoZmFsbGJhY2sgPz8gU3RyaW5nKGVycm9yKSkpKSA/P1xuICAgIGZhbGxiYWNrID8/XG4gICAgaWdub3JlRXJyb3IoKCkgPT4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycm9yKSkgPz9cbiAgICAnVW5rbm93biBlcnJvcidcbiAgKTtcbn1cblxuLyoqIFdoZXRoZXIgYSB0aHJvd24gdmFsdWUgY2FycmllcyB0aGUgZ2l2ZW4gYGNvZGVgLCBzdWNoIGFzIGEgTm9kZS5qcyBlcnJubyBjb2RlIChgRU5PRU5UYCwgYEVFWElTVGAsIC4uLikuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRXJyb3JDb2RlPEMgZXh0ZW5kcyBzdHJpbmc+KGVycm9yOiB1bmtub3duLCBjb2RlOiBDKTogZXJyb3IgaXMgeyBjb2RlOiBDIH0ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gY29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhc0Vycm9yQ29kZShlcnJvciwgJ0VOT0VOVCcpKSByZXR1cm47XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChoYXNFcnJvckNvZGUoZXJyb3IsICdFTk9FTlQnKSkgcmV0dXJuO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogRGVjaWRlcyBob3cgbG9uZyB0byB3YWl0IGJlZm9yZSByZXRyeWluZyBhZnRlciBgZXJyb3JgLCBnaXZlbiB0aGUgYmFja29mZiBgc2xlZXBNaWxsaXNlY29uZHNgIGl0IHdvdWxkIG90aGVyd2lzZSB3YWl0LFxuICAgKiBlLmcuIGAoZXJyb3IsIG1zKSA9PiBNYXRoLm1heChtcywgcmV0cnlBdE9mKGVycm9yKSAtIERhdGUubm93KCkpYCB0byBob25vciBhIHJldHJ5IHRpbWUgc2VudCBieSBhIHNlcnZlci5cbiAgICogSXQgZG9lcyBub3QgYWZmZWN0IHRoZSBiYWNrb2ZmIHRoYXQgYHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzYCBhZHZhbmNlcy5cbiAgICovXG4gIGdldFNsZWVwTWlsbGlzZWNvbmRzPzogKGVycm9yOiB1bmtub3duLCBzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgZ2V0U2xlZXBNaWxsaXNlY29uZHMsXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudFNsZWVwTWlsbGlzZWNvbmRzID0gZ2V0U2xlZXBNaWxsaXNlY29uZHM/LihlcnJvciwgc2xlZXBNaWxsaXNlY29uZHMpID8/IHNsZWVwTWlsbGlzZWNvbmRzO1xuICAgICAgaWYgKGN1cnJlbnRTbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoY3VycmVudFNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCIvKiogRXNjYXBlcyBldmVyeSBSZWdFeHAgbWV0YWNoYXJhY3RlciBzbyB0aGUgdGV4dCBtYXRjaGVzIGl0c2VsZiBsaXRlcmFsbHkuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1skKCkqKy4/W1xcXFxcXF1ee3x9XS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbi8qKiBBIFBPU0lYIHNoZWxsIHdvcmQ6IHNhZmUgY2hhcmFjdGVycyBwYXNzIHRocm91Z2gsIGFueXRoaW5nIGVsc2UgaXMgc2luZ2xlLXF1b3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZUZvclNoZWxsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li8tXSskL3UudGVzdCh2YWx1ZSkgPyB2YWx1ZSA6IGAnJHt2YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG59XG5cbi8qKlxuICogV3JhcHMgdGV4dCBpbiBhIE1hcmtkb3duIGNvZGUgYmxvY2sgZmVuY2VkIHdpdGggdGlsZGVzLCB3aGljaCBhcmUgcmFyZXIgdGhhbiBiYWNrdGlja3MgaW4gTWFya2Rvd24gY29udGVudC5cbiAqIFRoZSBmZW5jZSBpcyBsb25nZXIgdGhhbiBhbnkgcnVuIG9mIHRpbGRlcyBpbiB0aGUgdGV4dCBzbyB0aGF0IHRoZSB0ZXh0IGNhbm5vdCBjbG9zZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVGlsZGVDb2RlQmxvY2sodGV4dDogc3RyaW5nLCBsYW5ndWFnZSA9ICcnKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvRmVuY2VkQ29kZUJsb2NrKCd+JywgdGV4dCwgbGFuZ3VhZ2UpO1xufVxuXG4vKipcbiAqIFdyYXBzIHRleHQgaW4gYSBNYXJrZG93biBjb2RlIGJsb2NrIGZlbmNlZCB3aXRoIGJhY2t0aWNrcy5cbiAqIFRoZSBmZW5jZSBpcyBsb25nZXIgdGhhbiBhbnkgcnVuIG9mIGJhY2t0aWNrcyBpbiB0aGUgdGV4dCBzbyB0aGF0IHRoZSB0ZXh0IGNhbm5vdCBjbG9zZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ29kZUJsb2NrKHRleHQ6IHN0cmluZywgbGFuZ3VhZ2UgPSAnJyk6IHN0cmluZyB7XG4gIHJldHVybiB0b0ZlbmNlZENvZGVCbG9jaygnYCcsIHRleHQsIGxhbmd1YWdlKTtcbn1cblxuZnVuY3Rpb24gdG9GZW5jZWRDb2RlQmxvY2soZmVuY2VDaGFyOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgbGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNob3J0ZXN0RmVuY2UgPSBmZW5jZUNoYXIucmVwZWF0KDMpO1xuICBsZXQgbG9uZ2VzdFJ1biA9IDI7XG4gIGxldCBzdGFydCA9IHRleHQuaW5kZXhPZihzaG9ydGVzdEZlbmNlKTtcbiAgd2hpbGUgKHN0YXJ0ICE9PSAtMSkge1xuICAgIGxldCBlbmQgPSBzdGFydCArIDM7XG4gICAgd2hpbGUgKHRleHRbZW5kXSA9PT0gZmVuY2VDaGFyKSBlbmQrKztcbiAgICBsb25nZXN0UnVuID0gTWF0aC5tYXgobG9uZ2VzdFJ1biwgZW5kIC0gc3RhcnQpO1xuICAgIHN0YXJ0ID0gdGV4dC5pbmRleE9mKHNob3J0ZXN0RmVuY2UsIGVuZCk7XG4gIH1cbiAgbGV0IGxhbmd1YWdlU3RhcnQgPSAwO1xuICB3aGlsZSAobGFuZ3VhZ2VbbGFuZ3VhZ2VTdGFydF0gPT09IGZlbmNlQ2hhcikgbGFuZ3VhZ2VTdGFydCsrO1xuICBjb25zdCBmZW5jZSA9IGZlbmNlQ2hhci5yZXBlYXQobG9uZ2VzdFJ1biArIDEgKyBsYW5ndWFnZVN0YXJ0KTtcbiAgcmV0dXJuIGAke2ZlbmNlfSR7bGFuZ3VhZ2Uuc2xpY2UobGFuZ3VhZ2VTdGFydCl9XFxuJHt0ZXh0fSR7dGV4dC5lbmRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nfSR7ZmVuY2V9YDtcbn1cblxuLyoqXG4gKiBTaG9ydGVucyB0ZXh0IHRvIGF0IG1vc3QgYG1heExlbmd0aGAgVVRGLTE2IGNvZGUgdW5pdHMsIGluY2x1ZGluZyB0aGUgYGVsbGlwc2lzYCB0aGF0IG1hcmtzIHRoZSBjdXQuXG4gKiBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2hlbiBgbWF4TGVuZ3RoYCBjYW5ub3QgaG9sZCB0aGUgZWxsaXBzaXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZSh0ZXh0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyLCBlbGxpcHNpcyA9ICfigKYnKTogc3RyaW5nIHtcbiAgaWYgKHRleHQubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIHRleHQ7XG4gIGlmIChtYXhMZW5ndGggPCBlbGxpcHNpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgbWF4TGVuZ3RoICgke21heExlbmd0aH0pIG11c3QgYmUgYXQgbGVhc3QgdGhlIGVsbGlwc2lzIGxlbmd0aCAoJHtlbGxpcHNpcy5sZW5ndGh9KWApO1xuICB9XG4gIHJldHVybiBgJHtzbGljZVdpdGhvdXRTcGxpdHRpbmdTdXJyb2dhdGVzKHRleHQsIG1heExlbmd0aCAtIGVsbGlwc2lzLmxlbmd0aCl9JHtlbGxpcHNpc31gO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGBlbmRgIGNvZGUgdW5pdHMgb2YgYHRleHRgLCBvbmUgZmV3ZXIgd2hlbiB0aGUgbGFzdCBrZXB0IHVuaXQgaXMgYSBoaWdoIHN1cnJvZ2F0ZSwgd2hvc2UgbG93IGhhbGZcbiAqIGlzIGVpdGhlciBjdXQgb2ZmIG9yIGFic2VudCBmcm9tIGB0ZXh0YCwgYmVjYXVzZSBhbiB1bnBhaXJlZCBzdXJyb2dhdGUgaXMgcmVwbGFjZWQgd2l0aCBVK0ZGRkQgYnkgZW5jb2RlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZVdpdGhvdXRTcGxpdHRpbmdTdXJyb2dhdGVzKHRleHQ6IHN0cmluZywgZW5kOiBudW1iZXIpOiBzdHJpbmcge1xuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItY29kZS1wb2ludCAtLSB0aGUgY2hlY2sgaXMgb24gYSBzaW5nbGUgVVRGLTE2IGNvZGUgdW5pdFxuICBjb25zdCBsYXN0S2VwdFVuaXQgPSB0ZXh0LmNoYXJDb2RlQXQoZW5kIC0gMSk7XG4gIHJldHVybiB0ZXh0LnNsaWNlKDAsIGxhc3RLZXB0VW5pdCA+PSAweEQ4XzAwICYmIGxhc3RLZXB0VW5pdCA8PSAweERCX0ZGID8gZW5kIC0gMSA6IGVuZCk7XG59XG5cbmNvbnN0IGh0bWxFbnRpdGllczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gICdcIic6ICcmcXVvdDsnLFxuICAnJic6ICcmYW1wOycsXG4gIFwiJ1wiOiAnJiMzOTsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG59O1xuXG5jb25zdCBodG1sU3BlY2lhbENoYXJhY3RlcnNQYXR0ZXJuID0gL1tcIiYnPD5dL2d1O1xuXG4vKiogRXNjYXBlcyBgJmAsIGA8YCwgYD5gLCBgXCJgLCBhbmQgYCdgLCBzbyB0aGUgcmVzdWx0IGlzIHNhZmUgaW4gSFRNTCB0ZXh0IGFuZCBpbiBxdW90ZWQgYXR0cmlidXRlIHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE1lYXN1cmVkIGluIFY4IGFuZCBKYXZhU2NyaXB0Q29yZTogYSBuYXRpdmUgYHNlYXJjaGAgZmlyc3QgaXMgZmFzdGVyIHRoYW4gYHJlcGxhY2VBbGxgIGFsb25lIGZvciB0ZXh0IHdpdGhvdXQgdGhlc2VcbiAgLy8gY2hhcmFjdGVycywgYW5kIG9uZSBuYXRpdmUgYHJlcGxhY2VBbGxgIGJlYXRzIGEgcGVyLWNvZGUtdW5pdCBsb29wIGZvciB0ZXh0IHdoZXJlIHRoZXkgYXJlIHJhcmUuXG4gIHJldHVybiB0ZXh0LnNlYXJjaChodG1sU3BlY2lhbENoYXJhY3RlcnNQYXR0ZXJuKSA9PT0gLTFcbiAgICA/IHRleHRcbiAgICA6IHRleHQucmVwbGFjZUFsbChodG1sU3BlY2lhbENoYXJhY3RlcnNQYXR0ZXJuLCAoY2hhcmFjdGVyKSA9PiBodG1sRW50aXRpZXNbY2hhcmFjdGVyXSBhcyBzdHJpbmcpO1xufVxuIiwiLyoqXG4gKiBXaGVuIHRvIHdyaXRlIGEgdGVzdCBhbmQgd2hhdCBhIHRlc3QgbWF5IGFzc2VydCwgYXMgbWFya2Rvd24gYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBTdGF0ZWQgb25jZSBoZXJlIGFuZCByZW5kZXJlZCBieSB0aGUgZ2VuZXJhdGVkIGFnZW50IGluc3RydWN0aW9ucyBhbmQgdGhlIHRlc3Rpbmcgc2tpbGwgc28gdGhlXG4gKiB0d28gY2Fubm90IGRyaWZ0IGFwYXJ0LlxuICovXG5leHBvcnQgY29uc3QgVEVTVF9XUklUSU5HX1JVTEVTID0gYC0gV3JpdGUgYSB0ZXN0IG9ubHkgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCwgb3Igd2hlbiBhIGJlaGF2aW9yIGlzIGxpa2VseSB0byByZWdyZXNzIGFuZCBubyBleGlzdGluZyBhdXRvbWF0aWMgY2hlY2sgKHR5cGUgY2hlY2tpbmcsIGxpbnRpbmcsIGFuIGV4aXN0aW5nIHRlc3Qgb3IgQ0kgY2hlY2spIHdvdWxkIGNhdGNoIHRoZSBicmVha2FnZS4gTmV2ZXIgYWRkIGEgdGVzdCB0aGF0IG1lcmVseSByZXN0YXRlcyBhIG1hcHBpbmcgZnJvbSBjb25kaXRpb25zIHRvIGNvbnN0YW50IG91dHB1dHMgKGl0IGZhaWxzIG9ubHkgb24gaW50ZW50aW9uYWwgZWRpdHMpIG9yIHRoYXQgb25seSBjb25maXJtcyBhbiBleHRlcm5hbCBmYWN0IChhIGxpYnJhcnkncyBiZWhhdmlvciwgd2hldGhlciBhIHZlcnNpb24gZml4ZXMgYW4gaXNzdWUpOyB2ZXJpZnkgdGhvc2Ugb25jZSBtYW51YWxseS5cbi0gVGVzdCBleHRlcm5hbGx5IG9ic2VydmFibGUgYmVoYXZpb3IgKGUuZy4sIGVtaXR0ZWQgZmlsZXMsIENMSSBvdXRwdXQsIHJlbmRlcmVkIHJlc3VsdHMpIGF0IHRoZSBzeXN0ZW0gYm91bmRhcnksIG5vdCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzOiBkbyBub3QgbWlycm9yIHByb2R1Y3Rpb24gbG9naWMsIGFzc2VydCB0aGF0IGEgYnJhbmNoIGlzIHRha2VuLCBvciBmZWVkIGhhbmQtYXNzZW1ibGVkIGludGVybmFsIG9iamVjdHMgdG8gaW50ZXJuYWwgZnVuY3Rpb25zLlxuLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuLSBBdm9pZCBmaXhlZCB3YWl0cyBpbiBFMkUgdGVzdHM7IHdhaXQgZm9yIGNvbmRpdGlvbnMgaW5zdGVhZC5gO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbi8qKiBUaGUgYHdvcmtzcGFjZXNgIGZpZWxkIG9mIGEgcm9vdCBwYWNrYWdlLmpzb246IHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZXNEZWNsYXJhdGlvbiA9IHN0cmluZ1tdIHwgeyBwYWNrYWdlcz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSB0aGF0IEJ1biB3b3VsZCBsaW5rXG4gKiBmb3IgdGhlIGdpdmVuIHJvb3QgcGFja2FnZS5qc29uIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbi4gQ2Fub25pY2FsaXplcyB0aGUgZGVjbGFyZWQgcGF0dGVybnNcbiAqIChzZWUgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMpLCBkcm9wcyBwYXR0ZXJucyBlc2NhcGluZyB0aGUgcmVwb3NpdG9yeSAoc2VlXG4gKiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4pLCBhbmQgcmVzb2x2ZXMgdGhlIHJlc3Qgd2l0aCBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhcbiAgICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybilcbiAgICApLFxuICAgIHJvb3REaXJQYXRoXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHRvIHBhY2thZ2UuanNvbiBwYXRocyBtaW1pY2tpbmcgQnVuJ3MgU0VRVUVOVElBTCBldmFsdWF0aW9uLFxuICogZGVyaXZlZCBlbXBpcmljYWxseSB3aXRoIEJ1biAxLjMuMTQgKGZpeHR1cmUgcmVwb3Mgb2JzZXJ2ZWQgdmlhIGBidW4gaW5zdGFsbCAtLWxvY2tmaWxlLW9ubHlgO1xuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDQgLyBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNSk6XG4gKiAxLiBQYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyIGludG8gYW4gYWNjdW11bGF0aW5nIHNldDogYSBwb3NpdGl2ZSBnbG9iXG4gKiAgICBwYXR0ZXJuIGFkZHMgZXZlcnkgcGFja2FnZS5qc29uIGl0IG1hdGNoZXM7IGEgbmVnYXRpb24gZGVsZXRlcyBpdHMgbWF0Y2hlcyBmcm9tIHRoZSBzZXRcbiAqICAgIGFjY3VtdWxhdGVkIFNPIEZBUiwgc28gYSBsYXRlciBwb3NpdGl2ZSByZS1hZGRzIHRoZW0gKGBbXCIhYXBwcy9leGNsdWRlZFwiLCBcImFwcHMvKlwiXWAgbGlua3NcbiAqICAgIGFwcHMvZXhjbHVkZWQsIHdoaWxlIGBbXCJhcHBzLypcIiwgXCIhYXBwcy9leGNsdWRlZFwiXWAgZG9lcyBub3QpLlxuICogMi4gQSBuZWdhdGlvbiB3aG9zZSBub3JtYWxpemVkIGJvZHkgaGFzIEVYQUNUTFkgdHdvIHNlZ21lbnRzLCB3aG9zZSBsYXN0IHNlZ21lbnQgaXMgYSBzdGFyLXJ1blxuICogICAgKGAqYCwgYCoqYCwgYCoqKmAsIOKApiksIGFuZCB3aG9zZSBmaXJzdCBzZWdtZW50IGlzIE5PVCBpdHNlbGYgYSBzdGFyLXJ1biBmaXJzdCBzZWVkcyB0aGVcbiAqICAgIGltcGxpY2l0IGJhc2VsaW5lIGludG8gdGhlIHNldCwgdGhlbiBkZWxldGVzIGl0cyBvd24gbWF0Y2hlczogYSBgKipgIGxhc3Qgc2VnbWVudCBzZWVkc1xuICogICAgYCoqYCAocGFja2FnZXMgYXQgYW55IGRlcHRoKSwgYW55IG90aGVyIHN0YXItcnVuIHNlZWRzIGAqXFwvKmAgKGRlcHRoIDIgb25seSkuIFNlZWRpbmdcbiAqICAgIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnMgKGBbXCJhcHBzLypcIiwgXCIhb3RoZXIvKlwiXWAgbGlua3MgZXZlcnkgZGVwdGgtMlxuICogICAgcGFja2FnZSBvdXRzaWRlIG90aGVyLykuIE5vIG90aGVyIG5lZ2F0aW9uIHNoYXBlIHNlZWRzOiBgISpgLCBgISoqYCwgYCEqXFwvKmAsIGAhKlxcLyoqYCxcbiAqICAgIGAhKipcXC8qYCwgYCFhL2IvKmAsIGAhYS9iLyoqYCwgYCFkaXJgLCBhbmQgYCFkaXIvKnhgIGVhY2ggbGluayBub3RoaW5nIG9uIHRoZWlyIG93bi5cbiAqICAgIGA/YCwgYnJhY2UsIGFuZCBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmUgRVJSQVRJQ0FMTFkgKGBbXCIhb3RoZXIvP1wiXWAgbGlua3NcbiAqICAgIHBhY2thZ2VzL2EgeWV0IG5vdCB0aGUgZXF1YWxseSBiYXNlbGluZS1zaGFwZWQgb3RoZXIveXksIGBbXCIhb3RoZXIvPz9cIl1gIGxpbmtzIG5vdGhpbmcsIGFuZFxuICogICAgYFtcIiE/Lz9cIl1gIGxpbmtzIHRoZSB2ZXJ5IG90aGVyL3ggaXQgbWF0Y2hlcyksIHNvIG5vIGNvbnNpc3RlbnQgcnVsZSBjYW4gbW9kZWwgdGhlbTsgdGhleVxuICogICAgYXJlIGRlbGliZXJhdGVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nIOKAlCBzZWUgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSBhbmQgIzEwMDUuXG4gKiAzLiBBIG5vbi1nbG9iIHBvc2l0aXZlIHBhdHRlcm4gUElOUyBpdHMgZGlyZWN0b3J5OiBpdCBzdGF5cyBhIHdvcmtzcGFjZSByZWdhcmRsZXNzIG9mIHdoZXJlIGFcbiAqICAgIG1hdGNoaW5nIG5lZ2F0aW9uIGFwcGVhcnMgKGBbXCJvdGhlci94XCIsIFwiIW90aGVyL3hcIl1gIGFuZCBgW1wiIW90aGVyL3hcIiwgXCJvdGhlci94XCJdYCBib3RoXG4gKiAgICBsaW5rIG90aGVyL3gpLlxuICogNC4gYCoqYCBtYXRjaGVzIHplcm8gb3IgbW9yZSBwYXRoIHNlZ21lbnRzIChgW1wiYXBwcy8qKlwiXWAgbGlua3MgdGhlIHBhY2thZ2UgYXQgYXBwcyBpdHNlbGYsIGFuZFxuICogICAgYCFhcHBzLyoqYCBkZWxldGVzIGl0KSwgbWF0Y2hpbmcgZmFzdC1nbG9iJ3MgZmlsZS1nbG9iIHNlbWFudGljcy5cbiAqIERvIG5vdCBhcHBseSBnbG9iSWdub3JlIGhlcmU6IHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIGRlZmluZWQgc29sZWx5IGJ5IHRoZSBkZWNsYXJlZCBwYXR0ZXJucyxcbiAqIGFuZCBzb3VyY2Utc2Nhbm5pbmcgaWdub3JlcyBzdWNoIGFzIGBidWlsZGAgb3IgYGRpc3RgIHdvdWxkIGhpZGUgbGVnaXRpbWF0ZWx5IG5hbWVkIHdvcmtzcGFjZVxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJuczogc3RyaW5nW10sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlIHN0b3BzIEdMT0IgdHJhdmVyc2FsIHRocm91Z2ggc3ltbGlua3MsIGJ1dCBhIG5vbi1nbG9iIHBhdHRlcm5cbiAgLy8gbmFtaW5nIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBgbGlua2VkYCB3aXRoIGBsaW5rZWQgLT4gLi4vb3RoZXItcmVwb2ApIHN0aWxsIG1hdGNoZXMg4oCUXG4gIC8vIGZhc3QtZ2xvYiByZXNvbHZlcyBzdGF0aWMgcGF0dGVybnMgd2l0aCBkaXJlY3QgZnMgY2hlY2tzLCBhbmQgQnVuIGRvZXMgbGluayBzdWNoIGEgd29ya3NwYWNlLlxuICAvLyBEZWxpYmVyYXRlbHkgZGl2ZXJnZSBmcm9tIEJ1biB0aGVyZTogY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgYW5kIG1hbmlmZXN0XG4gIC8vIHJld3JpdGluZyB3b3VsZCBvdGhlcndpc2UgZGVsZXRlIGFuZCByZXdyaXRlIGZpbGVzIGluIEFOT1RIRVIgcmVwb3NpdG9yeSB0aHJvdWdoIHRoZSBzeW1saW5rLFxuICAvLyBzbyBrZWVwIG9ubHkgbWFuaWZlc3RzIHdob3NlIHJlYWwgcGF0aCBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkncyByZWFsIHJvb3QuIFNjYW5uaW5nIGVhY2hcbiAgLy8gcGF0dGVybiBzZXBhcmF0ZWx5IChubyBjcm9zcy1wYXR0ZXJuIGNhY2hpbmcpIGlzIGRlbGliZXJhdGU6IGRlY2xhcmF0aW9ucyBob2xkIGEgaGFuZGZ1bCBvZlxuICAvLyBwYXR0ZXJucywgc28gYSBjYWNoZSB3b3VsZCBjb21wbGljYXRlIHRoaXMgc2hhcmVkIGNvZGUgd2l0aG91dCBtZWFzdXJhYmxlIGdhaW4uXG4gIGNvbnN0IGdsb2JNYW5pZmVzdFBhdGhzID0gKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICAvLyBCdW4gbGlua3MgZG90LWRpcmVjdG9yeSBwYWNrYWdlcyBvbmx5IHRocm91Z2ggZnVsbHkgc3RhdGljIHBhdHRlcm5zOiB3aXRoIEJ1biAxLjMuMTQsXG4gICAgLy8gYC5oaWRkZW4veGAgcGlucyB0aGUgcGFja2FnZSB3aGlsZSBgLmhpZGRlbi8qYCwgYC4qLypgLCBhbmQgYCoqYCBhbGwgbGluayBub3RoaW5nIHVuZGVyXG4gICAgLy8gLmhpZGRlbiDigJQgZXZlbiB3aGVuIHRoZSBkb3R0ZWQgc2VnbWVudCBpdHNlbGYgaXMgbGl0ZXJhbCDigJQgc28gYW55IGR5bmFtaWMgcGF0dGVybiBtdXN0XG4gICAgLy8gZHJvcCBtYXRjaGVzIGNvbnRhaW5pbmcgYSBkb3QtbGVkIHNlZ21lbnQgKGZhc3QtZ2xvYidzIGBkb3Q6IGZhbHNlYCBvbmx5IGNvdmVycyBzZWdtZW50c1xuICAgIC8vIGEgd2lsZGNhcmQgbWF0Y2hlcykuXG4gICAgY29uc3QgZXhjbHVkZXNEb3RTZWdtZW50cyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybik7XG4gICAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgICAvLyBmYXN0LWdsb2IgMy4zLjMgcmV0dXJucyBubyBtYXRjaGVzIGZvciBmaWxlIGdsb2JzIHdpdGggYSBsb25lLWA/YCBzZWdtZW50IChlLmcuXG4gICAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCksIGFsdGhvdWdoIG1pY3JvbWF0Y2ggbWF0Y2hlcyB0aGVtIGFuZCBCdW4gMS4zLjE0IGxpbmtzIHN1Y2hcbiAgICAvLyB3b3Jrc3BhY2VzOyBmb3IgYD9gLWNhcnJ5aW5nIHBhdHRlcm5zIG9ubHkgKGEgZGlyZWN0b3J5IGdsb2IgZm9yIGUuZy4gYCoqYCB3b3VsZCBzY2FuIGV2ZXJ5XG4gICAgLy8gZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmcgdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpclxuICAgIC8vIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYiwgd2hpY2ggc3RheXMgbmVjZXNzYXJ5IGZvciBgKipgJ3MgemVyby1zZWdtZW50XG4gICAgLy8gbWF0Y2hlcyDigJQgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGRpciBpdHNlbGYgYXMgYSBkaXJlY3RvcnkuXG4gICAgY29uc3QgbWFuaWZlc3RQYXRocyA9IG5ldyBTZXQoZmcuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKHBhdHRlcm4sICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpKTtcbiAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnPycpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZmcuZ2xvYlN5bmMocGF0dGVybiwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpIG1hbmlmZXN0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCwgYnV0IEJ1biBuZXZlciB0cmVhdHMgdGhlXG4gICAgLy8gbW9ub3JlcG8gcm9vdCBhcyBpdHMgb3duIHdvcmtzcGFjZS5cbiAgICByZXR1cm4gWy4uLm1hbmlmZXN0UGF0aHNdLmZpbHRlcihcbiAgICAgIChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCAhPT0gJ3BhY2thZ2UuanNvbicgJiZcbiAgICAgICAgKCFleGNsdWRlc0RvdFNlZ21lbnRzIHx8ICFwYWNrYWdlSnNvblBhdGguc3BsaXQoJy8nKS5zb21lKChzZWdtZW50KSA9PiBzZWdtZW50LnN0YXJ0c1dpdGgoJy4nKSkpICYmXG4gICAgICAgIGlzSW5zaWRlUmVhbFJvb3QocGFja2FnZUpzb25QYXRoKVxuICAgICk7XG4gIH07XG4gIGxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNJbnNpZGVSZWFsUm9vdCA9IChwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZWFsUm9vdERpclBhdGggPz89IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpO1xuICAgICAgLy8gQ29tcGFyZSB3aG9sZSBzZWdtZW50cywgbm90IGEgYC4uYCBwcmVmaXg6IGEgZGlyZWN0b3J5IGxpdGVyYWxseSBuYW1lZCBlLmcuIGAuLnBrZ2AgaXNcbiAgICAgIC8vIGluc2lkZSB0aGUgcm9vdCwgd2hpbGUgYSBwbGFpbiBzdGFydHNXaXRoKCcuLicpIHdvdWxkIG1pc3JlYWQgaXQgYXMgcGFyZW50IHRyYXZlcnNhbC5cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIG1hbmlmZXN0IHRoYXQgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGwgaXMgbm90IGEgd29ya3NwYWNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWNjdW11bGF0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwaW5uZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKGJhc2VsaW5lR2xvYikpIGFjY3VtdWxhdGVkUGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIGFjY3VtdWxhdGVkUGF0aHMuZGVsZXRlKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuQm9keSkgPyBhY2N1bXVsYXRlZFBhdGhzIDogcGlubmVkUGF0aHM7XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIHtcbiAgICAgICAgdGFyZ2V0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uYWNjdW11bGF0ZWRQYXRocywgLi4ucGlubmVkUGF0aHNdKV0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBzZWVkcyBCdW4ncyBpbXBsaWNpdCB3b3Jrc3BhY2UgYmFzZWxpbmU6IGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZVxuICogbmVnYXRpb24gb2YgdGhlIHNlZWRpbmcgc2hhcGUgKHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyBydWxlIDIpLiBNZWFzdXJlZCB3aXRoIEJ1blxuICogMS4zLjE0LCBzZWVkaW5nIGlzIHBlci1uZWdhdGlvbiBhbmQgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJuczsgY29uY3JldGUgb3JcbiAqIG1peGVkLWxpdGVyYWwgbGFzdCBzZWdtZW50cyAoYCFhcHBzL2V4Y2x1ZGVkYCwgYCFhcHBzLypkYCkgbmV2ZXIgc2VlZCwgYW5kIGA/YCwgYnJhY2UsIGFuZFxuICogY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlZCBpbmNvbnNpc3RlbnRseSBhY3Jvc3MgZml4dHVyZXMgKHNvbWV0aW1lcyBkcm9wcGluZyBldmVuXG4gKiB1bnJlbGF0ZWQgc2libGluZyB3b3Jrc3BhY2VzKSwgc28gdGhleSBhcmUgY29uc2VydmF0aXZlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZzsgc2VlXG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIGdldFNlZWRlZEJhc2VsaW5lR2xvYihub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpKSkgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyB3aXRob3V0IEJ1bidzIG5vLW9wIG9uZXMgKGBcIlwiYCwgYSBsb25lIGBcIiFcImAsIGFuZCBgXCIuXCJgKSwgd2hpY2ggQnVuXG4gKiBpZ25vcmVzIGVudGlyZWx5IOKAlCBhIGxvbmUgYFwiIVwiYCBtdXN0IG5vdCBhY3RpdmF0ZSB0aGUgbmVnYXRpdmUtb25seSBpbXBsaWNpdCBiYXNlbGluZSwgYW5kIGBcIlwiYFxuICogbXVzdCBub3QgbWFrZSB0aGUgcmVwb3NpdG9yeSByb290IGl0c2VsZiBhIGRpc2NvdmVyZWQgd29ya3NwYWNlLiBEZWNsYXJhdGlvbiBvcmRlciBhbmRcbiAqIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGUgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKVxuICAgIC5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIC8vIEJ1biBhcHBsaWVzIGxlYWRpbmctYmFuZyBQQVJJVFkgKHZlcmlmaWVkIHdpdGggQnVuIDEuMy4xNCk6IGAhIXBgIGlzIHRoZSBwb3NpdGl2ZSBgcGBcbiAgICAgIC8vIGFuZCBgISEhcGAgdGhlIG5lZ2F0aW9uIGAhcGAsIHNvIGNhbm9uaWNhbGl6ZSB0byBhdCBtb3N0IG9uZSBiYW5nLlxuICAgICAgY29uc3QgYmFuZ0NvdW50ID0gL14hKi91LmV4ZWMod29ya3NwYWNlUGF0dGVybikhWzBdLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zbGljZShiYW5nQ291bnQpO1xuICAgICAgcmV0dXJuIGJhbmdDb3VudCAlIDIgPT09IDEgPyBgISR7cGF0dGVybkJvZHl9YCA6IHBhdHRlcm5Cb2R5O1xuICAgIH0pXG4gICAgLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICAgICAgLy8gTm9ybWFsaXplIHNvIHNwZWxsaW5ncyBsaWtlIGAuL2AsIGAuLy5gLCBhbmQgYCEuL2AgYXJlIHJlY29nbml6ZWQgYXMgdGhlIHNhbWUgbm8tb3BzXG4gICAgICAvLyAocGF0aC5wb3NpeC5ub3JtYWxpemUoJycpID09PSAnLicsIHNvIHRoZSBlbXB0eSBwYXR0ZXJuIGlzIGNvdmVyZWQgdG9vKS5cbiAgICAgIHJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keSkgIT09ICcuJztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgYC8vYCwgcmVzb2x2ZXMgYC4vYCwgYW5kIHN0cmlwcyB0cmFpbGluZyBzbGFzaGVzLCBtaXJyb3JpbmcgQnVuJ3MgcGF0aCBoYW5kbGluZy5cbiAqIEEgcHVyZSBzdGFyLXJ1biBzZWdtZW50IG9mIHRocmVlIG9yIG1vcmUgc3RhcnMgYmVoYXZlcyBsaWtlIGAqYCB1bmRlciBCdW4gKGAhb3RoZXIvKioqYFxuICogbWF0Y2hlcyBvdGhlci94KSBidXQgbm90IHVuZGVyIGZhc3QtZ2xvYiwgc28gY2Fub25pY2FsaXplIGl0IHRvIGAqYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5wb3NpeFxuICAgIC5ub3JtYWxpemUocGF0dGVybkJvZHkpXG4gICAgLnJlcGxhY2UoL1xcLyskL3UsICcnKVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gKC9eXFwqezMsfSQvdS50ZXN0KHNlZ21lbnQpID8gJyonIDogc2VnbWVudCkpXG4gICAgLmpvaW4oJy8nKTtcbn1cblxuLyoqIFRoZSBpbXBsaWNpdCBiYXNlbGluZSBnbG9iIGEgbmVnYXRpb24gc2VlZHMgdW5kZXIgQnVuJ3MgcnVsZSAyIGFib3ZlLCBvciB1bmRlZmluZWQgaWYgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWVkZWRCYXNlbGluZUdsb2IobmVnYXRpb25Cb2R5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWdtZW50cyA9IG5lZ2F0aW9uQm9keS5zcGxpdCgnLycpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbZmlyc3RTZWdtZW50LCBsYXN0U2VnbWVudF0gPSBzZWdtZW50cyBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoIS9eXFwqKyQvdS50ZXN0KGxhc3RTZWdtZW50KSB8fCAvXlxcKiskL3UudGVzdChmaXJzdFNlZ21lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbGFzdFNlZ21lbnQgPT09ICcqKicgPyAnKionIDogJyovKic7XG59XG5cbi8qKiBXb3Jrc3BhY2UgcGF0dGVybnMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkod29ya3NwYWNlcykpIHJldHVybiB3b3Jrc3BhY2VzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzPy5wYWNrYWdlcykgPyB3b3Jrc3BhY2VzLnBhY2thZ2VzIDogW107XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJuIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6XG4gKiBhYnNvbHV0ZSBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBvcGVyYXRlXG4gKiBvbiBhbm90aGVyIHJlcG9zaXRvcnkncyBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICByZXR1cm4gIXBhdGgucG9zaXguaXNBYnNvbHV0ZShwYXR0ZXJuQm9keSkgJiYgIXBhdHRlcm5Cb2R5LnNwbGl0KCcvJykuaW5jbHVkZXMoJy4uJyk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVGaWxlQXRvbWljT3B0aW9ucyB7XG4gIG1vZGU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogV3JpdGVzIGEgZmlsZSB0aHJvdWdoIGEgdW5pcXVlbHkgbmFtZWQgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCBhIHJlbmFtZSwgc28gY29uY3VycmVudCByZWFkZXJzXG4gKiBzZWUgZWl0aGVyIHRoZSBvbGQgb3IgdGhlIG5ldyBjb250ZW50LCBuZXZlciBhIHBhcnRpYWwgb25lLCBhbmQgY29uY3VycmVudCB3cml0ZXJzIG5ldmVyIHNoYXJlIGEgdGVtcG9yYXJ5IGZpbGUuXG4gKiBUaGUgZmlsZSBnZXRzIGBvcHRpb25zLm1vZGVgIGV4YWN0bHkgKHdpdGhvdXQgdGhlIHVtYXNrKSwgb3IgZWxzZSBrZWVwcyB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGZpbGUgaXQgcmVwbGFjZXMsIGFzXG4gKiBhbiBpbi1wbGFjZSBgd3JpdGVGaWxlYCB3b3VsZDsgYSBuZXcgZmlsZSB3aXRob3V0IGBvcHRpb25zLm1vZGVgIGdldHMgdGhlIGRlZmF1bHQgcGVybWlzc2lvbnMuXG4gKiBDcmVhdGVzIG1pc3NpbmcgcGFyZW50IGRpcmVjdG9yaWVzLiBUaGUgZGF0YSBpcyBub3QgZnN5bmNlZCwgc28gYSBwb3dlciBsb3NzIGNhbiBzdGlsbCBsb3NlIHRoZSBsYXRlc3Qgd3JpdGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUZpbGVBdG9taWMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksXG4gIG9wdGlvbnM/OiBXcml0ZUZpbGVBdG9taWNPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIGNvbnN0IFttb2RlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBvcHRpb25zPy5tb2RlID8/IGdldEV4aXN0aW5nTW9kZShmaWxlUGF0aCksXG4gICAgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBjb25zdCB0ZW1wUGF0aCA9IGdldFRlbXBQYXRoKGRpclBhdGgpO1xuICB0cnkge1xuICAgIC8vIENyZWF0aW5nIHRoZSBmaWxlIHdpdGggdGhlIG1vZGUga2VlcHMgaXQgZnJvbSBiZWluZyBtb3JlIHBlcm1pc3NpdmUgdGhhbiBpbnRlbmRlZCB3aGlsZSBpdCBpcyB3cml0dGVuLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh0ZW1wUGF0aCwgZGF0YSwgbW9kZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogeyBtb2RlIH0pO1xuICAgIGlmIChtb2RlICE9PSB1bmRlZmluZWQpIGF3YWl0IGZzLnByb21pc2VzLmNobW9kKHRlbXBQYXRoLCBtb2RlKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUodGVtcFBhdGgsIGZpbGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBBIGNsZWFudXAgZmFpbHVyZSBtdXN0IG5vdCByZXBsYWNlIHRoZSBlcnJvciB0aGF0IGV4cGxhaW5zIHdoeSB0aGUgd3JpdGUgZmFpbGVkLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRlbXBQYXRoLCB7IGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiogVGhlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgYHdyaXRlRmlsZUF0b21pY2AuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVGaWxlQXRvbWljU3luYyhcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgb3B0aW9ucz86IFdyaXRlRmlsZUF0b21pY09wdGlvbnNcbik6IHZvaWQge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnM/Lm1vZGUgPz8gZ2V0RXhpc3RpbmdNb2RlU3luYyhmaWxlUGF0aCk7XG4gIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgdGVtcFBhdGggPSBnZXRUZW1wUGF0aChkaXJQYXRoKTtcbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBkYXRhLCBtb2RlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IG1vZGUgfSk7XG4gICAgaWYgKG1vZGUgIT09IHVuZGVmaW5lZCkgZnMuY2htb2RTeW5jKHRlbXBQYXRoLCBtb2RlKTtcbiAgICBmcy5yZW5hbWVTeW5jKHRlbXBQYXRoLCBmaWxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLnJtU3luYyh0ZW1wUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgY2xlYW51cCBmYWlsdXJlIG11c3Qgbm90IHJlcGxhY2UgdGhlIGVycm9yIHRoYXQgZXhwbGFpbnMgd2h5IHRoZSB3cml0ZSBmYWlsZWQuXG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRlbXBQYXRoKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoZSBuYW1lIGRvZXMgbm90IGluY2x1ZGUgdGhlIHRhcmdldCdzLCB3aGljaCBtYXkgYWxyZWFkeSBiZSBuZWFyIHRoZSBmaWxlIG5hbWUgbGVuZ3RoIGxpbWl0LlxuICByZXR1cm4gcGF0aC5qb2luKGRpclBhdGgsIGAuJHtyYW5kb21VVUlEKCl9LnRtcGApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ01vZGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpO1xuICAgIHJldHVybiB0b1Blcm1pc3Npb25CaXRzKHN0YXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBpZ25vcmVNaXNzaW5nRmlsZShlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RXhpc3RpbmdNb2RlU3luYyhmaWxlUGF0aDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdG9QZXJtaXNzaW9uQml0cyhmcy5zdGF0U3luYyhmaWxlUGF0aCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBpZ25vcmVNaXNzaW5nRmlsZShlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9QZXJtaXNzaW9uQml0cyhzdGF0OiBmcy5TdGF0cyk6IG51bWJlciB7XG4gIC8vIGBzdGF0YCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGBjaG1vZGAgaXMgbm90IHNwZWNpZmllZCB0byBhY2NlcHQuXG4gIHJldHVybiBzdGF0Lm1vZGUgJiAwbzc3Nzc7XG59XG5cbmZ1bmN0aW9uIGlnbm9yZU1pc3NpbmdGaWxlKGVycm9yOiB1bmtub3duKTogdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0aHJvdyBlcnJvcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHdyaXRlRmlsZUF0b21pY1N5bmMgfSBmcm9tICcuL3dyaXRlRmlsZUF0b21pYy5qcyc7XG5cbi8qKlxuICogQW5jaG9yZWQgdG8gYFwiLCBgIHNvIG9ubHkgYSByZWdpc3RyeSBlbnRyeSdzIGByZXNvbHZlZGAgc2xvdCBpcyBjbGVhcmVkLiBBIGRpcmVjdCB0YXJiYWxsXG4gKiBkZXBlbmRlbmN5IGNhcnJpZXMgaXRzIFVSTCBpbiB0aGUgd29ya3NwYWNlIGRlc2NyaXB0b3IgYW5kIHR1cGxlIGlkZW50aWZpZXIgaW5zdGVhZCwgYW5kIHRob3NlXG4gKiBVUkxzIG11c3QgcmVtYWluIGludGFjdC5cbiAqL1xuY29uc3QgZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4gPSAvKFwiLCApXCJodHRwczpcXC9cXC9ucG1cXC5mbGF0dFxcLnRlY2hcXC9bXlwiXSpcIi9nO1xuXG4vKipcbiAqIFJlbW92ZSBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBidW4ubG9jay5cbiAqXG4gKiBCdW4gd3JpdGVzIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIGxvY2tmaWxlIGV2ZW4gd2hlbiBhbiBpbnN0YWxsIHJ1bnMgZnJvbSBhIGNoaWxkIHBhY2thZ2UuIEluIGFcbiAqIEdpdCBjaGVja291dCB0aGUgc2VhcmNoIGNsaW1icyB0byB0aGF0IHJvb3Q7IHdpdGhvdXQgYSBjaGVja291dCBib3VuZGFyeSBpdCBpbnNwZWN0cyBvbmx5IHRoZVxuICogc3RhcnRpbmcgZGlyZWN0b3J5IHNvIGl0IGNhbm5vdCByZXdyaXRlIGFuIHVucmVsYXRlZCBhbmNlc3RvcidzIGxvY2tmaWxlLiBUaGUgcHJveHkgaXNcbiAqIGluc3RhbGwtdGltZSBwb2xpY3kgcmF0aGVyIHRoYW4gcmVwb3NpdG9yeSBzdGF0ZTogYW4gZW1wdHkgcmVzb2x2ZWQgc2xvdCBzdGlsbCBtYWtlcyBCdW4gdXNlIHRoZVxuICogY29uZmlndXJlZCBkZWZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIGxvY2tmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNoYW5nZSB3YXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVuTG9ja2ZpbGUoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NrZmlsZVBhdGggPSBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aCk7XG4gIGlmICghbG9ja2ZpbGVQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuLCAnJDFcIlwiJyk7XG4gIGlmIChub3JtYWxpemVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIEFuIGF0b21pYyB3cml0ZSBrZWVwcyBhbiBpbnRlcnJ1cHRlZCByZXBsYWNlbWVudCBmcm9tIGxlYXZpbmcgYSB0cnVuY2F0ZWQgYnVuLmxvY2sgYmVoaW5kLlxuICB3cml0ZUZpbGVBdG9taWNTeW5jKGxvY2tmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICByZXR1cm4gbG9ja2ZpbGVQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWRTdGFydERpclBhdGggPSBwYXRoLnJlc29sdmUoc3RhcnREaXJQYXRoKTtcbiAgY29uc3QgcmVwb3NpdG9yeVJvb3REaXJQYXRoID0gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChyZXNvbHZlZFN0YXJ0RGlyUGF0aCk7XG4gIGlmICghcmVwb3NpdG9yeVJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkU3RhcnREaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpID8gbG9ja2ZpbGVQYXRoIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGRpclBhdGggPSByZXNvbHZlZFN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSkgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbiAgICBpZiAoZGlyUGF0aCA9PT0gcmVwb3NpdG9yeVJvb3REaXJQYXRoKSByZXR1cm47XG5cbiAgICBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgZGlyUGF0aCA9IHN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBkaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgcmV0dXJuO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG4iLCIvKiogV2hldGhlciBhIERvY2tlcmZpbGUgY29uc3VtZXMgd2IncyBnZW5lcmF0ZWQgbm9uLXNlY3JldCBlbnZpcm9ubWVudCBkaXJlY3RseSBvciB0aHJvdWdoIGl0cyBoZWxwZXIuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3VtZXNEb2NrZXJFbnYoZG9ja2VyZmlsZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZG9ja2VyZmlsZVRleHRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLnNvbWUoKGxpbmUpID0+ICEvXlxccyojL3UudGVzdChsaW5lKSAmJiAobGluZS5pbmNsdWRlcygnLmRvY2tlci5lbnYnKSB8fCBsaW5lLmluY2x1ZGVzKCdhcHBseS1kb2NrZXItZW52LnNoJykpKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy5hbnRpZ3Jhdml0eWNsaS8qKicsXG4gIC8vIEdpdCdzIG9iamVjdCBzdG9yZSBob2xkcyBjb3BpZXMgb2YgdHJhY2tlZCBmaWxlcyAoYW5kIGBkb3Q6IHRydWVgIG1ha2VzIHRoZW0gdmlzaWJsZSksIHNvXG4gIC8vIHNjYW5uaW5nIGl0IHdvdWxkIGJvdGggc2xvdyBldmVyeSBnbG9iIGRvd24gYW5kIGxldCBzdGFsZSBibG9icyBpbmZsdWVuY2UgZGV0ZWN0aW9uLlxuICAnKiovLmdpdC8qKicsXG4gIC8vIFRoZSBvcmctc3RhbmRhcmQgdGVtcG9yYXJ5IGRpcmVjdG9yeTsgc3RhbGUgY29waWVzIHVuZGVyIGl0IChlLmcuIHJldmlldyBzY3JhdGNoIGRpcnMpIG11c3RcbiAgLy8gbm90IGluZmx1ZW5jZSBsYW5ndWFnZSBkZXRlY3Rpb24uXG4gICcqKi8udG1wLyoqJyxcbiAgJyoqLy50bXAtKi8qKicsXG4gIC8vIExvY2FsIGNhY2hlcyBjYW4gY29udGFpbiBjb21wbGV0ZSB0aGlyZC1wYXJ0eSBzb3VyY2UgY2hlY2tvdXRzLiBUcmVhdGluZyB0aG9zZSBhcyByZXBvc2l0b3J5XG4gIC8vIGNvZGUgZ2VuZXJhdGVzIHdvcmtmbG93cyBmb3IgcGF0aHMgdGhhdCBhcmUgZ2l0aWdub3JlZCBhbmQgYWJzZW50IGZyb20gZnJlc2ggQ0kgY2hlY2tvdXRzLlxuICAnKiovLmNhY2hlLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxubGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICAvKiogQ29uZmluZXMgZ2VuZXJhdGVGaWxlIHdyaXRlcyB0byB0aGUgcmVwb3NpdG9yeSByb290ZWQgYXQgcm9vdERpclBhdGggKHVuZGVmaW5lZCBkaXNhYmxlcyBpdCkuICovXG4gIHNldFJvb3REaXJQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICByZWFsUm9vdERpclBhdGggPSByb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIG9ubHkgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gT3RoZXIgZmFpbHVyZXMgKGUuZy4gcGVybWlzc2lvbnMpIGFyZVxuICAgKiByZXRocm93biBzbyBjYWxsZXJzIHJlZ2VuZXJhdGluZyBjb25maWcgZmlsZXMgbmV2ZXIgb3ZlcndyaXRlIGNvbnRlbnQgdGhleSBjb3VsZCBub3QgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciBhIHdyaXRlIHRvIGZpbGVQYXRoIHdvdWxkIHBhc3MgdGhlIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMuICovXG4gIGFzeW5jIGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlYWRzIGEgc291cmNlIGZpbGUsIHJldHVybmluZyB1bmRlZmluZWQgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBPUiB3aGVuIGl0XG4gICAqIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIGEgY29tbWl0dGVkIHN5bWxpbmsgcG9pbnRpbmcgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSBtdXN0XG4gICAqIG5vdCBnZXQgaXRzIHRhcmdldCdzIGNvbnRlbnQgY29waWVkIGludG8gYSB0cmFja2VkIGZpbGUuIEEgc3ltbGluayB3aG9zZSByZXNvbHZlZCB0YXJnZXRcbiAgICogc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5IGlzIGxlZ2l0aW1hdGUgKGUuZy4gYC5ub2RlLXZlcnNpb24gLT4gLm52bXJjYCkgYW5kIGlzIHJlYWQuXG4gICAqL1xuICBhc3luYyByZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmICghc3RhdHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGxldCByZWFsRmlsZVBhdGg6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlYWxGaWxlUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGZpbGVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgZGFuZ2xpbmcgc3ltYm9saWMgbGluay5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgcmVhbFJvb3REaXJQYXRoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcmVhbEZpbGVQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiZcbiAgICAgICAgIXJlYWxGaWxlUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIGZpbGVQYXRoIChmb3JjZSwgb3B0aW9uYWxseSByZWN1cnNpdmUpIG9ubHkgd2hlbiBpdHMgUEFSRU5UIGRpcmVjdG9yeSByZXNvbHZlcyBpbnNpZGVcbiAgICogdGhlIHJlcG9zaXRvcnksIHNvIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBhIGNvbW1pdHRlZCAuZ2l0aHViL3dvcmtmbG93cyBsaW5rKSBjYW4gbmV2ZXJcbiAgICogbWFrZSBjbGVhbnVwIGRlbGV0ZSBmaWxlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBSZW1vdmluZyBhIHN5bWxpbmsgZW50cnkgaXRzZWxmIGlzIGFsbG93ZWQ6XG4gICAqIHRoYXQgZGVsZXRlcyBvbmx5IHRoZSBsaW5rLCBuZXZlciBpdHMgdGFyZ2V0LiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlbW92YWwgd2FzIHBlcmZvcm1lZC5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZW1vdmluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IG9wdGlvbnM/LnJlY3Vyc2l2ZSA/PyBmYWxzZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFdyaXRlcyBjb250ZW50IHZlcmJhdGltLCBhcHBseWluZyB0aGUgc2FtZSBzeW1saW5rL3JlcG9zaXRvcnktY29udGFpbm1lbnQgZ3VhcmRzIGFzIGdlbmVyYXRlRmlsZS4gKi9cbiAgYXN5bmMgd3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZmlsZSB3YXMgYWN0dWFsbHkgZ2VuZXJhdGVkIChmYWxzZSB3aGVuIHRoZSBjb25maW5lbWVudCBndWFyZHMgc2tpcCBpdCkuICovXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxpbmVFbmRpbmc6ICdcXG4nIHwgJ1xcclxcbicgPSAnXFxuJyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIGB0cmltYCB0cmVhdHMgYSBCT00gYXMgd2hpdGVzcGFjZSwgc28gaXQgaXMgcmVhdHRhY2hlZCBhdCBwb3NpdGlvbiAwOiBkcm9wcGluZyBpdCB3b3VsZFxuICAgIC8vIHJld3JpdGUgdGhlIGVuY29kaW5nIG1hcmtlciBvZiBhIGZpbGUgdGhlIGdlbmVyYXRvciB3YXMgb25seSBhc2tlZCB0byB1cGRhdGUuXG4gICAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IGNvbnRlbnQuc3RhcnRzV2l0aCgn77u/JykgPyAn77u/JyA6ICcnO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgPSBgJHtieXRlT3JkZXJNYXJrfSR7bm9ybWFsaXplZENvbnRlbnR9JHtsaW5lRW5kaW5nfWA7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIE5ldmVyIHdyaXRlIHRocm91Z2ggYSBzeW1saW5rOiBhIChwb3NzaWJseSBkYW5nbGluZykgbGluayBjb21taXR0ZWQgaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5XG4gIC8vIGNvdWxkIHJlZGlyZWN0IHRoZSB3cml0ZSBvdXRzaWRlIGl0LlxuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIGlmIChzdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB3cml0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gQSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSB3b3VsZCByZWRpcmVjdCByZWFkcywgd3JpdGVzLCBhbmQgcmVtb3ZhbHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSxcbi8vIHNvIHJlcXVpcmUgdGhlIGNsb3Nlc3QgZXhpc3RpbmcgYW5jZXN0b3IgdG8gcmVzb2x2ZSBpbnNpZGUgdGhlIHJvb3Qgc2V0IGJ5IHRoZSBDTEkgZW50cnkgcG9pbnQuXG5hc3luYyBmdW5jdGlvbiBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChyZWFsUm9vdERpclBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIGxldCBhbmNlc3RvclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMoYW5jZXN0b3JQYXRoKSkge1xuICAgIGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvclBhdGgpO1xuICB9XG4gIGNvbnN0IHJlYWxBbmNlc3RvclBhdGggPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFscGF0aChhbmNlc3RvclBhdGgpO1xuICByZXR1cm4gcmVhbEFuY2VzdG9yUGF0aCA9PT0gcmVhbFJvb3REaXJQYXRoIHx8IHJlYWxBbmNlc3RvclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG5cbi8qKlxuICogUnVucyBldmVyeSB0YXNrIGluIGBwcm9taXNlUG9vbGAgYW5kIHJlamVjdHMgd2l0aCB0aGUgZmlyc3QgZXJyb3Igb25seSBhZnRlciBhbGwgb2YgdGhlbSBzZXR0bGUsXG4gKiBzbyBhIGNhbGxlciB0aGF0IGNhdGNoZXMgdGhlIGVycm9yIG5ldmVyIHByb2NlZWRzIHdoaWxlIGEgc2libGluZyB3cml0ZSBpcyBzdGlsbCBydW5uaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQWxsSW5Qb29sKHRhc2tzOiByZWFkb25seSAoKCkgPT4gUHJvbWlzZTx1bmtub3duPilbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHRhc2tzLm1hcCgodGFzaykgPT4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKHRhc2spKSk7XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykgdGhyb3cgcmVzdWx0LnJlYXNvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQVBJIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3luYyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbi8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIChHbykgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGFuZCBub1xuLy8gbG9uZ2VyIGV4cG9zZXMgYW4gaW4tcHJvY2VzcyBwYXJzZXIgc3VjaCBhcyBgdHMuY3JlYXRlU291cmNlRmlsZWAuIFBhcnNpbmcgbm93XG4vLyBoYXBwZW5zIGluIGEgc3Bhd25lZCBjb21waWxlciBzZXJ2ZXIgcmVhY2hlZCB0aHJvdWdoIHRoZSBhc3luY2hyb25vdXMgQVBJLCBzbyB3ZVxuLy8ga2VlcCBhIHNpbmdsZSBsYXppbHktY3JlYXRlZCBpbnN0YW5jZSBhbmQgcmV1c2UgaXQgYWNyb3NzIGV2ZXJ5IGZpeGVyIHRvIGF2b2lkXG4vLyBwYXlpbmcgdGhlIHByb2Nlc3Mtc3Bhd24gY29zdCBwZXIgZmlsZS5cbmxldCBhcGk6IEFQSSB8IHVuZGVmaW5lZDtcbmxldCBjb25uZWN0ZWQ6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUGFyc2VzIGEgc291cmNlIGZpbGUgaW50byBhIFR5cGVTY3JpcHQgQVNUIHVzaW5nIHRoZSBidW5kbGVkIG5hdGl2ZSBjb21waWxlci5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29tcGlsZXIgY2Fubm90IGxvYWQgdGhlIGZpbGUgKGUuZy4gaXQgaXMgbWlzc2luZ1xuICogb3IgdW5wYXJzYWJsZSkgc28gY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIGNvbnNlcnZhdGl2ZSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb3VyY2VGaWxlIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXBpID0gYXdhaXQgZ2V0QXBpKCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBhcGkudXBkYXRlU25hcHNob3QoeyBvcGVuRmlsZXM6IFtmaWxlUGF0aF0gfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IGF3YWl0IHNuYXBzaG90LmdldERlZmF1bHRQcm9qZWN0Rm9yRmlsZShmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb2plY3Q/LnByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaHV0cyBkb3duIHRoZSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlci4gVGhlIHNlcnZlciBrZWVwcyBhbiBvcGVuIElQQyBjaGFubmVsXG4gKiB0aGF0IHdvdWxkIG90aGVyd2lzZSBrZWVwIHRoZSBydW50aW1lIGV2ZW50IGxvb3AgYWxpdmUsIHNvIHdiZnkgbXVzdCBjYWxsIHRoaXNcbiAqIG9uY2UgaXRzIHJ1biBmaW5pc2hlcyBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhcGk/LmNsb3NlKCk7XG4gIGFwaSA9IHVuZGVmaW5lZDtcbiAgY29ubmVjdGVkID0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcGkoKTogUHJvbWlzZTxBUEk+IHtcbiAgYXBpID8/PSBuZXcgQVBJKHsgY3dkOiBwcm9jZXNzLmN3ZCgpIH0pO1xuICAvLyBUaGUgY2xpZW50IG1hcmtzIGl0c2VsZiBjb25uZWN0ZWQgb25seSBvbmNlIGl0cyBmaXJzdCBzcGF3biBjb21wbGV0ZXMsIHNvIGNvbmN1cnJlbnRcbiAgLy8gZmlyc3QgcmVxdWVzdHMgKHRoZSBmaXhlcnMgcnVuIGluIHBhcmFsbGVsKSB3b3VsZCBlYWNoIHNwYXduIGEgY29tcGlsZXIgc2VydmVyOyB0aGVcbiAgLy8gZXh0cmEgc2VydmVycyBhcmUgbmV2ZXIgY2xvc2VkIGFuZCBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlIGFmdGVyIGBkaXNwb3NlVHlwZVNjcmlwdEFwaWAuXG4gIC8vIFRoZSBmaXJzdCByZXF1ZXN0IGlzIHRoZXJlZm9yZSBhd2FpdGVkIG9uY2UgYmVmb3JlIGFueSBvdGhlciBpcyBzZW50OyBhIGZhaWxlZCBvbmUgaXNcbiAgLy8gZm9yZ290dGVuIHNvIHRoYXQgdGhlIG5leHQgcmVxdWVzdCBjb25uZWN0cyBhZ2FpbiBpbnN0ZWFkIG9mIGZhaWxpbmcgZm9yIHRoZSB3aG9sZSBydW4uXG4gIGNvbm5lY3RlZCA/Pz0gYXBpLnVwZGF0ZVNuYXBzaG90KCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgY29ubmVjdGVkID0gdW5kZWZpbmVkO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgYXdhaXQgY29ubmVjdGVkO1xuICByZXR1cm4gYXBpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbi8vIFNldHRpbmdzIGV2ZXJ5IFdpbGxCb29zdGVyIE5leHQuanMgcHJvamVjdCBzaG91bGQgY2FycnkuIGBuYW1lYCBpcyB0aGUgdG9wLWxldmVsXG4vLyBwcm9wZXJ0eSBrZXkgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgc2V0dGluZyBhbHJlYWR5IGV4aXN0czsgYHRleHRgIGlzIGluc2VydGVkXG4vLyB2ZXJiYXRpbSAoYSB3aG9sZSBga2V5OiB2YWx1ZWAgcGFpcikgd2hlbiB0aGUga2V5IGlzIG1pc3NpbmcuXG5jb25zdCBtYW5hZ2VkUHJvcGVydGllczogcmVhZG9ubHkgeyBuYW1lOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXG4gIHsgbmFtZTogJ3JlYWN0Q29tcGlsZXInLCB0ZXh0OiAncmVhY3RDb21waWxlcjogdHJ1ZScgfSxcbiAgeyBuYW1lOiAncmVhY3RTdHJpY3RNb2RlJywgdGV4dDogJ3JlYWN0U3RyaWN0TW9kZTogdHJ1ZScgfSxcbiAgeyBuYW1lOiAndHlwZXNjcmlwdCcsIHRleHQ6ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ3RzJywgJ210cycsICdjdHMnLCAnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IGF3YWl0IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gPSBleHRyYWN0ZWQ7XG5cbiAgICAvLyBgcHJvcGVydGllc2AgaW5jbHVkZXMgc3ByZWFkIGFzc2lnbm1lbnRzIChgLi4ucmVzdGApIHRoYXQgY2Fycnkgbm8gbmFtZSwgc28gZ3VhcmQgYmVmb3JlIHJlYWRpbmcgaXQuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChcbiAgICAgIG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PlxuICAgICAgICAnbmFtZScgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubmFtZSA/IGdldFByb3BlcnR5S2V5KHByb3BlcnR5Lm5hbWUsIHNvdXJjZSkgOiB1bmRlZmluZWRcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHMgPSBtYW5hZ2VkUHJvcGVydGllc1xuICAgICAgLmZpbHRlcigocHJvcGVydHkpID0+ICFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKHByb3BlcnR5Lm5hbWUpKVxuICAgICAgLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnRleHQpO1xuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IHNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgLy8gVGhlIG5hdGl2ZSBUUyBBU1QgZG9lcyBub3QgcmVsaWFibHkgZXhwb3NlIGBwcm9wZXJ0aWVzLmhhc1RyYWlsaW5nQ29tbWFgLCBzbyBzY2FuIHRoZSBzb3VyY2VcbiAgICAvLyBiZXR3ZWVuIHRoZSBsYXN0IHByb3BlcnR5IGFuZCB0aGUgY2xvc2luZyBicmFjZS4gU3RyaXAgY29tbWVudHMgZmlyc3Qgc28gYSBjb21tYSBpbnNpZGUgYVxuICAgIC8vIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4gYGZvbzogMSAvLyBhLCBiYCkgaXMgbm90IG1pc3Rha2VuIGZvciBhIHJlYWwgdHJhaWxpbmcgY29tbWEuXG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IHN0cmlwQ29tbWVudHMob2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KSkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHsgc291cmNlOiBhc3QuU291cmNlRmlsZTsgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkIGRlY2xhcmVzIHRoZSBjb25maWcgYXMgYGNvbnN0IG5leHRDb25maWc6IE5leHRDb25maWcgPSB7IC4uLiB9YCBhbmRcbiAgLy8gZXhwb3J0cyBpdCAocG9zc2libHkgd3JhcHBlZCwgZS5nLiBgd2l0aFNlbnRyeUNvbmZpZyguLi4pYCksIHNvIHRoZSBvYmplY3QgbGl0ZXJhbCBpcyByYXJlbHlcbiAgLy8gdGhlIGRpcmVjdCBvcGVyYW5kIG9mIGBleHBvcnQgZGVmYXVsdGAvYG1vZHVsZS5leHBvcnRzYC4gQ29sbGVjdCBldmVyeSBjYW5kaWRhdGUgYW5kIHBpY2sgdGhlXG4gIC8vIG1vc3QgYXV0aG9yaXRhdGl2ZSBvbmUgYmVsb3cuXG4gIGxldCBkaXJlY3RPYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGxldCBleHBvcnRlZElkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmFyaWFibGVPYmplY3RMaXRlcmFscyA9IG5ldyBNYXA8c3RyaW5nLCBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24+KCk7XG4gIGNvbnN0IHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHM6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbltdID0gW107XG5cbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoYXN0LmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFzdC5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSBhc3QuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJ1xuICAgICkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5yaWdodCk7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUucmlnaHQpKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5yaWdodC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhc3QuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuaW5pdGlhbGl6ZXIpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwgJiYgYXN0LmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuc2V0KG5vZGUubmFtZS5nZXRUZXh0KHNvdXJjZSksIG9iamVjdExpdGVyYWwpO1xuICAgICAgICAvLyBUaGUgYDogTmV4dENvbmZpZ2AgYW5ub3RhdGlvbiB3YmZ5IHdyaXRlcyBtYXJrcyB0aGUgY2Fub25pY2FsIGNvbmZpZyBvYmplY3QgKGFjY2VwdGluZ1xuICAgICAgICAvLyBxdWFsaWZpZWQgbmFtZXMgc3VjaCBhcyBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2ApLlxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IG5vZGUudHlwZT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBpZiAoYW5ub3RhdGlvblR5cGUgIT09IHVuZGVmaW5lZCAmJiBpc05leHRDb25maWdUeXBlKGFubm90YXRpb25UeXBlKSkge1xuICAgICAgICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHMucHVzaChvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIGNvbnN0IG9iamVjdExpdGVyYWwgPVxuICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHNbMF0gPz9cbiAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/XG4gICAgKGV4cG9ydGVkSWRlbnRpZmllciA/IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KGV4cG9ydGVkSWRlbnRpZmllcikgOiB1bmRlZmluZWQpID8/XG4gICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoJ25leHRDb25maWcnKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWwgPyB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJlbnRoZXNlcyhub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5FeHByZXNzaW9uIHtcbiAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICB3aGlsZSAoYXN0LmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5leHByZXNzaW9uO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBNYXRjaCBib3RoIHRoZSBiYXJlIGBOZXh0Q29uZmlnYCBhbmQgcXVhbGlmaWVkIGZvcm1zIGxpa2UgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgLlxuZnVuY3Rpb24gaXNOZXh0Q29uZmlnVHlwZSh0eXBlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlVGV4dCA9PT0gJ05leHRDb25maWcnIHx8IHR5cGVUZXh0LmVuZHNXaXRoKCcuTmV4dENvbmZpZycpO1xufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBrZXkgd2l0aG91dCBzdXJyb3VuZGluZyBxdW90ZXMsIHNvIGAncmVhY3RDb21waWxlcidgIG1hdGNoZXMgYHJlYWN0Q29tcGlsZXJgLlxuLy8gSWRlbnRpZmllciwgc3RyaW5nLWxpdGVyYWwgYW5kIG51bWVyaWMtbGl0ZXJhbCBuYW1lcyBhbGwgZXhwb3NlIHRoZSB1bnF1b3RlZCB2YWx1ZSB2aWEgYC50ZXh0YC5cbmZ1bmN0aW9uIGdldFByb3BlcnR5S2V5KG5hbWU6IGFzdC5Qcm9wZXJ0eU5hbWUsIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICByZXR1cm4gJ3RleHQnIGluIG5hbWUgJiYgdHlwZW9mIG5hbWUudGV4dCA9PT0gJ3N0cmluZycgPyBuYW1lLnRleHQgOiBuYW1lLmdldFRleHQoc291cmNlKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9cXC9cXC9bXlxcbl0qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4Q2hha3JhVG9hc3RlcicsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90b2FzdGVyLnt0cyx0c3h9Jywge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgaWdub3JlOiBbJyoqLy4qLyoqJywgJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRlbnQuaW5jbHVkZXMoJ0NyZWF0ZVRvYXN0ZXJSZXR1cm4nKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcyhcImZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnXCIpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gY29udGVudFxuICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAvXmltcG9ydCAuKiBmcm9tICdAY2hha3JhLXVpXFwvcmVhY3QnOyQvbXUsXG4gICAgICAgICAgXCIkJlxcbmltcG9ydCB0eXBlIHsgQ3JlYXRlVG9hc3RlclJldHVybiB9IGZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnO1wiXG4gICAgICAgIClcbiAgICAgICAgLnJlcGxhY2UoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignLCAnZXhwb3J0IGNvbnN0IHRvYXN0ZXI6IENyZWF0ZVRvYXN0ZXJSZXR1cm4gPSBjcmVhdGVUb2FzdGVyKCcpO1xuICAgICAgaWYgKHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZTtcbiAgbm9kZTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0czogYm9vbGVhbik6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IHVzZSA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSk7XG5cbiAgaWYgKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKSB7XG4gICAgdXNlLnByb3BlcnRpZXMuYmFzZVVSTCA9IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyk7XG4gICAgdXNlLm1lbWJlck9yZGVyLnVuc2hpZnQoeyBraW5kOiAncHJvcGVydHknLCBrZXk6ICdiYXNlVVJMJyB9KTtcbiAgfVxuXG4gIHJldHVybiB0b1BhcnNlZE9iamVjdCh7XG4gICAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICAgIHVzZTogeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHVzZSB9LFxuICAgIC4uLihzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0c1xuICAgICAgPyB7XG4gICAgICAgICAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgICAgICAgICBjb21tYW5kOiBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKSxcbiAgICAgICAgICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgICAgICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICAgICAgICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgICAgICAgICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBhd2FpdCBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyB3YiBkZXJpdmVzIE5FWFRfUFVCTElDX0JBU0VfVVJMIGZyb20gdGhlIHJlc29sdmVkIHBvcnQgZm9yIE5leHQuanMvdmluZXh0IGFwcHMgKHZpbmV4dFxuICAgIC8vIGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gYGRlcGVuZGluZy5uZXh0YCBjb3ZlcnMgYm90aCksIHNvIHRob3NlIG5lZWQgbm8gZGVjbGFyZWRcbiAgICAvLyB2YXJpYWJsZTsgb3RoZXIgcGFja2FnZXMgc3RpbGwgcmVxdWlyZSBhIGRlY2xhcmF0aW9uLlxuICAgIGNvbnN0IHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzID1cbiAgICAgIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZywgcGFyc2VkKSAmJlxuICAgICAgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCAoYXdhaXQgZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKSkpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKG1lcmdlZCwgZGVmYXVsdENvbmZpZyk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeVZhbHVlKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZWQgfSwgMCk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlLnRleHQ7XG4gICAgY29uc3Qgc3RhcnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0U3RhcnQoZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGNvbnN0IGVuZCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBzdGFydCl9JHtuZXdPYmplY3RMaXRlcmFsfSR7b2xkQ29udGVudC5zbGljZShlbmQpfWA7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2U6IFBhcnNlZE9iamVjdCwgb3ZlcnJpZGU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcGVydHlLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhvdmVycmlkZS5wcm9wZXJ0aWVzKSk7XG4gIGNvbnN0IGV4dHJhTWVtYmVycyA9IFsuLi5iYXNlLmV4dHJhTWVtYmVycywgLi4ub3ZlcnJpZGUuZXh0cmFNZW1iZXJzXTtcbiAgLy8gS2VlcCBkZWZhdWx0LW9ubHkgbWVtYmVycyBiZWZvcmUgcGFyc2VkIG1lbWJlcnMgc28gc3ByZWFkcyBhbmQgZXhwbGljaXQgbG9jYWwgcHJvcGVydGllcyByZXRhaW4gcHJlY2VkZW5jZS5cbiAgY29uc3QgbWVtYmVyT3JkZXIgPSBbXG4gICAgLi4uYmFzZS5tZW1iZXJPcmRlci5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgIT09ICdwcm9wZXJ0eScgfHwgIW92ZXJyaWRlUHJvcGVydHlLZXlzLmhhcyhtZW1iZXIua2V5KSksXG4gICAgLi4ub3ZlcnJpZGUubWVtYmVyT3JkZXIubWFwKChtZW1iZXIpOiBPYmplY3RNZW1iZXIgPT4ge1xuICAgICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSByZXR1cm4gbWVtYmVyO1xuICAgICAgcmV0dXJuIHsga2luZDogJ2V4dHJhJywgaW5kZXg6IGJhc2UuZXh0cmFNZW1iZXJzLmxlbmd0aCArIG1lbWJlci5pbmRleCB9O1xuICAgIH0pLFxuICBdO1xuICBjb25zdCBwcm9wZXJ0aWVzID0geyAuLi5iYXNlLnByb3BlcnRpZXMgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGUucHJvcGVydGllcykpIHtcbiAgICBwcm9wZXJ0aWVzW2tleV0gPSBtZXJnZVBhcnNlZFZhbHVlKHByb3BlcnRpZXNba2V5XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB7IGV4dHJhTWVtYmVycywgbWVtYmVyT3JkZXIsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRWYWx1ZShiYXNlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCwgb3ZlcnJpZGU6IFBhcnNlZFZhbHVlKTogUGFyc2VkVmFsdWUge1xuICBpZiAoYmFzZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgb3ZlcnJpZGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlLnZhbHVlLCBvdmVycmlkZS52YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4gb3ZlcnJpZGU7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKGNvbmZpZzogUGFyc2VkT2JqZWN0LCBkZWZhdWx0Q29uZmlnOiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3QgdXNlID0gY29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBjb25zdCBkZWZhdWx0VXNlID0gZGVmYXVsdENvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgaWYgKHVzZT8ua2luZCAhPT0gJ29iamVjdCcgfHwgZGVmYXVsdFVzZT8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RyYWNlJywgJ3NjcmVlbnNob3QnLCAndmlkZW8nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRVc2UudmFsdWUucHJvcGVydGllc1trZXldO1xuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcGFyc2VkOiBQYXJzZWRPYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZGVwZW5kaW5nLm5leHQgfHxcbiAgICBwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgIGRvZXNPYmplY3RIYXZlQmFzZVVybChwYXJzZWQucHJvcGVydGllcy51c2UpIHx8XG4gICAgZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZCB9LCAnTkVYVF9QVUJMSUNfQkFTRV9VUkwnKVxuICApO1xufVxuXG5mdW5jdGlvbiBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwodmFsdWU6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgdmFsdWUudmFsdWUucHJvcGVydGllcy5iYXNlVVJMICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGl0ZXJhbFRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWUuaW5jbHVkZXMobGl0ZXJhbFRleHQpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5JykgcmV0dXJuIHZhbHVlLnZhbHVlLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKTtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnMuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIuaW5jbHVkZXMobGl0ZXJhbFRleHQpKSB8fFxuICAgIE9iamVjdC52YWx1ZXModmFsdWUudmFsdWUucHJvcGVydGllcykuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgZW52IGZpbGVzIGFyZSBleHBlY3RlZCBpbiBzb21lIHJlcG9zLlxuICAgIH1cbiAgfVxuXG4gIC8vIFNvbWUgUGxheXdyaWdodCBjb25maWdzIG9ubHkgZGVmaW5lIGJyb3dzZXIgcHJvamVjdHMgb3IgZml4dHVyZXMgYW5kIGRvIG5vdFxuICAvLyBzdGFydCBhIHdlYiBhcHAuIEF2b2lkIGZvcmNpbmcgYW4gYXBwLXNlcnZlciBVUkwgaW50byB0aG9zZSBwYWNrYWdlcy5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJ2Zub3gudG9tbCcsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChvYmplY3Q6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgY29tbWFuZCA9IHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQ7XG4gIC8vIExpYnJhcmllcyBjYW4gdXNlIFBsYXl3cmlnaHQncyB3ZWJTZXJ2ZXIgdG8gYnVpbGQgYW5kIGxhdW5jaCBhIGZpeHR1cmUgZXZlbiB0aG91Z2ggYHdiIHN0YXJ0YFxuICAvLyBpbnRlbnRpb25hbGx5IGhhcyBubyB0ZXN0IHNlcnZlciBmb3IgdGhlIGxpYnJhcnkgaXRzZWxmLiBQcmVzZXJ2ZSB0aG9zZSBjdXN0b20gbGlmZWN5Y2xlXG4gIC8vIGNvbW1hbmRzOyBvbmx5IGFkZCB0aGUgY29tbWFuZCB3aGVuIHdiZnkgYWxyZWFkeSBvd25zIGl0LlxuICBpZiAoY29tbWFuZCAmJiAhaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZCkpIHJldHVybjtcblxuICAvLyBQbGF5d3JpZ2h0IHJlcXVpcmVzIGBjb21tYW5kYCB3aGVuZXZlciBgd2ViU2VydmVyYCBleGlzdHM7IGFuIGV4dGVybmFsbHkgbWFuYWdlZCBzZXJ2ZXIgc2hvdWxkXG4gIC8vIG9taXQgYHdlYlNlcnZlcmAgaW5zdGVhZC4gS2VlcCBmaWxsaW5nIHRoaXMgcmVxdWlyZWQgZmllbGQgd2hlbiBhIHBhcnRpYWwgbWFuYWdlZCBibG9jayBsYWNrcyBpdC5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kOiBQYXJzZWRWYWx1ZSk6IGJvb2xlYW4ge1xuICBpZiAoY29tbWFuZC5raW5kICE9PSAnbGl0ZXJhbCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbW1hbmQudmFsdWUudHJpbSgpID09PSBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk6IHN0cmluZyB7XG4gIHJldHVybiBgJ2J1biB3YiBzdGFydCAtLW1vZGUgdGVzdCdgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmIChhc3QuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBhc3QuRXhwcmVzc2lvbiwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKGFzdC5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8XG4gICAgICAoIWFzdC5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIWFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG50eXBlIFdpbGxCb29zdGVyT3JnYW5pemF0aW9uID0gJ1dpbGxCb29zdGVyJyB8ICdXaWxsQm9vc3RlckxhYic7XG50eXBlIFJlcG9zaXRvcnlGdWxsTmFtZSA9IGAke1dpbGxCb29zdGVyT3JnYW5pemF0aW9ufS8ke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZub3hSZXBvc2l0b3J5U2NvcGUge1xuICBvcmdhbml6YXRpb25zPzogcmVhZG9ubHkgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb25bXTtcbiAgcmVwb3NpdG9yaWVzPzogcmVhZG9ubHkgUmVwb3NpdG9yeUZ1bGxOYW1lW107XG4gIC8vIFJlc3RyaWN0cyB0aGUgc2NvcGUgdG8gcmVwb3NpdG9yaWVzIG9mIHRoZSBnaXZlbiB2aXNpYmlsaXR5LiBQdWJsaWMgcmVwb3NpdG9yaWVzIHB1Ymxpc2ggdGhlaXJcbiAgLy8gY2lwaGVydGV4dHMgdG8gdGhlIHdvcmxkLCBzbyB0aGV5IG11c3QgdXNlIGEgQ0kgaWRlbnRpdHkgc2VwYXJhdGUgZnJvbSB0aGUgb3JnLWludGVybmFsIG9uZTpcbiAgLy8gbGVha2luZyBlaXRoZXIgQ0kga2V5IG11c3Qgbm90IGV4cG9zZSB0aGUgb3RoZXIgc2lkZSdzIHNlY3JldHMuXG4gIHZpc2liaWxpdHk/OiAncHVibGljJyB8ICdwcml2YXRlJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VQcmluY2lwYWwge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZXBvc2l0b3J5U2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGU7XG4gIC8vIE1hcmtzIHRoZSBwcmluY2lwYWwgYXMgYSBDSSBpZGVudGl0eSBhbmQgbmFtZXMgdGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyBpdHMgcHJpdmF0ZSBrZXkuXG4gIC8vIEV2ZXJ5IGZub3gtbWFuYWdlZCByZXBvc2l0b3J5IG11c3QgcmVzb2x2ZSBvbmUgKGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG90aGVyd2lzZTogYVxuICAvLyByb3N0ZXIgd2l0aG91dCBhIENJIHJlY2lwaWVudCB3b3VsZCByZS1lbmNyeXB0IHNlY3JldHMgdGhhdCBDSSBjYW4gbmV2ZXIgZGVjcnlwdCBhZ2FpbiksIGFuZFxuICAvLyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yIGRlcml2ZXMgaXRzIGNhbGxlciBtYXBwaW5ncyBmcm9tIHRoZSBzYW1lIHJlc29sdXRpb24gc28gdGhlIHR3byBjYW5cbiAgLy8gbmV2ZXIgZGlzYWdyZWUgb24gd2hpY2ggQ0kgaWRlbnRpdHkgYXBwbGllcy5cbiAgY2lBZ2VLZXlTZWNyZXROYW1lPzogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUmVjaXBpZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXk6IHN0cmluZztcbn1cblxuLy8gVGhlIGFnZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgdG8gZGVjcnlwdCBlYWNoIGZub3gtbWFuYWdlZCByZXBvc2l0b3J5LiBUbyBncmFudCBhY2Nlc3MsIGFkZCB0aGVcbi8vIHByaW5jaXBhbCdzIHB1YmxpYyBrZXlzIGFuZCByZXBvc2l0b3J5IHNjb3BlIGhlcmUuIE9yZ2FuaXphdGlvbiBzY29wZXMgaW5jbHVkZSBldmVyeSBjdXJyZW50IGFuZFxuLy8gZnV0dXJlIHJlcG9zaXRvcnkgaW4gdGhhdCBvcmdhbml6YXRpb247IHVzZSByZXBvc2l0b3JpZXMgZm9yIGV4YWN0IG93bmVyL3JlcG9zaXRvcnkgZ3JhbnRzLiBUaGVcbi8vIG5leHQgd2JmeSBydW4gb24gZWFjaCBtYXRjaGluZyByZXBvc2l0b3J5IHJld3JpdGVzIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sIGFuZCByZS1lbmNyeXB0cyBpdHNcbi8vIGNvbW1pdHRlZCBzZWNyZXRzIGZvciB0aGUgcmVzdWx0aW5nIHJlY2lwaWVudCBzZXQuIEEgc2NvcGUncyBvcHRpb25hbCB2aXNpYmlsaXR5IGNvbnN0cmFpbnRcbi8vIHNlbGVjdHMgb25seSBwdWJsaWMgb3Igb25seSBwcml2YXRlIHJlcG9zaXRvcmllcyAodXNlZCB0byBrZWVwIHRoZSBvcmctaW50ZXJuYWwgYW5kIHRoZVxuLy8gcHVibGljLXJlcG9zaXRvcnkgQ0kgaWRlbnRpdGllcyBhcGFydCkuIFJlbW92aW5nIGEgc2NvcGUgY2Fubm90IHJldm9rZSBjaXBoZXJ0ZXh0XG4vLyBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIEdpdCBoaXN0b3J5LCBzbyByb3RhdGUgdGhlIHNlY3JldCB2YWx1ZXMgdGhhdCBwcmluY2lwYWwgY291bGQgZGVjcnlwdC5cbi8vIE9ubHkgcHVibGljIGtleXMgbWF5IGFwcGVhciBoZXJlOyBhIENJIGlkZW50aXR5J3MgcHJpdmF0ZSBrZXkgc3VwcGxpZXMgdGhlIEZOT1hfQUdFX0tFWSAob3IsXG4vLyBmb3IgcHVibGljIHJlcG9zaXRvcmllcywgUFVCTElDX0ZOT1hfQUdFX0tFWSkgb3JnYW5pemF0aW9uIHNlY3JldC5cbmV4cG9ydCBjb25zdCBGTk9YX0FHRV9QUklOQ0lQQUxTID0gW1xuICB7XG4gICAgbmFtZTogJ2V4a2F6dXUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWoyMzU0eGh2bTNmdjl5Nzd0NWc2eTNxOG1leGdrMm1mMDB0Z3JremdwNzN0eW5ydno1NXM4YXVheXcnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncG9uaGFydScsXG4gICAgcHVibGljS2V5czogW1xuICAgICAgJ2FnZTE4cnVnbGRmOWh0YzZ1bTVlcGxweDI3azUzZXA0em4wbGh6d2ZmZ254emhycTBjN3pndnlxM3pjY2R5JyxcbiAgICAgICdhZ2Uxbnoybjk5Y3JqcjducDl4amdsd2ZmZmMzZHVkNDVkaGV3cXpxZnpwenRrZHd1NGhqNzRncTZlbDUzMycsXG4gICAgXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5ICh0aGUgRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2IudHh0KS5cbiAgICBuYW1lOiAnY2knLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWEyYzZlZjZhaGw2bW1raGdxdHhnMG1ndGQ3eXNzcG50cTdyeHVzdjI2ZWZ4aG51aGxjZHNyOWRwYWsnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddLCB2aXNpYmlsaXR5OiAncHJpdmF0ZScgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdGTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgLy8gVGhlIENJIGlkZW50aXR5IGRlZGljYXRlZCB0byBwdWJsaWMgcmVwb3NpdG9yaWVzICh0aGUgUFVCTElDX0ZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb25cbiAgICAvLyBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2ItcHVibGljLnR4dCkuIFNjb3BlZCB0byBXaWxsQm9vc3RlciBvbmx5IGJlY2F1c2UgdGhlXG4gICAgLy8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGF0IG9yZ2FuaXphdGlvbiBhbG9uZTsgYSBwdWJsaWNcbiAgICAvLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5IHJlc29sdmVzIE5PIENJIGlkZW50aXR5IGFuZCBnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvbiBpdFxuICAgIC8vIChXaWxsQm9vc3RlckxhYiBkb2VzIG93biBwdWJsaWMgcmVwb3NpdG9yaWVzLCBlLmcuIGl0cyByZXVzYWJsZS13b3JrZmxvd3Mgc3luYyBtaXJyb3IsIGJ1dFxuICAgIC8vIG5vbmUgb2YgdGhlbSB1c2UgZm5veCDigJQgcmVnaXN0ZXIgdGhlIHNlY3JldCB0aGVyZSBhbmQgZXh0ZW5kIHRoaXMgc2NvcGUgaWYgb25lIGV2ZXIgZG9lcykuXG4gICAgbmFtZTogJ2NpLXB1YmxpYycsXG4gICAgcHVibGljS2V5czogWydhZ2UxZmhlYTg1eGp3cDg5bHdxM2pjbndqMzJzd2gzdjI0cHdwYXJxaDVsN3FrZ3ZjNGF4M3AwcWw2ZHUzNiddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJ10sIHZpc2liaWxpdHk6ICdwdWJsaWMnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnUFVCTElDX0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncmVtaW4nLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW13NHB6OWR1ank5ZG1oazBwYWxxYXdqa2o3bTRrN3p4Nzh5cjlmanQ2M3NhNWwzZTQzdXE2bncwMDQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXJpZXMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW5uMGVoeWFlbnlxOGttbnE0Mjk0a3p6Z3h2NWRuZjZwZXAyY2RrcmF4emZxbGs3eGdzcnFxbjZubjknXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogW1xuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnQtY2hhbGxlbmdlcycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudGljLXdvcmtmbG93cy1kYXNoYm9hcmQnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hlZXJsaW5ncycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL3Byb21wdC1zdHVkeScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9leGVyY29kZScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9qdWRnZScsXG4gICAgICBdLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnc3VuYWdhJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF1bHh6bjZ5NjhrdTM0Y3B4NWZ5YTVnZjdybnJ3ejB1ZmxueWU2dXh1aGczNHAybmpoZ2txbWc3M2c0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdheWFtZScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdnhtMmdzMDAzcnV3bThwNmgzaHY3eGFzanUyczhrNG14bWMzNHptNmdyZHd6bnJzMDlucTZ4ejV2eiddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IEZub3hBZ2VQcmluY2lwYWxbXTtcblxuaW50ZXJmYWNlIEZub3hUb21sIHtcbiAgaW1wb3J0PzogdW5rbm93bjtcbiAgcHJvdmlkZXJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxubGV0IGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG5sZXQgbWlncmF0aW9uTWFya2VyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG5cbi8qKiBXaGV0aGVyIGFueSBmbm94IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gZmFpbGVkIGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnk7IHNldHVwU2VjcmV0cyBtdXN0IG5vdCB1cGxvYWQgdGhlbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGbm94U3luY0ZhaWxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZub3hTeW5jRmFpbGVkO1xufVxuXG4vKipcbiAqIFN5bmNocm9uaXplcyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gZXZlcnkgZm5veC50b21sIHdpdGggdGhlIHByaW5jaXBhbHMgYXV0aG9yaXplZCBmb3IgdGhpc1xuICogcmVwb3NpdG9yeSBhbmQgcmUtZW5jcnlwdHMgdGhlIGNvbW1pdHRlZCBzZWNyZXRzIHdoZW4gdGhlIHJlY2lwaWVudCBzZXQgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRm5veFRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGhlIGZhaWx1cmUgZmxhZyBpcyBwZXIgcmVwb3NpdG9yeTogd2JmeSBjYW4gcHJvY2VzcyBtdWx0aXBsZSB3b3JraW5nIGRpcmVjdG9yaWVzIGluIG9uZVxuICAgIC8vIGludm9jYXRpb24sIGFuZCBhbiBlYXJsaWVyIHJlcG9zaXRvcnkncyBmYWlsdXJlIG11c3Qgbm90IHZldG8gYSBsYXRlciByZXBvc2l0b3J5J3MgdXBsb2FkLlxuICAgIGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG4gICAgLy8gQSByZXBvc2l0b3J5IG91dHNpZGUgV2lsbEJvb3N0ZXIvV2lsbEJvb3N0ZXJMYWIgbWFuYWdlcyBpdHMgb3duIHJlY2lwaWVudCBzZXQgKGUuZy4gYVxuICAgIC8vIHBlcnNvbmFsIHJlcG9zaXRvcnkgd2l0aCBpdHMgb3duIENJIGlkZW50aXR5KSwgc28gcmV3cml0aW5nIGl0IHRvIHRoZSBvcmcgcm9zdGVyIHdvdWxkIGdyYW50XG4gICAgLy8gb3JnIG1lbWJlcnMgYWNjZXNzIGFuZCByZS1lbmNyeXB0IHNlY3JldHMgZm9yIGEgQ0kga2V5IHRoYXQgcmVwb3NpdG9yeSBkb2VzIG5vdCB1c2UuXG4gICAgLy8gc2V0dXBTZWNyZXRzIG5ldmVyIHVwbG9hZHMgc2VjcmV0cyBmb3Igc3VjaCByZXBvc2l0b3JpZXMgZWl0aGVyLCBzbyBza2lwIGVudGlyZWx5LlxuICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykgcmV0dXJuO1xuICAgIGNvbnN0IGFnZVJlY2lwaWVudHMgPSBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnKTtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIEEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgaXMgdW5zdXBwb3J0ZWQ6IHNldHVwU2VjcmV0cyB3b3VsZCB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmRcbiAgICAgIC8vIGRlbGV0ZSBGTk9YX0FHRV9LRVkgZXZlbiB0aG91Z2ggdGhlIG5lc3RlZCBjb25maWcncyBDSSBzdGlsbCBuZWVkcyBpdC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIE9ubHkgYWdlLXVzaW5nIGNvbmZpZ3MgY2FycnkgdGhhdCByaXNrLiBXaXRob3V0IGEgcm9vdCBwcm92aWRpbmcgdGhlIGFnZSBwcm92aWRlciwgYVxuICAgICAgICAvLyBzdHJheSBjb25maWcgdGhhdCBkZWNsYXJlcyBub25lIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIChlLmcuIGEgcGxhaW50ZXh0IHRlc3RcbiAgICAgICAgLy8gZml4dHVyZSBvciBleGFtcGxlIGNvbmZpZyBhbnkgcmVwb3NpdG9yeSBtYXkgbGVnaXRpbWF0ZWx5IGNvbW1pdCksIHNvIGl0IG5laXRoZXIgbmVlZHNcbiAgICAgICAgLy8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBub3Igb3ducyBhbiBGTk9YX0FHRV9LRVkgYW5kIG11c3Qgbm90IGJsb2NrIHRoZSBydW4uXG4gICAgICAgIGNvbnN0IHN0cmF5RmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKS5maWx0ZXIoKGZpbGVQYXRoKSA9PlxuICAgICAgICAgIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoc3RyYXlGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggY29uZmlncyBleGlzdCB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWw6ICR7c3RyYXlGaWxlUGF0aHMuam9pbignLCAnKX0uIEFkZCBhIHJvb3QgZm5veC50b21sLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGYWlsIGNsb3NlZDogd2l0aG91dCBnaXQgaW5mb3JtYXRpb24gYSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBjYW5ub3QgYmUgcnVsZWQgb3V0LCBhbmRcbiAgICAgICAgLy8gc2V0dXBTZWNyZXRzIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmQgZGVsZXRlIEZOT1hfQUdFX0tFWS5cbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY2hlY2sgZm9yIG5lc3RlZCBmbm94IGNvbmZpZ3MgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3J9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIGZhaWxlZCB2aXNpYmlsaXR5IGxvb2t1cCBjb2xsYXBzZXMgaXNQdWJsaWNSZXBvIHRvIGZhbHNlLCB3aGljaCB3b3VsZCBzaWxlbnRseSByZS1lbmNyeXB0XG4gICAgLy8gYSBwdWJsaWMgcmVwb3NpdG9yeSdzIHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzIHRvIHRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKGFuZCB2aWNlXG4gICAgLy8gdmVyc2EgZHJvcCB0aGUgcHVibGljIG9uZSkuIEZhaWwgaW5zdGVhZCBvZiBndWVzc2luZyB3aGVuZXZlciB2aXNpYmlsaXR5IGNoYW5nZXMgdGhlIHJvc3Rlci5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duICYmIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIHRoZSB2aXNpYmlsaXR5IG9mICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChHaXRIdWIgbG9va3VwIGZhaWxlZCkgYW5kIHRoZSBDSSByZWNpcGllbnQgZGVwZW5kcyBvbiBpdC4gQ2hlY2sgbmV0d29yayBhbmQgZ2ggYXV0aGVudGljYXRpb24sIHRoZW4gcmVydW4gd2JmeS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBCb3RoIENJIGlkZW50aXRpZXMgYXJlIHZpc2liaWxpdHktY29uc3RyYWluZWQsIHNvIGEgcmVwb3NpdG9yeSBjYW4gZmFsbCB0aHJvdWdoIEJPVEggKGUuZy4gYVxuICAgIC8vIHB1YmxpYyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5LCB3aG9zZSBvcmdhbml6YXRpb24gaGFzIG5vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0KS5cbiAgICAvLyBSZS1lbmNyeXB0aW5nIGZvciBhIHJvc3RlciB3aXRob3V0IGEgQ0kgaWRlbnRpdHkgd291bGQgbGVhdmUgQ0kgdW5hYmxlIHRvIGRlY3J5cHQgYW55dGhpbmcsXG4gICAgLy8gZmFpbGluZyBvbmx5IGF0IHJ1bnRpbWUgaW4gQWN0aW9uczsgZmFpbCBsb3VkbHkgaGVyZSBpbnN0ZWFkLlxuICAgIGlmICghcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugbm8gQ0kgaWRlbnRpdHkgaXMgc2NvcGVkIHRvICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IChwdWJsaWMgcmVwb3NpdG9yaWVzIGFyZSBzdXBwb3J0ZWQgb25seSBpbiB0aGUgV2lsbEJvb3N0ZXIgb3JnYW5pemF0aW9uKS4gUHJvdmlzaW9uIHRoZSBtYXRjaGluZyBvcmdhbml6YXRpb24gc2VjcmV0IGFuZCBleHRlbmQgdGhlIENJIHNjb3BlcyBpbiB3YmZ5IGZpcnN0LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSBtaWdyYXRpb24gaXMgdHJhbnNhY3Rpb25hbCBvdmVyIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sOiByZXJ1bnMgbXVzdCByZXRyeSBmcm9tIHRoZVxuICAgIC8vIG9yaWdpbmFsIHN0YXRlLCBhbmQgYSBwYXJ0aWFsbHkgbWlncmF0ZWQgdHJlZSBjb3VsZCBvdGhlcndpc2UgYmVjb21lIHVuZGVjcnlwdGFibGUgZm9yIHRoZVxuICAgIC8vIGlkZW50aXR5IHBlcmZvcm1pbmcgYSBsYXRlciByZXRyeSAoZS5nLiB3aGVuIGEgcmVjaXBpZW50IGlzIGJlaW5nIHJlbW92ZWQpLlxuICAgIGNvbnN0IHNuYXBzaG90cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgLy8gQSBmYWlsZWQgc3luY2hyb25pemF0aW9uIG11c3QgZmFpbCB0aGUgd2hvbGUgd2JmeSBydW46IGV4aXRpbmcgemVybyB3aXRoIHN0YWxlIHJlY2lwaWVudHNcbiAgICAvLyB3b3VsZCBsZWF2ZSBzZWNyZXRzIHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzIHdoaWxlIGxvb2tpbmcgc3VjY2Vzc2Z1bC5cbiAgICB0cnkge1xuICAgICAgLy8gQW55IGZub3ggY29uZmlnIChpbmNsdWRpbmcgYWxpYXNlcyBhbmQgbG9jYWwgb3ZlcnJpZGVzKSBpbiBhbiBhbmNlc3RvciBkaXJlY3Rvcnkgd291bGRcbiAgICAgIC8vIG1lcmdlIGludG8gKGFuZCBwb3NzaWJseSBiZSBSRVdSSVRURU4gYnkpIHRoaXMgcmVwb3NpdG9yeSdzIGBmbm94IHJlZW5jcnlwdGAgdGhyb3VnaFxuICAgICAgLy8gaGllcmFyY2hpY2FsIGxvYWRpbmcsIHVzaW5nIHRoaXMgcmVwb3NpdG9yeSdzIHJlY2lwaWVudCBzZXQgZm9yIGZvcmVpZ24gc2VjcmV0cy5cbiAgICAgIGZvciAobGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUocm9vdERpclBhdGgpOyA7IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JGbm94RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpO1xuICAgICAgICBpZiAoYW5jZXN0b3JGbm94RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhbiBhbmNlc3RvciBkaXJlY3RvcnkgY29udGFpbnMgZm5veCBjb25maWdzIHRoYXQgZm5veCB3b3VsZCBoaWVyYXJjaGljYWxseSBtZXJnZSBhbmQgcmV3cml0ZTogJHthbmNlc3RvckZub3hGaWxlTmFtZXNcbiAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX0uIFJlbW92ZSB0aGVtIG9yIG1vdmUgdGhlIHJlcG9zaXRvcnkuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmRpcm5hbWUoZGlyUGF0aCkgPT09IGRpclBhdGgpIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gZm5veCBhbHNvIGxvYWRzIGNvbW1pdHRlZCBjb25maWcgYWxpYXNlcyB0aGlzIGdlbmVyYXRvciBjYW5ub3Qga2VlcCBpbiBzeW5jLlxuICAgICAgY29uc3QgZm5veExpa2VGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpO1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlUGF0aHMgPSBmbm94TGlrZUZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSAhPT0gJ2Zub3gudG9tbCcpO1xuICAgICAgaWYgKHVuc3VwcG9ydGVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG9ubHkgZm5veC50b21sIGZpbGVzIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlUGF0aHMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byB0aGUgYWRqYWNlbnQgZm5veC50b21sLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGlyUGF0aHMgPSBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRocyk7XG4gICAgICBpZiAoIWRpclBhdGhzLmluY2x1ZGVzKHJvb3REaXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKX0gaXMgaW52aXNpYmxlIHRvIGdpdCAoZ2l0aWdub3JlZD8pLiBDb21taXQgaXQgb3IgcmVtb3ZlIGl0LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gR2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlIGdpdGlnbm9yZWQgZmlsZXMsIHNvIGFsc28gaW5zcGVjdCBldmVyeSBkaXJlY3RvcnkgaW4gZWFjaFxuICAgICAgLy8gbWFuYWdlZCBjb25maWcncyBoaWVyYXJjaHkgdGhyb3VnaCB0aGUgZmlsZXN5c3RlbTogYSBnaXRpZ25vcmVkIGFsaWFzIChlLmcuIC5mbm94LnRvbWwpXG4gICAgICAvLyBvciBhIGdpdGlnbm9yZWQgZm5veC50b21sIGluIGFuIGludGVybWVkaWF0ZSBkaXJlY3Rvcnkgd291bGQgc3RpbGwgYmUgbG9hZGVkIGJ5IGZub3ggYW5kXG4gICAgICAvLyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvdmlkZXIgdXNlZCBmb3IgbmVzdGVkIHJlLWVuY3J5cHRpb24uXG4gICAgICBjb25zdCBtYW5hZ2VkRGlyUGF0aHMgPSBuZXcgU2V0KGRpclBhdGhzKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IGhpZXJhcmNoeURpclBhdGggb2YgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3Qgc3RyYXlGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoaGllcmFyY2h5RGlyUGF0aCkuZmlsdGVyKFxuICAgICAgICAgICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnICYmICEobmFtZSA9PT0gJ2Zub3gudG9tbCcgJiYgbWFuYWdlZERpclBhdGhzLmhhcyhoaWVyYXJjaHlEaXJQYXRoKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzdHJheUZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggd291bGQgbG9hZCB1bm1hbmFnZWQgKGdpdGlnbm9yZWQ/KSBjb25maWdzOiAke3N0cmF5RmlsZU5hbWVzXG4gICAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGhpZXJhcmNoeURpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gQ29tbWl0IHRoZW0gYXMgZm5veC50b21sIG9yIHJlbW92ZSB0aGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEEgZm5veC5sb2NhbC50b21sIGFueXdoZXJlIGluIHRoZSBtZXJnZWQgaGllcmFyY2h5IChub3Qgb25seSBuZXh0IHRvIGEgbWFuYWdlZFxuICAgICAgICAgIC8vIGNvbmZpZykgY2FuIG92ZXJyaWRlIHByb3ZpZGVycy5cbiAgICAgICAgICBjb25zdCBsb2NhbElzc3VlID0gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShoaWVyYXJjaHlEaXJQYXRoKTtcbiAgICAgICAgICBpZiAobG9jYWxJc3N1ZSkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2xvY2FsSXNzdWV9LiBLZWVwIG9ubHkgbWFjaGluZS1sb2NhbCBzZWNyZXQgb3ZlcnJpZGVzIHRoZXJlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW4tbWVtb3J5IHNuYXBzaG90cyBkbyBub3Qgc3Vydml2ZSBhIGtpbGxlZCBwcm9jZXNzLCBzbyBhIGR1cmFibGUgbWFya2VyIGlzIHdyaXR0ZW5cbiAgICAgIC8vIGJlZm9yZSB0aGUgZmlyc3QgbXV0YXRpb24gYW5kIHJlbW92ZWQgb25seSB3aGVuIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQgYWdhaW4uIEEgbGVmdG92ZXJcbiAgICAgIC8vIG1hcmtlciBtZWFucyBhIHByZXZpb3VzIHJ1biB3YXMga2lsbGVkIG1pZC1taWdyYXRpb24gKG9yIGNvdWxkIG5vdCByZXN0b3JlKTogc29tZVxuICAgICAgLy8gY2lwaGVydGV4dHMgbWF5IG5vdCBtYXRjaCB0aGUgcmVjaXBpZW50cywgb3IgbWF5IGV2ZW4gYmUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlIGV4ZWN1dG9yJ3NcbiAgICAgIC8vIGlkZW50aXR5IHdoZW4gYSByZWNpcGllbnQgd2FzIGJlaW5nIHJlbW92ZWQg4oCUIHN0YXRlcyB0aGlzIGNvZGUgY2Fubm90IHJlcGFpciBzYWZlbHlcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHdvcmtpbmcgdHJlZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIChicmFuY2ggc3dpdGNoZXMsIG1hbnVhbCBlZGl0cykuIFRoZVxuICAgICAgLy8gZm5veC50b21sIGZpbGVzIGFyZSBnaXQtdHJhY2tlZCwgc28gdGhlIHVzZXIgcmVzdG9yZXMgdGhlbSB2aWEgZ2l0IGFuZCBjbGVhcnMgdGhlIG1hcmtlci5cbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1taWdyYXRpb24tbWFya2VyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYSBwcmV2aW91cyBtaWdyYXRpb24gd2FzIGludGVycnVwdGVkLiBSZXN0b3JlIHRoZSBmbm94LnRvbWwgZmlsZXMgdmlhIGdpdCAoZS5nLiBcXGBnaXQgc3RhdHVzXFxgIGFuZCBcXGBnaXQgcmVzdG9yZSAtLSAnKmZub3gqLnRvbWwnXFxgIGlmIHlvdSBoYXZlIG5vIGludGVudGlvbmFsIGxvY2FsIGNoYW5nZXMpLCB0aGVuIGRlbGV0ZSAke21pZ3JhdGlvbk1hcmtlclBhdGh9IGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHRyYWNrZWQgc3ltbGluayBuYW1lZCBmbm94LnRvbWwgKG9yIGEgc3ltbGlua2VkIHBhcmVudCBkaXJlY3RvcnkpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAvLyByZXdyaXRlIGFuZCBgZm5veCByZWVuY3J5cHRgIHJlYWQgYW5kIE1PRElGWSBmaWxlcyBvdXRzaWRlIHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAgICAgY29uc3QgcmVhbFBhdGggPSBmcy5yZWFscGF0aFN5bmMoZm5veFRvbWxQYXRoKTtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmbm94VG9tbFBhdGgpLmlzU3ltYm9saWNMaW5rKCkgfHwgIXJlYWxQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9IGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5ICgke3JlYWxQYXRofSkuIFJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgaW4tcmVwb3NpdG9yeSBmaWxlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzbmFwc2hvdHMuc2V0KGZub3hUb21sUGF0aCwgZnMucmVhZEZpbGVTeW5jKGZub3hUb21sUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNvcnRlZCBvcmRlciBwcm9jZXNzZXMgYW5jZXN0b3JzIGJlZm9yZSBkZXNjZW5kYW50cywgc28gY29uZmlncyBpbmhlcml0aW5nIGFuIHVwZGF0ZWRcbiAgICAgIC8vIHByb3ZpZGVyIHJlLWVuY3J5cHQgYWdhaW5zdCB0aGUgYWxyZWFkeS11cGRhdGVkIHJlY2lwaWVudHMuXG4gICAgICBjb25zdCBjaGFuZ2VkRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgYW55RmFpbGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JDaGFuZ2VkID0gY2hhbmdlZERpclBhdGhzLnNvbWUoKGNoYW5nZWREaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoY2hhbmdlZERpclBhdGggKyBwYXRoLnNlcCkpO1xuICAgICAgICAvLyBFdmVyeSBkaXJQYXRoIHdhcyBzbmFwc2hvdHRlZCBhYm92ZS4gQSBtaXNzaW5nIHNuYXBzaG90IG11c3QgZmFpbCBoYXJkOiBmYWxsaW5nIGJhY2sgdG9cbiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvdWxkIGZsb3cgaW50byByZXBsYWNlQWdlUmVjaXBpZW50cyBhbmQgb3ZlcndyaXRlIHRoZSByZWFsIGZub3gudG9tbFxuICAgICAgICAvLyB3aXRoIGEgcmVjaXBpZW50cy1vbmx5IGZpbGUsIGRlc3Ryb3lpbmcgZXZlcnkgY29tbWl0dGVkIHNlY3JldC5cbiAgICAgICAgY29uc3Qgc25hcHNob3RDb250ZW50ID0gc25hcHNob3RzLmdldChwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICAgICAgaWYgKHNuYXBzaG90Q29udGVudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZm5veC50b21sIHNuYXBzaG90IGZvciAke2RpclBhdGh9LmApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICAgICAgICAgIGRpclBhdGgsXG4gICAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgICAgZGlyUGF0aCA9PT0gcm9vdERpclBhdGgsXG4gICAgICAgICAgYW5jZXN0b3JDaGFuZ2VkLFxuICAgICAgICAgIHNuYXBzaG90Q29udGVudCxcbiAgICAgICAgICBhZ2VSZWNpcGllbnRzXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09ICdjaGFuZ2VkJykgY2hhbmdlZERpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICAgIGFueUZhaWxlZCB8fD0gcmVzdWx0ID09PSAnZmFpbGVkJztcbiAgICAgIH1cbiAgICAgIGlmIChhbnlGYWlsZWQpIHtcbiAgICAgICAgLy8gQSBmYWlsZWQgcmUtZW5jcnlwdGlvbiBtYXkgaGF2ZSByZXdyaXR0ZW4gc29tZSBjaXBoZXJ0ZXh0cywgc28gcmVzdG9yZSB1bmNvbmRpdGlvbmFsbHkuXG4gICAgICAgIC8vIFRoZSBtYXJrZXIgaXMgcmVtb3ZlZCBvbmx5IHdoZW4gcmVzdG9yYXRpb24gZnVsbHkgc3VjY2VlZGVkIGFuZCB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LlxuICAgICAgICAvLyBSZXN0b3JlIE9OTFkgd2hlbiB0aGlzIHJ1biBvd25zIHRoZSBtYXJrZXI6IGV2ZXJ5IGNvbW1pdHRlZC1jb25maWcgbXV0YXRpb24gaGFwcGVuc1xuICAgICAgICAvLyBhZnRlciBtYXJrZXIgYWNxdWlzaXRpb24sIHNvIGEgbm9uLW93bmVyIChlLmcuIGxvc2luZyBhIHJhY2UgYWdhaW5zdCBhIGNvbmN1cnJlbnQgd2JmeSlcbiAgICAgICAgLy8gaGFzIGNoYW5nZWQgbm90aGluZyBhbmQgbXVzdCBub3Qgb3ZlcndyaXRlIHRoZSBvd25lcidzIGluLXByb2dyZXNzIG1pZ3JhdGlvbi5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGlzUm9vdDogYm9vbGVhbixcbiAgYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZDogYm9vbGVhbixcbiAgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcsXG4gIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXVxuKTogUHJvbWlzZTwnY2hhbmdlZCcgfCAndW5jaGFuZ2VkJyB8ICdmYWlsZWQnPiB7XG4gIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG5cbiAgLy8gUmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBvbmx5IHVuZGVyc3RhbmRzIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSBsYXlvdXQgd2l0aCBvbmVcbiAgLy8gdG9wLWxldmVsIGFnZSBwcm92aWRlciBuYW1lZCBgYWdlYC4gR2l0aWdub3JlZCBjb25maWcgYWxpYXNlcyAoZS5nLiAuZm5veC5sb2NhbC50b21sKSB0aGF0XG4gIC8vIGdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSwgaW1wb3J0cywgZGlmZmVyZW50bHkgbmFtZWQgYWdlIHByb3ZpZGVycywgb3IgcHJvdmlkZXJcbiAgLy8gb3ZlcnJpZGVzIHdvdWxkIGtlZXAgdXNpbmcgcmVjaXBpZW50IHNldHMgdGhpcyBnZW5lcmF0b3IgZG9lcyBub3QgcmV3cml0ZSwgc28gdGhlaXIgc2VjcmV0c1xuICAvLyB3b3VsZCBzaWxlbnRseSBzdGF5IHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzOyBmYWlsIGluc3RlYWQgb2YgcHJvY2VlZGluZy4gVGhlXG4gIC8vIGdpdGlnbm9yZWQgZm5veC5sb2NhbC50b21sIGlzIGEgc3VwcG9ydGVkIG1hY2hpbmUtbG9jYWwgb3ZlcnJpZGUsIGJ1dCBvbmx5IHdoaWxlIGl0IGxlYXZlc1xuICAvLyBwcm92aWRlcnMgYWxvbmUuXG4gIGNvbnN0IHVuc3VwcG9ydGVkRmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpLmZpbHRlcihcbiAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gudG9tbCcgJiYgbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbiAgaWYgKHVuc3VwcG9ydGVkRmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgaW4gJHtkaXJQYXRofSBiZWNhdXNlIG9ubHkgZm5veC50b21sIGFuZCBmbm94LmxvY2FsLnRvbWwgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVOYW1lcy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIGZub3gudG9tbC5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgLy8gQSBzdGFsZSBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBtdXN0IGJlIHJlc3RvcmVkIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAgLy8gb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0ICh0aGUgbWlncmF0aW9uIG1hcmtlciBzZXBhcmF0ZWx5IGJsb2NrcyB0aGlzIHJ1biB3aGVuIHRoZVxuICAvLyBpbnRlcnJ1cHRpb24gbGVmdCB0aGUgbWlncmF0aW9uIGl0c2VsZiBpbmNvbXBsZXRlKS5cbiAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcblxuICBjb25zdCBsYXlvdXRJc3N1ZSA9IGZpbmRGbm94TGF5b3V0SXNzdWUob3JpZ2luYWxDb250ZW50KTtcbiAgaWYgKGxheW91dElzc3VlKSB7XG4gICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSAke2xheW91dElzc3VlfS5gKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShvcmlnaW5hbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICBjb25zdCBwcm9maWxlTmFtZXMgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSk7XG4gIGNvbnN0IGN1cnJlbnRSZWNpcGllbnRzID0gcmVhZEZub3hBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCk7XG5cbiAgLy8gQSBuZXN0ZWQgZm5veC50b21sIHdpdGhvdXQgaXRzIG93biBhZ2UgcHJvdmlkZXIgaW5oZXJpdHMgdGhlIG5lYXJlc3QgYW5jZXN0b3IncyBvbmUgdGhyb3VnaFxuICAvLyBmbm94J3MgaGllcmFyY2hpY2FsIGxvYWRpbmcsIHNvIG9ubHkgdGhlIHJvb3QgY29uZmlnIG11c3QgZGVjbGFyZSB0aGUgcHJvdmlkZXIg4oCUIGJ1dCB0aGVcbiAgLy8gbmVzdGVkIGNvbmZpZydzIG93biBjaXBoZXJ0ZXh0cyBzdGlsbCBtdXN0IGJlIHJlLWVuY3J5cHRlZCB3aGVuZXZlciBhbiBhbmNlc3RvcidzIHJlY2lwaWVudHNcbiAgLy8gY2hhbmdlZCwgYW5kIHRoYXQgb25seSBoYXBwZW5zIHdoZW4gYGZub3ggcmVlbmNyeXB0YCBydW5zIGZyb20gdGhlIG5lc3RlZCBkaXJlY3RvcnkuXG4gIGlmICghaXNSb290ICYmICFjdXJyZW50UmVjaXBpZW50cykge1xuICAgIGlmIChhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkKSB7XG4gICAgICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICBpZiAoXG4gICAgY3VycmVudFJlY2lwaWVudHMgJiZcbiAgICBjdXJyZW50UmVjaXBpZW50cy5zaXplID09PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCAmJlxuICAgIGFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gY3VycmVudFJlY2lwaWVudHMuaGFzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICAvLyBSZXdyaXRlIG9ubHkgdGhlIHJlY2lwaWVudHMgYXNzaWdubWVudCBzbyB1c2VyLWF1dGhvcmVkIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIHN1cnZpdmUuXG4gIC8vIFJlLXBhcnNlIGJlZm9yZSB3cml0aW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cykgY291bGQgbWFrZSB0aGUgdGV4dHVhbCBlZGl0XG4gIC8vIHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGUgb3IgbGVhdmUgdGhlIG9sZCByZWNpcGllbnRzIGluIGVmZmVjdC5cbiAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSByZXBsYWNlQWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQsIGFnZVJlY2lwaWVudHMpO1xuICBjb25zdCB1cGRhdGVkUmVjaXBpZW50cyA9IFsuLi4ocmVhZEZub3hBZ2VSZWNpcGllbnRzKHVwZGF0ZWRDb250ZW50KSA/PyBbXSldO1xuICBpZiAoXG4gICAgdXBkYXRlZFJlY2lwaWVudHMubGVuZ3RoICE9PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCB8fFxuICAgICFhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IHVwZGF0ZWRSZWNpcGllbnRzLmluY2x1ZGVzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJld3JpdGluZyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gJHtmbm94VG9tbFBhdGh9IGRpZCBub3QgdGFrZSBlZmZlY3Q7IHVwZGF0ZSB0aGVtIG1hbnVhbGx5LmApO1xuICB9XG4gIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCB1cGRhdGVkQ29udGVudCk7XG5cbiAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvbmZpZzoga2VlcGluZyB0aGUgbmV3IHJlY2lwaWVudHMgd2l0aCBvbGQgY2lwaGVydGV4dHMgd291bGQgbWFrZVxuICAgIC8vIHRoaXMgZ2VuZXJhdG9yIHNraXAgcmUtZW5jcnlwdGlvbiBmb3JldmVyIGFuZCBsZXQgc2V0dXBTZWNyZXRzIHVwbG9hZCBhIENJIGtleSB0aGF0XG4gICAgLy8gY2Fubm90IGRlY3J5cHQgYW55dGhpbmcuIFRoZSBvbGQgY2lwaGVydGV4dHMgcmVtYWluIHZhbGlkIGZvciB0aGUgb2xkIHJlY2lwaWVudHMuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICByZXR1cm4gJ2NoYW5nZWQnO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhIGZub3gudG9tbCBsYXlvdXQgdGhhdCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGFuZCB0aGUgQ0kta2V5XG4gKiB2ZXJpZmljYXRpb24gY2Fubm90IGNvdmVyLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUsIHNpbmdsZS1hZ2UtcHJvdmlkZXJcbiAqIGxheW91dCBpcyB1c2VkLlxuICovXG5mdW5jdGlvbiBmaW5kRm5veExheW91dElzc3VlKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKHNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gJ3VzZXMgdGhlIHVuc3VwcG9ydGVkIGBpbXBvcnRgIHNldHRpbmcnO1xuICAgIGNvbnN0IG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb3ZpZGVycyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFtuYW1lLCBwcm92aWRlcl0pID0+IChwcm92aWRlcj8udHlwZSA9PT0gJ2FnZScpICE9PSAobmFtZSA9PT0gJ2FnZScpKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAobm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgYWdlIHByb3ZpZGVycyBub3QgbmFtZWQgXFxgYWdlXFxgIChvciBhbiBcXGBhZ2VcXGAgcHJvdmlkZXIgb2YgYW5vdGhlciB0eXBlKTogJHtub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICBjb25zdCBwcm9maWxlc1dpdGhQcm92aWRlcnMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFssIHByb2ZpbGVdKSA9PiBwcm9maWxlPy5wcm92aWRlcnMpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChwcm9maWxlc1dpdGhQcm92aWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyB1bnN1cHBvcnRlZCBwcm9maWxlLXNwZWNpZmljIHByb3ZpZGVyczogJHtwcm9maWxlc1dpdGhQcm92aWRlcnMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2Nhbm5vdCBiZSBwYXJzZWQgYXMgVE9NTCc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgW3Byb3ZpZGVycy5hZ2VdLnJlY2lwaWVudHMgb2YgYSBmbm94LnRvbWwsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBjb25maWcgZGVjbGFyZXMgbm9cbiAqIGFnZSBwcm92aWRlciAobmVzdGVkIGNvbmZpZ3MgdGhlbiBpbmhlcml0IHRoZSByb290IG9uZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEFnZVJlY2lwaWVudHMoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmICghc2V0dGluZ3MucHJvdmlkZXJzPy5hZ2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHNldHRpbmdzLnByb3ZpZGVycy5hZ2UucmVjaXBpZW50cztcbiAgICByZXR1cm4gbmV3IFNldChBcnJheS5pc0FycmF5KHJlY2lwaWVudHMpID8gcmVjaXBpZW50cy5maWx0ZXIoKHIpOiByIGlzIHN0cmluZyA9PiB0eXBlb2YgciA9PT0gJ3N0cmluZycpIDogW10pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBBbiB1bnBhcnNhYmxlIGZub3gudG9tbCB5aWVsZHMgbm8gcmVjaXBpZW50cywgc28gdGhlIGNhbGxlciByZXBvcnRzIGFuIGVycm9yLlxuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cbn1cblxudHlwZSBGbm94UmVwb3NpdG9yeUlkZW50aXR5ID0gUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnIHwgJ2lzUHVibGljUmVwbycgfCAnaXNSZXBvVmlzaWJpbGl0eUtub3duJz47XG5cbi8qKlxuICogVGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyB0aGUgcHJpdmF0ZSBrZXkgb2YgdGhlIENJIGlkZW50aXR5IHNjb3BlZCB0byB0aGUgcmVwb3NpdG9yeSwgb3JcbiAqIHVuZGVmaW5lZCB3aGVuIG5vbmUgaXMgKGFuIHVua25vd24gdmlzaWJpbGl0eSwgb3IgYSByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycykuIFRoZSBzaW5nbGVcbiAqIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgYnkgdGhlIHJlY2lwaWVudCBzeW5jIGFuZCB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3MgY2FsbGVyIG1hcHBpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoXG4gIGNvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eVxuKTogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWScgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaVByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCB8IHVuZGVmaW5lZCA9IEZOT1hfQUdFX1BSSU5DSVBBTFMuZmluZChcbiAgICAocHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsKSA9PlxuICAgICAgcHJpbmNpcGFsLmNpQWdlS2V5U2VjcmV0TmFtZSAmJiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCBjb25maWcpXG4gICk7XG4gIHJldHVybiBjaVByaW5jaXBhbD8uY2lBZ2VLZXlTZWNyZXROYW1lO1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVjaXBpZW50IHNldCBkaWZmZXJzIGJldHdlZW4gdGhlIHB1YmxpYyBhbmQgcHJpdmF0ZSByZWFkaW5nIG9mIHRoZSByZXBvc2l0b3J5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KFxuICByb290Q29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZSc+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgcHVibGljS2V5c0ZvciA9IChpc1B1YmxpY1JlcG86IGJvb2xlYW4pOiBzdHJpbmcgPT5cbiAgICBnZXRGbm94QWdlUmVjaXBpZW50cyh7IC4uLnJvb3RDb25maWcsIGlzUHVibGljUmVwbywgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0cnVlIH0pXG4gICAgICAubWFwKCh7IHB1YmxpY0tleSB9KSA9PiBwdWJsaWNLZXkpXG4gICAgICAuam9pbignXFxuJyk7XG4gIHJldHVybiBwdWJsaWNLZXlzRm9yKHRydWUpICE9PSBwdWJsaWNLZXlzRm9yKGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBGbm94QWdlUmVjaXBpZW50W10ge1xuICByZXR1cm4gRk5PWF9BR0VfUFJJTkNJUEFMUy5maWx0ZXIoKHByaW5jaXBhbCkgPT5cbiAgICBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCByb290Q29uZmlnKVxuICApLmZsYXRNYXAoKHByaW5jaXBhbCkgPT5cbiAgICBwcmluY2lwYWwucHVibGljS2V5cy5tYXAoKHB1YmxpY0tleSwgaW5kZXgpID0+ICh7XG4gICAgICBuYW1lOiBwcmluY2lwYWwucHVibGljS2V5cy5sZW5ndGggPT09IDEgPyBwcmluY2lwYWwubmFtZSA6IGAke3ByaW5jaXBhbC5uYW1lfSR7aW5kZXggKyAxfWAsXG4gICAgICBwdWJsaWNLZXksXG4gICAgfSkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShzY29wZTogRm5veFJlcG9zaXRvcnlTY29wZSwgcmVwb3NpdG9yeTogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IGJvb2xlYW4ge1xuICBjb25zdCBvd25lciA9IHJlcG9zaXRvcnkucmVwb0F1dGhvcj8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbmFtZSA9IHJlcG9zaXRvcnkucmVwb05hbWU/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghb3duZXIgfHwgIW5hbWUpIHJldHVybiBmYWxzZTtcblxuICAvLyBBbiB1bmtub3duIHZpc2liaWxpdHkgKGZhaWxlZCBHaXRIdWIgbG9va3VwKSBtYXRjaGVzIG5vIHZpc2liaWxpdHktY29uc3RyYWluZWQgc2NvcGU6IGNhbGxlcnNcbiAgLy8gdGhhdCB3b3VsZCByZXdyaXRlIHJlY2lwaWVudHMgZmFpbCBpbnN0ZWFkIG9mIGVuY3J5cHRpbmcgdG8gdGhlIHdyb25nIENJIGlkZW50aXR5LlxuICBpZiAoXG4gICAgc2NvcGUudmlzaWJpbGl0eSAmJlxuICAgICghcmVwb3NpdG9yeS5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgKHNjb3BlLnZpc2liaWxpdHkgPT09ICdwdWJsaWMnKSAhPT0gcmVwb3NpdG9yeS5pc1B1YmxpY1JlcG8pXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKHNjb3BlLm9yZ2FuaXphdGlvbnM/LnNvbWUoKG9yZ2FuaXphdGlvbikgPT4gb3JnYW5pemF0aW9uLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyKSA/PyBmYWxzZSkgfHxcbiAgICAoc2NvcGUucmVwb3NpdG9yaWVzPy5zb21lKChmdWxsTmFtZSkgPT4gZnVsbE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYCR7b3duZXJ9LyR7bmFtZX1gKSA/PyBmYWxzZSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUFnZVJlY2lwaWVudHMoY29udGVudDogc3RyaW5nLCBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W10pOiBzdHJpbmcge1xuICAvLyBUcmFpbGluZyBuYW1lIGNvbW1lbnRzIGxldCBodW1hbnMgdGVsbCB3aG9zZSBrZXkgZWFjaCByZWNpcGllbnQgaXMgd2l0aG91dCBjb25zdWx0aW5nIHdiZnkuXG4gIGNvbnN0IHJlY2lwaWVudHNUZXh0ID0gYHJlY2lwaWVudHMgPSBbXFxuJHthZ2VSZWNpcGllbnRzXG4gICAgLm1hcCgocmVjaXBpZW50KSA9PiBgICBcIiR7cmVjaXBpZW50LnB1YmxpY0tleX1cIiwgIyAke3JlY2lwaWVudC5uYW1lfWApXG4gICAgLmpvaW4oJ1xcbicpfVxcbl1gO1xuICAvLyB3YmZ5IHdyaXRlcyBhIFtwcm92aWRlcnMuYWdlXSB0YWJsZSAocG9zc2libHkgd2l0aCBhIHRyYWlsaW5nIGNvbW1lbnQpLiBTY2FuIGxpbmUtd2lzZSBzbyB0aGF0XG4gIC8vIGEgYFtgIGluc2lkZSBhIGNvbW1lbnQgb3IgYSBzdHJpbmcgbmV2ZXIgdGVybWluYXRlcyB0aGUgdGFibGUgZWFybHk7IHRoZSB0YWJsZSBlbmRzIGF0IHRoZVxuICAvLyBuZXh0IGxpbmUtc3RhcnQgdGFibGUgaGVhZGVyLiBUaGUgYXNzaWdubWVudCBtYXRjaCBpcyBsaW5lLWFuY2hvcmVkIHNvIGEgY29tbWVudGVkLW91dFxuICAvLyBgIyByZWNpcGllbnRzID0gWy4uLl1gIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcmVhbCBvbmUsIHdoaWxlIG11bHRpbGluZSBhcnJheXMgc3RpbGwgbWF0Y2hcbiAgLy8gYmVjYXVzZSB0aGUgbmVnYXRlZCBjbGFzcyBbXlxcXV0gKHVubGlrZSBgLmApIHNwYW5zIG5ld2xpbmVzLiBBbnkgb3RoZXIgc3BlbGxpbmcgZmFsbHMgdGhyb3VnaFxuICAvLyB0byB0aGUgY2FsbGVyJ3MgcmUtcGFyc2UgdmFsaWRhdGlvbiwgd2hpY2ggZmFpbHMgdGhlIHJ1biBzYWZlbHkgd2l0aCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZlxuICAvLyBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gL15cXHMqXFxbcHJvdmlkZXJzXFwuYWdlXFxdXFxzKig/OiMuKik/JC91LnRlc3QobGluZSkpO1xuICBpZiAoaGVhZGVySW5kZXggIT09IC0xKSB7XG4gICAgbGV0IGVuZEluZGV4ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gaGVhZGVySW5kZXggKyAxOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKC9eXFxzKlxcWy91LnRlc3QobGluZXNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgICBlbmRJbmRleCA9IGluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VjdGlvbiA9IGxpbmVzLnNsaWNlKGhlYWRlckluZGV4LCBlbmRJbmRleCkuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVwbGFjZWRTZWN0aW9uID0gc2VjdGlvbi5yZXBsYWNlKC9eXFxzKnJlY2lwaWVudHNcXHMqPVxccypcXFtbXlxcXV0qXFxdL211LCByZWNpcGllbnRzVGV4dCk7XG4gICAgY29uc3QgbmV3U2VjdGlvbiA9XG4gICAgICByZXBsYWNlZFNlY3Rpb24gPT09IHNlY3Rpb25cbiAgICAgICAgPyBbbGluZXNbaGVhZGVySW5kZXhdLCByZWNpcGllbnRzVGV4dCwgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxLCBlbmRJbmRleCldLmpvaW4oJ1xcbicpXG4gICAgICAgIDogcmVwbGFjZWRTZWN0aW9uO1xuICAgIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXgpLCBuZXdTZWN0aW9uLCAuLi5saW5lcy5zbGljZShlbmRJbmRleCldLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bcHJvdmlkZXJzLmFnZV1cXG50eXBlID0gXCJhZ2VcIlxcbiR7cmVjaXBpZW50c1RleHR9XFxuYDtcbn1cblxuLy8gUmUtZW5jcnlwdHMgdGhlIGJhc2Ugc2VjcmV0cyBhbmQgZWFjaCBwcm9maWxlJ3Mgb3duIHNlY3JldHMgKC0tbm8tZGVmYXVsdHMga2VlcHMgdGhlIG1lcmdlZFxuLy8gYmFzZSBzZWNyZXRzIGZyb20gYmVpbmcgZHVwbGljYXRlZCBpbnRvIHByb2ZpbGUgdGFibGVzKSBmb3IgdGhlIGN1cnJlbnQgcmVjaXBpZW50IHNldC4gVGhlXG4vLyBzcGF3bmVkIGZub3ggcnVucyB3aXRoIGFuIGlzb2xhdGVkIEhPTUUvWERHX0NPTkZJR19IT01FIGJlY2F1c2UgZm5veCBtZXJnZXMgdGhlIHVzZXItZ2xvYmFsXG4vLyB+Ly5jb25maWcvZm5veC9jb25maWcudG9tbCBpbnRvIGV2ZXJ5IHByb2plY3QgY29uZmlnIOKAlCBhIHBsYWluIHJlZW5jcnlwdCB3b3VsZCByZXdyaXRlIHRoZVxuLy8gdXNlcidzIGdsb2JhbCBzZWNyZXRzIHRvby4gRGVjcnlwdGlvbiB0aGVyZWZvcmUgbmVlZHMgdGhlIHBlcnNvbmFsIGlkZW50aXR5IHBhc3NlZCBleHBsaWNpdGx5XG4vLyB2aWEgRk5PWF9BR0VfS0VZOyBGTk9YX1BST0ZJTEUgaXMgc3RyaXBwZWQgc28gaXQgY2Fubm90IHJlZGlyZWN0IHRoZSBiYXNlIChubyAtUCkgcnVuLlxuZnVuY3Rpb24gcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nLCBwcm9maWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIFRoZSBpZGVudGl0eSBpcyBvcHRpb25hbDogYSBwbGFpbnRleHQtb25seSBjb25maWcgaGFzIG5vdGhpbmcgdG8gZGVjcnlwdCBhbmQgZm5veCBzdWNjZWVkc1xuICAvLyB3aXRob3V0IG9uZSwgd2hpbGUgZXhpc3RpbmcgY2lwaGVydGV4dHMgbWFrZSBmbm94IGZhaWwgbG91ZGx5IG9uIGl0cyBvd24uXG4gIGNvbnN0IGlkZW50aXR5ID0gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCkgPz8gcHJvY2Vzcy5lbnYuRk5PWF9BR0VfS0VZO1xuICBjb25zdCBmbm94Q29tbWFuZCA9IHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoKTtcbiAgY29uc3QgaXNvbGF0ZWRIb21lRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diZnktZm5veC1ob21lLScpKTtcbiAgdHJ5IHtcbiAgICAvLyBIaWRlIHRoZSBsb2NhbCBvdmVycmlkZXMgb2YgRVZFUlkgZGlyZWN0b3J5IGZub3ggbWVyZ2VzIGhpZXJhcmNoaWNhbGx5IChmcm9tIHRoZSBjb21tYW5kXG4gICAgLy8gZGlyZWN0b3J5IHVwIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpOiBhbiBhbmNlc3RvcidzIGZub3gubG9jYWwudG9tbCB3b3VsZCBvdGhlcndpc2Ugc2hhZG93XG4gICAgLy8gY29tbWl0dGVkIHNlY3JldHMgb3IgaXRzZWxmIGdldCByZXdyaXR0ZW4gYnkgdGhlIHJlLWVuY3J5cHRpb24uXG4gICAgcmV0dXJuIHdpdGhGbm94TG9jYWxzSGlkZGVuKHJvb3REaXJQYXRoLCBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCksICgpID0+IHtcbiAgICAgIGNvbnN0IGVudiA9IHtcbiAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KS5maWx0ZXIoKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgoJ0ZOT1hfJykpKSxcbiAgICAgICAgLi4uKGlkZW50aXR5ID8geyBGTk9YX0FHRV9LRVk6IGlkZW50aXR5IH0gOiB7fSksXG4gICAgICAgIEhPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICAgIFhER19DT05GSUdfSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgIH07XG4gICAgICBjb25zdCBwcm9maWxlQXJnc0xpc3QgPSBbW10sIC4uLnByb2ZpbGVOYW1lcy5tYXAoKG5hbWUpID0+IFsnLS1uby1kZWZhdWx0cycsIGAtLXByb2ZpbGU9JHtuYW1lfWBdKV07XG4gICAgICBmb3IgKGNvbnN0IHByb2ZpbGVBcmdzIG9mIHByb2ZpbGVBcmdzTGlzdCkge1xuICAgICAgICBjb25zdCBhcmdzID0gWydyZWVuY3J5cHQnLCAnLS1mb3JjZScsICctLW5vLWRhZW1vbicsICctLXByb3ZpZGVyJywgJ2FnZScsIC4uLnByb2ZpbGVBcmdzXTtcbiAgICAgICAgY29uc29sZS5sb2coYCQgJHtmbm94Q29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX0gYXQgJHtkaXJQYXRofWApO1xuICAgICAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoZm5veENvbW1hbmQsIGFyZ3MsIHtcbiAgICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICAgIGVudixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgocHJvYy5zdGF0dXMgPz8gMSkgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyhpc29sYXRlZEhvbWVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGZub3ggYmluYXJ5LiBgZm5veGAgb24gUEFUSCBpcyBvZnRlbiBhIG1pc2Ugc2hpbSwgYW5kIG1pc2UgcmVmdXNlcyB0byBydW5cbiAqIG9uY2UgSE9NRS9YREdfQ09ORklHX0hPTUUgcG9pbnQgYXQgdGhlIGlzb2xhdGVkIGRpcmVjdG9yeSAoaXRzIHRydXN0IHN0YXRlIGRpc2FwcGVhcnMpLCBzbyB0aGVcbiAqIGlzb2xhdGVkIHNwYXducyBuZWVkIHRoZSBzaGltIHJlc29sdmVkIHRvIHRoZSByZWFsIGV4ZWN1dGFibGUgYmVmb3JlaGFuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnbWlzZScsIFsnd2hpY2gnLCAnZm5veCddLCB7IGN3ZDogZGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwcm9jLnN0YXR1cyA9PT0gMCA/IHByb2Muc3Rkb3V0LnRyaW0oKSA6ICcnO1xuICByZXR1cm4gcmVzb2x2ZWQgfHwgJ2Zub3gnO1xufVxuXG4vLyBUaGUgcGVyc29uYWwgaWRlbnRpdHkgZmlsZSBpcyBtYWNoaW5lLWdsb2JhbCwgc28gaXQgaXMgcmVhZCBvbmNlIHBlciBwcm9jZXNzLlxubGV0IGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGZhbHNlO1xubGV0IGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KSByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG4gIGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNvbmZpZycsICdmbm94JywgJ2FnZS50eHQnKSwgJ3V0ZjgnKTtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGNvbnRlbnRcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maW5kKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdBR0UtU0VDUkVULUtFWS0nKSlcbiAgICAgID8udHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bmN0aW9uIHdoaWxlIHRoZSBtYWNoaW5lLWxvY2FsIGZub3gubG9jYWwudG9tbCBmaWxlcyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3JpZXMgYXJlXG4gKiB0ZW1wb3JhcmlseSBtb3ZlZCBhc2lkZTogZm5veCBsb2FkcyB0aGVtIGF0IGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBjb21taXR0ZWQgZm5veC50b21sLCBzbyBhXG4gKiBsb2NhbCBvdmVycmlkZSBzaGFkb3dpbmcgYSBjb21taXR0ZWQgc2VjcmV0IHdvdWxkIG1ha2UgYGZub3ggcmVlbmNyeXB0YCBza2lwIHRoYXQgc2VjcmV0LlxuICovXG5mdW5jdGlvbiB3aXRoRm5veExvY2Fsc0hpZGRlbjxUPihyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoczogc3RyaW5nW10sIGZ1bmM6ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgZnMucmVuYW1lU3luYyhsb2NhbFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBoaWRkZW5EaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgLy8gQSByZXN0b3JhdGlvbiBjb25mbGljdCB0aHJvd3MgaGVyZSBhbmQgdGhlcmVieSBpbnZhbGlkYXRlcyB0aGUgc2VlbWluZ2x5IHN1Y2Nlc3NmdWwgcmVzdWx0OlxuICAgIC8vIGEgcmVjcmVhdGVkIG92ZXJyaWRlIG1heSBoYXZlIHNoYWRvd2VkIGNvbW1pdHRlZCBzZWNyZXRzIGR1cmluZyB0aGUgZm5veCBydW4sIHNvIHRoZSBvdXRlclxuICAgIC8vIHRyYW5zYWN0aW9uIG11c3QgcmVzdG9yZSBldmVyeSBjb21taXR0ZWQgZm5veC50b21sIGluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgbWlncmF0aW9uLlxuICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgb3JpZ2luYWwgZmFpbHVyZSBtdXN0IHdpbjsgYSByZXN0b3JhdGlvbiBjb25mbGljdCBvbiB0aGlzIHBhdGggaXMgb25seSByZXBvcnRlZCBzbyBpdFxuICAgIC8vIGNhbm5vdCBtYXNrIHRoZSByb290IGNhdXNlLlxuICAgIHRyeSB7XG4gICAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIH0gY2F0Y2ggKHJlc3RvcmVFcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKChyZXN0b3JlRXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IFN0cmluZyhyZXN0b3JlRXJyb3IpKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gTW92ZXMgdGhlIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgZmlsZXMgYmFjaywgY2xlYXJpbmcgdGhlIGdpdmVuIGxpc3Qgc28gYSBzZWNvbmQgY2FsbCBpcyBhXG4vLyBuby1vcC4gTmV2ZXIgY2xvYmJlcnMgYSBmbm94LmxvY2FsLnRvbWwgcmVjcmVhdGVkIChlLmcuIGJ5IGFuIGVkaXRvcikgd2hpbGUgZm5veCB3YXMgcnVubmluZzpcbi8vIHRoZSBiYWNrdXAgaXMga2VwdCBhbmQgcmVwb3J0ZWQgZm9yIGEgbWFudWFsIG1lcmdlLlxuZnVuY3Rpb24gcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGg6IHN0cmluZywgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZsaWN0aW5nTG9jYWxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGhpZGRlbkRpclBhdGhzLnNwbGljZSgwKSkge1xuICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgY29uZmxpY3RpbmdMb2NhbFBhdGhzLnB1c2gobG9jYWxQYXRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmcy5yZW5hbWVTeW5jKGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpLCBsb2NhbFBhdGgpO1xuICB9XG4gIGlmIChjb25mbGljdGluZ0xvY2FsUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgZm9sbG93aW5nIGZub3gubG9jYWwudG9tbCBmaWxlcyB3ZXJlIHJlY3JlYXRlZCB3aGlsZSBmbm94IHdhcyBydW5uaW5nIChvcmlnaW5hbCBmaWxlcyBhcmUgcHJlc2VydmVkIHVuZGVyICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyl9IOKAlCBtZXJnZSB0aGVtIG1hbnVhbGx5KTogJHtjb25mbGljdGluZ0xvY2FsUGF0aHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3RvcmVzIGEgZm5veC5sb2NhbC50b21sIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAqIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdC5cbiAqL1xuZnVuY3Rpb24gcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhiYWNrdXBQYXRoKSkgcmV0dXJuO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCb3RoICR7bG9jYWxQYXRofSBhbmQgaXRzIGJhY2t1cCAke2JhY2t1cFBhdGh9IGV4aXN0OyByZXNvbHZlIHRoZSBsZWZ0b3ZlciBiYWNrdXAgbWFudWFsbHkuYCk7XG4gIH1cbiAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gIGZzLnJlbmFtZVN5bmMoYmFja3VwUGF0aCwgbG9jYWxQYXRoKTtcbn1cblxuLy8gQ3JlYXRlcyB0aGUgYmFja3VwIGRpcmVjdG9yeSBhbmQgcHJvdmVzIG5vIHBhdGggY29tcG9uZW50IGJlbG93IHRoZSByZXBvc2l0b3J5IHJvb3QgaXMgYVxuLy8gc3ltbGluazogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgc3ltbGluayAoZS5nLiBhIHRyYWNrZWQgLnRtcC93YmZ5LWZub3gtbG9jYWwtYmFja3VwIGxpbmspXG4vLyBjb3VsZCBvdGhlcndpc2UgbW92ZSB0aGUgcGxhaW50ZXh0IGxvY2FsIHNlY3JldHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgb3IgcmVzb2x2ZSB0aGUgYmFja3VwXG4vLyBiYWNrIG9udG8gdGhlIHNvdXJjZSBmaWxlIGFuZCB0dXJuIHRoZSBoaWRlIHJlbmFtZSBpbnRvIGEgbm8tb3AuXG5mdW5jdGlvbiBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoOiBzdHJpbmcsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBiYWNrdXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpO1xuICBmcy5ta2RpclN5bmMoYmFja3VwRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGV4cGVjdGVkUmVhbFBhdGggPSBwYXRoLmpvaW4oZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKSwgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgYmFja3VwRGlyUGF0aCkpO1xuICBpZiAoZnMucmVhbHBhdGhTeW5jKGJhY2t1cERpclBhdGgpICE9PSBleHBlY3RlZFJlYWxQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2JhY2t1cERpclBhdGh9IHJlc29sdmVzIHRocm91Z2ggYSBzeW1saW5rOyByZW1vdmUgdGhlIHN5bWxpbmtlZCBjb21wb25lbnQuYCk7XG4gIH1cbn1cblxuLy8gVGhlIGJhY2t1cCBsaXZlcyB1bmRlciB0aGUgZ2l0aWdub3JlZCAudG1wIHNvIGEgaGlkZGVuIGZub3gubG9jYWwudG9tbCBjYW4gbmV2ZXIgYmVjb21lXG4vLyBzdGFnZWFibGUgKGEgc2libGluZyByZW5hbWUgbGlrZSBmbm94LmxvY2FsLnRvbWwud2JmeS1iYWsgd291bGQgbm8gbG9uZ2VyIG1hdGNoIHRoZSBkb2N1bWVudGVkXG4vLyBgZm5veC5sb2NhbC50b21sYCBpZ25vcmUgZW50cnkgYW5kIGNvdWxkIGJlIGNvbW1pdHRlZCBieSBgZ2l0IGFkZCAtQWApLlxuZnVuY3Rpb24gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXNvbHZlKFxuICAgIHJvb3REaXJQYXRoLFxuICAgICcudG1wJyxcbiAgICAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcsXG4gICAgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgZGlyUGF0aCksXG4gICAgJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyUGF0aCB8fCBtaWdyYXRpb25NYXJrZXJPd25lZCkgcmV0dXJuO1xuICBjb25zdCB0bXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKG1pZ3JhdGlvbk1hcmtlclBhdGgpO1xuICBmcy5ta2RpclN5bmModG1wRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIFJlZnVzZSB0byB3cml0ZSB0aHJvdWdoIHN5bWxpbmtzOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCAudG1wIHN5bWxpbmsgY291bGQgb3RoZXJ3aXNlXG4gIC8vIHJlZGlyZWN0IHRoZSBtYXJrZXIgd3JpdGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS4gVGhlIGB3eGAgZmxhZyBtYWtlcyB0aGUgb3BlbiBpdHNlbGYgZmFpbFxuICAvLyBvbiBhbnkgcHJlLWV4aXN0aW5nIHBhdGgsIGluY2x1ZGluZyBhIGRhbmdsaW5nIHN5bWxpbmsg4oCUIHdoaWNoIGFsc28gYWNxdWlyZXMgdGhlIG1hcmtlclxuICAvLyBhdG9taWNhbGx5LCBzbyBhIGNvbmN1cnJlbnQgd2JmeSBydW4gY2Fubm90IHN0YXJ0IGEgc2Vjb25kIG1pZ3JhdGlvbi5cbiAgaWYgKGZzLmxzdGF0U3luYyh0bXBEaXJQYXRoKS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RtcERpclBhdGh9IGlzIGEgc3ltbGluazsgcmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBkaXJlY3RvcnkuYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCxcbiAgICAgICd3YmZ5IGZub3ggbWlncmF0aW9uIGluIHByb2dyZXNzOyBhIGxlZnRvdmVyIG1hcmtlciBibG9ja3MgbmV3IG1pZ3JhdGlvbnNcXG4nLFxuICAgICAge1xuICAgICAgICBmbGFnOiAnd3gnLFxuICAgICAgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBbm90aGVyIHdiZnkgcHJvY2VzcyBhcHBlYXJzIHRvIGJlIG1pZ3JhdGluZyAoJHttaWdyYXRpb25NYXJrZXJQYXRofSBleGlzdHMpOiAke2Vycm9yfWApO1xuICB9XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gdHJ1ZTtcbn1cblxuLy8gT25seSB0aGUgcnVuIHRoYXQgYWNxdWlyZWQgdGhlIG1hcmtlciBtYXkgcmVtb3ZlIGl0OiBkZWxldGluZyBhIGZvcmVpZ24gbWFya2VyIHdvdWxkIGRpc2FibGVcbi8vIGludGVycnVwdGVkLW1pZ3JhdGlvbiBkZXRlY3Rpb24gZm9yIGEgY29uY3VycmVudGx5IHJ1bm5pbmcgd2JmeS5cbmZ1bmN0aW9uIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlck93bmVkIHx8ICFtaWdyYXRpb25NYXJrZXJQYXRoKSByZXR1cm47XG4gIGZzLnJtU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90czogTWFwPHN0cmluZywgc3RyaW5nPik6IGJvb2xlYW4ge1xuICBsZXQgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIHNuYXBzaG90cykge1xuICAgIHRyeSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gcmVzdG9yZSAke2ZpbGVQYXRofSBhZnRlciBhIGZhaWxlZCBtaWdyYXRpb246ICR7ZXJyb3J9YCk7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1Y2NlZWRlZDtcbn1cblxuZnVuY3Rpb24gZmFpbEZub3hTeW5jKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgZm5veFN5bmNGYWlsZWQgPSB0cnVlO1xufVxuXG4vLyBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYW4gdW5zdXBwb3J0ZWQgZm5veC5sb2NhbC50b21sIGluIHRoZSBkaXJlY3RvcnksIG9yIHVuZGVmaW5lZC4gTG9jYWxcbi8vIG92ZXJyaWRlcyBtYXkgb25seSBob2xkIG1hY2hpbmUtbG9jYWwgc2VjcmV0IHZhbHVlczsgaW1wb3J0cyBvciBwcm92aWRlciAocmUpZGVmaW5pdGlvbnMgd291bGRcbi8vIHNpbGVudGx5IGNoYW5nZSB3aGljaCByZWNpcGllbnQgc2V0IGdvdmVybnMgcmUtZW5jcnlwdGlvbi5cbmZ1bmN0aW9uIGZpbmRGbm94TG9jYWxUb21sSXNzdWUoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbG9jYWxUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFRvbWxQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYWxTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFRvbWxQYXRoLCAndXRmOCcpKSBhcyBGbm94VG9tbDtcbiAgY29uc3QgZGVmaW5lc1Byb3ZpZGVycyA9XG4gICAgbG9jYWxTZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCB8fFxuICAgIGxvY2FsU2V0dGluZ3MucHJvdmlkZXJzICE9PSB1bmRlZmluZWQgfHxcbiAgICBPYmplY3QudmFsdWVzKGxvY2FsU2V0dGluZ3MucHJvZmlsZXMgPz8ge30pLnNvbWUoKHByb2ZpbGUpID0+IHByb2ZpbGU/LnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGRlZmluZXNQcm92aWRlcnMgPyBgJHtsb2NhbFRvbWxQYXRofSBkZWZpbmVzIGltcG9ydHMsIHByb3ZpZGVycywgb3IgcHJvZmlsZSBwcm92aWRlcnNgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IGRpcmVjdG9yeSBjb250YWluaW5nIGEgY29tbWl0dGVkIChvciBjb21taXR0YWJsZSkgZm5veC50b21sIGFtb25nIHRoZSBnaXZlblxuICogZ2l0LWRpc2NvdmVyZWQgY29uZmlnIHBhdGhzIChzZWUgbGlzdEZub3hMaWtlRmlsZVBhdGhzOiBnaXQtYmFzZWQgZGlzY292ZXJ5IGV4Y2x1ZGVzIGdpdGlnbm9yZWRcbiAqIHRyZWVzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIHdpdGhvdXQgZXhjbHVkaW5nIGxlZ2l0aW1hdGUgcGFja2FnZXMgbmFtZWQgbGlrZSBidWlsZCBvdXRwdXRzKS5cbiAqL1xuZnVuY3Rpb24gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBmbm94TGlrZUZpbGVQYXRoc1xuICAgICAgICAuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgPT09ICdmbm94LnRvbWwnKVxuICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIGRlY2xhcmVzIGl0cyBvd24gYFtwcm92aWRlcnMuYWdlXWAsIGkuZS4gcGFydGljaXBhdGVzIGluIGFnZSBlbmNyeXB0aW9uLlxuICogQSBjb25maWcgd2l0aG91dCBvbmUgZWl0aGVyIGluaGVyaXRzIGEgbWFuYWdlZCByb290J3MgcHJvdmlkZXIgKGhhbmRsZWQgYnkgdGhlIHJvb3QtZXhpc3RzIHBhdGgpXG4gKiBvciwgd2hlbiBubyByb290IGV4aXN0cywgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwg4oCUIHNvIGl0IG5lZWRzIG5vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb25cbiAqIGFuZCBvd25zIG5vIEZOT1hfQUdFX0tFWS5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnJlYWRhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCb29sZWFuKChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbCkucHJvdmlkZXJzPy5hZ2UpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5wYXJzYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgcGF0aCBsaWVzIGluc2lkZSBhIHRlc3QtZml4dHVyZSB0cmVlICh0ZXN0L2ZpeHR1cmVzLCB0ZXN0LWZpeHR1cmVzLFxuICogX190ZXN0c19fKTogZml4dHVyZSBjb25maWdzIGFyZSB0ZXN0IElOUFVUUywgbm90IHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbi4gZm5veCBuZXZlciBsb2Fkc1xuICogdGhlbSBmb3IgcmVhbCBjb21tYW5kcyAoaGllcmFyY2hpY2FsIGxvYWRpbmcgb25seSB3YWxrcyBjd2QgYW5jZXN0b3JzKSwgcmVjaXBpZW50XG4gKiBzeW5jaHJvbml6YXRpb24gbXVzdCBub3QgcmV3cml0ZSBvciByZS1lbmNyeXB0IHRoZW0gKHNoYXJlZC1saWItbm9kZSdzIHVuZGVjcnlwdGFibGUgZml4dHVyZVxuICogZXhpc3RzIHByZWNpc2VseSB0byBzdGF5IHVuZGVjcnlwdGFibGUpLCBhbmQgYSBmaXh0dXJlIG11c3Qgbm90IGZhaWwgdGhlIHN0cmF5LW5lc3RlZC1jb25maWdcbiAqIGNoZWNrIGluIHJlcG9zaXRvcmllcyB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlc3RGaXh0dXJlRm5veFBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgZml4dHVyZXNgIGNvdW50cyBvbmx5IGRpcmVjdGx5IHVuZGVyIGEgdGVzdCBkaXJlY3Rvcnk6IHdiZnkgc3VwcG9ydHMgYXJiaXRyYXJ5IHdvcmtzcGFjZXMsXG4gIC8vIHNvIGEgbGVnaXRpbWF0ZSBgcGFja2FnZXMvZml4dHVyZXMvYCB3b3Jrc3BhY2UgbXVzdCBzdGF5IG1hbmFnZWQgYW5kIHZlcmlmaWVkLlxuICBjb25zdCBzZWdtZW50cyA9IGZpbGVQYXRoLnNwbGl0KCcvJyk7XG4gIHJldHVybiBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50LCBpbmRleCkgPT5cbiAgICAgIHNlZ21lbnQgPT09ICd0ZXN0LWZpeHR1cmVzJyB8fFxuICAgICAgc2VnbWVudCA9PT0gJ19fdGVzdHNfXycgfHxcbiAgICAgIChzZWdtZW50ID09PSAnZml4dHVyZXMnICYmIChzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdCcgfHwgc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3RzJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyAteiBwcmludHMgTlVMLWRlbGltaXRlZCB2ZXJiYXRpbSBwYXRoczsgd2l0aG91dCBpdCwgY29yZS5xdW90ZVBhdGggQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzXG4gIC8vIChlLmcuIFwiXFwzNDZcXDIyN1xcMjQ1Li4uXCIpLCB3aGljaCB3b3VsZCBtYWtlIHRoZSBiYXNlbmFtZSBmaWx0ZXIgc2lsZW50bHkgc2tpcCB0aG9zZSBjb25maWdzLlxuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgWydscy1maWxlcycsICcteicsICctLWNhY2hlZCcsICctLW90aGVycycsICctLWV4Y2x1ZGUtc3RhbmRhcmQnLCAnLS0nLCAnKmZub3gqLnRvbWwnXSxcbiAgICB7IGN3ZDogcm9vdERpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfVxuICApO1xuICAvLyBGYWlsIGNsb3NlZDogdHJlYXRpbmcgYSBnaXQgZmFpbHVyZSBhcyBcIm5vIGZub3ggY29uZmlnc1wiIHdvdWxkIHNraXAgc3luY2hyb25pemF0aW9uIGFuZCBsZXRcbiAgLy8gc2V0dXBTZWNyZXRzIHVwbG9hZCBhIGtleSB0aGF0IHdhcyBuZXZlciB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZXBvc2l0b3J5J3MgY2lwaGVydGV4dHMuXG4gIGlmIChwcm9jLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZ2l0IGxzLWZpbGVzIGZhaWxlZCBpbiAke3Jvb3REaXJQYXRofTogJHsocHJvYy5zdGRlcnIgfHwgcHJvYy5lcnJvcj8ubWVzc2FnZSB8fCAnJykudHJpbSgpfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dFxuICAgIC5zcGxpdCgnXFwwJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QocGF0aC5iYXNlbmFtZShsaW5lKSkgJiYgIWlzVGVzdEZpeHR1cmVGbm94UGF0aChsaW5lKSlcbiAgICAubWFwKChsaW5lKSA9PiBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIGxpbmUpKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KG5hbWUpKVxuICAgICAgLnRvU29ydGVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGZub3ggY2FuIHN0aWxsIGxvYWQgYSBjb25maWcgZnJvbSBhIGRpcmVjdG9yeSB0aGlzIHByb2Nlc3MgY2Fubm90IGVudW1lcmF0ZVxuICAgIC8vIChlLmcuIGV4ZWN1dGUtb25seSBwZXJtaXNzaW9uKSwgc28gYW4gZW51bWVyYXRpb24gZmFpbHVyZSBtdXN0IG5vdCByZWFkIGFzIFwibm8gY29uZmlnc1wiLlxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluc3BlY3QgJHtkaXJQYXRofSBmb3IgZm5veCBjb25maWdzOiAke2Vycm9yfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGlyUGF0aHMgPSBbZGlyUGF0aF07XG4gIHdoaWxlIChkaXJQYXRocy5hdCgtMSkgIT09IHJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpclBhdGhzLmF0KC0xKSA/PyAnJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyUGF0aHMuYXQoLTEpKSBicmVhaztcbiAgICBkaXJQYXRocy5wdXNoKHBhcmVudCk7XG4gIH1cbiAgcmV0dXJuIGRpclBhdGhzO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxuICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4sXG4gIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5LFxuICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbi8vIFRoZSBCdW4tZXhhY3QgcmVzb2x1dGlvbiBwcmltaXRpdmVzIGxpdmUgaW4gQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSAoc3JjL2J1bldvcmtzcGFjZXMudHMpXG4vLyBzbyB3YidzIHJlbGVhc2UgY29kZSBzaGFyZXMgdGhlbTsgcmUtZXhwb3J0IHRoZSBvbmVzIHdiZnkgbW9kdWxlcyBhbmQgdGVzdHMgY29uc3VtZS5cbmV4cG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIFBhY2thZ2VDb25maWcgdGhhdCB3b3Jrc3BhY2UgZGlzY292ZXJ5IG5lZWRzLCBzbyBpdCBjYW4gcnVuIGJlZm9yZSBjb25maWdzIGV4aXN0LiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlUm9vdExpa2UgPSBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPjtcblxuLyoqXG4gKiBFdmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IChhYnNvbHV0ZSwgZGVkdXBsaWNhdGVkKSBvZiB0aGUgbW9ub3JlcG8gcm9vdCwgY292ZXJpbmdcbiAqIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyouIFVuY2FjaGVkIGJlY2F1c2UgaW5kZXgudHMgY2FsbHMgaXQgYmVmb3JlIHdiZnkgbXV0YXRlc1xuICogdGhlIHJvb3QgcGFja2FnZS5qc29uIChnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyBjYWNoZXMgdGhlIHBvc3QtbXV0YXRpb24gc3RhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RMaWtlKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3RMaWtlLmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpLCBpbmNsdWRpbmcgbWFuaWZlc3RzXG4gKiB3aXRob3V0IGEgYG5hbWVgIGZpZWxkIOKAlCB3YmZ5IG5hbWVzIHRob3NlIGxhdGVyLCBzbyBkZXBlbmRlbmN5IHNjYW5zIG11c3Qgbm90IHNraXAgdGhlbS5cbiAqIFJlc29sdXRpb24gbWltaWNzIEJ1bidzIHNlcXVlbnRpYWwgcGF0dGVybiBldmFsdWF0aW9uOyBzZWUgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWc6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdENvbmZpZyksIHJvb3RDb25maWcuZGlyUGF0aCk7XG59XG5cbmludGVyZmFjZSBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8qKiBEaXJlY3Rvcnkgc3VidHJlZXMgKG9yIHBhY2thZ2Utb3duZWQgc3VicGF0aHMpIG1hdGNoZWQgYnkgZWZmZWN0aXZlIG5lZ2F0aW9ucywgZm9yIHRzY29uZmlnIGBleGNsdWRlYCBlbnRyaWVzLiAqL1xuICBleGNsdWRlczogc3RyaW5nW107XG4gIC8qKiBQb3NpdGl2ZSBkaXJlY3RvcnkgcGF0dGVybnMgKG9yIGNvbmNyZXRlIGRpcmVjdG9yaWVzIGZvciBCdW4tb25seSBnbG9iIHN5bnRheCkuICovXG4gIGluY2x1ZGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTb3J0ZWQgd29ya3NwYWNlIGRpcmVjdG9yeSBwYXR0ZXJucyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290KSBmb3IgZ2VuZXJhdG9ycyB0aGF0XG4gKiBuZWVkIHBhdHRlcm4tc2hhcGVkIGdsb2JzIGNvdmVyaW5nIGV2ZXJ5IHdvcmtzcGFjZSBsYXlvdXQg4oCUIGUuZy4gdGhlIHJvb3QgdHNjb25maWcncyBgYXBwcy8qYFxuICogaW5jbHVkZSBlbnRyaWVzIOKAlCBpbnN0ZWFkIG9mIGNvbmNyZXRlIGRpcmVjdG9yaWVzLCB3aGljaCB3b3VsZCBjaHVybiBnZW5lcmF0ZWQgZmlsZXMgd2hlbmV2ZXIgYVxuICogd29ya3NwYWNlIHBhY2thZ2UgaXMgYWRkZWQgb3IgcmVtb3ZlZC4gRXZlcnkgcmV0dXJuZWQgcGF0dGVybiBpcyB2YWxpZCB0c2NvbmZpZyBnbG9iIHN5bnRheC5cbiAqIEEgcGF0dGVybiBjYW4gbWF0Y2ggYSBzaWJsaW5nIGRpcmVjdG9yeSB3aXRob3V0IGEgcGFja2FnZS5qc29uIChub3QgYSB3b3Jrc3BhY2UgdG8gQnVuKTsgdGhhdFxuICogaXMgZGVsaWJlcmF0ZSwgbWlycm9yaW5nIHRoZSBsb25nLXN0YW5kaW5nIGBwYWNrYWdlcy8qYCBlbnRyaWVzJyBiZWhhdmlvciBpbiBmYXZvciBvZiBzdGFibGVcbiAqIGdlbmVyYXRlZCBvdXRwdXQuIE5lZ2F0aW9ucyBmb2xsb3cgQnVuJ3Mgc2VxdWVudGlhbCBzZW1hbnRpY3MgKHNlZVxuICogcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMpOiBhIG5lZ2F0aW9uIHN0YXlzIHBhdHRlcm4tc2hhcGVkIHdoaWxlIGl0IGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcywgYnV0IGlzIGNvbmNyZXRpemVkIHBlciBtYXRjaGVkIGRpcmVjdG9yeSB3aGVuIGEgbWF0Y2hlZCBkaXJlY3RvcnkgZW5kcyB1cCBhXG4gKiB3b3Jrc3BhY2UgYW55d2F5IChyZS1pbmNsdWRlZCBieSBhIGxhdGVyIHBvc2l0aXZlLCBhIHBpbm5lZCBjb25jcmV0ZSBwb3NpdGl2ZSwgb3IgYSBzZWVkZWRcbiAqIGJhc2VsaW5lOyAjMTAwNSkgb3IgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5LCB3aGVyZSBCdW4gZXhjbHVkZXMgb25seSB0aGVcbiAqIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3RvcnksIHNvIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgYXJlIGV4Y2x1ZGVkICgjMTAwNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8vIFVubGlrZSBkaXNjb3ZlcnksIGdlbmVyYXRlZCBvdXRwdXQgbXVzdCBub3QgY29udGFpbiBhIG5ldmVyLW1hdGNoaW5nIGBwYWNrYWdlcy8qYCBmYWxsYmFjazpcbiAgLy8gYW4gYXBwcy8qLW9ubHkgbW9ub3JlcG8gd291bGQgZ2V0IGRlYWQgZ2xvYnMgY29tbWl0dGVkIGludG8gaXRzIHJvb3QgdHNjb25maWcuIE1pcnJvclxuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIGZvcmNlcyBgcGFja2FnZXMvKmAgb25seSB3aGVuIGEgbWFuaWZlc3QgYWN0dWFsbHkgbWF0Y2hlcy5cbiAgY29uc3QgaGFzUGFja2FnZXNMYXlvdXQgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmXG4gICAgLy8gTWlycm9yIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucycgYmFzZWxpbmUgZ2F0ZSB0b286IHdpdGggYW4gaW1wbGljaXQgYmFzZWxpbmUgc2VlZGVkLFxuICAgIC8vIGBwYWNrYWdlcy8qYCBlbnRyaWVzIHdvdWxkIGJlIGRlYWQgZ2xvYnMgc3Vic3VtZWQgYnkgdGhlIGJhc2VsaW5lLWRlcml2ZWQgb25lcy5cbiAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcykgJiZcbiAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBjd2Q6IHJvb3RMaWtlLmRpclBhdGgsXG4gICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KS5sZW5ndGggPiAwO1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHtcbiAgICAuLi5yb290TGlrZSxcbiAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogaGFzUGFja2FnZXNMYXlvdXQsXG4gIH0pO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG5ldyBTZXQoXG4gICAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlUGF0dGVybnMsIHJvb3RMaWtlLmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aClcbiAgICApXG4gICk7XG4gIGNvbnN0IGluY2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG5lZ2F0aW9uQm9kaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICAvLyBBIHNlZWRpbmcgbmVnYXRpb24gbWFrZXMgQnVuIGxpbmsgYmFzZWxpbmUtbWF0Y2hlZCBkaXJlY3Rvcmllcywgc28gdGhlIGJhc2VsaW5lIG11c3RcbiAgICAgIC8vIGVudGVyIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZSBwYXR0ZXJucyBldmVuIHdoZW4gZXZlcnkgZGVjbGFyZWQgcGF0dGVybiBpcyBhIG5lZ2F0aW9uLlxuICAgICAgY29uc3QgYmFzZWxpbmVHbG9iID0gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKHBhdHRlcm5Cb2R5KTtcbiAgICAgIGlmIChiYXNlbGluZUdsb2IgIT09IHVuZGVmaW5lZCkgaW5jbHVkZXMuYWRkKGJhc2VsaW5lR2xvYik7XG4gICAgICBuZWdhdGlvbkJvZGllcy5wdXNoKHBhdHRlcm5Cb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBkaXJQYXR0ZXJuIG9mIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHksIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICAgIGluY2x1ZGVzLmFkZChkaXJQYXR0ZXJuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgZXhjbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBuZWdhdGlvbkJvZHkgb2YgbmVnYXRpb25Cb2RpZXMpIHtcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVFbnRyeSBvZiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keSwgd29ya3NwYWNlRGlyUGF0aHMsIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICBleGNsdWRlcy5hZGQoZXhjbHVkZUVudHJ5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgZXhjbHVkZXM6IFsuLi5leGNsdWRlc10udG9Tb3J0ZWQoKSwgaW5jbHVkZXM6IFsuLi5pbmNsdWRlc10udG9Tb3J0ZWQoKSB9O1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGV4Y2x1ZGUgZW50cmllcyBmb3Igb25lIG5lZ2F0aW9uLiBQYXR0ZXJuLXNoYXBlZCB3aGVuIHRoZSBuZWdhdGlvbiBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMgKHN0YWJsZSBvdXRwdXQpOyBwZXItZGlyZWN0b3J5IG90aGVyd2lzZTogYSBkaXJlY3RvcnkgdGhhdCBpcyBhIHdvcmtzcGFjZVxuICogZGVzcGl0ZSB0aGUgbmVnYXRpb24gaXMgbm90IGV4Y2x1ZGVkIGF0IGFsbCwgYW5kIG5laXRoZXIgaXMgYSBQTEFJTiAocGFja2FnZS5qc29uLWxlc3MpXG4gKiBkZXNjZW5kYW50IG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSDigJQgbmVnYXRpbmcgYSBub24tcGFja2FnZSBkaXJlY3RvcnkgaXMgYSBuby1vcCBmb3IgQnVuLFxuICogYW5kIHRoZSBlbmNsb3Npbmcgd29ya3NwYWNlIHN0YXlzIGFjdGl2ZSAoZS5nLiBgWydhcHBzLyoqJywgJyFhcHBzLyoqJywgJ2FwcHMvd2ViJ11gXG4gKiByZS1pbmNsdWRlcyBhcHBzL3dlYiwgd2hvc2Ugc3JjIG11c3Qga2VlcCB0eXBlLWNoZWNraW5nOyBhIHRzY29uZmlnIGV4Y2x1ZGUgd291bGQgb3ZlcnJpZGVcbiAqIHRoZSBpbmNsdWRlKS4gQSBkZXNjZW5kYW50IHdpdGggaXRzIG93biBtYW5pZmVzdCB0aGF0IHRoZSBuZWdhdGlvbiBrZWVwcyBvdXQgb2YgdGhlIHdvcmtzcGFjZVxuICogc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlIGFuZCBzdGF5cyBleGNsdWRlZC4gQSBkaXJlY3RvcnkgdGhhdCBpcyBhblxuICogYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IGdldHMgb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBleGNsdWRlZCwgYmVjYXVzZSBCdW5cbiAqIGV4Y2x1ZGVzIG9ubHkgdGhlIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3Rvcnkgd2hpbGUga2VlcGluZyBkZXNjZW5kYW50IHdvcmtzcGFjZXMgKCMxMDA0KS5cbiAqL1xuZnVuY3Rpb24gdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IFNldDxzdHJpbmc+LCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc1dvcmtzcGFjZUFuY2VzdG9yID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IHdvcmtzcGFjZURpclBhdGguc3RhcnRzV2l0aChgJHtkaXJQYXRofS9gKSk7XG4gIC8vIE9ubHkgUExBSU4gZGlyZWN0b3JpZXMgKG5vIHBhY2thZ2UuanNvbiBvZiB0aGVpciBvd24pIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGVuY2xvc2luZ1xuICAvLyB3b3Jrc3BhY2U6IGEgbWF0Y2hlZCBkaXJlY3RvcnkgdGhhdCBjYXJyaWVzIGl0cyBvd24gbWFuaWZlc3QgeWV0IGlzIGFic2VudCBmcm9tIHRoZSBmaW5hbFxuICAvLyB3b3Jrc3BhY2Ugc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlLCBhbmQgaXRzIGV4Y2x1c2lvbiBtdXN0IHN1cnZpdmUuXG4gIGNvbnN0IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudCA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYCkpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBkaXJQYXRoLCAncGFja2FnZS5qc29uJykpO1xuICBjb25zdCBtYXRjaGVkRGlyUGF0aHMgPSBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIGlmIChcbiAgICAhbWF0Y2hlZERpclBhdGhzLnNvbWUoXG4gICAgICAoZGlyUGF0aCkgPT5cbiAgICAgICAgd29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlZERpclBhdGhzLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAvLyBUaGUgZGVzY2VuZGFudCBjaGVjayBwcmVjZWRlcyB0aGUgYW5jZXN0b3Igb25lOiBhIGRpcmVjdG9yeSBpbnNpZGUgb25lIHdvcmtzcGFjZSBidXQgYWJvdmVcbiAgICAvLyBhIG5lc3RlZCBvbmUgKGUuZy4gYXBwcy93ZWIvcGx1Z2lucyBiZXR3ZWVuIHdvcmtzcGFjZXMgYXBwcy93ZWIgYW5kIGFwcHMvd2ViL3BsdWdpbnMveClcbiAgICAvLyBzdGlsbCBiZWxvbmdzIHRvIHRoZSBlbmNsb3NpbmcgYWN0aXZlIHdvcmtzcGFjZSwgc28gbm90aGluZyBvZiBpdCBtYXkgYmUgZXhjbHVkZWQuXG4gICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aCkpIHJldHVybiBbXTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtgJHtkaXJQYXRofS8qLmNvbmZpZy50c2AsIGAke2RpclBhdGh9L3NjcmlwdHNgLCBgJHtkaXJQYXRofS9zcmNgLCBgJHtkaXJQYXRofS90ZXN0YF07XG4gICAgfVxuICAgIHJldHVybiBbZGlyUGF0aF07XG4gIH0pO1xufVxuXG4vKipcbiAqIERpcmVjdG9yaWVzIGEgbmVnYXRpb24gbWF0Y2hlcy4gVGhlIG1hbmlmZXN0LWJhc2VkIGdsb2IgY29tcGxlbWVudHMgb25seURpcmVjdG9yaWVzIGJlY2F1c2VcbiAqIGZhc3QtZ2xvYidzIGBkaXIvKipgIGRvZXMgbm90IHJldHVybiBgZGlyYCBpdHNlbGYgYXMgYSBkaXJlY3RvcnksIHdoaWxlIGJvdGggQnVuIGFuZCB0aGVcbiAqIG1hbmlmZXN0IGdsb2IgdHJlYXQgYCoqYCBhcyB6ZXJvIG9yIG1vcmUgc2VnbWVudHMgKGBhcHBzLyoqYCBjb3ZlcnMgdGhlIHBhY2thZ2UgYXQgYXBwcykuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLmZnLmdsb2JTeW5jKG5lZ2F0aW9uQm9keSwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pLFxuICAgICAgLi4uZmdcbiAgICAgICAgLmdsb2JTeW5jKHBhdGgucG9zaXguam9pbihuZWdhdGlvbkJvZHksICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpXG4gICAgICAgIC5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCBpdHNlbGYsIHdoaWNoIGlzIG5ldmVyIGEgd29ya3NwYWNlLlxuICAgICAgICAuZmlsdGVyKChkaXJQYXRoKSA9PiBkaXJQYXRoICE9PSAnLicpLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogdHNjb25maWcgaW5jbHVkZS9leGNsdWRlIHN1cHBvcnQgb25seSB0aGUgYCpgLCBgP2AsIGFuZCBgKipgIHdpbGRjYXJkcywgd2hpbGUgQnVuIHdvcmtzcGFjZXNcbiAqIGFjY2VwdCBmdWxsIGdsb2Igc3ludGF4IChicmFjZSBleHBhbnNpb24sIGNoYXJhY3RlciBjbGFzc2VzLCDigKYpLCBzbyBleHBhbmQgQnVuLW9ubHkgcGF0dGVybnMgdG9cbiAqIHRoZSBjb25jcmV0ZSBkaXJlY3RvcmllcyB0aGV5IG1hdGNoIHRvIGtlZXAgdGhlIGdlbmVyYXRlZCBnbG9icyB2YWxpZCBmb3IgVHlwZVNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoIS9bKClbXFxde31dL3UudGVzdChwYXR0ZXJuQm9keSkpIHJldHVybiBbcGF0dGVybkJvZHldO1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybkJvZHksIHtcbiAgICBjd2Q6IHJvb3REaXJQYXRoLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICBvbmx5RGlyZWN0b3JpZXM6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyAobmVnYXRpdmUgb25lcyBpbmNsdWRlZCkgdGhhdCBzdGF5IGluc2lkZSB0aGUgcmVwb3NpdG9yeTogYWJzb2x1dGVcbiAqIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIHJlbW92ZU5vZGVNb2R1bGVzIG9wZXJhdGUgb24gYW5vdGhlclxuICogcmVwb3NpdG9yeSdzIGZpbGVzLiBEZWNsYXJhdGlvbiBvcmRlciBhbmQgZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZVxuICogcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlY2xhcmVkUGF0dGVybnMgPSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcyk7XG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyBmb3JjZXMgYHBhY2thZ2VzLypgIGludG8gYSBtb25vcmVwbydzIHdvcmtzcGFjZXMgd2hlbiBhXG4gIC8vIHBhY2thZ2VzLyovcGFja2FnZS5qc29uIGFjdHVhbGx5IG1hdGNoZXMsIGJ1dCBpdCBtYXkgbm90IGhhdmUgd3JpdHRlbiB0aGUgcm9vdCBwYWNrYWdlLmpzb25cbiAgLy8geWV0LCBzbyBtaXJyb3IgdGhhdCBub3JtYWxpemF0aW9uIGhlcmUg4oCUIFBSRVBFTkRFRCBsaWtlIHRoZXJlLCBiZWNhdXNlIGEgcG9zaXRpdmUgcGF0dGVyblxuICAvLyBwbGFjZWQgYWZ0ZXIgYSB1c2VyIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMgdW5kZXIgQnVuJ3Mgc2VxdWVudGlhbFxuICAvLyBldmFsdWF0aW9uLiBEaXNjb3ZlcnkgY2FsbGVycyBwYXNzIHRoZSBmYWxsYmFjayB1bmNvbmRpdGlvbmFsbHkgZm9yIG1vbm9yZXBvcyDigJQgYVxuICAvLyBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGNvbnRyaWJ1dGVzIG5vIHBhdGhzIHRoZXJlIOKAlCB3aGlsZSBwYXR0ZXJuLXNoYXBlZCBjYWxsZXJzXG4gIC8vIChnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykgZ2F0ZSBpdCBvbiBhbiBhY3R1YWwgbWF0Y2guXG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKVxuICAgICAgPyBbJ3BhY2thZ2VzLyonLCAuLi5kZWNsYXJlZFBhdHRlcm5zXVxuICAgICAgOiBkZWNsYXJlZFBhdHRlcm5zO1xuICByZXR1cm4gd29ya3NwYWNlUGF0dGVybnMuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZWNsYXJlZCBwb3NpdGl2ZSBwYXR0ZXJuIGFscmVhZHkgY292ZXJzIGBwYWNrYWdlcy8qYCB1bmRlciBwYXRoIG5vcm1hbGl6YXRpb25cbiAqIChlLmcuIGAuL3BhY2thZ2VzLypgIG9yIGEgdHJhaWxpbmctc2xhc2ggc3BlbGxpbmcpOiBmb3JjaW5nIGEgdGV4dHVhbCBgcGFja2FnZXMvKmAgbmV4dCB0b1xuICogc3VjaCBhIHNwZWxsaW5nIHdvdWxkIHBlcnNpc3QgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybnMgYW5kIHJlLXNjYW4gdGhlIHNhbWUgZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4od29ya3NwYWNlczogUGFja2FnZUpzb25bJ3dvcmtzcGFjZXMnXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuc29tZShcbiAgICAod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgICF3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgLy8gQSBgLi5gLXRyYXZlcnNpbmcgb3IgYWJzb2x1dGUgc3BlbGxpbmcgKGUuZy4gYHgvLi4vcGFja2FnZXMvKmApIGlzIGRpc2NhcmRlZCBieVxuICAgICAgLy8gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMsIHNvIGl0IG11c3Qgbm90IGNvdW50IGFzIGNvdmVyaW5nIHBhY2thZ2VzLyog4oCUIHRoYXQgd291bGRcbiAgICAgIC8vIHN1cHByZXNzIHRoZSBmYWxsYmFjayBBTkQgbG9zZSB0aGUgcGF0dGVybiwgbGVhdmluZyBubyBkaXNjb3ZlcmVkIHdvcmtzcGFjZXMuXG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikgJiZcbiAgICAgIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4pID09PSAncGFja2FnZXMvKidcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyB9IGZyb20gJy4vd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IFBSSVZBVEVfU0NPUEUgPSAnQHdpbGxib29zdGVyLXByaXZhdGUvJztcblxuY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5SG9zdCA9ICd2ZXJkYWNjaW8tcHJvZHVjdGlvbi1lMzg5LnVwLnJhaWx3YXkuYXBwJztcbmV4cG9ydCBjb25zdCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcgPSBgQHdpbGxib29zdGVyLXByaXZhdGU6cmVnaXN0cnk9aHR0cHM6Ly8ke3ByaXZhdGVSZWdpc3RyeUhvc3R9L2A7XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHJlcG9zaXRvcnkgZGVhbHMgd2l0aCBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcGFja2FnZXMg4oCUIGJ5IGNvbnZlbnRpb24gdGhhdCBzY29wZVxuICogbGl2ZXMgZXhjbHVzaXZlbHkgb24gdGhlIHByaXZhdGUgVmVyZGFjY2lvIHJlZ2lzdHJ5LCBzbyBleGFjdGx5IHRoZXNlIHJlcG9zaXRvcmllcyBuZWVkIHRoZVxuICogVkVSREFDQ0lPX1RPS0VOIHBhc3MtdGhyb3VnaCBpbiB0aGVpciByZXVzYWJsZS13b3JrZmxvdyBjYWxsZXJzLlxuICpcbiAqIEEgcmVwb3NpdG9yeSBxdWFsaWZpZXMgd2hlbiBhbnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBERUNMQVJFUyBhIGRlcGVuZGVuY3kgaW4gdGhlIHNjb3BlIChhbnlcbiAqIGRlcGVuZGVuY3kgZmllbGQpLCBvciBpcyBpdHNlbGYgTkFNRUQgaW4gdGhlIHNjb3BlIChpdCBwdWJsaXNoZXMgdG8gVmVyZGFjY2lvLCBhbmQgcmVsZWFzZS55bWxcbiAqIGRlcml2ZXMgaXRzIG5wbSBhdXRoIGZyb20gdGhlIHNhbWUgc2VjcmV0KS4gTm90aGluZyBlbHNlIGlzIHNjYW5uZWQ6IGxvY2tmaWxlcyBvbmx5IG1pcnJvciB0aGVcbiAqIGRlY2xhcmVkIGRlcGVuZGVuY2llcywgYW5kIGJ1bmZpZy50b21sJ3MgYG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXNgIG1lbnRpb25zIHRoZSBzY29wZSBldmVuIGluXG4gKiByZXBvc2l0b3JpZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgbWFuaWZlc3RSZWxQYXRocyA9IG5ldyBTZXQoWydwYWNrYWdlLmpzb24nLCAuLi5nZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZyldKTtcbiAgcmV0dXJuIFsuLi5tYW5pZmVzdFJlbFBhdGhzXS5zb21lKChyZWxQYXRoKSA9PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbFBhdGgpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hbmlmZXN0Lm5hbWU/LnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBbXG4gICAgICBtYW5pZmVzdC5kZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5wZWVyRGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3Qub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgXS5zb21lKChkZXBlbmRlbmNpZXMpID0+IE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcyA/PyB7fSkuc29tZSgobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiB3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBjYXJyaWVzIGluIHRoZSByZXBvc2l0b3J5LiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCByZXdyaXRlc1xuICogaXQgaW4gdGhlIHB1Ymxpc2hlZCB0YXJiYWxsIG9ubHkgKGl0IGlzIG5ldmVyIGNvbW1pdHRlZCBiYWNrKSwgc28gYSB3YmZ5IHJ1biBzdGFydGVkIGZyb20gYSBnaXRcbiAqIGNoZWNrb3V0IHJlcG9ydHMgdGhpcyBwbGFjZWhvbGRlciBpbnN0ZWFkIG9mIGEgcmVhbCB2ZXJzaW9uLlxuICovXG5jb25zdCB1bnJlbGVhc2VkVmVyc2lvblByZWZpeCA9ICcwLjAuMC0nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb24oKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS52ZXJzaW9uO1xufVxuXG4vKiogd2JmeSdzIGxvY2F0aW9uIGluc2lkZSBpdHMgb3duIHJlcG9zaXRvcnksIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QuICovXG5jb25zdCB3YmZ5RGlyUGF0aEluUmVwbyA9IHBhdGguam9pbigncGFja2FnZXMnLCAnd2JmeScpO1xuXG4vKipcbiAqIElkZW50aWZpZXMgdGhlIHdiZnkgYnVpbGQgdGhhdCBwcm9kdWNlZCB0aGUgZ2VuZXJhdGVkIGZpbGVzOiB0aGUgcmVsZWFzZWQgdmVyc2lvbiwgb3JcbiAqIGA8c2hvcnQgY29tbWl0IGhhc2g+Wy1kaXJ0eV0tbG9jYWxgIHdoZW4gd2JmeSBydW5zIGZyb20gaXRzIG93biBnaXQgY2hlY2tvdXQuIFVuZGVmaW5lZCB3aGVuXG4gKiBuZWl0aGVyIGlzIGF2YWlsYWJsZSAoZS5nLiBhbiB1bnJlbGVhc2VkIGJ1aWxkIGV4dHJhY3RlZCBmcm9tIGEgc291cmNlIGFyY2hpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBOZWl0aGVyIHRoZSBpbnN0YWxsZWQgcGFja2FnZS5qc29uIG5vciB0aGUgZ2l0IHN0YXRlIG9mIHdiZnkncyBvd24gY2hlY2tvdXQgY2FuIGNoYW5nZVxuICAvLyBtaWQtcnVuLCBhbmQgY29tcHV0aW5nIHRoZSBsYWJlbCBzcGF3bnMgc2V2ZXJhbCBnaXQgc3VicHJvY2Vzc2VzLCBzbyBpdCBpcyBjb21wdXRlZCBvbmNlLlxuICBpZiAoIWhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsKSB7XG4gICAgY2FjaGVkVmVyc2lvbkxhYmVsID0gY29tcHV0ZVdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgICBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25MYWJlbDtcbn1cblxubGV0IGhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsID0gZmFsc2U7XG5sZXQgY2FjaGVkVmVyc2lvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiwgZGlyUGF0aCB9ID0gcmVhZFdiZnlQYWNrYWdlSnNvbigpO1xuICBpZiAoIXZlcnNpb24uc3RhcnRzV2l0aCh1bnJlbGVhc2VkVmVyc2lvblByZWZpeCkpIHJldHVybiB2ZXJzaW9uO1xuXG4gIC8vIGdpdCByZXNvbHZlcyB0aGUgTkVBUkVTVCBlbmNsb3NpbmcgcmVwb3NpdG9yeSwgd2hpY2ggZm9yIGFuIHVucmVsZWFzZWQgYnVpbGQgcGxhY2VkIHVuZGVyIGFcbiAgLy8gdGFyZ2V0IHJlcG9zaXRvcnkgKG5vZGVfbW9kdWxlcywgb3IgYSB2ZW5kb3JlZC9leHRyYWN0ZWQgc291cmNlIHRyZWUpIGlzIHRoYXQgcmVwb3NpdG9yeSDigJQgaXRzXG4gIC8vIGNvbW1pdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHdiZnkgYnVpbGQgdGhhdCByYW4uIE9ubHkgd2JmeSdzIG93biBsb2NhdGlvbiBpbnNpZGUgaXRzIG93blxuICAvLyByZXBvc2l0b3J5IGlkZW50aWZpZXMgYSBnZW51aW5lIGNoZWNrb3V0LCBzbyBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2sgdG8gdGhlIHZlcnNpb24tbGVzcyBsYWJlbC5cbiAgY29uc3QgZ2l0Um9vdERpclBhdGggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG93LXRvcGxldmVsJ10sIGRpclBhdGgpO1xuICBpZiAoXG4gICAgIWdpdFJvb3REaXJQYXRoIHx8XG4gICAgcGF0aC5yZWxhdGl2ZShnaXRSb290RGlyUGF0aCwgZGlyUGF0aCkgIT09IHdiZnlEaXJQYXRoSW5SZXBvIHx8XG4gICAgIWlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGgpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgY29tbWl0SGFzaCA9IHJ1bkdpdChbJ3Jldi1wYXJzZScsICctLXNob3J0PTgnLCAnSEVBRCddLCBkaXJQYXRoKTtcbiAgaWYgKCFjb21taXRIYXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBUaGUgY29tbWl0IGFsb25lIHdvdWxkIG1pc2lkZW50aWZ5IGEgYnVpbGQgbWFkZSBmcm9tIGFuIGVkaXRlZCBjaGVja291dCwgc28gdW5jb21taXR0ZWQgY2hhbmdlc1xuICAvLyBhcmUgcmVwb3J0ZWQgdG9vIOKAlCBidXQgb25seSB1bmRlciBwYWNrYWdlcy8qL3NyYywgcGFja2FnZXMvKi9iaW4gYW5kIHBhY2thZ2VzLyovY29uZmlncywgdGhlXG4gIC8vIHNvdXJjZSwgZW50cnktcG9pbnQgd3JhcHBlciBhbmQgcG9saWN5IGZpbGVzIHdiZnkgYW5kIGl0cyB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1blxuICAvLyBmcm9tLiBFdmVyeXRoaW5nIHdiZnkgR0VORVJBVEVTIHdoZW4gaXQgdGFyZ2V0cyBpdHMgb3duIHJlcG9zaXRvcnkgbGl2ZXMgb3V0c2lkZSB0aG9zZSAodGhlXG4gIC8vIHJvb3QgUkVBRE1FIHRoaXMgbGFiZWwgZ29lcyBpbnRvLCBhbmQgZWFjaCBwYWNrYWdlJ3MgLmdpdGlnbm9yZSwgcGFja2FnZS5qc29uLCB0c2NvbmZpZywg4oCmKSwgc29cbiAgLy8gYSBmaXJzdCBydW4gY2Fubm90IG1ha2UgdGhlIG5leHQgb25lIHJlbGFiZWwgdGhlIGJhZGdlIGAtZGlydHktbG9jYWxgIGJ5IGl0c2VsZi5cbiAgLy8gTWFuaWZlc3RzIHN0YXkgb3V0IG9uIHB1cnBvc2UsIGV2ZW4gdGhvdWdoIGFuIGVkaXRlZCBgZXhwb3J0c2AgbWFwIGNhbiByZWRpcmVjdCB3aGljaCBjb2RlXG4gIC8vIGxvYWRzOiB3YmZ5IEdFTkVSQVRFUyBwYWNrYWdlLmpzb24sIHNvIGluY2x1ZGluZyBpdCB3b3VsZCBtYWtlIGV2ZXJ5IHJ1biByZXBvcnQgaXRzZWxmIGRpcnR5LlxuICAvLyBUaGUgbGFiZWwgaXMgYmVzdC1lZmZvcnQgYnVpbGQgcHJvdmVuYW5jZSwgbm90IGEgcmVwcm9kdWNpYmxlLWJ1aWxkIGF0dGVzdGF0aW9uLlxuICBjb25zdCBpc0RpcnR5ID0gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aCk7XG4gIGlmIChpc0RpcnR5ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc0RpcnR5KSByZXR1cm4gYCR7Y29tbWl0SGFzaH0tZGlydHktbG9jYWxgO1xuICAvLyBBbiB1bm1vZGlmaWVkIGNoZWNrb3V0IHNpdHRpbmcgb24gYSByZWxlYXNlIHRhZyBydW5zIGV4YWN0bHkgdGhlIGNvZGUgdGhhdCB3YXMgcHVibGlzaGVkIHVuZGVyXG4gIC8vIHRoYXQgdmVyc2lvbiwgc28gaXQgaXMgbGFiZWxlZCB3aXRoIHRoZSB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGNvbW1pdCB0aGF0IG9ubHkgd2JmeSBkZXZlbG9wZXJzXG4gIC8vIGNvdWxkIHJlc29sdmUgYmFjayB0byBvbmUuXG4gIHJldHVybiBmaW5kUmVsZWFzZWRWZXJzaW9uQXRIZWFkKG5hbWUsIGRpclBhdGgpID8/IGAke2NvbW1pdEhhc2h9LWxvY2FsYDtcbn1cblxuLyoqIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHRhZ3MgZWFjaCByZWxlYXNlIGA8cGFja2FnZSBuYW1lPkA8dmVyc2lvbj5gLiAqL1xuZnVuY3Rpb24gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChwYWNrYWdlTmFtZTogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IGAke3BhY2thZ2VOYW1lfUBgO1xuICAvLyBBIGNvbW1pdCBjYXJyaWVzIGF0IG1vc3Qgb25lIHJlbGVhc2UgdGFnIHBlciBwYWNrYWdlLCBzbyB0aGUgZmlyc3QgbWF0Y2ggaXMgdGhlIG9ubHkgbWF0Y2guXG4gIHJldHVybiBydW5HaXQoWyd0YWcnLCAnLS1wb2ludHMtYXQnLCAnSEVBRCddLCBjd2QpXG4gICAgPy5zcGxpdCgnXFxuJylcbiAgICAuZmluZCgodGFnKSA9PiB0YWcuc3RhcnRzV2l0aCh0YWdQcmVmaXgpKVxuICAgID8uc2xpY2UodGFnUHJlZml4Lmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBFdmVyeSByZW1vdGUgY291bnRzLCBub3QganVzdCBgb3JpZ2luYDogYSBmb3JrIGNoZWNrb3V0IGNhcnJpZXMgdGhlIGNhbm9uaWNhbCByZXBvc2l0b3J5IGFzXG4gIC8vIGB1cHN0cmVhbWAsIGFuZCBpdCBpcyBzdGlsbCBhIGdlbnVpbmUgd2JmeSBjaGVja291dCB3aG9zZSBjb21taXQgaWRlbnRpZmllcyB0aGUgYnVpbGQuXG4gIGNvbnN0IHJlbW90ZVVybHMgPSBydW5HaXQoWydyZW1vdGUnLCAnLXYnXSwgZ2l0Um9vdERpclBhdGgpO1xuICByZXR1cm4gISFyZW1vdGVVcmxzPy5zcGxpdCgnXFxuJykuc29tZSgobGluZSkgPT4gaXNDYW5vbmljYWxSZW1vdGVVcmwobGluZS5zcGxpdCgvWyBcXHRdKy91KVsxXSA/PyAnJykpO1xufVxuXG5jb25zdCBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aCA9IC9eXFwvP1dpbGxCb29zdGVyXFwvc2hhcmVkKD86XFwuZ2l0KT8kL2l1O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbW90ZSBVUkwgcG9pbnRzIGF0IHdiZnkncyBvd24gcmVwb3NpdG9yeS4gVGhlIGhvc3QgaXMgY29tcGFyZWQgYWZ0ZXIgUEFSU0lORyByYXRoZXJcbiAqIHRoYW4gbWF0Y2hlZCBpbnNpZGUgdGhlIHN0cmluZzogYW55IHBhdHRlcm4gbG9vc2UgZW5vdWdoIHRvIGFjY2VwdCBldmVyeSBVUkwgZm9ybSBnaXQgc3VwcG9ydHNcbiAqIGFsc28gYWNjZXB0ZWQgYSBsb29rYWxpa2UgdGhhdCBtZXJlbHkgY29udGFpbnMgdGhlIGhvc3QsIHN1Y2ggYXNcbiAqIGBodHRwczovL2V2aWwuZXhhbXBsZS8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCwgbGV0dGluZyBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQgY2xhaW0gdG9cbiAqIGJlIGEgZ2VudWluZSB3YmZ5IGJ1aWxkLlxuICovXG5mdW5jdGlvbiBpc0Nhbm9uaWNhbFJlbW90ZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBzY3Atc3R5bGUgKGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCkgaXMgbm90IGEgVVJMLCBzbyBpdCBpcyBtYXRjaGVkIHNlcGFyYXRlbHkuXG4gIC8vIFRoZSBsb29rYWhlYWQga2VlcHMgYSBzY2hlbWUncyBgOi8vYCBmcm9tIGJlaW5nIHJlYWQgYXMgdGhlIGBob3N0OnBhdGhgIHNlcGFyYXRvci5cbiAgY29uc3Qgc2NwTWF0Y2ggPSAvXig/OlteQC9dK0ApPyhbXi86XSspOig/IVxcLykoLiopJC91LmV4ZWModXJsKTtcbiAgaWYgKHNjcE1hdGNoKSB7XG4gICAgcmV0dXJuIHNjcE1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbScgJiYgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGgudGVzdChzY3BNYXRjaFsyXSEpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgeyBob3N0bmFtZSwgcGF0aG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3QocGF0aG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbXG4gICAgICAnc3RhdHVzJyxcbiAgICAgICctLXBvcmNlbGFpbicsXG4gICAgICAnLS11bnRyYWNrZWQtZmlsZXM9YWxsJyxcbiAgICAgICctLScsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9zcmMvKipgLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9LyovYmluLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2NvbmZpZ3MvKipgLFxuICAgIF0sXG4gICAgeyBjd2Q6IGdpdFJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gISFwcm9jLnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1bkdpdChhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIGFyZ3MsIHsgY3dkLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICByZXR1cm4gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkV2JmeVBhY2thZ2VKc29uOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJQYXRoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuLyoqIFJldHVybnMgd2JmeSdzIG93biBwYWNrYWdlIGRpcmVjdG9yeSwgd2hpY2ggYWxzbyBob2xkcyBpdHMgY29uZmlncyAoZS5nLiByZWxlYXNlQWdlR2F0ZS5qc29uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5RGlyUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFdiZnlQYWNrYWdlSnNvbigpLmRpclBhdGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRXYmZ5UGFja2FnZUpzb24oKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0ge1xuICBpZiAoY2FjaGVkV2JmeVBhY2thZ2VKc29uKSByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xuICAvLyBmaWxlVVJMVG9QYXRoLCBub3QgVVJMLnBhdGhuYW1lOiB0aGUgbGF0dGVyIGtlZXBzIHBlcmNlbnQtZW5jb2RpbmcsIHNvIGFuIGluc3RhbGxhdGlvbiBwYXRoXG4gIC8vIGNvbnRhaW5pbmcgZS5nLiBhIHNwYWNlIHdvdWxkIHJlc29sdmUgdG8gYSBub25leGlzdGVudCBkaXJlY3RvcnkgYW5kIHRoZSBzZWFyY2ggd291bGQgd2FsayB1cFxuICAvLyB0byBhbiB1bnJlbGF0ZWQgcGFja2FnZS5cbiAgbGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICAvLyBwYXRoLmRpcm5hbWUoJy8nKSA9PT0gJy8nLCBzbyB0aGUgc2VhcmNoIG11c3Qgc3RvcCBleHBsaWNpdGx5IGF0IHRoZSBmaWxlc3lzdGVtIHJvb3QuXG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHRocm93IG5ldyBFcnJvcihcIndiZnkncyBvd24gcGFja2FnZS5qc29uIGlzIG1pc3NpbmcuXCIpO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIGNhY2hlZFdiZnlQYWNrYWdlSnNvbiA9IHsgbmFtZTogcGFja2FnZUpzb24ubmFtZSwgdmVyc2lvbjogcGFja2FnZUpzb24udmVyc2lvbiwgZGlyUGF0aCB9O1xuICByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgTGFuZ3VhZ2UsIHR5cGUgTm9kZSwgUGFyc2VyIH0gZnJvbSAnd2ViLXRyZWUtc2l0dGVyJztcblxuaW1wb3J0IHsgZ2V0V2JmeURpclBhdGggfSBmcm9tICcuL3ZlcnNpb24uanMnO1xuXG4vLyB3YmZ5IG11c3QgcmVzb2x2ZSBiZWZvcmUgaXQgcmVmcmVzaGVzIGdsb2JhbCByZWxlYXNlLWFnZSBleGNsdXNpb25zLiBTaGlwIHRoZSBCYXNoIGdyYW1tYXJcbi8vIHdpdGggdGhlIHBhY2thZ2Ugc28gYSBuZXdseSBwdWJsaXNoZWQgZ3JhbW1hciByZWxlYXNlIGNhbm5vdCBibG9jayB0aGF0IGZpcnN0IGluc3RhbGxhdGlvbi5cbmF3YWl0IFBhcnNlci5pbml0KCk7XG5jb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG5wYXJzZXIuc2V0TGFuZ3VhZ2UoYXdhaXQgTGFuZ3VhZ2UubG9hZChwYXRoLmpvaW4oZ2V0V2JmeURpclBhdGgoKSwgJ2NvbmZpZ3MnLCAndHJlZS1zaXR0ZXItYmFzaC53YXNtJykpKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB1bnF1b3RlZCB3b3JkcyAoY29tbWFuZCBuYW1lIGZpcnN0KSBvZiBldmVyeSBzaW1wbGUgY29tbWFuZCBpbiBhIEJhc2ggc2NyaXB0LCBpbmNsdWRpbmcgdGhvc2UgbmVzdGVkXG4gKiBpbiBzdWJzaGVsbHMsIGNvbXBvdW5kIHN0YXRlbWVudHMsIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbnMsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzY3JpcHQgZG9lcyBub3QgcGFyc2UuXG4gKiBDb21tZW50cyBhbmQgbGl0ZXJhbCBoZXJlZG9jIHRleHQgYXJlIG5vdCBjb21tYW5kcyAoY29tbWFuZCBzdWJzdGl0dXRpb25zIGluIGFuIHVucXVvdGVkIGhlcmVkb2MgYXJlKSwgYW5kIGZ1bmN0aW9uXG4gKiBib2RpZXMgYXJlIHNraXBwZWQgYmVjYXVzZSB0aGV5IHJ1biBvbmx5IHdoZW4gY2FsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTaGVsbENvbW1hbmRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW11bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJvb3ROb2RlID0gcGFyc2VyLnBhcnNlKHNjcmlwdCk/LnJvb3ROb2RlO1xuICBpZiAoIXJvb3ROb2RlIHx8IHJvb3ROb2RlLmhhc0Vycm9yKSByZXR1cm47XG4gIHJldHVybiByb290Tm9kZS5kZXNjZW5kYW50c09mVHlwZSgnY29tbWFuZCcpLmZsYXRNYXAoKGNvbW1hbmQpID0+IHtcbiAgICBjb25zdCBuYW1lID0gY29tbWFuZC5jaGlsZEZvckZpZWxkTmFtZSgnbmFtZScpO1xuICAgIGlmICghbmFtZSB8fCBpc0luRnVuY3Rpb25Cb2R5KGNvbW1hbmQpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtbbmFtZSwgLi4uY29tbWFuZC5jaGlsZHJlbkZvckZpZWxkTmFtZSgnYXJndW1lbnQnKV0ubWFwKCh3b3JkKSA9PiB1bnF1b3RlV29yZCh3b3JkKSldO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNJbkZ1bmN0aW9uQm9keShub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGFuY2VzdG9yID0gbm9kZS5wYXJlbnQ7IGFuY2VzdG9yOyBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudCkge1xuICAgIGlmIChhbmNlc3Rvci50eXBlID09PSAnZnVuY3Rpb25fZGVmaW5pdGlvbicpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdW5xdW90ZVdvcmQobm9kZTogTm9kZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSAnY29tbWFuZF9uYW1lJzoge1xuICAgICAgcmV0dXJuIG5vZGUuZmlyc3RDaGlsZCA/IHVucXVvdGVXb3JkKG5vZGUuZmlyc3RDaGlsZCkgOiBub2RlLnRleHQ7XG4gICAgfVxuICAgIGNhc2UgJ2NvbmNhdGVuYXRpb24nOiB7XG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB1bnF1b3RlV29yZChjaGlsZCkpLmpvaW4oJycpO1xuICAgIH1cbiAgICBjYXNlICdyYXdfc3RyaW5nJzoge1xuICAgICAgcmV0dXJuIG5vZGUudGV4dC5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgIHJldHVybiBub2RlLnRleHRcbiAgICAgICAgLnNsaWNlKDEsIC0xKVxuICAgICAgICAucmVwbGFjZUFsbCgnXFxcXFxcbicsICcnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFxcXChbJGBcIlxcXFxdKS9ndSwgJyQxJyk7XG4gICAgfVxuICAgIGNhc2UgJ3dvcmQnOiB7XG4gICAgICByZXR1cm4gbm9kZS50ZXh0LnJlcGxhY2VBbGwoJ1xcXFxcXG4nLCAnJykucmVwbGFjZUFsbCgvXFxcXCguKS9nc3UsICckMScpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICAvLyBFeHBhbnNpb25zIGFuZCBzdWJzdGl0dXRpb25zIGhhdmUgbm8gc3RhdGljIHZhbHVlOyB0aGVpciBzb3VyY2UgdGV4dCBuZXZlciBlcXVhbHMgYSBsaXRlcmFsIHdvcmQuXG4gICAgICByZXR1cm4gbm9kZS50ZXh0O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMganNZYW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgaXNNYXAsIGlzTm9kZSwgaXNTY2FsYXIsIGlzU2VxLCBQYWlyLCBwYXJzZURvY3VtZW50IH0gZnJvbSAneWFtbCc7XG5pbXBvcnQgdHlwZSB7IE5vZGUsIFlBTUxNYXAsIFlBTUxTZXEgfSBmcm9tICd5YW1sJztcblxuLyoqXG4gKiBTZXJpYWxpemVzIGB2YWx1ZWAgYXMgdGhlIFlBTUwgdGV4dCB0aGF0IHJlcGxhY2VzIGBvbGRDb250ZW50YC4gVGhlIG5vZGVzIG9mIGBvbGRDb250ZW50YCB0aGF0IGB2YWx1ZWAga2VlcHMga2VlcFxuICogdGhlaXIgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgYXMgd3JpdHRlbiAoZS5nLiBhIGJhcmUgYHdvcmtmbG93X2Rpc3BhdGNoOmApOyBuZXcgYW5kIGNoYW5nZWQgdmFsdWVzIGFyZSB3cml0dGVuIGFzXG4gKiBganMteWFtbGAgZHVtcHMgdGhlbSwgd2hpY2ggaXMgYWxzbyB0aGUgd2hvbGUgb3V0cHV0IHdoZW4gYG9sZENvbnRlbnRgIGlzIGFic2VudCBvciBub3QgYSBwYXJzYWJsZSBtYXBwaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHVtcFlhbWxPdmVyKG9sZENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IG9iamVjdCk6IHN0cmluZyB7XG4gIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBkdW1wWWFtbCh2YWx1ZSk7XG4gIGNvbnN0IGRvY3VtZW50ID0gcGFyc2VEb2N1bWVudChvbGRDb250ZW50KTtcbiAgaWYgKGRvY3VtZW50LmVycm9ycy5sZW5ndGggPiAwIHx8ICFpc01hcChkb2N1bWVudC5jb250ZW50cykpIHJldHVybiBkdW1wWWFtbCh2YWx1ZSk7XG5cbiAgdXBkYXRlTm9kZShkb2N1bWVudC5jb250ZW50cywgdmFsdWUsIG9sZENvbnRlbnQpO1xuICAvLyBGb2xkaW5nIGF0IGEgbGluZSB3aWR0aCB3b3VsZCBzcGxpdCBsb25nIHZhbHVlcyB0aGF0IGBqcy15YW1sYCB3cml0ZXMgb24gb25lIGxpbmUuXG4gIHJldHVybiBkb2N1bWVudC50b1N0cmluZyh7IGZsb3dDb2xsZWN0aW9uUGFkZGluZzogZmFsc2UsIGxpbmVXaWR0aDogMCB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTm9kZShub2RlOiB1bmtub3duLCB2YWx1ZTogdW5rbm93biwgc291cmNlOiBzdHJpbmcpOiBOb2RlIHtcbiAgaWYgKGlzTWFwKG5vZGUpICYmIGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgLy8ganMteWFtbCBvbWl0cyB1bmRlZmluZWQgcHJvcGVydGllcy5cbiAgICBub2RlLml0ZW1zID0gT2JqZWN0LmVudHJpZXModmFsdWUpXG4gICAgICAuZmlsdGVyKChbLCBpdGVtVmFsdWVdKSA9PiBpdGVtVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1WYWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgcGFpciA9IG5vZGUuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXNTY2FsYXIoaXRlbS5rZXkpICYmIFN0cmluZyhpdGVtLmtleS52YWx1ZSkgPT09IGtleSk7XG4gICAgICAgIGlmICghcGFpcikgcmV0dXJuIG5ldyBQYWlyKGNyZWF0ZU5vZGUoa2V5KSwgY3JlYXRlTm9kZShpdGVtVmFsdWUpKTtcbiAgICAgICAgbW92ZUlubGluZUNvbW1lbnRUb0tleShwYWlyLCBzb3VyY2UpO1xuICAgICAgICAvLyBPbmx5IGEgbWFwcGluZyB1bmRlciBhIGtleTogYHlhbWxgIHdvdWxkIHByaW50IHRoZSBjb21tZW50IG9mIGEgc2VxdWVuY2UgZW50cnkgYWZ0ZXIgaXRzIGAtIGAgaW5kaWNhdG9yLlxuICAgICAgICBpZiAoaXNNYXAocGFpci52YWx1ZSkpIG1vdmVMZWFkaW5nQ29tbWVudFRvRmlyc3RJdGVtKHBhaXIudmFsdWUsIHBhaXIudmFsdWUuaXRlbXNbMF0/LmtleSk7XG4gICAgICAgIHBhaXIudmFsdWUgPSB1cGRhdGVOb2RlKHBhaXIudmFsdWUsIGl0ZW1WYWx1ZSwgc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICB9KTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICBpZiAoaXNTZXEobm9kZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBvbGRJdGVtcyA9IG5vZGUuaXRlbXM7XG4gICAgbW92ZUxlYWRpbmdDb21tZW50VG9GaXJzdEl0ZW0obm9kZSwgaXNTY2FsYXIob2xkSXRlbXNbMF0pID8gb2xkSXRlbXNbMF0gOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHVudXNlZEl0ZW1zID0gbmV3IFNldChvbGRJdGVtcyk7XG4gICAgLy8gQSBzY2FsYXIgZW50cnkgaXMgaWRlbnRpZmllZCBieSBpdHMgdmFsdWUgYW5kIGEgbWFwcGluZyBlbnRyeSBieSBpdHMgcG9zaXRpb24sIHNvIHRoYXQgdGhlIGNvbW1lbnRzIG9mIGEgcmVtb3ZlZFxuICAgIC8vIHNjYWxhciBlbnRyeSBnbyB3aXRoIGl0IGluc3RlYWQgb2YgbGFuZGluZyBvbiB0aGUgZW50cnkgdGhhdCB0YWtlcyBpdHMgcG9zaXRpb24uXG4gICAgbm9kZS5pdGVtcyA9IHZhbHVlLm1hcCgoaXRlbVZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGlzUGxhaW5PYmplY3QoaXRlbVZhbHVlKSkge1xuICAgICAgICBjb25zdCBpdGVtID0gb2xkSXRlbXNbaW5kZXhdO1xuICAgICAgICByZXR1cm4gaXNNYXAoaXRlbSkgPyB1cGRhdGVOb2RlKGl0ZW0sIGl0ZW1WYWx1ZSwgc291cmNlKSA6IGNyZWF0ZU5vZGUoaXRlbVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhbWVTY2FsYXIgPSBvbGRJdGVtcy5maW5kKChpdGVtKSA9PiB1bnVzZWRJdGVtcy5oYXMoaXRlbSkgJiYgaXNTY2FsYXIoaXRlbSkgJiYgaXRlbS52YWx1ZSA9PT0gaXRlbVZhbHVlKTtcbiAgICAgIGlmICghc2FtZVNjYWxhcikgcmV0dXJuIGNyZWF0ZU5vZGUoaXRlbVZhbHVlKTtcbiAgICAgIHVudXNlZEl0ZW1zLmRlbGV0ZShzYW1lU2NhbGFyKTtcbiAgICAgIHJldHVybiBzYW1lU2NhbGFyO1xuICAgIH0pO1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIGlmIChpc1NjYWxhcihub2RlKSAmJiBub2RlLnZhbHVlID09PSB2YWx1ZSkgcmV0dXJuIG5vZGU7XG5cbiAgY29uc3QgbmV3Tm9kZSA9IGNyZWF0ZU5vZGUodmFsdWUpO1xuICBpZiAoaXNOb2RlKG5vZGUpKSB7XG4gICAgbmV3Tm9kZS5jb21tZW50QmVmb3JlID0gbm9kZS5jb21tZW50QmVmb3JlO1xuICAgIG5ld05vZGUuY29tbWVudCA9IG5vZGUuY29tbWVudDtcbiAgICBuZXdOb2RlLnNwYWNlQmVmb3JlID0gbm9kZS5zcGFjZUJlZm9yZTtcbiAgfVxuICByZXR1cm4gbmV3Tm9kZTtcbn1cblxuLyoqXG4gKiBgeWFtbGAgYXR0YWNoZXMgYSBjb21tZW50IHRoYXQgZm9sbG93cyBhIGtleSBvbiBpdHMgbGluZSB0byB0aGUga2V5J3MgbWFwcGluZyBvciBzZXF1ZW5jZSB2YWx1ZSwgdG9nZXRoZXIgd2l0aCB0aGVcbiAqIGNvbW1lbnRzIGFib3ZlIHRoZSB2YWx1ZSdzIGZpcnN0IGVudHJ5LlxuICovXG5mdW5jdGlvbiBtb3ZlSW5saW5lQ29tbWVudFRvS2V5KHsga2V5LCB2YWx1ZSB9OiBQYWlyLCBzb3VyY2U6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWlzTm9kZShrZXkpIHx8ICFrZXkucmFuZ2UgfHwgIShpc01hcCh2YWx1ZSkgfHwgaXNTZXEodmFsdWUpKSB8fCAhdmFsdWUuY29tbWVudEJlZm9yZSB8fCAhdmFsdWUucmFuZ2UpIHJldHVybjtcbiAgLy8gVGhlIHZhbHVlJ3MgYW5jaG9yIGFuZCB0YWcgcHJlY2VkZSB0aGUgY29tbWVudCBvbiB0aGUga2V5J3MgbGluZS5cbiAgaWYgKCEvXlsgXFx0XSo6KD86WyBcXHRdK1shJl1cXFMqKSpbIFxcdF0rIy91LnRlc3Qoc291cmNlLnNsaWNlKGtleS5yYW5nZVsxXSwgdmFsdWUucmFuZ2VbMF0pKSkgcmV0dXJuO1xuXG4gIGNvbnN0IFtpbmxpbmVDb21tZW50LCAuLi5jb21tZW50TGluZXNdID0gdmFsdWUuY29tbWVudEJlZm9yZS5zcGxpdCgnXFxuJyk7XG4gIGtleS5jb21tZW50ID0gaW5saW5lQ29tbWVudDtcbiAgdmFsdWUuY29tbWVudEJlZm9yZSA9IGNvbW1lbnRMaW5lcy5sZW5ndGggPiAwID8gY29tbWVudExpbmVzLmpvaW4oJ1xcbicpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGB5YW1sYCBhdHRhY2hlcyB0aGUgY29tbWVudCBhYm92ZSB0aGUgZmlyc3QgZW50cnkgb2YgYSBuZXN0ZWQgY29sbGVjdGlvbiB0byB0aGUgY29sbGVjdGlvbiwgd2hlcmUgaXQgd291bGQgc3RheSB3aGVuXG4gKiB0aGF0IGVudHJ5IGlzIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIG1vdmVMZWFkaW5nQ29tbWVudFRvRmlyc3RJdGVtKG5vZGU6IFlBTUxNYXAgfCBZQU1MU2VxLCB0YXJnZXQ6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKCFub2RlLmNvbW1lbnRCZWZvcmUgfHwgIWlzTm9kZSh0YXJnZXQpKSByZXR1cm47XG4gIHRhcmdldC5jb21tZW50QmVmb3JlID0gdGFyZ2V0LmNvbW1lbnRCZWZvcmUgPyBgJHtub2RlLmNvbW1lbnRCZWZvcmV9XFxuJHt0YXJnZXQuY29tbWVudEJlZm9yZX1gIDogbm9kZS5jb21tZW50QmVmb3JlO1xuICBub2RlLmNvbW1lbnRCZWZvcmUgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGUodmFsdWU6IHVua25vd24pOiBOb2RlIHtcbiAgY29uc3QgY29udGVudHMgPSBwYXJzZURvY3VtZW50KGR1bXBZYW1sKHZhbHVlKSkuY29udGVudHM7XG4gIGlmICghaXNOb2RlKGNvbnRlbnRzKSkgdGhyb3cgbmV3IEVycm9yKGBqcy15YW1sIGR1bXBlZCBubyBZQU1MIG5vZGUgZm9yICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfS5gKTtcbiAgcmV0dXJuIGNvbnRlbnRzO1xufVxuXG5mdW5jdGlvbiBkdW1wWWFtbCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBqc1lhbWwuZHVtcCh2YWx1ZSwgeyBsaW5lV2lkdGg6IC0xIH0pO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBydW5uZXJTY2hlbWEgPSB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSk7XG5jb25zdCB3b3JrZmxvd1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgam9iczogei5yZWNvcmQoXG4gICAgei5zdHJpbmcoKSxcbiAgICB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ3J1bnMtb24nOiBydW5uZXJTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgc3RyYXRlZ3k6IHoub2JqZWN0KHsgbWF0cml4OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkgfSkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAubnVsbGFibGUoKVxuICApLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8ICFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSByZXR1cm47XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5jYXRjaCgoZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgZm9yIChjb25zdCB7IG5hbWU6IGZpbGVOYW1lIH0gb2YgZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiAvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkpIHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHdvcmtmbG93U2NoZW1hLnBhcnNlKHlhbWwubG9hZChhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpKSk7XG4gICAgZm9yIChjb25zdCBbam9iTmFtZSwgam9iXSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvdy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2I/LlsncnVucy1vbiddKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IGpvYlsncnVucy1vbiddO1xuICAgICAgaWYgKGlzU2VsZkhvc3RlZChydW5uZXIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG1hdGNoID0gdHlwZW9mIHJ1bm5lciA9PT0gJ3N0cmluZycgJiYgL15cXCRcXHtcXHtcXHMqbWF0cml4XFwuKFxcdyspXFxzKlxcfVxcfSQvdS5leGVjKHJ1bm5lcik7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzOiB1bmtub3duW10gPSBbXTtcbiAgICAgIGlmIChtYXRjaCAmJiBqb2Iuc3RyYXRlZ3kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV0hO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBqb2Iuc3RyYXRlZ3kubWF0cml4O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB6LmFycmF5KHoudW5rbm93bigpKS5zYWZlUGFyc2UobWF0cml4W2tleV0pO1xuICAgICAgICBpZiAodmFsdWVzLnN1Y2Nlc3MpIGNhbmRpZGF0ZXMucHVzaCguLi52YWx1ZXMuZGF0YSk7XG4gICAgICAgIGNvbnN0IGluY2x1ZGUgPSB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSkuc2FmZVBhcnNlKG1hdHJpeC5pbmNsdWRlKTtcbiAgICAgICAgaWYgKGluY2x1ZGUuc3VjY2VzcylcbiAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goLi4uaW5jbHVkZS5kYXRhLm1hcCgocm93KSA9PiByb3dba2V5XSkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJ1bm5lcik7XG4gICAgICB9XG4gICAgICBjb25zdCBhbGxvd2VkID1cbiAgICAgICAgY2FuZGlkYXRlcy5sZW5ndGggPiAwICYmXG4gICAgICAgIGNhbmRpZGF0ZXMuZXZlcnkoXG4gICAgICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgICAgIGlzU2VsZkhvc3RlZChjYW5kaWRhdGUpIHx8XG4gICAgICAgICAgICAoY29uZmlnLnJlcG9zaXRvcnk/LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWI6d2lsbGJvb3N0ZXIvY2hlZXJsaW5ncycgJiZcbiAgICAgICAgICAgICAgZmlsZU5hbWUgPT09ICdidWlsZC1kZXNrdG9wLWFwcHMueW1sJyAmJlxuICAgICAgICAgICAgICBqb2JOYW1lID09PSAnYnVpbGQnICYmXG4gICAgICAgICAgICAgIGNhbmRpZGF0ZSA9PT0gJ3dpbmRvd3MtbGF0ZXN0JylcbiAgICAgICAgKTtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7ZmlsZU5hbWV9OiBqb2JzLiR7am9iTmFtZX0ucnVucy1vbiBtdXN0IHNlbGVjdCBzZWxmLWhvc3RlZCBydW5uZXJzIGluIGEgcHJpdmF0ZSByZXBvc2l0b3J5LiBGaXggdGhlIHdvcmtmbG93IGJlZm9yZSBydW5uaW5nIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlbGZIb3N0ZWQocnVubmVyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhYmVscyA9IHJ1bm5lclNjaGVtYS5zYWZlUGFyc2UocnVubmVyKTtcbiAgaWYgKCFsYWJlbHMuc3VjY2VzcykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheShsYWJlbHMuZGF0YSkpIHJldHVybiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKTtcbiAgcmV0dXJuIGxhYmVscy5kYXRhID09PSAnc2VsZi1ob3N0ZWQnO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcnVuQWxsSW5Qb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTaGVsbENvbW1hbmRzIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGxQYXJzZXIuanMnO1xuaW1wb3J0IHsgZHVtcFlhbWxPdmVyIH0gZnJvbSAnLi4vdXRpbHMveWFtbFV0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyB9IGZyb20gJy4vd29ya2Zsb3dSdW5uZXJQb2xpY3kuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xuICBxdWV1ZT86ICdzaW5nbGUnIHwgJ21heCc7XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgJ2luaGVyaXQnO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgICAgLy8gTGV0IG1haW50YWluZXJzIHJlLXJ1biB0aGUgdGVzdHMgYnkgaGFuZC5cbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgLy8gTm9uZSBvZiB0aGVzZSBtYXkgYmUgbmFycm93ZWQganVzdCBiZWNhdXNlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IG5ldmVyIHB1c2hlczpcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHRoZSB0ZXN0IGpvYidzIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgY2FsbCB3aXRoIGNhbmNlbF9vdGhlcnM6IHRydWUgKHRoZSByZXVzYWJsZVxuICAgICAgLy8gdGVzdCB3b3JrZmxvdyBkZWNsYXJlcyBubyBwZXJtaXNzaW9ucyBvZiBpdHMgb3duLCBzbyBpdHMgam9icyBydW4gb24gdGhpcyB0b2tlbilcbiAgICAgIGFjdGlvbnM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgYHNlbWFudGljLXJlbGVhc2UgLS1kcnktcnVuYCwgd2hpY2ggZG9lcyBhIGBnaXQgcHVzaCAtLWRyeS1ydW5gIHRvIHZlcmlmeSB3cml0ZVxuICAgICAgLy8gYWNjZXNzIGFuZCBhYm9ydHMgd2l0aCBFR0lUTk9QRVJNSVNTSU9OIHdpdGhvdXQgaXRcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHBrZy1wcmVmbGlnaHQgUFIgZmlsZSBsaXN0aW5nXG4gICAgICAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3Rlc3QtcnVzdCc6IHtcbiAgICBuYW1lOiAnVGVzdCBSdXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC1ydXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gYHF1ZXVlOiBtYXhgIGhlcmUgdG9vICgjOTc0KTogR2l0SHViJ3MgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGNhbmNlbHMgYW4gYWxyZWFkeS1QRU5ESU5HXG4gICAgLy8gY2FsbGVyIHJ1biB3aGVuIGFub3RoZXIgb25lIHF1ZXVlcyDigJQgYmVmb3JlIGl0cyBqb2IgKGFuZCB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBvd25cbiAgICAvLyBqb2ItbGV2ZWwgYHF1ZXVlOiBtYXhgKSBldmVyIHN0YXJ0cyDigJQgc2lsZW50bHkgZHJvcHBpbmcgdGhhdCByZWxlYXNlIHRyaWdnZXIuXG4gICAgLy8gVGhlIGNhbGxlci1sZXZlbCBncm91cCBtdXN0IE5PVCByZXVzZSB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBqb2ItbGV2ZWwgZ3JvdXAgbmFtZVxuICAgIC8vIChgcmVsZWFzZS0ke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX1gKTogd29ya2Zsb3ctbGV2ZWwgYW5kIGpvYi1sZXZlbCBncm91cHMgc2hhcmUgb25lXG4gICAgLy8gcmVwb3NpdG9yeS13aWRlIG5hbWVzcGFjZSwgYW5kIGlkZW50aWNhbCBuYW1lcyBkZWFkbG9jayB0aGUgcnVuIChcIkNhbmNlbGluZyBzaW5jZSBhXG4gICAgLy8gZGVhZGxvY2sgZm9yIGNvbmN1cnJlbmN5IGdyb3VwIC4uLiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiAndG9wIGxldmVsIHdvcmtmbG93JyBhbmQgJzxqb2I+J1wiKS5cbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIHF1ZXVlOiAnbWF4JyxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbi8qKlxuICogUGFyc2VzIGEgYHVzZXM6YCB2YWx1ZSBjYWxsaW5nIG9uZSBvZiBXaWxsQm9vc3RlcidzIG93biByZXVzYWJsZSB3b3JrZmxvd3MgKG9yIHRoZVxuICogV2lsbEJvb3N0ZXJMYWIgc3luYyBtaXJyb3IpIGludG8gdGhlIHdvcmtmbG93IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBhbmQgZ2l0IHJlZi4gT25seSB0aG9zZVxuICogZm9sbG93IHRoZSBjb250cmFjdCB3YmZ5IGVuZm9yY2VzIOKAlCBjYWxsZXJzIG9mIGFub3RoZXIgb3JnYW5pemF0aW9uJ3Mgc2FtZS1uYW1lZCByZXBvc2l0b3J5IGFyZVxuICogbGVmdCBhbG9uZS4gR2l0SHViIHRyZWF0cyBvd25lci9yZXBvc2l0b3J5IG5hbWVzIGNhc2UtaW5zZW5zaXRpdmVseSwgc28gdGhlIGNvbXBhcmlzb24gZG9lc1xuICogdG9vLCB3aGlsZSB0aGUgd29ya2Zsb3cgcGF0aCBhbmQgcmVmIHN0YXkgY2FzZS1zZW5zaXRpdmUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoXG4gIHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogeyB3b3JrZmxvd05hbWU6IHN0cmluZzsgZXh0ZW5zaW9uOiBzdHJpbmc7IHJlZjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IC9eKFteL10rKVxcLyhbXi9dKylcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC8oW14vQF0rPylcXC4oeWE/bWwpQCguKykkL3UuZXhlYyh1c2VzID8/ICcnKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3duZXIgPSBtYXRjaFsxXSEudG9Mb3dlckNhc2UoKTtcbiAgaWYgKChvd25lciAhPT0gJ3dpbGxib29zdGVyJyAmJiBvd25lciAhPT0gJ3dpbGxib29zdGVybGFiJykgfHwgbWF0Y2hbMl0hLnRvTG93ZXJDYXNlKCkgIT09ICdyZXVzYWJsZS13b3JrZmxvd3MnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyB3b3JrZmxvd05hbWU6IG1hdGNoWzNdISwgZXh0ZW5zaW9uOiBtYXRjaFs0XSEsIHJlZjogbWF0Y2hbNV0hIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHtcbiAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgd29ya2Zsb3cgZ2VuZXJhdGlvbiBiZWNhdXNlIHJlcG9zaXRvcnkgdmlzaWJpbGl0eSBpcyB1bmtub3duLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJiAoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgYXdhaXQgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyhyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoKTtcbiAgfVxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2l0aCAuZ2l0aHViIG9yIC5naXRodWIvd29ya2Zsb3dzIHN5bWxpbmtlZCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCB3cml0ZVlhbWwncyBndWFyZHNcbiAgICAvLyBhbHJlYWR5IHJlZnVzZSB0aGUgd3JpdGVzLCBidXQgcmVhZGRpci9ybSBiZWxvdyB3b3VsZCBzdGlsbCBlbnVtZXJhdGUgYW5kIERFTEVURSBmaWxlc1xuICAgIC8vIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIHNvIHJlcXVpcmUgdGhlIGRpcmVjdG9yeSB0byByZXNvbHZlIGluc2lkZSBpdCBiZWZvcmUgYW55XG4gICAgLy8gdHJhdmVyc2FsLCBta2Rpciwgb3IgY2xlYW51cC5cbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgLy8gd2JmeSB3cml0ZXMgLnltbCB3b3JrZmxvd3MsIHNvIGVhY2gga2luZCBtYXBzIHRvIGl0cyAueW1sIGZpbGUuXG4gICAgY29uc3QgZmlsZU5hbWVzQnlLaW5kID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkgY29udGludWU7XG4gICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGVudHJ5Lm5hbWUuc2xpY2UoMCwgLScueW1sJy5sZW5ndGgpLCBlbnRyeS5uYW1lKTtcbiAgICB9XG4gICAgY29uc3QgbWFuZGF0b3J5S2luZHMgPSBbJ3Rlc3QnLCAnc2VtYW50aWMtcHInXTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCdyZWxlYXNlJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3Rlc3QtcnVzdCcpO1xuICAgIH1cbiAgICAvLyBBIHByZXZpb3VzIHJ1biBtYXkgaGF2ZSBtaXN0YWtlbiBhIGdpdGlnbm9yZWQgdGhpcmQtcGFydHkgY2hlY2tvdXQgZm9yIHJlcG9zaXRvcnkgUnVzdCBjb2RlLlxuICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBnZW5lcmF0ZWQtc3R5bGUgY2FsbGVyOiBhIHNhbWUtbmFtZWQgY3VzdG9tIHdvcmtmbG93IHdpdGggYW55IG90aGVyIGpvYiBzdGF5cy5cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHRlc3RSdXN0RmlsZU5hbWUgPSBmaWxlTmFtZXNCeUtpbmQuZ2V0KCd0ZXN0LXJ1c3QnKTtcbiAgICAgIGlmICh0ZXN0UnVzdEZpbGVOYW1lICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lLCAndGVzdC1ydXN0JykpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgndGVzdC1ydXN0Jyk7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjbG9zZUNvbW1lbnRGaWxlTmFtZSA9IGZpbGVOYW1lc0J5S2luZC5nZXQoJ2Nsb3NlLWNvbW1lbnQnKTtcbiAgICBpZiAoY2xvc2VDb21tZW50RmlsZU5hbWUgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsIGNsb3NlQ29tbWVudEZpbGVOYW1lLCAnY2xvc2UtY29tbWVudCcpKSB7XG4gICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCdjbG9zZS1jb21tZW50Jyk7XG4gICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGNsb3NlQ29tbWVudEZpbGVOYW1lKSk7XG4gICAgfVxuICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3diZnknKTtcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgbWFuZGF0b3J5S2luZHMpIHtcbiAgICAgIGlmICghZmlsZU5hbWVzQnlLaW5kLmhhcyhraW5kKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGtpbmQsIGAke2tpbmR9LnltbGApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmlsZU5hbWVzQnlLaW5kLmhhcygnc3luYycpKSB7XG4gICAgICAvLyBUaGUgc3luYyB3b3JrZmxvdydzIGdlbmVyYXRpb24gb3ducyB0aGUgZm9yY2Utc3luYyB3b3JrZmxvdywgc28gcHJvY2Vzc2luZyBpdCBhcyBhblxuICAgICAgLy8gaW5kZXBlbmRlbnQga2luZCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgd3JpdGVzIG9uIHRoZSBzYW1lIHBhdGguXG4gICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCdzeW5jLWZvcmNlJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFxuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBbLi4uZmlsZU5hbWVzQnlLaW5kXS5tYXAoXG4gICAgICAgIChba2luZCwgZmlsZU5hbWVdKSA9PlxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kIGFzIEtub3duS2luZCwgZmlsZU5hbWUpXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENhc2UtaW5zZW5zaXRpdmU6IEdpdEh1YiByZXBvc2l0b3J5IG5hbWVzIGFyZSwgYW5kIGEgcmVtb3RlIG1heSBzcGVsbCB0aGlzIG9uZSBhbnkgd2F5LiBHZXR0aW5nIGl0IHdyb25nXG4gIC8vIGxldHMgd2JmeSByZXdyaXRlIHRoZSByZXBvc2l0b3J5IHRoYXQgaG9zdHMgdGhlIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICByZXR1cm4gcmVwb3NpdG9yeT8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZXZlcnkgam9iIG9mIHRoZSB3b3JrZmxvdyBmaWxlIGNhbGxzIHRoZSBuYW1lZCBXaWxsQm9vc3RlciByZXVzYWJsZSB3b3JrZmxvdyAob3duZXJcbiAqIHJlc3RyaWN0ZWQgdmlhIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwpLiBVc2VkIHRvIGRlY2lkZSB3aGV0aGVyIHdiZnkgb3ducyBhIGZpbGUgZW5vdWdoIHRvXG4gKiBkZWxldGUgaXQ6IHVucGFyc2FibGUgZmlsZXMgYW5kIGZpbGVzIHdpdGggYW55IG90aGVyIGpvYiByZXR1cm4gZmFsc2Ug4oCUIGRlbGV0aW5nIGEgd2hvbGVcbiAqIHdvcmtmbG93IG9uIGEgbG9vc2UgbWF0Y2ggd291bGQgYmUgdG9vIGFnZ3Jlc3NpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCB3b3JrZmxvd05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKCcueW1sJykpIHJldHVybiBmYWxzZTtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBpc1RhcmdldENhbGwgPSAodXNlczogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgICB0eXBlb2YgdXNlcyA9PT0gJ3N0cmluZycgJiYgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSB3b3JrZmxvd05hbWU7XG4gIHRyeSB7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGpvYnMgPSBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpO1xuICAgICAgcmV0dXJuIGpvYnMubGVuZ3RoID4gMCAmJiBqb2JzLmV2ZXJ5KChqb2IpID0+IGlzVGFyZ2V0Q2FsbChqb2I/LnVzZXMpKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIFVucGFyc2FibGUgY29udGVudCBpcyBub3QgcHJvdmFibHkgYSBjYWxsZXIgb2YgdGhlIG5hbWVkIHdvcmtmbG93LlxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgd29ya2Zsb3dzUGF0aDogc3RyaW5nLFxuICBraW5kOiBLbm93bktpbmQsXG4gIGZpbGVOYW1lID0gYCR7a2luZH0ueW1sYFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKVxuICAgID8gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCdcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBBIG5vbi1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbCBpbiBhIHJlcG8gd2l0aG91dCBSdXN0IGNvZGUgbWVyZWx5IHNoYXJlcyB0aGUgbmFtZTsgbGVhdmUgaXQgYWxvbmUuXG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0JyAmJiBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFdvcmtmbG93O1xuICAgIHRyeSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHdvcmtmbG93IHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlIHRlbXBsYXRlXG4gICAgICAvLyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcmVwb3NpdG9yeSdzIHdvcmtmbG93LlxuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgWUFNTC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8geWFtbC5sb2FkIHJldHVybnMgdW5kZWZpbmVkIGZvciBlbXB0eS9jb21tZW50LW9ubHkgZmlsZXMgYW5kIG5vbi1vYmplY3RzIGZvciBzY2FsYXJcbiAgICAvLyBkb2N1bWVudHMgd2l0aG91dCB0aHJvd2luZzsgZGVlcG1lcmdlIHdvdWxkIGNyYXNoIG9uIHRoZW0uXG4gICAgaWYgKHR5cGVvZiBvbGRTZXR0aW5ncyAhPT0gJ29iamVjdCcgfHwgb2xkU2V0dGluZ3MgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IGEgd29ya2Zsb3cuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nSm9iID0gb2xkU2V0dGluZ3Muam9icz8uW2tpbmRdO1xuICAgIGlmIChuZXdTZXR0aW5ncy5qb2JzPy5ba2luZF0/LnVzZXMgJiYgZXhpc3RpbmdKb2IgJiYgIXBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoZXhpc3RpbmdKb2IudXNlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfVxuXG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICAvLyBVbmxpa2UgdGhlIHJlbGVhc2UgY2FsbGVyLCB0aGUgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGlzIGludGVudGlvbmFsIGhlcmU6IGEgcGVuZGluZ1xuICAgICAgLy8gZGVwbG95IHRoYXQgaXMgY2FuY2VsbGVkIGFuZCByZXBsYWNlZCBieSBhIG5ld2VyIG9uZSBsb3NlcyBub3RoaW5nIOKAlCB0aGUgbmV3ZXIgZGVwbG95XG4gICAgICAvLyBjb252ZXJnZXMgdGhlIGVudmlyb25tZW50IHRvIHRoZSBsYXRlc3Qgc3RhdGUgYW55d2F5LlxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZSkge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWU7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgZW1wdHkgam9icyAoYSBiYXJlIGBqb2JOYW1lOmAgcGFyc2VzIGFzIG51bGwpLCBub24tcmV1c2FibGUgd29ya2Zsb3dzLCBhbmQgb3RoZXJcbiAgICAvLyBvcmdhbml6YXRpb25zJyByZXVzYWJsZSB3b3JrZmxvd3M6IGEgc2FtZS1uYW1lZCBgcmV1c2FibGUtd29ya2Zsb3dzYCByZXBvc2l0b3J5IGVsc2V3aGVyZVxuICAgIC8vIGZvbGxvd3MgYSBkaWZmZXJlbnQgY29udHJhY3QsIGFuZCBub3JtYWxpemluZyBpdHMgY2FsbGVycyAoc2VjcmV0IGluamVjdGlvbi9yZW1vdmFsLFxuICAgIC8vIHBlcm1pc3Npb25zKSBjb3VsZCBicmVhayB0aGVtLlxuICAgIGlmICgham9iIHx8ICFwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICAvLyBEZXBsb3kgY2FsbGVycyBuZWVkIG5vIHJlcG9zaXRvcnkgd3JpdGVzOiB0aGUgY2FsbGVkIHJldXNhYmxlIHdvcmtmbG93IGluaGVyaXRzIHRoZSBjYWxsZXInc1xuICAvLyB0b2tlbiBwZXJtaXNzaW9ucywgcmVwb3NpdG9yaWVzIGRlZmF1bHQgdGhlIHRva2VuIHRvIHdyaXRlLCBhbmQgdGhlIHJldXNhYmxlIGRlcGxveSB3b3JrZmxvd1xuICAvLyBhdCBtYWluIHBlcmZvcm1zIG5vIEdJVEhVQl9UT0tFTiB3cml0ZXMuIFRoZSByZWFkLW9ubHkgZGVmYXVsdCBpcyBpbmplY3RlZCBhdCB0aGUgSk9CIGxldmVsXG4gIC8vIChqb2IgcGVybWlzc2lvbnMgZG8gbm90IGFmZmVjdCBzaWJsaW5nIGpvYnMsIHNvIGlubGluZSBqb2JzIG9yIHBpbm5lZCBjYWxsZWVzIOKAlCB3aG9zZSB3cml0ZVxuICAvLyBuZWVkcyBhcmUgdW5hdWRpdGVkIOKAlCBrZWVwIHRoZWlycyksIGFuZCBvbmx5IHdoZW4gbmVpdGhlciB0aGUgd29ya2Zsb3cgbm9yIHRoZSBqb2IgZGVjbGFyZXNcbiAgLy8gaXRzIG93biBwZXJtaXNzaW9ucyAoT0lEQyBkZXBsb3lzIGFsd2F5cyBkbywgZm9yIGlkLXRva2VuKS4gcnVuLXNjcmlwdCBjYWxsZXJzIGFyZSBleGNsdWRlZFxuICAvLyBiZWNhdXNlIGFyYml0cmFyeSBwYWNrYWdlIHNjcmlwdHMgbWF5IHB1c2ggY29tbWl0cy5cbiAgaWYgKCFuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAgIGlmICgham9iKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgICAgIGlmICgham9iLnBlcm1pc3Npb25zICYmIGNhbGw/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveScgJiYgY2FsbC5yZWYgPT09ICdtYWluJykge1xuICAgICAgICBqb2IucGVybWlzc2lvbnMgPSB7IGNvbnRlbnRzOiAncmVhZCcgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOlxuICAgIGNhc2UgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93IGJhc2VkIG9uIHRoZSBzeW5jIHdvcmtmbG93IGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbi8vIHdiJ3MgZ2xvYmFsIG9wdGlvbnMgdGhhdCBjb25zdW1lIGEgZm9sbG93aW5nIHZhbHVlIHRva2VuIChmcm9tIHNoYXJlZE9wdGlvbnNCdWlsZGVyIHBsdXNcbi8vIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpOyBldmVyeSBvdGhlciBgLWAtcHJlZml4ZWQgdG9rZW4gYmVmb3JlIHRoZSBzdWJjb21tYW5kIGlzIGEgYm9vbGVhbi5cbmNvbnN0IHdiR2xvYmFsVmFsdWVPcHRpb25zID0gbmV3IFNldChbJy0td29ya2luZy1kaXInLCAnLXcnLCAnLS1lbnYnLCAnLS1jYXNjYWRlLWVudiddKTtcblxuLy8gU3ViY29tbWFuZHMgdGhhdCBydW4gYSBCSU5BUlkgKHNvIHRoZSBmb2xsb3dpbmcgdG9rZW4gY2FuIGJlIHRoZSB3YiBleGVjdXRhYmxlKSwgcGVyIHJ1bm5lcjogYnVuXG4vLyByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGEgcGFja2FnZSBzY3JpcHQgb2YgdGhhdCBuYW1lKSwgbnBtIGhhcyBgZXhlY2AvYHhgLFxuLy8gYW5kIHBucG0veWFybiAoQmVycnkpIGhhdmUgYGV4ZWNgL2BkbHhgLlxuY29uc3QgcnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSB7XG4gIG5wbTogbmV3IFNldChbJ2V4ZWMnLCAneCddKSxcbiAgcG5wbTogbmV3IFNldChbJ2V4ZWMnLCAnZGx4J10pLFxuICB5YXJuOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIGJ1bjogbmV3IFNldChbJ3gnXSksXG59O1xuXG4vLyBSdW5uZXIgb3B0aW9ucyB0aGF0IGNvbnN1bWUgdGhlIEZPTExPV0lORyB0b2tlbiBhcyB0aGVpciB2YWx1ZSwgc28gaXQgaXMgbm90IHRoZSB3YiBleGVjdXRhYmxlXG4vLyAoZS5nLiBgYnVuIC0tY3dkIGRpciB3YiBkZXBsb3lgLCBgbnB4IC1wIHBrZyB3YiBkZXBsb3lgKS4gQSBjb25zZXJ2YXRpdmUgc3VwZXJzZXQgYWNyb3NzXG4vLyBucG0vcG5wbS95YXJuL2J1biBhbmQgdGhlIG5weC9idW54IHBhY2thZ2UgZXhlY3V0b3JzLlxuY29uc3QgcnVubmVyVmFsdWVPcHRpb25zID0gbmV3IFNldChbXG4gICctLWN3ZCcsXG4gICctQycsXG4gICctLXByZWZpeCcsXG4gICctLWZpbHRlcicsXG4gICctRicsXG4gICctLXdvcmtzcGFjZScsXG4gICctdycsXG4gICctLWRpcicsXG4gICctcCcsXG4gICctLXBhY2thZ2UnLFxuICAnLWMnLFxuICAnLS1jYWxsJyxcbl0pO1xuXG4vKiogQWR2YW5jZSBwYXN0IGEgcnVubmVyJ3Mgb3B0aW9ucywgY29uc3VtaW5nIGEgc2VwYXJhdGUgdmFsdWUgdG9rZW4gd2hlcmUgb25lIGFwcGxpZXMuICovXG5mdW5jdGlvbiBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnM6IHN0cmluZ1tdLCBzdGFydEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBzdGFydEluZGV4O1xuICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb25zdCBvcHRpb24gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCFvcHRpb24uaW5jbHVkZXMoJz0nKSAmJiBydW5uZXJWYWx1ZU9wdGlvbnMuaGFzKG9wdGlvbikgJiYgaW5kZXggPCB0b2tlbnMubGVuZ3RoKSBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVwbG95IHNjcmlwdCBpbnZva2VzIGB3YiDigKYgZGVwbG95YCBhdCBjb21tYW5kIHBvc2l0aW9uLiBQYWNrYWdlIHJ1bm5lcnMgYW5kIGdsb2JhbCB5YXJncyBvcHRpb25zXG4gKiAod2l0aCB0aGVpciB2YWx1ZSB0b2tlbnMpIG1heSBwcmVjZWRlIHRoZSBkZXBsb3kgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQ6IHN0cmluZywgc2NyaXB0TmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0b2tlbnMgb2YgcGFyc2VTaGVsbENvbW1hbmRzKGRlcGxveVNjcmlwdCkgPz8gW10pIHtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIC8vIExlYWRpbmcgbGF1bmNoZXJzIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBlbnZgICh3aXRoIG9wdGlvbnMgKyBLRVk9dmFsdWUgYXNzaWdubWVudHMpXG4gICAgLy8gYW5kIHRoZSBQT1NJWCBgY29tbWFuZGAgYnVpbHRpbiAod2l0aCBpdHMgYC1wYC9gLXZgL2AtVmAgb3B0aW9ucykuIFRoZSBncmFtbWFyIHBhcnNlcyB0aGVcbiAgICAvLyBgdGltZWAga2V5d29yZCBhcyBhIHdyYXBwZXIsIHNvIGB0aW1lIHdiIGRlcGxveWAgYWxyZWFkeSB5aWVsZHMgYHdiYCBmaXJzdC4gT3RoZXIgbGF1bmNoZXJzXG4gICAgLy8gKGBleGVjYCwgYG5pY2VgLCDigKYpIGFyZSBOT1QgbW9kZWxlZDogdGhleSBsZWF2ZSBhIG5vbi1gd2JgIGZpcnN0IHRva2VuLCBzbyB0aGUgY29tbWFuZCBzaW1wbHlcbiAgICAvLyBkb2VzIG5vdCBtYXRjaC4gVGhpcyBpcyBhIGRlbGliZXJhdGUgZmFsc2UtbmVnYXRpdmUgZm9yIGdlbmVyYXRlZCBndWlkYW5jZS5cbiAgICBpZiAodG9rZW5zW2luZGV4XSA9PT0gJ2VudicpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgICAgaWYgKC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKj0vdS50ZXN0KHRva2VuKSkgaW5kZXgrKztcbiAgICAgICAgLy8gZW52J3MgZGlyZWN0b3J5IHZhbHVlIG1heSBiZSBzZXBhcmF0ZSBvciBhdHRhY2hlZCAoYC1DZGlyYCwgYC0tY2hkaXI9ZGlyYCkuIEl0IGNoYW5nZXNcbiAgICAgICAgLy8gd2hlcmUgd2IgcnVucyBidXQgbm90IHdoZXRoZXIgdGhlIGNvbW1hbmQgaW52b2tlcyB3YiBkZXBsb3kuXG4gICAgICAgIGVsc2UgaWYgKHRva2VuID09PSAnLUMnIHx8IHRva2VuID09PSAnLS1jaGRpcicpIGluZGV4ICs9IDI7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJy1DJykgfHwgdG9rZW4uc3RhcnRzV2l0aCgnLS1jaGRpcj0nKSkgaW5kZXgrKztcbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctdScpIGluZGV4ICs9IDI7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJy0nKSkgaW5kZXgrKztcbiAgICAgICAgZWxzZSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYGNvbW1hbmQgQ01EYCBleGVjdXRlcyBDTUQsIGJ1dCBgY29tbWFuZCAtdmAvYC1WIENNRGAgb25seSBRVUVSWSBpdHMgYXZhaWxhYmlsaXR5IHdpdGhvdXRcbiAgICAvLyBydW5uaW5nIGl0LCBzbyBhIGRlcGxveSBiZWhpbmQgdGhlbSBkb2VzIG5vdCBydW4uIFRoZSBgdmAvYFZgIGZsYWcgbWF5IGJlIGNsdXN0ZXJlZCB3aXRoXG4gICAgLy8gb3RoZXIgb3B0aW9uIGxldHRlcnMgKGBjb21tYW5kIC1wdiB3YmApLCBzbyBtYXRjaCBhbnkgb3B0aW9uIGxldHRlciBjbHVzdGVyIGNvbnRhaW5pbmcgaXQuXG4gICAgd2hpbGUgKHRva2Vuc1tpbmRleF0gPT09ICdjb21tYW5kJykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIGxldCBxdWVyaWVzT25seSA9IGZhbHNlO1xuICAgICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAodG9rZW5zW2luZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIGlmICgvXi1bQS1aYS16XSpbdlZdW0EtWmEtel0qJC91LnRlc3QodG9rZW5zW2luZGV4XSA/PyAnJykpIHF1ZXJpZXNPbmx5ID0gdHJ1ZTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChxdWVyaWVzT25seSkge1xuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4IDwgMCkgY29udGludWU7XG4gICAgLy8gUmVzb2x2ZSBhIHJ1bm5lciBwcmVmaXggdG8gd2hldGhlciB0aGUgZm9sbG93aW5nIHRva2VuIGlzIGEgQklOQVJZICh0aGUgd2IgZXhlY3V0YWJsZSkgb3IgYVxuICAgIC8vIHBhY2thZ2UgU0NSSVBUIG5hbWUuIGBidW54YC9gbnB4YCBhbmQgYDxwbT4geHxkbHh8ZXhlY2AgcnVuIGEgYmluYXJ5OyBgPHBtPiBydW58cnVuLXNjcmlwdGBcbiAgICAvLyAoYW5kIGJhcmUgYG5wbSA8bmFtZT5gLCBvciBhbnkgcnVubmVyIGZvbGxvd2VkIGJ5IGAtLWApIHJ1biBhIHBhY2thZ2Ugc2NyaXB0IOKAlCBzb1xuICAgIC8vIGBucG0gcnVuIHdiIGRlcGxveWAgZXhlY3V0ZXMgdGhlIHNjcmlwdCBuYW1lZCBgd2JgLCBub3QgdGhlIHdiIGJpbmFyeSwgYW5kIG11c3QgYmUgcmVqZWN0ZWQuXG4gICAgaWYgKFsnbnBtJywgJ3BucG0nLCAneWFybicsICdidW4nXS5pbmNsdWRlcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgY29uc3QgcnVubmVyID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGluZGV4ID0gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zLCBpbmRleCArIDEpO1xuICAgICAgY29uc3Qgc3ViY29tbWFuZCA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHN1YmNvbW1hbmQpKSBjb250aW51ZTsgLy8gcnVucyBhIHBhY2thZ2Ugc2NyaXB0LCBub3Qgd2JcbiAgICAgIC8vIEV4ZWN1dG9yIHN1YmNvbW1hbmRzIGFyZSBydW5uZXItU1BFQ0lGSUM6IGJ1biByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGFcbiAgICAgIC8vIHBhY2thZ2Ugc2NyaXB0IG5hbWVkIGRseC9leGVjKS4gUmVhbCBidWlsdC1pbiBleGVjdXRvcnMgKGBleGVjYC9geGAsIGFuZCBgZGx4YCBmb3IgcG5wbSlcbiAgICAgIC8vIHRha2UgcHJlY2VkZW5jZSBvdmVyIGEgc2FtZS1uYW1lZCBzY3JpcHQsIHNvIHRoZXkgYXJlIE5PVCBzaGFkb3ctY2hlY2tlZC4gT25seSBgeWFybiBkbHhgIGlzXG4gICAgICAvLyBhbWJpZ3VvdXMg4oCUIGEgQmVycnkgYnVpbHQtaW4gYnV0IGEgcGFja2FnZSBTQ1JJUFQgaW4gWWFybiBDbGFzc2ljIOKAlCBzbyBhIGRlY2xhcmVkIGBkbHhgXG4gICAgICAvLyBzY3JpcHQgbWFrZXMgYHlhcm4gZGx4YCBkZWNsaW5lIChmYWxsIHRocm91Z2ggdG8gdGhlIHBhY2thZ2Utc2NyaXB0IGNoZWNrcykuXG4gICAgICBjb25zdCBpc1lhcm5EbHhTaGFkb3dlZEJ5U2NyaXB0ID0gcnVubmVyID09PSAneWFybicgJiYgc3ViY29tbWFuZCA9PT0gJ2RseCcgJiYgc2NyaXB0TmFtZXMuaGFzKCdkbHgnKTtcbiAgICAgIGlmIChydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXJbcnVubmVyXT8uaGFzKHN1YmNvbW1hbmQpICYmICFpc1lhcm5EbHhTaGFkb3dlZEJ5U2NyaXB0KSB7XG4gICAgICAgIGluZGV4Kys7IC8vIGJpbmFyeSBydW5uZXIgKHBucG0gZGx4LCBidW4geCwgYG5wbSBleGVjIC0tIHdiIOKApmApXG4gICAgICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnLS0nKSBpbmRleCsrOyAvLyB0aGUgZXhlY3V0b3IncyBvcHRpb25hbCBgLS1gIGJlZm9yZSB0aGUgY29tbWFuZFxuICAgICAgfSBlbHNlIGlmIChydW5uZXIgPT09ICducG0nKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBiYXJlIGBucG0gd2JgIG5ldmVyIHJ1bnMgYSBiaW5hcnlcbiAgICAgIH0gZWxzZSBpZiAodG9rZW5zW2luZGV4XSA9PT0gJ3diJyAmJiBzY3JpcHROYW1lcy5oYXMoJ3diJykpIHtcbiAgICAgICAgLy8gQmFyZSBgYnVuL3BucG0veWFybiB3YmAgcnVucyBhIHBhY2thZ2UgU0NSSVBUIG5hbWVkIGB3YmAgd2hlbiBvbmUgZXhpc3RzIChwYXNzaW5nIGBkZXBsb3lgXG4gICAgICAgIC8vIGFzIGl0cyBhcmd1bWVudCksIG5vdCB0aGUgd2IgYmluYXJ5LlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFsnYnVueCcsICducHgnXS5pbmNsdWRlcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgfVxuICAgIGlmICh0b2tlbnNbaW5kZXhdICE9PSAnd2InKSBjb250aW51ZTtcbiAgICBjb25zdCB3YkFyZ3MgPSB0b2tlbnMuc2xpY2UoaW5kZXggKyAxKTtcbiAgICAvLyBTa2lwIGdsb2JhbCBvcHRpb25zIChhbmQgYW55IHZhbHVlIHRva2VuIGEgdmFsdWUtYmVhcmluZyBvcHRpb24gY29uc3VtZXMpIHNvIHRoZSBGSVJTVFxuICAgIC8vIGNvbW1hbmQgdG9rZW4gZGVjaWRlczogYHdiIC0tY2FzY2FkZS1lbnYgcHJvZHVjdGlvbiBkZXBsb3lgIGFuZCBgd2IgLXcgcGFja2FnZXMvYXBpIGRlcGxveWBcbiAgICAvLyBtYXRjaCwgd2hpbGUgc3ViY29tbWFuZHMgb3duaW5nIHRoZWlyIG93biBgZGVwbG95YCAoYHdiIHByaXNtYSBkZXBsb3lgLCBgd2IgcmV0cnkgZGVwbG95YClcbiAgICAvLyBkbyBub3QuIGAtLW9wdD12YWx1ZWAgY2FycmllcyBpdHMgdmFsdWUgaW5saW5lLCBzbyBvbmx5IHRoZSBzcGFjZS1zZXBhcmF0ZWQgZm9ybSBza2lwcyBvbmUuXG4gICAgbGV0IGNvbW1hbmRJbmRleCA9IDA7XG4gICAgd2hpbGUgKGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGggJiYgKHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgIGNvbnN0IGZsYWcgPSB3YkFyZ3NbY29tbWFuZEluZGV4XSA/PyAnJztcbiAgICAgIGNvbW1hbmRJbmRleCsrO1xuICAgICAgaWYgKHdiR2xvYmFsVmFsdWVPcHRpb25zLmhhcyhmbGFnKSAmJiBjb21tYW5kSW5kZXggPCB3YkFyZ3MubGVuZ3RoKSBjb21tYW5kSW5kZXgrKztcbiAgICB9XG4gICAgaWYgKHdiQXJnc1tjb21tYW5kSW5kZXhdICE9PSAnZGVwbG95JykgY29udGludWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHdvcmtmbG93cyBkaXJlY3RvcnkgaG9sZHMgYSBsaXZlIGNhbGxlciBvZiB0aGUgcmV1c2FibGUgQ2xvdWRmbGFyZSBkZXBsb3kgd29ya2Zsb3cuXG4gKiBZQU1MIGlzIHBhcnNlZCBhbmQgb25seSBgam9icy4qLnVzZXNgIHZhbHVlcyBhcmUgaW5zcGVjdGVkIChhIHJhdy10ZXh0IHNlYXJjaCB3b3VsZCBtYXRjaFxuICogY29tbWVudHMgb3IgYHJ1bjpgIHN0cmluZ3MpLCB3aXRoIGEgYGRlcGxveSpgLWZpbGVuYW1lIHNob3J0Y3V0IGFuZCBhIGNvbnNlcnZhdGl2ZSByYXctdGV4dFxuICogZmFsbGJhY2sgZm9yIHVucGFyc2VhYmxlIGZpbGVzLiBVc2VkIGJ5IHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBnZW5lcmF0b3Igc28gZ2VuZXJhdGVkIGd1aWRhbmNlXG4gKiBkZXNjcmliZXMgb25seSB3b3JrZmxvd3MgdGhhdCBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdyh3b3JrZmxvd3NEaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICB0cnkge1xuICAgIGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG93bmVyL3JlcG9zaXRvcnkgKEdpdEh1YiB0cmVhdHMgdGhlbSBzbyksIGNhc2Utc2Vuc2l0aXZlIHBhdGgvcmVmIOKAlCBtYXRjaGluZ1xuICAvLyBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsLCB1c2VkIGZvciB0aGUgdW5wYXJzZWFibGUtWUFNTCByYXctdGV4dCBmYWxsYmFjayBvbmx5LlxuICBjb25zdCBkZXBsb3lDYWxsUGF0dGVybiA9IC9bXi9dK1xcL3JldXNhYmxlLXdvcmtmbG93c1xcL1xcLmdpdGh1YlxcL3dvcmtmbG93c1xcL2RlcGxveVxcLnlhP21sQC9pdTtcbiAgY29uc3QgY2FsbHNEZXBsb3lXb3JrZmxvdyA9ICh1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JztcbiAgcmV0dXJuIGVudHJpZXMuc29tZSgoZW50cnkpID0+IHtcbiAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICEvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NEaXJQYXRoLCBlbnRyeS5uYW1lKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtmbG93ID0geWFtbC5sb2FkKGNvbnRlbnQpIGFzIFdvcmtmbG93IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icykuc29tZSgoam9iKSA9PiBjYWxsc0RlcGxveVdvcmtmbG93KGpvYj8udXNlcykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGRlcGxveUNhbGxQYXR0ZXJuLnRlc3QoY29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gVGhlIHJldXNhYmxlIHdvcmtmbG93cyB0aGF0IGRlY2xhcmUgRk5PWF9BR0VfS0VZIGFuZCBWRVJEQUNDSU9fVE9LRU4gdW5kZXJcbi8vIG9uLndvcmtmbG93X2NhbGwuc2VjcmV0cyAoc2VlIFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cykuIFBhc3NpbmcgZWl0aGVyIHNlY3JldCB0byBhbnlcbi8vIG90aGVyIGNhbGxlZSBpcyBhIEdpdEh1YiBlcnJvci5cbmNvbnN0IGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MgPSBuZXcgU2V0KFsnZGVwbG95JywgJ3JlbGVhc2UnLCAncnVuLXNjcmlwdCcsICd0ZXN0J10pO1xuY29uc3QgcmV1c2FibGVXb3JrZmxvd1Blcm1pc3Npb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgLy8gc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyByZWFkcyB3b3JrZmxvdyBydW5zOyBjYW5jZWxfb3RoZXJzIGlzIGZhbHNlLCBzbyByZWFkIGlzIGVub3VnaC5cbiAgJ3Rlc3QtcnVzdCc6IHsgYWN0aW9uczogJ3JlYWQnLCBjb250ZW50czogJ3JlYWQnIH0sXG4gICdzZW1hbnRpYy1wcic6IHsgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsIHN0YXR1c2VzOiAnd3JpdGUnIH0sXG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgLy8gYHNlY3JldHM6IGluaGVyaXRgIChwYXJzZWQgYnkganMteWFtbCBhcyBhIHBsYWluIHN0cmluZykgYWxyZWFkeSBmb3J3YXJkcyBldmVyeSBjYWxsZXIgc2VjcmV0XG4gIC8vIGluY2x1ZGluZyB0aGUgb25lcyBpbmplY3RlZCBiZWxvdywgc28gcHJlc2VydmUgaXQgdW50b3VjaGVkIOKAlCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvbiB0aGVcbiAgLy8gc3RyaW5nIHdvdWxkIHRocm93LiBDYXZlYXQ6IGBpbmhlcml0YCBmb3J3YXJkcyBzZWNyZXRzIHVuZGVyIHRoZWlyIGV4aXN0aW5nIE5BTUVTLCBzbyBpdCBjYW5cbiAgLy8gbmV2ZXIgZmVlZCBQVUJMSUNfRk5PWF9BR0VfS0VZIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWTsgYSBoYW5kLXdyaXR0ZW5cbiAgLy8gaW5oZXJpdCBjYWxsZXIgaW4gYSBQVUJMSUMgZm5veCByZXBvc2l0b3J5IG11c3QgYmUgY29udmVydGVkIHRvIGFuIGV4cGxpY2l0IG1hcHBpbmcgbWFudWFsbHlcbiAgLy8gKHdiZnkgbmV2ZXIgZ2VuZXJhdGVzIHRoZSBpbmhlcml0IGZvcm0sIGFuZCBoYW5kLXdyaXR0ZW4gZGV2aWF0aW9ucyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuICAvLyByZXBvc2l0b3J5IGJ5IHBvbGljeSkuXG4gIGNvbnN0IHNlY3JldHMgPSBqb2Iuc2VjcmV0cyA9PT0gJ2luaGVyaXQnID8gdW5kZWZpbmVkIDogKGpvYi5zZWNyZXRzID0gam9iLnNlY3JldHMgPz8ge30pO1xuXG4gIGlmIChzZWNyZXRzICYmIChraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3JlbGVhc2UnKSkge1xuICAgIHNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIC8vIGZub3gudG9tbCBjYXJyaWVzIGFnZS1lbmNyeXB0ZWQgYXBwIHNlY3JldHM7IENJIGRlY3J5cHRzIHRoZW0gd2l0aCB0aGUgRk5PWF9BR0VfS0VZIChvciwgZm9yXG4gIC8vIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG4gIC8vIEtleSB0aGUgaW5qZWN0aW9uIG9uIHRoZSAqY2FsbGVkKiByZXVzYWJsZSB3b3JrZmxvdywgbm90IHRoZSBjYWxsZXIncyBmaWxlbmFtZTogY2FsbGVycyBtYXkgaGF2ZVxuICAvLyBhcmJpdHJhcnkgbmFtZXMgKGUuZy4gc2NoZWR1bGVkIHJ1bi1zY3JpcHQgY2FsbGVycyksIGFuZCBHaXRIdWIgcmVqZWN0cyBwYXNzaW5nIGEgc2VjcmV0IHRoYXQgdGhlXG4gIC8vIGNhbGxlZSBkb2VzIG5vdCBkZWNsYXJlLlxuICAvLyBPbmx5IGFuIEBtYWluIGNhbGxlZSBpcyBrbm93biB0byBmb2xsb3cgdGhlIGN1cnJlbnQgc2VjcmV0IGNvbnRyYWN0OiBhIHdvcmtmbG93IHBpbm5lZCB0byBhblxuICAvLyBvbGRlciB0YWcgb3IgU0hBIG1heSBzdGlsbCBkZWNsYXJlIE5QTV9UT0tFTiAoYW5kIG5vdCBWRVJEQUNDSU9fVE9LRU4pLCBhbmQgR2l0SHViIHJlamVjdHMgYVxuICAvLyBjYWxsZXIgd2hvc2Ugc2VjcmV0cyBkbyBub3QgbWF0Y2ggdGhlIHNlbGVjdGVkIHJldmlzaW9uJ3MgZGVjbGFyYXRpb25zLCBzbyBwaW5uZWQgY2FsbGVycyBrZWVwXG4gIC8vIHRoZWlyIHNlY3JldHMgdW50b3VjaGVkLlxuICBjb25zdCBvcmdXb3JrZmxvd0NhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgY29uc3QgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA9IG9yZ1dvcmtmbG93Q2FsbD8ucmVmID09PSAnbWFpbicgPyBvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXF1aXJlZFBlcm1pc3Npb25zID0gY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA/IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uc1tjYWxsZWRSZXVzYWJsZVdvcmtmbG93XSA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlcXVpcmVkUGVybWlzc2lvbnMpIGpvYi5wZXJtaXNzaW9ucyA9IHsgLi4ucmVxdWlyZWRQZXJtaXNzaW9ucyB9O1xuICBpZiAoc2VjcmV0cyAmJiBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ID09PSAndGVzdCcpIHtcbiAgICAvLyBUaGUgY2FsbGVlJ3MgXCJUZXN0IGRlcGxveSBzY3JpcHRcIiBzdGVwIHJ1bnMgYHdiIGRlcGxveSAtLWRyeS1ydW5gLCB3aGljaCBwbGFucyB0aGUgUmFpbHdheSBJYUMuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJhaWx3YXknLCAncmFpbHdheS50cycpKSkge1xuICAgICAgc2VjcmV0cy5SQUlMV0FZX0FQSV9UT0tFTiA9ICcke3sgc2VjcmV0cy5SQUlMV0FZX0FQSV9UT0tFTiB9fSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBzZWNyZXRzLlJBSUxXQVlfQVBJX1RPS0VOO1xuICAgIH1cbiAgfVxuICBpZiAoc2VjcmV0cyAmJiBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ICYmIGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MuaGFzKGNhbGxlZFJldXNhYmxlV29ya2Zsb3cpKSB7XG4gICAgLy8gVGhlIGNhbGxlZSByb3V0ZXMgcHVibGljIChkZWZhdWx0LXJlZ2lzdHJ5KSBpbnN0YWxscyB0aHJvdWdoIHRoZSBUYWt1bWkgR3VhcmRcbiAgICAvLyBtYWxpY2lvdXMtcGFja2FnZS1ibG9ja2luZyBwcm94eSB3aGVuIHRoaXMgdG9rZW4gcmVzb2x2ZXM7IGFuIHVuc2V0IG9yZ2FuaXphdGlvbiBzZWNyZXRcbiAgICAvLyBleHBhbmRzIHRvICcnIGFuZCB0aGUgY2FsbGVlIHRyZWF0cyB0aGF0IGFzIFwiZmVhdHVyZSBvZmZcIiwgc28gcGFzc2luZyBpdCBpcyBhbHdheXMgc2FmZS5cbiAgICBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiA9ICcke3sgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nO1xuICAgIC8vIFRoZSBjYWxsZWUgZ2VuZXJhdGVzIHRoZSB3b3Jrc3BhY2UgLm5wbXJjIGZvciBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIGZyb20gVkVSREFDQ0lPX1RPS0VOXG4gICAgLy8gYmVmb3JlIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLiBPbmx5IHJlcG9zaXRvcmllcyB0aGF0IGFjdHVhbGx5IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlc1xuICAgIC8vIChvciBwdWJsaXNoIHRvIFZlcmRhY2NpbykgZ2V0IHRoZSBwYXNzLXRocm91Z2g6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgY3JlZGVudGlhbCB3b3VsZCBmbG93XG4gICAgLy8gaW50byBDSSBydW5zIHRoYXQgbmV2ZXIgdXNlIGl0LCBzbyB0aGUgbGluZSBpcyByZW1vdmVkIGluc3RlYWQuIFRoZSBHaXRIdWIgc2VjcmV0IGl0c2VsZiBpc1xuICAgIC8vIGFsd2F5cyByZWdpc3RlcmVkIG1hbnVhbGx5IGFuZCBzdGF5cyByZWdpc3RlcmVkIGVpdGhlciB3YXkuXG4gICAgaWYgKHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhjb25maWcpKSB7XG4gICAgICBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTiA9ICcke3sgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gfX0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU47XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gUHVibGljIHJlcG9zaXRvcmllcyBjb21taXQgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMsIHNvIHRoZXkgZGVjcnlwdCB3aXRoIGEgZGVkaWNhdGVkXG4gICAgICAvLyBDSSBpZGVudGl0eSAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCkgaW5zdGVhZCBvZiB0aGUgb3JnLWludGVybmFsXG4gICAgICAvLyBvbmU7IHRoZSBjYWxsZWUgc3RpbGwgcmVjZWl2ZXMgaXQgdW5kZXIgaXRzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSBuYW1lLiBXaGVuIG5vIENJXG4gICAgICAvLyBpZGVudGl0eSByZXNvbHZlcyAoc2VlIGZub3hBZ2VLZXlNYXBwaW5nKSwgbGVhdmUgYW55IGV4aXN0aW5nIG1hcHBpbmcgdW50b3VjaGVkIGFuZCBhZGRcbiAgICAgIC8vIG5vbmU6IGNyZWF0aW5nIG9yIHJld3JpdGluZyBvbmUgb24gaW5jb21wbGV0ZSBpbmZvcm1hdGlvbiB3b3VsZCBtYXAgYSBwb3NzaWJseS1wdWJsaWNcbiAgICAgIC8vIHJlcG9zaXRvcnkgdG8gdGhlIHdyb25nIGlkZW50aXR5LCBhbmQgYSBmbm94IHJlY2lwaWVudCBzeW5jIGZhaWx1cmUgZG9lcyBub3Qgc3RvcCB0aGlzXG4gICAgICAvLyBnZW5lcmF0b3IgZnJvbSB3cml0aW5nIGZpbGVzIOKAlCB0aGUgZmFpbGVkIHJ1bidzIHJlcnVuIGZpbGxzIHRoZSBtYXBwaW5nIGluLlxuICAgICAgY29uc3QgbWFwcGluZyA9IGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZyk7XG4gICAgICBpZiAobWFwcGluZykge1xuICAgICAgICBzZWNyZXRzLkZOT1hfQUdFX0tFWSA9IG1hcHBpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0Jykge1xuICAgIGNvbnN0IFtydXN0RGlyUGF0aF0gPSBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHM7XG4gICAgaWYgKHJ1c3REaXJQYXRoICYmIHJ1c3REaXJQYXRoICE9PSAnLicpIHtcbiAgICAgIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5ID0gcnVzdERpclBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9tIHRoZSBwYXJzZWQgY2FsbCBzbyBhIGRpZmZlcmVudGx5IGNhc2VkIG93bmVyIChHaXRIdWIgaXMgY2FzZS1pbnNlbnNpdGl2ZVxuICAvLyB0aGVyZSkgaXMgYWxzbyBub3JtYWxpemVkIHRvIHRoZSByZXBvc2l0b3J5J3Mgb3duIG9yZ2FuaXphdGlvbiAvIG1pcnJvci5cbiAgaWYgKG9yZ1dvcmtmbG93Q2FsbCAmJiBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzLyR7b3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZX0uJHtvcmdXb3JrZmxvd0NhbGwuZXh0ZW5zaW9ufUAke29yZ1dvcmtmbG93Q2FsbC5yZWZ9YDtcbiAgfSBlbHNlIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyTGFiL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgY29uc3QgYWNjZXB0c1J1bm5lcklucHV0ID0gWyd0ZXN0JywgJ3Rlc3QtcnVzdCcsICdkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoXG4gICAgb3JnV29ya2Zsb3dDYWxsPy53b3JrZmxvd05hbWUgPz8gJydcbiAgKTtcbiAgaWYgKGNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyAmJiBhY2NlcHRzUnVubmVySW5wdXQpIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgam9iLndpdGgucnVuc19vbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBsYWJlbHMgPSB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAudHJhbnNmb3JtKCh2YWx1ZSwgY3R4KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKSBhcyB1bmtub3duO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY3R4LmFkZElzc3VlKHsgY29kZTogJ2N1c3RvbScsIG1lc3NhZ2U6ICdFeHBlY3RlZCBKU09OIHJ1bm5lciBsYWJlbHMnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHouTkVWRVI7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAucGlwZSh6LmFycmF5KHouc3RyaW5nKCkpKVxuICAgICAgICAuc2FmZVBhcnNlKGpvYi53aXRoLnJ1bnNfb24pO1xuICAgICAgaWYgKGxhYmVscy5zdWNjZXNzICYmIGxhYmVscy5kYXRhLmluY2x1ZGVzKCdzZWxmLWhvc3RlZCcpKSB7XG4gICAgICAgIGpvYi53aXRoLnJ1bnNfb24gPSBKU09OLnN0cmluZ2lmeShsYWJlbHMuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlbW92ZWQgcnVuc19vbiBmcm9tICR7am9iLnVzZXN9OiBwcml2YXRlIHJlcG9zaXRvcmllcyByZXF1aXJlIGEgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXkuYCk7XG4gICAgICAgIGRlbGV0ZSBqb2Iud2l0aC5ydW5zX29uO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKHNlY3JldHMpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKHNlY3JldHMpO1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhlIHNlY3JldCBleHByZXNzaW9uIHRoZSBjYWxsZXIgbWFwcyBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVksIG9yIHVuZGVmaW5lZFxuICogd2hlbiB0aGUgcmVwb3NpdG9yeSBzdGF0ZSBkb2VzIG5vdCBpZGVudGlmeSBhIHVzYWJsZSBDSSBpZGVudGl0eSDigJQgYW4gdW5rbm93biB2aXNpYmlsaXR5LCBhXG4gKiByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycyAoZGVyaXZpbmcgZnJvbSB0aGUgc2FtZSBwcmluY2lwYWwgcm9zdGVyIGFzIHRoZSByZWNpcGllbnQgc3luY1xuICoga2VlcHMgdGhlIHR3byBmcm9tIGV2ZXIgZGlzYWdyZWVpbmcpLCBvciBhIGZhaWxlZCBmbm94IHJlY2lwaWVudCBzeW5jLCB3aG9zZSBjaXBoZXJ0ZXh0cyBtYXlcbiAqIHN0aWxsIHRhcmdldCB0aGUgcHJldmlvdXMgaWRlbnRpdHkuIFRoZSBjYWxsZXIgbXVzdCB0aGVuIHByZXNlcnZlIGFueSBleGlzdGluZyBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBmbm94QWdlS2V5TWFwcGluZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgaGFzRm5veFN5bmNGYWlsZWQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VjcmV0TmFtZSA9IHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKGNvbmZpZyk7XG4gIHJldHVybiBzZWNyZXROYW1lICYmIGBcXCR7eyBzZWNyZXRzLiR7c2VjcmV0TmFtZX0gfX1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgcGVybWlzc2lvbnMgb2JqZWN0IGVtcHRpZWQgYnkgdGhlIHBlci1raW5kIGRlbGV0aW9ucyAoZS5nLiBhbiBleGlzdGluZyB0ZXN0LXJ1c3QgY2FsbGVyXG4gIC8vIHdob3NlIG9ubHkgZW50cnkgd2FzIGBhY3Rpb25zYCkgbXVzdCBiZSBkcm9wcGVkIGVudGlyZWx5OiBgcGVybWlzc2lvbnM6IHt9YCBzdHJpcHMgRVZFUllcbiAgLy8gdG9rZW4gcGVybWlzc2lvbiBmcm9tIHRoZSB3b3JrZmxvdywgdW5saWtlIHRoZSBhYnNlbnQga2V5IHdoaWNoIGtlZXBzIHRoZSBkZWZhdWx0cy5cbiAgaWYgKG5ld1NldHRpbmdzLnBlcm1pc3Npb25zICYmIE9iamVjdC5rZXlzKG5ld1NldHRpbmdzLnBlcm1pc3Npb25zKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM7XG4gIH1cbiAgYXdhaXQgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKGZpbGVQYXRoLCBkdW1wWWFtbE92ZXIoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpLCBuZXdTZXR0aW5ncykpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFtcbiAgICAgIC4uLmRvY0ZpbGVzLm1hcCgoZmlsZSkgPT4gZml4RmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSksIGZpeFR5cG9zSW5UZXh0LCBwYWNrYWdlQ29uZmlnLCAnZG9jJykpLFxuICAgICAgLi4udHNGaWxlcy5tYXAoKGZpbGUpID0+IGZpeEZpbGUocGF0aC5qb2luKGRpclBhdGgsIGZpbGUpLCBmaXhUeXBvc0luQ29kZSwgcGFja2FnZUNvbmZpZywgJ3RzJykpLFxuICAgICAgLi4udGV4dEJhc2VkRmlsZXMubWFwKChmaWxlKSA9PiBmaXhGaWxlKHBhdGguam9pbihkaXJQYXRoLCBmaWxlKSwgZml4VHlwb3NJblRleHQsIHBhY2thZ2VDb25maWcsICd0ZXh0JykpLFxuICAgIF0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4RmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZml4VHlwb3M6IChjb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0J1xuKTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKGZpeFR5cG9zKGNvbnRlbnQpLCBwYWNrYWdlQ29uZmlnLCBwcm9wTmFtZSk7XG4gICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50XG4gICAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgICAvLyBUaGUgd29yZCBib3VuZGFyeSBhbmQgdHJhaWxpbmctd2hpdGVzcGFjZSBndWFyZCBrZWVwIHdvcmRzIG1lcmVseSBlbmRpbmcgaW4gdGhlXG4gICAgICAvLyBhYmJyZXZpYXRpb24gbGV0dGVycyAoZS5nLiBcImNvb2tpZS5cIiwgXCJsZWcuXCIpIGludGFjdC5cbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnJDEvLyQyY2YuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJlZ1xcLig/PVxcc3wkKS9nLCAnJDEvLyQyZS5nLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiaWVcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmkuZS4nKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgLy8gVGhlIGRvdCBtdXN0IGJlIGVzY2FwZWQ6IGFuIHVuZXNjYXBlZCBgLmAgbWF0Y2hlcyBBTlkgY2hhcmFjdGVyLCBzbyBgbGVnaXRgIGxvc3QgaXRzIGBsYCBhbmQgYGVgLlxuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC9cXC5naXQkL3UsICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICAvLyBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHNvIGNyZWRlbnRpYWwgc2VsZWN0aW9uIChhbmQgdGhlIGNhY2hlIGtleSkgbXVzdFxuICAvLyBub3QgZGVwZW5kIG9uIGhvdyBhIHJlbW90ZSBVUkwgaGFwcGVucyB0byBzcGVsbCB0aGUgb3JnYW5pemF0aW9uLlxuICBjb25zdCBrZXkgPSBvd25lcj8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG9uIHB1cnBvc2U6IGEgbm9uY2Fub25pY2FsbHkgY2FzZWQgcmVtb3RlIChlLmcuIGdpdGh1Yi5jb20vd2lsbGJvb3N0ZXJsYWIv4oCmKVxuICAvLyBtdXN0IHN0aWxsIHNlbGVjdCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIFBBVCDigJQgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIGJyYW5jaCB3b3VsZFxuICAvLyBwcmVmZXIgdGhlIE9USEVSIG9yZ2FuaXphdGlvbidzIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgdGhpcyBvcmdhbml6YXRpb24ncyBwcml2YXRlXG4gIC8vIHJlcG9zaXRvcmllcy5cbiAgY29uc3Qgbm9ybWFsaXplZE93bmVyID0gb3duZXI/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXJsYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IGFwcGx5RWRpdHMsIGNyZWF0ZVNjYW5uZXIsIGZpbmROb2RlQXRMb2NhdGlvbiwgbW9kaWZ5LCBwYXJzZSBhcyBwYXJzZUpzb25jLCBwYXJzZVRyZWUgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG4vLyBqc29uYy1wYXJzZXIgZGVjbGFyZXMgU3ludGF4S2luZC9TY2FuRXJyb3IgYXMgYW1iaWVudCBjb25zdCBlbnVtcywgd2hpY2ggY2Fubm90IGJlIGltcG9ydGVkXG4vLyB1bmRlciB2ZXJiYXRpbU1vZHVsZVN5bnRheDsgbWlycm9yIHRoZSBuZWVkZWQgbWVtYmVyIHZhbHVlcyBsb2NhbGx5LlxuY29uc3Qgc3ludGF4S2luZCA9IHsgbGluZUNvbW1lbnRUcml2aWE6IDEyLCBibG9ja0NvbW1lbnRUcml2aWE6IDEzLCBsaW5lQnJlYWtUcml2aWE6IDE0LCB0cml2aWE6IDE1LCBlb2Y6IDE3IH07XG5jb25zdCBzY2FuRXJyb3JOb25lID0gMDtcblxuZXhwb3J0IGNvbnN0IGpzb25jVXRpbCA9IHtcbiAgLyoqXG4gICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaG9sZHMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwg4oCUIG9ubHkgd2hpdGVzcGFjZSwgY29tcGxldGUgY29tbWVudHMsXG4gICAqIGFuZC9vciBhIEJPTS4gdHNjIHRyZWF0cyBzdWNoIGEgdHNjb25maWcuanNvbiBhcyBhbiBlbXB0eSBjb25maWcsIHNvIGdlbmVyYXRvcnMgc2hvdWxkIHRyZWF0XG4gICAqIGl0IGxpa2UgYSBtaXNzaW5nIGZpbGUgKGFuZCBnZW5lcmF0ZSBkZWZhdWx0cykgaW5zdGVhZCBvZiByZWZ1c2luZyB0byBtYW5hZ2UgaXQuIExleGljYWxseVxuICAgKiBicm9rZW4gdHJpdmlhIChlLmcuIGFuIHVudGVybWluYXRlZCBibG9jayBjb21tZW50KSBpcyBOT1QgdHJpdmlhLW9ubHk6IHRoZSBmaWxlIG11c3QgYmUgbGVmdFxuICAgKiB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gb3ZlcndyaXR0ZW4gd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGlzVHJpdmlhT25seShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgaWYgKFxuICAgICAgICAoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSB8fFxuICAgICAgICAoa2luZCAhPT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC50cml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmxpbmVCcmVha1RyaXZpYSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUGFyc2VzIGEgSlNPTkMgKEpTT04gd2l0aCBjb21tZW50cykgb2JqZWN0IGZyb20gY29uZmlnIGZpbGVzIHN1Y2ggYXMgdHNjb25maWcuanNvbixcbiAgICogcHlyaWdodGNvbmZpZy5qc29uLCByZW5vdmF0ZS5qc29uLCAudnNjb2RlL3NldHRpbmdzLmpzb24sIGFuZCB3cmFuZ2xlci5qc29uYy5cbiAgICpcbiAgICoganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCByZXR1cm5zIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCwgd2hpY2ggbXVzdFxuICAgKiBub3QgYmUgdHJlYXRlZCBhcyB0aGUgZmlsZSdzIGNvbmZpZ3VyYXRpb247IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IgaW5zdGVhZC4gQSBsZWFkaW5nIEJPTSBpc1xuICAgKiBzdHJpcHBlZCBiZWNhdXNlIFR5cGVTY3JpcHQgYWNjZXB0cyBCT00nZCBjb25maWcgZmlsZXMgd2hpbGUganNvbmMtcGFyc2VyIHJlcG9ydHMgdGhlIEJPTSBhc1xuICAgKiBhIHBhcnNlIGVycm9yLiBDYWxsZXJzIHdob3NlIHJlYWRlciByZWplY3RzIHRyYWlsaW5nIGNvbW1hcyB0dXJuIGBhbGxvd1RyYWlsaW5nQ29tbWFgXG4gICAqIG9mZiBzbyBzdWNoIGEgZmlsZSBpcyByZXBvcnRlZCBhcyBtYWxmb3JtZWQgaGVyZSB0b28uXG4gICAqL1xuICBwYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VCBleHRlbmRzIG9iamVjdD4oY29udGVudDogc3RyaW5nLCBhbGxvd1RyYWlsaW5nQ29tbWEgPSB0cnVlKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VKc29uYyhjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpLCBwYXJzZUVycm9ycywgeyBhbGxvd1RyYWlsaW5nQ29tbWEgfSkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBjYXJyaWVzIGF0IGxlYXN0IG9uZSBjb21tZW50LCBpLmUuIGNvbnRlbnQgSlNPTi5zdHJpbmdpZnkgd291bGQgZHJvcC4gKi9cbiAgY29udGFpbnNDb21tZW50KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICAvLyBBIGxleGljYWwgZXJyb3IgbWVhbnMgdGhlIHJlbWFpbmluZyB0b2tlbnMgYXJlIHVucmVsaWFibGU7IHJlcG9ydCBubyBjb21tZW50IHJhdGhlciB0aGFuXG4gICAgICAvLyBndWVzc2luZy4gQSBjYWxsZXIgdGhhdCBvbmx5IHdhcm5zIGFib3V0IGRyb3BwZWQgY29tbWVudHMgbG9zZXMgbm90aGluZywgYW5kIG9uZSB0aGF0XG4gICAgICAvLyByZWZ1c2VzIGEgY29tbWVudGVkIGZpbGUgZm9yIGEgc3RyaWN0LUpTT04gcmVhZGVyIHN0aWxsIHJlamVjdHMgc3VjaCBjb250ZW50IHdoZW4gaXRcbiAgICAgIC8vIHBhcnNlcyBpdC5cbiAgICAgIGlmICgoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGtpbmQgPT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgfHwga2luZCA9PT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGBzZXR0aW5nc2AgaW50byBgb2xkQ29udGVudGAsIGVkaXRpbmcgb25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzXG4gICAqIGNoYW5nZWQgc28gdGhlIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIG9mIGFuIGV4aXN0aW5nIGZpbGUgc3Vydml2ZS4gQ2FsbGVycyBuZXZlciBkcm9wXG4gICAqIHByb3BlcnRpZXMgKGdlbmVyYXRlZCBzZXR0aW5ncyBhcmUgbWVyZ2VkIE9OIFRPUCBvZiB0aGUgZXhpc3Rpbmcgb25lcyksIHNvIHJlbW92YWxzIGFyZSBub3RcbiAgICogaGFuZGxlZDogYSBwcm9wZXJ0eSBtaXNzaW5nIGZyb20gYHNldHRpbmdzYCBpcyBsZWZ0IHVudG91Y2hlZCByYXRoZXIgdGhhbiBkZWxldGVkLlxuICAgKlxuICAgKiBUcml2aWEtb25seSBjb250ZW50IGtlZXBzIGl0cyBjb21tZW50cyBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW5cbiAgICogYmVpbmcgcmVwbGFjZWQgb3V0cmlnaHQgb3IgcnVuIHRocm91Z2ggbW9kaWZ5KCkgKHdoaWNoIHdvdWxkIG1vdmUgdGhlIG9iamVjdCBpbiBmcm9udCBvZiB0aGVtKS5cbiAgICovXG4gIHN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgb2xkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB7IGNvbnRlbnQ6IHN0cmluZzsga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSB9IHtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSwga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2xkQ29udGVudCk7XG4gICAgLy8gRHJvcCBhIGxlYWRpbmcgQk9NOiBtb2RpZnkoKSBpbnNlcnRzIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IEJFRk9SRSBhbnkgbGVhZGluZyB0cml2aWEsIHdoaWNoXG4gICAgLy8gd291bGQgbGVhdmUgdGhlIEJPTSBzdHJhbmRlZCBtaWQtZmlsZSB3aGVyZSBpdCBpcyBhIHN5bnRheCBlcnJvciByYXRoZXIgdGhhbiBhbiBpZ25vcmVkIG1hcmsuXG4gICAgbGV0IGNvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpO1xuICAgIGlmIChqc29uY1V0aWwuaXNUcml2aWFPbmx5KGNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBjb250ZW50LnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IGAke2hlYWRlciA/IGhlYWRlciArICdcXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKX1gLFxuICAgICAgICBrZXlzTG9zaW5nQ29tbWVudHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbW9kaWZ5T3B0aW9ucyA9IHsgZm9ybWF0dGluZ09wdGlvbnM6IGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQpIH07XG4gICAgY29uc3Qga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5ld0VudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncykpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkU2V0dGluZ3M/LltrZXldO1xuICAgICAgLy8gQ29tcGFyZSBzZXJpYWxpemVkIGZvcm1zIHNvIGRlZXAtZXF1YWwgdmFsdWVzIChlLmcuIGEgcmUtbWVyZ2VkIGBleHRlbmRzYCBhcnJheSkgZG8gbm90XG4gICAgICAvLyByZXdyaXRlIHRoZSBwcm9wZXJ0eSBhbmQgcmVmbG93IGl0cyBmb3JtYXR0aW5nLlxuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2luZyBhIHdob2xlIGFycmF5IHdvdWxkIGRpc2NhcmQgdGhlIGNvbW1lbnRzIGJldHdlZW4gaXRzIGVsZW1lbnRzLCBzbyBncm93IGl0IHdpdGhcbiAgICAgIC8vIHBlci1lbGVtZW50IGluc2VydGlvbnMgd2hlbmV2ZXIgdGhlIG5ldyB2YWx1ZSBvbmx5IGFkZHMgdG8gaXQuXG4gICAgICBjb25zdCBpbnNlcnRpb25zID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZSwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBpbnNlcnRpb24gb2YgaW5zZXJ0aW9ucyA/PyBbXSkge1xuICAgICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIG1vZGlmeShjb250ZW50LCBba2V5LCBpbnNlcnRpb24uaW5kZXhdLCBpbnNlcnRpb24udmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgaXNBcnJheUluc2VydGlvbjogdHJ1ZSB9KVxuICAgICAgICApO1xuICAgICAgICBjb250ZW50ID0gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50LCBrZXksIGluc2VydGlvbi5pbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zZXJ0aW9ucykgY29udGludWU7XG4gICAgICAvLyBSZXdyaXRpbmcgdGhlIHdob2xlIHZhbHVlIGlzIHRoZSBvbmx5IG9wdGlvbiBsZWZ0ICh0aGUgbmV3IG9uZSBkcm9wcyBvciByZW9yZGVycyBlbGVtZW50cyksXG4gICAgICAvLyBhbmQgaXQgdGFrZXMgYW55IGNvbW1lbnQgbmVzdGVkIGluc2lkZSBpdCBhbG9uZy4gUmVwb3J0IHRoYXQgcmF0aGVyIHRoYW4gbG9zaW5nIGl0IHF1aWV0bHkuXG4gICAgICBjb25zdCByZXBsYWNlZFRleHQgPSB2YWx1ZVRleHRPZihjb250ZW50LCBrZXkpO1xuICAgICAgaWYgKHJlcGxhY2VkVGV4dCAhPT0gdW5kZWZpbmVkICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQocmVwbGFjZWRUZXh0KSkga2V5c0xvc2luZ0NvbW1lbnRzLnB1c2goa2V5KTtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIG1vZGlmeU9wdGlvbnMpKTtcbiAgICB9XG4gICAgLy8gUHJlcGVuZCByYXRoZXIgdGhhbiBhcHBlbmQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmV3OiBhcHBlbmRpbmcgZGV0YWNoZXMgYSB0cmFpbGluZ1xuICAgIC8vIHNhbWUtbGluZSBjb21tZW50IGZyb20gdGhlIGxhc3QgcHJvcGVydHksIGxlYXZpbmcgaXQgdG8gZGVzY3JpYmUgdGhlIGdlbmVyYXRlZCB2YWx1ZVxuICAgIC8vIGluc3RlYWQuIEluc2VydGluZyBpbiByZXZlcnNlIGtlZXBzIHRoZSBvcmRlciB0aGUgc2V0dGluZ3MgZGVjbGFyZSB0aGVtIGluLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMudG9SZXZlcnNlZCgpKSB7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGdldEluc2VydGlvbkluZGV4OiAoKSA9PiAwIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH07XG4gIH0sXG59O1xuXG4vKiogUmV0dXJucyB0aGUgc291cmNlIHRleHQgb2YgYSB0b3AtbGV2ZWwgcHJvcGVydHkncyB2YWx1ZSwgY29tbWVudHMgYW5kIGFsbC4gKi9cbmZ1bmN0aW9uIHZhbHVlVGV4dE9mKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBub2RlID0gcm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pO1xuICByZXR1cm4gbm9kZSAmJiBjb250ZW50LnNsaWNlKG5vZGUub2Zmc2V0LCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoKTtcbn1cblxuLy8gVGhlIHdob2xlIHNhbWUtbGluZSBjb21tZW50IHNlcXVlbmNlLCBub3QganVzdCB0aGUgZmlyc3Qgb25lOiBhIGxpbmUgY29tbWVudCBlbmRzIGl0IChpdCBydW5zIHRvXG4vLyB0aGUgbmV3bGluZSksIGJ1dCBhbnkgbnVtYmVyIG9mIGJsb2NrIGNvbW1lbnRzIGNhbiBwcmVjZWRlIGl0LCBhbmQgbW92aW5nIG9ubHkgdGhlIGZpcnN0IHdvdWxkXG4vLyBsZWF2ZSB0aGUgcmVzdCBkZXNjcmliaW5nIHRoZSB3cm9uZyBlbGVtZW50LlxuY29uc3QgdHJhaWxpbmdDb21tZW50UGF0dGVybiA9IC9eKD86W15cXFNcXG5dKlxcL1xcKltcXFNcXHNdKj9cXCpcXC8pKig/OlteXFxTXFxuXSpcXC9cXC9bXlxcbl0qKT8vdTtcblxuLyoqXG4gKiBSZWF0dGFjaGVzIGEgc2FtZS1saW5lIGNvbW1lbnQgdG8gdGhlIGVsZW1lbnQgaXQgZGVzY3JpYmVzLiBJbnNlcnRpbmcgaW50byBhbiBhcnJheSBwbGFjZXMgdGhlXG4gKiBuZXcgZWxlbWVudCBCRUZPUkUgdGhlIHRyaXZpYSB0aGF0IGZvbGxvd3MgaXRzIHByZWRlY2Vzc29yLCBzbyBhcHBlbmRpbmcgYWZ0ZXJcbiAqIGB7IC4uLiB9IC8vIHdoeSB0aGlzIHJ1bGUgZXhpc3RzYCBsZWF2ZXMgdGhhdCBjb21tZW50IGV4cGxhaW5pbmcgdGhlIGdlbmVyYXRlZCBlbGVtZW50IGluc3RlYWQuXG4gKiBBIGZyZXNobHkgc2VyaWFsaXplZCBlbGVtZW50IG5ldmVyIGNhcnJpZXMgYSBjb21tZW50IG9mIGl0cyBvd24sIHNvIGFueXRoaW5nIHRyYWlsaW5nIHRoZVxuICogaW5zZXJ0aW9uIGJlbG9uZ2VkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBpbnNlcnRlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaW5zZXJ0ZWRJbmRleCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IGVsZW1lbnRzID0gKHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKSk/LmNoaWxkcmVuO1xuICBjb25zdCBpbnNlcnRlZCA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleF07XG4gIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4IC0gMV07XG4gIGlmICghaW5zZXJ0ZWQgfHwgIXByZXZpb3VzKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5zZXJ0ZWRFbmQgPSBpbnNlcnRlZC5vZmZzZXQgKyBpbnNlcnRlZC5sZW5ndGg7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuLmV4ZWMoY29udGVudC5zbGljZShpbnNlcnRlZEVuZCkpPy5bMF07XG4gIGlmICghY29tbWVudCkgcmV0dXJuIGNvbnRlbnQ7XG4gIC8vIExhbmQgdGhlIGNvbW1lbnQgYWZ0ZXIgdGhlIHNlcGFyYXRpbmcgY29tbWEgc28gdGhlIGVsZW1lbnQga2VlcHMgaXRzIG93biBsaW5lIGludGFjdC5cbiAgY29uc3QgcHJldmlvdXNFbmQgPSBwcmV2aW91cy5vZmZzZXQgKyBwcmV2aW91cy5sZW5ndGg7XG4gIGNvbnN0IHJlc3RvcmVPZmZzZXQgPSBwcmV2aW91c0VuZCArICgvXlxccyosL3UuZXhlYyhjb250ZW50LnNsaWNlKHByZXZpb3VzRW5kKSk/LlswXS5sZW5ndGggPz8gMCk7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCByZXN0b3JlT2Zmc2V0KSArXG4gICAgY29tbWVudCArXG4gICAgY29udGVudC5zbGljZShyZXN0b3JlT2Zmc2V0LCBpbnNlcnRlZEVuZCkgK1xuICAgIGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQgKyBjb21tZW50Lmxlbmd0aClcbiAgKTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBpbmRlbnRhdGlvbiB0aGUgZmlsZSBhbHJlYWR5IHVzZXMsIHNvIGEgc2VtYW50aWMgY2hhbmdlIGRvZXMgbm90IHJlaW5kZW50IHVucmVsYXRlZFxuICogbGluZXMuIFRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgaW5kZW50ZWQgbGluZSwgYmVjYXVzZSBhIGRlY29yYXRlZFxuICogYmxvY2sgY29tbWVudCAoYCAqIC4uLmApIHdvdWxkIG90aGVyd2lzZSBwYXNzIGZvciB0aGUgZmlsZSdzIGluZGVudGF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSB0d29cbiAqIHNwYWNlcyBldmVyeSBnZW5lcmF0ZWQgY29uZmlnIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQ6IHN0cmluZyk6IHsgaW5zZXJ0U3BhY2VzOiBib29sZWFuOyB0YWJTaXplOiBudW1iZXIgfSB7XG4gIGNvbnN0IGZpcnN0UHJvcGVydHkgPSBwYXJzZVRyZWUoY29udGVudCk/LmNoaWxkcmVuPy5bMF07XG4gIGNvbnN0IGluZGVudGF0aW9uID1cbiAgICBmaXJzdFByb3BlcnR5ICYmIGNvbnRlbnQuc2xpY2UoY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpICsgMSwgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpO1xuICBpZiAoIWluZGVudGF0aW9uIHx8ICEvXltcXHQgXSskL3UudGVzdChpbmRlbnRhdGlvbikpIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogMiB9O1xuICBpZiAoaW5kZW50YXRpb24uc3RhcnRzV2l0aCgnXFx0JykpIHJldHVybiB7IGluc2VydFNwYWNlczogZmFsc2UsIHRhYlNpemU6IDEgfTtcbiAgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiBpbmRlbnRhdGlvbi5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBpbnNlcnQgaW50byBgb2xkVmFsdWVgIHRvIHR1cm4gaXQgaW50byBgbmV3VmFsdWVgLCBvciB1bmRlZmluZWQgd2hlblxuICogdGhhdCBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgYG5ld1ZhbHVlYCBkcm9wcyBvciByZW9yZGVycyBhbiBleGlzdGluZyBlbGVtZW50ICh0aGUgY2FsbGVyIG11c3RcbiAqIHRoZW4gcmVwbGFjZSB0aGUgYXJyYXkgd2hvbGVzYWxlKS4gSW5kaWNlcyBhZGRyZXNzIHRoZSBhcnJheSBhcyBpdCBncm93cywgc28gYXBwbHlpbmcgdGhlXG4gKiBpbnNlcnRpb25zIGxlZnQgdG8gcmlnaHQgeWllbGRzIGBuZXdWYWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlOiB1bmtub3duW10sIG5ld1ZhbHVlOiB1bmtub3duW10pOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc2VydGlvbnM6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdID0gW107XG4gIGxldCBvbGRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgW25ld0luZGV4LCBlbGVtZW50XSBvZiBuZXdWYWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAob2xkSW5kZXggPCBvbGRWYWx1ZS5sZW5ndGggJiYgSlNPTi5zdHJpbmdpZnkob2xkVmFsdWVbb2xkSW5kZXhdKSA9PT0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpIHtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaW5zZXJ0aW9ucy5wdXNoKHsgaW5kZXg6IG5ld0luZGV4LCB2YWx1ZTogZWxlbWVudCB9KTtcbiAgfVxuICByZXR1cm4gb2xkSW5kZXggPT09IG9sZFZhbHVlLmxlbmd0aCA/IGluc2VydGlvbnMgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBSZWNvZ25pemVzIHRoZSBtYW5hZ2VkIGB3YiBnZW4tY29kZWAgc2VnbWVudCwgYSBvbmUtbGV2ZWwgcGFja2FnZS1zY3JpcHQgd3JhcHBlciBhcm91bmQgaXQsIGFuZFxuICogY3VzdG9tIHNlZ21lbnRzIHRoYXQgd2JmeSBsZWF2ZXMgYWxvbmUuXG4gKi9cbnR5cGUgU2NyaXB0U2VnbWVudEtpbmQgPSAnY3VzdG9tJyB8ICdnZW5Db2RlJyB8ICdnZW5Db2RlV3JhcHBlcic7XG5cbmNvbnN0IGdlbkNvZGVTZWdtZW50UGF0dGVybiA9IC9eYnVuXFxzK3diXFxzK2dlbi1jb2RlJC91O1xuXG4vLyBBIHJ1bm5lciBkZWxlZ2F0aW5nIHRvIG9uZSBvZiB0aGlzIHBhY2thZ2UncyBvd24gc2NyaXB0cywgZS5nLiBgYnVuIHJ1biBnZW4tdHlwZXNgLlxuY29uc3Qgc2NyaXB0UnVubmVyUGF0dGVybiA9IC9eYnVuXFxzK3J1blxccysoXFxTKykkL3U7XG5cbi8vIEFueXRoaW5nIHdiZnkncyBgJiZgIHNwbGl0IGNhbm5vdCBtb2RlbCAocGlwZXMsIHNlcXVlbmNpbmcsIHJlZGlyZWN0aW9ucywgcXVvdGluZywgc3Vic3RpdHV0aW9ucywgZGlyZWN0b3J5XG4vLyBjaGFuZ2VzKS4gU2NyaXB0cyBjb250YWluaW5nIGl0IGFyZSBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG5jb25zdCB1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybiA9IC9bXFxuO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3U7XG5cbi8qKlxuICogU3BsaXRzIGEgc2NyaXB0IGludG8gYCYmYC1zZXBhcmF0ZWQgc2VnbWVudHMsIG9yIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCB1c2VzIHNoZWxsIHN5bnRheCB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAodW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm47XG4gIHJldHVybiBzY3JpcHRcbiAgICAuc3BsaXQoJyYmJylcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTY3JpcHRTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIGZvbGxvd3NXcmFwcGVyID0gdHJ1ZVxuKTogU2NyaXB0U2VnbWVudEtpbmQge1xuICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgaWYgKGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KG5vcm1hbGl6ZWQpKSByZXR1cm4gJ2dlbkNvZGUnO1xuICAvLyBBIG9uZS1sZXZlbCB3cmFwcGVyIGxvb2t1cCBjb3ZlcnMgYFwicG9zdGluc3RhbGxcIjogXCJidW4gcnVuIGdlbi10eXBlc1wiYCwgdGhlIHNoYXBlIHRoZXNlIHJlcG9zaXRvcmllcyB1c2U7XG4gIC8vIGRlZXBlciBjaGFpbnMgc3RheSBjdXN0b20gc28gd2JmeSBjYW5ub3QgbG9vcCBvbiBhIHNlbGYtcmVmZXJlbnRpYWwgc2NyaXB0LlxuICBjb25zdCBzY3JpcHROYW1lID0gZm9sbG93c1dyYXBwZXIgPyBzY3JpcHRSdW5uZXJQYXR0ZXJuLmV4ZWMobm9ybWFsaXplZCk/LlsxXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiAnY3VzdG9tJztcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHRhcmdldCk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgc3RpbGwgcGVyZm9ybXMgdGhlIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiwgc28gaXQgY291bnRzIGFzIGdlbi1jb2RlOyB0cmVhdGluZyBpdCBhcyBjdXN0b20gd291bGQgYXBwZW5kIGEgc2Vjb25kIGB3YiBnZW4tY29kZWAgYW5kIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuXG4gIGlmIChzZWdtZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIG1hbmFnZWQgZ2VuZXJhdGlvbiBBTkQgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IGlzIHRoZSBpbnN0YWxsLXRpbWUgZW50cnkgcG9pbnQ6IGl0IG11c3QgYmUga2VwdCBhc1xuICAgIC8vIHdyaXR0ZW4uIFJlcGxhY2luZyBpdCB3aXRoIGEgYmFyZSBgd2IgZ2VuLWNvZGVgIHdvdWxkIGRyb3AgdGhvc2Ugc3RlcHM7IGFwcGVuZGluZyBvbmUgd291bGQgcnVuIGV2ZXJ5XG4gICAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICAgIHJldHVybiBzZWdtZW50cz8uc29tZSgoaW5uZXIpID0+IGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KGlubmVyLnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpKSlcbiAgICAgID8gJ2dlbkNvZGVXcmFwcGVyJ1xuICAgICAgOiAnY3VzdG9tJztcbiAgfVxuICByZXR1cm4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnRzWzBdID8/ICcnLCBzY3JpcHRzLCBmYWxzZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZCwgYXJncywgY3dkKVsxXTtcbn1cblxuZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dCA6IHN0ZG91dC50b1N0cmluZygpO1xuICByZXR1cm4gW3Byb2Muc3RhdHVzID8/IDEsIHN0ZG91dFRleHQudHJpbSgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICAvLyBXaGV0aGVyIGlzUHVibGljUmVwbyBjb21lcyBmcm9tIGFuIGFjdHVhbCBHaXRIdWIgQVBJIHJlc3BvbnNlOiBhIGZhaWxlZCBsb29rdXAgKG9mZmxpbmUsXG4gIC8vIHJhdGUtbGltaXRlZCwgYmFkIGNyZWRlbnRpYWwpIGNvbGxhcHNlcyB0byBpc1B1YmxpY1JlcG89ZmFsc2UsIHdoaWNoIHZpc2liaWxpdHktc2Vuc2l0aXZlXG4gIC8vIGdlbmVyYXRvcnMgbXVzdCBub3QgbWlzdGFrZSBmb3IgYSBjb25maXJtZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICBpc1JlcG9WaXNpYmlsaXR5S25vd246IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0Nsb3VkZmxhcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW47XG4gIGlzUmFpbHdheTogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLyoqIERpcmVjdG9yaWVzIGNvbnRhaW5pbmcgQ2FyZ28udG9tbCAocmVsYXRpdmUgdG8gZGlyUGF0aCwgcm9vdC1tb3N0IGZpcnN0KS4gRW1wdHkgaWYgdGhlIHJlcG8gaGFzIG5vIFJ1c3QgY29kZS4gKi9cbiAgY2FyZ29Ub21sRGlyUGF0aHM6IHN0cmluZ1tdO1xuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgUHl0aG9uIGxvY2tmaWxlIChwb2V0cnkubG9jayAvIHV2LmxvY2spIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBNYXZlbiBwb20ueG1sIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUG9tWG1sQW55d2hlcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgU2xpZGV2IGRlY2sgKGAqLnNsaWRldi5tZGApIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluU2xpZGV2TWQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWc6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFJ1bnRpbWU6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHNsaWRldjogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgdGF1cmk6IGJvb2xlYW47XG4gICAgdmluZXh0OiBib29sZWFuO1xuICAgIHZpdGU6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gICAgY2hha3JhOiBib29sZWFuO1xuICAgIGRyaXp6bGU6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgbnBtOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEFuIGV4cGxpY2l0IG5wbS1wdWJsaXNoaW5nIHBsdWdpbiBlbnRyeSBwdWJsaXNoZXMgdGhlIHJvb3QgbWFuaWZlc3QgaXRzZWxmXG4gICAgICogKG5vIHBrZ1Jvb3QgcmVkaXJlY3Rpb24gYW5kIG5wbVB1Ymxpc2ggbm90IGRpc2FibGVkKS5cbiAgICAgKi9cbiAgICBucG1QdWJsaXNoZXNSb290OiBib29sZWFuO1xuICB9O1xuICBtaXNlVGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuLy8gd2IncyByZWxlYXNlIHBsdWdpbiBwdWJsaXNoZXMgdGhlIG5wbSBwYWNrYWdlIGluIGl0cyByZXF1aXJlZCBwa2dSb290LlxuY29uc3QgbnBtUHVibGlzaGluZ1JlbGVhc2VQbHVnaW5zID0gbmV3IFNldChbJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScsICdAd2lsbGJvb3N0ZXIvd2IvcmVsZWFzZS1wbHVnaW4nXSk7XG5cbi8qKlxuICogVGhlIHNlbWFudGljLXJlbGVhc2UgY29uZmlnIGZpbGVzIHdiZnkgZXhwZWN0cywgaW4gY29zbWljb25maWcncyByZXNvbHV0aW9uIG9yZGVyICh0aGUgbGVhZGluZ1xuICogcGFja2FnZS5qc29uIGVudHJ5IGlzIGNoZWNrZWQgYnkgdGhlIGNhbGxlcikuIHdiZnkgZ2VuZXJhdGVzIC5yZWxlYXNlcmMuanNvbjsgdGhlIG90aGVyIHNwZWxsaW5nc1xuICogYXJlIGxpc3RlZCBvbmx5IHRvIGRldGVjdCBhIGhhbmQtd3JpdHRlbiBjb25maWcsIHdob3NlIGZvcm1hdCBKU09OLnBhcnNlIGNhbm5vdCByZWFkIGFuZCB3aG9zZVxuICogcGx1Z2luIGxpc3QgaXMgdGhlcmVmb3JlIHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZS5cbiAqL1xuY29uc3Qgc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzOiB7IGZpbGVOYW1lOiBzdHJpbmc7IGpzb25QYXJzZWFibGU6IGJvb2xlYW4gfVtdID0gW1xuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IGlzUm9vdD86IGJvb2xlYW4gfVxuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gZmFsc2U7XG4gICAgbGV0IHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290ID0gZmFsc2U7XG4gICAgLy8gVGhlIEZJUlNUIGV4aXN0aW5nIHNlYXJjaCBwbGFjZSB3aW5zIChjb3NtaWNvbmZpZyBzaG9ydC1jaXJjdWl0cyksIHNvIGEgSlMvWUFNTC9UUyBjb25maWdcbiAgICAvLyBvciBhbiBgZXh0ZW5kc2AgcHJlc2V0IG1ha2VzIHRoZSBlZmZlY3RpdmUgcGx1Z2luIGxpc3Qgc3RhdGljYWxseSB1bmluc3BlY3RhYmxlIChtaXJyb3JzXG4gICAgLy8gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyBpbiB3YidzIHJlbGVhc2UudHMpLiBUcmVhdGluZyBpdCBhcyB1bmtub3duIGtlZXBzXG4gICAgLy8gYHJlbGVhc2UubnBtYCBjb25zZXJ2YXRpdmVseSB0cnVlLCBzbyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgbmV2ZXIgZm9yY2VzXG4gICAgLy8gYHByaXZhdGU6IHRydWVgIG9uIGEgbW9ub3JlcG8gdGhhdCBhY3R1YWxseSBwdWJsaXNoZXMgdG8gbnBtLlxuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdHlwZSBSZWxlYXNlQ29uZmlnID1cbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlcz86IHVua25vd247XG4gICAgICAgICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XSlbXTtcbiAgICAgICAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAvLyBjb3NtaWNvbmZpZyBzZWFyY2hlcyBwYWNrYWdlLmpzb24ncyBgcmVsZWFzZWAga2V5IEJFRk9SRSBhbnkgcmMvY29uZmlnIGZpbGVcbiAgICAgIC8vIChzZW1hbnRpYy1yZWxlYXNlIDI1IGRlbGVnYXRlcyB0byBjb3NtaWNvbmZpZyA5J3MgZGVmYXVsdCBzZWFyY2hQbGFjZXMpLlxuICAgICAgbGV0IHJlbGVhc2VDb25maWcgPSAocGFja2FnZUpzb24gYXMgeyByZWxlYXNlPzogUmVsZWFzZUNvbmZpZyB9KS5yZWxlYXNlO1xuICAgICAgaWYgKHJlbGVhc2VDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgICAgICBjb25zdCByZWxlYXNlcmNQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVsZWFzZXJjUGF0aCkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICghanNvblBhcnNlYWJsZSkge1xuICAgICAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBgLnJlbGVhc2VyY2AgYW5kIGAuY29uZmlnL3JlbGVhc2VyY2AgbWF5IGFsc28gaG9sZCBZQU1MOyBhIEpTT04ucGFyc2UgZmFpbHVyZSBsYW5kc1xuICAgICAgICAgIC8vIGluIHRoZSBjYXRjaCBiZWxvdyBhbmQgbWFya3MgdGhlIHBsdWdpbiBsaXN0IHVua25vd24gaW5zdGVhZCBvZiBzaWxlbnRseSByZXBvcnRpbmdcbiAgICAgICAgICAvLyBcIm5vIHBsdWdpbnNcIi5cbiAgICAgICAgICByZWxlYXNlQ29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjUGF0aCwgJ3V0ZjgnKSkgYXMgUmVsZWFzZUNvbmZpZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSBhY2NlcHRzIGEgc2NhbGFyIGJyYW5jaCBvciBicmFuY2ggb2JqZWN0cyAoeyBuYW1lLCBwcmVyZWxlYXNlLCAuLi4gfSk7XG4gICAgICAvLyBub3JtYWxpemUgdG8gcGxhaW4gYnJhbmNoIG5hbWVzIGZvciBjb25zdW1lcnMgc3VjaCBhcyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yLlxuICAgICAgY29uc3QgcmF3QnJhbmNoZXMgPSByZWxlYXNlQ29uZmlnPy5icmFuY2hlcztcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IChBcnJheS5pc0FycmF5KHJhd0JyYW5jaGVzKSA/IHJhd0JyYW5jaGVzIDogcmF3QnJhbmNoZXMgPT09IHVuZGVmaW5lZCA/IFtdIDogW3Jhd0JyYW5jaGVzXSlcbiAgICAgICAgLm1hcCgoYnJhbmNoOiB1bmtub3duKSA9PlxuICAgICAgICAgIHR5cGVvZiBicmFuY2ggPT09ICdzdHJpbmcnID8gYnJhbmNoIDogKGJyYW5jaCBhcyB7IG5hbWU/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5uYW1lXG4gICAgICAgIClcbiAgICAgICAgLmZpbHRlcigoYnJhbmNoTmFtZSk6IGJyYW5jaE5hbWUgaXMgc3RyaW5nID0+IHR5cGVvZiBicmFuY2hOYW1lID09PSAnc3RyaW5nJyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxlYXNlQ29uZmlnPy5wbHVnaW5zKSkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW5FbnRyeSBvZiByZWxlYXNlQ29uZmlnLnBsdWdpbnMpIHtcbiAgICAgICAgICBjb25zdCBbcGx1Z2luTmFtZSwgcGx1Z2luT3B0aW9uc10gPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KSA/IHBsdWdpbkVudHJ5IDogW3BsdWdpbkVudHJ5LCB1bmRlZmluZWRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTmFtZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLnB1c2gocGx1Z2luTmFtZSk7XG4gICAgICAgICAgaWYgKCFucG1QdWJsaXNoaW5nUmVsZWFzZVBsdWdpbnMuaGFzKHBsdWdpbk5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBXaXRoIHBrZ1Jvb3QgdGhlIHBsdWdpbiBwdWJsaXNoZXMgYW5vdGhlciBtYW5pZmVzdCAoaXQgcmVzb2x2ZXMgcGtnUm9vdCBhZ2FpbnN0IHRoZVxuICAgICAgICAgIC8vIHJlcG8gcm9vdCwgc28gYC5gIGFuZCBgLi9gIGJvdGggbWVhbiB0aGUgcm9vdCBpdHNlbGYpLCBhbmQgQHNlbWFudGljLXJlbGVhc2UvbnBtJ3NcbiAgICAgICAgICAvLyBucG1QdWJsaXNoOiBmYWxzZSBkaXNhYmxlcyBwdWJsaXNoaW5nIGVudGlyZWx5OyBvbmx5IHRoZSByZW1haW5pbmcgc2hhcGUgcHJvdmVzIHRoZVxuICAgICAgICAgIC8vIFJPT1QgaXMgcHVibGlzaGVkLlxuICAgICAgICAgIGNvbnN0IHBrZ1Jvb3QgPSBwbHVnaW5PcHRpb25zPy5wa2dSb290O1xuICAgICAgICAgIGNvbnN0IHB1Ymxpc2hlc1Jvb3QgPVxuICAgICAgICAgICAgKHBsdWdpbk5hbWUgIT09ICdAc2VtYW50aWMtcmVsZWFzZS9ucG0nIHx8IHBsdWdpbk9wdGlvbnM/Lm5wbVB1Ymxpc2ggIT09IGZhbHNlKSAmJlxuICAgICAgICAgICAgKHBrZ1Jvb3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodHlwZW9mIHBrZ1Jvb3QgPT09ICdzdHJpbmcnICYmIHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwa2dSb290KSA9PT0gcGF0aC5yZXNvbHZlKGRpclBhdGgpKSk7XG4gICAgICAgICAgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgfHw9IHB1Ymxpc2hlc1Jvb3Q7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVsZWFzZUNvbmZpZyAmJiByZWxlYXNlQ29uZmlnLmV4dGVuZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCBhcHBsaWVzLCB3aGljaCBpbmNsdWRlc1xuICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbS5cbiAgICBjb25zdCB1c2VzU2VtYW50aWNSZWxlYXNlID0gISEoXG4gICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICk7XG5cbiAgICAvLyBUaGUgY2FsbGVyIG1heSBjbGFzc2lmeSBleHBsaWNpdGx5IChpbmRleC50cyBwYXNzZXMgZmFsc2UgZm9yIGV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlLFxuICAgIC8vIGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKTsgdGhlIGhldXJpc3RpYyBjbGFzc2lmaWVzIHRoZSBDTEkgZW50cnlcbiAgICAvLyBwYXRoIGl0c2VsZiwgc28gYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBhbmQgYHdiZnkgPHJlcG8+L2FwcHMvPGFwcD5gIGtlZXAgdGhlaXIgY2hpbGRcbiAgICAvLyBjbGFzc2lmaWNhdGlvbi5cbiAgICBjb25zdCBpc1Jvb3QgPSBvcHRpb25zPy5pc1Jvb3QgPz8gIWlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGgpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAvLyBGZXRjaCB2aXNpYmlsaXR5IGZvciB0aGUgQ0xJIGVudHJ5IGV2ZW4gd2hlbiBpdCBpcyBhIHdvcmtzcGFjZSBjaGlsZCAoYHdiZnlcbiAgICAvLyA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKTogZ2VuZXJhdG9ycyByZWFkIGlzUHVibGljUmVwbyBmcm9tIHRoZWlyIHJvb3RDb25maWcgcGFyYW1ldGVyLFxuICAgIC8vIHdoaWNoIElTIHRoZSBjaGlsZCBjb25maWcgaW4gdGhhdCBpbnZvY2F0aW9uLCBzbyBhIHN0dWIgYGZhbHNlYCB0aGVyZSB3b3VsZCBkcm9wIHRoZVxuICAgIC8vIHB1YmxpYy1yZXBvIHB1Ymxpc2hDb25maWcgaGFuZGxpbmcuIERpc2NvdmVyZWQgY2hpbGRyZW4gKG9wdGlvbnMuaXNSb290ID09PSBmYWxzZSkgc3RpbGxcbiAgICAvLyBza2lwIHRoZSBmZXRjaCDigJQgdGhleSBpbmhlcml0IHRoZSBlbmNsb3Npbmcgcm9vdCdzIHZpc2liaWxpdHkgdmlhIHJvb3RDb25maWcgaW5zdGVhZC5cbiAgICBpZiAob3B0aW9ucz8uaXNSb290ICE9PSBmYWxzZSkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE9ubHkgdGhlIHJvb3QgZmV0Y2hlcyByZXBvIGluZm8sIGFuZCB0aGF0IGZldGNoIG5lZWRzIG5ldHdvcmsgYW5kIGEgdG9rZW4sIHNvIGlkZW50aXR5LWRlcml2ZWRcbiAgICAvLyBmbGFncyBiZWxvdyB3b3VsZCBvdGhlcndpc2UgYmUgZmFsc2UgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlIGFuZCBmb3IgZXZlcnkgb2ZmbGluZSBvclxuICAgIC8vIHJhdGUtbGltaXRlZCBydW4uIFRoZSBnaXQgcmVtb3RlIGFuc3dlcnMgdGhlIHNhbWUgcXVlc3Rpb24gbG9jYWxseSwgZm9yIGV2ZXJ5IHBhY2thZ2UuXG4gICAgaWYgKCFyZXBvQXV0aG9yIHx8ICFyZXBvTmFtZSkge1xuICAgICAgW3JlcG9BdXRob3IsIHJlcG9OYW1lXSA9IGF3YWl0IHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuICAgIC8vIEJ1aWx0IGZyb20gdGhlIFJFU09MVkVEIGlkZW50aXR5IHNvIHdvcmtzcGFjZSBwYWNrYWdlcyBhbmQgb2ZmbGluZSBydW5zIGFsc28gZ2V0IGl0OyBjb25zdW1lcnMgZGVyaXZlXG4gICAgLy8gdGhlIG93bmVyIGZyb20gdGhpcyBmaWVsZCAoZS5nLiB0byBzZXQgYGF1dGhvcmApLlxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvQXV0aG9yICYmIHJlcG9OYW1lID8gYGdpdGh1Yjoke3JlcG9BdXRob3J9LyR7cmVwb05hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICAvLyBUYXVyaSBvZmZpY2lhbGx5IHN1cHBvcnRzIEpTT04sIEpTT041LCBhbmQgVE9NTCBjb25maWd1cmF0aW9uIGZvcm1hdHMuXG4gICAgY29uc3QgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyA9IFsndGF1cmkuY29uZi5qc29uJywgJ3RhdXJpLmNvbmYuanNvbjUnLCAnVGF1cmkudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NyYy10YXVyaScsIGZpbGVOYW1lKSlcbiAgICApO1xuICAgIC8vIFJvb3QtbGV2ZWwgXCJJblBhY2thZ2VzXCIgc2lnbmFscyBtdXN0IHNlZSBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdFxuICAgIC8vIGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSwgc28gc2NhbiBlYWNoIGRpc2NvdmVyZWQgd29ya3NwYWNlIGRpcmVjdG9yeS5cbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICB9KTtcbiAgICBjb25zdCBjb250YWluc0FueUluV29ya3NwYWNlcyA9IChwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgICB3b3Jrc3BhY2VTdWJEaXJQYXRocy5zb21lKCh3b3Jrc3BhY2VTdWJEaXJQYXRoKSA9PiBjb250YWluc0FueShwYXR0ZXJuLCB3b3Jrc3BhY2VTdWJEaXJQYXRoKSk7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyA9IGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpO1xuICAgIGNvbnN0IHdvcmtmbG93Q29udGVudHMgPSByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aCk7XG4gICAgY29uc3QgaW1wb3J0c1BsYXl3cmlnaHRBdFJ1bnRpbWUgPSBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0eXBlb2YgcmVwb0luZm8/LnByaXZhdGUgPT09ICdib29sZWFuJyxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQ2xvdWRmbGFyZTogZGV0ZWN0Q2xvdWRmbGFyZShwYWNrYWdlSnNvbiwgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZywgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgsIHJlcG9OYW1lKSxcbiAgICAgIGNhcmdvVG9tbERpclBhdGhzOiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aCksXG4gICAgICAvLyBBbHNvIGhvbm9yIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyBiZXlvbmQgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0cmVhdGluZyBhblxuICAgICAgLy8gYXBwcy8qLW9ubHkgbW9ub3JlcG8gYXMgYSBwbGFpbiBwYWNrYWdlIHdvdWxkIGRlbGV0ZSBpdHMgYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uIGluXG4gICAgICAvLyBnZW5lcmF0ZVBhY2thZ2VKc29uIGFuZCBza2lwIG1vbm9yZXBvLW9ubHkgY29udmVudGlvbnMgc3VjaCBhcyByb290IGBwcml2YXRlOiB0cnVlYC5cbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCkgfHwgd29ya3NwYWNlU3ViRGlyUGF0aHMubGVuZ3RoID4gMCxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIC8vIFJlY3Vyc2l2ZSBsaWtlIGRvZXNDb250YWluSmF2YTogbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yaWVzIGtlZXAgbGFuZ3VhZ2UgZGlyZWN0b3JpZXNcbiAgICAgIC8vIChlLmcuIFB5dGhvbiB0b29saW5nIG9yIE1hdmVuIG1vZHVsZXMpIG91dHNpZGUgdGhlIHJvb3QgYW5kIG91dHNpZGUgZGVjbGFyZWQgd29ya3NwYWNlcy5cbiAgICAgIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBjb250YWluc0FueSgnKiove3BvZXRyeS5sb2NrLHV2LmxvY2t9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBjb250YWluc0FueSgnKiovcG9tLnhtbCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluU2xpZGV2TWQ6IGNvbnRhaW5zQW55KCcqKi8qLnNsaWRldi5tZCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcyhcbiAgICAgICAgJ3NyYy10YXVyaS97dGF1cmkuY29uZi5qc29uLHRhdXJpLmNvbmYuanNvbjUsVGF1cmkudG9tbH0nXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JyksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygnKiovKi5qYXZhJyksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBjaGFrcmE6ICEhZGV2RGVwZW5kZW5jaWVzWydAY2hha3JhLXVpL2NsaSddLFxuICAgICAgICBkcml6emxlOiAhIWRlcGVuZGVuY2llc1snZHJpenpsZS1vcm0nXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZHJpenpsZS1raXQnXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICAvLyBBIGJhcmUgYHBsYXl3cmlnaHRgIGlzIGEgbGlicmFyeSwgZS5nLiB0aGUgcHJvdmlkZXIgb2YgYEB2aXRlc3QvYnJvd3Nlci1wbGF5d3JpZ2h0YC5cbiAgICAgICAgcGxheXdyaWdodFRlc3Q6ICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSxcbiAgICAgICAgcGxheXdyaWdodFJ1bnRpbWU6IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBzbGlkZXY6ICEhZGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHRhdXJpOlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICAgIHZpbmV4dDogISFkZXBlbmRlbmNpZXMudmluZXh0IHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpbmV4dCxcbiAgICAgICAgdml0ZTogISFkZXBlbmRlbmNpZXMudml0ZSB8fCAhIWRldkRlcGVuZGVuY2llcy52aXRlLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuc29tZSgocGx1Z2luTmFtZSkgPT4gbnBtUHVibGlzaGluZ1JlbGVhc2VQbHVnaW5zLmhhcyhwbHVnaW5OYW1lKSkgfHwgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgICAgICAgOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBucG1QdWJsaXNoZXNSb290OiByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCxcbiAgICAgIH0sXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwgfHxcbiAgICAgIC8vIEEgcmVwb3NpdG9yeSBjYW4gbGVnaXRpbWF0ZWx5IGNvbnRhaW4gb25seSBkb2N1bWVudGF0aW9uLiBJdHMgR2l0IG1ldGFkYXRhIGlzIGVub3VnaCB0b1xuICAgICAgLy8gZXN0YWJsaXNoIHRoYXQgdGhlIENMSSB0YXJnZXQgaXMgYSBwcm9qZWN0IHJvb3Q7IHJlcXVpcmluZyBhIGxhbmd1YWdlIG1hbmlmZXN0IGhlcmUgd291bGRcbiAgICAgIC8vIG1ha2Ugd2JmeSB1bmFibGUgdG8gY3JlYXRlIHRoZSBwYWNrYWdlLmpzb24gdGhhdCBpdCBtYW5hZ2VzIGZvciBzdWNoIHJlcG9zaXRvcmllcy4gQm90aFxuICAgICAgLy8gb3JkaW5hcnkgY2hlY2tvdXRzIChgLmdpdGAgZGlyZWN0b3J5KSBhbmQgd29ya3RyZWVzIChgLmdpdGAgZmlsZSkgc2F0aXNmeSB0aGlzIGNoZWNrLlxuICAgICAgKGNvbmZpZy5pc1Jvb3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXQnKSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB3YmZ5IG1hbmFnZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuIFRoZSBmaWxlIGlzIGdpdGlnbm9yZWQgYW5kIHVudHJhY2tlZFxuICogYmVjYXVzZSB0aGUgYHdiIGdlbi1jb2RlYCBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCBvbiBldmVyeSBpbnN0YWxsLCBzbyB0aGUgcGFja2FnZSBoYXMgdG8gb3duIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyAoYHdyYW5nbGVyIHR5cGVzYCBleGl0cyBub24temVybyB3aXRob3V0IG9uZSksIHRvIGRlcGVuZCBvbiB3cmFuZ2xlciAoYSBwYWNrYWdlIGRlcGxveWluZyB2aWEgYVxuICogQ0kgYWN0aW9uIGNhbm5vdCByZXNvbHZlIHRoZSBjb21tYW5kKSwgYW5kIHRvIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCBmaWxlLlxuICpcbiAqIElOVkFSSUFOVCDigJQgdGhpcyBkZWNpc2lvbiBtdXN0IGNvbnZlcmdlIGFjcm9zcyBtYWNoaW5lcyBob2xkaW5nIHRoZSBzYW1lIGNvbW1pdC4gSXQgbXVzdCBORVZFUiBjb25zdWx0XG4gKiBnaXRpZ25vcmVkIGZpbGVzIChgLmRldi52YXJzKmAsIGAuZW52KmAsIC4uLiksIHdoaWNoIGB3YiBzdGFydGAgYW5kIGB3YiBkZXBsb3lgIGNyZWF0ZSByb3V0aW5lbHkgYW5kIHdoaWNoXG4gKiB0aGVyZWZvcmUgc3RheSB1bnRyYWNrZWQgb24gZGV2IG1hY2hpbmVzIGZvcmV2ZXI6IGEgZm9ybWVyIGNoZWNrIHRoYXQgdHJlYXRlZCB0aGVtIGFzIGlycmVwcm9kdWNpYmxlIGlucHV0c1xuICogbWFkZSB3YmZ5IHJ1bnMgb24gZGV2IG1hY2hpbmVzIHJlLXRyYWNrIHRoZSB+MTVrLWxpbmUgZ2VuZXJhdGVkIGZpbGUgdGhhdCBydW5zIGZyb20gY2xlYW4gY2hlY2tvdXRzIGhhZFxuICogdW50cmFja2VkLCBvc2NpbGxhdGluZyBldGVybmFsbHkgKGUuZy4gYWktZ2FtZS1idWlsZGVyICM2ODQg4oaSICM3NDYpLiBSZWFkaW5nIGNvbW1pdHRhYmxlIHJlcG9zaXRvcnkgZmlsZXNcbiAqIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAodGhlIHdyYW5nbGVyIGNvbmZpZywgcGFja2FnZS5qc29uLCB0c2NvbmZpZyDigJQgYXMgZXZlcnkgd2JmeSBnZW5lcmF0b3IgZG9lcykgaXMgZmluZTpcbiAqIGFueSBkaXZlcmdlbmNlIHRoZXJlIGlzIHRyYW5zaWVudCBhbmQgZGlzYXBwZWFycyBvbmNlIHRoZSBmaWxlIGlzIGNvbW1pdHRlZCBvciByZW1vdmVkLlxuICogVGhlIGhhemFyZCB0aGF0IGNoZWNrIGd1YXJkZWQgYWdhaW5zdCBubyBsb25nZXIgZXhpc3RzOiBgd2IgZ2VuLWNvZGVgIHJ1bnMgYHdyYW5nbGVyIHR5cGVzIC0tZW52LWZpbGVgIHdpdGhcbiAqIGEga2V5IHN0dWIgZGVyaXZlZCBzb2xlbHkgZnJvbSB0aGUgY29tbWl0dGVkIGZub3gudG9tbCAoc2VlIHdiJ3Mgd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIpLCBzbyBsb2NhbCBkb3RlbnZcbiAqIGZpbGVzIG5ldmVyIGluZmx1ZW5jZSB0aGUgZ2VuZXJhdGVkIGBFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcgJiYgaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uKSAmJiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncGFja2FnZUpzb24nPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNjcmlwdHMgPSBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQpO1xuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSA9IHNlZ21lbnRzPy5zb21lKChzZWdtZW50KSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC9eKD86KD86YnVufGJ1bngpKD86IC0tYnVuKT8oPzogcnVuKT8gKT93YiBnZW4tY29kZSQvdS50ZXN0KG5vcm1hbGl6ZWQpICYmXG4gICAgICAgIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSkgcmV0dXJuIGAke25hbWV9IG11c3QgdXNlIHRoZSBjYW5vbmljYWwgYnVuIHdiIGdlbi1jb2RlIGNvbW1hbmRgO1xuICB9XG4gIC8vIE9ubHkgYGJ1biBydW4gPHNjcmlwdD5gIGlzIHJlY29nbml6ZWQgYXMgYSB3cmFwcGVyOyBhbm90aGVyIHJ1bm5lciBzcGVsbGluZyB3b3VsZCBnZXQgYSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24gYXBwZW5kZWQgbmV4dCB0byBpdCBhbmQgcnVuIGV2ZXJ5IGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC4gV2l0aG91dCBhIGdlbi1jb2RlXG4gIC8vIHBpcGVsaW5lIG5vdGhpbmcgaXMgYXBwZW5kZWQsIHNvIHRoZSBzcGVsbGluZyBpcyBpcnJlbGV2YW50IHRoZXJlLlxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnKSA/PyBbXSkge1xuICAgIGNvbnN0IHNjcmlwdE5hbWUgPSAvXig/OmJ1bnxidW54KSg/OlxccystLWJ1bik/KD86XFxzK3J1bik/XFxzKyhcXFMrKSQvdS5leGVjKHNlZ21lbnQpPy5bMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICBpZiAoXG4gICAgICB0YXJnZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgc2VnbWVudCAhPT0gYGJ1biBydW4gJHtzY3JpcHROYW1lfWAgJiZcbiAgICAgIChzY3JpcHRzWydnZW4tY29kZSddICE9PSB1bmRlZmluZWQgfHwgdGFyZ2V0LmluY2x1ZGVzKCd3YiBnZW4tY29kZScpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGBwb3N0aW5zdGFsbCBtdXN0IGludm9rZSB0aGUgJHtzY3JpcHROYW1lfSBzY3JpcHQgYXMgYnVuIHJ1biAke3NjcmlwdE5hbWV9YDtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIC8oPzpefCYmKVxccyooPzpucG18bnB4fHBucG18eWFybilcXHMrKD86cnVuKD86LXNjcmlwdCk/XFxzKyk/KD86Z2VuLWNvZGV8d2JcXHMrZ2VuLWNvZGUpXFxzKig/OiYmfCQpL3UudGVzdChcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPz8gJydcbiAgICApXG4gICkge1xuICAgIHJldHVybiAncG9zdGluc3RhbGwgbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2YgYSBub24tQnVuIGdlbi1jb2RlIHJ1bm5lcic7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChzY3JpcHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSBidW4gd2IgZ2VuLWNvZGUgaW5zdGVhZCBvZiB3cmFuZ2xlciB0eXBlc2A7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gW1xuICAgIHBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8ub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LnBlZXJEZXBlbmRlbmNpZXMsXG4gIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBkZXBlbmRlbmNpZXM/LndyYW5nbGVyICE9PSB1bmRlZmluZWQpO1xufVxuXG5jb25zdCBzaGVsbFdvcmRQYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpcIig/OlxcXFwufFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxdKSonfCg/OlxcXFwufFteXFxzXCInXFxcXF0pKylgO1xuY29uc3Qgd3JhbmdsZXJPcHRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2BcXHMrLS0/W0EtWmEtel1bXFx3LV0qKD86PSR7c2hlbGxXb3JkUGF0dGVybn18XFxzKyg/IS18dHlwZXNcXGIpJHtzaGVsbFdvcmRQYXR0ZXJufSk/YDtcbmNvbnN0IHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gIFN0cmluZy5yYXdgW1wiJ10/XFxid3JhbmdsZXIoPzpAW15cXHNcIiddKyk/XFxiW1wiJ10/KD86JHt3cmFuZ2xlck9wdGlvblBhdHRlcm59KSpcXHMrdHlwZXNcXGJgLFxuICAndSdcbik7XG5cbi8qKlxuICogQSBwYWNrYWdlIHdob3NlIFR5cGVTY3JpcHQgcHJvamVjdCBjYW5ub3QgaW5jbHVkZSB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIChlLmcuIG9uZSBvbiBhIGhhbmQtbWFpbnRhaW5lZFxuICogbWluaW1hbCBgRW52YCB3aXRoIGB0eXBlczogW1wiYnVuXCJdYCwgdGhlIHN0YW5kYXJkIGVzY2FwZSB3aGVuIHRoZSBhbWJpZW50IHdyYW5nbGVyIGdsb2JhbHMgY29uZmxpY3Qgd2l0aCB0aGVcbiAqIGBAdHlwZXMvYnVuYCBnbG9iYWxzIGl0cyB0ZXN0cyBuZWVkKSBnYWlucyBub3RoaW5nIGZyb20gcmVnZW5lcmF0aW5nIHRoZSB+NTAwS0IgZmlsZSBvbiBldmVyeSBpbnN0YWxsLCBzbyB3YmZ5XG4gKiBsZWF2ZXMgc3VjaCBwYWNrYWdlcyB1bm1hbmFnZWQgaW5zdGVhZCBvZiByZS1hZGRpbmcgdGhlIGdlbmVyYXRpb24gc3RlcC4gQ29uc3VtcHRpb24gaXMgZGV0ZWN0ZWQgdHdvIHdheXM6XG4gKiBhIHRleHR1YWwgYHdvcmtlci1jb25maWd1cmF0aW9uYCByZWZlcmVuY2UgaW4gYW55IHRyYWNrZWQgZmlsZSBvZiB0aGUgcGFja2FnZSAoY292ZXJzIGltcG9ydHMsIHRyaXBsZS1zbGFzaFxuICogcmVmZXJlbmNlcywgYW5kIGV4cGxpY2l0IHRzY29uZmlnIGVudHJpZXMpLCBvciBhIGBmaWxlc2AvYGluY2x1ZGVgL2BleGNsdWRlYCBzZXQgdGhhdCBjYW4gbWF0Y2ggdGhlIGZpbGUg4oCUXG4gKiByZXNvbHZlZCB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnMgd2l0aCBlYWNoIHBhdHRlcm4ga2VwdCByZWxhdGl2ZSB0byB0aGUgY29uZmlnIHRoYXQgZGVjbGFyZWQgaXQsXG4gKiBtYXRjaGluZyB0c2MuIFdoZW5ldmVyIHRoZSBlZmZlY3RpdmUgc2V0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIChtaXNzaW5nIG9yIHVucGFyc2VhYmxlIHRzY29uZmlnLCBwYWNrYWdlLW5hbWVcbiAqIGBleHRlbmRzYCBwcmVzZXRzLCBvciBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiksIHRoZSBjdXJyZW50IG1hbmFnZWQgYmVoYXZpb3IgaXMga2VwdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJz4pOiBib29sZWFuIHtcbiAgLy8gYGdpdCBncmVwYCBzZWFyY2hlcyB0cmFja2VkIGZpbGVzIG9ubHksIHNvIHRoZSBnaXRpZ25vcmVkIGdlbmVyYXRlZCBmaWxlIGl0c2VsZiBuZXZlciBtYXRjaGVzLlxuICAvLyB3YmZ5J3Mgb3duIG1hbmFnZWQgYXJ0aWZhY3RzIGFyZSBleGNsdWRlZDogdGhlIGAuZ2l0aWdub3JlYCBydWxlIChgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNgKVxuICAvLyB3YmZ5IGNvbW1pdHRlZCB3aGlsZSBpdCBtYW5hZ2VkIHRoZSBwYWNrYWdlIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLCBvciBhIG9uY2UtbWFuYWdlZFxuICAvLyBwYWNrYWdlIGNvdWxkIG5ldmVyIG9wdCBvdXQuXG4gIGNvbnN0IGdyZXBSZXN1bHQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ2dpdCcsXG4gICAgLy8gdHNjb25maWcgZmlsZXMgYXJlIGNsYXNzaWZpZWQgYnkgdGhlIHJlc29sdmVkIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSBsb2dpYyBiZWxvdyDigJQgYSB0ZXh0dWFsXG4gICAgLy8gaGl0IHRoZXJlIChlLmcuIGFuIGBleGNsdWRlYCBlbnRyeSkgbXVzdCBub3QgY291bnQgYXMgY29uc3VtcHRpb24uXG4gICAgW1xuICAgICAgJ2dyZXAnLFxuICAgICAgJy1sJyxcbiAgICAgICd3b3JrZXItY29uZmlndXJhdGlvbicsXG4gICAgICAnLS0nLFxuICAgICAgJy4nLFxuICAgICAgJzooZXhjbHVkZSkuZ2l0aWdub3JlJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGF0dHJpYnV0ZXMnLFxuICAgICAgU3RyaW5nLnJhd2A6KGdsb2IsZXhjbHVkZSkqKi90c2NvbmZpZyouanNvbmAsXG4gICAgXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xuICBpZiAoZ3JlcFJlc3VsdC50cmltKCkpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgY29uc3QgZmlsZVNldCA9IHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpLCBjb25maWcuZGlyUGF0aCwgNSk7XG4gIGlmICghZmlsZVNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1hdGNoZXMgPSAocGF0dGVyblNldDogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFwYXR0ZXJuU2V0IHx8ICFBcnJheS5pc0FycmF5KHBhdHRlcm5TZXQucGF0dGVybnMpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYXR0ZXJuU2V0LmJhc2VEaXJQYXRoLCB3b3JrZXJUeXBlc1BhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgIHJldHVybiBwYXR0ZXJuU2V0LnBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIGAke2NvbmZpZ0Rpcn1gLXByZWZpeGVkIHBhdHRlcm5zIHdlcmUgZXhwYW5kZWQgdG8gYWJzb2x1dGUgcGF0aHMgYXQgcmVzb2x2ZSB0aW1lLlxuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgd29ya2VyVHlwZXNQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgICB9XG4gICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuLCByZWxhdGl2ZVBhdGgsIHBhdHRlcm5TZXQuZXhwYW5kc0RpcmVjdG9yaWVzKTtcbiAgICB9KTtcbiAgfTtcbiAgLy8gYGZpbGVzYCBlbnRyaWVzIGFyZSBhbHdheXMgcGFydCBvZiB0aGUgcHJvZ3JhbSwgZXZlbiB3aGVuIGBleGNsdWRlYCBtYXRjaGVzIHRoZW0uXG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZmlsZXMpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG1hdGNoZXMoZmlsZVNldC5leGNsdWRlKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBOZWl0aGVyIGluY2x1ZGUgbm9yIGZpbGVzIGRlY2xhcmVkOiBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiBjb3ZlcnMgdGhlIGZpbGUuXG4gIGlmICghZmlsZVNldC5pbmNsdWRlICYmICFmaWxlU2V0LmZpbGVzKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIG1hdGNoZXMoZmlsZVNldC5pbmNsdWRlKTtcbn1cblxuaW50ZXJmYWNlIFRzY29uZmlnUGF0dGVyblNldCB7XG4gIC8qKiBEaXJlY3Rvcnkgb2YgdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIHRoZSBwYXR0ZXJuczsgdHNjIHJlc29sdmVzIHRoZW0gcmVsYXRpdmUgdG8gaXQuICovXG4gIGJhc2VEaXJQYXRoOiBzdHJpbmc7XG4gIC8qKiBpbmNsdWRlL2V4Y2x1ZGUgdHJlYXQgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBwYXR0ZXJuIGFzIGEgZGlyZWN0b3J5IHN1YnRyZWU7IGBmaWxlc2AgZG9lcyBub3QuICovXG4gIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbjtcbiAgcGF0dGVybnM6IHVua25vd247XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ0ZpbGVTZXQge1xuICBleGNsdWRlPzogVHNjb25maWdQYXR0ZXJuU2V0O1xuICBmaWxlcz86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgaW5jbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbn1cblxuLyoqIFJlc29sdmVzIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnM7IHVuZGVmaW5lZCB3aGVuIHVucmVhZGFibGUuICovXG5mdW5jdGlvbiByZXNvbHZlVHNjb25maWdGaWxlU2V0KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25zdW1lckRpclBhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nRGVwdGg6IG51bWJlclxuKTogVHNjb25maWdGaWxlU2V0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlbWFpbmluZ0RlcHRoIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCB0c2NvbmZpZyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8e1xuICAgIGV4Y2x1ZGU/OiB1bmtub3duO1xuICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIGZpbGVzPzogdW5rbm93bjtcbiAgICBpbmNsdWRlPzogdW5rbm93bjtcbiAgfT4oY29udGVudCk7XG4gIGlmICghdHNjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICAvLyBgJHtjb25maWdEaXJ9YCByZXNvbHZlcyB0byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBST09UIChjb25zdW1pbmcpIGNvbmZpZywgd2hlcmV2ZXIgaXQgYXBwZWFycy5cbiAgY29uc3QgdG9QYXR0ZXJuU2V0ID0gKHBhdHRlcm5zOiB1bmtub3duLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBUc2NvbmZpZ1BhdHRlcm5TZXQgfCB1bmRlZmluZWQgPT5cbiAgICBBcnJheS5pc0FycmF5KHBhdHRlcm5zKVxuICAgICAgPyB7XG4gICAgICAgICAgYmFzZURpclBhdGg6IGRpclBhdGgsXG4gICAgICAgICAgZXhwYW5kc0RpcmVjdG9yaWVzLFxuICAgICAgICAgIHBhdHRlcm5zOiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+XG4gICAgICAgICAgICB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycgJiYgcGF0dGVybi5zdGFydHNXaXRoKCcke2NvbmZpZ0Rpcn0nKVxuICAgICAgICAgICAgICA/IHBhdGguam9pbihjb25zdW1lckRpclBhdGgsIHBhdHRlcm4uc2xpY2UoJyR7Y29uZmlnRGlyfScubGVuZ3RoKSlcbiAgICAgICAgICAgICAgOiBwYXR0ZXJuXG4gICAgICAgICAgKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbGVTZXQ6IFRzY29uZmlnRmlsZVNldCA9IHtcbiAgICBleGNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZXhjbHVkZSwgdHJ1ZSksXG4gICAgZmlsZXM6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5maWxlcywgZmFsc2UpLFxuICAgIGluY2x1ZGU6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5pbmNsdWRlLCB0cnVlKSxcbiAgfTtcbiAgY29uc3QgcGFyZW50cyA9XG4gICAgdHlwZW9mIHRzY29uZmlnLmV4dGVuZHMgPT09ICdzdHJpbmcnID8gW3RzY29uZmlnLmV4dGVuZHNdIDogQXJyYXkuaXNBcnJheSh0c2NvbmZpZy5leHRlbmRzKSA/IHRzY29uZmlnLmV4dGVuZHMgOiBbXTtcbiAgLy8gV2l0aCBhbiBgZXh0ZW5kc2AgYXJyYXksIGxhdGVyIGVudHJpZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzLCBhbmQgdGhlIGNoaWxkIG92ZXJyaWRlcyBhbGwg4oCUXG4gIC8vIHNvIGZpbGwgZWFjaCBzdGlsbC1taXNzaW5nIGtleSBmcm9tIHRoZSBsYXN0IHBhcmVudCB0aGF0IGRlZmluZXMgaXQuXG4gIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMudG9SZXZlcnNlZCgpKSB7XG4gICAgaWYgKGZpbGVTZXQuZXhjbHVkZSAmJiBmaWxlU2V0LmZpbGVzICYmIGZpbGVTZXQuaW5jbHVkZSkgYnJlYWs7XG4gICAgLy8gUGFja2FnZS1uYW1lIGV4dGVuZHMgKGUuZy4gYEB0c2NvbmZpZy9idW5gKSBhcmUgY29tcGlsZXJPcHRpb25zIHByZXNldHMgd2l0aG91dCBmaWxlIHNldHMuXG4gICAgaWYgKHR5cGVvZiBwYXJlbnQgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnQuc3RhcnRzV2l0aCgnLicpKSBjb250aW51ZTtcbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwYXJlbnQpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXJlbnRQYXRoKSAmJiBmcy5leGlzdHNTeW5jKGAke3BhcmVudFBhdGh9Lmpzb25gKSkgcGFyZW50UGF0aCArPSAnLmpzb24nO1xuICAgIGNvbnN0IHBhcmVudEZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhcmVudFBhdGgsIGNvbnN1bWVyRGlyUGF0aCwgcmVtYWluaW5nRGVwdGggLSAxKTtcbiAgICBpZiAoIXBhcmVudEZpbGVTZXQpIGNvbnRpbnVlO1xuICAgIGZpbGVTZXQuZXhjbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5leGNsdWRlO1xuICAgIGZpbGVTZXQuZmlsZXMgPz89IHBhcmVudEZpbGVTZXQuZmlsZXM7XG4gICAgZmlsZVNldC5pbmNsdWRlID8/PSBwYXJlbnRGaWxlU2V0LmluY2x1ZGU7XG4gIH1cbiAgcmV0dXJuIGZpbGVTZXQ7XG59XG5cbmZ1bmN0aW9uIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdHRlcm4ucmVwbGFjZSgvXlxcLlxcLy91LCAnJyk7XG4gIC8vIEEgYmFyZSBgLmAgaW5jbHVkZSBjb3ZlcnMgZXZlcnl0aGluZyB1bmRlciB0aGUgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICBpZiAobm9ybWFsaXplZCA9PT0gJycgfHwgbm9ybWFsaXplZCA9PT0gJy4nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gQWJzb2x1dGUgcGF0dGVybnMgKGV4cGFuZGVkIGAke2NvbmZpZ0Rpcn1gKSBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSB0YXJnZXQ7IGRyb3AgdGhlXG4gIC8vIGxlYWRpbmcgc2xhc2hlcyBmcm9tIGJvdGggc28gdGhlIHNlZ21lbnQtYnVpbHQgcmVnZXggYW5jaG9ycyBpZGVudGljYWxseS5cbiAgdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXlxcLysvdSwgJycpO1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgIT09ICcnKTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBzZWdtZW50c1xuICAgIC5tYXAoKHNlZ21lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChzZWdtZW50ID09PSAnKionKSByZXR1cm4gaXNMYXN0ID8gJy4qJyA6IFN0cmluZy5yYXdgKD86W14vXSsvKSpgO1xuICAgICAgY29uc3Qgc2VnbWVudFNvdXJjZSA9IHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgU3RyaW5nLnJhd2BbXi9dKmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgU3RyaW5nLnJhd2BbXi9dYCk7XG4gICAgICByZXR1cm4gaXNMYXN0ID8gc2VnbWVudFNvdXJjZSA6IGAke3NlZ21lbnRTb3VyY2V9L2A7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG4gIC8vIHRzYyB0cmVhdHMgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBpbmNsdWRlL2V4Y2x1ZGUgZW50cnkgYXMgYSBkaXJlY3Rvcnkgd2hvc2Ugc3VidHJlZSBpcyBpbmNsdWRlZC5cbiAgY29uc3QgbGFzdFNlZ21lbnQgPSBzZWdtZW50cy5hdCgtMSkgPz8gJyc7XG4gIGNvbnN0IGRpcmVjdG9yeVN1ZmZpeCA9XG4gICAgZXhwYW5kc0RpcmVjdG9yaWVzICYmICEvWyo/XS91LnRlc3QobGFzdFNlZ21lbnQpICYmICFsYXN0U2VnbWVudC5pbmNsdWRlcygnLicpID8gU3RyaW5nLnJhd2AoPzovLiopP2AgOiAnJztcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSR7ZGlyZWN0b3J5U3VmZml4fSRgLCAndScpLnRlc3QodGFyZ2V0UGF0aCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB0aGUgZGlyZWN0b3J5IG93bnMgYSBXb3JrZXIsIHVubGlrZSB0aGUgaXNDbG91ZGZsYXJlIGhldXJpc3RpYywgd2hpY2ggYWxzbyBtYXRjaGVzIGEgcGFja2FnZSB0aGF0XG4gKiBtZXJlbHkgbWVudGlvbnMgd3JhbmdsZXIgaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cgKGUuZy4gdGhlIHJvb3Qgb2YgYSBtb25vcmVwbyB3aG9zZSBXb3JrZXIgbGl2ZXMgaW4gYSBzdWItcGFja2FnZSkuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGRpclBhdGggYmVsb25ncyB0byB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByZXBvc2l0b3J5LiBQcmVmZXJzIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBHaXRIdWIgcmVwbyBuYW1lLCB3aGljaCBpcyBpbW11bmUgdG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBsYXlvdXQuIFRoYXQgbmFtZSBpcyBmZXRjaGVkIG9ubHkgZm9yIHRoZVxuICogcm9vdCwgc28gc3ViLXBhY2thZ2VzIChhbmQgb2ZmbGluZSByb290cykgd2FsayB1cCB0byB0aGUgbmVhcmVzdCBnaXQgcm9vdCBhbmQgbWF0Y2ggaXRzIGRpcmVjdG9yeVxuICogbmFtZTogYSBzaWJsaW5nIHJlcG8gY2xvbmVkIHVuZGVyIGEgcGFyZW50IGRpcmVjdG9yeSBuYW1lZCB3aWxsYm9vc3Rlci1jb25maWdzIHN0b3BzIGF0IGl0cyBvd25cbiAqIGAuZ2l0YCwgc28gaXQgaXMgbm90IG1pc2NsYXNzaWZpZWQuIFRoZSBwYXRoIHNlZ21lbnQgcmVtYWlucyBhIGxhc3QgcmVzb3J0IHdoZW4gbm8gZ2l0IHJvb3QgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmIChyZXBvTmFtZSkgcmV0dXJuIHJlcG9OYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgbGV0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBwYXRoLmRpcm5hbWUoY3VycmVudCkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5naXQnKSkpIHtcbiAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGN1cnJlbnQpLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgICB9XG4gICAgY3VycmVudCA9IHBhdGguZGlybmFtZShjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gcGFja2FnZUpzb25QYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJy93aWxsYm9vc3Rlci1jb25maWdzLycpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RDbG91ZGZsYXJlKFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW4sXG4gIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIGlmIChzY3JpcHRzICYmIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiBzY3JpcHQuaW5jbHVkZXMoJ3dyYW5nbGVyJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL2Nsb3VkZmxhcmV8d3JhbmdsZXIvaXUudGVzdChjb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFJhaWx3YXkoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCdyYWlsd2F5JykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3JhaWx3YXkuanNvbicpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5LnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJhaWx3YXknLCAncmFpbHdheS50cycpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9yYWlsd2F5L2l1LnRlc3QoY29udGVudCkpO1xufVxuXG4vKiogQ29udGVudHMgb2YgdGhlIHJlYWRhYmxlIC5naXRodWIvd29ya2Zsb3dzIFlBTUwgZmlsZXMsIHJlYWQgb25jZSBmb3IgZXZlcnkgZGV0ZWN0b3IgbmVlZGluZyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKVxuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IC9cXC55YT9tbCQvaXUudGVzdChmaWxlTmFtZSkpXG4gICAgICAuZmxhdE1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gW2ZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpXTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNaXNlVGFza3MoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IHRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZGlyUGF0aCBpcyBhIGNoaWxkIHdvcmtzcGFjZSBvZiBhbiBlbmNsb3NpbmcgbW9ub3JlcG8gcm9vdDogZWl0aGVyIHRoZSBjb252ZW50aW9uYWxcbiAqIGA8cm9vdD4vcGFja2FnZXMvPG5hbWU+YCBsYXlvdXQsIG9yIGEgZGlyZWN0b3J5IG1hdGNoaW5nIGEgd29ya3NwYWNlIHBhdHRlcm4gZGVjbGFyZWQgYnkgYW5cbiAqIGFuY2VzdG9yIHBhY2thZ2UuanNvbiAocGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXAsIGUuZy4gYGV4YW1wbGVzLyoqYCkuIFRoZSB3YWxrIHN0b3BzXG4gKiBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZyByZXBvc2l0b3J5J3Mgd29ya3NwYWNlcyBjYW5cbiAqIG5ldmVyIHJlY2xhc3NpZnkgYW4gaW5kZXBlbmRlbnQgcmVwb3NpdG9yeSBhcyBhIGNoaWxkLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVzb2x2ZWREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAvLyBBIGRpcmVjdG9yeSB3aXRoIGl0cyBvd24gLmdpdCBpcyBhIHJlcG9zaXRvcnkgaW4gaXRzIG93biByaWdodCwgbmV2ZXIgYSBjaGlsZCB3b3Jrc3BhY2Ug4oCUXG4gIC8vIGNoZWNrZWQgRklSU1Qgc28gYW4gaW5kZXBlbmRlbnQgcmVwb3NpdG9yeSB1bmRlciBzb21lIGBwYWNrYWdlcy9gIGRpcmVjdG9yeSBzdGF5cyBhIHJvb3QuXG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuZ2l0JykpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuLicpKSA9PT0gJ3BhY2thZ2VzJyAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKFxuICAgIGxldCBjYW5kaWRhdGVSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShyZXNvbHZlZERpclBhdGgpO1xuICAgIDtcbiAgICBjYW5kaWRhdGVSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShjYW5kaWRhdGVSb290RGlyUGF0aClcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3RQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsIHJlc29sdmVkRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoe1xuICAgICAgICBkaXJQYXRoOiBjYW5kaWRhdGVSb290RGlyUGF0aCxcbiAgICAgICAgcGFja2FnZUpzb246IHJvb3RQYWNrYWdlSnNvbixcbiAgICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGZhbHNlLFxuICAgICAgfSkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+IHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKTtcbiAgICAgIGlmICh3b3Jrc3BhY2VEaXJQYXRocy5pbmNsdWRlcyhyZWxhdGl2ZURpclBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vIG9yIHVucGFyc2FibGUgbWFuaWZlc3QgYXQgdGhpcyBhbmNlc3Rvcjoga2VlcCB3YWxraW5nLlxuICAgIH1cbiAgICBjb25zdCBpc1JlcG9Cb3VuZGFyeSA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gY2FuZGlkYXRlUm9vdERpclBhdGggPT09IHBhdGguZGlybmFtZShjYW5kaWRhdGVSb290RGlyUGF0aCk7XG4gICAgaWYgKGlzUmVwb0JvdW5kYXJ5IHx8IGlzRmlsZXN5c3RlbVJvb3QpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDYXJnb1RvbWxEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmZ1xuICAgIC5nbG9iU3luYygnKiovQ2FyZ28udG9tbCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KVxuICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5zcGxpdCgnLycpLmxlbmd0aCAtIGIuc3BsaXQoJy8nKS5sZW5ndGggfHwgYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVzID0gZmcuZ2xvYlN5bmMoJ3thcHAsc3JjfS8qKi8qLntjanMsY3RzLGpzLGpzeCxtanMsbXRzLHRzLHRzeH0nLCB7XG4gICAgZG90OiB0cnVlLFxuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAnKiovX190ZXN0c19fLyoqJywgJyoqLyouc3BlYy4qJywgJyoqLyoudGVzdC4qJywgJyoqL3BsYXl3cmlnaHQuY29uZmlnLionXSxcbiAgfSk7XG4gIGNvbnN0IHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuID0gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKCdwbGF5d3JpZ2h0Jyk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGUpLCAndXRmOCcpO1xuICAgIGlmIChwbGF5d3JpZ2h0SW1wb3J0UGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUnVudGltZUltcG9ydFJlZ0V4cChwYWNrYWdlTmFtZTogc3RyaW5nKTogUmVnRXhwIHtcbiAgLy8gTWF0Y2ggdGhlIGJhcmUgc3BlY2lmaWVyIG9yIGFueSBzdWJwYXRoIG9mIGl0IChgcGtnYCAvIGBwa2cvc3ViYCksIGJ1dCBuZXZlciBhIGRpZmZlcmVudCBwYWNrYWdlXG4gIC8vIHRoYXQgbWVyZWx5IHNoYXJlcyB0aGUgcHJlZml4IChgcGtnLW90aGVyYCksIHNpbmNlIHRoZSBjaGFyIGFmdGVyIHRoZSBuYW1lIG11c3QgYmUgYC9gIG9yIGEgcXVvdGUuXG4gIGNvbnN0IHNwZWNpZmllciA9IFN0cmluZy5yYXdgWydcIl0ke2VzY2FwZVJlZ0V4cChwYWNrYWdlTmFtZSl9KD86L1teJ1wiXSopP1snXCJdYDtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgU3RyaW5nLnJhd2BcXGJmcm9tXFxzKyR7c3BlY2lmaWVyfXxcXGJpbXBvcnRcXHMqXFwoXFxzKiR7c3BlY2lmaWVyfVxccypcXCl8XFxicmVxdWlyZVxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKWAsXG4gICAgJ3UnXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlbW90ZVVybCA9IGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoKTtcbiAgaWYgKHJlbW90ZVVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvbi4gVGhlIG93bmVyIE1VU1QgYmUgcGFzc2VkOiBnZXRPY3Rva2l0KCkgd2l0aG91dCBpdCBwcmVmZXJzIHRoZVxuICAgIC8vIFdpbGxCb29zdGVyIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgcHJpdmF0ZSBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3JpZXMsIGNvbGxhcHNpbmcgdGhlaXJcbiAgICAvLyB2aXNpYmlsaXR5IHRvIHVua25vd24gKGFuZCBlLmcuIHNraXBwaW5nIHRoZSB3YmZ5IGNhbGxlciBnZW5lcmF0aW9uIGluZGVmaW5pdGVseSkuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG9yZykucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIC8vIFJlLWZldGNoIHVuZGVyIHRoZSByZWRpcmVjdGVkIGlkZW50aXR5IHNvIGEgcmVuYW1lZCByZXBvc2l0b3J5IHN0aWxsIGdldHMgY29tcGxldGVcbiAgICAgIC8vIG1ldGFkYXRhICh2aXNpYmlsaXR5IGluY2x1ZGVkKSBpbnN0ZWFkIG9mIGEgYmFyZSBmdWxsX25hbWUgdGhhdCB3b3VsZCBsZWF2ZVxuICAgICAgLy8gaXNSZXBvVmlzaWJpbGl0eUtub3duIGZhbHNlIG9uIGV2ZXJ5IHN1YnNlcXVlbnQgcnVuIHdpdGggdGhlIHN0YWxlIHJlbW90ZSBVUkwuXG4gICAgICBjb25zdCBbcmVkaXJlY3RlZE9yZywgcmVkaXJlY3RlZE5hbWVdID0gcmVkaXJlY3RlZEZ1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVkaXJlY3RlZE9yZyAmJiByZWRpcmVjdGVkTmFtZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChyZWRpcmVjdGVkT3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXI6IHJlZGlyZWN0ZWRPcmcsXG4gICAgICAgICAgICByZXBvOiByZWRpcmVjdGVkTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiYXJlIGlkZW50aXR5IGJlbG93OiB0aGUgcmVwb3NpdG9yeSBpcyBzdGlsbCBjYW5vbmljYWxpemVkLCBvbmx5XG4gICAgICAgICAgLy8gaXRzIHZpc2liaWxpdHkgc3RheXMgdW5rbm93bi5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZnVsbF9uYW1lOiByZWRpcmVjdGVkRnVsbE5hbWUgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBgPG9yZz4vPG5hbWU+YCBmcm9tIHRoZSBnaXQgcmVtb3RlIChmYWxsaW5nIGJhY2sgdG8gcGFja2FnZS5qc29uJ3MgYHJlcG9zaXRvcnlgKSB3aXRob3V0XG4gKiBjYWxsaW5nIHRoZSBHaXRIdWIgQVBJLiBJdCB3b3JrcyBmb3IgZXZlcnkgd29ya3NwYWNlIHBhY2thZ2UsIG5vdCBqdXN0IHRoZSByb290IOKAlCBvbmx5IHRoZSByb290XG4gKiBmZXRjaGVzIHJlcG8gaW5mbyDigJQgYW5kIGl0IGtlZXBzIHdvcmtpbmcgb2ZmbGluZSBvciByYXRlLWxpbWl0ZWQsIHdoZXJlIGFuIHVuZGVmaW5lZCBpZGVudGl0eVxuICogd291bGQgc2lsZW50bHkgcmVjbGFzc2lmeSB0aGUgcmVwb3NpdG9yeSAoZS5nLiBtYWtpbmcgd2JmeSB3cml0ZSB3aWxsYm9vc3Rlci1jb25maWdzJyBSZW5vdmF0ZVxuICogcHJlc2V0IGludG8gdGhlIHByZXNldCBpdHNlbGYgYWdhaW4pLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBQcm9taXNlPFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZF0+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSByZWFkR2l0SHViSWRlbnRpdHkocmVtb3RlVXJsKTtcbiAgICBpZiAoaWRlbnRpdHkpIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSByZWFkR2l0SHViSWRlbnRpdHkodXJsKTtcbiAgICBpZiAoaWRlbnRpdHkpIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnY29uZmlnJywgJy0tZ2V0JywgJ3JlbW90ZS5vcmlnaW4udXJsJ10sIGRpclBhdGgpIHx8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBgZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lYCBpcyBob3N0LWFnbm9zdGljLCBzbyBpdCBoYXBwaWx5IHR1cm5zIGEgR2l0TGFiIFVSTCBpbnRvIGFuIGA8b3JnPi88cmVwbz5gIHBhaXIuXG4gKiBFdmVyeXRoaW5nIGRvd25zdHJlYW0gdHJlYXRzIHRoZSByZXN1bHRpbmcgaWRlbnRpdHkgYXMgR2l0SHViICh0aGUgYGdpdGh1YjpgIHJlcG9zaXRvcnkgZmllbGQgaXMgcmV3cml0dGVuXG4gKiBpbnRvIHBhY2thZ2UuanNvbiksIHNvIHRoZSBob3N0IG11c3QgYmUgdmVyaWZpZWQgZmlyc3Q7IGEgbm9uLUdpdEh1YiByZW1vdGUgeWllbGRzIG5vIGlkZW50aXR5LCBhcyBiZWZvcmUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRHaXRIdWJJZGVudGl0eSh1cmw6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10gfCB1bmRlZmluZWQge1xuICBpZiAoIXRhcmdldHNHaXRIdWIodXJsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsKTtcbiAgcmV0dXJuIG9yZyAmJiBuYW1lID8gW2Nhbm9uaWNhbGl6ZU93bmVyKG9yZyksIG5hbWVdIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIFVSTCdzIEhPU1QgaXMgZ2l0aHViLmNvbS4gUGFyc2VkIHJhdGhlciB0aGFuIHN1YnN0cmluZy1tYXRjaGVkOiBhIHBhdGggc3VjaCBhc1xuICogYGh0dHBzOi8vZ2l0bGFiLmNvbS9naXRodWIuY29tL293bmVyL3JlcG8uZ2l0YCB3b3VsZCBvdGhlcndpc2UgYmUgdGFrZW4gZm9yIEdpdEh1YiwgYW5kIGFuIHVwcGVyY2FzZVxuICogYEdJVEhVQi5DT01gIHdvdWxkIGJlIHJlamVjdGVkLiBgZ2l0aHViOm93bmVyL3JlcG9gIGlzIG5wbSdzIHNob3J0aGFuZCBhbmQgbmFtZXMgbm8gaG9zdCwgc28gaXQgaXNcbiAqIHJlY29nbml6ZWQgc2VwYXJhdGVseTsgbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIGFjY2VwdHMgdGhlIHNhbWUgc2hvcnRoYW5kLlxuICovXG5mdW5jdGlvbiB0YXJnZXRzR2l0SHViKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICgvXmdpdGh1YjovaXUudGVzdCh1cmwpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2NwLXN0eWxlIHJlbW90ZXMgKGBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvLmdpdGApIGFyZSBub3QgdmFsaWQgVVJMcy5cbiAgY29uc3Qgc2NwSG9zdCA9IC9eW14vQF0qQChbXjovXSspOi91LmV4ZWModXJsKT8uWzFdO1xuICBpZiAoc2NwSG9zdCkgcmV0dXJuIHNjcEhvc3QudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybC5yZXBsYWNlKC9eZ2l0XFwrL3UsICcnKSkuaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBhIHJlbW90ZSBvciBtYW5pZmVzdCBVUkwgbWF5IHNwZWxsIHRoZW0gYW55IHdheSwgYnV0IHRoZSBBUEknc1xuICogYGZ1bGxfbmFtZWAgYWx3YXlzIHJldHVybmVkIHRoZSBjYW5vbmljYWwgc3BlbGxpbmcg4oCUIHdoaWNoIHRoZSBtYW55IGV4YWN0IGA9PT0gJ1dpbGxCb29zdGVyJ2AgcG9saWN5IGNoZWNrc1xuICogKG9yZ2FuaXphdGlvbiB3b3JrZmxvd3MsIGF1dGhvciBtZXRhZGF0YSwgdGhlIFdpbGxCb29zdGVyTGFiIHByZS1wdXNoIGd1YXJkKSBkZXBlbmQgb24uIENhbm9uaWNhbGl6ZSBoZXJlIHNvXG4gKiB0aGUgbG9jYWwgZmFsbGJhY2sgeWllbGRzIHRoZSBzYW1lIGlkZW50aXR5IHRoZSBBUEkgZGlkLCBpbnN0ZWFkIG9mIHNpbGVudGx5IHNraXBwaW5nIHRob3NlIHBvbGljaWVzLlxuICovXG5mdW5jdGlvbiBjYW5vbmljYWxpemVPd25lcihvd25lcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2Fub25pY2FsT3duZXJzID0gWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddO1xuICByZXR1cm4gY2Fub25pY2FsT3duZXJzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyLnRvTG93ZXJDYXNlKCkpID8/IG93bmVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgSVNTVUVfVEVNUExBVEVfUlVMRVMsIFBVTExfUkVRVUVTVF9CT0RZX1JVTEVTLCBURVNUX1dSSVRJTkdfUlVMRVMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcnVuQWxsSW5Qb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdywgaW52b2tlc1diRGVwbG95IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290Q29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IHVzZXNXYkRlcGxveSA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiB7XG4gICAgICBjb25zdCBzY3JpcHRzID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICAgICAgY29uc3QgZGVwbG95U2NyaXB0ID0gc2NyaXB0c1snZGVwbG95J107XG4gICAgICByZXR1cm4gdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiYgaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdCwgbmV3IFNldChPYmplY3Qua2V5cyhzY3JpcHRzKSkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHVzZXNXYkRlcGxveSwgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBydW5BbGxJblBvb2woW1xuICAgICAgLi4uKFxuICAgICAgICBbXG4gICAgICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgICAgIF0gYXMgY29uc3RcbiAgICAgICkubWFwKChbZmlsZU5hbWUsIHRvb2xOYW1lXSkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCB1c2VzV2JEZXBsb3ksIGV4dHJhQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgICB9KSxcbiAgICAgICgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpLFxuICAgIF0pO1xuICB9KTtcbn1cblxuY29uc3QgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuXG4vKipcbiAqIFJlYWRzIHRoZSByb290J3MgdXNlci1hdXRob3JlZCBBR0VOVFNfRVhUUkEubWQgb25jZSBwZXIgcHJvY2Vzczogd2JmeSBuZXZlciByZXdyaXRlcyB0aGUgZmlsZSxcbiAqIGFuZCBib3RoIHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBhbmQgR2VtaW5pIGdlbmVyYXRvcnMgbmVlZCBpdHMgY29udGVudC4gQ2FjaGluZyB0aGUgcmVzb2x2ZWRcbiAqIHZhbHVlIChub3QgdGhlIFByb21pc2UpIGlzIHJhY2UtZnJlZSBiZWNhdXNlIHRoZSB0d28gY2FsbGVycyBydW4gc2VxdWVudGlhbGx5IGluIGluZGV4LnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gIGlmICghYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuaGFzKGFnZW50c0V4dHJhUGF0aCkpIHtcbiAgICBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5zZXQoYWdlbnRzRXh0cmFQYXRoLCBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhhZ2VudHNFeHRyYVBhdGgpKTtcbiAgfVxuICByZXR1cm4gYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuZ2V0KGFnZW50c0V4dHJhUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB1c2VzV2JEZXBsb3k6IGJvb2xlYW4sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIHVzZXNXYkRlcGxveSwgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5leHBvcnQgY29uc3QgTEFOR1VBR0VfQk9VTkRfVEVYVF9FWENFUFRJT04gPVxuICAnZXhjZXB0IHRleHQgd2hvc2UgbGFuZ3VhZ2UgaXMgcGFydCBvZiB3aGF0IHRoZSBjb2RlIGhhbmRsZXMgKGUuZy4sIFVJIHN0cmluZ3MsIHRlc3QgaW5wdXRzKSc7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICB1c2VzV2JEZXBsb3k6IGJvb2xlYW4sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSAnYnVuJztcbiAgY29uc3QgZGVzY3JpcHRpb24gPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbjtcbiAgY29uc3QgZm5veEluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpXG4gICAgPyBgXFxuLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgbGl2ZSBpbiBcXGBmbm94LnRvbWxcXGAgKG1pc2UgKyBmbm94KTsgbmV2ZXIgY3JlYXRlIFxcYC5lbnZcXGAsIFxcYC5lbnYuKlxcYCwgb3IgXFxgLmRldi52YXJzXFxgIGZpbGVzLiBSdW4gY29tbWFuZHMgdGhyb3VnaCBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiAuLi5cXGAgb3IgXFxgZm5veCBydW4gLVAgPHByb2ZpbGU+IC0tIDxjb21tYW5kPlxcYC4gUHJvZmlsZSBzZWNyZXRzIGxvYWQgb25seSB3aGVuIGEgcHJvZmlsZSBpcyBzZWxlY3RlZDogbW9kZS1hd2FyZSB3YiBjb21tYW5kcyAoZS5nLiBcXGB3YiBzdGFydFxcYCwgXFxgd2IgdGVzdFxcYCkgYW5kIFxcYHdiIGRvdGVudlxcYCBzZWxlY3QgaXQgdGhlbXNlbHZlcyAoXFxgd2IgZG90ZW52XFxgIHVzZXMgXFxgV0JfRU5WXFxgLCBlbHNlIFxcYEZOT1hfUFJPRklMRVxcYCwgZWxzZSBcXGBOT0RFX0VOVlxcYCwgZWxzZSB0aGUgZGV2ZWxvcG1lbnQgcHJvZmlsZTsgXFxgV0JfRU5WXFxgIGFjY2VwdHMgb25seSBcXGBkZXZlbG9wbWVudFxcYC9cXGB0ZXN0XFxgL1xcYHN0YWdpbmdcXGAvXFxgcHJvZHVjdGlvblxcYCwgc28gdXNlIFxcYEZOT1hfUFJPRklMRVxcYCBmb3IgYW55IG90aGVyIHByb2ZpbGUpLCB3aGlsZSBiYXJlIFxcYGZub3ggcnVuXFxgIG5lZWRzIGFuIGV4cGxpY2l0IFxcYC1QIDxwcm9maWxlPlxcYC5gXG4gICAgOiAnJztcbiAgLy8gbWlzZSBvd25zIHRoZSBwaW5uZWQgdG9vbCB2ZXJzaW9ucywgc28gYSB2ZXJzaW9uIG1pc21hdGNoIGlzIGZpeGVkIGJ5IGVkaXRpbmcgbWlzZS50b21sIOKAlCBub3RcbiAgLy8gYnkgaW5zdGFsbGluZyBhIGRpZmZlcmVudCB2ZXJzaW9uIGdsb2JhbGx5LCB3aGljaCB0aGUgbmV4dCBgbWlzZSBpbnN0YWxsYCBzaWxlbnRseSBvdmVycmlkZXMuXG4gIGNvbnN0IG1pc2VJbnN0cnVjdGlvbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ21pc2UudG9tbCcpKVxuICAgID8gJ1xcbi0gVG9vbCB2ZXJzaW9ucyAoZS5nLiwgbm9kZSkgYXJlIHBpbm5lZCBpbiBgbWlzZS50b21sYDsgcnVuIGBtaXNlIGluc3RhbGxgIGFmdGVyIGNoYW5naW5nIGl0IGFuZCBuZXZlciBpbnN0YWxsIHRob3NlIHRvb2xzIGdsb2JhbGx5IGluc3RlYWQuJ1xuICAgIDogJyc7XG4gIC8vIElzb2xhdGVkIGluc3RhbGxzIGFyZSB0aGUgb3JnIHN0YW5kYXJkICh3YmZ5IGdlbmVyYXRlcyBubyBvdGhlciBsaW5rZXIpIGFuZCB0aGUgbW9zdFxuICAvLyBhZ2VudC1ob3N0aWxlIHBhcnQgb2YgdGhlIHN0YWNrOiBhIHBhY2thZ2UgdGhhdCBpcyBvbmx5IHJlYWNoYWJsZSBiZWNhdXNlIGEgZGVwZW5kZW5jeSBob2lzdGVkXG4gIC8vIGl0IG5vIGxvbmdlciByZXNvbHZlcywgYW5kIHRoZSByZWZsZXggZml4IChzd2l0Y2hpbmcgdGhlIGxpbmtlciBiYWNrKSBzaWxlbnRseSByZWludHJvZHVjZXNcbiAgLy8gdGhlIHBoYW50b20gZGVwZW5kZW5jaWVzIHRoZSBsYXlvdXQgZXhpc3RzIHRvIGNhdGNoLlxuICBjb25zdCBpc29sYXRlZEluc3RhbGxJbnN0cnVjdGlvbiA9IGBcXG4tIFxcYGJ1bmZpZy50b21sXFxgIHVzZXMgQnVuJ3MgaXNvbGF0ZWQgbGlua2VyLCBzbyBvbmx5IGRlY2xhcmVkIGRlcGVuZGVuY2llcyByZXNvbHZlLiBJZiBhbiBpbXBvcnQgZmFpbHMgdG8gcmVzb2x2ZSwgZGVjbGFyZSB0aGF0IHBhY2thZ2UgaW4gdGhlIFxcYHBhY2thZ2UuanNvblxcYCB0aGF0IGltcG9ydHMgaXQ7IG5ldmVyIHN3aXRjaCBcXGBsaW5rZXJcXGAgdG8gXFxgaG9pc3RlZFxcYCBvciBhZGQgdG8gXFxgcHVibGljSG9pc3RQYXR0ZXJuXFxgIHRvIHdvcmsgYXJvdW5kIGl0LmA7XG4gIC8vIEV2ZXJ5IGNsYXVzZSBzdGF0ZXMgb25seSBhIHZlcmlmaWVkIGZhY3QsIHJldXNpbmcgdGhlIHdvcmtmbG93IGdlbmVyYXRvcidzIG93biBkZXRlY3RvcnM6IHRoZVxuICAvLyB3cmFuZ2xlci1jb25maWcgY2xhdXNlIG5lZWRzIGFuIGFjdHVhbCBjb25maWcgZmlsZSAoaXNDbG91ZGZsYXJlIGFsc28gbWF0Y2hlcyBhIG1lcmUgd3JhbmdsZXJcbiAgLy8gbWVudGlvbiBpbiBhIHNjcmlwdCBvciB3b3JrZmxvdyksIHRoZSB3b3JrZmxvdyBjbGF1c2UgbmVlZHMgYSBsaXZlIHJldXNhYmxlLWRlcGxveSBjYWxsZXJcbiAgLy8gKFlBTUwtcGFyc2VkIGpvYnMuKi51c2VzLCBub3QgYSByYXctdGV4dC9jb21tZW50IG1hdGNoKSwgYW5kIHRoZSBgd2IgZGVwbG95YCBjbGF1c2UgbmVlZHMgYVxuICAvLyBkZXBsb3kgc2NyaXB0IHdob3NlIGNvbW1hbmQgdG9rZW4gaXMgYHdiIOKApiBkZXBsb3lgLlxuICBjb25zdCBvd25zV3JhbmdsZXJDb25maWcgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcpO1xuICAvLyBPbmx5IGNsYWltIHRoZSBmaWxlIGlzIGdlbmVyYXRlZCB3aGVyZSBpdCBhY3R1YWxseSBpczogYSBwYWNrYWdlIHRoYXQgaGFuZC1tYWludGFpbnMgaXRzIGBFbnZgIChlLmcuIHVuZGVyXG4gIC8vIGB0eXBlczogW1wiYnVuXCJdYCkgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgdW5tYW5hZ2VkLCBhbmQgdGVsbGluZyBhbiBhZ2VudCB0byBydW4gYHdiIGdlbi1jb2RlYCB0aGVyZSB3b3VsZCBzZW5kXG4gIC8vIGl0IGFmdGVyIGEgZmlsZSB0aGF0IG5ldmVyIGFwcGVhcnMg4oCUIGFuZCBhd2F5IGZyb20gdGhlIGBFbnZgIGl0IHNob3VsZCBiZSBlZGl0aW5nLlxuICBjb25zdCBvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSk7XG4gIGNvbnN0IGhhc0RlcGxveVdvcmtmbG93ID0gaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93KHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViL3dvcmtmbG93cycpKTtcbiAgLy8gSW5kZXBlbmRlbnQgZmFjdHMgc3RheSBzZXBhcmF0ZSBzZW50ZW5jZXM6IHRoZSB3b3JrZmxvdydzIG93biBkZXBsb3kgbWVjaGFuaXNtIGlzIG5vdFxuICAvLyBpbnNwZWN0ZWQsIHNvIHRoZSB3Yi1kZXBsb3kgY2xhdXNlIG11c3Qgbm90IGNsYWltIHRoZSB3b3JrZmxvdyBpbnZva2VzIGl0LlxuICBjb25zdCBjbG91ZGZsYXJlSW5zdHJ1Y3Rpb24gPSBvd25zV3JhbmdsZXJDb25maWdcbiAgICA/IGBcXG4tIFRoaXMgcHJvamVjdCBydW5zIG9uIENsb3VkZmxhcmUgV29ya2VyczogdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBob2xkcyB0aGUgV29ya2VyJ3MgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIGJpbmRpbmdzIGFuZCBwZXItZW52aXJvbm1lbnQgb3ZlcnJpZGVzLiR7aGFzRGVwbG95V29ya2Zsb3cgPyAnIFRoZSBkZXBsb3kgd29ya2Zsb3dzIHVuZGVyIGAuZ2l0aHViL3dvcmtmbG93c2AgcGVyZm9ybSBkZXBsb3ltZW50cy4nIDogJyd9JHt1c2VzV2JEZXBsb3kgPyAnIFRoZSBgZGVwbG95YCBwYWNrYWdlIHNjcmlwdCBydW5zIGB3YiBkZXBsb3lgLicgOiAnJ30ke293bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA/IGBcXG4tIFxcYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNcXGAgaXMgZ2l0aWdub3JlZCBhbmQgZ2VuZXJhdGVkIGJ5IFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIGdlbi1jb2RlXFxgOyBhZnRlciBjaGFuZ2luZyBiaW5kaW5ncyBvciB2YXJzIGluIHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uLCByZS1ydW4gaXQgaW5zdGVhZCBvZiBlZGl0aW5nIHRoZSBmaWxlIGJ5IGhhbmQuYCA6ICcnfWBcbiAgICA6ICcnO1xuICBjb25zdCByYWlsd2F5SW5zdHJ1Y3Rpb24gPSAhcm9vdENvbmZpZy5pc1JhaWx3YXlcbiAgICA/ICcnXG4gICAgOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmFpbHdheScsICdyYWlsd2F5LnRzJykpXG4gICAgICA/IFwiXFxuLSBgLnJhaWx3YXkvcmFpbHdheS50c2AgaG9sZHMgdGhlIFJhaWx3YXkgcHJvamVjdCBJRCwgdGhlIHNlcnZpY2UgcGVyIGVudmlyb25tZW50LCB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uLCBhbmQgdGhlIHZhcmlhYmxlcyBSYWlsd2F5IHN1cHBsaWVzIChlLmcuIGEgbGlua2VkIGRhdGFiYXNlJ3MgYERBVEFCQVNFX1VSTGAsIHdoaWNoIHRoZSBkZXBsb3llZCBmbm94IHByb2ZpbGUgbXVzdCBub3QgZXhwb3J0KTsgZXZlcnkgb3RoZXIgc2VjcmV0IGFuZCBhcHBsaWNhdGlvbi1yZWFkIHZhbHVlIHN0YXlzIGluIGBmbm94LnRvbWxgLiBgd2IgZGVwbG95YCBhcHBsaWVzIGl0IGFuZCBkZXBsb3lzLCBhbmQgYHdiIGRlcGxveSAtLWRyeS1ydW5gIG9ubHkgY2hlY2tzIHRoZSBwbGFuLlwiXG4gICAgICA6ICdcXG4tIFJhaWx3YXkgcHJvamVjdCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgLic7XG4gIGNvbnN0IHBsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb24gPSBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihhbGxDb25maWdzKVxuICAgID8gYFxcbi0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0XFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmBcbiAgICA6ICcnO1xuICBjb25zdCBjb0F1dGhvckluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbiAgLSBFbmQgeW91ciBjb21taXQgbWVzc2FnZSB3aXRoIGEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYCwgdGhlIG9ubHkgQUkgYXR0cmlidXRpb24gdG8gYWRkLmBcbiAgICA6ICcnO1xuICBjb25zdCBwclRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSBgXFxuJHtQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUy5yZXBsYWNlQWxsKC9eL2dtLCAnICAnKX1gO1xuICBjb25zdCByZXF1aXJlbWVudHNFeGVtcHRpb24gPVxuICAgIFwiIG90aGVyIHRoYW4gdGhlIFBSIGJvZHkncyBSZXF1aXJlbWVudHMgc2VjdGlvbiAod2hpY2ggc3RhdGVzIHdoYXQgaXMgY3VycmVudGx5IGFza2VkIGZvciByYXRoZXIgdGhhbiB3aGF0IHRoZSBjb2RlIGNvbnRhaW5zKVwiO1xuICBjb25zdCBpc3N1ZVRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSBgXFxuLSBXaGVuIGNyZWF0aW5nIGFuIGlzc3VlOlxcbiR7SVNTVUVfVEVNUExBVEVfUlVMRVMucmVwbGFjZUFsbCgvXi9nbSwgJyAgJyl9YDtcbiAgY29uc3QgbGFuZ3VhZ2VJbnN0cnVjdGlvbiA9XG4gICAgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2Uocm9vdENvbmZpZykgPT09ICdKYXBhbmVzZSdcbiAgICAgID8gYFxcbi0gVW5sZXNzIGluc3RydWN0ZWQgb3RoZXJ3aXNlLCB3cml0ZSBpc3N1ZXMsIFBSIGJvZGllcywgcmV2aWV3IGNvbW1lbnRzLCBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgcGVvcGxlIChSRUFETUUsIFxcYGRvY3MvXFxgKSBpbiBKYXBhbmVzZSwgYW5kIGV2ZXJ5IG90aGVyIGFydGlmYWN0IChpbmNsdWRpbmcgY29tbWl0IG1lc3NhZ2VzLCBQUiB0aXRsZXMsIGlkZW50aWZpZXJzLCBjb2RlIGNvbW1lbnRzLCBKU0RvYywgYW5kIGFnZW50IGluc3RydWN0aW9ucykgaW4gRW5nbGlzaCwgJHtMQU5HVUFHRV9CT1VORF9URVhUX0VYQ0VQVElPTn0uYFxuICAgICAgOiBgXFxuLSBXcml0ZSBldmVyeSBhcnRpZmFjdCBpbiBFbmdsaXNoLCAke0xBTkdVQUdFX0JPVU5EX1RFWFRfRVhDRVBUSU9OfS5gO1xuICBjb25zdCBydW5uZXJJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/ICdcXG4tIFByaXZhdGUgcmVwb3NpdG9yaWVzIHVzZSBzZWxmLWhvc3RlZCBDSSBydW5uZXJzLiBLZWVwIE9TL3NpemUgY29uc3RyYWludHMgaW4gYW4gZXhwbGljaXQgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXk7IGZpeCBtaXNzaW5nIHJ1bm5lciBjYXBhYmlsaXRpZXMgaW5zdGVhZCBvZiBzd2l0Y2hpbmcgdG8gR2l0SHViLWhvc3RlZCBydW5uZXJzLiBUaGUgc29sZSBhcHByb3ZlZCBleGNlcHRpb24gaXMgdGhlIFdpbmRvd3MgZGVza3RvcCBidWlsZCBpbiBXaWxsQm9vc3Rlci9jaGVlcmxpbmdzLidcbiAgICA6ICcnO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHJvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cHJvamVjdE5hbWV9XFxgJHtkZXNjcmlwdGlvbiA/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLiR7bGFuZ3VhZ2VJbnN0cnVjdGlvbn1cbiR7VEVTVF9XUklUSU5HX1JVTEVTfVxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBhcyBhIHJ1bGUsIHJ1biBvbmx5IHdoYXQgaXMgbmVjZXNzYXJ5IGZvciB0aGUgY2hhbmdlIGxvY2FsbHksIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnlcXGAgKHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmc7IHVwIHRvIDEwIG1pbnV0ZXMpIGFuZCB0aGUgcmVsZXZhbnQgdGVzdHMsIGFuZCBsZWF2ZSB0aGUgZnVsbCB0ZXN0IHN1aXRlIChcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGxcXGA7IHVwIHRvIDEgaG91cikgdG8gdGhlIFBSJ3MgQ0kuIElmIFBSIENJIGRvZXMgbm90IHJ1biB0aGUgZnVsbCBzdWl0ZSwgcnVuIGl0IGxvY2FsbHkuIEZpeCBlcnJvcnMsIGluY2x1ZGluZyBDSSBmYWlsdXJlcywgYW5kIHJlLXJ1biB1bnRpbCB0aGV5IHBhc3MuXG4gIC0gUnVuIHJlbGV2YW50IHRlc3RzIHdpdGggXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgdGVzdCB0ZXN0L3VuaXQvZXhhbXBsZS50ZXN0LnRzIC0tZ3JlcCAnY2FzZSBuYW1lJ1xcYCAob21pdCBcXGAtLWdyZXBcXGAgZm9yIHRoZSB3aG9sZSBmaWxlOyB1c2UgXFxgLXcgcGFja2FnZXMvZXhhbXBsZVxcYCBpbiBhIG1vbm9yZXBvKS4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgdmVyaWZ5IC0tZnVsbCA8dGVzdC1wYXRoPiAtLWdyZXAgJ2Nhc2UgbmFtZSdcXGAgY29tYmluZXMgdmVyaWZpY2F0aW9uIHdpdGggc2VsZWN0ZWQgdGVzdHMuXG4gIC0gV2FpdCBmb3IgaXQgdG8gZmluaXNoIHdpdGhvdXQgcmVzdGFydGluZyBpdDogcHJlZmVyIGNvbXBsZXRpb24gbm90aWZpY2F0aW9ucywgb3RoZXJ3aXNlIHRoZSBsb25nZXN0IHBlcm1pdHRlZCB3YWl0OyBubyBvdXRwdXQgZG9lcyBub3QgbWVhbiBpdCBoYXMgc3RvcHBlZC4gSWYgdGhlIGRpc3BsYXllZCBleGNlcnB0IGlzIGluc3VmZmljaWVudCwgcmVhZCB0aGUgaW5kaWNhdGVkIGxvZyBmaWxlIGJlZm9yZSByZXJ1bm5pbmcuIElmIHRoZSBlbnZpcm9ubWVudCBraWxscyBsb25nLXJ1bm5pbmcgY29tbWFuZHMsIHJ1biB0aGVtIGRldGFjaGVkIHdpdGggYSBzYXZlZCBsb2cgYW5kIGV4aXQgc3RhdHVzLlxuLSBPbmNlIHZlcmlmaWVkLCBjb21taXQgYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIGFuZCBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAgaWYgbm9uZSBleGlzdHMgZm9yIHRoZSBicmFuY2guXG4gIC0gRm9sbG93IHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBmb3JtYXQgKGUuZy4sIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgKS4ke2NvQXV0aG9ySW5zdHJ1Y3Rpb259XG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0czsgYXZvaWQgXFxgLS1hbWVuZFxcYC4ke3ByVGVtcGxhdGVJbnN0cnVjdGlvbn0ke2lzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbn1cbi0gSW4gYW55IGV4cGxhbmF0b3J5IHRleHQgKGNvbW1pdCBtZXNzYWdlcywgUFIgZGVzY3JpcHRpb25zLCBkb2N1bWVudGF0aW9uLCBjb2RlIGNvbW1lbnRzLCBldGMuKSR7cmVxdWlyZW1lbnRzRXhlbXB0aW9ufSwgZGVzY3JpYmUgb25seSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbjogZHJvcCBhbnkgc3RhdGVtZW50IG5hbWluZyBhbiBpZGVudGlmaWVyLCBmZWF0dXJlLCBvciBjb25jZXB0IHlvdSBjYW5ub3QgY29uZmlybSBleGlzdHMgaW4gdGhlIGZpbmFsIGRpZmYgb3IgdGhlIGN1cnJlbnQgY29kZWJhc2UgKGUuZy4sIG9uZSBhZGRlZCBhbmQgbGF0ZXIgcmVtb3ZlZCBvciByZW5hbWVkIGFsb25nIHRoZSB3YXkpLiBXaGVuZXZlciBkb2N1bWVudGF0aW9uIG9yIGNvbW1lbnRzIG5vIGxvbmdlciBtYXRjaCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAocmVtb3ZlZCBvcHRpb25zLCBkZXByZWNhdGVkIHVzYWdlLCBvdXRkYXRlZCBiZWhhdmlvciksIGRlbGV0ZSBvciByZXdyaXRlIHRoZW0sIGV2ZW4gaW4gZmlsZXMgeW91IGFyZSBub3Qgb3RoZXJ3aXNlIGNoYW5naW5nLiBNZW50aW9uIGEgcGFzdCBzdGF0ZSBvbmx5IHdoZXJlIGl0IGlzIG5lZWRlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGUgY3VycmVudCBkZXNpZ24gaXMgYXMgaXQgaXMsIG9yIHdoZW4gZXhwbGljaXRseSBhc2tlZDsgZmlsZXMgdGhhdCByZWNvcmQgaGlzdG9yeSBieSBkZXNpZ24gKGUuZy4sIGEgY2hhbmdlbG9nKSBhcmUgZXhlbXB0LlxuLSBVc2UgaGVyZWRvYyBmb3IgbXVsdGktbGluZSBjb21tYW5kIGlucHV0IChlLmcuLCBcXGBnaXQgY29tbWl0IC1GIC1cXGAsIFxcYGdoIHByIGNyZWF0ZSAtLWJvZHktZmlsZSAtXFxgLCBcXGBnaCBpc3N1ZSBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCkuXG4tIFB1dCB0ZW1wb3JhcnkgZmlsZXMgaW4gXFxgLnRtcFxcYDsgdXNlIFxcYC90bXBcXGAgb25seSBmb3IgZmlsZXMgdGhhdCBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgcmVwby5cbi0gXFxgQUdFTlRTLm1kXFxgLCBcXGBDTEFVREUubWRcXGAsIFxcYEdFTUlOSS5tZFxcYCwgXFxgLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kY1xcYCwgYW5kIFxcYC5nZW1pbmkvc3R5bGVndWlkZS5tZFxcYCBhcmUgZ2VuZXJhdGVkIGZyb20gXFxgQUdFTlRTX0VYVFJBLm1kXFxgIGFuZCBvdmVyd3JpdHRlbiBvbiBldmVyeSBcXGB3YmZ5XFxgIHJ1bjsgdG8gY2hhbmdlIGFnZW50IGluc3RydWN0aW9ucywgZWRpdCBvbmx5IFxcYEFHRU5UU19FWFRSQS5tZFxcYC4ke21pc2VJbnN0cnVjdGlvbn0ke2lzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9ufSR7Zm5veEluc3RydWN0aW9ufSR7Y2xvdWRmbGFyZUluc3RydWN0aW9ufSR7cmFpbHdheUluc3RydWN0aW9ufSR7cGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbn0ke3J1bm5lckluc3RydWN0aW9ufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShyb290Q29uZmlnLCBhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuLyoqXG4gKiBUaGUgbGFuZ3VhZ2UgYSByZXBvc2l0b3J5IGlzIHdyaXR0ZW4gaW46IEphcGFuZXNlIG9ubHkgaW4gYSBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiXG4gKiByZXBvc2l0b3J5IGNvbmZpcm1lZCBwcml2YXRlLCB3aGVyZSBpdCBzdGlsbCBhcHBsaWVzIG9ubHkgdG8gaXNzdWVzLCBQUiBib2RpZXMsIHJldmlldyBjb21tZW50cyxcbiAqIGFuZCBkb2N1bWVudGF0aW9uIGZvciBwZW9wbGUuIEFuIHVua25vd24gdmlzaWJpbGl0eSAob2ZmbGluZSBydW4sIGZhaWxlZCBsb29rdXApIHlpZWxkcyBFbmdsaXNoIHNvXG4gKiB0aGF0IGEgSmFwYW5lc2UgZGVmYXVsdCBpcyBuZXZlciB3cml0dGVuIGludG8gYSBwdWJsaWMgcmVwb3NpdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRQcm9zZUxhbmd1YWdlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiAnRW5nbGlzaCcgfCAnSmFwYW5lc2UnIHtcbiAgcmV0dXJuIHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gJiYgcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gJiYgIXJvb3RDb25maWcuaXNQdWJsaWNSZXBvXG4gICAgPyAnSmFwYW5lc2UnXG4gICAgOiAnRW5nbGlzaCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gVGF1cmkgZGVza3RvcCBhcHBzIHNoaXAgV2luZG93cyBidWlsZHMsIGFuZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBhcHAgY29kZSBhbmQgc2hhcmVkIGNvZGUgaXNcbiAgLy8gdG9vIGZ1enp5IHRvIHNjb3BlIHRoZSBtYWNPUy9MaW51eC1vbmx5IHJ1bGUgcGVyIHBhY2thZ2UsIHNvIHN1Y2ggcmVwb3NpdG9yaWVzIHRhcmdldCBhbGxcbiAgLy8gdGhyZWUgT1NlcyBpbnN0ZWFkLlxuICBjb25zdCBoYXNEZXNrdG9wQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy50YXVyaSB8fCBjLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKTtcbiAgLy8gQSBwdWJsaWMgcmVwb3NpdG9yeSB3aXRoIG5vIGBAd2lsbGJvb3N0ZXIvYCBwYWNrYWdlIGlzIE9TUyBmb3IgdGhlIGdlbmVyYWwgcHVibGljLCB3aG9zZSB1c2Vyc1xuICAvLyBtYXkgcnVuIFdpbmRvd3MsIHNvIG5vIE9TIHJlc3RyaWN0aW9uIGFwcGxpZXMgdGhlcmUuIEFuIHVua25vd24gdmlzaWJpbGl0eSBjb2xsYXBzZXMgdG9cbiAgLy8gaXNQdWJsaWNSZXBvPWZhbHNlIGFuZCB0aGVyZWZvcmUga2VlcHMgdGhlIHJlc3RyaWN0aXZlIGRlZmF1bHQuXG4gIGNvbnN0IGlzR2VuZXJhbFB1YmxpY09zcyA9XG4gICAgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWxsQ29uZmlncy5ldmVyeSgoYykgPT4gIWMucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIC8vIE9ubHkgcHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHBhY2thZ2VzIHRvIHRoZSBwdWJsaWMgbnBtIHJlZ2lzdHJ5LCB3aG9zZSB1c2VycyByZWFkIHRoZVxuICAvLyBKU0RvYyB3aXRob3V0IHRoZSBzb3VyY2U7IHByaXZhdGUgcmVwb3NpdG9yaWVzIGFyZSByZWFkIG9ubHkgYnkgYWdlbnRzIHRoYXQgaGF2ZSB0aGUgc291cmNlLlxuICBjb25zdCBucG1BcGlFeGNlcHRpb24gPSByb290Q29uZmlnLmlzUHVibGljUmVwb1xuICAgID8gJyBFeGNlcHRpb246IHRoZSBleHBvcnRlZCBBUEkgb2YgYSBwYWNrYWdlIHB1Ymxpc2hlZCB0byBucG0gbWF5IGNhcnJ5IEpTRG9jIGRlc2NyaWJpbmcgd2hhdCBpdCBkb2VzIGFuZCBob3cgdG8gY2FsbCBpdCwgYmVjYXVzZSBpdHMgdXNlcnMgcmVhZCBpdCB3aXRob3V0IHRoZSBzb3VyY2UuJ1xuICAgIDogJyc7XG4gIGNvbnN0IGNvbW1lbnRJbnN0cnVjdGlvbiA9IGAtIENvbW1lbnRzIGFuZCBKU0RvYzogZXZlcnkgcmVhZGVyIGhhcyB0aGUgc291cmNlLCBzbyBuZXZlciByZXN0YXRlIHdoYXQgdGhlIGNvZGUsIGl0cyBuYW1lcywgb3IgaXRzIHR5cGVzIGFscmVhZHkgc2F5IChlLmcuLCBcXGBAcGFyYW0gbmFtZSBUaGUgbmFtZVxcYCkuIFdyaXRlIG9uZSBvbmx5IHdoZW4gYSBwbGF1c2libGUgZWRpdCB3b3VsZCBicmVhayBzb21ldGhpbmcgd2l0aG91dCB0aGF0IGtub3dsZWRnZSBhbmQgbm8gdHlwZSBjaGVjaywgbGludCBydWxlLCBvciB0ZXN0IHdvdWxkIGNhdGNoIGl0OyBmaXJzdCBlbmNvZGUgdGhlIGtub3dsZWRnZSBpbiBjb2RlIChhIG5hbWUsIGEgdHlwZSwgYW4gXFxgYXNzZXJ0XFxgLCBhIHRlc3QpIGFuZCBjb21tZW50IG9ubHkgd2hhdCBjYW5ub3QgYmUgZW5jb2RlZDogYW4gb2RkLWxvb2tpbmcgd29ya2Fyb3VuZCwgYSBkZXBlbmRlbmN5IG9uIGEgZmFjdCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBvciBhIHJlamVjdGVkIGFsdGVybmF0aXZlIGFuZCB3aHkuIFB1dCBhIGNvbnRyYWN0IG9mIHRoZSBkZWNsYXJlZCBzeW1ib2wgaW4gSlNEb2MgYW5kIGxpbmUtc3BlY2lmaWMga25vd2xlZGdlIGluIGFuIGlubGluZSBjb21tZW50LiBEZWxldGUgY29tbWVudHMgdGhhdCBmYWlsIHRoaXMgdGVzdCBpbiBmaWxlcyB5b3UgdG91Y2guJHtucG1BcGlFeGNlcHRpb259YDtcbiAgY29uc3Qgb3NDb21wYXRpYmlsaXR5SW5zdHJ1Y3Rpb24gPSBpc0dlbmVyYWxQdWJsaWNPc3NcbiAgICA/ICcnXG4gICAgOiBoYXNEZXNrdG9wQXBwXG4gICAgICA/ICctIEVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cywgbWFjT1MsIGFuZCBMaW51eC4nXG4gICAgICA6ICctIEVuc3VyZSBjb21wYXRpYmlsaXR5IG9ubHkgd2l0aCBtYWNPUyBhbmQgTGludXg7IGRvIG5vdCBpbmNsdWRlIFdpbmRvd3Mtc3BlY2lmaWMgY29kZS4nO1xuICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgZXhlY3V0ZSBhY3Jvc3MgbWFueSBlcGhlbWVyYWwgaXNvbGF0ZXMgYW5kIHR3byByZXF1ZXN0cyBhcmUgbm90IGd1YXJhbnRlZWRcbiAgLy8gdG8gaGl0IHRoZSBzYW1lIGluc3RhbmNlLCBzbyB0aGUgc2luZ2xlLWluc3RhbmNlIHNpbXBsaWZpY2F0aW9uIHNpbGVudGx5IGxvc2VzIHN0YXRlIHRoZXJlIOKAlFxuICAvLyBidXQgV29ya2VycyBkZWxpYmVyYXRlbHkgcmV1c2UgZXhlY3V0aW9uIGNvbnRleHRzLCBzbyBiZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBzdGF5XG4gIC8vIGxlZ2l0aW1hdGUgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3JlZmVyZW5jZS9ob3ctd29ya2Vycy13b3Jrcy8pLiBUaGVcbiAgLy8gc2lnbmFscyBhcmUgY29ycmVsYXRlZCBQRVIgUEFDS0FHRTogYSBtb25vcmVwbyBjYW4gaG9zdCBhIHNpbmdsZS1pbnN0YW5jZSBzZXJ2ZXIgYXBwIG5leHQgdG9cbiAgLy8gYW4gdW5yZWxhdGVkIFdvcmtlciwgYW5kIG5laXRoZXIgbWF5IG92ZXJyaWRlIHRoZSBvdGhlcidzIHJ1bGUuIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgaXNcbiAgLy8gdGhlIGFjY3VyYXRlIFdvcmtlcnMgc2lnbmFsIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlciBtZW50aW9uIGluIGEgc2NyaXB0IG9yXG4gIC8vIHdvcmtmbG93KS5cbiAgY29uc3QgaGFzV29ya2Vyc0FwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKTtcbiAgY29uc3QgaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHAgPSBhbGxDb25maWdzLnNvbWUoXG4gICAgKGMpID0+IChjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dCkgJiYgIWMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZ1xuICApO1xuICBjb25zdCB3b3JrZXJzSW5zdHJ1Y3Rpb24gPVxuICAgICctIENsb3VkZmxhcmUgV29ya2VycyBydW4gYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzLCBzbyB0d28gcmVxdWVzdHMgbWF5IGhpdCBkaWZmZXJlbnQgaW5zdGFuY2VzOiBuZXZlciBsZXQgY29ycmVjdG5lc3MgZGVwZW5kIG9uIG1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlOyBwZXJzaXN0IGF1dGhvcml0YXRpdmUgc2hhcmVkIHN0YXRlIGluIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpLiBCZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBvZiBub24tcmVxdWVzdC1zY29wZWQgZGF0YSBhcmUgZmluZS4nO1xuICBjb25zdCBzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9uID0gaGFzV29ya2Vyc0FwcFxuICAgID8gaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gYCR7d29ya2Vyc0luc3RydWN0aW9ufSBUaGlzIGFwcGxpZXMgdG8gYWxsIGNvZGUgcnVubmluZyBvbiBDbG91ZGZsYXJlIFdvcmtlcnMgKHRoZSB3cmFuZ2xlci1jb25maWd1cmVkIHBhY2thZ2VzIGFuZCBhbnkgd29ya3NwYWNlIHBhY2thZ2UgdGhleSBpbXBvcnQpOyBhc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgb3RoZXIgc2VydmVyIGFwcHMuYFxuICAgICAgOiB3b3JrZXJzSW5zdHJ1Y3Rpb25cbiAgICA6IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/ICctIEFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuJ1xuICAgICAgOiAnJztcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZmlsZSBuYW1lcyBmb3IgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IChQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzKS5cbi0gU2ltcGxpZnkgY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRhbmN5LlxuLSBEZXNpZ24gbW9kdWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aCBoaWdoIGNvaGVzaW9uIGFuZCBsb3cgY291cGxpbmc7IHNwbGl0IGxhcmdlIG1vZHVsZXMgd2hlbiBuZWVkZWQuXG4tIFBsYWNlIGNhbGxpbmcgZnVuY3Rpb25zIGFib3ZlIHRoZSBmdW5jdGlvbnMgdGhleSBjYWxsICh0b3AtZG93biBvcmRlcik7IHBsYWNlIHZhcmlhYmxlIGFuZCB0eXBlIGRlY2xhcmF0aW9ucyBhYm92ZSB0aGVpciB1c2FnZS5cbiR7Y29tbWVudEluc3RydWN0aW9ufVxuLSBOZXZlciBleHBsYWluIGhvdyBXaWxsQm9vc3RlcidzIGluLWhvdXNlIHRvb2xzIChlLmcuLCBcXGB3YlxcYCwgXFxgd2JmeVxcYCkgd29yayBpbiBjb2RlIGNvbW1lbnRzIG9yIGRvY3VtZW50cyBvdXRzaWRlIHRoZSB0b29sJ3Mgb3duIHBhY2thZ2UsIGV4Y2VwdCBpbiBpbnN0cnVjdGlvbnMgZm9yIEFJIGFnZW50cyAoZS5nLiwgZG8gbm90IG5vdGUgdGhhdCBcXGBQT1JUXFxgIGlzIHVuc2V0IGJlY2F1c2UgXFxgd2JcXGAgcGlja3MgYSBmcmVlIHBvcnQpLlxuLSBJZiBsaW50IGVycm9ycyBvciB3YXJuaW5ncyBjYW5ub3QgYmUgZml4ZWQsIHVzZSBpZ25vcmUgY29tbWVudHMgd2l0aCByZWFzb25zIChlLmcuLCBcXGAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgPHJ1bGU+IC0tIDxyZWFzb24+XFxgKS5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBWYWxpZGF0ZSBKYXZhU2NyaXB0IG9iamVjdHMgKGUuZy4sIHBhcnNlZCBKU09OLCBBUEkgcmVzcG9uc2VzKSB3aXRoIFxcYHpvZFxcYCB3aGVuZXZlciBwb3NzaWJsZSBpbnN0ZWFkIG9mIGhhbmQtd3JpdHRlbiBjaGVja3Mgb3IgdHlwZSBhc3NlcnRpb25zLlxuLSBCdWlsZCBwcm9tcHRzIGFzIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgb24gYSBwcmUtY29tcHV0YWJsZSBhcnJheSBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZDsgaWYgdmFsaWRhdGlvbiBpcyBuZWVkZWQsIFxcYGFzc2VydFxcYCB0aGVtIGF0IHN0YXJ0dXAgdG8gZmFpbCBmYXN0LlxuLSBBc3N1bWUgbG9jYWwgdG9vbHMgc3VjaCBhcyBcXGBnaXRcXGAsIFxcYGdoXFxgLCBhbmQgXFxgZ2hxXFxgIGFyZSBpbnN0YWxsZWQgYW5kIGF1dGhlbnRpY2F0ZWQuXG4ke29zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9ufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBSZWdpc3RlciBzdHJpbmcgbGl0ZXJhbHMgZm9yIFJlYWN0IGNvbXBvbmVudHMgaW4gdGhlIFxcYGkxOG5cXGAgcmVzb3VyY2UgZmlsZXMgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGUgXFxgaTE4blxcYCB1dGlsaXR5IChlLmcuLCBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgKS5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIG92ZXIgXFxgdXNlU3RhdGVcXGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbi0gVXNlIFxcYGF1dG9Gb2N1c1xcYCB3aGVyZSBpdCByZWR1Y2VzIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIGN1cnJlbnQgd2ViLWFwcCBmcmFtZXdvcmsgYW5kIGVuYWJsZXMgdGhlIFJlYWN0IENvbXBpbGVyIGp1c3QgYXMgTmV4dC5qc1xuICAvLyBkb2VzLCBzbyBpdCBtdXN0IG5vdCBtaXNzIHRoaXMgcnVsZS5cbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGBcbi0gVGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCBzbyBcXGB1c2VDYWxsYmFja1xcYCBhbmQgXFxgdXNlTWVtb1xcYCBhcmUgdW5uZWNlc3NhcnkgZm9yIHBlcmZvcm1hbmNlLlxuYFxuICAgIDogJydcbn1cbiR7c2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsIiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCByZWxlYXNlQWdlR2F0ZSBmcm9tICcuLi8uLi9jb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgICBnbG9iYWxTdG9yZT86IGJvb2xlYW47XG4gICAgbGlua2VyPzogc3RyaW5nO1xuICAgIG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXM/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuLy8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uIGlzIHRoZSBvcmdhbml6YXRpb24ncyBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgcG9saWN5OiB0aGVcbi8vIG1hY2hpbmVzJyBnbG9iYWwgY29uZmlncyBnZXQgaXQgdGhyb3VnaCBjb25maWdzL2FwcGx5UmVsZWFzZUFnZUdhdGUuc2ggKHJ1biBieSB3YmZ5IGl0c2VsZiwgYnlcbi8vIHJldXNhYmxlLXdvcmtmbG93cyBvbiBDSSwgYW5kIGJ5IHNlbGYtaG9zdC11dGlscyBvbiB0aGUgcnVubmVycyksIGFuZCByZXBvc2l0b3JpZXMgZ2V0IGl0IGhlcmUuXG4vLyBPdXIgb3duIHBhY2thZ2VzIGFyZSBleGVtcHQ6IHdlIGNvbnRyb2wgd2hvIHB1Ymxpc2hlcyB0aGVtLCBzbyBhIGNvbXByb21pc2VkIHJlbGVhc2UgY2Fubm90XG4vLyByZWFjaCB1cyB0aHJvdWdoIGFuIHVwc3RyZWFtIG1haW50YWluZXIncyBzdG9sZW4gY3JlZGVudGlhbHMuIFRoYXQgY292ZXJzIGV2ZXJ5XG4vLyBAd2lsbGJvb3N0ZXItcHJpdmF0ZSBwYWNrYWdlICh0aGUgc2NvcGUgcmVzb2x2ZXMgb25seSBmcm9tIG91ciBvd24gcmVnaXN0cnkpLCBidXQgYnVuLCBucG0sIGFuZFxuLy8gWWFybiBtYXRjaCBleGNsdWRlIGVudHJpZXMgYnkgZXhhY3QgbmFtZSDigJQgbm8gQHNjb3BlLyogcGF0dGVybnMg4oCUIHNvIGVhY2ggbmV3IHBhY2thZ2UgaW4gdGhlXG4vLyBzY29wZSBtdXN0IGJlIGFkZGVkIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiB3aGVuIGl0IGlzIGZpcnN0IHB1Ymxpc2hlZC4gVGhlIG9ubHkgcGVybWFuZW50XG4vLyB0aGlyZC1wYXJ0eSBleGVtcHRpb24gaXMgdGhlIENvZGV4IENMSSwgd2hvc2UgbmV3ZXN0IG1vZGVscyBydW4gb25seSBvbiBpdHMgbGF0ZXN0IHJlbGVhc2VzLlxuLy8gT3RoZXIgdGhpcmQtcGFydHkgcGFja2FnZXMg4oCUIGluY2x1ZGluZyB0b29saW5nIHdiZnkgcGlucyBpdHNlbGYg4oCUIHN0YXkgYWdlLWdhdGVkO1xuLy8gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbiBpbiBwYWNrYWdlSnNvbi50cyBwaW5zIHRoZSBuZXdlc3QgcmVsZWFzZSBvbGQgZW5vdWdoIHRvIHBhc3Ncbi8vIHRoZSBnYXRlLCBzbyBwaW5uaW5nIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBhbiBleGVtcHRpb24uIGB0ZW1wb3JhcnlFeGNsdWRlc2AgbGV0cyBhIHRoaXJkLXBhcnR5XG4vLyByZWxlYXNlIG5lZWRlZCBub3cgKGEgc2VjdXJpdHkgZml4LCBvciBhbiBTREsgYSBuZXcgbW9kZWwgcmVxdWlyZXMpIGluIGltbWVkaWF0ZWx5IGFuZCBnYXRlcyB0aGVcbi8vIHBhY2thZ2UgYWdhaW4gZnJvbSB0aGUgZ2l2ZW4gVVRDIGRhdGUsIHNvIHRoZSBuZXh0IHdiZnkgcnVuIHJlc3RvcmVzIHRoZSBnYXRlIHdpdGhvdXQgYW55b25lXG4vLyBoYXZpbmcgdG8gcmVtZW1iZXIgdG8gcmVtb3ZlIHRoZSBlbnRyeS4gTGlzdCBldmVyeSBwYWNrYWdlIHRoYXQgcmVsZWFzZSBwaW5zIGV4YWN0bHkgYW5kXG4vLyBwdWJsaXNoZXMgYWxvbmdzaWRlIGl0LCBzaW5jZSBleGNsdXNpb24gbWF0Y2hlcyBleGFjdCBuYW1lcyBvbmx5LlxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyA9IHJlbGVhc2VBZ2VHYXRlLmRheXMgKiAyNCAqIDYwICogNjA7XG5jb25zdCB0b2RheSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG5leHBvcnQgY29uc3QgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgLi4ucmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMsXG4gIC4uLk9iamVjdC5lbnRyaWVzKHJlbGVhc2VBZ2VHYXRlLnRlbXBvcmFyeUV4Y2x1ZGVzKVxuICAgIC5maWx0ZXIoKFssIGdhdGVkQWdhaW5Gcm9tXSkgPT4gdG9kYXkgPCBnYXRlZEFnYWluRnJvbSlcbiAgICAubWFwKChbcGFja2FnZU5hbWVdKSA9PiBwYWNrYWdlTmFtZSksXG5dO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlcG9zaXRvcnkncyBidW5maWcudG9tbCBsaXN0cyB0b2RheSdzIGV4ZW1wdGlvbnMuIGB0ZW1wb3JhcnlFeGNsdWRlc2AgY2hhbmdlcyB0aGVtIGJ5XG4gKiBkYXRlIGFsb25lLCBzbyBhIHJlcG9zaXRvcnkgYWxyZWFkeSBjb25maWd1cmVkIGJ5IHRoZSBydW5uaW5nIHdiZnkgYnVpbGQgbXVzdCBub3QgYmUgc2tpcHBlZFxuICogb25jZSB0aGV5IGRpZmZlciwgb3IgYW4gZXhwaXJlZCBleGVtcHRpb24gd291bGQgb3V0bGl2ZSBpdHMgZGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0N1cnJlbnRCdW5SZWxlYXNlQWdlRXhjbHVkZXMocm9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybiB0cnVlO1xuICBjb25zdCBleGNsdWRlcyA9IHBhcnNlQnVuZmlnVG9tbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpPy5pbnN0YWxsPy5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzO1xuICByZXR1cm4gZXhjbHVkZXM/LmpvaW4oJ1xcbicpID09PSBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLmpvaW4oJ1xcbicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcGFyc2VCdW5maWdUb21sKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk/Lmluc3RhbGw/Lmdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKFxuICBjb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHNraXBEZXBzOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVmYXVsdFVzZUdsb2JhbFN0b3JlID0gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlncyk7XG4gIHJldHVybiBza2lwRGVwcyA/IChwcmV2aW91c0dsb2JhbFN0b3JlID8/IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSkgOiBkZWZhdWx0VXNlR2xvYmFsU3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VCdW5HbG9iYWxTdG9yZShjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgLy8gQmxpdHogYnVpbGRzIG9uIE5leHQuanMgYnV0IG5lZWQgbm90IGRlY2xhcmUgaXQgZGlyZWN0bHksIGFuZCBpdHMgY29kZWdlbiBhbHNvIHBhdGNoZXMgTmV4dFxuICAvLyBpbnNpZGUgbm9kZV9tb2R1bGVzLiBCb3RoIGZyYW1ld29ya3MgdGhlcmVmb3JlIHJlcXVpcmUgcHJvamVjdC1sb2NhbCBpc29sYXRlZCBpbnN0YWxscy5cbiAgLy8gU2xpZGV2IGxvYWRzIG9wdGlvbmFsIFZ1ZSBjb21waWxlciBwZWVycyB0aHJvdWdoIGxvY2FsLXBrZy4gVGhlIGdsb2JhbCBzdG9yZSByZWFscGF0aHNcbiAgLy8gbG9jYWwtcGtnIG91dHNpZGUgdGhlIHByb2plY3QsIHNvIE5vZGUgY2Fubm90IHJlc29sdmUgYSBjb21waWxlciBkZWNsYXJlZCBieSB0aGUgcHJvamVjdC5cbiAgcmV0dXJuICFjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5zbGlkZXYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCwgdXNlR2xvYmFsU3RvcmUpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLCB1c2VHbG9iYWxTdG9yZTogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgLy8gbWluaW11bVJlbGVhc2VBZ2UgYW5kIG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgYXJlIG9yZyBwb2xpY3ksIG5ldmVyIHJlcG9zaXRvcnkgcG9saWN5OiBib3RoXG4gIC8vIGFyZSByZXdyaXR0ZW4gdG8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uJ3MgdmFsdWVzIG9uIGV2ZXJ5IHJ1biwgc28gYSBoYW5kLWVkaXRlZCAod2Vha2VuZWQpXG4gIC8vIGdhdGUgY2Fubm90IHN1cnZpdmUgcmVnZW5lcmF0aW9uLiBEcm9wcGluZyByZXBvc2l0b3J5LXNwZWNpZmljIGV4Y2x1ZGUgZW50cmllcyBpcyBmYWlsLXNhZmUg4oCUIGFuXG4gIC8vIHVuY292ZXJlZCBwYWNrYWdlIGJlY29tZXMgYWdlLWdhdGVkIGFuZCBzdXJmYWNlcyBhdCBpbnN0YWxsIHRpbWUgaW5zdGVhZCBvZiB3ZWFrZW5pbmcgdGhlIGdhdGUuXG4gIC8vIFR1cmJvcGFjayByZWplY3RzIGdsb2JhbC1zdG9yZSBzeW1saW5rcyBiZWNhdXNlIHRoZXkgcmVzb2x2ZSBvdXRzaWRlIGl0cyBmaWxlc3lzdGVtIHJvb3QuXG4gIC8vIEtlZXBpbmcgTmV4dC5qcyBpbnN0YWxscyBwcm9qZWN0LWxvY2FsIGF2b2lkcyB3aWRlbmluZyB0aGF0IHJvb3QgdG8gJEhPTUUgKG9yIGAvYCBpbiBEb2NrZXIpLFxuICAvLyB3aGljaCB3b3VsZCBleHBhbmQgZGV2ZWxvcG1lbnQgZmlsZXN5c3RlbSB3YXRjaGluZyBhbmQgYnlwYXNzIHRoZSBib3VuZGFyeSdzIGNhY2hlIGJlbmVmaXRzLlxuICBjb25zdCBnbG9iYWxTdG9yZUxpbmUgPSB1c2VHbG9iYWxTdG9yZSA/ICdnbG9iYWxTdG9yZSA9IHRydWUnIDogJ2dsb2JhbFN0b3JlID0gZmFsc2UnO1xuICAvLyBObyBgW3J1bl0gYnVuID0gdHJ1ZWA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzXG4gIC8vIHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpOyBhbnkgZXhpc3Rpbmcgc2V0dGluZyBpcyBkcm9wcGVkLlxuICAvLyBwdWJsaWNIb2lzdFBhdHRlcm4g4oCUIHRzeDogYnVpbGQtdHMgdW5kZXIgTm9kZS5qcyBzcGF3bnMgYG5vZGUgLS1pbXBvcnQgdHN4YCwgd2hpY2ggcmVzb2x2ZXNcbiAgLy8gdHN4IGZyb20gdGhlIGNvbnN1bWVyIHBhY2thZ2UncyBkaXJlY3RvcnksIG5vdCBmcm9tIGJ1aWxkLXRzJ3Mgb3duIGRlcGVuZGVuY2llcy5cbiAgLy8gdW5kaWNpLXR5cGVzOiBidW4tdHlwZXMgcmVmZXJlbmNlcyBpdCB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KTtcbiAgLy8gZ2VuZXJhdGVkIHRzY29uZmlncyBhbHNvIG1hcCB1bmRpY2ktdHlwZXMgdG8gdGhlIGhvaXN0ZWQgY29weSAoc2VlIHRzY29uZmlnLnRzKSBiZWNhdXNlIHRoZVxuICAvLyBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzIGJ1bi10eXBlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2V4dHJhY3RSYXdUZXN0U2VjdGlvbnMoZXhpc3RpbmdDb250ZW50KX1baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxuJHtnbG9iYWxTdG9yZUxpbmV9XG5saW5rZXIgPSBcImlzb2xhdGVkXCJcbnB1YmxpY0hvaXN0UGF0dGVybiA9IFtcInRzeFwiLCBcInVuZGljaS10eXBlc1wiXVxubWluaW11bVJlbGVhc2VBZ2UgPSAke2J1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kc31cbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke2J1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuLyoqXG4gKiBQcmVzZXJ2ZSB0aGUgcHJvamVjdCdzIGBbdGVzdF1gIHNlY3Rpb25zIChlLmcuIHByZWxvYWQgc2NyaXB0cyBzd2FwcGluZyBhIENsb3VkZmxhcmUgRDEgY2xpZW50XG4gKiBmb3IgYSBsb2NhbCBTUUxpdGUgb25lKSB2ZXJiYXRpbSwgY29tbWVudHMgaW5jbHVkZWQ7IHdiZnkgbWFuYWdlcyBvbmx5IHRoZSBvdGhlciBzZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSYXdUZXN0U2VjdGlvbnMoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50KSByZXR1cm4gJyc7XG5cbiAgY29uc3QgcHJlc2VydmVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpblRlc3RTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHNlY3Rpb25NYXRjaCA9IC9eXFxzKlxcWyhbXlxcXV0rKVxcXS8uZXhlYyhsaW5lKTtcbiAgICBpZiAoc2VjdGlvbk1hdGNoKSB7XG4gICAgICBpblRlc3RTZWN0aW9uID0gc2VjdGlvbk1hdGNoWzFdID09PSAndGVzdCcgfHwgKHNlY3Rpb25NYXRjaFsxXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoJ3Rlc3QuJyk7XG4gICAgfVxuICAgIGlmIChpblRlc3RTZWN0aW9uICYmIGxpbmUudHJpbSgpKSB7XG4gICAgICBwcmVzZXJ2ZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlc2VydmVkTGluZXMubGVuZ3RoID4gMCA/IGAke3ByZXNlcnZlZExpbmVzLmpvaW4oJ1xcbicpfVxcblxcbmAgOiAnJztcbn1cblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZSBkZXBsb3lzIEdpdC1iYXNlZCBwcml2YXRlIHBhY2thZ2VzIGZyb20gbm9kZV9tb2R1bGVzLCBidXQgdGhlIERvY2tlciBjb250ZXh0IHNob3VsZCBzdGF5IG5hcnJvdy5cbmNvbnN0IGluY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJucyA9IFsnQHdpbGxib29zdGVyJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4uZW52KlxuKiovLkRTX1N0b3JlXG4qKi8uY2FjaGVcbioqLy5jbGF1ZGVcbioqLy5jdXJzb3JcbioqLy5lZGl0b3Jjb25maWdcbioqLy5lc2xpbnRjYWNoZVxuKiovLmdlbWluaVxuKiovLmdpdFxuKiovLmdpdGF0dHJpYnV0ZXNcbioqLy5naXRodWJcbioqLy5naXRpZ25vcmVcbioqLy5pZGVhXG4qKi8ubGVmdGhvb2tcbioqLy5teXB5X2NhY2hlXG4qKi8ubmV4dC9jYWNoZVxuKiovLm5wbVxuKiovLnBhcmNlbC1jYWNoZVxuKiovLnBucG0tc3RvcmVcbioqLy5weXRlc3RfY2FjaGVcbioqLy5yYWlsd2F5aWdub3JlXG4qKi8ucmVsZWFzZXJjLmpzb25cbioqLy5ydWZmX2NhY2hlXG4qKi8udG1wXG4qKi8udG1wLSovKipcbioqLy50dXJib1xuKiovLnRveFxuKiovLnZzY29kZVxuKiovLnlhcm4vY2FjaGVcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG4qKi9fX3B5Y2FjaGVfX1xuKiovKi5sb2dcbioqLyoucHljXG4qKi8qLnRzYnVpbGRpbmZvXG4qKi9jb3ZlcmFnZVxuKiovbm9kZV9tb2R1bGVzLyoqXG4ke2luY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJuc1xuICAubWFwKFxuICAgIChwYXR0ZXJuKSA9PiBgISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59XG4hKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn0vKipgXG4gIClcbiAgLmpvaW4oJ1xcbicpfVxuKiovbm9kZV9tb2R1bGVzLy5jYWNoZVxuKiovcGxheXdyaWdodC1yZXBvcnRcbioqL3N0b3J5Ym9vay1zdGF0aWNcbioqL3RhcmdldFxuKiovdGVzdC1yZXN1bHRzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIG94bGludDogWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10udG9Tb3J0ZWQoKSxcbiAgb3hmbXQ6IFtcbiAgICAnYXN0cm8nLFxuICAgICdjanMnLFxuICAgICdjc3MnLFxuICAgICdjdHMnLFxuICAgICdncWwnLFxuICAgICdncmFwaHFsJyxcbiAgICAnaGJzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ2pzJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdqc3gnLFxuICAgICdsZXNzJyxcbiAgICAnbWQnLFxuICAgICdtZHgnLFxuICAgICdtanMnLFxuICAgICdtdHMnLFxuICAgICdzY3NzJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAndG9tbCcsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXJPbmx5OiBbJ2phdmEnXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlLCBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZSwgcmVhZEFnZW50c0V4dHJhQ29udGVudCB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55YW1sJyk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcblxuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbENvbmZpZyA9ICEhKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSkpO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxDb25maWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2NvbmZpZ0ZpbGVQYXRofSBiZWNhdXNlICR7bm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGh9IGlzIG5vdCBhIHN1cHBvcnRlZCBHZW1pbmkgY29uZmlnIGxvY2F0aW9uLiBSZW5hbWUgaXQgbWFudWFsbHkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGVmYXVsdENvbmZpZyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IHVuZGVmaW5lZCA6IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoY29uZmlnRmlsZVBhdGgpO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9sZENvbmZpZyA9IEJ1bi5ZQU1MLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgICAvLyBNZXJnZSBvbmx5IGEgbWFwcGluZzogZW1wdHksIGNvbW1lbnQtb25seSwgb3Igc2NhbGFyIFlBTUwgd291bGQgZWl0aGVyIHRocm93IGluXG4gICAgICAgIC8vIG1lcmdlLmFsbCBvciBwb2xsdXRlIHRoZSBjb25maWcgd2l0aCBpbmRleCBrZXlzLlxuICAgICAgICBpZiAob2xkQ29uZmlnICYmIHR5cGVvZiBvbGRDb25maWcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9sZENvbmZpZykpIHtcbiAgICAgICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgY2FuJ3QgYmUgcGFyc2VkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBCdW4uWUFNTC5zdHJpbmdpZnkobmV3Q29uZmlnLCB1bmRlZmluZWQsIDIpO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYFJldmlldyBpbiAke2dldERlZmF1bHRQcm9zZUxhbmd1YWdlKGNvbmZpZyl9IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy5cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShjb25maWcsIGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBhd2FpdCBydW5BbGxJblBvb2woW1xuICAgICAgLi4uKGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IFtdIDogWygpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KV0pLFxuICAgICAgKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBnaXRPdXRwdXRNYXhCdWZmZXIgPSA2NCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG4vLyBgLmdpdGlnbm9yZSAtdGV4dGAga2VlcHMgdGhlIG1hY09TIHRlbXBsYXRlJ3MgYEljb25cXHJcXHJgIHJ1bGUgaW50YWN0OiBgdGV4dD1hdXRvYCBub3JtYWxpemF0aW9uXG4vLyBzdHJpcHMgb25lIENSIHBlciBjaGVja2luLCBkZWdyYWRpbmcgdGhlIHJ1bGUgdW50aWwgaXQgbWF0Y2hlcyBub3RoaW5nLlxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4uZ2l0aWdub3JlIC10ZXh0XG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzKGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBsZXQgb3V0cHV0OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gY2hpbGRfcHJvY2Vzcy5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS1lb2wnLCAnLXonXSwge1xuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIG1heEJ1ZmZlcjogZ2l0T3V0cHV0TWF4QnVmZmVyLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB0cmFja2VkIGxpbmUtZW5kaW5nIHJlbm9ybWFsaXphdGlvbjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCByZW5vcm1hbGl6ZWRDb3VudCA9IDA7XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIG91dHB1dC5zcGxpdCgnXFwwJykpIHtcbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHJlY29yZC5pbmRleE9mKCdcXHQnKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSByZWNvcmQuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpO1xuICAgIC8vIE9ubHkgYHRleHRgIHdpdGggYGVvbGAgY29udmVydHMgYSBibG9iIHRoYXQgYWxyZWFkeSBob2xkcyBDUiBpbiB0aGUgaW5kZXg6IEdpdCBrZWVwcyBzdWNoIGEgYmxvYiB1bmRlclxuICAgIC8vIGB0ZXh0PWF1dG9gLCBldmVuIHdpdGggYGVvbGAsIHNvIENScyB0aGVyZSBhcmUgY29udGVudCAoZS5nLiBhIGZpeHR1cmUgdGVzdGluZyBDUikgYW5kIG11c3Qgc3RheS5cbiAgICBpZiAoIS9eaVxcLyg/OmNybGZ8bWl4ZWQpXFxzL3UudGVzdChhdHRyaWJ1dGVzKSB8fCAhL1xcc2F0dHJcXC90ZXh0IGVvbD0oPzpsZnxjcmxmKSg/Olxcc3wkKS91LnRlc3QoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlY29yZC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIGNvbnN0IHRyYWNrZWRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHN0YXRzID0gZnMubHN0YXRTeW5jKHRyYWNrZWRGaWxlUGF0aCwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgaWYgKCFzdGF0cz8uaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2l0J3Mgc3RhdCBjYWNoZSBjYW4gaGlkZSBwcmUtZXhpc3RpbmcgQ1JMRiBibG9icyBhZnRlciB3YmZ5IGludHJvZHVjZXMgdGV4dCBhdHRyaWJ1dGVzLlxuICAgIC8vIE5vcm1hbGl6ZSBieXRlcyBpbiB0aGUgd29ya3RyZWUgc28gdGhlIGNhbGxlcidzIG5vcm1hbCBgZ2l0IGFkZCAtQWAgcmVjb3JkcyB0aGUgY2Fub25pY2FsXG4gICAgLy8gYmxvYjsgdGhpcyBhbHNvIHByZXZlbnRzIFByZXR0aWVyJ3MgbWV0YWRhdGEgY2FjaGUgZnJvbSBza2lwcGluZyB0aGUgbmV3bHkgY2hhbmdlZCBmaWxlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModHJhY2tlZEZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCwgQnVmZmVyLmZyb20oY29udGVudC50b1N0cmluZygnYmluYXJ5JykucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLCAnYmluYXJ5JykpO1xuICAgIHJlbm9ybWFsaXplZENvdW50Kys7XG4gIH1cbiAgaWYgKHJlbm9ybWFsaXplZENvdW50ID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVub3JtYWxpemVkIGxpbmUgZW5kaW5ncyBpbiAke3Jlbm9ybWFsaXplZENvdW50fSB0cmFja2VkIGZpbGUocykuYCk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG5fX2dlbmVyYXRlZF9fL1xuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZG9ja2VyLmVudlxuLmVudipcbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50bXAtKi9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG5Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICAvLyBFdmVyeSBhY2NlcHRlZCByZXBvc2l0b3J5IHJvb3QgcmVjZWl2ZXMgYSBtYW5hZ2VkIHBhY2thZ2UuanNvbiBsYXRlciBpbiB0aGUgc2FtZSBydW4sIHNvIGl0c1xuICAgIC8vIGRlcGVuZGVuY3kgdHJlZSBtdXN0IGJlIGlnbm9yZWQgZXZlbiB3aGVuIHRoZSBtYW5pZmVzdCBkaWQgbm90IGV4aXN0IGF0IGNvbmZpZy1kZXRlY3Rpb24gdGltZS5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHwgY29uZmlnLmlzUm9vdCkge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3QgcG9tLnhtbCk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBpdHMgTWF2ZW5cbiAgICAvLyBtb2R1bGVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmQgZHJvcHBpbmcgdGhlIG1hdmVuIHRlbXBsYXRlIHdvdWxkIGxldCB0YXJnZXQvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnkuIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdFxuICAgIC8vIGxvY2tmaWxlKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIFB5dGhvbiBkaXJlY3RvcmllcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kXG4gICAgLy8gZHJvcHBpbmcgdGhlIHB5dGhvbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgX19weWNhY2hlX18vIGFuZCAudmVudi8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZC5cbiAgICAgIC8vIC5lbnYuY2xvdWRmbGFyZSBjYXJyaWVzIENMT1VERkxBUkVfQVBJX1RPS0VOOiBDSSB3cml0ZXMgaXQgZnJvbSBhIHNlY3JldCwgYW5kIGEgbG9jYWxcbiAgICAgIC8vIGB3YiBkZXBsb3lgIG5lZWRzIGEgcmVhbCB0b2tlbiBpbiBpdCwgc28gY29tbWl0dGluZyBpdCB3b3VsZCBsZWFrIGFjY291bnQgY3JlZGVudGlhbHMuXG4gICAgICAvLyBJdCBpcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGUgQ2xvdWRmbGFyZS1zcGVjaWZpYyBjcmVkZW50aWFsIHBvbGljeSByZW1haW5zIHZpc2libGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi5lbnYuY2xvdWRmbGFyZVxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSBvcHQtb3V0IGRlbGV0aW9uIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiAhY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAvLyBPbiBhIGdlbnVpbmUgd29ya2VyLXR5cGVzIG9wdC1vdXQgKG5vdGhpbmcgY29uc3VtZXMgdGhlIGdlbmVyYXRlZCBmaWxlOyBnZW5lcmF0ZXNXb3JrZXJUeXBlc1xuICAgICAgLy8gYWxvbmUgaXMgZmFsc2UgZm9yIHVucmVsYXRlZCByZWFzb25zIHN1Y2ggYXMgYSBtaXNzaW5nIGxvY2FsIHdyYW5nbGVyIGRlcGVuZGVuY3ksIHdoZXJlIHRoZVxuICAgICAgLy8gZmlsZSBtYXkgc3RpbGwgYmUgY29uc3VtZWQpIHRoZSBpZ25vcmUgcnVsZVxuICAgICAgLy8gYWJvdmUgZGlzYXBwZWFycywgc28gYW4gYWxyZWFkeS1nZW5lcmF0ZWQgZmlsZSB3b3VsZCBzdXJmYWNlIGFzIHVudHJhY2tlZCBub2lzZSBvbiBldmVyeVxuICAgICAgLy8gY2hlY2tvdXQg4oCUIGRlbGV0ZSBpdC4gTm8gcmVwb3NpdG9yeSB0cmFja3MgdGhlIGZpbGUgKGRvY3MvZXhwZWN0ZWQtcmVwb3NpdG9yeS1ydWxlcy5tZCksXG4gICAgICAvLyBzbyBhbiBleGlzdGluZyBjb3B5IGlzIGFsd2F5cyBhIGRpc3Bvc2FibGUgZ2VuZXJhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtlclR5cGVzUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzLnByb21pc2VzLnJtKHdvcmtlclR5cGVzUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBnaXRpZ25vcmUgdHJlYXRzIGAjYCBhcyBhIGNvbW1lbnQgb25seSBhdCBsaW5lIHN0YXJ0LCBzbyBhIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4sIHZpbSdzIGAhKi5zdmcgICMgLi4uYClcbiAgICAvLyB0dXJucyB0aGUgd2hvbGUgbGluZSBpbnRvIGEgcGF0dGVybiB0aGF0IG5ldmVyIG1hdGNoZXMuXG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oW14jXFxzXS4qPylbIFxcdF0rKCMuKikkL2dtLCAnJDJcXG4kMScpO1xuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRXYmZ5RGlyUGF0aCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIEdMT0JBTFxuICogcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuIFJlcG9zaXRvcnkgY29uZmlncyBndWFyZCBvbmx5IHdiZmllZCByZXBvc2l0b3JpZXM7IGEgYnJhbmQtbmV3IGxvY2FsXG4gKiBwcm9qZWN0IGhhcyBubyBidW5maWcudG9tbCB5ZXQsIHNvIHRoZSBnbG9iYWwgZmlsZXMgYXJlIHRoZSBvbmx5IGdhdGUgYmV0d2VlbiBgYnVuIGNyZWF0ZWAgL1xuICogYG5wbSBpbml0YCBhbmQgYSBmcmVzaGx5IGNvbXByb21pc2VkIHJlbGVhc2UuIFRoZSBzYW1lIHNjcmlwdCBydW5zIG9uIENJIGFuZCBvbiB0aGUgc2VsZi1ob3N0ZWRcbiAqIHJ1bm5lcnMsIHNvIGV2ZXJ5IG1hY2hpbmUgZW5kcyB1cCB3aXRoIGJ5dGUtaWRlbnRpY2FsIHNldHRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk6IGJvb2xlYW4ge1xuICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKCdiYXNoJywgW3BhdGguam9pbihnZXRXYmZ5RGlyUGF0aCgpLCAnY29uZmlncycsICdhcHBseVJlbGVhc2VBZ2VHYXRlLnNoJyldLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFwcGx5IHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGUgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzLicpO1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSnNPclRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YSB8fCBjb25maWcuZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+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/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAsIHF1b3RlRm9yU2hlbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi4vdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbiAgaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0RGVwZW5kZW5jeSA9ICd0eXBlc2NyaXB0Jztcbi8vIFR5cGVTY3JpcHQgNydzIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIG5hdGl2ZSBjb21waWxlciBhbmQgZXhwb3NlcyBub1xuLy8gcHJvZ3JhbW1hdGljIEFQSS4gTmV4dC5qcydzIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgbmVlZHMgdGhhdCBBUEksIHNvXG4vLyBgbmV4dCBidWlsZGAgZmFpbHMgKFwidHJ5aW5nIHRvIHVzZSBUeXBlU2NyaXB0IGJ1dCBkbyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGFja2FnZShzKVwiKVxuLy8gd2l0aCBvbmx5IGB0eXBlc2NyaXB0YCB2NyBpbnN0YWxsZWQuIE5leHQuanMgcmVzb2x2ZXMgdGhlIHRzZ28gYmluYXJ5IHRocm91Z2ggdGhlXG4vLyBzZXBhcmF0ZSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgIHBhY2thZ2UsIHNvIE5leHQuanMtZmFtaWx5IHJlcG9zIG11c3QgaW5zdGFsbFxuLy8gYm90aDsgb3RoZXIgcmVwb3Mgb25seSBuZWVkIGB0eXBlc2NyaXB0YCBmb3IgYHRzY2AgdHlwZWNoZWNrcy5cbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCBsZWZ0aG9va0RlcGVuZGVuY3kgPSAnbGVmdGhvb2snO1xuY29uc3QgbWFuYWdlZERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoW1xuICB3YkRlcGVuZGVuY3ksXG4gIGJ1aWxkVHNEZXBlbmRlbmN5LFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHREZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0R29EZXBlbmRlbmN5LFxuICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAvLyBNaXhlZCBAdHlwZXMvYnVuIHZlcnNpb25zIGFjcm9zcyBhIG1vbm9yZXBvIGxvYWQgdHdvIGJ1bi10eXBlcyBjb3BpZXMsIHdoaWNoXG4gIC8vIGJyZWFrcyBnbG9iYWwgaW50ZXJmYWNlIG1lcmdpbmcgKGUuZy4gUmVzcG9uc2UvSGVhZGVycykgZHVyaW5nIHR5cGUgY2hlY2tpbmcuXG4gICdAdHlwZXMvYnVuJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBwYWNrYWdlQWdlR2F0ZU1zID0gYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzICogMTAwMDtcbmNvbnN0IG5wbVBhY2thZ2VUaW1lc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd29ya2VyVHlwZXNTY3JpcHRFcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoY29uZmlnKTtcbiAgaWYgKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpIHRocm93IG5ldyBFcnJvcih3b3JrZXJUeXBlc1NjcmlwdEVycm9yKTtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAvLyBPbiBhIGZpcnN0IHJ1biB0aGVyZSBpcyBubyBtYW5pZmVzdCBmb3IgYGJ1biBhZGRgIHRvIHVwZGF0ZSByZWxpYWJseS4gV3JpdGUgdGhlIHJlc29sdmVkXG4gIC8vIGRlcGVuZGVuY3kgdmVyc2lvbnMgaW50byB0aGUgbmV3IG1hbmlmZXN0IGRpcmVjdGx5OyB0aGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGBidW4gaW5zdGFsbGBcbiAgLy8gdGhlbiBpbnN0YWxscyB0aGVtIGFuZCByZW1haW5zIHRoZSBhdXRob3JpdGF0aXZlIGZhaWx1cmUgY2hlY2suXG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBkZXBlbmRlbmN5VXBkYXRlcyxcbiAgICBza2lwQWRkaW5nRGVwcyB8fCAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb25cbiAgKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgLy8gQSByZWZ1c2VkIHdyaXRlIChlLmcuIGEgc3ltbGlua2VkIHBhY2thZ2UuanNvbikgbXVzdCBhbHNvIGFib3J0IHRoZSBkZXBlbmRlbmN5IGluc3RhbGxhdGlvblxuICAvLyBiZWxvdzogYGJ1biBhZGRgIGZvbGxvd3MgdGhlIHN5bWxpbmsgYW5kIHdvdWxkIG1vZGlmeSB0aGUgZmlsZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSkpKSByZXR1cm47XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgICAvLyBBIG5ld2x5IGNyZWF0ZWQgbWFuaWZlc3QgaXMgYWxyZWFkeSBzb3J0ZWQgYnkgd2JmeSdzIGJ1bmRsZWQgc2VyaWFsaXplcjsgdGhlIHRhcmdldCBmb3JtYXR0ZXJcbiAgICAvLyBpcyBhdmFpbGFibGUgd2l0aG91dCBhbiBleHRyYSBmZXRjaCBvbmx5IHdoZW4gdGhpcyBydW4gc3RhcnRlZCB3aXRoIHBhY2thZ2UuanNvbi5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBmaWxlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBsZXQganNvbk9iajogUGFja2FnZUpzb24gPSB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBEb2N1bWVudGF0aW9uLW9ubHkgcmVwb3NpdG9yaWVzIGhhdmUgbm8gbWFuaWZlc3Qgb24gdGhlaXIgZmlyc3Qgd2JmeSBydW4uIFN0YXJ0aW5nIGZyb20gYW5cbiAgICAvLyBlbXB0eSBvYmplY3QgbGV0cyB0aGUgbm9ybWFsIGdlbmVyYXRvciBlc3RhYmxpc2ggdGhlIHNhbWUgbWFuYWdlZCBiYXNlbGluZSBhcyBldmVyeSBvdGhlclxuICAgIC8vIHJlcG9zaXRvcnk7IG1hbGZvcm1lZCBvciB1bnJlYWRhYmxlIGV4aXN0aW5nIG1hbmlmZXN0cyBtdXN0IHN0aWxsIGZhaWwgbG91ZGx5LlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICAvLyBSdW4gYmVmb3JlIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggcmUtYWRkcyB0c2dvIG9ubHkgZm9yIGN1cnJlbnQgTmV4dC5qcy1mYW1pbHkgcmVwb3NpdG9yaWVzLlxuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xufVxuXG4vKipcbiAqIEtlZXBzIHRoZSBwcm9qZWN0J3Mgb3duIHNlZ21lbnRzIGluIG9yZGVyLCByZXBsYWNpbmcgdGhlIGZpcnN0IG1hbmFnZWQgZ2VuLWNvZGUgc3BlbGxpbmcgd2l0aFxuICogYGJ1biB3YiBnZW4tY29kZWAgYW5kIGRyb3BwaW5nIGxhdGVyIGR1cGxpY2F0ZXMuIEFwcGVuZHMgZ2VuZXJhdGlvbiBvbmx5IHdoZW4gdGhlIHNjcmlwdFxuICogY29udGFpbmVkIG5vbmUsIHNvIG5vdGhpbmcgaXMgcmVvcmRlcmVkLlxuICovXG5mdW5jdGlvbiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50czogc3RyaW5nW10sIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtpbmRzID0gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IGdlbmVyYXRlczsgYWRkaW5nIGFub3RoZXIgaW52b2NhdGlvbiB3b3VsZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICBsZXQgZ2VuZXJhdGlvblBsYWNlZCA9IGtpbmRzLmluY2x1ZGVzKCdnZW5Db2RlV3JhcHBlcicpO1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBraW5kID0ga2luZHNbaW5kZXhdO1xuICAgIGlmIChraW5kID09PSAnY3VzdG9tJyB8fCBraW5kID09PSAnZ2VuQ29kZVdyYXBwZXInKSB7XG4gICAgICByZXN1bHQucHVzaChzZWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSB7XG4gICAgICByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gICAgICBnZW5lcmF0aW9uUGxhY2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnRzIHdoaWxlIGtlZXBpbmcgdGhlIGZpcnN0IHNlZ21lbnQncyBwb3NpdGlvbiBzbyBhIGN1c3RvbVxuICogc3RlcCB0aGF0IGNvbnN1bWVzIGdlbmVyYXRlZCBvdXRwdXQgc3RpbGwgcnVucyBhZnRlciBpdC4gUmV0dXJucyB3aXRob3V0IGNoYW5naW5nIGFuXG4gKiB1bnBhcnNlYWJsZSBzY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIG1hbmFnZXNXb3JrZXJUeXBlczogYm9vbGVhbik6IHZvaWQge1xuICAvLyBgYnVuIHdiIGdlbi1jb2RlYCByZWdlbmVyYXRlcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGl0c2VsZiwgc28gYSBwYWNrYWdlIHdpdGggYVxuICAvLyBjb2RlLWdlbmVyYXRpb24gb3Igd29ya2VyLXR5cGVzIHBpcGVsaW5lIGdldHMgb25lIG1hbmFnZWQgZ2VuZXJhdGlvbiBzZWdtZW50LlxuICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSB8fCBtYW5hZ2VzV29ya2VyVHlwZXMpIHtcbiAgICAvLyBQcm9qZWN0LW93bmVkIHN0ZXBzIGFyZSBuZXZlciBkcm9wcGVkLCBhbmQgdGhlaXIgUE9TSVRJT04gcmVsYXRpdmUgdG8gZ2VuZXJhdGlvbiBpcyBwcmVzZXJ2ZWQ6IGEgc3RlcFxuICAgIC8vIGJlZm9yZSBpdCBtYXkgcHJvZHVjZSBgd3JhbmdsZXIgdHlwZXNgJyBpbnB1dHMgKGEgd3JhbmdsZXIgY29uZmlnLCBgLmRldi52YXJzYCksIHdoaWxlIG9uZSBhZnRlciBpdCBtYXlcbiAgICAvLyBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgdHlwZXMuIFNvIHRoZSBtYW5hZ2VkIGdlbmVyYXRpb24gcmVwbGFjZXMgdGhlIGZpcnN0IG1hbmFnZWQgc2VnbWVudCBpbiBwbGFjZSwgYW5kIGlzXG4gICAgLy8gYXBwZW5kZWQgb25seSB3aGVuIHRoZSBzY3JpcHQgaGFkIG5vbmUuIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gZ2VuZXJhdGlvbiBwbHVzIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBzdXBwcmVzc2VzIHRoZSByZXBsYWNlbWVudCBlbnRpcmVseS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHNjcmlwdHMucG9zdGluc3RhbGwgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsKTtcbiAgICBjb25zdCBrZXB0U2VnbWVudHMgPSBzZWdtZW50cyAmJiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50cywgc2NyaXB0cyk7XG4gICAgaWYgKGtlcHRTZWdtZW50cykge1xuICAgICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGtlcHRTZWdtZW50cy5qb2luKCcgJiYgJyk7XG4gICAgfVxuICAgIC8vIEFueSBvdGhlciB1bnBhcnNlYWJsZSBwb3N0aW5zdGFsbCBpcyBsZWZ0IHRvIGEgaHVtYW4gcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIC8vIExlZnRob29rIGdlbmVyYXRpb24gaXMgYmVzdC1lZmZvcnQgYW5kIC5sZWZ0aG9vayBpcyBhYnNlbnQgZnJvbSBEb2NrZXIgYnVpbGQgY29udGV4dHMsIHNvIGFcbiAgICAvLyBtaXNzaW5nIG5vcm1hbGl6ZXIgaXMgdmFsaWQuIE9uY2UgcHJlc2VudCwgaXRzIGZhaWx1cmUgbXVzdCBhYm9ydCBpbnN0YWxsIHJhdGhlciB0aGFuIGxlYXZlIGFcbiAgICAvLyBHdWFyZC1waW5uZWQgbG9ja2ZpbGUgYmVoaW5kOyBrZWVwIHRoYXQgZmFpbC1mYXN0IGdyb3VwaW5nIGV4cGxpY2l0IGJlZm9yZSBhbnkgd29ya3NwYWNlIGJ1aWxkLlxuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID1cbiAgICAgICcoYnVuIGxlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSkgJiYgKHRlc3QgISAtZiAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB8fCBiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoKSc7XG4gICAgLy8gV2hlbiBAd2lsbGJvb3N0ZXIvd2IgaXMgYSB3b3Jrc3BhY2Ugb2YgdGhpcyByZXBvc2l0b3J5LCB0aGUgZ2VuZXJhdGVkIGBidW4gd2Ig4oCmYCBzY3JpcHRzIHJ1blxuICAgIC8vIGl0cyBnaXRpZ25vcmVkIGRpc3QgYnVpbGQgKGJpbi9pbmRleC5qcyBpbXBvcnRzIC4uL2Rpc3QvaW5kZXguanMpLCBzbyBhIGZyZXNoIGNoZWNrb3V0IG11c3RcbiAgICAvLyBidWlsZCBpdCBkdXJpbmcgaW5zdGFsbDsgcmVnaXN0cnkgaW5zdGFsbHMgc2hpcCBhIHByZWJ1aWx0IGRpc3QgYW5kIG5lZWQgbm8gZXh0cmEgc3RlcC5cbiAgICBjb25zdCB3YldvcmtzcGFjZURpciA9IGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmdldCh3YkRlcGVuZGVuY3kpO1xuICAgIGlmICh3YldvcmtzcGFjZURpcikge1xuICAgICAgLy8gUXVvdGVkIHVubGVzcyB0aGUgbmFtZSBjYXJyaWVzIG5vIHNoZWxsIG1lYW5pbmcsIHNvIHRoYXQgYCQo4oCmKWAgb3IgYSB2YXJpYWJsZSBhIGhvc3RpbGVcbiAgICAgIC8vIGRpcmVjdG9yeSBuYW1lIGNvdWxkIHNtdWdnbGUgaW50byB0aGUgZ2VuZXJhdGVkIHNjcmlwdCBuZXZlciByZWFjaGVzIHRoZSBzaGVsbCB1bnF1b3RlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlICs9IGAgJiYgYnVuIHJ1biAtLWN3ZCAke3F1b3RlRm9yU2hlbGwod2JXb3Jrc3BhY2VEaXIpfSBidWlsZGA7XG4gICAgfVxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGxlZnRob29rRGVwZW5kZW5jeSk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2UoanNvbk9iai5zY3JpcHRzLnJlbGVhc2UpKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgLy8gUnVudGltZSBpbXBvcnRzIG5lZWQgdGhlIHN0YW5kYWxvbmUgcGFja2FnZSBhZnRlciBEb2NrZXIgcHJ1bmluZyByZW1vdmVzIGRldkRlcGVuZGVuY2llcy5cbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz89XG4gICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSA/P1xuICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby4gWWFybiB2MSdzIG9iamVjdCBmb3JtIGtlZXBzIGl0c1xuICAgICAgLy8gZGVjbGFyZWQgcGF0dGVybnMgKHdvcmtzcGFjZXMucGFja2FnZXMpOyBvbmx5IGV4dHJhcyBzdWNoIGFzIG5vaG9pc3QgYXJlIGRyb3BwZWQuXG4gICAgICAvLyBGb3JjZSBgcGFja2FnZXMvKmAgb25seSB3aGVuIGl0IGFjdHVhbGx5IG1hdGNoZXMgYSB3b3Jrc3BhY2UgbWFuaWZlc3Q6IGFuIGFwcHMvKi1vbmx5XG4gICAgICAvLyBtb25vcmVwbyBtdXN0IG5vdCBnZXQgYSBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGFwcGVuZGVkIHRvIGl0cyBkZWNsYXJhdGlvbi4gQVxuICAgICAgLy8gYmFzZWxpbmUtc2VlZGluZyBkZWNsYXJhdGlvbiBuZWVkcyBubyBmb3JjZWQgcGF0dGVybiBhdCBhbGwg4oCUIHRoZSBzZWVkZWQgYmFzZWxpbmVcbiAgICAgIC8vIChgKi8qYCBvciBgKipgKSBhbHJlYWR5IGNvdmVycyBwYWNrYWdlcy8qLiBUaGUgZm9yY2VkIHBhdHRlcm4gaXMgUFJFUEVOREVEOiBCdW5cbiAgICAgIC8vIGV2YWx1YXRlcyB3b3Jrc3BhY2UgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBhIHBvc2l0aXZlIHBhdHRlcm4gcGxhY2VkIGFmdGVyIGEgdXNlclxuICAgICAgLy8gbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcy4gQSBkZWNsYXJhdGlvbiB0aGF0IGFscmVhZHkgY292ZXJzXG4gICAgICAvLyBwYWNrYWdlcy8qIHVuZGVyIG5vcm1hbGl6YXRpb24gKGUuZy4gYC4vcGFja2FnZXMvKmApIGlzIGtlcHQgdmVyYmF0aW06IGZvcmNpbmcgYSB0ZXh0dWFsXG4gICAgICAvLyBgcGFja2FnZXMvKmAgbmV4dCB0byBpdCB3b3VsZCBwZXJzaXN0IGEgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybi5cbiAgICAgIGNvbnN0IGZvcmNlZFBhdHRlcm5zID1cbiAgICAgICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUoanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgeyBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfSkubGVuZ3RoID4gMFxuICAgICAgICAgID8gWydwYWNrYWdlcy8qJ11cbiAgICAgICAgICA6IFtdO1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gbWVyZ2UuYWxsKFtmb3JjZWRQYXR0ZXJucywgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhqc29uT2JqLndvcmtzcGFjZXMpXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIEJvdGggaW5wdXRzIGNhbiBiZSBlbXB0eSAoZS5nLiBwYWNrYWdlcy9wYWNrYWdlLmpzb24gd2l0aG91dCBhbnkgcGFja2FnZXMvKi9wYWNrYWdlLmpzb25cbiAgICAgIC8vIGFuZCBubyBkZWNsYXJlZCB3b3Jrc3BhY2VzKTsgZG8gbm90IHBlcnNpc3QgYSBtZWFuaW5nbGVzcyBgd29ya3NwYWNlczogW11gLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSAmJiBqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpeGVycy9uZXh0Q29uZmlnLnRzIGVuYWJsZXMgYHJlYWN0Q29tcGlsZXI6IHRydWVgIGZvciBldmVyeSBOZXh0LmpzIHByb2plY3QsIGFuZCBOZXh0LmpzXG4gIC8vIHJlc29sdmVzIGBiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXJgIGF0IGJ1aWxkIHRpbWUgd2hlbiBSZWFjdCBDb21waWxlciBpcyBvbi4gQWRkIGl0IGhlcmUgc29cbiAgLy8gdGhlIG1hbmFnZWQgbmV4dC5jb25maWcgbmV2ZXIgYnJlYWtzIGBuZXh0IGJ1aWxkYCB3aXRoIGFuIHVucmVzb2x2ZWQtcGFja2FnZSBlcnJvci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXInKTtcbiAgfVxuXG4gIC8vIGB3YiB2ZXJpZnkgLS1mdWxsYCBhdWRpdHMgZXZlcnkgYCouc2xpZGV2Lm1kYCBkZWNrIHdpdGggc2xpZGV2LWNoZWNrLCBzbyB0aGUgY2hlY2tlciBoYXMgdG8gYmVcbiAgLy8gaW5zdGFsbGVkIHdoZXJldmVyIGEgZGVjayBsaXZlcy5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblNsaWRldk1kKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NsaWRldi1jaGVjaycpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIC8vIEEgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBkZXBlbmRzIG9uIHRoZSB3YiBkZXZlbG9wZWQgaW4gdGhpcyByZXBvc2l0b3J5IChlLmcuXG4gICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGl0c2VsZik7IGluc3RhbGxpbmcgdGhlIGxhdGVzdCByZWdpc3RyeSByZWxlYXNlIG92ZXIgaXQgd291bGQgc2lsZW50bHlcbiAgICAvLyByZXBsYWNlIHRoZSBsb2NhbCBidWlsZCB3aXRoIGEgcHVibGlzaGVkIG9uZSwgc28gbGVhdmUgc3VjaCBhIGRlY2xhcmF0aW9uIHVudG91Y2hlZC5cbiAgICBjb25zdCB3YlNwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XTtcbiAgICBpZiAoIXdiU3BlY2lmaWVyPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgICAvLyBUaGUgZ2VuZXJhdGVkICouY29uZmlnLnRzIGZpbGVzIGFyZSB0eXBlLWNoZWNrZWQgYnkgdGhlIGxpbnQgcHJvamVjdCBldmVuIGluIEphdmFTY3JpcHQtb25seVxuICAgIC8vIHJlcG9zaXRvcmllcy4gUmVhY3QgTmF0aXZlIHJlbGllcyBvbiBAdHNjb25maWcvcmVhY3QtbmF0aXZlJ3MgYW1iaWVudCB0eXBlcyBpbnN0ZWFkLlxuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSwgc28gaXQgaXNcbiAgICAvLyBub3cgdGhlIG1hbmFnZWQgY29tcGlsZXIgZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcmVwbyAodHlwZWNoZWNraW5nIHJ1bnMgYHRzY2ApLlxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHREZXBlbmRlbmN5KTtcbiAgICAvLyBOZXh0LmpzJ3MgYG5leHQgYnVpbGRgIGluc3BlY3RzIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHRvIHJ1biBpdHMgdHlwZVxuICAgIC8vIGNoZWNrOyB0aGUgYHR5cGVzY3JpcHRgIHY3IHBhY2thZ2UgYWxvbmUgbGFja3MgdGhlIEFQSSBuZXh0IG5lZWRzLCBzbyBrZWVwIGJvdGhcbiAgICAvLyBpbnN0YWxsZWQgZm9yIE5leHQuanMtZmFtaWx5IHJlcG9zLiBTZWUgdGhlIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgY29tbWVudCBhYm92ZS5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBweXRob25EZXZEZXBlbmRlbmNpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBweXRob25EZXZEZXBlbmRlbmNpZXMgfTtcbn1cblxuZnVuY3Rpb24gZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9cXGIoPzpidW54fG5weHxwbnBtXFxzK2RseHx5YXJuXFxzK2RseClcXHMrc2VtYW50aWMtcmVsZWFzZSg/OkBcXFMrKT9cXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwga2VlcEFzUnVudGltZV0gb2YgW1xuICAgIFt3YkRlcGVuZGVuY3ksIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICAgIFtidWlsZFRzRGVwZW5kZW5jeSwgc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgXSBhcyBjb25zdCkge1xuICAgIGlmIChrZWVwQXNSdW50aW1lKSB7XG4gICAgICBjb25zdCBkZXZWZXJzaW9uID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWRldlZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghcnVudGltZVZlcnNpb24gfHwgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGRldlZlcnNpb24sIHJ1bnRpbWVWZXJzaW9uKSkge1xuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGRldlZlcnNpb247XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfSBlbHNlIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkge1xuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPz89IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gaW1hZ2VzIHJ1biBtaWdyYXRpb25zIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLCBqdXN0IGFzIHBhY2thZ2UgbWFuYWdlcnNcbiAgLy8gcnVuIHBvc3RpbnN0YWxsIGR1cmluZyBwcm9kdWN0aW9uIGluc3RhbGxzLCBzbyBib3RoIGVudHJ5IHBvaW50cyBtdXN0IHJldGFpbiB0aGUgd2IgYmluYXJ5LlxuICAvLyBLZWVwIHRoZSB3b3JkIG1hdGNoIGNvbnNlcnZhdGl2ZTogc3VwcG9ydGVkIGN1c3RvbSB3cmFwcGVycyBjYW4gcHV0IHdiIGluc2lkZSBzaGVsbCBsb29wcyB0aGF0XG4gIC8vIHRoZSBjb21tYW5kLXBvc2l0aW9uIHBhcnNlciBjYW5ub3QgY2xhc3NpZnksIHdoaWxlIGEgZmFsc2UgcG9zaXRpdmUgb25seSByZXRhaW5zIHRoZSBDTEkuXG4gIHJldHVybiBbanNvbk9iai5zY3JpcHRzPy5wb3N0aW5zdGFsbCwganNvbk9iai5zY3JpcHRzPy5bJ2RiLW1pZ3JhdGUnXV0uc29tZShcbiAgICAoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2JcXGIvdS50ZXN0KHNjcmlwdClcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaXNtYSA9IGpzb25PYmoucHJpc21hIGFzIHsgc2VlZD86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMocHJpc21hPy5zZWVkKSB8fCBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKGpzb25PYmouc2NyaXB0cz8uc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoc2VlZENvbW1hbmQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBEb2NrZXIgaW1hZ2VzIHJ1biBzZWVkIHNjcmlwdHMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsXG4gIC8vIHNvIFR5cGVTY3JpcHQgc2VlZCBydW5uZXJzIG11c3QgcmVtYWluIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuICByZXR1cm4gdHlwZW9mIHNlZWRDb21tYW5kID09PSAnc3RyaW5nJyAmJiAvKD88IVtcXHctXSlidWlsZC10cyg/IVtcXHctXSkvdS50ZXN0KHNlZWRDb21tYW5kKTtcbn1cblxuY29uc3QgZGVwZW5kZW5jeURlY2xhcmF0aW9uU2VjdGlvbnMgPSBbXG4gICdkZXBlbmRlbmNpZXMnLFxuICAnZGV2RGVwZW5kZW5jaWVzJyxcbiAgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJyxcbiAgJ3BlZXJEZXBlbmRlbmNpZXMnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JjZXMgc3RvcmUtaW5jb21wYXRpYmxlIHBhY2thZ2VzIHRvIHN0YXkgcHJvamVjdC1sb2NhbCB3aGVuIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgZW5hYmxlc1xuICogQnVuJ3MgZ2xvYmFsIHN0b3JlOiBgY2hha3JhIHR5cGVnZW5gIChydW4gYnkgYHdiIGdlbi1jb2RlYClcbiAqIHdyaXRlcyBnZW5lcmF0ZWQgdHlwZXMgaW50byB0aGUgaW5zdGFsbGVkIEBjaGFrcmEtdWkvcmVhY3QgcGFja2FnZSwgd2hpY2ggd291bGQgb3RoZXJ3aXNlXG4gKiBtdXRhdGUgdGhlIG1hY2hpbmUtd2lkZSBzdG9yZSBzaGFyZWQgYWNyb3NzIHJlcG9zaXRvcmllcywgYW5kIGRyaXp6bGUta2l0IHJlcXVpcmVzIGRyaXp6bGUtb3JtXG4gKiB3aXRob3V0IGRlY2xhcmluZyBpdCwgd2hpY2ggdGhlIHN0b3JlIHJlYWxwYXRoIHBsYWNlcyBiZXlvbmQgYSBwbGFpbiBub2RlX21vZHVsZXMgd2Fsay11cC5cbiAqIExpc3RpbmcgdGhlbSBpbiBgdHJ1c3RlZERlcGVuZGVuY2llc2AgbWFrZXMgQnVuIG1hdGVyaWFsaXplIGEgcGVyLXByb2plY3QgY29weSB1bmRlclxuICogYG5vZGVfbW9kdWxlcy8uYnVuL2AsIHdob3NlIHNpYmxpbmcgYG5vZGVfbW9kdWxlcy8uYnVuL25vZGVfbW9kdWxlcy9gIGxpbmtzIGV2ZXJ5IGluc3RhbGxlZFxuICogcGFja2FnZSBhbmQgdGhlcmVmb3JlIHJlc29sdmVzIHRoZSB1bmRlY2xhcmVkIHJlcXVpcmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBCdW4gY29uc3VsdHMgdHJ1c3RlZERlcGVuZGVuY2llcyBpbiB0aGUgd29ya3NwYWNlIHJvb3QncyBwYWNrYWdlLmpzb24gb25seSwgc28gdGhlIGxpc3QgaXNcbiAgLy8gbWFuYWdlZCB0aGVyZSBhbmQgbXVzdCBjb3ZlciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgYW55d2hlcmUgaW4gdGhlIHJlcG9zaXRvcnkuXG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuICBjb25zdCBidW5Kc29uT2JqID0ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uICYgeyB0cnVzdGVkRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfTtcbiAgLy8gQnVuIGluc3RhbGxzIG9wdGlvbmFsIGFuZCBwZWVyIGRlcGVuZGVuY2llcyBieSBkZWZhdWx0LCBzbyBhbGwgZGVjbGFyYXRpb24gc2VjdGlvbnMgY291bnQuXG4gIC8vIEV2ZXJ5IGRlY2xhcmVkIHJhbmdlIGlzIGtlcHQgcGVyIHBhY2thZ2U6IGEgcm9vdCBkZWNsYXJhdGlvbiBtdXN0IG5vdCBtYXNrIGEgd29ya3NwYWNlIG9uZVxuICAvLyAoZS5nLiByb290IEBjaGFrcmEtdWkvY2xpIHYyIGFsb25nc2lkZSBhIHdvcmtzcGFjZSBvbiB2MykuXG4gIGNvbnN0IGRlY2xhcmVkRGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBjb25zdCBhZGREZWNsYXJlZERlcGVuZGVuY2llcyA9IChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZGVwZW5kZW5jeURlY2xhcmF0aW9uU2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCB2ZXJzaW9uUmFuZ2VdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uW3NlY3Rpb25dID8/IHt9KSkge1xuICAgICAgICBpZiAodHlwZW9mIHZlcnNpb25SYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCB2ZXJzaW9uUmFuZ2VzID0gZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KGRlcGVuZGVuY3lOYW1lKTtcbiAgICAgICAgICBpZiAodmVyc2lvblJhbmdlcykge1xuICAgICAgICAgICAgdmVyc2lvblJhbmdlcy5wdXNoKHZlcnNpb25SYW5nZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlY2xhcmVkRGVwZW5kZW5jaWVzLnNldChkZXBlbmRlbmN5TmFtZSwgW3ZlcnNpb25SYW5nZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoY29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBhZGREZWNsYXJlZERlcGVuZGVuY2llcyhcbiAgICAgICAgSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucmVhZGFibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICAvLyBPbmx5IEBjaGFrcmEtdWkvY2xpIHYzJ3MgYGNoYWtyYSB0eXBlZ2VuYCB3cml0ZXMgaW50byB0aGUgaW5zdGFsbGVkIEBjaGFrcmEtdWkvcmVhY3Q7XG4gIC8vIHYyJ3MgYGNoYWtyYS1jbGkgdG9rZW5zYCB3cml0ZXMgaW50byBAY2hha3JhLXVpL3N0eWxlZC1zeXN0ZW0gaW5zdGVhZCwgc28gdHJ1c3RpbmdcbiAgLy8gQGNoYWtyYS11aS9yZWFjdCB0aGVyZSB3b3VsZCBmb3JjZSBhIHVzZWxlc3MgcHJvamVjdC1sb2NhbCBjb3B5IHdpdGhvdXQgZml4aW5nIGdlbi1jb2RlLlxuICAvLyBNaXJyb3Igd2IgZ2VuLWNvZGUncyBjbGFzc2lmaWNhdGlvbjogb25seSBhIHJhbmdlIHdob3NlIGxlYWRpbmcgbWFqb3IgcGFyc2VzIHRvIDIgc2VsZWN0cyB0aGVcbiAgLy8gdjIgY29tbWFuZCwgc28gZGlnaXRsZXNzIHNwZWNzIGxpa2UgYGxhdGVzdGAgb3IgY2F0YWxvZyByZWZlcmVuY2VzIGNvdW50IGFzIHYzLlxuICBjb25zdCBoYXNDaGFrcmFDbGlWMyA9IChkZWNsYXJlZERlcGVuZGVuY2llcy5nZXQoJ0BjaGFrcmEtdWkvY2xpJykgPz8gW10pLnNvbWUoXG4gICAgKHZlcnNpb25SYW5nZSkgPT4gL1xcZCsvdS5leGVjKHZlcnNpb25SYW5nZSk/LlswXSAhPT0gJzInXG4gICk7XG4gIGNvbnN0IHJlcXVpcmVkV2JmeVBhY2thZ2VzID0gW1xuICAgIC4uLihoYXNDaGFrcmFDbGlWMyAmJiBkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0BjaGFrcmEtdWkvcmVhY3QnKSA/IFsnQGNoYWtyYS11aS9yZWFjdCddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2RyaXp6bGUta2l0JykgPyBbJ2RyaXp6bGUta2l0J10gOiBbXSksXG4gICAgLy8gVGhlc2UgZ2l0LWRlcGVuZGVuY3kgYnVpbGRzIGltcG9ydCBwYWNrYWdlcyB0aGV5IGRvIG5vdCBkZWNsYXJlIChlLmcuIHpvZCksIHdoaWNoIHRoZVxuICAgIC8vIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwOyBhIHByb2plY3QtbG9jYWwgY29weSB1bmRlclxuICAgIC8vIG5vZGVfbW9kdWxlcy8uYnVuIHJlc29sdmVzIHRoZW0gKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3Byb21wdC1zdHVkeSkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykgPyBbJ0B3aWxsYm9vc3Rlci9qdWRnZSddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSA/IFsnQHdpbGxib29zdGVyL2xsbS1wcm94eSddIDogW10pLFxuICAgIC8vIGJsaXR6IGFuZCBAYmxpdHpqcy9hdXRoIHJlcXVpcmUgcmVhY3QgKGFuZCBvdGhlciBwZWVycykgd2l0aG91dCBkZWNsYXJpbmcgdGhlbSwgcmVseWluZyBvblxuICAgIC8vIGhvaXN0aW5nLCB3aGljaCB0aGUgZ2xvYmFsLXN0b3JlIGxheW91dCBwbGFjZXMgYmV5b25kIHRoZWlyIHdhbGstdXAgKG9ic2VydmVkIGluXG4gICAgLy8gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbTogYG5leHQgYnVpbGRgIHBhZ2UtZGF0YSBjb2xsZWN0aW9uIGRpZXMgd2l0aCBcIkNhbm5vdCBmaW5kIG1vZHVsZVxuICAgIC8vICdyZWFjdCdcIiBmcm9tIEBibGl0empzL2F1dGgpLiBAYmxpdHpqcy9ycGMgaXMgTk9UIGxpc3RlZCBiZWNhdXNlIGl0IHByb3Blcmx5IGRlY2xhcmVzIGl0c1xuICAgIC8vIHJlYWN0L0B0YW5zdGFjayBwZWVycywgc28gQnVuIGxpbmtzIHRoZW0gaW50byBpdHMgc3RvcmUgZW50cnkuIEBibGl0empzL25leHQgaXNcbiAgICAvLyBkZWxpYmVyYXRlbHkgTk9UIGxpc3RlZCBlaXRoZXI6IHRydXN0aW5nIGl0IHdvdWxkIHJ1biBpdHMgcG9zdGluc3RhbGwgKGBibGl0eiBjb2RlZ2VuYCksXG4gICAgLy8gd2hpY2ggcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbiBwbGFjZSDigJQgcmVwb3NpdG9yaWVzIHBhdGNoIG91dCB0aGF0IHBvc3RpbnN0YWxsXG4gICAgLy8gd2l0aCBgYnVuIHBhdGNoYCBpbnN0ZWFkLCB3aGljaCBhbHNvIGtlZXBzIHRoZSBwYWNrYWdlIHByb2plY3QtbG9jYWwuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnYmxpdHonKSA/IFsnYmxpdHonXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAYmxpdHpqcy9hdXRoJykgPyBbJ0BibGl0empzL2F1dGgnXSA6IFtdKSxcbiAgICAvLyBCdW4gZG9lcyBub3QgbGluayBAaG9va2Zvcm0vcmVzb2x2ZXJzJyBPUFRJT05BTCB2YWxpZGF0b3IgcGVlcnMgKGUuZy4gem9kKSBpbnRvIGl0c1xuICAgIC8vIGdsb2JhbC1zdG9yZSBlbnRyeSBldmVuIHdoZW4gdGhlIHByb2plY3QgaW5zdGFsbHMgdGhlbSwgc28gaXRzIHNlcnZlci1zaWRlXG4gICAgLy8gYGltcG9ydCAnem9kJ2AgZmFpbHMgZnJvbSB0aGUgc3RvcmUgKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW0pLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0Bob29rZm9ybS9yZXNvbHZlcnMnKSA/IFsnQGhvb2tmb3JtL3Jlc29sdmVycyddIDogW10pLFxuICAgIC8vIEB6b29tL3J0bXMgaW5zdGFsbHMgaXRzIG5hdGl2ZSBydG1zLm5vZGUgYmluZGluZyBpbiBhIGxpZmVjeWNsZSBzY3JpcHQuIFdpdGhvdXQgZXhwbGljaXRcbiAgICAvLyB0cnVzdCwgQnVuIHNraXBzIHRoYXQgc2NyaXB0IGFuZCB0aGUgcGFja2FnZSBmYWlscyBhcyBzb29uIGFzIHRoZSBab29tIGJvdCBpbXBvcnRzIGl0XG4gICAgLy8gKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3NtYXJ0c2Utem9vbS1ib3QpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B6b29tL3J0bXMnKSA/IFsnQHpvb20vcnRtcyddIDogW10pLFxuICBdO1xuXG4gIC8vIHdiZnkgZnVsbHkgb3ducyB0aGlzIGZpZWxkOiBhIHBhY2thZ2Ugd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgbXVzdCBydW4gZ2V0cyBhZGRlZCB0byB3YmZ5XG4gIC8vIGl0c2VsZiBpbnN0ZWFkIG9mIHRvIGluZGl2aWR1YWwgcmVwb3NpdG9yaWVzLCBzbyB1bm1hbmFnZWQgZW50cmllcyBhcmUgYWx3YXlzIHJlbW92ZWQg4oCUXG4gIC8vIGluY2x1ZGluZyBhbiBleHBsaWNpdGx5IGVtcHR5IGRlbnktYWxsIGxpc3QsIHdob3NlIGRlbGV0aW9uIGRlbGliZXJhdGVseSByZXN0b3JlcyBCdW4nc1xuICAvLyBkZWZhdWx0IGFsbG93LWxpc3QgKHRoZSBvd25lcnNoaXAgcG9saWN5IGNob3NlbiBpbiAjOTc1KS5cbiAgY29uc3QgZXhpc3RpbmdUcnVzdGVkID0gYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzO1xuICBpZiAocmVxdWlyZWRXYmZ5UGFja2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGV4aXN0aW5nVHJ1c3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBEZWxldGluZyB0aGUgZmllbGQgcmVzdG9yZXMgQnVuJ3MgZnVsbCBkZWZhdWx0IGFsbG93LWxpc3QsIHNvIG9ubHkgZW50cmllcyBvdXRzaWRlIHRoYXRcbiAgICAgIC8vIGxpc3QgYWN0dWFsbHkgbG9zZSB0aGVpciBsaWZlY3ljbGUgc2NyaXB0cy5cbiAgICAgIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywgZXhpc3RpbmdUcnVzdGVkLCBuZXcgU2V0KCkpO1xuICAgICAgZGVsZXRlIGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQW4gZXhwbGljaXQgdHJ1c3RlZERlcGVuZGVuY2llcyBsaXN0IFJFUExBQ0VTIEJ1bidzIGRlZmF1bHQgYWxsb3ctbGlzdCBpbnN0ZWFkIG9mIGV4dGVuZGluZ1xuICAvLyBpdCwgYW5kIEJ1biBwcmludHMgbm8gd2FybmluZyBmb3IgdGhlIHBvc3RpbnN0YWxscyBpdCBjb25zZXF1ZW50bHkgc2tpcHMgKGUuZy4gQHJhaWx3YXkvY2xpXG4gIC8vIGRvd25sb2FkcyBpdHMgYmluYXJ5IGluIHBvc3RpbnN0YWxsIGFuZCBleGl0cyAxIHdpdGhvdXQgb25lKS4gSW5jbHVkZSB0aGUgRU5USVJFIGRlZmF1bHQgbGlzdDpcbiAgLy8gZW50cmllcyBmb3IgcGFja2FnZXMgdGhhdCBhcmUgbm90IGluc3RhbGxlZCBhcmUgaW5lcnQsIGFuZCB0aGlzIGlzIHRoZSBvbmx5IHJlcHJlc2VudGF0aW9uXG4gIC8vIHRoYXQgc3RheXMgY29ycmVjdCBmb3IgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgdGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVzb2x2ZXMgYWZ0ZXIgdGhpc1xuICAvLyBydW5zIOKAlCBhbiBpbnRlcnNlY3Rpb24gd2l0aCBhIG1pc3Npbmcgb3Igc3RhbGUgbG9ja2ZpbGUgd291bGQgc2lsZW50bHkgZHJvcCB0aGVtLlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIC8vIGxlZnRob29rIGlzIGFwcGVuZGVkIGV4cGxpY2l0bHkgc28gdGhlIGRlZmF1bHQtbGlzdCBsb29rdXAgZmFpbGluZyBjYW5ub3QgZHJvcCBpdDogaXQgaXNcbiAgLy8gcmVxdWlyZWQgaW4gZXZlcnkgbWFuYWdlZCByZXBvc2l0b3J5LlxuICBjb25zdCBuZXdUcnVzdGVkUGFja2FnZXMgPSBuZXcgU2V0KFtcbiAgICAuLi5yZXF1aXJlZFdiZnlQYWNrYWdlcyxcbiAgICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gICAgLi4uKGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID8/IFtdKSxcbiAgXSk7XG4gIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywgZXhpc3RpbmdUcnVzdGVkID8/IFtdLCBuZXdUcnVzdGVkUGFja2FnZXMpO1xuICBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXMgPSBbLi4ubmV3VHJ1c3RlZFBhY2thZ2VzXS50b1NvcnRlZCgpO1xufVxuXG4vLyBUaGUgcGFja2FnZXMgd2JmeSBpdHNlbGYgbWF5IHdyaXRlIGludG8gdHJ1c3RlZERlcGVuZGVuY2llczsgdGhlaXIgcmVtb3ZhbCBpcyBtYW5hZ2VkIGNsZWFudXAsXG4vLyBuZXZlciBhIGxvc3Mgb2YgdXNlciBwb2xpY3kuXG5jb25zdCB3YmZ5TWFuYWdlZFRydXN0ZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFtcbiAgJ0BibGl0empzL2F1dGgnLFxuICAnQGNoYWtyYS11aS9yZWFjdCcsXG4gICdAaG9va2Zvcm0vcmVzb2x2ZXJzJyxcbiAgJ0B3aWxsYm9vc3Rlci9qdWRnZScsXG4gICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JyxcbiAgJ0B6b29tL3J0bXMnLFxuICAnYmxpdHonLFxuICAnZHJpenpsZS1raXQnLFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG5dKTtcblxuZnVuY3Rpb24gd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZXhpc3RpbmdUcnVzdGVkOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2VwdFBhY2thZ2VzOiBSZWFkb25seVNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgLy8gQSBkZWZhdWx0LXRydXN0ZWQgZW50cnkgbmV2ZXIgbG9zZXMgYW55dGhpbmcgYnkgcmVtb3ZhbDogd2hpbGUgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIHRoZVxuICAvLyBrZXB0IGxpc3QgKG9yLCB3aGVuIHRoZSBmaWVsZCBpcyBkZWxldGVkLCBCdW4ncyBvd24gZGVmYXVsdCBsaXN0KSBzdGlsbCB0cnVzdHMgaXQuXG4gIGNvbnN0IGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgY29uc3QgcmVtb3ZlZFBhY2thZ2VzID0gZXhpc3RpbmdUcnVzdGVkLmZpbHRlcihcbiAgICAocGtnKSA9PiAha2VwdFBhY2thZ2VzLmhhcyhwa2cpICYmICF3YmZ5TWFuYWdlZFRydXN0ZWREZXBlbmRlbmNpZXMuaGFzKHBrZykgJiYgIWRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzPy5oYXMocGtnKVxuICApO1xuICBpZiAocmVtb3ZlZFBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgUmVtb3ZpbmcgdW5tYW5hZ2VkIHRydXN0ZWREZXBlbmRlbmNpZXMgZW50cmllczogJHtyZW1vdmVkUGFja2FnZXMuam9pbignLCAnKX0uIHdiZnkgb3ducyB0aGlzIGZpZWxkOyBpZiB0aGVpciBsaWZlY3ljbGUgc2NyaXB0cyBhcmUgcmVxdWlyZWQsIGFkZCB0aGUgcGFja2FnZXMgdG8gd2JmeSBpdHNlbGYuYFxuICAgICk7XG4gIH1cbn1cblxubGV0IGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuLyoqIEZldGNoZXMgQnVuJ3MgZGVmYXVsdCB0cnVzdGVkLWRlcGVuZGVuY3kgYWxsb3ctbGlzdCBmcm9tIHRoZSBCdW4gdmVyc2lvbiBpbnN0YWxsaW5nIHRoZSByZXBvc2l0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBpZiAoIWNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKSB7XG4gICAgLy8gQnVuIGNvbG9yaXplcyB0aGUgbGlzdCBtYXJrZXJzIHdoZW4gRk9SQ0VfQ09MT1IgaXMgc2V0IChlLmcuIGJ5IHRlc3QgcnVubmVycyBvbiBDSSksIHNvXG4gICAgLy8gQU5TSSBlc2NhcGUgc2VxdWVuY2VzIG11c3QgYmUgc3RyaXBwZWQgYmVmb3JlIHBhcnNpbmcuXG4gICAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdidW4nLCBbJ3BtJywgJ2RlZmF1bHQtdHJ1c3RlZCddLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbChcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIG1hdGNoaW5nIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyByZXF1aXJlcyB0aGUgRVNDIGNvbnRyb2wgY2hhcmFjdGVyXG4gICAgICAvXFx1MDAxQlxcW1swLTk7XSptL2d1LFxuICAgICAgJydcbiAgICApO1xuICAgIGNvbnN0IHBhcnNlZERlcGVuZGVuY2llcyA9IG5ldyBTZXQoWy4uLnN0ZG91dC5tYXRjaEFsbCgvXlxccyotXFxzKyhcXFMrKSQvZ211KV0ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0gYXMgc3RyaW5nKSk7XG4gICAgaWYgKHBhcnNlZERlcGVuZGVuY2llcy5zaXplID09PSAwKSB7XG4gICAgICAvLyBEbyBub3QgY2FjaGUgdGhlIGZhaWx1cmU6IGEgdGFyZ2V0LWxvY2FsIHByb2JsZW0gKGUuZy4gYW4gdW5yZWFkYWJsZSBwYWNrYWdlLmpzb24pIG11c3RcbiAgICAgIC8vIG5vdCBkZW55IHRoZSBkZWZhdWx0IGxpc3QgdG8gZXZlcnkgbGF0ZXIgdGFyZ2V0IG9mIGEgbXVsdGktcGF0aCBydW4uXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZWFkIHRoZSBkZWZhdWx0IGFsbG93LWxpc3QgdmlhIGBidW4gcG0gZGVmYXVsdC10cnVzdGVkYC4nKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gcGFyc2VkRGVwZW5kZW5jaWVzO1xuICB9XG4gIHJldHVybiBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICAvLyBFeHBsaWNpdCByb290IHB1Ymxpc2hpbmcgaW50ZW50IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB3YmZ5J3MgcHJpdmF0ZSBtb25vcmVwby1yb290IGRlZmF1bHQuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgKGNvbmZpZy5yZWxlYXNlLm5wbVB1Ymxpc2hlc1Jvb3QgfHwganNvbk9iai5wdWJsaXNoQ29uZmlnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnByaXZhdGU7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmICFjb25maWcucmVsZWFzZS5ucG0gJiYgIWpzb25PYmoucHVibGlzaENvbmZpZykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICAgIC8vIFdpdGhvdXQgYW4gZXhwbGljaXQgcmVnaXN0cnksIG5wbSByZXNvbHZlcyB0aGUgcHVibGlzaCB0YXJnZXQgZnJvbSB0aGUgd29ya3NwYWNlIC5ucG1yYyxcbiAgICAvLyB3aG9zZSBkZWZhdWx0IHJlZ2lzdHJ5IG9uIENJIG1heSBiZSB0aGUgVGFrdW1pIEd1YXJkIGluc3RhbGwgcHJveHkg4oCUIHdoaWNoIHJlamVjdHNcbiAgICAvLyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1IChzaGFyZWQjMTA3MikuIGA/Pz1gIGtlZXBzIGEgZGVsaWJlcmF0ZWx5IGRpZmZlcmVudCByZWdpc3RyeS5cbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcucmVnaXN0cnkgPz89ICdodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8nO1xuICB9XG4gIGNvbnN0IG93bmVyID0gY29uZmlnLnJlcG9BdXRob3I7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAnYnVuIHJ1biBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBjb25zdCBzY3JpcHRSdW5uZXIgPSAnYnVuIHJ1bic7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYCR7c2NyaXB0UnVubmVyfSBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gXSA9IGdldFB5dGhvblNldHVwQ29tbWFuZChweXRob25QYWNrYWdlTWFuYWdlcik7XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGNvbnN0IHB5dGhvblJ1bm5lciA9IGAke3B5dGhvblBhY2thZ2VNYW5hZ2VyfSBydW5gO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGAke3B5dGhvblJ1bm5lcn0gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmICR7cHl0aG9uUnVubmVyfSBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGAke3NjcmlwdFJ1bm5lcn0gbGludGA7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQpO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBnZW5Db2RlU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICBpZiAoc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnKSkge1xuICAgIC8vIFByZXNlcnZlIHByb2plY3Qtc3BlY2lmaWMgc3RlcHMgYSByZXBvIGFwcGVuZGVkIHRvIHRoZSBtYW5hZ2VkIGBidW4gd2IgZ2VuLWNvZGVgIChlLmcuIGJ1aWxkaW5nIGV4dHJhIGRlcGxveVxuICAgIC8vIGFzc2V0cykgaW5zdGVhZCBvZiBkaXNjYXJkaW5nIHRoZW07IG9ubHkgdGhlIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudCBpcyB3YmZ5J3MgdG9cbiAgICAvLyByZWdlbmVyYXRlLiBBbiB1bnBhcnNlYWJsZSBzY3JpcHQgaXMgbGVmdCBhbG9uZSByYXRoZXIgdGhhbiByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuICAgIGNvbnN0IHNlZ21lbnRzID0gZ2VuQ29kZVNjcmlwdCA9PT0gdW5kZWZpbmVkID8gW10gOiBzcGxpdFNjcmlwdFNlZ21lbnRzKGdlbkNvZGVTY3JpcHQpO1xuICAgIGNvbnN0IGN1c3RvbVNlZ21lbnRzID0gc2VnbWVudHM/LmZpbHRlcihcbiAgICAgIChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwganNvbk9iai5zY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICApO1xuICAgIGlmIChjdXN0b21TZWdtZW50cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gWydidW4gd2IgZ2VuLWNvZGUnLCAuLi5jdXN0b21TZWdtZW50c10uam9pbignICYmICcpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5jaGFrcmEgfHwgY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgY29uZmlnLmRlcGVuZGluZy5wcmlzbWE7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGZvcm1hdFNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZvcm1hdFNjcmlwdCA/IGAke2Zvcm1hdFNjcmlwdH0gJiYgYnVuIHJ1biBmb3JtYXQtY29kZWAgOiAnYnVuIHJ1biBmb3JtYXQtY29kZSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbmZpZ01qc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcubWpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdNanNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmoudHlwZSA9ICdtb2R1bGUnO1xuXG4gIGNvbnN0IGNvbmZpZ0R0c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC50cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRHRzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLmZpbGVzID0gWy4uLm5ldyBTZXQoWy4uLihqc29uT2JqLmZpbGVzID8/IFtdKSwgJ2NvbmZpZy5kLm10cyddKV07XG4gIC8vIE5vZGVOZXh0IHJlc29sdmVzIGEgcmVsYXRpdmUgYC4vY29uZmlnLm1qc2AgaW1wb3J0IHRvIGBjb25maWcuZC5tdHNgLCBub3RcbiAgLy8gdGhlIHBhY2thZ2UtbGV2ZWwgYHR5cGVzYCBmaWVsZC4gS2VlcCB0aGUgcHVibGlzaGVkIGNvbmZpZyBpbXBvcnRhYmxlIGZyb21cbiAgLy8gcGFja2FnZS1sb2NhbCBUeXBlU2NyaXB0IGxpbnRlciBzZXR0aW5ncy5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+XG4gICAgZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpXG4gICk7XG59XG5cbmNvbnN0IGNvbmZpZ0RtdHNDb250ZW50ID0gYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5gO1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICBjb25zdCBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcywganNvbk9iaildLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcywganNvbk9iaildLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcykuZmlsdGVyKFxuICAgIChkZXBlbmRlbmN5KSA9PlxuICAgICAgbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkgJiZcbiAgICAgIC8vIEEgcHVibGljIHBhY2thZ2UncyBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIG11c3QgbmV2ZXIgYmUgcmUtbWFuYWdlZCB2aWEgYSByZWdpc3RyeSBpbnN0YWxsXG4gICAgICAvLyAocHJpdmF0ZSBvbmVzIGFyZSBub3JtYWxpemVkIHRvIGB3b3Jrc3BhY2U6KmAgbGF0ZXIpLiBUaGlzIGFsc28gY292ZXJzIHJ1bm5pbmcgd2JmeSBvbiBhXG4gICAgICAvLyBtb25vcmVwbyBTVUJESVJFQ1RPUlksIHdoZXJlIHRoZSBwYXJlbnQncyB3b3Jrc3BhY2VzIGFyZSBpbnZpc2libGUgYW5kIHRoZSB3b3Jrc3BhY2UtbWFwXG4gICAgICAvLyBndWFyZCBpbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyBjYW5ub3QgcHJvdGVjdCB0aGUgc3BlY2lmaWVyLlxuICAgICAgKGpzb25PYmoucHJpdmF0ZSB8fCAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IHZvaWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICAgIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHJvb3RDb25maWcsIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICAvLyBgbWlzZSB3aGljaCBweXRob25gIHlpZWxkcyB0aGUgc2luZ2xlIGFjdGl2ZSBpbnRlcnByZXRlciBwYXRoOyBgbWlzZSBjdXJyZW50IHB5dGhvbmAgY2FuXG4gIC8vIHByaW50IG11bHRpcGxlIHNwYWNlLXNlcGFyYXRlZCB2ZXJzaW9ucyAobWlzZSBzdXBwb3J0cyBtdWx0aS12ZXJzaW9uIHBpbnMpLCB3aGljaCB3b3VsZCBwYXNzXG4gIC8vIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIGBwb2V0cnkgZW52IHVzZWAuIFdoZW4gbWlzZSBpcyBtaXNzaW5nIG9yIHB5dGhvbiBpc1xuICAvLyB1bmNvbmZpZ3VyZWQsIHNraXAgYHBvZXRyeSBlbnYgdXNlYCBhbmQgZmFsbCBiYWNrIHRvIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIgaW5zdGVhZCBvZlxuICAvLyBhYm9ydGluZyB0aGUgY2hhaW4uXG4gIC8vIFRoZSBgfHwgdHJ1ZWAgY292ZXJzIG9ubHkgdGhlIG1pc2UgcmVzb2x1dGlvbjogYSBtaXNzaW5nL3VuY29uZmlndXJlZCBtaXNlIGZhbGxzIGJhY2sgdG9cbiAgLy8gcG9ldHJ5J3MgZGVmYXVsdCBpbnRlcnByZXRlciwgd2hpbGUgYSBmYWlsaW5nIGBwb2V0cnkgZW52IHVzZWAgc3RpbGwgYWJvcnRzIHRoZSBjaGFpbi5cbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiB7IHB5dGhvbl9wYXRoPVwiJChtaXNlIHdoaWNoIHB5dGhvbiAyPi9kZXYvbnVsbClcIiB8fCB0cnVlOyB9ICYmIHsgWyAteiBcIiRweXRob25fcGF0aFwiIF0gfHwgcG9ldHJ5IGVudiB1c2UgXCIkcHl0aG9uX3BhdGhcIjsgfSAmJiBwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgJiYgcG9ldHJ5IGluc3RhbGwnO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbXG4gICAgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpKSksXG4gIF07XG4gIHNwYXduU3luYygnYnVuJywgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAnLS1leGFjdCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgLy8gQSBwcml2YXRlIHBhY2thZ2Ugd2hvc2UgbW9ub3JlcG8gY29udGFpbnMgdGhpcyBkZXBlbmRlbmN5IGFzIGEgd29ya3NwYWNlIG11c3QgcmVmZXJlbmNlIGl0XG4gICAgLy8gdmlhIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2w6IHBpbm5pbmcgYSByZWdpc3RyeSB2ZXJzaW9uIG1ha2VzIEJ1biBzaGFkb3cgdGhlIHNhbWUtbmFtZVxuICAgIC8vIHdvcmtzcGFjZSBhbmQgc2tpcCBpbnN0YWxsaW5nIHRoZSB3b3Jrc3BhY2UncyBvd24gZGVwZW5kZW5jaWVzLiAoUHVibGlzaGVkIHBhY2thZ2VzIGluc3RlYWRcbiAgICAvLyBwaW4gYSBjb25jcmV0ZSB2ZXJzaW9uIGJlY2F1c2UgYG5wbSBwdWJsaXNoYCByZWplY3RzIGB3b3Jrc3BhY2U6KmAgc3BlY2lmaWVycyDigJQgYnV0IGFuXG4gICAgLy8gRVhJU1RJTkcgYHdvcmtzcGFjZTpgIGRlY2xhcmF0aW9uIGlzIGFsd2F5cyBrZXB0OiBvdmVyd3JpdGluZyBpdCB3aXRoIGEgcmVnaXN0cnkgcmVsZWFzZVxuICAgIC8vIHdvdWxkIHNpbGVudGx5IGJyZWFrIHRoZSBsb2NhbCB3b3Jrc3BhY2UgbGluay4pXG5cbiAgICAvLyBBIGRlY2xhcmVkIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgYWx3YXlzIHdpbnMsIHdoZXRoZXIgb3Igbm90IHRoZSB3b3Jrc3BhY2UgbWFwIHNlZXMgdGhlXG4gICAgLy8gcGFja2FnZTogcnVubmluZyB3YmZ5IG9uIGEgbW9ub3JlcG8gU1VCRElSRUNUT1JZIGhpZGVzIHRoZSBwYXJlbnQncyB3b3Jrc3BhY2VzLCBzbyB0aGUgbWFwXG4gICAgLy8gYWxvbmUgY2Fubm90IGJlIHRydXN0ZWQgdG8gZGV0ZWN0IGEgbG9jYWwgd29ya3NwYWNlIGxpbmsuXG4gICAgaWYgKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChqc29uT2JqLnByaXZhdGUpIHtcbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSAnd29ya3NwYWNlOionO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChqc29uT2JqLnByaXZhdGUgJiYgZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykuaGFzKGRlcGVuZGVuY3kpKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFleGlzdGluZ1NwZWNpZmllciB8fCBleGlzdGluZ1NwZWNpZmllci5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSAnd29ya3NwYWNlOionO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIEFuIGV4aXN0aW5nIENPTkNSRVRFIHBpbiBvbiBhIHdvcmtzcGFjZSBwYWNrYWdlIGlzIGEgZGVsaWJlcmF0ZSBjaG9pY2UgYW5kIG11c3Qgbm90IGJlXG4gICAgICAvLyBjb252ZXJ0ZWQgdG8gdGhlIHdvcmtzcGFjZSBwcm90b2NvbC4gTm90ZSB0aGUgdHJhZGUtb2ZmIGVpdGhlciB3YXk6IG5wbSAod2hpY2hcbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHNoZWxscyBvdXQgdG8pIGNhbm5vdCBwYXJzZSBgd29ya3NwYWNlOmAgc3BlY2lmaWVycywgd2hpbGVcbiAgICAgIC8vIGEgcmVnaXN0cnkgcGluIG1ha2VzIGEgY29sZCBidW4gaW5zdGFsbCBzaGFkb3cgdGhlIHdvcmtzcGFjZSBhbmQgc2tpcCBpdHMgZGVwZW5kZW5jaWVzIOKAlFxuICAgICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGtlZXBzIGB3b3Jrc3BhY2U6KmAgYW5kIHN0cmlwcyB0aGUgcHJvdG9jb2wgb24gdGhlIENJIGNoZWNrb3V0IHJpZ2h0XG4gICAgICAvLyBiZWZvcmUgcmVsZWFzaW5nIChzY3JpcHRzL3N0cmlwV29ya3NwYWNlUHJvdG9jb2wubWpzKS4gRmFsbCB0aHJvdWdoIHNvIGEgY29uY3JldGUgcGluXG4gICAgICAvLyBrZWVwcyBiZWluZyBidW1wZWQgbGlrZSBhbnkgbWFuYWdlZCBkZXBlbmRlbmN5LlxuICAgIH1cbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgY29uZmlnLFxuICAgICAgcm9vdENvbmZpZyxcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICAgIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICAgICAgLy8gYGJ1biBhZGQgZGVwZW5kZW5jeWAgcHJlc2VydmVzIGFuIGV4aXN0aW5nIGV4YWN0IHBpbiwgc28gd3JpdGUgdGhlIGFnZS1jbGVhcmVkIHZlcnNpb25cbiAgICAgICAgLy8gZGlyZWN0bHkuIFRoZSBmaW5hbCByZXBvc2l0b3J5LXdpZGUgaW5zdGFsbCByZWZyZXNoZXMgdGhlIGxvY2tmaWxlIGFmdGVyIGV2ZXJ5IHBhY2thZ2VcbiAgICAgICAgLy8gbWFuaWZlc3QgaGFzIGNvbnZlcmdlZCBvbiB0aGUgZ2VuZXJhdGVkIHJlbGVhc2UtYWdlIHBvbGljeS5cbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBtYW5hZ2VkVmVyc2lvbjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICAgIGlmICghc2tpcEFkZGluZ0RlcHMpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICBpZiAobGF0ZXN0VmVyc2lvbiA9PT0gJyonICYmIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGxhdGVzdFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvSW5zdGFsbDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWc6IFBhY2thZ2VDb25maWcsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZUZpbGVQYXRoKSByZXR1cm47XG5cbiAgLy8gUmV1c2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3Mgb3duIGZvcm1hdHRlciBhZnRlciBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbiBzb1xuICAvLyBwYWNrYWdlLmpzb24gbWF0Y2hlcyB3aGF0ZXZlciBpdHMgY3VycmVudCBzb3J0LXBhY2thZ2UtanNvbiB2ZXJzaW9uIGV4cGVjdHMuXG4gIC8vIFRoaXMgYXZvaWRzIGZvbGxvdy11cCBhdXRvZml4IGNvbW1pdHMgY2F1c2VkIG9ubHkgYnkgZm9ybWF0dGVyIHZlcnNpb24gZHJpZnRcbiAgLy8gYmV0d2VlbiB3YmZ5IGFuZCB0aGUgcHJvamVjdCBiZWluZyB1cGRhdGVkLlxuICBzcGF3blN5bmMoJ2J1bngnLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHVzZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlZERlcGVuZGVuY3lTZXQgPSBuZXcgU2V0KHVzZWREZXBlbmRlbmNpZXMpO1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGF3YWl0IGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHVzZWREZXBlbmRlbmN5U2V0LmhhcyhkZXBlbmRlbmN5KSB8fCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBiYXNlLWNvbmZpZyBwYWNrYWdlcy4gUmVtb3ZlIHN0YWxlIHZhcmlhbnRzIHdoZW4gcmVwb1xuICAgIC8vIGNhcGFiaWxpdGllcyBjaGFuZ2UsIHN1Y2ggYXMgTmV4dC5qcyB0YWtpbmcgb3duZXJzaGlwIG9mIHRzY29uZmlnLmpzb24uXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90c2NvbmZpZyouanNvbicsIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgY29uc3QgYWJzb2x1dGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIC8vIFR5cGVTY3JpcHQgNydzIG5hdGl2ZSBjb21waWxlciBkcm9wcGVkIHRoZSBpbi1wcm9jZXNzIGBwYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uYFxuICAgIC8vIGhlbHBlciwgc28gcGFyc2UgdGhlIHRzY29uZmlnIGludG8gYW4gQVNUIGFuZCByZWFkIGl0cyB0b3AtbGV2ZWwgYGV4dGVuZHNgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShhYnNvbHV0ZUZpbGVQYXRoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgY29uc29sZS53YXJuKGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQuYCk7XG4gICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZSkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gZGVwZW5kZW5jeSB8fCB2YWx1ZS5zdGFydHNXaXRoKGAke2RlcGVuZGVuY3l9L2ApKSB7XG4gICAgICAgICAgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzO1xufVxuXG4vKiogUmVhZHMgdGhlIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZW50cmllcyAoYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncykgZnJvbSBhIHBhcnNlZCB0c2NvbmZpZy4gKi9cbmZ1bmN0aW9uIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlKSkge1xuICAgIGlmIChhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpICYmIGFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkgJiYgcHJvcGVydHkubmFtZS50ZXh0ID09PSAnZXh0ZW5kcycpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKHByb3BlcnR5LmluaXRpYWxpemVyLCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiByZWFkb25seSBhc3QuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlW10ge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzb3VyY2Uuc3RhdGVtZW50cykge1xuICAgIGlmIChhc3QuaXNFeHByZXNzaW9uU3RhdGVtZW50KHN0YXRlbWVudCkgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pKSB7XG4gICAgICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb24ucHJvcGVydGllcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhub2RlOiBhc3QuRXhwcmVzc2lvbiwgdmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAoYXN0LmlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgIHZhbHVlcy5wdXNoKG5vZGUudGV4dCk7XG4gIH0gZWxzZSBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihub2RlKSkge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBub2RlLmVsZW1lbnRzKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhlbGVtZW50LCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoZGVwZW5kZW5jeSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLnNldChkZXBlbmRlbmN5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeSkpIHtcbiAgICByZXR1cm4gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICB9XG5cbiAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdGltZXMgPSBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeSk7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGlmIChsYXRlc3RWZXJzaW9uICE9PSAnKicgJiYgaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHRpbWVzW2xhdGVzdFZlcnNpb25dKSkge1xuICAgIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICB9XG5cbiAgcmV0dXJuIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzKVswXSA/PyAnKic7XG59XG5cbi8qKiBFdmVyeSBzdGFibGUgcmVsZWFzZSBpbiBgdGltZXNgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2UgZ2F0ZSwgbmV3ZXN0IGZpcnN0LiAqL1xuZnVuY3Rpb24gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcodGltZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh0aW1lcylcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IHNlbXZlci52YWxpZCh2ZXJzaW9uKSlcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IChzZW12ZXIucHJlcmVsZWFzZSh2ZXJzaW9uKT8ubGVuZ3RoID8/IDApID09PSAwKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gTnVtYmVyLmlzRmluaXRlKERhdGUucGFyc2UocHVibGlzaGVkQXQpKSlcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IG5vdyAtIERhdGUucGFyc2UocHVibGlzaGVkQXQpID49IHBhY2thZ2VBZ2VHYXRlTXMpXG4gICAgLnRvU29ydGVkKChbdmVyc2lvbkFdLCBbdmVyc2lvbkJdKSA9PiBzZW12ZXIucmNvbXBhcmUodmVyc2lvbkEsIHZlcnNpb25CKSlcbiAgICAubWFwKChbdmVyc2lvbl0pID0+IHZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUocHVibGlzaGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXB1Ymxpc2hlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHB1Ymxpc2hlZFRpbWUgPSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwdWJsaXNoZWRUaW1lKSAmJiBEYXRlLm5vdygpIC0gcHVibGlzaGVkVGltZSA+PSBwYWNrYWdlQWdlR2F0ZU1zO1xufVxuXG5mdW5jdGlvbiBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZGVwZW5kZW5jeS5yZXBsYWNlKC9AW15AL10rJC91LCAnJyk7XG4gIGNvbnN0IGNhY2hlZFRpbWVzID0gbnBtUGFja2FnZVRpbWVzQ2FjaGUuZ2V0KHBhY2thZ2VOYW1lKTtcbiAgaWYgKGNhY2hlZFRpbWVzKSByZXR1cm4gY2FjaGVkVGltZXM7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICducG0nLFxuICAgIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndGltZScsICctLWpzb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgcHJvY2Vzcy5jd2QoKVxuICApO1xuICBpZiAoIXN0ZG91dCkgcmV0dXJuIHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBbUmVjb3JkPHN0cmluZywgc3RyaW5nPl07XG4gICAgY29uc3QgdGltZXMgPSBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWRbMF0gOiBwYXJzZWQ7XG4gICAgaWYgKCF0aW1lcykgcmV0dXJuIHt9O1xuICAgIG5wbVBhY2thZ2VUaW1lc0NhY2hlLnNldChwYWNrYWdlTmFtZSwgdGltZXMpO1xuICAgIHJldHVybiB0aW1lcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEtlZXAgcGlubmluZyBhbGlnbmVkIHdpdGggQnVuJ3MgZXhlbXB0aW9ucy4gd2JmeSdzIGdlbmVyYXRlZCBjb25maWd1cmF0aW9uIGNhbiByZWx5IG9uIHRoZVxuICAvLyBjdXJyZW50IHdiIGNvbnRyYWN0LCBzbyBpbmRlcGVuZGVudGx5IHNvYWtpbmcgb3IgZG93bmdyYWRpbmcgd2Igd291bGQgcGFpciBuZXcgZ2VuZXJhdGVkIGZpbGVzXG4gIC8vIHdpdGggYW4gaW5jb21wYXRpYmxlIG9sZCBDTEksIGFuZCBhIHRlbXBvcmFyaWx5IGV4ZW1wdGVkIHBhY2thZ2UgbXVzdCByZWFjaCBpdHMgc2VjdXJpdHkgZml4LlxuICAvLyBPbmx5IHBhY2thZ2VzIEJ1biBpdHNlbGYgZ2F0ZXMgbWF5IGJlIHNlbGVjdGVkIGZyb20gb2xkZXIgdGFncy5cbiAgcmV0dXJuICFidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLnNvbWUoKHBhdHRlcm4pID0+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/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHF1b3RlRm9yU2hlbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG4vLyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gdGhlIHVucXVvdGVkIGxvb3BzIGJlbG93IGtlZXAgcGF0aHNcbi8vIHdpdGggc3BhY2VzIGludGFjdC5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gYnVuIHJlY29yZHMgYW4gYWJzb2x1dGUgYHJlc29sdmVkYCBVUkwgZm9yIGFuIGFscmVhZHktbG9ja2VkIHBhY2thZ2Ugd2hlbmV2ZXIgdGhlXG4gICAgICAvLyBjb25maWd1cmVkIHJlZ2lzdHJ5IGRvZXMgbm90IHNlcnZlIHRoZSB0YXJiYWxsIGhvc3QgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEg4oCUIHdoaWNoIGlzXG4gICAgICAvLyBleGFjdGx5IHdoYXQgdGhlIFRha3VtaSBHdWFyZCBwcm94eSBkb2VzLiBTbyBhbiBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBkZWZhdWx0XG4gICAgICAvLyByZWdpc3RyeSAoQ0ksIG9yIGEgZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50b1xuICAgICAgLy8gYnVuLmxvY2ssIGFuZCBjb21taXR0aW5nIHRoZW0gcGlucyBhIFNIQVJFRCBsb2NrZmlsZSB0byBvbmUgZW52aXJvbm1lbnQncyBtaXJyb3I6IGV2ZXJ5XG4gICAgICAvLyBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoIHRoZSBwcm94eSwgYW5kIGEgY29sZC1jYWNoZSBpbnN0YWxsIGZhaWxzIG91dHJpZ2h0IHdpdGhcbiAgICAgIC8vIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYSByZWdpc3RyeS5ucG1qcy5vcmcgdG9rZW4sIGJlY2F1c2UgYnVuIHNlbmRzIHRoZVxuICAgICAgLy8gZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3QgdGhlIGxvY2tmaWxlIG5hbWVzLiBHdWFyZCBjb3ZlcmFnZSBkb2VzXG4gICAgICAvLyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuIGRlcml2ZXMgdGhlIGRvd25sb2FkIFVSTCBmcm9tXG4gICAgICAvLyB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gc3RyaXAgdGhlbS4gT25seSB0aGUgR3VhcmQgaG9zdCBpcyBzdHJpcHBlZDogYSBzY29wZWRcbiAgICAgIC8vIHJlZ2lzdHJ5IHN1Y2ggYXMgVmVyZGFjY2lvIGxlZ2l0aW1hdGVseSByZWNvcmRzIGl0cyBvd24gVVJMIGZvciBwcml2YXRlIHBhY2thZ2VzLlxuICAgICAgbmFtZTogJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUnLFxuICAgICAgZ2xvYjogJ2J1bi5sb2NrJyxcbiAgICAgIHJ1bjogJ2Jhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gge3N0YWdlZF9maWxlc30nLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBPbmx5IHdpbGxib29zdGVyLWNvbmZpZ3MgZ2V0cyB0aGlzIGpvYjogZXZlcnkgb3RoZXIgcmVwb3NpdG9yeSdzIHJlbm92YXRlLmpzb25jIG1lcmVseVxuICAgICAgLy8gZXh0ZW5kcyB0aGUgc2hhcmVkIHByZXNldCwgYW5kIHRoZSB2YWxpZGF0b3IgZG9lcyBub3QgcmVzb2x2ZSByZW1vdGUgcHJlc2V0cywgc28gcnVubmluZyBpdFxuICAgICAgLy8gdGhlcmUgd291bGQgdmFsaWRhdGUgdHdvIGxpbmVzIGFuZCBjYXRjaCBub3RoaW5nLiBgLS1uby1nbG9iYWxgIHZhbGlkYXRlcyB0aGUgcHJlc2V0IGFzIGFcbiAgICAgIC8vIHJlcG8gY29uZmlnIGluc3RlYWQgb2YgYSBzZWxmLWhvc3RlZCBnbG9iYWwgY29uZmlnLCBhbmQgYEBsYXRlc3RgIGtlZXBzIG5wbSBmcm9tIHNpbGVudGx5XG4gICAgICAvLyBpbnN0YWxsaW5nIGFuIGFuY2llbnQgUmVub3ZhdGUgdGhhdCBjYW5ub3QgZXZlbiBwYXJzZSBKU09OQyB3aGVuIHRoZSBsb2NhbCBOb2RlIGxhZ3MgYmVoaW5kLlxuICAgICAgLy8gU3RhZ2luZyBhIGRlbGV0aW9uIG9mIHJlbm92YXRlLmpzb25jIGxlYXZlcyBubyBmaWxlIGZvciBpbnNwZWN0aW9uLCBzbyBMZWZ0aG9vayBza2lwcyB0aGlzXG4gICAgICAvLyBqb2IgaW5zdGVhZCBvZiBydW5uaW5nIHRoZSB2YWxpZGF0b3Igb24gYSBtaXNzaW5nIHBhdGgg4oCUIGRlbGliZXJhdGVseSwgYmVjYXVzZSBkZWxldGluZyB0aGVcbiAgICAgIC8vIHNoYXJlZCBwcmVzZXQgaXMgbm90IGFuIG9wZXJhdGlvbiB0aGlzIGhvb2sgbmVlZHMgdG8gZ3VhcmQuXG4gICAgICBuYW1lOiAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyxcbiAgICAgIGdsb2I6ICdyZW5vdmF0ZS5qc29uYycsXG4gICAgICBydW46ICducHggLS15ZXMgLS1wYWNrYWdlIHJlbm92YXRlQGxhdGVzdCAtLSByZW5vdmF0ZS1jb25maWctdmFsaWRhdG9yIC0tc3RyaWN0IC0tbm8tZ2xvYmFsIHtzdGFnZWRfZmlsZXN9JyxcbiAgICB9LFxuICBdLFxufTtcblxuLy8gR2l0IGhvb2tzIGNhbGwgTGVmdGhvb2sgdGhyb3VnaCBhbiBhYnNvbHV0ZSBwYXRoLCBzbyB0aGV5IGFsc28gZmlyZSBpbiBhIGZyZXNoIHdvcmt0cmVlIHdpdGhvdXRcbi8vIG5vZGVfbW9kdWxlcy4gSW5zdGFsbGluZyBvbiBldmVyeSBydW4gd291bGQgc2xvdyBlYWNoIGhvb2sgcnVuIGFuZCB3b3VsZCBhbHNvIHJ1biBgcHJlcGFyZWAuXG5jb25zdCBpbnN0YWxsTWlzc2luZ0RlcHNDb21tYW5kID0gJ1sgLWQgbm9kZV9tb2R1bGVzIF0gfHwgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgfHwgZXhpdCc7XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIC8vIHByZXBhcmUgY2FsbHMgdGhpcyB3aXRob3V0IGFyZ3VtZW50cyBhZnRlciBCdW4gc2F2ZXMgdGhlIHJvb3QgbG9ja2ZpbGU7IExlZnRob29rIHBhc3NlcyBpdHNcbiAgLy8gc3RhZ2VkIHBhdGguIFRoZSB1bnByZWRpY3RhYmxlIHNpYmxpbmcgZmlsZSBtYWtlcyByZXBsYWNlbWVudCBhdG9taWMsIGBjcCAtcGAgcHJlc2VydmVzIGl0c1xuICAvLyBtb2RlLCBhbmQgdGhlIGFuY2hvcmVkIHBhdHRlcm4gY2Fubm90IGVyYXNlIGEgZGlyZWN0IHRhcmJhbGwgZGVwZW5kZW5jeSBVUkwuXG4gIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlOiBgXG4jIS9iaW4vYmFzaFxuc2V0IC1lXG5cbmlmIFtbIFwiJCNcIiAtZXEgMCBdXTsgdGhlblxuICBzZXQgLS0gYnVuLmxvY2tcbmZpXG5cbm5vcm1hbGl6ZWQ9XCJcIlxudHJhcCAnW1sgLXogXCIkbm9ybWFsaXplZFwiIF1dIHx8IHJtIC1mIFwiJG5vcm1hbGl6ZWRcIicgRVhJVFxuZm9yIGZpbGUgaW4gXCIkQFwiOyBkb1xuICBbWyAtZiBcIiRmaWxlXCIgXV0gfHwgY29udGludWVcbiAgbm9ybWFsaXplZD1cIiQobWt0ZW1wIFwiJGZpbGUud2JmeS1ub3JtYWxpemluZy5YWFhYWFhcIilcIlxuICBjcCAtcCBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiXG4gIHNlZCAtRSAncyMoXCIsIClcImh0dHBzOi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC9bXlwiXSpcIiNcXFxcMVwiXCIjZycgXCIkZmlsZVwiID4gXCIkbm9ybWFsaXplZFwiXG4gIGlmICEgY21wIC1zIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCI7IHRoZW5cbiAgICBtdiBcIiRub3JtYWxpemVkXCIgXCIkZmlsZVwiXG4gICAgZWNobyBcIlJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAkZmlsZSBzbyB0aGUgbG9ja2ZpbGUgc3RheXMgcmVnaXN0cnktYWdub3N0aWMuXCJcbiAgZmlcbiAgcm0gLWYgXCIkbm9ybWFsaXplZFwiXG4gIG5vcm1hbGl6ZWQ9XCJcIlxuZG9uZVxuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbY29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIGFsbENvbmZpZ3MpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnLCBhbGxDb25maWdzKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gnKSwgc2NyaXB0cy5ub3JtYWxpemVCdW5Mb2NrZmlsZSArICdcXG4nLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9IGAke2luc3RhbGxNaXNzaW5nRGVwc0NvbW1hbmR9XFxuYnVuIHdiIGxpbnQgLS1xdWlldGA7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9ic1xuICAgIC5maWx0ZXIoKGpvYikgPT4gam9iLm5hbWUgIT09ICd2YWxpZGF0ZS1yZW5vdmF0ZS1jb25maWcnIHx8IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncylcbiAgICAubWFwKChqb2IpID0+XG4gICAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uam9iLFxuICAgICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgICAgfVxuICAgICAgICA6IGpvYlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID0gWy4uLmV4dGVuc2lvbnMucHJldHRpZXJPbmx5XTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtpbnN0YWxsTWlzc2luZ0RlcHNDb21tYW5kfVxcbiR7Z2V0Q2xlYW51cENvbW1hbmRCb2R5KGNvbmZpZyl9YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmRCb2R5KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbmJ1biBydW4gLS1jd2QgcGFja2FnZXMvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cbiAgLy8gUHl0aG9uLW9ubHkgQnVuIHJlcG9zIGluc3RhbGwgd2IgZm9yIHNoYXJlZCBzY3JpcHRzIGJ1dCBub3QgT3hsaW50LCBzb1xuICAvLyBzdGFnZWQtZmlsZSBob29rcyBtdXN0IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZm9ybWF0dGVyIHBhdGggYmVsb3cuXG4gIGNvbnN0IGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICBpZiAoY2FuVXNlV2JGb3JTdGFnZWRGaWxlcykge1xuICAgIHJldHVybiBgXG5idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbnBhY2thZ2VfanNvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcIlxuJHtoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpID8gU3RyaW5nLnJhd2BweXRob25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwucHkkJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCA/IFN0cmluZy5yYXdgZGFydF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5kYXJ0JCcgfCBncmVwIC12ICdnZW5lcmF0ZWQnIHwgZ3JlcCAtdiAnXFwuZnJlZXplZFxcLmRhcnQkJyB8IGdyZXAgLXYgJ1xcLmdcXC5kYXJ0JCcgfHwgdHJ1ZSlcImAgOiAnJ31cblxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIGJ1biBzb3J0LXBhY2thZ2UtanNvbiAkcGFja2FnZV9qc29uX2ZpbGVzXG5maVxuJHtcbiAgaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKVxuICAgID8gYGlmIFsgLW4gXCIkcHl0aG9uX2ZpbGVzXCIgXTsgdGhlblxuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBibGFjayAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGZsYWtlOCAkcHl0aG9uX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbFxuICAgID8gYGlmIFsgLW4gXCIkZGFydF9maWxlc1wiIF07IHRoZW5cbiAgZGFydCBmb3JtYXQgJGRhcnRfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2NhbFdiUGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZXMnLCAnd2InLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93Yic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfHJ1c3QtdG9vbGNoYWluKFxcLnRvbWwpPylgO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICAvLyBgbWlzZSBhY3RpdmF0ZWAgdXBkYXRlcyBQQVRIIG9ubHkgd2hlbiB0aGUgcHJvbXB0IGlzIGRyYXduLCBzbyB0aGUgaG9vayBpbmhlcml0cyB0aGUgdG9vbFxuICAvLyB2ZXJzaW9ucyBwaW5uZWQgYmVmb3JlIHRoZSBtZXJnZTsgcmVmcmVzaCBQQVRIIHNvIGEgcHVsbGVkIEJ1biBwaW4gaW5zdGFsbHMgd2l0aCB0aGF0IEJ1bi5cbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaCgnZXZhbCBcIiQobWlzZSBlbnYgLXMgYmFzaClcIicpO1xuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9ICdidW4gaW5zdGFsbCc7XG4gIC8vIERvIE5PVCBhZGQgYC52aW5leHRgIGhlcmU6IGl0IGhvbGRzIG9ubHkgdmluZXh0J3MgY29udGVudC1oYXNoZWQgZm9udCBjYWNoZSBhbmQgdGhlIGRldlxuICAvLyBzZXJ2ZXIncyBsb2NrIGZpbGUgKGRlbGV0aW5nIHRoZSBsb2NrIGRpc2FibGVzIHRoZSBkdXBsaWNhdGUtZGV2LXNlcnZlciBndWFyZCBmb3IgYSBydW5uaW5nXG4gIC8vIHNlcnZlcikuIHZpbmV4dCdzIGJ1aWxkIG91dHB1dCBnb2VzIHRvIGBkaXN0L2AsIGFuZCBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpcyBoYW5kbGVkIGJ5XG4gIC8vIHRoZSBzZXBhcmF0ZSBpbnN0YWxsLWxheW91dCBob29rIGJlbG93LlxuICAvLyBTY2FuIGV2ZXJ5IHdvcmtzcGFjZSBjb25maWcgKG5vdCBqdXN0IHRoZSByb290KTogaW4gYSBtb25vcmVwbyB0aGUgYXBwIHVzdWFsbHkgbGl2ZXMgaW5cbiAgLy8gcGFja2FnZXMvPGFwcD4gb3IgYXBwcy88YXBwPiwgYW5kIHRoZSBjYWNoZSBkaXJlY3RvcmllcyBhcmUgd29ya3NwYWNlLXJlbGF0aXZlLlxuICBjb25zdCBuZXh0Q2FjaGVEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5uZXh0LFxuICAgICcubmV4dCdcbiAgKTtcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3JpZXMgPVxuICAgIG5leHRDYWNoZURpclBhdGhzLmxlbmd0aCA+IDAgPyBgICYmIHJtIC1SZiAtLSAke25leHRDYWNoZURpclBhdGhzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9YCA6ICcnO1xuICAvLyBCdW4gZG9lcyBub3QgcmVsaW5rIGFuIGV4aXN0aW5nIGlzb2xhdGVkIHRyZWUgd2hlbiBnbG9iYWxTdG9yZS9saW5rZXIgc2V0dGluZ3MgY2hhbmdlLiBJbnNwZWN0XG4gIC8vIHRob3NlIGtleXMgcmF0aGVyIHRoYW4gZXZlcnkgYnVuZmlnIGNoYW5nZTogbWluaW11bVJlbGVhc2VBZ2UgdXBkYXRlcyBtdXN0IG5vdCBkZXN0cm95IGFcbiAgLy8gY29udHJpYnV0b3IncyB3b3JraW5nIGluc3RhbGwgYmVmb3JlIGEgcG90ZW50aWFsbHkgbmV0d29yay1kZXBlbmRlbnQgcmVwbGFjZW1lbnQgc3VjY2VlZHMuXG4gIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhjb25maWcsIGFsbENvbmZpZ3MsICgpID0+IHRydWUsICdub2RlX21vZHVsZXMnKTtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YGlmIGdpdCBkaWZmIC0tbm8tY29sb3IgLVUwIE9SSUdfSEVBRCBIRUFEIC0tICcqYnVuZmlnLnRvbWwnIHwgZ3JlcCAtLXF1aWV0IC1FICdeWystXSAqKGdsb2JhbFN0b3JlfGxpbmtlcnxwdWJsaWNIb2lzdFBhdHRlcm4pJzsgdGhlbiBybSAtUmYgLS0gJHtub2RlTW9kdWxlc0RpclBhdGhzLm1hcChxdW90ZUZvclNoZWxsKS5qb2luKCcgJyl9OyBmaWBcbiAgKTtcbiAgLy8gYnVuLmxvY2stb25seSBtZXJnZXMgKFJlbm92YXRlIGxvY2tmaWxlIG1haW50ZW5hbmNlKSwgYnVuZmlnLnRvbWwgLyAubnBtcmMgY2hhbmdlcyAobGlua2VyLFxuICAvLyByZWdpc3RyeSwgaG9pc3RpbmcpLCBhbmQgcGF0Y2ggZWRpdHMgYWxsIGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dCB0b3VjaGluZyBwYWNrYWdlLmpzb24uXG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihwYWNrYWdlXFwuanNvbnxidW5cXC5sb2NrfGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmN8cGF0Y2hlcy8pXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3JpZXN9XCIgfHwgZXhpdGBcbiAgKTtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChpbnN0YWxsTWlzc2luZ0RlcHNDb21tYW5kKTtcbiAgLy8gVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaW4gbm9kZV9tb2R1bGVzLy52aXRlIHNlbGYtaW52YWxpZGF0ZXMgb24gbG9ja2ZpbGUgLyBwYXRjaGVzIC9cbiAgLy8gY29uZmlnIC8gTk9ERV9FTlYgY2hhbmdlcyAoc2VlIFZpdGUncyBkZXAgcHJlLWJ1bmRsaW5nIGRvY3MpLCBzbyB0aGUgcmVzaWR1YWwgc3RhbGUgY2FzZSBpc1xuICAvLyBpbnN0YWxsLWxheW91dCBjaGFuZ2VzIChidW5maWcudG9tbCBsaW5rZXIsIC5ucG1yYyk6IHRoZXkgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0XG4gIC8vIHRvdWNoaW5nIHRoZSBsb2NrZmlsZSwgYW5kIHRoZXkgYXJlIGFic2VudCBmcm9tIFZpdGUncyBjYWNoZSBrZXkuXG4gIGNvbnN0IHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpdGUsXG4gICAgJ25vZGVfbW9kdWxlcy8udml0ZSdcbiAgKTtcbiAgaWYgKHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMubGVuZ3RoID4gMCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmMpXCIgXCJybSAtUmYgLS0gJHtybVZpdGVDYWNoZURpcmVjdG9yaWVzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9XCJgXG4gICAgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICAvLyBCbGl0eiByZXBvc2l0b3JpZXMgZGVsaWJlcmF0ZWx5IGdldCB0aGUgc2FtZSB3Yi1kcml2ZW4gcHJpc21hIGNvbW1hbmRzIGFzIGV2ZXJ5b25lIGVsc2U6XG4gIC8vIHRoZSBibGl0eiBDTEkncyBjb2RlZ2VuIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2UsIHdoaWNoIG11c3QgbmV2ZXIgcnVuXG4gIC8vIHVuZGVyIEJ1bidzIHNoYXJlZCBnbG9iYWwgc3RvcmUuIFlhcm4tZXJhIEJsaXR6IHJlcG9zIGdldCB0aGVpciByb3V0ZSBtYW5pZmVzdCBmcm9tXG4gIC8vIGB3YiBnZW4tY29kZWAncyBgYmxpdHogY29kZWdlbmAgc3RlcCwgYW5kIGN1cnJlbnQgd2Igcm91dGVzIG9ubHkgYHdiIHByaXNtYSBzZWVkYCB0aHJvdWdoXG4gIC8vIHRoZSBibGl0eiBDTEksIG9ubHkgZm9yIG5vbi1CdW4gcmVwb3MgKHNlZSBwYWNrYWdlcy93Yi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzKTsgdGhlXG4gIC8vIHBvc3QtbWVyZ2UgaG9va3Mgc3RheSB3Yi1kcml2ZW4gYmVjYXVzZSBgcHJpc21hIGRlcGxveWAvYGdlbmVyYXRlYCBuZWVkIG5vIGJsaXR6IGxvYWRlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuLy8gVGhlIGdlbmVyYXRlZCBjb21tYW5kIHBhc3NlcyB0aHJvdWdoIFRXTyBzaGVsbCBwYXJzaW5nIHN0YWdlczogdGhlIHByZXBhcmUuc2ggbGluZSBwYXJzZXMgaXQgYXNcbi8vIGEgZG91YmxlLXF1b3RlZCBhcmd1bWVudCAocHJvY2Vzc2luZyBcXCwgYCwgJCBhbmQgXCIgaW1tZWRpYXRlbHkpLCBhbmQgcnVuX2lmX2NoYW5nZWQgdGhlbiBldmFsJ3Ncbi8vIGl0ICh3b3JkLXNwbGl0dGluZyBhbmQgZ2xvYmJpbmcpLiBBbiB1bnF1b3RlZCBwYXRoIGNvbnRhaW5pbmcgc3BhY2VzIChlLmcuIGBhcHBzL215IGFwcC8ubmV4dGApXG4vLyB3b3VsZCB3b3JkLXNwbGl0IGludG8gdW5yZWxhdGVkIHJtIHRhcmdldHMsIGFuZCBgJGAvYmFja3RpY2sgd291bGQgZXhwYW5kIGF0IHRoZSBmaXJzdCBzdGFnZS5cbi8vIFNvOiBxdW90ZSBmb3IgdGhlIGV2YWwgc3RhZ2Ug4oCUIGBxdW90ZUZvclNoZWxsYCBsZWF2ZXMgb25seSB3b3JkcyB0aGF0IGNhcnJ5IG5vIHNoZWxsIG1lYW5pbmdcbi8vIHVucXVvdGVkIOKAlCB0aGVuIGJhY2tzbGFzaC1lc2NhcGUgdGhlIGRvdWJsZS1xdW90ZS1jb250ZXh0IHNwZWNpYWxzLlxuZnVuY3Rpb24gcXVvdGVGb3JFdmFsdWF0ZWRTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXZhbFF1b3RlZCA9IHF1b3RlRm9yU2hlbGwoZmlsZVBhdGgpO1xuICByZXR1cm4gZXZhbFF1b3RlZC5yZXBsYWNlQWxsKC9bXFxcXGAkXCJdL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlLXJlbGF0aXZlIGRpcmVjdG9yaWVzIChyb290IGZpcnN0LCBkZWR1cGxpY2F0ZWQsIGA8c3ViRGlyTmFtZT5gIGFwcGVuZGVkKSBvZiBldmVyeVxuICogd29ya3NwYWNlIHdob3NlIGNvbmZpZyBtYXRjaGVzIHRoZSBwcmVkaWNhdGUuIFRoZSBob29rIHNjcmlwdCBydW5zIGF0IHRoZSByZXBvc2l0b3J5IHJvb3QsIHNvXG4gKiBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmVkaWNhdGU6IChjb25maWc6IFBhY2thZ2VDb25maWcpID0+IGJvb2xlYW4sXG4gIHN1YkRpck5hbWU6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBhbGxDb25maWdzXG4gICAgICAgIC5maWx0ZXIoKGNvbmZpZykgPT4gcHJlZGljYXRlKGNvbmZpZykpXG4gICAgICAgIC5tYXAoKGNvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdENvbmZpZy5kaXJQYXRoLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0aXZlRGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihyZWxhdGl2ZURpclBhdGgsIHN1YkRpck5hbWUpIDogc3ViRGlyTmFtZTtcbiAgICAgICAgfSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJpbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBveGZtdEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hmbXQgY29uZmlnIGZpbGVzIGFyZSBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGZtdENvbmZpZyA9IHJlcXVpcmUoJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IG94Zm10Q29uZmlnLmRlZmF1bHQgPz8gb3hmbXRDb25maWc7YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9JztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UsXG4gIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSxcbn0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGxpbnQnLFxuICB0b29sTmFtZTogJ294bGludCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBnZW5lcmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVwbGFjZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy4gR2VuZXJhdGVkIGZpbGVzIHdpdGhcbiAgICAvLyBtYW5hZ2VkIGJsb2NrcyBhcmUgc3RpbGwgc2FmZSB0byB1cGRhdGUuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50ICYmICFtYW5hZ2VkQ29uZmlnQmxvY2tzLmhhc01hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50KTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50XG4gICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgOiBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICB9KTtcblxuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hsaW50IG9ubHkgYXV0by1kaXNjb3ZlcnMgLnRzIGNvbmZpZyBmaWxlcywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94bGludEJhc2VDb25maWcgPSByZXF1aXJlKCcke294bGludEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnLmRlZmF1bHQgPz8gb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbmltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG5cbi8vIHN0cnVjdHVyZWRDbG9uZSBrZWVwcyBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlIG1hbmFnZWRcbi8vIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC4gVGhlIHJvb3QgY29uZmlnIGZvcmNlcyB0aGUgdHlwZS1hd2FyZVxuLy8gb3B0aW9ucyBvbiBpbnNpZGUgdGhlIG1hbmFnZWQgYmxvY2sgc28gbm8gY3VzdG9taXphdGlvbiBjYW4gc2lsZW50bHkgZGlzYWJsZSB0eXBlIGNoZWNraW5nOyBldmVyeVxuLy8gb3RoZXIgY29uZmlnIGRlbGV0ZXMgdGhlbSBiZWNhdXNlIE94bGludCByZWplY3RzIHRob3NlIHJvb3Qtb25seSBvcHRpb25zIGVsc2V3aGVyZSAodHlwZSBjaGVja2luZ1xuLy8gc3Vydml2ZXM6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgLS10eXBlLWF3YXJlIGFuZCAtLXR5cGUtY2hlY2sgZXhwbGljaXRseSkuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuZGVsZXRlIG94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnM7YDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICAvLyBweXJpZ2h0Y29uZmlnLmpzb24gYWxsb3dzIEpTT05DOyBhbiBleGlzdGluZyBmaWxlIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdFxuICAgICAgLy8gdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYmFyZSB0ZW1wbGF0ZS5cbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHB5cmlnaHRjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShuZXdTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25zdW1lc0RvY2tlckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBtYW5hZ2VkU2NyaXB0c0Jsb2NrID0gYHNjcmlwdHMvKipcbiFzY3JpcHRzL1xuIXNjcmlwdHMvKi5zaGA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhSYWlsd2F5aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFJhaWx3YXlpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheWlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgdXNlc0RvY2tlckVudiA9IGNvbnN1bWVzRG9ja2VyRW52KGNvbmZpZy5kb2NrZXJmaWxlKTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIGlmIChjb25maWcuaXNSYWlsd2F5ICYmIHVzZXNEb2NrZXJFbnYpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsICchLmRvY2tlci5lbnZcXG4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15zY3JpcHRzXFwvJC9tLCBtYW5hZ2VkU2NyaXB0c0Jsb2NrKTtcbiAgICAvLyBgcmFpbHdheSB1cGAgc3RyaXBzIGdpdGlnbm9yZWQgZmlsZXMgZnJvbSB0aGUgdXBsb2FkZWQgYnVpbGQgY29udGV4dCwgc28gdGhlIGdlbmVyYXRlZFxuICAgIC8vIG5vbi1zZWNyZXQgLmRvY2tlci5lbnYgKGB3YiBnZW4tZG9ja2VyLWVudmAgb3V0cHV0KSBuZWVkcyBhbiBleHBsaWNpdCB1bi1pZ25vcmUgdG8gcmVhY2hcbiAgICAvLyB0aGUgcmVtb3RlIERvY2tlciBidWlsZC4gQXBwZW5kZWQsIG5vdCBwcmVwZW5kZWQ6IGlnbm9yZSBmaWxlcyBhcmUgbGFzdC1tYXRjaC13aW5zLCBzbyBhXG4gICAgLy8gaGFuZC13cml0dGVuIHBhdHRlcm4gc3VjaCBhcyBgKi5lbnZgIGVhcmxpZXIgaW4gdGhlIGZpbGUgbXVzdCBub3Qgc2lsZW50bHkgcmUtZXhjbHVkZSBpdC5cbiAgICBpZiAodXNlc0RvY2tlckVudiAmJiAhL14hXFwuZG9ja2VyXFwuZW52JC9tLnRlc3QobmV3Q29udGVudCkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBgJHtuZXdDb250ZW50LnJlcGxhY2UoL1xcbj8kLywgJ1xcbicpfSEuZG9ja2VyLmVudlxcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9ja2VyZmlsZSAmJiAhdXNlc0RvY2tlckVudikge1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXiFcXC5kb2NrZXJcXC5lbnZcXG4/L20sICcnKTtcbiAgICB9XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PlxuICAgICAgbmV3Q29udGVudCA/IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpIDogZnNVdGlsLnJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoKVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbWFnZSwgTGluaywgUGFyYWdyYXBoLCBQaHJhc2luZ0NvbnRlbnQsIFJvb3RDb250ZW50IH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHsgZnJvbU1hcmtkb3duIH0gZnJvbSAnbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmNvbnN0IHdiZnlCYWRnZVVybFByZWZpeCA9ICdodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3diZnktJztcbmNvbnN0IHdiZnlCYWRnZVVybFN1ZmZpeCA9ICctMWU5MGZmLnN2Zyc7XG5jb25zdCB3YmZ5QmFkZ2VMaW5rID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvdHJlZS9tYWluL3BhY2thZ2VzL3diZnknO1xuXG5jb25zdCBucG1QYWNrYWdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyc7XG5jb25zdCBucG1MaWNlbnNlQmFkZ2VQYXR0ZXJuID0gL15cXFshXFxbW15cXF1dKlxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL25wbVxcL2xcXC9bXilcXHNdK1xcKVxcXVxcKFteKVxcc10rXFwpJC91O1xuXG5jb25zdCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucyA9IFtcbiAgL15cXFshXFxbd2JmeVxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL2JhZGdlXFwvd2JmeS1bXilcXHNdKy0xZTkwZmZcXC5zdmdcXClcXF1cXChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9XaWxsQm9vc3RlclxcL3NoYXJlZFxcL3RyZWVcXC9tYWluXFwvcGFja2FnZXNcXC93YmZ5XFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1teKVxcc10rXFwvYWN0aW9uc1xcL3dvcmtmbG93c1xcL1teKVxcc10rKVxcL2JhZGdlXFwuc3ZnXFwpXFxdXFwoXFwxXFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoW14pXFxzXStcXClcXF1cXChodHRwcz86XFwvXFwvKD86d3d3XFwuKT9ucG1qc1xcLmNvbVxcL3BhY2thZ2VcXC9bXilcXHNdKlxcKSQvdSxcbiAgbnBtTGljZW5zZUJhZGdlUGF0dGVybixcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkV2JmeUJhZGdlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIeXBoZW5zIGFyZSBlc2NhcGVkIGFzIGAtLWAgcGVyIHNoaWVsZHMuaW8ncyBiYWRnZSBwYXRoIHN5bnRheCwgc28gYHYxLjIuMy1yYy4xYCBzdGF5cyBpbnRhY3QuXG4gIHJldHVybiBgWyFbd2JmeV0oJHt3YmZ5QmFkZ2VVcmxQcmVmaXh9JHtsYWJlbC5yZXBsYWNlQWxsKCctJywgJy0tJyl9JHt3YmZ5QmFkZ2VVcmxTdWZmaXh9KV0oJHt3YmZ5QmFkZ2VMaW5rfSlgO1xufVxuXG4vKiogVGhlIHZlcnNpb24gbGFiZWwgdGhlIHdiZnkgYmFkZ2UgaW4gdGhlIHJlcG9zaXRvcnkncyBSRUFETUUgcmVjb3JkcywgaS5lLiB0aGUgYnVpbGQgdGhhdCB3YmZpZWQgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIENvbmZpbmVkLCBhbmQgdG9sZXJhbnQgb2YgYW55IHJlYWQgZmFpbHVyZTogYSBSRUFETUUgdGhhdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IChhXG4gIC8vIGNvbW1pdHRlZCBzeW1saW5rKSBvciBjYW5ub3QgYmUgcmVhZCBhdCBhbGwgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoIGJ1aWxkIGNvbmZpZ3VyZWQgVEhJU1xuICAvLyByZXBvc2l0b3J5LCBhbmQgdGhlIGFuc3dlciBvbmx5IGV2ZXIgc3VwcHJlc3NlcyB3b3JrIOKAlCBzbyBhbnl0aGluZyBidXQgYSByZWFkYWJsZSBpbi1yZXBvc2l0b3J5XG4gIC8vIFJFQURNRSBtZWFucyBcIm5vdCBrbm93biB0byBiZSBhcHBsaWVkXCIgYW5kIHRoZSBydW4gcHJvY2VlZHMuXG4gIGNvbnN0IHJlYWRtZSA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdSRUFETUUubWQnKSkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAocmVhZG1lID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFJFQURNRSBpcyBwYXJzZWQgcmF0aGVyIHRoYW4gc2Nhbm5lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3cml0ZUJhZGdlQmxvY2sgcGFyc2VzIGl0LCBhbmRcbiAgLy8gb25seSB0aGUgc2hhcGUgd3JpdGVCYWRnZUJsb2NrIGl0c2VsZiB3cml0ZXMgY291bnRzIGFzIGFuIGFwcGxpZWQgYmFkZ2U6IGEgdG9wLWxldmVsIHBhcmFncmFwaFxuICAvLyBvZiBiYWRnZXMuIEEgYmFkZ2UgYW55d2hlcmUgZWxzZSBpcyBjb250ZW50IHRoYXQgbWVyZWx5IG1lbnRpb25zIG9uZSDigJQgYSBmZW5jZWQgZXhhbXBsZSAod2JmeSdzXG4gIC8vIG93biBkb2N1bWVudGF0aW9uIGhhcyB0aG9zZSksIGEgYmxvY2sgcXVvdGUsIGEgbGlzdCBpdGVtIOKAlCBhbmQgcmVhZGluZyBpdCBhcyBhcHBsaWVkIHdvdWxkIHNraXBcbiAgLy8gZXZlcnkgZml4ZXIgZm9yIHRoZSByZXBvc2l0b3J5LlxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZnJvbU1hcmtkb3duKHJlYWRtZSkuY2hpbGRyZW4pIHtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYmFkZ2Ugb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKCFpc0JhZGdlTm9kZShiYWRnZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyB1cmwgfSA9IGJhZGdlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHdiZnlCYWRnZVVybFByZWZpeCkgJiYgdXJsLmVuZHNXaXRoKHdiZnlCYWRnZVVybFN1ZmZpeCkpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSh3YmZ5QmFkZ2VVcmxQcmVmaXgubGVuZ3RoLCAtd2JmeUJhZGdlVXJsU3VmZml4Lmxlbmd0aCkucmVwbGFjZUFsbCgnLS0nLCAnLScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICAvLyBUaGUgd2JmeSBiYWRnZSBtYXJrcyBhIHJlcG9zaXRvcnkgYXMgd2JmaWVkLCBzbyBhIHJlcG9zaXRvcnkgd2l0aG91dCBhIFJFQURNRSBzdGlsbCBnZXRzIG9uZS5cbiAgICAvLyByZWFkRmlsZUlmRXhpc3RzIGZhbGxzIGJhY2sgT05MWSBvbiBFTk9FTlQ6IGEgUkVBRE1FIHRoYXQgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZCAoZS5nLlxuICAgIC8vIHBlcm1pc3Npb25zLCBFTUZJTEUpIG11c3QgYWJvcnQgdGhlIGdlbmVyYXRvciBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIHN0dWIuXG4gICAgbGV0IG5ld0NvbnRlbnQgPVxuICAgICAgKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz9cbiAgICAgIGAjICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID8/IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSl9XFxuYDtcblxuICAgIC8vIE9yZGVyZWQgYnkgd2hhdCBhIHJlYWRlciBjYXJlcyBhYm91dCBtb3N0OiB0aGUgbnBtIGJhZGdlIG5hbWVzIHRoZSBwYWNrYWdlIGEgcmVhZGVyIGluc3RhbGxzLFxuICAgIC8vIHRoZW4gdGhlIHdvcmtmbG93IGJhZGdlcyByZXBvcnQgd2hldGhlciB0aGUgY29kZSBpcyBjdXJyZW50bHkgaGVhbHRoeSwgdGhlbiBob3cgaXQgaXNcbiAgICAvLyByZWxlYXNlZCwgYW5kIGxhc3QgdGhlIHdiZnkgYnVpbGQgdGhhdCBjb25maWd1cmVkIGl0LlxuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGF3YWl0IGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZyk7XG4gICAgaWYgKHBhY2thZ2VOYW1lKSB7XG4gICAgICBiYWRnZXMucHVzaChidWlsZE5wbUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICBjb25zdCBsaWNlbnNlID0gY29uZmlnLnBhY2thZ2VKc29uPy5saWNlbnNlO1xuICAgICAgaWYgKGxpY2Vuc2UgJiYgbGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnKSB7XG4gICAgICAgIGJhZGdlcy5wdXNoKGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJhZGdlcy5wdXNoKC4uLihhd2FpdCBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZykpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIGJhZGdlcy5wdXNoKHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICBiYWRnZXMucHVzaChidWlsZFdiZnlCYWRnZShnZXRXYmZ5VmVyc2lvbkxhYmVsKCkgPz8gJ2FwcGxpZWQnKSk7XG5cbiAgICAvLyBUaGUgYmxvY2sgaXMgd3JpdHRlbiBpbiBvbmUgcGFzcyBmcm9tIHRoZSBiYWRnZXMgd2JmeSBtYW5hZ2VzIHJpZ2h0IG5vdy4gQSBiYWRnZSB0aGF0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIHdhbnRlZCDigJQgYSBzdXBlcnNlZGVkIHZlcnNpb24sIG9yIG9uZSB3aG9zZSB3b3JrZmxvdyBpcyBnb25lIOKAlCBzaW1wbHkgaXMgbm90IGluIHRoZVxuICAgIC8vIGxpc3QsIHNvIG5vdGhpbmcgaGFzIHRvIHJlbW92ZSBpdC5cbiAgICBuZXdDb250ZW50ID0gd3JpdGVCYWRnZUJsb2NrKG5ld0NvbnRlbnQsIGJhZGdlcyk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT5cbiAgICAgIGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQsIGdldExpbmVFbmRpbmcobmV3Q29udGVudCkpXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICAvLyBBIG1vbm9yZXBvIGhhcyBubyBzaW5nbGUgbnBtIHZlcnNpb24gcmVwcmVzZW50aW5nIHRoZSB3aG9sZSByZXBvc2l0b3J5LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIHx8ICFjb25maWcucmVsZWFzZS5ucG0gfHwgIXBhY2thZ2VKc29uPy5uYW1lIHx8IHBhY2thZ2VKc29uLnByaXZhdGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiAoYXdhaXQgaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VKc29uLm5hbWUpKSA/IHVuZGVmaW5lZCA6IHBhY2thZ2VKc29uLm5hbWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaXN0cnkgYW5zd2VycyB0aGF0IGl0IGhhcyBubyBzdWNoIHBhY2thZ2Ug4oCUIHRoZSBPTkxZIGFuc3dlciB0aGF0IHJlbW92ZXMgYSBiYWRnZS5cbiAqIEEgY2hlY2sgdGhhdCBjYW5ub3QgcnVuIChvZmZsaW5lLCBhbiBvdXRhZ2UsIGEgdGltZW91dCkgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBwYWNrYWdlLCBhbmRcbiAqIHRyZWF0aW5nIGl0IGFzIGFic2VudCB3b3VsZCBzdHJpcCB0aGUgYmFkZ2Ugb3V0IG9mIGV2ZXJ5IHB1Ymxpc2hlZCByZXBvc2l0b3J5IHdiZnkgdG91Y2hlc1xuICogZHVyaW5nIHRoZSBvdXRhZ2UgYW5kIHB1dCBpdCBiYWNrIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHNjb3BlIHNlcGFyYXRvciBtdXN0IHN1cnZpdmUgYXMgYSBwYXRoIHNlZ21lbnQsIHNvIHRoZSBuYW1lIGlzIGVuY29kZWQgcGllY2V3aXNlLlxuICAgIGNvbnN0IGVuY29kZWROYW1lID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcvJyk7XG4gICAgLy8gQSBiYWRnZSBpcyBkZWNvcmF0aW9uOiBhIHN0YWxsZWQgcmVnaXN0cnkgY29ubmVjdGlvbiBtdXN0IG5vdCBob2xkIHRoZSB3aG9sZSBydW4gZm9yIGhvd2V2ZXJcbiAgICAvLyBsb25nIHRoZSBuZXR3b3JraW5nIHN0YWNrIHdvdWxkIHdhaXQuIFRoZSBidWRnZXQgaXMgZ2VuZXJvdXMgYmVjYXVzZSBhIHRpbWVvdXQgYW5zd2Vyc1xuICAgIC8vIFwidW5rbm93blwiLCB3aGljaCBrZWVwcyB0aGUgYmFkZ2Ug4oCUIGFuZCBvbiBhIHJlcG9zaXRvcnkgdGhhdCBpcyBub3Qgb24gbnBtIHRoYXQgbWVhbnMgd3JpdGluZ1xuICAgIC8vIG9uZSBpdCBzaG91bGQgbm90IGhhdmU7IGEgd2JmeSBydW4gYWxyZWFkeSBzcGVuZHMgbWludXRlcyBvbiBpbnN0YWxscywgc28gd2FpdGluZyBhIGxpdHRsZVxuICAgIC8vIGxvbmdlciBmb3IgYSByZWFsIGFuc3dlciBjb3N0cyBsZXNzIHRoYW4gYWN0aW5nIG9uIGEgbWlzc2luZyBvbmUuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVkTmFtZX1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQwNDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbnBtIHZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL3YvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFshW2xpY2Vuc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL2wvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFyZXBvc2l0b3J5IHx8ICFmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpKSByZXR1cm4gW107XG5cbiAgLy8gV29ya2Zsb3cgYW5kIFJFQURNRSBnZW5lcmF0aW9uIHJ1biBjb25jdXJyZW50bHkuIERvIG5vdCByZXRhaW4gYSBzdGFsZSBSdXN0IGJhZGdlIHdoaWxlIHRoZVxuICAvLyB3b3JrZmxvdyBnZW5lcmF0b3IgcmVtb3ZlcyBhIGNhbGxlciBjcmVhdGVkIGZyb20gYSBmb3JtZXJseSBtaXNkZXRlY3RlZCBsb2NhbCBjYWNoZSDigJQgYnV0XG4gIC8vIG1pcnJvciBpdHMgb3duZXJzaGlwIGNoZWNrOiBhIGN1c3RvbSBzYW1lLW5hbWVkIHdvcmtmbG93IHN1cnZpdmVzLCBzbyBpdHMgYmFkZ2UgbXVzdCB0b28uXG4gIC8vIERlY2lkZWQgc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIGxvb3AncyBmaXJzdCBhd2FpdDogdGhlIGdlbmVyYXRvcidzIGRlbGV0ZSBjYW4gb25seSBsYW5kIGF0XG4gIC8vIGFuIGF3YWl0IHBvaW50LCBhbmQgYSBwb3N0LWRlbGV0ZSByZWFkIHdvdWxkIG1pc3JlcG9ydCB0aGUgd2JmeS1vd25lZCBjYWxsZXIgYXMgY3VzdG9tLlxuICAvLyBObyBleGlzdHNTeW5jIHByZS1jaGVjazogdGhlIGhlbHBlciBhbHJlYWR5IHRyZWF0cyBhIG1pc3NpbmcgZmlsZSBhcyBub3Qgb3duZWQsIGFuZCB0aGlzIHJ1bnNcbiAgLy8gb25jZSBwZXIgcmVwb3NpdG9yeSwgc28gdGhlIGV4Y2VwdGlvbmFsIEVOT0VOVCByZWFkIGNvc3RzIG5vdGhpbmcgd29ydGggYSByZWR1bmRhbnQgc3RhdC5cbiAgY29uc3QgZHJvcHNUZXN0UnVzdEJhZGdlID1cbiAgICBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCAndGVzdC1ydXN0LnltbCcsICd0ZXN0LXJ1c3QnKTtcblxuICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkpIHtcbiAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuICAgIGlmIChmaWxlTmFtZSA9PT0gJ3Rlc3QtcnVzdC55bWwnICYmIGRyb3BzVGVzdFJ1c3RCYWRnZSkgY29udGludWU7XG4gICAgLy8gR2l0SHViJ3MgYmFkZ2UgZW5kcG9pbnQgcmV0dXJucyA0MDQgdW50aWwgdGhlIHdvcmtmbG93IGhhcyBhdCBsZWFzdCBvbmUgcnVuLCBzbyBhIGJhZGdlIGZvciBhXG4gICAgLy8gZGlzcGF0Y2gtb25seSBkZXBsb3kgd29ya2Zsb3cgdGhhdCBoYXMgbmV2ZXIgcnVuIHJlbmRlcnMgYXMgYSBicm9rZW4gaW1hZ2UuIFRlc3Qgd29ya2Zsb3dzIHJ1blxuICAgIC8vIG9uIGV2ZXJ5IFBSLCBzbyBvbmx5IGRlcGxveSBiYWRnZXMgbmVlZCB0aGUgZ3VhcmQuXG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmICEoYXdhaXQgaGFzQW55V29ya2Zsb3dSdW4ocmVwb3NpdG9yeSwgZmlsZU5hbWUsIGNvbmZpZy5pc1B1YmxpY1JlcG8pKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGJhZGdlTmFtZSA9IChmaWxlTmFtZVswXSA/PyAnJykudG9VcHBlckNhc2UoKSArIGZpbGVOYW1lLnNsaWNlKDEsIGZpbGVOYW1lLmluZGV4T2YoJy4nKSkucmVwbGFjZSgnLScsICcgJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtlbmNvZGVVcmxQYXRoKGZpbGVOYW1lKX1gO1xuICAgIGJhZGdlcy5wdXNoKGBbIVske2JhZGdlTmFtZX1dKCR7d29ya2Zsb3dVcmx9L2JhZGdlLnN2ZyldKCR7d29ya2Zsb3dVcmx9KWApO1xuICB9XG4gIHJldHVybiBiYWRnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FueVdvcmtmbG93UnVuKFxuICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gIHdvcmtmbG93RmlsZU5hbWU6IHN0cmluZyxcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IHJlcG9zaXRvcnkuc3BsaXQoJy8nKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG93bmVyKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVucycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0ZpbGVOYW1lLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZvciBhIFBVQkxJQyByZXBvc2l0b3J5IHRoZSBydW5zIGVuZHBvaW50IG5lZWRzIG5vIGF1dGhvcml6YXRpb24sIHNvIDQwNCByZWxpYWJseSBtZWFucyB0aGVcbiAgICAvLyB3b3JrZmxvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVtb3RlIChlLmcuIGFkZGVkIGxvY2FsbHksIG5ldmVyIHB1c2hlZCkg4oCUIGxpa2UgemVybyBydW5zLCBpdHNcbiAgICAvLyBiYWRnZSB3b3VsZCByZW5kZXIgYnJva2VuLiBGb3IgYSBQUklWQVRFIHJlcG9zaXRvcnkgR2l0SHViIGFsc28gYW5zd2VycyA0MDQgd2hlbiB0aGUgdG9rZW5cbiAgICAvLyBpcyBtaXNzaW5nIG9yIHVuZGVyLXNjb3BlZCwgc28gNDA0IGlzIGFtYmlndW91cyB0aGVyZSBhbmQgdGhlIGJhZGdlIGlzIGtlcHQuXG4gICAgaWYgKChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwNCAmJiBpc1B1YmxpY1JlcG8pIHJldHVybiBmYWxzZTtcbiAgICAvLyBLZWVwIHRoZSBwcmUtZ3VhcmQgYmVoYXZpb3IgKGluc2VydCB0aGUgYmFkZ2UpIHdoZW4gdGhlIGNoZWNrIGl0c2VsZiBjYW5ub3QgcnVuLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGJhZGdlIGJsb2NrcyBkaXJlY3RseSB1bmRlciB0aGUgdGl0bGUgd2l0aCBgbWFuYWdlZEJhZGdlc2AsIGtlZXBpbmcgYW55IGJhZGdlIHRoZXJlXG4gKiB0aGF0IHdiZnkgZG9lcyBub3QgbWFuYWdlLCBhbmQgcmVhc3NlbWJsZXMgdGhlIFJFQURNRSBhcm91bmQgdGhlbSB3aXRoIGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgb25cbiAqIGVhY2ggc2lkZS5cbiAqXG4gKiBCb3RoIHRoZSB0aXRsZSBhbmQgdGhlIGJsb2NrIGFyZSBsb2NhdGVkIGluIGEgQ29tbW9uTWFyayBzeW50YXggdHJlZSByYXRoZXIgdGhhbiBieSBzY2FubmluZ1xuICogbGluZXM6IG9ubHkgYSByZWFsIHBhcnNlciBrbm93cyB3aGV0aGVyIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgYSBiYWRnZSBpcyBhIGJhZGdlIChhIHBhcmFncmFwaCBvZlxuICogbGlua2VkIGltYWdlcykgb3IgY29udGVudCB0aGF0IG1lcmVseSByZWFkcyBsaWtlIG9uZSAoYW4gaW5kZW50ZWQgY29kZSBibG9jaywgYSBibG9jayBxdW90ZSwgYVxuICogZmVuY2VkIGV4YW1wbGUsIGEgbXVsdGlsaW5lIGNvZGUgc3BhbiwgYW4gSFRNTCBibG9jaykuIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgYmxvY2sgaXMgY29waWVkIGJhY2tcbiAqIHZlcmJhdGltIGZyb20gdGhlIG9yaWdpbmFsIHRleHQgdGhyb3VnaCB0aGUgcGFyc2VyJ3MgcG9zaXRpb25hbCBvZmZzZXRzLCBzbyBubyByZWZvcm1hdHRpbmcgb2YgdGhlXG4gKiB1c2VyJ3MgY29udGVudCBpcyBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQmFkZ2VCbG9jayhyZWFkbWU6IHN0cmluZywgbWFuYWdlZEJhZGdlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lRW5kaW5nID0gZ2V0TGluZUVuZGluZyhyZWFkbWUpO1xuICAvLyBBIEJPTSBpcyBub3QgTWFya2Rvd246IGxlZnQgaW4gdGhlIHRleHQgaXQgaGlkZXMgdGhlIGAjYCBvZiB0aGUgdGl0bGUgZnJvbSB0aGUgcGFyc2VyLCBhbmRcbiAgLy8gcHJlcGVuZGluZyB0aGUgYmxvY2sgYWhlYWQgb2YgaXQgd291bGQgc3RyaXAgdGhlIG1hcmtlciBmcm9tIHRoZSBmaWxlJ3MgZmlyc3QgYnl0ZS5cbiAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IHJlYWRtZS5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gIC8vIEZyb250IG1hdHRlciBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNhbWUgYC0tLWAgYSBTZXRleHQgaGVhZGluZyBhbmQgYSB0aGVtYXRpYyBicmVhayB1c2UsIHNvIGl0IGlzXG4gIC8vIGRldGFjaGVkIGJlZm9yZSBwYXJzaW5nIGluc3RlYWQgb2YgYmVpbmcgdG9sZCBhcGFydCBhZnRlcndhcmRzOyBpdCBhbHNvIGhhcyB0byBzdGF5IGZpcnN0IGluIHRoZVxuICAvLyBmaWxlLCB3aGljaCBtYWtlcyBpdCBhIHByZWZpeCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGUgQk9NIGlzLlxuICBjb25zdCB3aXRob3V0TWFyayA9IHJlYWRtZS5zbGljZShieXRlT3JkZXJNYXJrLmxlbmd0aCk7XG4gIGNvbnN0IGZyb250TWF0dGVyID0gd2l0aG91dE1hcmsuc3RhcnRzV2l0aCgnLS0tJylcbiAgICA/ICgvXi0tLVsgXFx0XSpcXHI/XFxuW1xcc1xcU10qP14tLS1bIFxcdF0qKD86XFxyP1xcbnwkKS9tdS5leGVjKHdpdGhvdXRNYXJrKT8uWzBdID8/ICcnKVxuICAgIDogJyc7XG4gIGNvbnN0IHByZWZpeCA9IGAke2J5dGVPcmRlck1hcmt9JHtmcm9udE1hdHRlcn1gO1xuICAvLyBUaGUgZmluYWwgbmV3bGluZSBpcyBzZXQgYXNpZGUgcmF0aGVyIHRoYW4gcGFyc2VkIGFzIHRyYWlsaW5nIGJsYW5rIHNwYWNlLCB3aGljaCB0aGUgYmxhbmstbGluZVxuICAvLyB0cmltbWluZyBiZWxvdyB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdy5cbiAgY29uc3QgZW5kc1dpdGhOZXdsaW5lID0gL1xccj9cXG4kL3UudGVzdChyZWFkbWUpO1xuICBjb25zdCBjb250ZW50ID0gd2l0aG91dE1hcmsuc2xpY2UoZnJvbnRNYXR0ZXIubGVuZ3RoKS5yZXBsYWNlKC9cXHI/XFxuJC91LCAnJyk7XG5cbiAgY29uc3Qgbm9kZXMgPSBmcm9tTWFya2Rvd24oY29udGVudCkuY2hpbGRyZW47XG4gIC8vIEEgbGVhZGluZyBiYWRnZSBibG9jayBpcyB0aGUgdXNlcidzIG93biBsYXlvdXQ6IGl0IHN0YXlzIGFib3ZlIHRoZSB0aXRsZSwgYW5kIHdiZnkncyBibG9jayBnb2VzIGJlbG93LlxuICBjb25zdCBrZWVwc0xlYWRpbmdCbG9jayA9ICEhbm9kZXNbMF0gJiYgaXNCYWRnZUJsb2NrTm9kZShub2Rlc1swXSkgJiYgaXNUaXRsZU5vZGUobm9kZXNbMV0pO1xuICBjb25zdCB0aXRsZUluZGV4ID0ga2VlcHNMZWFkaW5nQmxvY2sgPyAxIDogaXNUaXRsZU5vZGUobm9kZXNbMF0pID8gMCA6IC0xO1xuICAvLyBXaXRob3V0IGEgcmVjb2duaXphYmxlIHRpdGxlIHRoZSBibG9jayBzaXRzIGF0IHRoZSB2ZXJ5IHRvcCwgYWJvdmUgZXZlcnl0aGluZy5cbiAgY29uc3QgaGVhZFN0YXJ0Tm9kZSA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gbm9kZXNbMF0hIDogbm9kZXNbdGl0bGVJbmRleF07XG4gIGNvbnN0IGhlYWQgPVxuICAgIHRpdGxlSW5kZXggPT09IC0xXG4gICAgICA/ICcnXG4gICAgICA6IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGhlYWRTdGFydE5vZGUhKSwgbm9kZXNbdGl0bGVJbmRleF0hLnBvc2l0aW9uIS5lbmQub2Zmc2V0KTtcblxuICBjb25zdCBiYWRnZUJsb2NrTm9kZXM6IFBhcmFncmFwaFtdID0gW107XG4gIGZvciAobGV0IG5vZGVJbmRleCA9IHRpdGxlSW5kZXggKyAxOyA7IG5vZGVJbmRleCsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW25vZGVJbmRleF07XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBicmVhaztcbiAgICBiYWRnZUJsb2NrTm9kZXMucHVzaChub2RlKTtcbiAgICAvLyBXaXRob3V0IGEgdGl0bGUsIG1lcmdpbmcgbGVhZGluZyBibG9ja3MgY291bGQgY2hhbmdlIHdoaWNoIG5vZGUgaXMgcmVjb2duaXplZCBhcyB0aGUgdGl0bGUgb24gdGhlIG5leHQgcnVuLlxuICAgIGlmICh0aXRsZUluZGV4ID09PSAtMSkgYnJlYWs7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmcgPSBiYWRnZUJsb2NrTm9kZXMuZmxhdE1hcCgobm9kZSkgPT4gcmVhZEJhZGdlcyhub2RlLCBjb250ZW50KSk7XG4gIGNvbnN0IGJvZHlOb2RlID0gbm9kZXNbdGl0bGVJbmRleCArIDEgKyBiYWRnZUJsb2NrTm9kZXMubGVuZ3RoXTtcbiAgY29uc3QgYm9keSA9IGJvZHlOb2RlID8gY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgYm9keU5vZGUpKSA6ICcnO1xuXG4gIC8vIFN1cGVyc2VkaW5nIGEgbWFuYWdlZCBiYWRnZSBpcyBqdXN0IGRyb3BwaW5nIHRoZSBvbGQgb25lOiBhIHZlcnNpb24sIHdvcmtmbG93LCBucG0sIG9yIGxpY2Vuc2VcbiAgLy8gY2hhbmdlIGxlYXZlcyBubyBzdGFsZSBjb3B5LCB3aGlsZSBhbnkgb3RoZXIgYmFkZ2UgaW4gdGhlIG1hbmFnZWQgcmVnaW9uIGlzIGtlcHQuXG4gIGNvbnN0IGJhZGdlcyA9IFsuLi5tYW5hZ2VkQmFkZ2VzLCAuLi5leGlzdGluZy5maWx0ZXIoKGJhZGdlKSA9PiAhaXNNYW5hZ2VkQmFkZ2UoYmFkZ2UpKV07XG4gIC8vIENvbnRlbnQgaXMgc2xpY2VkIGZyb20gaXRzIG5vZGUncyBzdGFydCBvZmZzZXQsIHNvIHdoYXRldmVyIGJsYW5rIHNwYWNlIGZvbGxvd2VkIHRoZSBmcm9udFxuICAvLyBtYXR0ZXIgaXMgZ29uZTsgZXhhY3RseSBvbmUgYmxhbmsgbGluZSBpcyByZXN0b3JlZCBoZXJlLiBBIGNsb3NpbmcgZGVsaW1pdGVyIHRoYXQgZW5kZWQgYXQgRU9GXG4gIC8vIGNhcnJpZXMgbm8gbmV3bGluZSBvZiBpdHMgb3duIGFuZCBuZWVkcyBib3RoLCBvciBgLS0tYCB3b3VsZCBmdXNlIHdpdGggdGhlIGZpcnN0IGJhZGdlIGFuZFxuICAvLyBkZXN0cm95IHRoZW0gYm90aC4gQSBCT00gbmVlZHMgbm8gc2VwYXJhdG9yOiBpdCBpcyBhIGJ5dGUgbWFya2VyLCBub3QgYSBsaW5lLlxuICBjb25zdCBzZXBhcmF0b3IgPSBmcm9udE1hdHRlciA/ICgvXFxyP1xcbiQvdS50ZXN0KGZyb250TWF0dGVyKSA/IGxpbmVFbmRpbmcgOiBgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKSA6ICcnO1xuICBjb25zdCByZXN1bHQgPVxuICAgIHByZWZpeCArIHNlcGFyYXRvciArIFtoZWFkLCBiYWRnZXMuam9pbihsaW5lRW5kaW5nKSwgYm9keV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCk7XG4gIHJldHVybiBlbmRzV2l0aE5ld2xpbmUgPyBgJHtyZXN1bHR9JHtsaW5lRW5kaW5nfWAgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBleHRlbmRlZCBiYWNrIG92ZXIgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBpdHMgb3duIGxpbmUuIENvbW1vbk1hcmtcbiAqIGFsbG93cyBvbmUgdG8gdGhyZWUgc3BhY2VzIG9mIGluZGVudGF0aW9uIGJlZm9yZSBhIGJsb2NrLCBhbmQgbWRhc3QgcmVwb3J0cyB0aGUgb2Zmc2V0IEFGVEVSXG4gKiB0aGVtIOKAlCBzbyBzbGljaW5nIGZyb20gaXQgc2lsZW50bHkgcmVpbmRlbnRzIGNvbnRlbnQgdGhpcyBnZW5lcmF0b3IgcHJvbWlzZXMgdG8gY29weSB2ZXJiYXRpbS5cbiAqL1xuZnVuY3Rpb24gc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQ6IHN0cmluZywgbm9kZTogUm9vdENvbnRlbnQpOiBudW1iZXIge1xuICBjb25zdCBzdGFydCA9IG5vZGUucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCE7XG4gIGNvbnN0IGxpbmVTdGFydCA9IGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIHN0YXJ0IC0gMSkgKyAxO1xuICByZXR1cm4gL15bIFxcdF0qJC91LnRlc3QoY29udGVudC5zbGljZShsaW5lU3RhcnQsIHN0YXJ0KSkgPyBsaW5lU3RhcnQgOiBzdGFydDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBub2RlIG9wZW5zIHRoZSBSRUFETUUgd2l0aCBhIHRpdGxlLiBPbmx5IHRoZSBGSVJTVCBwaWVjZSBvZiBjb250ZW50IGNhbiBiZSBvbmU6IGFcbiAqIHRpdGxlIGlzIHdoYXQgYSBSRUFETUUgb3BlbnMgd2l0aCwgYW5kIGFuY2hvcmluZyB0aGUgYmFkZ2VzIHRvIGEgaGVhZGluZyBmdXJ0aGVyIGRvd24gd291bGQgYnVyeVxuICogdGhlbSBiZWxvdyBjb250ZW50IHRoZSBhdXRob3IgcHV0IGZpcnN0LlxuICovXG5mdW5jdGlvbiBpc1RpdGxlTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ2hlYWRpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgLy8gTWFueSBSRUFETUVzIGNlbnRlciB0aGVpciB0aXRsZSBpbiBIVE1MIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLCB3aGljaCB0aGVcbiAgLy8gcGFyc2VyIHJlcG9ydHMgYXMgb25lIG9wYXF1ZSBIVE1MIGJsb2NrOyB0aGUgYmFkZ2VzIGdvIGFmdGVyIHRoZSB3aG9sZSBibG9jay5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2h0bWwnICYmIGNvbnRhaW5zUmVuZGVyZWRIMShub2RlLnZhbHVlKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBIVE1MIGJsb2NrIHVuYW1iaWd1b3VzbHkgUkVOREVSUyBhbiBgPGgxPmAg4oCUIHRoZSBjZW50ZXJlZC10aXRsZSBsYXlvdXQgbWFueSBSRUFETUVzXG4gKiB1c2UgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBhIGdlbmVyYWwgSFRNTCBwYXJzZXIuIERlY2lkaW5nIHRoaXMgZXhhY3RseSByZXF1aXJlcyB0aGUgcmVhbCB0b2tlbml6ZXInc1xuICogc3RhdGVzIOKAlCByYXcgdGV4dCwgUkNEQVRBLCBzY3JpcHQgZGF0YSwgYXR0cmlidXRlIHZhbHVlcywgdGVtcGxhdGUgY29udGVudHMsIGRlY2xhcmF0aW9ucyDigJQgYW5kXG4gKiBhcHByb3hpbWF0aW5nIHRoZW0gd2l0aCByZWdleGVzIGlzIHRoZSBzYW1lIGxvc2luZyBnYW1lIHRoZSBNYXJrZG93biBzY2FubmluZyB0aGlzIG1vZHVsZVxuICogcmVwbGFjZWQgd2FzIHBsYXlpbmcuIFNvIHRoZSBydWxlIGlzOiB0b2tlbml6ZSBvbmx5IHRoZSBzaW1wbGUgY2FzZSwgYW5kIHRyZWF0IGFueXRoaW5nIGNhcnJ5aW5nXG4gKiBhIGNvbnN0cnVjdCB3aG9zZSBwYXJzaW5nIGRlcGVuZHMgb24gdGhvc2Ugc3RhdGVzIGFzIE5PVCBhIHRpdGxlLiBCZWluZyB3cm9uZyB0aGF0IHdheSBwdXRzIHRoZVxuICogYmFkZ2VzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIHdoaWNoIGlzIG1lcmVseSB1bmhlbHBmdWw7IGJlaW5nIHdyb25nIHRoZSBvdGhlciB3YXkgcmV3cml0ZXMgdGhlXG4gKiB1c2VyJ3MgUkVBRE1FIGFyb3VuZCB0aGUgd3JvbmcgYW5jaG9yLlxuICovXG5mdW5jdGlvbiBjb250YWluc1JlbmRlcmVkSDEoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbW1lbnRzIGNhbm5vdCBuZXN0IGFuZCBlbmQgdW5hbWJpZ3VvdXNseSwgc28gdGhleSBhcmUgc2ltcGx5IHJlbW92ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZy5cbiAgY29uc3Qgd2l0aG91dENvbW1lbnRzID0gaHRtbC5yZXBsYWNlQWxsKC88IS0tW1xcc1xcU10qPyg/Oi0tPnwkKS9ndSwgJycpO1xuICAvLyBDREFUQSwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGRlY2xhcmF0aW9ucywgZWxlbWVudHMgd2hvc2UgY29udGVudCBpcyByYXcgdGV4dCAvIFJDREFUQSAvXG4gIC8vIHNjcmlwdCBkYXRhLCBhbmQgYDx0ZW1wbGF0ZT5gICh3aG9zZSBjb250ZW50cyBhcmUgaW5lcnQpLiBBIHF1b3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyBgPGBcbiAgLy8gbWFrZXMgZXZlbiBsb2NhdGluZyB0aGVzZSB1bnJlbGlhYmxlLCBzbyBpdCBkaXNxdWFsaWZpZXMgdGhlIGJsb2NrIHRvby5cbiAgY29uc3QgYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybiA9XG4gICAgLzwhXFxbQ0RBVEFcXFt8PFxcP3w8IVthLXpBLVpdfDxcXC8/KD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlfGlmcmFtZXxub2ZyYW1lc3xub2VtYmVkfHhtcHx0ZW1wbGF0ZSlcXGJ8XCJbXlwiXSo8W15cIl0qXCJ8J1teJ10qPFteJ10qJy9pdTtcbiAgaWYgKGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4udGVzdCh3aXRob3V0Q29tbWVudHMpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFF1b3RpbmcgaXMgc2lnbmlmaWNhbnQgb25seSBpbnNpZGUgYSBzdGFydCB0YWcsIHNvIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyBjb25zdW1lZCB3aXRoIGl0cyBvd25cbiAgLy8gdGFnIHdoaWxlIHF1b3RhdGlvbiBtYXJrcyBpbiBvcmRpbmFyeSB0ZXh0IHN0YXkgdGV4dDogYDxkaXYgdGl0bGU9XCImbHQ7aDEmZ3Q7XCI+YCBkb2VzIG5vdCBjb3VudCxcbiAgLy8gYFwiPGgxPlByb2plY3Q8L2gxPlwiYCBkb2VzLlxuICBjb25zdCBzdGFydFRhZ1BhdHRlcm4gPSAvPChbYS16QS1aXVteXFxzLz5dKikoPzpcIlteXCJdKlwifCdbXiddKid8W14+XCInXSkqPi9ndTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB3aXRob3V0Q29tbWVudHMubWF0Y2hBbGwoc3RhcnRUYWdQYXR0ZXJuKSkge1xuICAgIGlmIChtYXRjaFsxXT8udG9Mb3dlckNhc2UoKSA9PT0gJ2gxJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogV2hldGhlciB0aGUgbm9kZSBpcyBhIHBhcmFncmFwaCBvZiBiYWRnZXMgYW5kIG5vdGhpbmcgZWxzZSDigJQgdGhlIG9ubHkgY29udGVudCB3YmZ5IHB1dHMgaW4gdGhlIGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNCYWRnZUJsb2NrTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IG5vZGUgaXMgUGFyYWdyYXBoIHtcbiAgcmV0dXJuIChcbiAgICAhIW5vZGUgJiZcbiAgICBub2RlLnR5cGUgPT09ICdwYXJhZ3JhcGgnICYmXG4gICAgbm9kZS5jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKSAmJlxuICAgIG5vZGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgICAoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSB8fCBjaGlsZC50eXBlID09PSAnYnJlYWsnIHx8IChjaGlsZC50eXBlID09PSAndGV4dCcgJiYgIWNoaWxkLnZhbHVlLnRyaW0oKSlcbiAgICApXG4gICk7XG59XG5cbi8qKiBBIGJhZGdlIGlzIG9uZSBgWyFbYWx0XShpbWFnZSldKGxpbmspYCwgdGhlIG9ubHkgc2hhcGUgd2JmeSBldmVyIHdyaXRlcy4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgUGhyYXNpbmdDb250ZW50KTogbm9kZSBpcyBMaW5rICYgeyBjaGlsZHJlbjogW0ltYWdlXSB9IHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2xpbmsnICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuY2hpbGRyZW5bMF0/LnR5cGUgPT09ICdpbWFnZSc7XG59XG5cbi8qKlxuICogVGhlIGJhZGdlcyBpbiB0aGUgYmxvY2ssIGFzIHRoZSBleGFjdCBzb3VyY2UgdGV4dCB0aGF0IHByb2R1Y2VkIHRoZW06IGEgYmFkZ2Ugd2JmeSBkb2VzIG5vdCBtYW5hZ2VcbiAqIGlzIHdyaXR0ZW4gYmFjayBieXRlIGZvciBieXRlIGluc3RlYWQgb2YgYmVpbmcgcmUtc2VyaWFsaXplZCBmcm9tIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiByZWFkQmFkZ2VzKG5vZGU6IFBhcmFncmFwaCwgY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpXG4gICAgLm1hcCgoY2hpbGQpID0+IGNvbnRlbnQuc2xpY2UoY2hpbGQucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCwgY2hpbGQucG9zaXRpb24hLmVuZC5vZmZzZXQpKTtcbn1cblxuLyoqXG4gKiBQZXJjZW50LWVuY29kZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBlbmQgYSBNYXJrZG93biBkZXN0aW5hdGlvbiBlYXJseS4gQSB3b3JrZmxvdyBmaWxlIG1heSBiZVxuICogbmFtZWQgYW55dGhpbmcgd2l0aCBhIGAueW1sYCBleHRlbnNpb24sIGFuZCBvbmUgY29udGFpbmluZyBgKGAgb3IgYClgIHByb2R1Y2VkIGEgYmFkZ2UgdGhhdCB3YmZ5J3NcbiAqIG93biBiYWRnZSBwYXR0ZXJuIGNvdWxkIG5vdCByZWFkIGJhY2sg4oCUIHNvIHRoZSBsaW5lIGxlZnQgdGhlIGJsb2NrIGFuZCB0aGUgYmFkZ2Ugd2FzIGR1cGxpY2F0ZWQuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVybFBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bKClcXHNdL2d1LCAoY2hhcmFjdGVyKSA9PiBgJSR7Y2hhcmFjdGVyLmNvZGVQb2ludEF0KDApIS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIG9uZSB3YmZ5IHdyaXRlcyBpdHNlbGYsIGFuZCBzbyBtYXkgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgYmxvY2suICovXG5mdW5jdGlvbiBpc01hbmFnZWRCYWRnZShiYWRnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBiYWRnZSA9PT0gc2VtYW50aWNSZWxlYXNlQmFkZ2UgfHwgbWFuYWdlZEJhZGdlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGJhZGdlKSk7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVFbmRpbmcoY29udGVudDogc3RyaW5nKTogJ1xcbicgfCAnXFxyXFxuJyB7XG4gIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXHJcXG4nKSA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuXG5jb25zdCBzaGFyZWRQcmVzZXQgPSAnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbmMnO1xuY29uc3QgZ2VuZXJhdGVkU2V0dGluZ3MgPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogW3NoYXJlZFByZXNldF0sXG59O1xuXG50eXBlIFNldHRpbmdzID0gUGFydGlhbDx0eXBlb2YgZ2VuZXJhdGVkU2V0dGluZ3M+ICYge1xuICBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdO1xufTtcblxuY29uc3QgbWFuYWdlZEZpbGVOYW1lID0gJ3Jlbm92YXRlLmpzb25jJztcblxuLy8gd2JmeSBzdXBwb3J0cyBvbmUgY2Fub25pY2FsIFJlbm92YXRlIGxvY2F0aW9uLiBOb24tY2Fub25pY2FsIGNvbmZpZ3MgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbi8vIHJlcG9zaXRvcnkgaW5zdGVhZCBvZiBiZWluZyBwYXJzZWQsIG1lcmdlZCwgb3IgZGVsZXRlZCBoZXJlLlxuY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMgPSBbXG4gICdyZW5vdmF0ZS5qc29uJyxcbiAgJ3Jlbm92YXRlLmpzb241JyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbicsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb25jJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbjUnLFxuICAnLnJlbm92YXRlcmMnLFxuICAnLnJlbm92YXRlcmMuanNvbicsXG4gICcucmVub3ZhdGVyYy5qc29uNScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgbWFuYWdlZEZpbGVOYW1lKTtcbiAgICBjb25zdCBtYW5hZ2VkRmlsZVN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAobWFuYWdlZEZpbGVTdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGNhbmRpZGF0ZSkuY2F0Y2goKCkgPT4ge30pKSA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdQYXRoID0gbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAobm9uQ2Fub25pY2FsQ29uZmlnUGF0aCB8fCBjb25maWcucGFja2FnZUpzb24/LnJlbm92YXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgcmVwb3NpdG9yeSBoYXMgYSBub24tY2Fub25pY2FsIFJlbm92YXRlIGNvbmZpZyR7XG4gICAgICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA/IGAgYXQgJHtub25DYW5vbmljYWxDb25maWdQYXRofWAgOiAnIGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgfS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8U2V0dGluZ3M+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRTZXR0aW5ncz8uZXh0ZW5kcyAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4dGVuZHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiZXh0ZW5kc1wiIGlzIG5vdCBhbiBhcnJheS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZFByZXNldCA9IG9sZFNldHRpbmdzPy5leHRlbmRzPy5maW5kKFxuICAgICAgKHByZXNldCkgPT4gcHJlc2V0LnN0YXJ0c1dpdGgoJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOicpICYmIHByZXNldCAhPT0gc2hhcmVkUHJlc2V0XG4gICAgKTtcbiAgICBpZiAocmVtb3ZlZFByZXNldCkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcIiR7cmVtb3ZlZFByZXNldH1cIiBubyBsb25nZXIgZXhpc3RzOyByZW1vdmUgaXQgbWFudWFsbHkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSBidWlsZFNldHRpbmdzKGNvbmZpZywgb2xkU2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICAgIG9sZENvbnRlbnQsXG4gICAgICBuZXdTZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBub3JtYWxpemUoY29udGVudCkgPT09IG5vcm1hbGl6ZShvbGRDb250ZW50KSkgcmV0dXJuO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IFNldHRpbmdzIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBvbGRTZXR0aW5nc1xuICAgID8gKG1lcmdlLmFsbChbZ2VuZXJhdGVkU2V0dGluZ3MsIG9sZFNldHRpbmdzLCBnZW5lcmF0ZWRTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncylcbiAgICA6IHN0cnVjdHVyZWRDbG9uZShnZW5lcmF0ZWRTZXR0aW5ncyk7XG4gIGNvbnN0IGV4aXN0aW5nRXh0ZW5kcyA9IG9sZFNldHRpbmdzPy5leHRlbmRzID8/IFtdO1xuICBzZXR0aW5ncy5leHRlbmRzID0gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzXG4gICAgPyBleGlzdGluZ0V4dGVuZHMuZmlsdGVyKChwcmVzZXQpID0+IHByZXNldCAhPT0gc2hhcmVkUHJlc2V0KVxuICAgIDogZXhpc3RpbmdFeHRlbmRzLmluY2x1ZGVzKHNoYXJlZFByZXNldClcbiAgICAgID8gZXhpc3RpbmdFeHRlbmRzXG4gICAgICA6IFtzaGFyZWRQcmVzZXQsIC4uLmV4aXN0aW5nRXh0ZW5kc107XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gIHJldHVybiB0cmltbWVkQ29udGVudCA/IHRyaW1tZWRDb250ZW50ICsgJ1xcbicgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgLy8gYGFwcC8qKmAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBldmVuIHRob3VnaCB0aGUgZG9lc0NvbnRhaW4qU2NyaXB0IHNpZ25hbHMgc2NhbiBpdDogYXBwXG4gIC8vIGRpcmVjdG9yaWVzIGJlbG9uZyB0byBmcmFtZXdvcmsgcGFja2FnZXMgKE5leHQuanMvQmxpdHopLCB3aGljaCBvd24gdGhlaXIgdHNjb25maWdcbiAgLy8gKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSksIGFuZCBjaGVja2luZyBmcmFtZXdvcmsgc291cmNlcyB1bmRlciB0aGlzIHByb2plY3QncyBjb21waWxlclxuICAvLyBvcHRpb25zIHdvdWxkIHByb2R1Y2UgZmFsc2UgZXJyb3JzLlxuICAvLyBgKi5jb25maWcubXRzYCBjb3ZlcnMgVml0ZS1sb2FkZWQgY29uZmlncyAoZS5nLiB2aXRlc3QuY29uZmlnLm10cykgb2YgQ29tbW9uSlMgcGFja2FnZXMgKG5vXG4gIC8vIGBcInR5cGVcIjogXCJtb2R1bGVcImAsIGUuZy4gdHJlZS1zaXR0ZXIgZ3JhbW1hcnMpLCB3aGljaCB1c2UgdGhhdCBleHRlbnNpb24gc28gTm9kZSBhbmQgVml0ZSBsb2FkXG4gIC8vIHRoZW0gYXMgRVMgbW9kdWxlcy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy5tdHMnLCAnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmsgYW5kIG93bnMgaXRzIHRzY29uZmlnIGp1c3QgbGlrZSBOZXh0L0JsaXR6LFxuICAgIC8vIHNvIGl0IG11c3Qgc2tpcCB0aGUgc3RhbmRhcmQgZ2VuZXJhdGlvbiB0aGF0IHdvdWxkIG92ZXJ3cml0ZSB0aGUgZnJhbWV3b3JrJ3Mgb3duIHNldHRpbmdzLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgYXdhaXQgbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSAoY29uZmlnLmlzUm9vdCA/IGJ1aWxkUm9vdEpzb25PYmooY29uZmlnKSA6IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSkgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cbiAgICBpZiAoaGFzUmFpbHdheUlhYyhjb25maWcpKSBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJy5yYWlsd2F5LyoqLyonKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvLyBBIGZpbGUgd2l0aCBubyBjb25maWd1cmF0aW9uIChlbXB0eSBvciBjb21tZW50LW9ubHkpIGlzIHRyZWF0ZWQgbGlrZSBhIG1pc3Npbmcgb25lLCBhcyB0c2MgZG9lcy5cbiAgICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHRzY29uZmlnLmpzb24gd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGVcbiAgICAgIC8vIGdlbmVyYXRlZCBzZXR0aW5ncyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcHJvamVjdCdzIGNvbmZpZ3VyYXRpb24uXG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykpKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgICAgIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoY29uZmlnLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH1cbiAgICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKG5ld1NldHRpbmdzLCBjb25maWcpO1xuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIC8vIFBhY2thZ2UgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UgZXhwb3J0cyBpbnN0ZWFkIG9mIGJhc2VVcmwuXG4gICAgLy8gcGF0aHMgaXMgaW50ZW50aW9uYWxseSBwcmVzZXJ2ZWQgc28gcmVwby1sb2NhbCB0b29saW5nIGNhbiBrZWVwIGV4cGxpY2l0XG4gICAgLy8gYWxpYXNlcyB3aXRob3V0IHJlbHlpbmcgb24gYmFzZVVybCdzIGJyb2FkIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LXVwLXRvLWRhdGUgdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbW9ub3JlcG8tcm9vdCB0c2NvbmZpZywgd2hvc2UgaW5jbHVkZS9leGNsdWRlIGNvdmVyIGV2ZXJ5IERFQ0xBUkVEIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy5cbiAqIGBhcHBzLypgIGFsb25nc2lkZSBgcGFja2FnZXMvKmApIHNvIHR5cGUtYXdhcmUgbGludGluZyBydW4gZnJvbSB0aGUgcm9vdCBzZWVzIGFsbCB3b3Jrc3BhY2VcbiAqIHNvdXJjZXMsIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUm9vdEpzb25PYmooY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogVHNDb25maWdKc29uIHtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKGNvbmZpZylcbiAgICA6IHsgZXhjbHVkZXM6IFtdLCBpbmNsdWRlczogW10gfTtcbiAgY29uc3Qgc2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICBzZXR0aW5ncy5leGNsdWRlID0gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMubWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0L2ZpeHR1cmVzYCksXG4gICAgICAvLyBOZWdhdGl2ZSB3b3Jrc3BhY2UgcGF0dGVybnMgKGUuZy4gYCFwYWNrYWdlcy9leGNsdWRlZGApIG9wdCB3b3Jrc3BhY2Ugc3VidHJlZXMgb3V0IG9mIHRoZVxuICAgICAgLy8gbW9ub3JlcG8sIHNvIHRoZWlyIHNvdXJjZXMgbXVzdCBub3QgZW50ZXIgdGhlIHJvb3QgdHlwZS1jaGVjayBwcm9qZWN0IGVpdGhlci4gQSBuZWdhdGlvblxuICAgICAgLy8gd2hvc2UgZGlyZWN0b3J5IGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIHlpZWxkcyBwYWNrYWdlLW93bmVkIHN1YnBhdGggZW50cmllc1xuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgd2hvbGUgc3VidHJlZSAoc2VlIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKS5cbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmV4Y2x1ZGVzLFxuICAgICAgLy8gVGhlIG1hbmFnZWQgaW5jbHVkZXMgYWJvdmUgZGVsaWJlcmF0ZWx5IG9taXQgZnJhbWV3b3JrIGBhcHAvKipgIGRpcmVjdG9yaWVzIChzZWVcbiAgICAgIC8vIHN1Ykpzb25PYmouaW5jbHVkZSdzIGNvbW1lbnQpLCBidXQgYSByZXBvLWF1dGhvcmVkIGJyb2FkIGluY2x1ZGUgc3VjaCBhcyBgZTJlLyoqXFwvKmBcbiAgICAgIC8vIGNhbiBzdGlsbCBkcmFnIGEgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBzb3VyY2VzIGludG8gdGhlIHJvb3QgcHJvamVjdCwgd2hlcmUgdGhleVxuICAgICAgLy8gZmFpbCB1bmRlciB0aGUgcm9vdCBjb21waWxlciBvcHRpb25zIOKAlCB0aGVpciBiYXJlIGBuZXh0LypgIGltcG9ydHMgcmVzb2x2ZSBvbmx5IHRocm91Z2hcbiAgICAgIC8vIHRoZSBmcmFtZXdvcmsgd29ya3NwYWNlJ3Mgb3duIHRzY29uZmlnIGBwYXRoc2AuIEV4Y2x1ZGUgdGhvc2UgYXBwIGRpcmVjdG9yaWVzIHNvIHRoZVxuICAgICAgLy8gcm9vdCBwcm9qZWN0IG5ldmVyIHR5cGUtY2hlY2tzIHRoZW0sIG5vIG1hdHRlciBob3cgYnJvYWQgdGhlIHJlcG8ncyBpbmNsdWRlIGdsb2JzIGFyZS5cbiAgICAgIC4uLmdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZyksXG4gICAgICAuLi4oc2V0dGluZ3MuZXhjbHVkZSA/PyBbXSksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbiAgc2V0dGluZ3MuaW5jbHVkZSA9IFtcbiAgICAuLi4oc2V0dGluZ3MuaW5jbHVkZSA/PyBbXSksXG4gICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMuZmxhdE1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gW1xuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vKi5jb25maWcudHNgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc2NyaXB0cy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NyYy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvKiovKmAsXG4gICAgXSksXG4gIF07XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuLy8gRnJhbWV3b3JrIHBhY2thZ2VzIG93biB0aGVpciB0c2NvbmZpZyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSBhbmQgc2hpbSBiYXJlIGltcG9ydHMgc3VjaCBhc1xuLy8gYG5leHQvbmF2aWdhdGlvbmAgdGhyb3VnaCBwYWNrYWdlLWxvY2FsIGBwYXRoc2A7IHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29ya1xuLy8gYW5kIGJlaGF2ZXMgdGhlIHNhbWUuIFRoZWlyIGFwcCBzb3VyY2VzIHRoZXJlZm9yZSBvbmx5IHR5cGUtY2hlY2sgdW5kZXIgdGhlaXIgb3duIGNvbmZpZy5cbmNvbnN0IGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcyA9IFsnYmxpdHonLCAnbmV4dCcsICd2aW5leHQnXTtcblxuLy8gQSBmcmFtZXdvcmsgYXBwIGxpdmVzIGluIGBhcHAvYCBvciwgdW5kZXIgdGhlIHNyYy1kaXJlY3RvcnkgbGF5b3V0LCBgc3JjL2FwcC9gLiBUaGUgcm9vdCBwcm9qZWN0XG4vLyBpbmNsdWRlcyBgPHdvcmtzcGFjZT4vc3JjLyoqLypgLCBzbyBgc3JjL2FwcGAgbGVha3MgaW4ganVzdCBhcyBhIHJlcG8td2lkZSBnbG9iIGNhbiBwdWxsIGluIGBhcHBgLlxuY29uc3QgZnJhbWV3b3JrQXBwRGlyTmFtZXMgPSBbJ2FwcCcsICdzcmMvYXBwJ107XG5cbi8qKiBSb290IGBleGNsdWRlYCBlbnRyaWVzIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIHJvb3QpIGZvciBldmVyeSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIGdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHJldHVybiBbXTtcbiAgY29uc3QgZXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlRGlyUGF0aCBvZiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpKSB7XG4gICAgaWYgKCFkZXBlbmRzT25GcmFtZXdvcmsocGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYXBwRGlyTmFtZSBvZiBmcmFtZXdvcmtBcHBEaXJOYW1lcykge1xuICAgICAgY29uc3QgYXBwRGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCBhcHBEaXJOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFwcERpclBhdGgpKSBleGNsdWRlcy5wdXNoKHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGFwcERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4Y2x1ZGVzO1xufVxuXG5mdW5jdGlvbiBkZXBlbmRzT25GcmFtZXdvcmsobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IG1hbmlmZXN0OiBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIHRyeSB7XG4gICAgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEEgbWFuaWZlc3QgdGhhdCBwYXJzZXMgdG8gYSBub24tb2JqZWN0IChlLmcuIGEgZmlsZSBsaXRlcmFsbHkgY29udGFpbmluZyBgbnVsbGApIGRlY2xhcmVzIG5vXG4gIC8vIGRlcGVuZGVuY2llczsgZ3VhcmQgdGhlIHByb3BlcnR5IGFjY2Vzcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IG91dHNpZGUgdGhlIHRyeSBhYm92ZS5cbiAgaWYgKCFtYW5pZmVzdCB8fCB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHsgLi4ubWFuaWZlc3QuZGVwZW5kZW5jaWVzLCAuLi5tYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMgfTtcbiAgcmV0dXJuIGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcy5zb21lKChkZXBlbmRlbmN5TmFtZSkgPT4gZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3lOYW1lXSk7XG59XG5cbmNvbnN0IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMgPSBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXTtcblxuLyoqXG4gKiBSb290IGluY2x1ZGUvZXhjbHVkZSBlbnRyaWVzIHdiZnkgZ2VuZXJhdGVkIGZvciBhbiBlYXJsaWVyIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy4gYHBhY2thZ2VzLypgXG4gKiBnbG9icyBpbiBhIHJlcG8gdGhhdCBub3cgZGVjbGFyZXMgb25seSBgYXBwcy8qYCkgbXVzdCBub3Qgc3Vydml2ZSB0aGUgbWVyZ2Ugd2l0aCB0aGUgZXhpc3RpbmdcbiAqIHRzY29uZmlnLCBvciB0aGUgb2Jzb2xldGUgZGlyZWN0b3JpZXMgd291bGQga2VlcCBlbnRlcmluZyByb290IHR5cGUgY2hlY2tpbmcgZm9yZXZlci4gQSBwcmVmaXhcbiAqIGNvdW50cyBhcyB3YmZ5LW1hbmFnZWQgb25seSB3aGVuIHRoZSBDT01QTEVURSBnZW5lcmF0ZWQgaW5jbHVkZSBzZXQgZm9yIGl0IGlzIHByZXNlbnQgYW5kIG5vXG4gKiBsb25nZXIgZ2VuZXJhdGVkIOKAlCBhIHVzZXItYXV0aG9yZWQgZW50cnkgc3VjaCBhcyBhIGxvbmUgYHRvb2xzLypcXC9zcmMvKipcXC8qYCBuZXZlciBxdWFsaWZpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgb2xkU2V0dGluZ3M6IFRzQ29uZmlnSnNvbixcbiAgbmV3U2V0dGluZ3M6IFRzQ29uZmlnSnNvblxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YWxlUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuaW5jbHVkZSkpIHtcbiAgICBjb25zdCBvbGRJbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpO1xuICAgIGNvbnN0IGdlbmVyYXRlZEluY2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmluY2x1ZGUpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygb2xkSW5jbHVkZSkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSk7XG4gICAgICBpZiAod29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5ldmVyeSgoc3VmZml4KSA9PlxuICAgICAgICBvbGRJbmNsdWRlLmluY2x1ZGVzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBjb25zdCBpc1N0aWxsR2VuZXJhdGVkID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5zb21lKChzdWZmaXgpID0+XG4gICAgICAgIGdlbmVyYXRlZEluY2x1ZGUuaGFzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wbGV0ZSAmJiAhaXNTdGlsbEdlbmVyYXRlZCkgc3RhbGVQcmVmaXhlcy5hZGQod29ya3NwYWNlUHJlZml4KTtcbiAgICB9XG4gICAgaWYgKHN0YWxlUHJlZml4ZXMuc2l6ZSA+IDApIHtcbiAgICAgIG9sZFNldHRpbmdzLmluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgIXN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4Y2x1ZGUpKSByZXR1cm47XG4gIGNvbnN0IGdlbmVyYXRlZEV4Y2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmV4Y2x1ZGUpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKS5tYXAoKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIHBhdGgucmVsYXRpdmUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSwgd29ya3NwYWNlRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJylcbiAgICAgIClcbiAgICA6IFtdO1xuICBvbGRTZXR0aW5ncy5leGNsdWRlID0gb2xkU2V0dGluZ3MuZXhjbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycgfHwgZ2VuZXJhdGVkRXhjbHVkZS5oYXMoZW50cnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZW50cnkuZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykpIHtcbiAgICAgIHJldHVybiAhc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLScvdGVzdC9maXh0dXJlcycubGVuZ3RoKSk7XG4gICAgfVxuICAgIC8vIEEgZnJhbWV3b3JrIGFwcCBleGNsdWRlIChgPHdvcmtzcGFjZT4vYXBwYCwgYDx3b3Jrc3BhY2U+L3NyYy9hcHBgKSBmb3IgYSBzdGlsbC1kZWNsYXJlZFxuICAgIC8vIHdvcmtzcGFjZSBpcyBwcnVuZWQgYnkgY292ZXJzV29ya3NwYWNlRGlyIGJlbG93IHdoZW4gbm8gbG9uZ2VyIGdlbmVyYXRlZDsgdGhpcyBjYXRjaGVzIHRoZVxuICAgIC8vIHJlbWFpbmluZyBjYXNlLCB3aGVyZSB0aGUgd29ya3NwYWNlIGl0c2VsZiB3YXMgcmVtb3ZlZCBhbmQgaXRzIHByZWZpeCBpcyB0aGVyZWZvcmUgc3RhbGUuXG4gICAgLy8gKEEgd3Jvbmcgc3VmZml4IHN0cmlwIHlpZWxkcyBhIHByZWZpeCBhYnNlbnQgZnJvbSBzdGFsZVByZWZpeGVzLCBzbyB0ZXN0aW5nIGV2ZXJ5IG5hbWUgaXMgc2FmZS4pXG4gICAgaWYgKFxuICAgICAgZnJhbWV3b3JrQXBwRGlyTmFtZXMuc29tZShcbiAgICAgICAgKGFwcERpck5hbWUpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHthcHBEaXJOYW1lfWApICYmIHN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0oYXBwRGlyTmFtZS5sZW5ndGggKyAxKSkpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5LCB3b3Jrc3BhY2VEaXJQYXRocyk7XG4gIH0pO1xufVxuXG4vLyBXaGV0aGVyIGFuIGV4Y2x1ZGUgZW50cnkgaXMgYSB3b3Jrc3BhY2UgbmVnYXRpb24gKGAhYXBwcy9leGNsdWRlZGApIHdob3NlIG5lZ2F0aW9uIGlzIGdvbmU6IHRoZVxuLy8gZGlyZWN0b3J5IGlzIGEgd29ya3NwYWNlIGFnYWluIGFuZCBtdXN0IHJlLWVudGVyIHRoZSByb290IHByb2plY3QuIHdiZnkgd3JpdGVzIHN1Y2ggYSBuZWdhdGlvbiBhc1xuLy8gYSBkaXJlY3RvcnkgcGF0aCwgYXMgYSBkaXJlY3RvcnkgUEFUVEVSTiB3aGVuIGl0IGV4Y2x1ZGVzIGV4YWN0bHkgd2hhdCBpdCBtYXRjaGVzIChgYXBwcy8qYmApLCBvclxuLy8gYXMgYW4gYW5jZXN0b3IncyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIChgYXBwcy94L3NyY2ApIOKAlCBzbyB0aGUgZW50cnkgbWF5IGNvdmVyIGEgZGlzY292ZXJlZFxuLy8gd29ya3NwYWNlIGRpcmVjdG9yeSBvciBzaXQgdW5kZXIgb25lLiBBIGdsb2JzdGFyIHNlZ21lbnQgbWFya3MgYSBoeWdpZW5lIGdsb2IgKG5vZGVfbW9kdWxlcywgZTJlXG4vLyBhbmQgZnJpZW5kcyksIHdoaWNoIGlzIG5ldmVyIG5lZ2F0aW9uLWRlcml2ZWQgYW5kIG11c3Qgc3Vydml2ZS5cbmZ1bmN0aW9uIGNvdmVyc1dvcmtzcGFjZURpcihlbnRyeTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKGVudHJ5LnNwbGl0KCcvJykuaW5jbHVkZXMoJyoqJykpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBlbnRyeVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT5cbiAgICAgIHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgJ1teL10qJylcbiAgICAgICAgLnJlcGxhY2VBbGwoJz8nLCAnW14vXScpXG4gICAgKVxuICAgIC5qb2luKCcvJyk7XG4gIGNvbnN0IGVudHJ5UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSg/Oi8uKik/JGAsICd1Jyk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJQYXRocy5zb21lKFxuICAgICh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBlbnRyeVBhdHRlcm4udGVzdCh3b3Jrc3BhY2VEaXJQYXRoKSB8fCBlbnRyeS5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoZWRTdWZmaXggPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmZpbmQoKHN1ZmZpeCkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke3N1ZmZpeH1gKSk7XG4gIGlmICghbWF0Y2hlZFN1ZmZpeCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZW50cnkuc2xpY2UoMCwgLShtYXRjaGVkU3VmZml4Lmxlbmd0aCArIDEpKTtcbiAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gJycgPyB1bmRlZmluZWQgOiB3b3Jrc3BhY2VQcmVmaXg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBpZiAoZXhpc3RpbmdDb250ZW50ID09PSB1bmRlZmluZWQgfHwganNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSByZXR1cm47XG4gIGNvbnN0IHNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gIGlmICghc2V0dGluZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgY2xlYW5pbmcgdXAgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gIGFkZEluY2x1ZGVzRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5ncywgY29uZmlnKTtcbiAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5ncywgY29uZmlnKTtcbiAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAvLyBhbHJlYWR5LWNsZWFuIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PlxuICAgIGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKVxuICApO1xufVxuXG4vKipcbiAqIGJ1bi10eXBlcyByZWZlcmVuY2VzIHVuZGljaS10eXBlcyB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KSwgc29cbiAqIEJ1bidzIGlzb2xhdGVkIGxpbmtlciAoZXNwZWNpYWxseSB3aXRoIHRoZSBnbG9iYWwgc3RvcmUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSkgY2Fubm90IHJlc29sdmVcbiAqIGl0IGZyb20gYnVuLXR5cGVzJyBsb2NhdGlvbiwgd2hpY2ggc2lsZW50bHkgZGVncmFkZXMgZ2xvYmFsIGZldGNoIHR5cGVzIHN1Y2ggYXMgUmVzcG9uc2UuIE1hcCBpdFxuICogdG8gdGhlIGNvcHkgdGhhdCBidW5maWcudG9tbCdzIHB1YmxpY0hvaXN0UGF0dGVybiBwbGFjZXMgaW4gdGhlIHJvb3Qgbm9kZV9tb2R1bGVzLlxuICovXG5mdW5jdGlvbiBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBNYXAgdW5kaWNpLXR5cGVzIG9ubHkgd2hlbiBidW4tdHlwZXMgYWN0dWFsbHkgbG9hZHM6IGFuIGV4cGxpY2l0IGB0eXBlc2AgbGlzdCBsb2FkcyBpdCBpZmYgaXRcbiAgLy8gY29udGFpbnMgXCJidW5cIiAoZXZlbiBvbiBSZWFjdCBOYXRpdmUsIHdob3NlIHByb2plY3RzIG1heSBvcHQgaW4gYnkgaGFuZCk7IHdpdGggYHR5cGVzYFxuICAvLyBvbWl0dGVkLCBUeXBlU2NyaXB0J3MgYXV0b21hdGljIEB0eXBlcyBpbmNsdXNpb24gbG9hZHMgaXQgYmVjYXVzZSB3YmZ5IGluc3RhbGxzIEB0eXBlcy9idW5cbiAgLy8gZm9yIGV2ZXJ5IEphdmFTY3JpcHQgb3IgVHlwZVNjcmlwdCBwcm9qZWN0IGV4Y2VwdCBSZWFjdCBOYXRpdmUsIHdoaWNoIHVzZXNcbiAgLy8gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSBpbnN0ZWFkLlxuICBjb25zdCB0eXBlcyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXM7XG4gIGlmICh0eXBlcyA/ICF0eXBlcy5pbmNsdWRlcygnYnVuJykgOiBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSByZXR1cm47XG4gIGNvbnN0IGNvcnJlY3RNYXBwaW5nID0gYCR7Z2V0Um9vdERpcihjb25maWcpfS9ub2RlX21vZHVsZXMvdW5kaWNpLXR5cGVzL2luZGV4LmQudHNgO1xuICBjb25zdCBleGlzdGluZ01hcHBpbmcgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnBhdGhzPy5bJ3VuZGljaS10eXBlcyddO1xuICBpZiAoZXhpc3RpbmdNYXBwaW5nKSB7XG4gICAgLy8gUmV3cml0ZSB0aGUgZ2VuZXJhdGVkIG1hcHBpbmcgd2hlbiBhIHdvcmtzcGFjZSBtb3ZlcyB0byBhIGRpZmZlcmVudCByb290IGRlcHRoLiBBbnkgb3RoZXJcbiAgICAvLyB2YWx1ZSBpcyBhIGRlbGliZXJhdGUgcmVwby1sb2NhbCBtYXBwaW5nIChlLmcuIHBhdGNoZWQgdHlwZXMpIGFuZCBtdXN0IGJlIGtlcHQuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmdNYXBwaW5nLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdHlwZW9mIGV4aXN0aW5nTWFwcGluZ1swXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIC8oPzpefFxcLylub2RlX21vZHVsZXNcXC91bmRpY2ktdHlwZXNcXC9pbmRleFxcLmRcXC50cyQvdS50ZXN0KGV4aXN0aW5nTWFwcGluZ1swXSlcbiAgICApIHtcbiAgICAgIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyEucGF0aHMhWyd1bmRpY2ktdHlwZXMnXSA9IFtjb3JyZWN0TWFwcGluZ107XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyA9IHtcbiAgICAuLi5zZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMsXG4gICAgJ3VuZGljaS10eXBlcyc6IFtjb3JyZWN0TWFwcGluZ10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVzRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGNvbnN0IGluY2x1ZGVDb3VudCA9IHNldHRpbmdzLmluY2x1ZGUubGVuZ3RoO1xuICBhZGRJbmNsdWRlUGF0aChzZXR0aW5ncywgJ3NjcmlwdHMvKiovKicpO1xuICAvLyBJbmNsdWRlIHdpbGRjYXJkcyBza2lwIGRvdCBkaXJlY3Rvcmllcywgc28gZnJhbWV3b3JrIGdsb2JzIHN1Y2ggYXMgYCoqLyoudHNgIG5ldmVyIHJlYWNoIGAucmFpbHdheS9gLlxuICBpZiAoaGFzUmFpbHdheUlhYyhjb25maWcpKSBhZGRJbmNsdWRlUGF0aChzZXR0aW5ncywgJy5yYWlsd2F5LyoqLyonKTtcbiAgLy8gU29ydGluZyBhbiB1bmNoYW5nZWQgaW5jbHVkZSB3b3VsZCByZXdyaXRlIGFuIGFscmVhZHktY2xlYW4gdHNjb25maWcgYW5kIGRyb3AgaXRzIGNvbW1lbnRzLlxuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5sZW5ndGggPiBpbmNsdWRlQ291bnQpIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBoYXNSYWlsd2F5SWFjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheScsICdyYWlsd2F5LnRzJykpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIC8vIFRoZSB1bmRpY2ktdHlwZXMgcGF0aCBtYXBwaW5nIG11c3QgcmVhY2ggdGhlIG1vbm9yZXBvIHJvb3QncyBub2RlX21vZHVsZXMgKGJ1bmZpZy50b21sJ3NcbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIGhvaXN0cyB0aGUgcGFja2FnZSB0aGVyZSksIGFuZCB3b3Jrc3BhY2UgcGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXBcbiAgLy8gKGUuZy4gYGV4YW1wbGVzLyoqYCksIHNvIGEgZml4ZWQgdHdvLWxldmVsIHByb2JlIGlzIG5vdCBlbm91Z2guIFByZWZlciB0aGUgbmVhcmVzdCBhbmNlc3RvclxuICAvLyBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIHdvcmtzcGFjZXMgKHRoZSBtb25vcmVwbyByb290KTsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbmVhcmVzdFxuICAvLyBhbmNlc3RvciBtYW5pZmVzdC4gU3RvcCBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZ1xuICAvLyByZXBvc2l0b3J5J3MgbWFuaWZlc3QgY2FuIG5ldmVyIGJlIGNob3Nlbi5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCk7XG4gIGxldCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7IDsgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCkpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgcm9vdERpclBhdGggPz89IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgICAgLy8gQnVuIG5vLW9wIHBhdHRlcm5zIChlLmcuIGB3b3Jrc3BhY2VzOiBbXCJcIl1gKSBkbyBub3QgbWFrZSBhIG1hbmlmZXN0IGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICAgIGlmIChnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhtYW5pZmVzdC53b3Jrc3BhY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm9vdERpclBhdGggPSBhbmNlc3RvckRpclBhdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbiB1bnBhcnNhYmxlIG1hbmlmZXN0IHN0aWxsIG1hcmtzIGEgcHJvamVjdCBkaXJlY3Rvcnk7IGtlZXAgY2xpbWJpbmcgZm9yIGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gYW5jZXN0b3JEaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgYnJlYWs7XG4gIH1cbiAgaWYgKCFyb290RGlyUGF0aCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgcm9vdERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpIHx8ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VTZXR0aW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIFJlYWN0IE5hdGl2ZSBnZXRzIGl0cyBhbWJpZW50IHR5cGVzIGZyb20gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSAocmVhY3QtbmF0aXZlLCBqZXN0KS5cbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbi8vIFRoaXMgY29udGVudCBpcyBsb2FkZWQgaW50byBldmVyeSBhZ2VudCBzZXNzaW9uLCBzbyBpdCBpcyBrZXB0IGFzIHNob3J0IGFzIGl0IGNhbiBiZSB3aGlsZVxuLy8gc3RheWluZyB1bmFtYmlndW91czogZS5nLiwgdGhlIGV4Y2x1ZGVkIG9yZ2FuaXphdGlvbnMgYXJlIHdyaXR0ZW4gYXMgc2hlbGwgYnJhY2UgZXhwYW5zaW9uLCB3aGljaFxuLy8gdGhlIGFnZW50cyByZWFkIGFzIGEgcGF0aCBjb25kaXRpb24gd2l0aG91dCBhbnkgcnVudGltZSBtYXRjaGluZy5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbi0gT3V0c2lkZSBcXGB+L2docS9naXRodWIuY29tL3tXaWxsQm9vc3RlcixXaWxsQm9vc3RlckxhYn0vXFxgLCBmb2xsb3cgdGhlIHJlcG9zaXRvcnkncyBjb250cmlidXRpb24gZ3VpZGUgKGUuZy4sIENPTlRSSUJVVElORy5tZCwgXFxgLmdpdGh1Yi9cXGApIGFuZCBpc3N1ZS9QUiB0ZW1wbGF0ZXMsIG1hdGNoIGl0cyBjb21taXQgYW5kIGNvZGUgY29udmVudGlvbnMsIGFuZCBob25vciBpdHMgcnVsZXMgb24gQUktYXNzaXN0ZWQgY29udHJpYnV0aW9ucy4gV3JpdGUgaXRzIGlzc3VlcyBhbmQgUFJzIHdpdGggb25seSB3aGF0IGEgcmV2aWV3ZXIgdW5mYW1pbGlhciB3aXRoIHRoZSB3b3JrIG5lZWRzIHRvIHVuZGVyc3RhbmQgYW5kIGFzc2VzcyBpdCwgYXMgY29uY2lzZWx5IGFzIHRoYXQgY29udGV4dCBhbGxvd3MuXG5gO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIHNldHRpbmdzIG1lcmdlZCBpbnRvIGVhY2ggYWdlbnQncyBKU09OIHNldHRpbmdzIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBob21lXG4gKiBkaXJlY3RvcnkuXG4gKlxuICogRXZlcnkgYWdlbnQgdGhhdCBjYXJyaWVzIGZhY3RzIGZyb20gb25lIHNlc3Npb24gaW50byB0aGUgbmV4dCBpcyB0dXJuZWQgb2ZmIGhlcmUgYmVjYXVzZSBzdWNoXG4gKiBtZW1vcnkgbWFrZXMgYSBzZXNzaW9uIGRlcGVuZCBvbiBpbnZpc2libGUgbWFjaGluZS1sb2NhbCBzdGF0ZTogaXRzIGJlaGF2aW9yIHN0b3BzIGJlaW5nXG4gKiByZXByb2R1Y2libGUgYWNyb3NzIGRldmVsb3BlcnMgYW5kIENJLCBhbmQgYSBzdGFsZSBvciB3cm9uZyBtZW1vcnkgc2lsZW50bHkgb3ZlcnJpZGVzIHRoZVxuICogaW5zdHJ1Y3Rpb24gZmlsZXMgYWJvdmUuIENvZGV4IG5lZWRzIG5vIGVudHJ5IGJlY2F1c2UgaXRzIG1lbW9yaWVzIGFyZSBvcHQtaW5cbiAqIChgW2ZlYXR1cmVzXSBtZW1vcmllcyA9IHRydWVgIGluIGB+Ly5jb2RleC9jb25maWcudG9tbGApLCBzbyBsZWF2aW5nIHRoYXQgZmxhZyB1bnNldCBpcyBlbm91Z2guXG4gKi9cbmNvbnN0IGFnZW50U2V0dGluZ3MgPSBbXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuY2xhdWRlL3NldHRpbmdzLmpzb24nLFxuICAgIGFjY2VwdHNDb21tZW50czogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQ2xhdWRlIENvZGUgaW5qZWN0cyBpdHMgb3duIGF0dHJpYnV0aW9uIGRpcmVjdGl2ZSAoYSBgQ28tQXV0aG9yZWQtQnlgIHRyYWlsZXIsIGEgXCJHZW5lcmF0ZWRcbiAgICAgKiB3aXRoXCIgZm9vdGVyLCBhbmQgYSBzZXNzaW9uIGxpbmspIGludG8gdGhlIHRvb2wgZGVzY3JpcHRpb25zIGFuZCBtaWQtc2Vzc2lvbiByZW1pbmRlcnMsIGFuZFxuICAgICAqIHRoYXQgZGlyZWN0aXZlIGRlY2xhcmVzIGl0c2VsZiB0byByZXBsYWNlIGVhcmxpZXIgZ3VpZGFuY2UsIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlIGFsb25lXG4gICAgICogY2Fubm90IHN1cHByZXNzIGl0LiBPbmx5IHRoaXMgc2V0dGluZyByZW1vdmVzIHRoZSBkaXJlY3RpdmUgYXQgaXRzIHNvdXJjZS4gQXV0byBtZW1vcnkgaXMgb25cbiAgICAgKiBieSBkZWZhdWx0LCBzbyBpdCBtdXN0IGJlIHR1cm5lZCBvZmYgZXhwbGljaXRseS5cbiAgICAgKi9cbiAgICBzZXR0aW5nczoge1xuICAgICAgYXR0cmlidXRpb246IHtcbiAgICAgICAgY29tbWl0OiAnJyxcbiAgICAgICAgcHI6ICcnLFxuICAgICAgICBzZXNzaW9uVXJsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBhdXRvTWVtb3J5RW5hYmxlZDogZmFsc2UsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHJlbGF0aXZlUGF0aDogJy5nZW1pbmkvc2V0dGluZ3MuanNvbicsXG4gICAgLy8gR2VtaW5pIENMSSBzdHJpcHMgY29tbWVudHMgYmVmb3JlIHBhcnNpbmcgaXRzIHNldHRpbmdzIGZpbGUsIHVubGlrZSBDbGF1ZGUgQ29kZSwgd2hpY2hcbiAgICAvLyByZWplY3RzIGEgY29tbWVudGVkIGZpbGUgYXMgbWFsZm9ybWVkLlxuICAgIGFjY2VwdHNDb21tZW50czogdHJ1ZSxcbiAgICBzZXR0aW5nczoge1xuICAgICAgZXhwZXJpbWVudGFsOiB7XG4gICAgICAgIGF1dG9NZW1vcnk6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBPdmVyd3JpdGVzIHRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGVzIG9mIGV2ZXJ5IHN1cHBvcnRlZCBhZ2VudCB3aXRoIHRoZSBmaXhlZCBjb250ZW50IGFuZFxuICogbWVyZ2VzIHRoZSBmaXhlZCBzZXR0aW5ncyBpbnRvIGVhY2ggYWdlbnQncyB1c2VyIHNldHRpbmdzLiBSZXR1cm5zIGZhbHNlIHdoZW4gYW55IGZpbGUgd2FzXG4gKiBza2lwcGVkIChlLmcuIGEgc3ltbGlua2VkIG9yIHVucGFyc2FibGUgZmlsZSksIHNvIHRoZSBjb21tYW5kIGNhbiBmYWlsIGxvdWRseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgbGV0IGhhc1dyaXR0ZW5BbGwgPSB0cnVlO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocykge1xuICAgIGNvbnN0IGhhc1dyaXR0ZW4gPSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCksIHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzV3JpdHRlbjtcbiAgfVxuICBmb3IgKGNvbnN0IHsgYWNjZXB0c0NvbW1lbnRzLCByZWxhdGl2ZVBhdGgsIHNldHRpbmdzIH0gb2YgYWdlbnRTZXR0aW5ncykge1xuICAgIC8vIEF3YWl0ZWQgc2VwYXJhdGVseTogYCYmPWAgd291bGQgc2tpcCB0aGUgbWVyZ2Ugb25jZSBhbiBlYXJsaWVyIGZpbGUgd2FzIHNraXBwZWQuXG4gICAgY29uc3QgaGFzTWVyZ2VkID0gYXdhaXQgbWVyZ2VBZ2VudFNldHRpbmdzKHJlbGF0aXZlUGF0aCwgc2V0dGluZ3MsIGFjY2VwdHNDb21tZW50cyk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzTWVyZ2VkO1xuICB9XG4gIHJldHVybiBoYXNXcml0dGVuQWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtZXJnZUFnZW50U2V0dGluZ3MoXG4gIHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuICBuZXdTZXR0aW5nczogb2JqZWN0LFxuICBhY2NlcHRzQ29tbWVudHM6IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgbGV0IGV4aXN0aW5nU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEFuIGFnZW50IGlnbm9yZXMgaXRzIHdob2xlIHNldHRpbmdzIGZpbGUgd2hlbiB0aGUgZmlsZSBicmVha3MgdGhlIGdyYW1tYXIgdGhlIGFnZW50IHJlYWRzIGl0XG4gICAgLy8gd2l0aCwgc28gd2JmeSBsZWF2ZXMgc3VjaCBhIGZpbGUgdG8gdGhlIGRldmVsb3BlciB0byByZXBhaXIgcmF0aGVyIHRoYW4gcmV3cml0aW5nIGl0IGludG8gYVxuICAgIC8vIGZpbGUgdGhlIGFnZW50IHN0aWxsIGlnbm9yZXM6IGNvbW1lbnRzIGFyZSB0b2xlcmF0ZWQgb25seSB3aGVyZSB0aGUgYWdlbnQgc3RyaXBzIHRoZW0sIGFuZFxuICAgIC8vIHRyYWlsaW5nIGNvbW1hcyBub3doZXJlLCBzaW5jZSBib3RoIGFnZW50cyBwYXJzZSB3aXRoIEpTT04ucGFyc2UgaW4gdGhlIGVuZC4gQ29tbWVudC1vbmx5XG4gICAgLy8gY29udGVudCBpcyBjaGVja2VkIHRvbywgYmVjYXVzZSBpdCBpcyBrZXB0IGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LlxuICAgIGlmICghYWNjZXB0c0NvbW1lbnRzICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhpcyBhZ2VudCByZWFkcyBpdCBhcyBzdHJpY3QgSlNPTiwgY29tbWVudHMgYW5kIGFsbC5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oZXhpc3RpbmdDb250ZW50LCBmYWxzZSk7XG4gICAgICBpZiAoIXBhcnNlZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBhIHN0cmljdCBKU09OIG9iamVjdCAoYSB0cmFpbGluZyBjb21tYSwgZm9yIGV4YW1wbGUsIGlzIG5vdCBhbGxvd2VkKS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nU2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBtZXJnZShleGlzdGluZ1NldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gIC8vIE9ubHkgdGhlIHByb3BlcnRpZXMgd2hvc2UgdmFsdWUgY2hhbmdlcyBhcmUgcmV3cml0dGVuLCBzbyB0aGUgZmlsZSBrZWVwcyBpdHMgb3duIGZvcm1hdHRpbmdcbiAgLy8gYW5kLCB3aGVyZSB0aGUgYWdlbnQgYWxsb3dzIHRoZW0sIGl0cyBjb21tZW50cy5cbiAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKGV4aXN0aW5nQ29udGVudCwgc2V0dGluZ3MpO1xuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICAgIC8vIC52c2NvZGUvc2V0dGluZ3MuanNvbiBpcyBKU09OQyBieSBkZWZpbml0aW9uOyBKU09OLnBhcnNlIHdvdWxkIG1ha2Ugd2JmeSBzaWxlbnRseSBza2lwXG4gICAgLy8gY29tbWVudGVkIGZpbGVzLlxuICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShwYXJzZWRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICBsZXQgc2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICB9XG4gICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHNldHRpbmdzLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuaW50ZXJmYWNlIEZub3hUb21sU3VidHJlZSB7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLy8gVGhlIGZvdXIgc3RhbmRhcmQgV0JfRU5WIG1vZGVzOyBzdGFnaW5nIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGNvbXBsZXRlZCB3aGVuIHRoZSByZXBvc2l0b3J5XG4vLyBhbHJlYWR5IGRlY2xhcmVzIHRoZSBzdGFnaW5nIHByb2ZpbGUuXG5jb25zdCB3YkVudk1vZGVzID0gWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddIGFzIGNvbnN0O1xudHlwZSBXYkVudk1vZGUgPSAodHlwZW9mIHdiRW52TW9kZXMpW251bWJlcl07XG5cbi8qKlxuICogRW5zdXJlcyBhIGZub3ggcmVwb3NpdG9yeSBkZWZpbmVzIFdCX0VOViBmb3IgZXZlcnkgc3RhbmRhcmQgbW9kZSAoYW5kIE5FWFRfUFVCTElDX1dCX0VOViB3aGVuXG4gKiBhbnkgd29ya3NwYWNlIGRlcGVuZHMgb24gTmV4dC5qcyBvciB2aW5leHQpIGluIGZub3gudG9tbCBwcm9maWxlcy4gRXhpc3RpbmcgZGVmaW5pdGlvbnMgYXJlXG4gKiBhbHdheXMgbGVmdCB1bnRvdWNoZWQuIE5vbi1mbm94IHJlcG9zaXRvcmllcyBhcmUgc2tpcHBlZDogLmVudiBmaWxlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2Vuc3VyZVdiRW52RGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVlZHNOZXh0UHVibGljID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZykpO1xuICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAvLyBsc3RhdCwgbm90IGV4aXN0c1N5bmM6IGV4aXN0c1N5bmMgaXMgZmFsc2UgZm9yIGEgREFOR0xJTkcgZm5veC50b21sIHN5bWxpbms7IGFueSBmbm94LnRvbWxcbiAgICAvLyBkaXJlY3RvcnkgZW50cnkgbWFya3MgYSBmbm94IHJlcG9zaXRvcnksIGFuZCBhIHJlZnVzZWQvZGFuZ2xpbmcgb25lIGFib3J0cyBpbnN0ZWFkIG9mXG4gICAgLy8gYmVpbmcgdHJlYXRlZCBhcyBhIG5vbi1mbm94IHJlcG9zaXRvcnkgd2hpbGUgdGhlIGZub3ggc3luY2hyb25pemF0aW9uIGlzIGZhaWxpbmcuXG4gICAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZm5veFRvbWxQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZm5veFRvbWxQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50LCBuZWVkc05leHRQdWJsaWMpO1xuICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWlycm9ycyB3YidzIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52IGNvbnRyYWN0IChwYWNrYWdlcy93Yi9zcmMvcHJvamVjdC50cyk6IHRoZSBmcmFtZXdvcmsgbWF5XG4gKiBiZSBkZWNsYXJlZCBpbiBBTlkgb2YgdGhlIGZvdXIgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBgbmV4dGAgYXMgYSBkZXZEZXBlbmRlbmN5IGluIGEgc2hhcmVkXG4gKiBjb21wb25lbnQgbGlicmFyeSksIHdoaWxlIHdiZnkncyBgZGVwZW5kaW5nLm5leHRgIGxvb2tzIG9ubHkgYXQgcmVndWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXS5zb21lKChzZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gY29uZmlnLnBhY2thZ2VKc29uPy5bc2VjdGlvbiBhcyAnZGVwZW5kZW5jaWVzJ107XG4gICAgcmV0dXJuICEhZGVwZW5kZW5jaWVzPy5bJ25leHQnXSB8fCAhIWRlcGVuZGVuY2llcz8uWyd2aW5leHQnXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBtaXNzaW5nIFdCX0VOViAoYW5kIG9wdGlvbmFsbHkgTkVYVF9QVUJMSUNfV0JfRU5WKSBlbnRyaWVzIGludG8gYSBmbm94LnRvbWw6IHRoZSBiYXNlXG4gKiBgW3NlY3JldHNdYCB0YWJsZSBjYXJyaWVzIHRoZSBkZXZlbG9wbWVudCBkZWZhdWx0cyBhbmQgYFtwcm9maWxlcy48bW9kZT4uc2VjcmV0c11gIG92ZXJsYXlzXG4gKiBlYWNoIG90aGVyIG1vZGUsIG1hdGNoaW5nIHRoZSBvcmctc3RhbmRhcmQgbGF5b3V0LiBGb3JtYXR0aW5nIGFuZCBjb21tZW50cyBhcmUgcHJlc2VydmVkOyBvbmx5XG4gKiBtaXNzaW5nIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBtaXNzaW5nIHNlY3Rpb25zIGFwcGVuZGVkLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjb250ZW50XG4gKiBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZCAodW5wYXJzYWJsZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVkaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudDogc3RyaW5nLCBuZWVkc05leHRQdWJsaWM6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2V0dGluZ3M6IEZub3hUb21sU3VidHJlZTtcbiAgdHJ5IHtcbiAgICBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSBpdCBpcyBub3QgcGFyc2FibGUgYXMgVE9NTC4nKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qga2V5TmFtZXMgPSBuZWVkc05leHRQdWJsaWMgPyBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSA6IFsnV0JfRU5WJ107XG4gIGxldCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgLy8gVGhlIHN0YWdpbmcgbW9kZSBpcyBvcHRpb25hbDogY29tcGxldGUgaXQgb25seSB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgZGVjbGFyZXMgdGhlIHByb2ZpbGUuXG4gICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHNldHRpbmdzLnNlY3JldHMgOiBzZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBrZXlOYW1lcykge1xuICAgICAgY29uc3QgZGVmaW5lZCA9IGRlZmluZWRLZXlzPy5ba2V5TmFtZV07XG4gICAgICBjb25zdCBkZWZpbmVkVmFsdWUgPVxuICAgICAgICB0eXBlb2YgZGVmaW5lZCA9PT0gJ3N0cmluZycgPyBkZWZpbmVkIDogKGRlZmluZWQgYXMgeyBkZWZhdWx0PzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZGVmYXVsdDtcbiAgICAgIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWUsIGRlZmluZWRWYWx1ZSwgbW9kZSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdMaW5lcyA9IGtleU5hbWVzXG4gICAgICAuZmlsdGVyKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfSA9IHsgZGVmYXVsdCA9IFwiJHttb2RlfVwiIH1gKTtcbiAgICBpZiAobWlzc2luZ0xpbmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRJbnRvRm5veFNlY3Rpb24oXG4gICAgICB1cGRhdGVkQ29udGVudCxcbiAgICAgIG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyAnc2VjcmV0cycgOiBgcHJvZmlsZXMuJHttb2RlfS5zZWNyZXRzYCxcbiAgICAgIG1pc3NpbmdMaW5lc1xuICAgICk7XG4gIH1cbiAgaWYgKHVwZGF0ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm4gY29udGVudDtcblxuICAvLyBSZS1wYXJzZSBiZWZvcmUgcmV0dXJuaW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cyB3aXRob3V0IGEgdGFibGUgaGVhZGVyKSBjb3VsZFxuICAvLyBtYWtlIHRoZSB0ZXh0dWFsIGVkaXQgcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZTsgZmFpbCBzYWZlbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKHVwZGF0ZWRDb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHVwZGF0ZWRTZXR0aW5ncy5zZWNyZXRzIDogdXBkYXRlZFNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgICBpZiAoa2V5TmFtZXMuc29tZSgoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnNlcnRlZCAke21vZGV9IGVudHJpZXMgZGlkIG5vdCB0YWtlIGVmZmVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQ29udGVudDtcbn1cblxuLyoqXG4gKiBXYXJucyB3aGVuIGFuIGV4aXN0aW5nIFdCX0VOVi1mYW1pbHkgZGVmaW5pdGlvbiBuYW1lcyBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9uZSBpdCBpc1xuICogZGVmaW5lZCBmb3IgKGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCBvciBgcHJvZHVjdGlvbjFgLCBvciBhIGNvcHktcGFzdGVkIHdyb25nIG1vZGUpOiB3YlxuICogcmVqZWN0cyBub24tc3RhbmRhcmQgdmFsdWVzIGF0IHJ1bnRpbWUsIHNvIHN1cmZhY2luZyB0aGUgbWlzbWF0Y2ggZHVyaW5nIHdiZnkgaXMgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBzaWduYWwuIFRoZSBwYXNzZWQgdmFsdWUgaXMgYWx3YXlzIHBsYWludGV4dCAoYSBmbm94IGBkZWZhdWx0YCBmaWVsZCkg4oCUIGVuY3J5cHRlZFxuICogZm5veCBlbnRyaWVzIGFyZSBgeyBwcm92aWRlciwgdmFsdWUgfWAgb2JqZWN0cyB3aG9zZSBgZGVmYXVsdGAgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBtb2RlOiBXYkVudk1vZGUpOiB2b2lkIHtcbiAgLy8gQW4gRU1QVFkgdmFsdWUgY291bnRzIGFzIHVuc2V0ICh3YiBzdXBwbGllcyB0aGUgZmFsbGJhY2sgbW9kZSksIG5vdCBhcyBhIG1pc21hdGNoaW5nIG1vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAvLyBBIGR5bmFtaWMgdmFsdWUgKGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOVj0ke1dCX0VOVn1gKSBtYXkgbGVnaXRpbWF0ZWx5IHJlc29sdmUgdG8gdGhlIG1vZGVcbiAgLy8gdGhyb3VnaCBleHBhbnNpb24sIHdoaWNoIHRoaXMgc3RhdGljIGNoZWNrIGNhbm5vdCBldmFsdWF0ZSDigJQgc2tpcCBpbnN0ZWFkIG9mIG1pc2ZpcmluZy5cbiAgLy8gZm5veCBleHBhbmRzIG9ubHkgYCR7Li4ufWAgKGEgYmFyZSBgJFVOU0VUYCBzdGF5cyBsaXRlcmFsKS5cbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCckeycpKSByZXR1cm47XG4gIGlmIChrZXlOYW1lID09PSAnTkVYVF9QVUJMSUNfV0JfRU5WJykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2Igb3ZlcnJpZGVzIGl0IHdpdGggV0JfRU5WLCBidXQgYSBkaXJlY3QgZnJhbWV3b3JrIGJ1aWxkIHdvdWxkIGlubGluZSB0aGlzIHZhbHVlLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiByZWplY3RzIHZhbHVlcyBvdXRzaWRlIGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGxpbmVzIGF0IHRoZSB0b3Agb2YgYSBUT01MIHNlY3Rpb24sIHJpZ2h0IGFmdGVyIGl0cyBgW2hlYWRlcl1gIGxpbmUgc28gcHJvZmlsZS1zcGVjaWZpY1xuICogZW50cmllcyBzdGF5IGdyb3VwZWQgd2l0aCB0aGVpciBoZWFkZXI7IHRoZSBzZWN0aW9uIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgd2hlbiBpdCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEludG9Gbm94U2VjdGlvbihjb250ZW50OiBzdHJpbmcsIHNlY3Rpb25OYW1lOiBzdHJpbmcsIGluc2VydGVkTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gd2JmeSB3cml0ZXMgdGhlIGhlYWRlciB3aXRob3V0IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkb3R0ZWQta2V5IGNvbXBvbmVudHMuXG4gIGNvbnN0IGhlYWRlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXlxccypcXFske3NlY3Rpb25OYW1lLnJlcGxhY2VBbGwoJy4nLCBTdHJpbmcucmF3YFxcLmApfVxcXVxccyooPzojLiopPyRgLCAndScpO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gaGVhZGVyUGF0dGVybi50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bJHtzZWN0aW9uTmFtZX1dXFxuJHtpbnNlcnRlZExpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCArIDEpLCAuLi5pbnNlcnRlZExpbmVzLCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEpXS5qb2luKCdcXG4nKTtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLyoqXG4gKiBSZXBvc2l0b3JpZXMgb3V0c2lkZSBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZVxuICogd29ya2Zsb3dzOiB0aG9zZSB3b3JrZmxvd3MgZGVwZW5kIG9uIG9yZ2FuaXphdGlvbiBzZWNyZXRzIChWRVJEQUNDSU9fVE9LRU4sIERpc2NvcmQgd2ViaG9va3MpXG4gKiBhbmQgc2VsZi1ob3N0ZWQgcnVubmVycyB0aGF0IG90aGVyIG93bmVycyBkbyBub3QgaGF2ZS4gVGhpcyBnZW5lcmF0b3IgaW5zdGVhZCBlbWl0c1xuICogc2VsZi1jb250YWluZWQgd29ya2Zsb3dzIGJ1aWx0IG9ubHkgZnJvbSB3aGF0IGFueSByZXBvc2l0b3J5IG93bmVyIGNhbiBwcm92aWRlOiB0aGUgcmVwb3NpdG9yeVxuICogY29udGVudHMgKG1pc2UudG9tbCwgcGFja2FnZS5qc29uIHNjcmlwdHMpIGFuZCB0aGUgc2luZ2xlIGBGTk9YX0FHRV9LRVlgIHJlcG9zaXRvcnkgc2VjcmV0IHdoZW5cbiAqIHRoZSByZXBvc2l0b3J5IHVzZXMgZm5veC4gR2VuZXJhdGlvbiBpcyBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXInc1xuICogaWRlbnRpdHksIHNvIGl0IHdvcmtzIGZvciBhcmJpdHJhcnkgcGVyc29uYWwgcmVwb3NpdG9yaWVzLlxuICovXG5cbi8qKiBGaXJzdCBsaW5lIG9mIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlOyBmaWxlcyB3aXRob3V0IGl0IGFyZSBoYW5kLXdyaXR0ZW4gYW5kIG5ldmVyIHRvdWNoZWQuICovXG5leHBvcnQgY29uc3Qgc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnkuJztcblxuLy8gU2FtZSBwaW5zIGFzIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MgLyB0aGVpciBjb25zdW1lcnM7IFJlbm92YXRlIHVwZGF0ZXMgdGhlbSBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkuXG5jb25zdCBjaGVja291dEFjdGlvbiA9ICdhY3Rpb25zL2NoZWNrb3V0QHY3LjAuMSc7XG5jb25zdCBtaXNlQWN0aW9uID0gJ2pkeC9taXNlLWFjdGlvbkB2NC4yLjMnO1xuY29uc3QgY2FjaGVBY3Rpb24gPSAnYWN0aW9ucy9jYWNoZUB2Ni4xLjAnO1xuY29uc3QgdXBsb2FkQXJ0aWZhY3RBY3Rpb24gPSAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjcuMC4xJztcbi8vIHY2LjEuMTsgdGhlIHNhbWUgcGluIGFzIHRoZSByZXVzYWJsZSBzZW1hbnRpYy1wciB3b3JrZmxvdy5cbmNvbnN0IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24gPSAnYW1hbm5uL2FjdGlvbi1zZW1hbnRpYy1wdWxsLXJlcXVlc3RANDViOWVkN2NmMjQwODdhMmY3Nzg1YmY1NWJlOTczOTRiYTg3ZTFjMic7XG4vLyB2My4wLjM7IGRlcGxveXMgYXJlIG5ldHdvcmstaGVhdnkgYW5kIGJlbmVmaXQgZnJvbSByZXRyaWVzIHdpdGggYSBsb25nIHRpbWVvdXQuXG5jb25zdCByZXRyeUFjdGlvbiA9ICduaWNrLWZpZWxkcy9yZXRyeUBkZDU2ZjFjYThjYTk5MWUyMzg1YzE4YWI2ZGQzNmVhN2Y5ZmRiNTVmJztcblxuLyoqXG4gKiBKb2ItbGV2ZWwgZW52IHRoYXQgdHVybnMgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHBhdGggb24sIG1pcnJvcmluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzLlxuICpcbiAqIGBzZWNyZXRzYCBpcyB1bmF2YWlsYWJsZSBpbiBhIHN0ZXAtbGV2ZWwgYGlmOmAsIHNvIHRoZSBwcmVzZW5jZSBvZiB0aGUgdG9rZW4gaXMgZXhwb3NlZCBhcyBhXG4gKiBub24tc2VjcmV0IHNpZ25hbDsgYW4gdW5zZXQgc2VjcmV0IGV4cGFuZHMgdG8gYGZhbHNlYCBhbmQgbGVhdmVzIGV2ZXJ5IEd1YXJkIHN0ZXAgc2tpcHBlZCwgd2hpY2hcbiAqIGlzIHdoYXQga2VlcHMgdGhlIGdlbmVyYXRlZCB3b3JrZmxvd3MgcnVubmFibGUgaW4gYSByZXBvc2l0b3J5IHRoYXQgbmV2ZXIgcmVnaXN0ZXJzIHRoZSBzZWNyZXQuXG4gKiBUQUtVTUlfR1VBUkRfVE9LRU4gaXRzZWxmIGlzIGRlZmluZWQtYnV0LUVNUFRZIGpvYi13aWRlIHNvIHRoZSBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2VcbiAqIGluIHRoZSBnZW5lcmF0ZWQgLm5wbXJjIHN0aWxsIGV4cGFuZHMgKHRvICcnKSBpbiB0aGUgc3RlcHMgdGhhdCBkZWxpYmVyYXRlbHkgcnVuIHdpdGhvdXQgdGhlXG4gKiB0b2tlbjsgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkIHZhcmlhYmxlIGlzIHdoYXQgYnJlYWtzIGFuIGluc3RhbGwsIGFuIGVtcHR5IG9uZSBpcyBmaW5lLlxuICovXG5jb25zdCBndWFyZEpvYkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgSEFTX1RBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyAhIXNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyxcbiAgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJyxcbn07XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgbmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICB1c2VzPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gICd3b3JraW5nLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbmN1cnJlbmN5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7ICdydW5zLW9uJzogc3RyaW5nOyBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0ZXBzOiBTdGVwW10gfVxuICA+O1xufVxuXG5jb25zdCBkZXBsb3lUcmlnZ2VyU2NoZW1hID0gei5vYmplY3Qoe1xuICBvbjogelxuICAgIC5vYmplY3Qoe1xuICAgICAgcHVzaDogelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICBwYXRoczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgICAgICdwYXRocy1pZ25vcmUnOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtyb290Q29uZmlnXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB1c2VzRm5veCA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICBjb25zdCB3b3JrZmxvd0J5RmlsZU5hbWU6IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PiA9IHtcbiAgICAgICd0ZXN0LnltbCc6IGJ1aWxkVGVzdFdvcmtmbG93KHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzLCB1c2VzRm5veCksXG4gICAgICAnc2VtYW50aWMtcHIueW1sJzogYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKSxcbiAgICB9O1xuICAgIC8vIERlcGxveSB3b3JrZmxvd3MgYXJlIGdlbmVyYXRlZCBwZXIgZGVwbG95IHNjcmlwdCB0aGUgcmVwb3NpdG9yeSBkZWNsYXJlcywgc28gYSByZXBvc2l0b3J5XG4gICAgLy8gd2l0aG91dCBhIHN0YWdpbmcgZW52aXJvbm1lbnQgc2ltcGx5IGdldHMgbm8gc3RhZ2luZyB3b3JrZmxvdy4gT25seSBzY3JpcHRzIHRoYXQgaW52b2tlXG4gICAgLy8gYHdiIGRlcGxveWAgcXVhbGlmeTogYSBiZXNwb2tlIGRlcGxveSBzY3JpcHQgbWF5IG5vdCBiZSBzYWZlIHRvIHRyaWdnZXIgYXV0b21hdGljYWxseVxuICAgIC8vIChkZXBsb3ktc3RhZ2luZyBydW5zIG9uIGV2ZXJ5IHB1c2ggdG8gdGhlIGRlZmF1bHQgYnJhbmNoKS5cbiAgICBjb25zdCBzY3JpcHRzID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPSBpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveSddKTtcbiAgICBpZiAoaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93KSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1wcm9kdWN0aW9uLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygncHJvZHVjdGlvbicsICdkZXBsb3knLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveTpzdGFnaW5nJ10pKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1zdGFnaW5nLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygnc3RhZ2luZycsICdkZXBsb3k6c3RhZ2luZycsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSAmJiByb290Q29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydyZWxlYXNlLnltbCddID0gYnVpbGRSZWxlYXNlV29ya2Zsb3cocm9vdENvbmZpZywgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93LCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGF3YWl0IHJ1bkFsbEluUG9vbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93QnlGaWxlTmFtZSkubWFwKFxuICAgICAgICAoW2ZpbGVOYW1lLCB3b3JrZmxvd10pID0+XG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksIHdvcmtmbG93KVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhmaWxlUGF0aDogc3RyaW5nLCB3b3JrZmxvdzogV29ya2Zsb3cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgLy8gVW5saWtlIFdpbGxCb29zdGVyLW9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMsIHdiZnkgZG9lcyBub3Qgb3duIGFyYml0cmFyeSByZXBvc2l0b3JpZXMnIENJOlxuICAvLyBvbmx5IGZpbGVzIGl0IGdlbmVyYXRlZCAoaWRlbnRpZmllZCBieSB0aGUgbWFya2VyKSBhcmUgcmVnZW5lcmF0ZWQsIGFuZCBoYW5kLXdyaXR0ZW5cbiAgLy8gd29ya2Zsb3dzIGFyZSBuZXZlciB0b3VjaGVkLiBPd25lcnMgb3B0IG91dCBwZXJtYW5lbnRseSBieSByZW1vdmluZyB0aGUgbWFya2VyIGxpbmUuXG4gIC8vIEFuIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBmaWxlIGNhcnJpZXMgbm8gaGFuZC13cml0dGVuIGNvbnRlbnQsIHNvIGl0IGlzIHRyZWF0ZWQgYXMgYWJzZW50LlxuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG9sZENvbnRlbnQudHJpbSgpICE9PSAnJyAmJiAhb2xkQ29udGVudC5zdGFydHNXaXRoKHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0aC5iYXNlbmFtZShmaWxlUGF0aCkuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgd29ya2Zsb3cub24ucHVzaCAmJiBvbGRDb250ZW50Py50cmltKCkpIHtcbiAgICBjb25zdCBleGlzdGluZ1B1c2ggPSBkZXBsb3lUcmlnZ2VyU2NoZW1hLnBhcnNlKHlhbWwubG9hZChvbGRDb250ZW50KSkub24/LnB1c2g7XG4gICAgd29ya2Zsb3cub24ucHVzaCA9IHtcbiAgICAgIC4uLnoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5wYXJzZSh3b3JrZmxvdy5vbi5wdXNoKSxcbiAgICAgIHBhdGhzOiBleGlzdGluZ1B1c2g/LnBhdGhzLFxuICAgICAgJ3BhdGhzLWlnbm9yZSc6IGV4aXN0aW5nUHVzaD8uWydwYXRocy1pZ25vcmUnXSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gYCR7c2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyfSBSZW1vdmUgdGhpcyBsaW5lIHRvIHN0b3Agd2JmeSBmcm9tIG92ZXJ3cml0aW5nIHRoaXMgZmlsZS5cXG5gO1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcCh3b3JrZmxvdywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIGhlYWRlciArIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gd29ya2luZ0RpcihkaXJQYXRoOiBzdHJpbmcpOiBQaWNrPFN0ZXAsICd3b3JraW5nLWRpcmVjdG9yeSc+IHtcbiAgcmV0dXJuIGRpclBhdGggPyB7ICd3b3JraW5nLWRpcmVjdG9yeSc6IGRpclBhdGggfSA6IHt9O1xufVxuXG5mdW5jdGlvbiBpc1diRGVwbG95U2NyaXB0KHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiIGRlcGxveVxcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZXN0V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgLy8gUGxheXdyaWdodCBtYXkgYmUgZGVjbGFyZWQgb25seSBpbiB3b3Jrc3BhY2UgcGFja2FnZXM7IGB3YiB0ZXN0LW9uLWNpYCBydW5zIGV2ZXJ5IGRlY2xhcmluZ1xuICAvLyBwYWNrYWdlJ3MgZTJlIHRlc3RzLCBzbyB0aGUgd29ya2Zsb3cgbXVzdCBpbnN0YWxsIGJyb3dzZXJzIGZvciBlYWNoIG9mIHRoZW0gKHRoZWlyIHZlcnNpb25zXG4gIC8vIG1heSBkaWZmZXIsIGFuZCBlYWNoIGxpYnJhcnkgdmVyc2lvbiByZXF1aXJlcyBpdHMgbWF0Y2hpbmcgYnJvd3NlciBiaW5hcmllcykuIEJ1bidzIGlzb2xhdGVkXG4gIC8vIGxpbmtlciByZXNvbHZlcyB0aGUgcGxheXdyaWdodCBiaW5hcnkgb25seSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSwgaGVuY2UgdGhlXG4gIC8vIHdvcmtpbmctZGlyZWN0b3J5IG9uIGV2ZXJ5IHN0ZXAuIFRoZSBicm93c2VycyBsYW5kIGluIH4vLmNhY2hlL21zLXBsYXl3cmlnaHQsIHNoYXJlZCBhY3Jvc3NcbiAgLy8gd29ya3NwYWNlcywgc28gc2FtZS12ZXJzaW9uIGluc3RhbGxzIG5hdHVyYWxseSBkZWR1cGxpY2F0ZS5cbiAgY29uc3QgcGxheXdyaWdodERpclBhdGhzID0gWy4uLmFsbFBhY2thZ2VDb25maWdzXVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5kaXJQYXRoLmxvY2FsZUNvbXBhcmUoYi5kaXJQYXRoKSlcbiAgICAuZmlsdGVyKChwYWNrYWdlQ29uZmlnKSA9PiBwYWNrYWdlQ29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdClcbiAgICAubWFwKChwYWNrYWdlQ29uZmlnKSA9PiBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlQ29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgLy8gU3RlcC1zY29wZWQgbGlrZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdzogZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyBydW4gYnkgYGJ1biBpbnN0YWxsYFxuICAvLyBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICBjb25zdCBmbm94RW52OiBQaWNrPFN0ZXAsICdlbnYnPiA9IHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fTtcblxuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24gfSxcbiAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAuLi5idWlsZEluc3RhbGxTdGVwcyh0cnVlKSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gKFtcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoLCBpbmRleCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBHZXQgUGxheXdyaWdodCB2ZXJzaW9uJHtkaXJQYXRoID8gYCAoJHtkaXJQYXRofSlgIDogJyd9YCxcbiAgICAgICAgICAgIC8vIFRoZSBJTlNUQUxMRUQgdmVyc2lvbiwgbm90IHRoZSBwYWNrYWdlLmpzb24gc3BlY2lmaWVyOiBhIHJhbmdlIGxpa2UgYF4xLjQ1LjBgXG4gICAgICAgICAgICAvLyBzdGF5cyB1bmNoYW5nZWQgYWNyb3NzIGxvY2tmaWxlIHVwZGF0ZXMsIHNvIGtleWluZyB0aGUgY2FjaGUgb24gaXQgd291bGQgcmVzdG9yZVxuICAgICAgICAgICAgLy8gc3RhbGUgYnJvd3NlcnMgdGhhdCBubyBsb25nZXIgbWF0Y2ggdGhlIGxpYnJhcnkuIFJ1bnMgYWZ0ZXIgYGJ1biBpbnN0YWxsYCwgc28gdGhlXG4gICAgICAgICAgICAvLyBwYWNrYWdlIGlzIHJlc29sdmFibGUgZnJvbSB0aGUgZGVjbGFyaW5nIHBhY2thZ2UncyBkaXJlY3RvcnkuXG4gICAgICAgICAgICBpZDogYHBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fWAsXG4gICAgICAgICAgICBydW46ICdlY2hvIFwidmVyc2lvbj0kKGJ1biAtZSBcInRyeSB7IGNvbnNvbGUubG9nKHJlcXVpcmUoXFwnQHBsYXl3cmlnaHQvdGVzdC9wYWNrYWdlLmpzb25cXCcpLnZlcnNpb24pIH0gY2F0Y2gge31cIilcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0NhY2hlIFBsYXl3cmlnaHQgYnJvd3NlcnMnLFxuICAgICAgICAgICAgaWQ6ICdwbGF5d3JpZ2h0LWNhY2hlJyxcbiAgICAgICAgICAgIHVzZXM6IGNhY2hlQWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBwYXRoOiAnfi8uY2FjaGUvbXMtcGxheXdyaWdodCcsXG4gICAgICAgICAgICAgIGtleTogYHBsYXl3cmlnaHQtXFwke3sgcnVubmVyLm9zIH19LSR7cGxheXdyaWdodERpclBhdGhzXG4gICAgICAgICAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IGBcXCR7eyBzdGVwcy5wbGF5d3JpZ2h0LXZlcnNpb24tJHtpbmRleH0ub3V0cHV0cy52ZXJzaW9uIH19YClcbiAgICAgICAgICAgICAgICAuam9pbignLScpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGJyb3dzZXJzIHN0aWxsIG5lZWQgdGhlaXIgc3lzdGVtIGRlcGVuZGVuY2llcyBvbiBhIGZyZXNoIHJ1bm5lci5cbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF0gc2F0aXNmaWVzIFN0ZXBbXSlcbiAgICAgIDogW10pLFxuICAgIC4uLihoYXNUeXBlY2hlY2sgPyBbeyBydW46ICdidW4gcnVuIHR5cGVjaGVjaycsIC4uLmZub3hFbnYgfV0gOiBbXSksXG4gICAgeyBydW46ICdidW4gcnVuIGxpbnQnLCAuLi5mbm94RW52IH0sXG4gICAge1xuICAgICAgbmFtZTogJ1Rlc3QnLFxuICAgICAgaWQ6ICd0ZXN0JyxcbiAgICAgIHJ1bjogYGlmIFtbIFwiJFVQTE9BRF9URVNUX0xPR1wiICE9IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGV4ZWMgYnVuIHJ1biB0ZXN0L2NpXG5maVxubG9nX2Rpcj0kKG1rdGVtcCAtZCBcIiRSVU5ORVJfVEVNUC90ZXN0LW91dHB1dC5YWFhYWFhcIilcbmVjaG8gXCJsb2dfcGF0aD0kbG9nX2Rpci90ZXN0LmxvZ1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxuIyBLZWVwIGRyYWluaW5nIHRlc3Qgb3V0cHV0IHdoZW4gdGhlIGxvZyByZWFjaGVzIGEgZmlsZS1zaXplIGxpbWl0Llxuc2V0ICtlXG5idW4gcnVuIHRlc3QvY2kgMj4mMSB8ICh0cmFwICcnIFhGU1o7IHRlZSBcIiRsb2dfZGlyL3Rlc3QubG9nXCIpXG50ZXN0X3N0YXR1cz0oXCJcXCR7UElQRVNUQVRVU1tAXX1cIilcbmlmICgoIHRlc3Rfc3RhdHVzWzBdICE9IDAgKSk7IHRoZW4gZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1swXX1cIjsgZmlcbmV4aXQgXCJcXCR7dGVzdF9zdGF0dXNbMV19XCJgLFxuICAgICAgZW52OiB7IC4uLmZub3hFbnYuZW52LCBVUExPQURfVEVTVF9MT0c6ICcke3sgdmFycy5VUExPQURfVEVTVF9MT0cgfX0nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgbG9nJyxcbiAgICAgIGlmOiBcIiR7eyBhbHdheXMoKSAmJiB2YXJzLlVQTE9BRF9URVNUX0xPRyA9PSAndHJ1ZScgJiYgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoICE9ICcnIH19XCIsXG4gICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgbmFtZTogJ3Rlc3Qtb3V0cHV0LSR7eyBydW5uZXIub3MgfX0tJHt7IGpvYi5jaGVja19ydW5faWQgfX0tJHt7IGdpdGh1Yi5ydW5fYXR0ZW1wdCB9fScsXG4gICAgICAgIHBhdGg6ICcke3sgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoIH19JyxcbiAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdlcnJvcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgLi4uKHBsYXl3cmlnaHREaXJQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgcmVzdWx0cycsXG4gICAgICAgICAgICBpZjogJyR7eyBhbHdheXMoKSB9fScsXG4gICAgICAgICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Rlc3QtcmVzdWx0cycsXG4gICAgICAgICAgICAgIC8vIEV2ZXJ5IGRlY2xhcmluZyBwYWNrYWdlIHdyaXRlcyBpdHMgb3duIHRlc3QtcmVzdWx0cyBkaXJlY3Rvcnk7IGEgbmV3bGluZS1zZXBhcmF0ZWRcbiAgICAgICAgICAgICAgLy8gbGlzdCB1cGxvYWRzIHRoZW0gYWxsLlxuICAgICAgICAgICAgICBwYXRoOiBwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChkaXJQYXRoKSA9PiAoZGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAndGVzdC1yZXN1bHRzJykgOiAndGVzdC1yZXN1bHRzJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAnaWYtbm8tZmlsZXMtZm91bmQnOiAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIDogW10pLFxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgRk9SQ0VfQ09MT1I6ICczJywgV0JfRU5WOiAndGVzdCcsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZERlcGxveVdvcmtmbG93KGVudmlyb25tZW50OiAnc3RhZ2luZycgfCAncHJvZHVjdGlvbicsIHNjcmlwdE5hbWU6IHN0cmluZywgdXNlc0Zub3g6IGJvb2xlYW4pOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogYERlcGxveSBhcHAgb24gJHtlbnZpcm9ubWVudH1gLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICAgIC8vIFByb2R1Y3Rpb24gZGVwbG95cyBmb2xsb3cgcHVibGlzaGVkIHJlbGVhc2VzIChzZWUgdGhlIHJlbGVhc2Ugd29ya2Zsb3cncyB0cmlnZ2VyIHN0ZXApO1xuICAgICAgLy8gc3RhZ2luZyBjb252ZXJnZXMgb24gZXZlcnkgZGVmYXVsdC1icmFuY2ggcHVzaC5cbiAgICAgIC4uLihlbnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgID8geyByZWxlYXNlOiB7IHR5cGVzOiBbJ3B1Ymxpc2hlZCddIH0gfVxuICAgICAgICA6IHsgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10sICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSB9IH0pLFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogJ3JlYWQnIH0sXG4gICAgam9iczoge1xuICAgICAgZGVwbG95OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgV0JfRU5WOiBlbnZpcm9ubWVudCwgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwIHNvIGBnaXQgZGVzY3JpYmVgIHNlZXMgdGhlIHRhZ3MgV0JfVkVSU0lPTiBpcyBkZXJpdmVkIGZyb20uXG4gICAgICAgICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiwgd2l0aDogeyAnZmV0Y2gtZGVwdGgnOiAwIH0gfSxcbiAgICAgICAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnU2V0IFdCX1ZFUlNJT04nLFxuICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5XQl9WRVJTSU9OPSQoZ2l0IGRlc2NyaWJlIC0tYWx3YXlzIC0tdGFncylcXG5lY2hvIFwiV0JfVkVSU0lPTj0kV0JfVkVSU0lPTlwiID4+IFwiJEdJVEhVQl9FTlZcIicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5idWlsZEluc3RhbGxTdGVwcyhmYWxzZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0RlcGxveScsXG4gICAgICAgICAgICB1c2VzOiByZXRyeUFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgdGltZW91dF9taW51dGVzOiA2MCxcbiAgICAgICAgICAgICAgbWF4X2F0dGVtcHRzOiA1LFxuICAgICAgICAgICAgICBjb21tYW5kOiBgYnVuIHJ1biAke3NjcmlwdE5hbWV9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieVxuICAgICAgICAgICAgLy8gYGJ1biBpbnN0YWxsYCBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICAgICAgICAgICAgLi4uKHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZWxlYXNlV29ya2Zsb3coXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93OiBib29sZWFuLFxuICB1c2VzRm5veDogYm9vbGVhblxuKTogV29ya2Zsb3cge1xuICBjb25zdCBmbm94RW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gdXNlc0Zub3ggPyB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSA6IHt9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDogeyBicmFuY2hlczogWy4uLmNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGRpc3BhdGNoaW5nIHRoZSBwcm9kdWN0aW9uIGRlcGxveSB3b3JrZmxvdyBhZnRlciBhIHJlbGVhc2VcbiAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPyB7IGFjdGlvbnM6ICd3cml0ZScgfSA6IHt9KSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIC8vIFJlbGVhc2VzIGJ1aWxkIHByb2R1Y3Rpb24gYXJ0aWZhY3RzLCBoZW5jZSB0aGUgZW52aXJvbm1lbnQg4oCUIHRoZSBzYW1lIGRlZmF1bHQgYXMgdGhlXG4gICAgICAgIC8vIHJldXNhYmxlIHJlbGVhc2Ugd29ya2Zsb3cuIHdiJ3MgQ0kgZ3VhcmQgYWxzbyByZXF1aXJlcyBhbiBleHBvcnRlZCBXQl9FTlYsIHNvIHdpdGhvdXRcbiAgICAgICAgLy8gaXQgYSBgcG9zdGluc3RhbGxgIHRoYXQgY2FsbHMgd2IgKGUuZy4gYHdiIGdlbi1jb2RlYCkgZXhpdHMgMSBiZWZvcmUgc2VtYW50aWMtcmVsZWFzZVxuICAgICAgICAvLyBydW5zLlxuICAgICAgICBlbnY6IHsgV0JfRU5WOiAncHJvZHVjdGlvbicsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgLy8gZmV0Y2gtZGVwdGggMDogc2VtYW50aWMtcmVsZWFzZSByZWFkcyB0aGUgZnVsbCBoaXN0b3J5IHRvIGNvbXB1dGUgdGhlIG5leHQgdmVyc2lvbi5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93XG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnR2V0IGN1cnJlbnQgbGF0ZXN0IHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3ByZS1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmVjaG8gXCJ0YWc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgICAgICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlIGNoZWNrcyBOb2RlLmpzIHJ1bnRpbWUgcmVxdWlyZW1lbnRzOyBgYnVuIDxiaW4+YCByZXNwZWN0cyBpdHNcbiAgICAgICAgICAgIC8vIGAjIS91c3IvYmluL2VudiBub2RlYCBzaGViYW5nLCBzbyBpdCBzdGlsbCBydW5zIHVuZGVyIHJlYWwgTm9kZS5cbiAgICAgICAgICAgIHJ1bjogJ2J1biBzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgICAgICAgICAgICBMRUZUSE9PSzogJzAnLFxuICAgICAgICAgICAgICAuLi5mbm94RW52LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQ2hlY2sgZm9yIG5ldyByZWxlYXNlIHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3Bvc3QtcmVsZWFzZS10YWcnLFxuICAgICAgICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5naXQgZmV0Y2ggLS10YWdzIC0tZm9yY2VcXG5ORVdfVEFHPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0wIDI+L2Rldi9udWxsIHx8IGVjaG8gXFwnXFwnKVxcbmVjaG8gXCJ0YWc9JE5FV19UQUdcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5pZiBbWyAtbiBcIiRORVdfVEFHXCIgJiYgXCIkTkVXX1RBR1wiICE9IFwiJHt7IHN0ZXBzLnByZS1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiIF1dOyB0aGVuXFxuICBlY2hvIFwiY3JlYXRlZD10cnVlXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXFxuZmknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWY6IFwic3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLmNyZWF0ZWQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnVHJpZ2dlciBwcm9kdWN0aW9uIGRlcGxveScsXG4gICAgICAgICAgICAgICAgICAvLyBBIEdJVEhVQl9UT0tFTi1jcmVhdGVkIHJlbGVhc2UgZG9lcyBub3QgZmlyZSB0aGUgZGVwbG95IHdvcmtmbG93J3NcbiAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UtcHVibGlzaGVkIHRyaWdnZXIsIHNvIGRpc3BhdGNoIGl0IGV4cGxpY2l0bHkgb24gdGhlIG5ldyB0YWcuXG4gICAgICAgICAgICAgICAgICBydW46ICdnaCB3b3JrZmxvdyBydW4gZGVwbG95LXByb2R1Y3Rpb24ueW1sIC0tcmVmIFwiJHt7IHN0ZXBzLnBvc3QtcmVsZWFzZS10YWcub3V0cHV0cy50YWcgfX1cIicsXG4gICAgICAgICAgICAgICAgICBlbnY6IHsgR0hfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGluc3RhbGwgc2VxdWVuY2UgZXZlcnkgZ2VuZXJhdGVkIHdvcmtmbG93IHNoYXJlczogYGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlYCwgaGFyZGVuZWQgaW50byB0aGVcbiAqIHJldXNhYmxlIHdvcmtmbG93cycgdGhyZWUtc3RlcCBkYW5jZSB3aGVuIHRoZSByZXBvc2l0b3J5IHJlZ2lzdGVycyBhIFRBS1VNSV9HVUFSRF9UT0tFTiBzZWNyZXQuXG4gKlxuICogVGFrdW1pIEd1YXJkIChodHRwczovL2ZsYXR0LnRlY2gvdGFrdW1pL2ZlYXR1cmVzL2d1YXJkKSBpcyBhIHJlZ2lzdHJ5IHByb3h5IHRoYXQgYmxvY2tzXG4gKiBrbm93bi1tYWxpY2lvdXMgcGFja2FnZXMuIFJvdXRpbmcgdGhlIERFRkFVTFQgcmVnaXN0cnkgdGhyb3VnaCBpdCBpcyB3aGF0IHByb3RlY3RzIHRoZSBpbnN0YWxsLFxuICogYW5kIHRoZSB0b2tlbiBhdXRoZW50aWNhdGVzIHRoYXQgcHJveHkg4oCUIHNvIHRoZSB0b2tlbiBoYXMgdG8gYmUgcHJlc2VudCB3aGlsZSBkZXBlbmRlbmNpZXMgYXJlXG4gKiByZXNvbHZlZCwgd2hpY2ggaXMgZXhhY3RseSB3aGVuIGEgY29tcHJvbWlzZWQgZGVwZW5kZW5jeSdzIGxpZmVjeWNsZSBzY3JpcHQgd291bGQgcnVuLiBIZW5jZSB0aGVcbiAqIHNwbGl0OiByZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGAtLWlnbm9yZS1zY3JpcHRzYCBhbmQgdGhlIHRva2VuLCB0aGVuIHJlcGxheSB0aGUgc2tpcHBlZFxuICogbGlmZWN5Y2xlIHNjcmlwdHMgaW4gYSBzZWNvbmQgaW5zdGFsbCB0aGF0IGhhcyBubyB0b2tlbiAoZXZlcnkgcGFja2FnZSBpcyBhbHJlYWR5IGNhY2hlZCwgYW5kXG4gKiBHdWFyZCBzZXJ2ZXMgYW5vbnltb3VzbHkgYW55d2F5KS4gT25seSBidW4gaXMgZ2VuZXJhdGVkIGhlcmUsIGFuZCBidW4gcmVhZHMgLm5wbXJjLCBzbyBub1xuICogcGFja2FnZS1tYW5hZ2VyIGJyYW5jaGluZyBpcyBuZWVkZWQuXG4gKlxuICogVGhlIHNoZWxsIGRldGFpbHMgZGVsaWJlcmF0ZWx5IG1pcnJvciByZXVzYWJsZS13b3JrZmxvd3MnIHByb2R1Y3Rpb24tcHJvdmVuIGluc3RhbGwgc3RlcHM6IGJhcmVcbiAqIGAkUlVOTkVSX1RFTVBgIChzZXQgYnkgdGhlIHJ1bm5lciBhcHBsaWNhdGlvbiBvbiBldmVyeSBydW5uZXIsIGFuZCBgc2V0IC11YCBmYWlscyBsb3VkbHkgaWYgbm90KSxcbiAqIGBbWyAtZSAubnBtcmMgXV1gLCBhbmQgdGhlIHNlY29uZCBgcm0gLXJmIG5vZGVfbW9kdWxlc2AgaW4gdGhlIGZhbGxiYWNrIChhbiBpbnRlcnJ1cHRlZCBsaWZlY3ljbGVcbiAqIHJ1biBtYXkgbGVhdmUgbm9kZV9tb2R1bGVzIGluY29uc2lzdGVudCwgc28gdGhlIHJldHJ5IHN0YXJ0cyBjbGVhbiByYXRoZXIgdGhhbiB0cnVzdGluZyBhIHJlcGFpcikuXG4gKlxuICogYHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZWAgZGVjaWRlcyB3aGF0IGEgZmFpbGluZyBsaWZlY3ljbGUtc2NyaXB0IHJlcGxheSBkb2VzLiBFdmVyeVxuICogcmVwbGF5IHJ1bnMgdG9rZW5sZXNzIGFuZCB3aXRob3V0IEZOT1hfQUdFX0tFWSAodGhlIGtleSBpcyBzY29wZWQgdG8gdGhlIGxhdGVyIERlcGxveS9SZWxlYXNlXG4gKiBzdGVwKSwgc28gYSBwb3N0aW5zdGFsbCB0aGF0IG5lZWRzIGRlY3J5cHRlZCBzZWNyZXRzIGlzIHVuc3VwcG9ydGVkIGluIGFsbCBvZiB0aGVtIGJ5IGRlc2lnbi5cbiAqIFRoZSB0ZXN0IHdvcmtmbG93IHRvbGVyYXRlcyB0aGUgZmFpbHVyZSBiZWNhdXNlIHR5cGVjaGVjay9saW50L3Rlc3QgZmFpbCBsb3VkbHkgb24gYSBkZWdyYWRlZFxuICogdHJlZSBhbnl3YXkuIERlcGxveSBhbmQgcmVsZWFzZSB3b3JrZmxvd3MgbXVzdCBub3Q6IGEgYDo6d2FybmluZzo6YCBkb2VzIG5vdCBmYWlsIHRoZSBqb2IsIHNvXG4gKiB0aGUgZmFsbGJhY2sgd291bGQgc2hpcCBhIHRyZWUgd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgKGUuZy4gYSBgcG9zdGluc3RhbGw6IHdiIGdlbi1jb2RlYClcbiAqIG5ldmVyIHJhbiwgc2lsZW50bHkgZGVwbG95aW5nIGRlZ3JhZGVkIG91dHB1dCAoIzExMjcpLlxuICovXG5mdW5jdGlvbiBidWlsZEluc3RhbGxTdGVwcyh0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmU6IGJvb2xlYW4pOiBTdGVwW10ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdHZW5lcmF0ZSAubnBtcmMgZm9yIFRha3VtaSBHdWFyZCcsXG4gICAgICAvLyBUaGUgdG9rZW4gaXMgd3JpdHRlbiBhcyBhIGxpdGVyYWwgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlIHRoYXQgYnVuIGV4cGFuZHMgYXRcbiAgICAgIC8vIGluc3RhbGwgdGltZSwgc28gdGhlIHNlY3JldCBpdHNlbGYgbmV2ZXIgbGFuZHMgaW4gYSBmaWxlLiBUaGUgbWFuYWdlZCBsaW5lcyBhcmUgc3RyaXBwZWRcbiAgICAgIC8vIGZyb20gYW4gZXhpc3RpbmcgLm5wbXJjIGZpcnN0OiBhIHJlcG9zaXRvcnkgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9ucyBtYXkgbGVnaXRpbWF0ZWx5XG4gICAgICAvLyBjb21taXQgb25lIChzY29wZSBtYXBwaW5ncyBmb3IgYW5vdGhlciByZWdpc3RyeSksIGFuZCBkcm9wcGluZyBvbmx5IHRoZXNlIHR3byBsaW5lcyBrZWVwc1xuICAgICAgLy8gdGhlIHJlc3Qgb2YgaXQgaW4gZWZmZWN0LiBSZXBsYWNpbmcgdGhlIGZpbGUgd2l0aCBgbXZgIHJhdGhlciB0aGFuIGFwcGVuZGluZyBpbiBwbGFjZSBzdG9wc1xuICAgICAgLy8gYSBjb21taXR0ZWQgc3ltbGluayBmcm9tIHJlZGlyZWN0aW5nIHRoZSB3cml0ZSBpbnRvLCBzYXksIGEgcGVyc2lzdGVudCBob21lIG5wbXJjLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbk5QTVJDPVwiJChta3RlbXAgXCIkUlVOTkVSX1RFTVAvbnBtcmMuWFhYWFhYXCIpXCJcbmlmIFtbIC1lIC5ucG1yYyBdXTsgdGhlblxuICBncmVwIC12RSAnXnJlZ2lzdHJ5PXxeLy9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoLzpfYXV0aFRva2VuJyAubnBtcmMgPiBcIiROUE1SQ1wiIHx8IHRydWVcbmZpXG5lY2hvICdyZWdpc3RyeT1odHRwczovL25wbS5mbGF0dC50ZWNoLycgPj4gXCIkTlBNUkNcIlxuZWNobyAnLy9ucG0uZmxhdHQudGVjaC86X2F1dGhUb2tlbj1cXCR7VEFLVU1JX0dVQVJEX1RPS0VOfScgPj4gXCIkTlBNUkNcIlxucm0gLWYgLm5wbXJjXG5tdiBcIiROUE1SQ1wiIC5ucG1yY2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgLy8gLS1mcm96ZW4tbG9ja2ZpbGU6IGEgcGxhaW4gYGJ1biBpbnN0YWxsYCBzaWxlbnRseSByZXBhaXJzIGEgYnVuLmxvY2sgdGhhdCBpcyBzdGFsZSBhZ2FpbnN0XG4gICAgICAvLyBwYWNrYWdlLmpzb24sIHNvIENJIHdvdWxkIHJ1biBkZXBlbmRlbmN5IHJlc29sdXRpb25zIHRoYXQgd2VyZSBuZXZlciByZXZpZXdlZCAoIzExMjYpLlxuICAgICAgLy8gV2l0aCBOTyBidW4ubG9jayBhdCBhbGwsIC0tZnJvemVuLWxvY2tmaWxlIHNpbGVudGx5IGluc3RhbGxzIGZyZXNoLCB1bnBpbm5lZCByZXNvbHV0aW9uc1xuICAgICAgLy8gKEJ1biAxLjMuMTQgZXhpdHMgMCBhbmQgd3JpdGVzIG5vIGxvY2tmaWxlKSwgc28gYSBtaXNzaW5nIGxvY2tmaWxlIG11c3QgZmFpbCBleHBsaWNpdGx5LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIFtbICEgLWUgYnVuLmxvY2sgXV07IHRoZW5cbiAgZWNobyBcIjo6ZXJyb3I6OmJ1bi5sb2NrIGlzIG1pc3Npbmc7IGNvbW1pdCBpdCBzbyBDSSBpbnN0YWxscyBzdGF5IHJlcHJvZHVjaWJsZVwiXG4gIGV4aXQgMVxuZmlcbmlmIFtbIFwiJEhBU19UQUtVTUlfR1VBUkRfVE9LRU5cIiA9PSBcInRydWVcIiBdXTsgdGhlblxuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG5lbHNlXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG5maWAsXG4gICAgICAvLyBTdGVwLXNjb3BlZDogYSBqb2ItbGV2ZWwgdG9rZW4gd291bGQgYmUgcmVhZGFibGUgYnkgZXZlcnkgZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0IHRoZVxuICAgICAgLy8gdG9rZW5sZXNzIHJlcGxheSBiZWxvdyBydW5zLlxuICAgICAgZW52OiB7IFRBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSdW4gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzJyxcbiAgICAgIC8vIEEgcmVwZWF0ZWQgYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgcmVwbGF5cyBub3RoaW5nLCBzbyBub2RlX21vZHVsZXMgaGFzIHRvIGdvIGZpcnN0LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbnJtIC1yZiBub2RlX21vZHVsZXNcbmJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJHtcbiAgICAgICAgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlXG4gICAgICAgICAgPyBgIHx8IHtcbiAgZWNobyBcIjo6d2FybmluZzo6TGlmZWN5Y2xlIHNjcmlwdHMgZmFpbGVkOyBjb21wbGV0aW5nIHRoZSBpbnN0YWxsIHdpdGhvdXQgdGhlbVwiXG4gIHJtIC1yZiBub2RlX21vZHVsZXNcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgLS1pZ25vcmUtc2NyaXB0c1xufWBcbiAgICAgICAgICA6ICcnXG4gICAgICB9YCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSZW1vdmUgdGhlIGdlbmVyYXRlZCAubnBtcmMnLFxuICAgICAgLy8gTm90aGluZyBhZnRlciB0aGUgaW5zdGFsbCBuZWVkcyB0aGUgcHJveHksIGFuZCBsZWF2aW5nIGl0IGluIHBsYWNlIHdvdWxkIGJyZWFrIHRoZSBvbmVcbiAgICAgIC8vIHRoaW5nIEd1YXJkIHJlZnVzZXMgdG8gc2VydmU6IGl0IGFuc3dlcnMgYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSwgc28gYSByZWxlYXNlIHdvcmtmbG93XG4gICAgICAvLyB3aG9zZSBwYWNrYWdlIGxhY2tzIGFuIGV4cGxpY2l0IHB1Ymxpc2hDb25maWcucmVnaXN0cnkgd291bGQgZmFpbCB0byBwdWJsaXNoLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggLS0gLm5wbXJjID4gL2Rldi9udWxsIDI+JjE7IHRoZW5cbiAgZ2l0IGNoZWNrb3V0IC0tIC5ucG1yY1xuZWxzZVxuICBybSAtZiAubnBtcmNcbmZpYCxcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7IHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gVGhlIGFjdGlvbiByZWFkcyB0aGUgcHVsbCByZXF1ZXN0LCBhbmQgaXRzIGB3aXBgIHN1cHBvcnQgcG9zdHMgYSBjb21taXQgc3RhdHVzOyBuZWl0aGVyXG4gICAgICAgIC8vIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB3aGVuIHRoZSByZXBvc2l0b3J5IHJlc3RyaWN0cyBkZWZhdWx0IHdvcmtmbG93IHBlcm1pc3Npb25zLlxuICAgICAgICBwZXJtaXNzaW9uczogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDogeyB3aXA6IHRydWUgfSxcbiAgICAgICAgICAgIGVudjogeyBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIE1pc2VUb21sIHtcbiAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gVGhlIG9sZGVzdCBCdW4gcnVudGltZSB3YmZ5IHN1cHBvcnRzLlxuZXhwb3J0IGNvbnN0IG1pbmltdW1CdW5WZXJzaW9uID0gJzEuNC4wJztcblxuLyoqXG4gKiBQaW5zIE5vZGUuanMgYW5kIHRoZSBsYXRlc3QgQnVuIGFuZCAod2hlbiBmbm94LnRvbWwgZXhpc3RzKSBmbm94IHZlcnNpb25zLiBPbmx5IHRoZSBjaGFuZ2VkIHBpblxuICogbGluZXMgYXJlIGVkaXRlZCBpbiBwbGFjZTogcmUtc2VyaWFsaXppbmcgdGhlIHBhcnNlZCBUT01MIHdvdWxkIGRyb3AgZXZlcnkgY29tbWVudCBhbmQgY29sbGFwc2VcbiAqIG11bHRpLWxpbmUgc3RyaW5ncyAoZS5nLiBtaXNlIHRhc2sgc2NyaXB0cykgaW4gdGhlIHJlc3Qgb2YgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1pc2VUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTWlzZVRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWlzZVRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRNaXNlVG9tbChtaXNlVG9tbFBhdGgpO1xuICAgIC8vIEEgcGFyc2UgZmFpbHVyZSBtdXN0IGFib3J0OiBlZGl0aW5nIHBpbnMgaW4gYSBicm9rZW4gbWlzZS50b21sIHdvdWxkIGhpZGUgdGhlIGJyZWFrYWdlLlxuICAgIGNvbnN0IHRvb2xzID0gKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sKS50b29scyA/PyB7fTtcblxuICAgIGNvbnN0IHBpbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgLy8gRW5zdXJlIE5vZGUuanMgaXMgYWx3YXlzIHBpbm5lZDogZ2VuZXJhdGVkIGhvb2tzIGFuZCBDSSBydW4gYG1pc2UgaW5zdGFsbGAsIGFuZCBhbiB1bnBpbm5lZFxuICAgICAgLy8gTm9kZSB3b3VsZCBjb21lIGZyb20gd2hhdGV2ZXIgaGFwcGVucyB0byBiZSBvbiBQQVRILlxuICAgICAgLy8gTGlmdC10aGVuLXBpbjogdGhlIGxpZnQgb25seSB0b3VjaGVzIGV4YWN0IHBpbnMgYW5kIHRoZSBwaW4gb25seSB0b3VjaGVzIHNlbGVjdG9ycywgc29cbiAgICAgIC8vIG9yZGVyaW5nIHRoZSBsaWZ0IGZpcnN0IGF2b2lkcyByZXNvbHZpbmcgYG1pc2UgbGF0ZXN0IG5vZGVAbHRzYCB0d2ljZSBmb3IgdW5waW5uZWQgcmVwb3MuXG4gICAgICBub2RlOiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgICAnbm9kZScsXG4gICAgICAgIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3IoJ25vZGVAbHRzJywgdG9vbHMubm9kZSwgY29uZmlnLmRpclBhdGgpLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGJ1bjogcGluTGF0ZXN0VG9vbFZlcnNpb24oJ2J1bicsIHRvb2xzLmJ1biwgY29uZmlnLmRpclBhdGgpLFxuICAgIH07XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICBwaW5zLmZub3ggPSBwaW5MYXRlc3RUb29sVmVyc2lvbignZm5veCcsIHRvb2xzLmZub3gsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBbdG9vbCwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMocGlucykpIHtcbiAgICAgIGlmICh2ZXJzaW9uID09PSB0b29sc1t0b29sXSkgY29udGludWU7XG4gICAgICBhc3NlcnQub2sodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnLCBgVGhlIHJlc29sdmVkICR7dG9vbH0gcGluIG11c3QgYmUgYSB2ZXJzaW9uIHN0cmluZy5gKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBzZXRUb29sVmVyc2lvbihuZXdDb250ZW50LCB0b29sLCB2ZXJzaW9uKTtcbiAgICAgIC8vIEEgbGluZSBlZGl0IGJyZWFrcyBwaW5zIHdyaXR0ZW4gaW4gYW55IG90aGVyIGZvcm0gKGEgbXVsdGktbGluZSB2YWx1ZSwgYSBgdG9vbHMuYnVuYFxuICAgICAgLy8gZG90dGVkIGtleSwgYSBgW3Rvb2xzLmJ1bl1gIHN1Yi10YWJsZSksIHNvIG5ldmVyIHdyaXRlIGEgcmVzdWx0IHRoZSBwYXJzZXIgZGlzYWdyZWVzIHdpdGguXG4gICAgICBhc3NlcnQub2soXG4gICAgICAgIHBhcnNlVG9vbHMobmV3Q29udGVudCk/Llt0b29sXSA9PT0gdmVyc2lvbixcbiAgICAgICAgYFdyaXRlIHRoZSAke3Rvb2x9IHBpbiBpbiBtaXNlLnRvbWwgYXMgb25lIFxcYCR7dG9vbH0gPSAuLi5cXGAgbGluZSB1bmRlciBbdG9vbHNdLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUobWlzZVRvbWxQYXRoLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldFRvb2xWZXJzaW9uKGNvbnRlbnQ6IHN0cmluZywgdG9vbDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwaW4gPSBgJHt0b29sfSA9IFwiJHt2ZXJzaW9ufVwiYDtcbiAgY29uc3Qgc2VjdGlvbiA9IC9eXFxbdG9vbHNcXF0oPyFbXlxcbl0pKD86XFxuKD8hXFxbKS4qKSovbXUuZXhlYyhjb250ZW50KT8uWzBdO1xuICBpZiAoc2VjdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYCR7Y29udGVudCAmJiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5gfVt0b29sc11cXG4ke3Bpbn1cXG5gO1xuXG4gIGNvbnN0IHBpblBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHt0b29sfSA9IC4qPyhcXFxccyojLiopPyRgLCAnbXUnKTtcbiAgLy8gQmxhbmsgbGluZXMgYW5kIGNvbW1lbnRzIHRoYXQgZW5kIHRoZSBzZWN0aW9uIGxlYWQgdGhlIG5leHQgdGFibGUsIHNvIGEgbmV3IHBpbiBnb2VzIGFib3ZlIHRoZW0uXG4gIGNvbnN0IHBpbnNFbmQgPSAvKD86XFxuW1xcdCBdKig/OiMuKik/KSokL3UuZXhlYyhzZWN0aW9uKT8uaW5kZXggPz8gc2VjdGlvbi5sZW5ndGg7XG4gIGNvbnN0IG5ld1NlY3Rpb24gPSBwaW5QYXR0ZXJuLnRlc3Qoc2VjdGlvbilcbiAgICA/IHNlY3Rpb24ucmVwbGFjZShwaW5QYXR0ZXJuLCBgJHtwaW59JDFgKVxuICAgIDogYCR7c2VjdGlvbi5zbGljZSgwLCBwaW5zRW5kKX1cXG4ke3Bpbn0ke3NlY3Rpb24uc2xpY2UocGluc0VuZCl9YDtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShzZWN0aW9uLCAoKSA9PiBuZXdTZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb29scyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBNaXNlVG9tbCkudG9vbHM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIFVwZGF0ZXMgdG8gdGhlIGxhdGVzdCByZWxlYXNlIGFjcm9zcyBtYWpvciB2ZXJzaW9ucyB3aXRob3V0IGRvd25ncmFkaW5nIGV4aXN0aW5nIGV4YWN0IHBpbnMuICovXG5mdW5jdGlvbiBwaW5MYXRlc3RUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIC8vIFJlc29sdmUgaW5kZXBlbmRlbnRseSBvZiB0aGUgdGFyZ2V0J3MgdHJ1c3Qgc3RhdGUgYW5kIHRvb2wgYWxpYXNlcy5cbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWyctLW5vLWNvbmZpZycsICdsYXRlc3QnLCB0b29sXSwgY3dkKTtcbiAgaWYgKCFzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSkgcmV0dXJuIHZlcnNpb24gPz8gJ2xhdGVzdCc7XG4gIC8vIEEgY2FjaGVkIHJlbGVhc2UgbGlzdGluZyBjYW4gbGFnIGJlaGluZCBhbm90aGVyIG1hY2hpbmUgdGhhdCBhbHJlYWR5IHVwZGF0ZWQgdGhlIHBpbi5cbiAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJiBzZW12ZXIudmFsaWQodmVyc2lvbikgJiYgc2VtdmVyLmd0KHZlcnNpb24sIHJlc29sdmVkVmVyc2lvbilcbiAgICA/IHZlcnNpb25cbiAgICA6IHJlc29sdmVkVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBMaWZ0cyBhbiBleGFjdCB0b29sIHBpbiBiZWxvdyB0aGUgbGF0ZXN0IHJlc29sdmFibGUgdmVyc2lvbiDigJQgd2l0aGluIHRoZSBTQU1FIG1ham9yIOKAlCB0byB0aGF0XG4gKiB2ZXJzaW9uIChOb2RlLmpzIHJlc29sdmVzIGFnYWluc3QgdGhlIGxhdGVzdCBMVFMpOiB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmUgc3RhbmRhcmQgdHJhY2tzIHRoZVxuICogY3VycmVudCB0b29sY2hhaW4gYWNyb3NzIHJlcG9zaXRvcmllcyBhbmQgUmVub3ZhdGUgZG9lcyBub3QgbWFuYWdlIG1pc2UudG9tbCBwaW5zLCBzb1xuICogcGF0Y2gvbWlub3IgZHJpZnQgKGUuZy4gbm9kZSAyNC4xNi4wIHZzIDI0LjE4LjApIG5ldmVyIHNlbGYtaGVhbHMuIEEgcGluXG4gKiBvbiBhbiBvbGRlciBtYWpvciBpcyBhIGRlbGliZXJhdGUgY29tcGF0aWJpbGl0eSBjaG9pY2UgYW5kIGlzIGtlcHQsIGFzIGFyZSBub24tZXhhY3QgYW5kXG4gKiBub24tc3RyaW5nIGZvcm1zLiBXaGVuIG1pc2UgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgcGluIGlzIGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3Ioc2VsZWN0b3I6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc2VtdmVyLnZhbGlkKHZlcnNpb24pKSByZXR1cm4gdmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbWlzZScsIFsnbGF0ZXN0Jywgc2VsZWN0b3JdLCBjd2QpO1xuICByZXR1cm4gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pICYmXG4gICAgc2VtdmVyLm1ham9yKGxhdGVzdFZlcnNpb24pID09PSBzZW12ZXIubWFqb3IodmVyc2lvbikgJiZcbiAgICBzZW12ZXIubHQodmVyc2lvbiwgbGF0ZXN0VmVyc2lvbilcbiAgICA/IGxhdGVzdFZlcnNpb25cbiAgICA6IHZlcnNpb247XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW4gdW5waW5uZWQgc2VsZWN0b3IgKGBsYXRlc3RgLCBhIHJhbmdlIHN1Y2ggYXMgXCIyNFwiLCBhbiBhbGlhcywgb3IgYSBtaXNzaW5nIGVudHJ5KVxuICogd2l0aCB0aGUgbmV3ZXN0IGNvbmNyZXRlIHZlcnNpb24gbWlzZSByZXNvbHZlcyBmb3IgaXQsIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlXG4gKiBzdGFuZGFyZCByZXF1aXJlcyBjb25jcmV0ZSBwaW5zOiBDSSBpbnN0YWxscyB3aGF0ZXZlciBhbiB1bnBpbm5lZCBzZWxlY3RvciByZXNvbHZlcyB0byBhdCBydW5cbiAqIHRpbWUsIHNvIGJ1aWxkcyBkcmlmdCBhY3Jvc3MgcnVucy4gRXhhY3QgdmVyc2lvbnMgYXJlIGtlcHQgYXMtaXMsIGFuZCBub24tc3RyaW5nIGZvcm1zIChtaXNlJ3NcbiAqIGFycmF5IGFuZCBgeyB2ZXJzaW9uID0gXCLigKZcIiB9YCBmb3JtcykgYXJlIHVzZXItbWFuYWdlZCBhbmQgbGVmdCB1bnRvdWNoZWQuIFdoZW4gbWlzZSBpc1xuICogdW5hdmFpbGFibGUgb3IgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgaXMga2VwdCDigJRcbiAqIGFuIHVucGlubmVkIHRvb2wgaXMgYmV0dGVyIHRoYW4gYSBicm9rZW4gY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcGluQ29uY3JldGVUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBzZW12ZXIudmFsaWQodmVyc2lvbikpKSByZXR1cm4gdmVyc2lvbjtcbiAgLy8gTm9ybWFsaXplIHNlbGVjdG9yIGZvcm1zIGBtaXNlIGxhdGVzdGAgY2Fubm90IHJlc29sdmUgZXZlbiB0aG91Z2ggbWlzZSBjb25maWd1cmF0aW9uIGFjY2VwdHNcbiAgLy8gdGhlbTogYHByZWZpeDoyNGAgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgd2hpbGUgYDI0YCByZXNvbHZlcywgYW5kIGBsdHMvKmAgeWllbGRzIGVtcHR5IG91dHB1dFxuICAvLyB3aGlsZSBgbHRzYCByZXNvbHZlcy4gTW9kaWZpZXIgc2VsZWN0b3JzIHN1Y2ggYXMgYHN1Yi0yOmx0c2Agc3RheSB1bnJlc29sdmFibGUgYW5kIGZhbGwgYmFja1xuICAvLyB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVsb3cuXG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnID8gdmVyc2lvbi5yZXBsYWNlKC9ecHJlZml4Oi91LCAnJykucmVwbGFjZSgvXFwvXFwqJC91LCAnJykgOiB1bmRlZmluZWQ7XG4gIC8vIFdpdGggbm8gbWVhbmluZ2Z1bCBzZWxlY3RvciwgTm9kZS5qcyBwaW5zIHRvIHRoZSBsYXRlc3QgTFRTIChtYXRjaGluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzJ1xuICAvLyBgbHRzLypgIGZhbGxiYWNrKSByYXRoZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UuXG4gIGNvbnN0IGRlZmF1bHRTZWxlY3RvciA9IHRvb2wgPT09ICdub2RlJyA/ICdub2RlQGx0cycgOiB0b29sO1xuICBjb25zdCBzZWxlY3RvciA9IHJhbmdlICYmIHJhbmdlICE9PSAnbGF0ZXN0JyA/IGAke3Rvb2x9QCR7cmFuZ2V9YCA6IGRlZmF1bHRTZWxlY3RvcjtcbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSA/IHJlc29sdmVkVmVyc2lvbiA6ICh2ZXJzaW9uID8/ICdsYXRlc3QnKTtcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUb21sKG1pc2VUb21sUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKG1pc2VUb21sUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IGEgcmVwb3NpdG9yeSB3aXRob3V0IG1pc2UudG9tbCBzdGFydHMgZnJvbSBhbiBlbXB0eSBjb25maWd1cmF0aW9uOyBhbiB1bnJlYWRhYmxlIGZpbGVcbiAgICAvLyAoZS5nLiBwZXJtaXNzaW9ucykgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggZ2VuZXJhdGVkIHNldHRpbmdzLlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuICcnO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcsIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy5qcyc7XG5cbi8qKlxuICogQnVuIHJlYWRzIHJlZ2lzdHJ5IHNjb3BlIG1hcHBpbmdzIGZyb20gYSBwaHlzaWNhbCByZXBvc2l0b3J5IC5ucG1yYyBkdXJpbmcgUmVub3ZhdGUgYXJ0aWZhY3RcbiAqIHVwZGF0ZXM7IFJlbm92YXRlJ3MgbnBtcmMgc2V0dGluZyBpcyB1c2VkIG9ubHkgYnkgaXRzIGRhdGFzb3VyY2UgbGF5ZXIuIEtlZXAgdGhlIG5vbi1zZWNyZXRcbiAqIG1hcHBpbmcgaW4gcmVwb3NpdG9yaWVzIHRoYXQgcmVzb2x2ZSBwcml2YXRlIHBhY2thZ2VzLCB3aGlsZSBhdXRoZW50aWNhdGlvbiByZW1haW5zIGluIHRoZVxuICogZGV2ZWxvcGVyJ3Mgfi8ubnBtcmMgbG9jYWxseSBhbmQgaW4gdGVtcG9yYXJ5IENJIG9yIE1lbmQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvQXV0aG9yID0gY29uZmlnc1swXT8ucmVwb0F1dGhvcjtcbiAgaWYgKHJlcG9BdXRob3IgIT09ICdXaWxsQm9vc3RlcicgJiYgcmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gIGNvbnN0IG5wbXJjUGF0aHMgPSBuZXcgU2V0KGNvbmZpZ3MubWFwKChjb25maWcpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5ucG1yYycpKSk7XG4gIGNvbnN0IHJvb3RDb25maWcgPSBjb25maWdzLmZpbmQoKGNvbmZpZykgPT4gY29uZmlnLmlzUm9vdCk7XG4gIGlmIChyb290Q29uZmlnICYmIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhyb290Q29uZmlnKSkge1xuICAgIGNvbnN0IHJvb3ROcG1yY1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJyk7XG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShyb290TnBtcmNQYXRoLCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcpO1xuICAgIG5wbXJjUGF0aHMuZGVsZXRlKHJvb3ROcG1yY1BhdGgpO1xuICB9XG5cbiAgZm9yIChjb25zdCBucG1yY1BhdGggb2YgbnBtcmNQYXRocykgYXdhaXQgcmVtb3ZlTnBtcmMobnBtcmNQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTnBtcmMobnBtcmNQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQobnBtcmNQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gIGlmIChhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQobnBtcmNQYXRoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBub24tY2Fub25pY2FsIHJlcG9zaXRvcnkgbnBtcmMgJHtucG1yY1BhdGh9LmApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5pbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhcmdldDogJ2JyYW5jaCc7XG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJztcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBpbmNsdWRlOiBzdHJpbmdbXTtcbiAgICAgIGV4Y2x1ZGU6IHN0cmluZ1tdO1xuICAgIH07XG4gIH07XG4gIHJ1bGVzOiAoXG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdkZWxldGlvbicgfCAnbm9uX2Zhc3RfZm9yd2FyZCc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogYm9vbGVhbjtcbiAgICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczoge1xuICAgICAgICAgICAgY29udGV4dDogc3RyaW5nO1xuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IG51bWJlcjtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogbnVtYmVyO1xuICAgICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW107XG4gICAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGJvb2xlYW47XG4gICAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddO1xuICAgICAgICB9O1xuICAgICAgfVxuICApW107XG4gIGJ5cGFzc19hY3RvcnM6IHtcbiAgICBhY3Rvcl9pZDogbnVtYmVyO1xuICAgIGFjdG9yX3R5cGU6ICdUZWFtJztcbiAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCc7XG4gIH1bXTtcbn1cblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBzb3VyY2VfdHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUiA9IHtcbiAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxufSBhcyBjb25zdDtcblxuY29uc3QgR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQgPSAxNV8zNjg7XG5cbmNvbnN0IFBST1RFQ1RfTUFJTl9SVUxFU0VUOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQgPSB7XG4gIG5hbWU6ICdQcm90ZWN0IG1haW4nLFxuICB0YXJnZXQ6ICdicmFuY2gnLFxuICBlbmZvcmNlbWVudDogJ2FjdGl2ZScsXG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBpbmNsdWRlOiBbJ35ERUZBVUxUX0JSQU5DSCddLFxuICAgIH0sXG4gIH0sXG4gIHJ1bGVzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2RlbGV0aW9uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBmYWxzZSxcbiAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiB0cnVlLFxuICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3Rlc3QgLyB0ZXN0JyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICdzZW1hbnRpYy1wciAvIHNlbWFudGljLXByJyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdub25fZmFzdF9mb3J3YXJkJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiAwLFxuICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW10sXG4gICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGZhbHNlLFxuICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogZmFsc2UsXG4gICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgYnlwYXNzX2FjdG9yczogW1xuICAgIHtcbiAgICAgIGFjdG9yX2lkOiAxN183NzdfNDk1LFxuICAgICAgYWN0b3JfdHlwZTogJ1RlYW0nLFxuICAgICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgIH0sXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInKSByZXR1cm47XG4gICAgLy8gVGhlIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGhvc3RzIHdvcmtmbG93X2NhbGwgZGVmaW5pdGlvbnMsIHNvIHRoZVxuICAgIC8vIFByb3RlY3QgbWFpbiBydWxlc2V0IHdvdWxkIHJlcXVpcmUgdGVzdC9zZW1hbnRpYy1wciBjaGVja3MgdGhhdCBuZXZlciBydW4gdGhlcmUuXG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKGNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWcpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBSZXBvc2l0b3J5IHJ1bGVzZXRzIHJlcXVpcmUgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgd2hpY2ggbG9jYWwgcnVuc1xuICAgICAgLy8gbWF5IG5vdCBoYXZlIGV2ZW4gd2hlbiBmaWxlLWdlbmVyYXRpb24gYW5kIHB1c2hlcyBhcmUgYWxsb3dlZC5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIGNvbnN0IHJ1bGVzZXQgPSBzdHJ1Y3R1cmVkQ2xvbmUoUFJPVEVDVF9NQUlOX1JVTEVTRVQpO1xuICBpZiAoY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXNldC5ydWxlcykge1xuICAgICAgaWYgKHJ1bGUudHlwZSAhPT0gJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnKSBjb250aW51ZTtcbiAgICAgIC8vIFRoZSBjb250ZXh0IGlzIGA8Y2FsbGVyIGpvYiBpZD4gLyA8cmV1c2FibGUgam9iIGlkPmAgb2YgdGhlIHdiZnktZ2VuZXJhdGVkIHRlc3QtcnVzdC55bWwuXG4gICAgICBydWxlLnBhcmFtZXRlcnMucmVxdWlyZWRfc3RhdHVzX2NoZWNrcy5wdXNoKHtcbiAgICAgICAgY29udGV4dDogJ3Rlc3QtcnVzdCAvIHRlc3QtcnVzdCcsXG4gICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnVsZXNldDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldCA9IGF3YWl0IGZpbmRSZXBvc2l0b3J5UnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgcnVsZXNldC5uYW1lKTtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0SWQgPSBleGlzdGluZ1J1bGVzZXQ/LmlkO1xuXG4gIGF3YWl0IHdpdGhSZXRyeShcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoZXhpc3RpbmdSdWxlc2V0SWQpIHtcbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3tydWxlc2V0X2lkfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHJ1bGVzZXRfaWQ6IGV4aXN0aW5nUnVsZXNldElkLFxuICAgICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldE5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aXRoUmV0cnkoXG4gICAgKCkgPT5cbiAgICAgIG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIGluY2x1ZGVzX3BhcmVudHM6IGZhbHNlLFxuICAgICAgICB0YXJnZXRzOiAnYnJhbmNoJyxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pLFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xuICBjb25zdCBydWxlc2V0cyA9IHJlc3BvbnNlLmRhdGE7XG4gIGlmICghQXJyYXkuaXNBcnJheShydWxlc2V0cykpIHJldHVybjtcbiAgcmV0dXJuIHJ1bGVzZXRzLmZpbmQoKHJ1bGVzZXQpID0+IHJ1bGVzZXQubmFtZSA9PT0gcnVsZXNldE5hbWUgJiYgcnVsZXNldC5zb3VyY2VfdHlwZSA9PT0gJ1JlcG9zaXRvcnknKTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuLCBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvciB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cEdpdEh1YlNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVwb3NpdG9yeSBzZXR0aW5ncyBuZWVkIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHVubGlrZSBmaWxlIGdlbmVyYXRpb24uXG4gICAgICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc193aWtpOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc19wcm9qZWN0czogZmFsc2UsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gTG9jYWwgd2JmeSBydW5zIG9mdGVuIGhhdmUgcHVzaCBwZXJtaXNzaW9uIHdpdGhvdXQgYWRtaW4gcGVybWlzc2lvbi5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cEdpdEh1YlNldHRpbmdzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBkaXNhYmxlRGlzY3Vzc2lvbnMob2N0b2tpdCwgb3duZXIsIHJlcG8pLCB7XG4gICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJTZXR0aW5nc0Vycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgZGlzYWJsaW5nIEdpdEh1YiBEaXNjdXNzaW9ucyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2FibGVEaXNjdXNzaW9ucyhvY3Rva2l0OiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRPY3Rva2l0Piwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9zaXRvcnlSZXNwb25zZSA9IGF3YWl0IG9jdG9raXQuZ3JhcGhxbDx7IHJlcG9zaXRvcnk/OiB7IGlkPzogc3RyaW5nIH0gfT4oXG4gICAgYHF1ZXJ5KCRvd25lcjogU3RyaW5nISwgJHJlcG86IFN0cmluZyEpIHtcbiAgICAgIHJlcG9zaXRvcnkob3duZXI6ICRvd25lciwgbmFtZTogJHJlcG8pIHsgaWQgfVxuICAgIH1gLFxuICAgIHsgb3duZXIsIHJlcG8gfVxuICApO1xuICBjb25zdCByZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5UmVzcG9uc2UucmVwb3NpdG9yeT8uaWQ7XG4gIGlmICghcmVwb3NpdG9yeUlkKSByZXR1cm47XG4gIGF3YWl0IG9jdG9raXQuZ3JhcGhxbChcbiAgICBgbXV0YXRpb24oJGlucHV0OiBVcGRhdGVSZXBvc2l0b3J5SW5wdXQhKSB7XG4gICAgICB1cGRhdGVSZXBvc2l0b3J5KGlucHV0OiAkaW5wdXQpIHsgcmVwb3NpdG9yeSB7IGlkIH0gfVxuICAgIH1gLFxuICAgIHsgaW5wdXQ6IHsgcmVwb3NpdG9yeUlkLCBoYXNEaXNjdXNzaW9uc0VuYWJsZWQ6IGZhbHNlIH0gfVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgcmV0dXJuIHRydWU7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCAhKCdlcnJvcnMnIGluIGVycm9yKSB8fCAhQXJyYXkuaXNBcnJheShlcnJvci5lcnJvcnMpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlcnJvci5lcnJvcnMuc29tZShcbiAgICAoZ3JhcGhxbEVycm9yOiB1bmtub3duKSA9PlxuICAgICAgISFncmFwaHFsRXJyb3IgJiZcbiAgICAgIHR5cGVvZiBncmFwaHFsRXJyb3IgPT09ICdvYmplY3QnICYmXG4gICAgICAndHlwZScgaW4gZ3JhcGhxbEVycm9yICYmXG4gICAgICBbJ0ZPUkJJRERFTicsICdJTlNVRkZJQ0lFTlRfU0NPUEVTJywgJ05PVF9GT1VORCddLmluY2x1ZGVzKGdyYXBocWxFcnJvci50eXBlIGFzIHN0cmluZylcbiAgKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8vIFRoZSBgL3NyY2AgZW50cnkgKGEgZGVjbGFyZWQgZXhwb3J0KSBsZXRzIHRoaXMgd29ya3NwYWNlIGNvbnN1bWVyIHVzZSB0aGUgc291cmNlcyB3aXRob3V0XG4vLyBidWlsZGluZyBzaGFyZWQtbGliIGZpcnN0LCBhcyBldmVyeSBvdGhlciBpbXBvcnQgb2YgaXQgaW4gdGhpcyBwYWNrYWdlIGRvZXMuXG5pbXBvcnQge1xuICBCVUdfSVNTVUVfU0VDVElPTlMsXG4gIENIQU5HRV9JU1NVRV9TRUNUSU9OUyxcbiAgUFVMTF9SRVFVRVNUX1NFQ1RJT05TLFxuICByZW5kZXJTZWN0aW9uVGVtcGxhdGUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGdldERlZmF1bHRQcm9zZUxhbmd1YWdlLCBMQU5HVUFHRV9CT1VORF9URVhUX0VYQ0VQVElPTiB9IGZyb20gJy4uL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBydW5BbGxJblBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGdlbmVyYXRlVGVtcGxhdGVzID0gKHByTGFuZ3VhZ2VOb3RlOiBzdHJpbmcsIGlzc3VlTGFuZ3VhZ2VOb3RlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+ICh7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG48IS0tIFdyaXRlIGZvciBhIHJldmlld2VyIHdobyBoYXMgbm90IGZvbGxvd2VkIHRoZSB3b3JrLiR7cHJMYW5ndWFnZU5vdGV9IFNjYWxlIGVhY2ggc2VjdGlvbiB0byB0aGUgY2hhbmdlOiBhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lLiBEZWxldGUgdGhpcyBjb21tZW50IGFuZCB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYmVsb3cuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShQVUxMX1JFUVVFU1RfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9idWcubWQnOiBgXG4tLS1cbm5hbWU6IEJ1ZyAvIFByb2JsZW1cbmFib3V0OiBTb21ldGhpbmcgYmVoYXZlcyB3cm9uZ2x5XG50aXRsZTogJ2ZpeDogJ1xubGFiZWxzOiAndDogZml4IDpidWc6J1xuLS0tXG5cbjwhLS0gS2VlcCBQcm9ibGVtIGFuZCBQcm9wb3NhbDsgZGVsZXRlIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuJHtpc3N1ZUxhbmd1YWdlTm90ZX0gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoQlVHX0lTU1VFX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvY2hhbmdlLm1kJzogYFxuLS0tXG5uYW1lOiBDaGFuZ2UgLyBGZWF0dXJlXG5hYm91dDogUHJvcG9zZSBhIGNoYW5nZSB0aGF0IGEgdGhpcmQgcGFydHkgY291bGQgaW1wbGVtZW50IHdpdGhvdXQgYXNraW5nIGEgcXVlc3Rpb25cbnRpdGxlOiAnZmVhdDogJ1xubGFiZWxzOiAndDogZmVhdCA6c3BhcmtsZXM6J1xuLS0tXG5cbjwhLS0gS2VlcCB0aGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgZm9yIGFueSBjaGFuZ2UgYW5kIGFkZCB0aGUgb3RoZXJzIGFzIHRoZSBjaGFuZ2UgZ3Jvd3M7IGEgbGFyZ2UgY2hhbmdlIGZpbGxzIGFsbCBvZiB0aGVtIChzcGVjLWJvb3N0ZXIgcmV2aWV3cyBhZ2FpbnN0IHRoaXMgbGlzdCkuJHtpc3N1ZUxhbmd1YWdlTm90ZX0gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoQ0hBTkdFX0lTU1VFX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvY29uZmlnLnltbCc6ICdibGFua19pc3N1ZXNfZW5hYmxlZDogdHJ1ZScsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRlbXBsYXRlcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBmaWxlcywgc28gYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3QgY3JlYXRlIHRoZW0uXG4gICAgaWYgKCFjb25maWcuaXNSb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgW3ByTGFuZ3VhZ2VOb3RlLCBpc3N1ZUxhbmd1YWdlTm90ZV0gPVxuICAgICAgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2UoY29uZmlnKSA9PT0gJ0phcGFuZXNlJ1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIGAgV3JpdGUgdGhlIHRpdGxlIGluIEVuZ2xpc2ggYW5kIHRoZSBib2R5IGluIEphcGFuZXNlLCAke0xBTkdVQUdFX0JPVU5EX1RFWFRfRVhDRVBUSU9OfSwga2VlcGluZyB0aGUgaGVhZGluZ3MgYXMgdGhleSBhcmUuYCxcbiAgICAgICAgICAgIGAgV3JpdGUgaW4gSmFwYW5lc2UsICR7TEFOR1VBR0VfQk9VTkRfVEVYVF9FWENFUFRJT059LCBrZWVwaW5nIHRoZSBoZWFkaW5ncyBhcyB0aGV5IGFyZS5gLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXG4gICAgICAgICAgICBgIFdyaXRlIGluIEVuZ2xpc2gsICR7TEFOR1VBR0VfQk9VTkRfVEVYVF9FWENFUFRJT059LmAsXG4gICAgICAgICAgICBgIFdyaXRlIGluIEVuZ2xpc2gsICR7TEFOR1VBR0VfQk9VTkRfVEVYVF9FWENFUFRJT059LmAsXG4gICAgICAgICAgXTtcbiAgICBhd2FpdCBydW5BbGxJblBvb2woXG4gICAgICBPYmplY3QuZW50cmllcyhnZW5lcmF0ZVRlbXBsYXRlcyhwckxhbmd1YWdlTm90ZSwgaXNzdWVMYW5ndWFnZU5vdGUpKS5tYXAoKFtmaWxlTmFtZSwgY29udGVudF0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yLCBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeENoYWtyYVRvYXN0ZXIgfSBmcm9tICcuL2ZpeGVycy9jaGFrcmFUb2FzdGVyLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVCdW5maWdUb21sLFxuICBoYXNDdXJyZW50QnVuUmVsZWFzZUFnZUV4Y2x1ZGVzLFxuICByZWFkQnVuR2xvYmFsU3RvcmUsXG4gIHJlc29sdmVCdW5HbG9iYWxTdG9yZSxcbn0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRm5veFRvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvZm5veFRvbWwuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcywgcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nbG9iYWxSZWxlYXNlQWdlR2F0ZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2sgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiwgZ2V0V29ya3NwYWNlUGFja2FnZURpcnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGZtdENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGZtdENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94bGludENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGxpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UmFpbHdheWlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lLCByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVXNlckFnZW50Q29uZmlncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy91c2VyQWdlbnRDb25maWdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZW5zdXJlV2JFbnZEZWZpbml0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93YkVudi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU1pc2VUb21sLCBtaW5pbXVtQnVuVmVyc2lvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9taXNlVG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9ucG1yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlVHlwZVNjcmlwdEFwaSB9IGZyb20gJy4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbiwgZ2V0V2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbi8qKlxuICogQXBwbGllcyBvbmx5IHRoZSBnbG9iYWwgcmVsZWFzZS1hZ2UgZ2F0ZSwgd2l0aG91dCB0b3VjaGluZyBhbnkgcmVwb3NpdG9yeS4gU3BlbGxlZCBvdXQgaW4gZnVsbFxuICogcmF0aGVyIHRoYW4gc2hvcnRlbmVkIChlLmcuIGBnYXRlYCkgYmVjYXVzZSB0aGUgZGVmYXVsdCBjb21tYW5kIHRha2VzIHBvc2l0aW9uYWwgcGF0aHM6IGEgc2hvcnRcbiAqIG5hbWUgd291bGQgc3dhbGxvdyBhIGRpcmVjdG9yeSB0aGF0IGhhcHBlbnMgdG8gc2hhcmUgaXQuXG4gKi9cbmNvbnN0IGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kID0gJ2FwcGx5LXJlbGVhc2UtYWdlLWdhdGUnO1xuLyoqIFNhbWUgbmFtaW5nIHJhdGlvbmFsZSBhcyBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZC4gKi9cbmNvbnN0IGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQgPSAnZ2VuZXJhdGUtdXNlci1hZ2VudC1jb25maWdzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZChcbiAgICAgIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLFxuICAgICAgXCJBcHBseSBvbmx5IHRoZSBvcmdhbml6YXRpb24ncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGlzIG1hY2hpbmUncyBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3NcIlxuICAgIClcbiAgICAuY29tbWFuZChcbiAgICAgIGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQsXG4gICAgICBcIk92ZXJ3cml0ZSB0aGlzIHVzZXIncyBhZ2VudCBpbnN0cnVjdGlvbiBmaWxlcyAofi8uY29kZXgvQUdFTlRTLm1kLCB+Ly5jbGF1ZGUvQ0xBVURFLm1kLCB+Ly5nZW1pbmkvR0VNSU5JLm1kKSB3aXRoIHRoZSBvcmdhbml6YXRpb24ncyBmaXhlZCBjb250ZW50IGFuZCBtZXJnZSB0aGUgb3JnYW5pemF0aW9uJ3Mgc2V0dGluZ3MgaW50byB+Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbiBhbmQgfi8uZ2VtaW5pL3NldHRpbmdzLmpzb25cIlxuICAgIClcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZm9yY2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdBcHBseSB3YmZ5IGV2ZW4gd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IHJlY29yZHMgdGhpcyB3YmZ5IHZlcnNpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2YnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdTa2lwIGFkZGluZyBtYW5hZ2VkIGRlcGVuZGVuY2llcyBhbmQgdGhlIGxpbmtlciBwcm9iZSAodGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVmcmVzaGluZyB0aGUgbG9ja2ZpbGUgc3RpbGwgcnVucyknLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRXYmZ5VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcblxuICAvLyBEZWxpYmVyYXRlbHkgYmVmb3JlIHRoZSBCdW4gY2hlY2sgaW4gd2lsbGJvb3N0ZXJpZnlQYXRocygpOiB0aGUgZ2F0ZSBtdXN0IGJlIGFwcGxpYWJsZSBvbiBhXG4gIC8vIG1hY2hpbmUgd2hvc2UgQnVuIGlzIG91dGRhdGVkLCB3aGljaCBpcyBleGFjdGx5IGEgbWFjaGluZSB0aGF0IHN0aWxsIG5lZWRzIGdhdGluZy5cbiAgaWYgKGFyZ3YuX1swXSA9PT0gYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQpIHtcbiAgICBpZiAoIWVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFyZ3YuX1swXSA9PT0gZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCkge1xuICAgIGlmICghKGF3YWl0IGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBhd2FpdCB3aWxsYm9vc3RlcmlmeVBhdGhzKGFyZ3YucGF0aHMgYXMgc3RyaW5nW10sIGFyZ3Yuc2tpcERlcHMsIGFyZ3YuZm9yY2UpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIHNlcnZlciBzcGF3bmVkIGZvciBBU1QgcGFyc2luZyBrZWVwcyBhbiBvcGVuIElQQ1xuICAgIC8vIGNoYW5uZWwgdGhhdCB3b3VsZCBvdGhlcndpc2UgcHJldmVudCB0aGUgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgICBhd2FpdCBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpbGxib29zdGVyaWZ5UGF0aHMocGF0aHM6IHN0cmluZ1tdLCBza2lwRGVwczogYm9vbGVhbiwgZm9yY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQmVmb3JlIGFueXRoaW5nIGVsc2Ug4oCUIGV2ZW4gdGhlIEJ1biBjaGVjayBiZWxvdzogdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgZ2xvYmFsXG4gIC8vIHBhY2thZ2UtbWFuYWdlciBjb25maWdzIG11c3QgcmVjZWl2ZSB0aGUgb3JnJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgb24gRVZFUlkgcnVuLFxuICAvLyBiZWNhdXNlIHRoZXkgYXJlIHdoYXQgZ3VhcmRzIGJyYW5kLW5ldyBsb2NhbCBwcm9qZWN0cyB0aGF0IGhhdmUgbm8gd2JmeS1nZW5lcmF0ZWQgcmVwb3NpdG9yeVxuICAvLyBjb25maWcgeWV0LCBhbmQgdGhhdCBwcm90ZWN0aW9uIG11c3Qgd29yayBiZWZvcmUgdGhlIHN1cHBvcnRlZC12ZXJzaW9uIGNoZWNrLlxuICBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTtcblxuICAvLyB3YmZ5IG1hbmFnZXMgcmVwb3NpdG9yaWVzIHRocm91Z2ggQnVuICsgbWlzZSBhbmQgdXNlcyBCdW4gMS40IHJ1bnRpbWUgQVBJcy4gVGhlIHZlcnNpb24gZmxvb3JcbiAgLy8gYWxzbyBlbnN1cmVzIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgb3B0aW9ucyBwcm9kdWNlIHRoZSBpbnN0YWxsIGxheW91dCB3YmZ5IHZhbGlkYXRlcy4gSXRcbiAgLy8gc3RheXMgdW5jb25kaXRpb25hbCBldmVuIHRob3VnaCB0aGUgYWxyZWFkeS1hcHBsaWVkIGNoZWNrIGJlbG93IGNhbiBtYWtlIGEgcnVuIGEgbm8tb3A6IGFuXG4gIC8vIG91dGRhdGVkIEJ1biBpcyBhIGJyb2tlbiBlbnZpcm9ubWVudCB3YmZ5IG11c3QgcmVwb3J0LCBhbmQgaGlkaW5nIGl0IHdoZW5ldmVyIGV2ZXJ5IHBhdGhcbiAgLy8gaGFwcGVucyB0byBiZSBza2lwcGVkIHdvdWxkIHN1cmZhY2UgaXQgb25seSBsYXRlci5cbiAgY29uc3QgYnVuVmVyc2lvbiA9IEJ1bi52ZXJzaW9uO1xuICBpZiAoQnVuLnNlbXZlci5vcmRlcihidW5WZXJzaW9uLCBtaW5pbXVtQnVuVmVyc2lvbikgPCAwKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2JmeSByZXF1aXJlcyBCdW4gPj0gJHttaW5pbXVtQnVuVmVyc2lvbn0gKGZvdW5kICR7YnVuVmVyc2lvbn0pLiBVcGdyYWRlIEJ1biBhbmQgcmUtcnVuLmApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQSBgLWRpcnR5LWxvY2FsYCBsYWJlbCBpZGVudGlmaWVzIGFuIGVkaXRlZCBjaGVja291dCwgd2hvc2UgbmV4dCBidWlsZCBwcm9kdWNlcyBkaWZmZXJlbnQgZmlsZXNcbiAgLy8gdW5kZXIgdGhlIHNhbWUgbGFiZWwsIHNvIHN1Y2ggYSBydW4gaXMgbmV2ZXIgdHJlYXRlZCBhcyBhbHJlYWR5IGFwcGxpZWQuXG4gIGNvbnN0IHZlcnNpb25MYWJlbCA9IGdldFdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgY29uc3Qgc2tpcHBhYmxlVmVyc2lvbkxhYmVsID1cbiAgICAhZm9yY2UgJiYgdmVyc2lvbkxhYmVsICYmICF2ZXJzaW9uTGFiZWwuZW5kc1dpdGgoJy1kaXJ0eS1sb2NhbCcpID8gdmVyc2lvbkxhYmVsIDogdW5kZWZpbmVkO1xuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGlucHV0RGlyUGF0aCBvZiBwYXRocykge1xuICAgIC8vIE5vcm1hbGl6ZSBvbmNlIGF0IHRoZSBDTEkgYm91bmRhcnkuIEdlbmVyYXRvcnMgdXNlIGRpclBhdGggZm9yIGN3ZCBhbmQgYmFzZW5hbWUgZGVjaXNpb25zO1xuICAgIC8vIGxlYXZpbmcgdGhlIHN1cHBvcnRlZCBkZWZhdWx0IGAuYCB1bnJlc29sdmVkIHdvdWxkIGdlbmVyYXRlIGFuIGludmFsaWQgcGFja2FnZSBuYW1lIG9mIGAuYC5cbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShpbnB1dERpclBhdGgpO1xuICAgIC8vIENvbmZpbmUgZXZlcnkgZ2VuZXJhdGVkIGZpbGUgdG8gdGhpcyByZXBvc2l0b3J5IChzZWUgZnNVdGlsLmdlbmVyYXRlRmlsZSkuIFNldCBCRUZPUkUgYW55XG4gICAgLy8gZml4ZXIgd3JpdGVzLCBhbmQgcmVzZXQgb24gZXZlcnkgaXRlcmF0aW9uIHNvIGEgbXVsdGktcGF0aCBydW4gbmV2ZXIga2VlcHMgdGhlIHByZXZpb3VzIHJvb3QuXG4gICAgZnNVdGlsLnNldFJvb3REaXJQYXRoKGZzLmV4aXN0c1N5bmMocm9vdERpclBhdGgpID8gcm9vdERpclBhdGggOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gVGhlIGJhZGdlIHJlY29yZHMgdGhlIGJ1aWxkIHRoYXQgZ2VuZXJhdGVkIHRoZSByZXBvc2l0b3J5J3MgY29uZmlndXJhdGlvbiwgc28gdGhlIHNhbWUgYnVpbGRcbiAgICAvLyB3b3VsZCBvbmx5IHJld3JpdGUgd2hhdCBpcyBhbHJlYWR5IHRoZXJlLiBTa2lwcGluZyBpcyBhIGRlbGliZXJhdGUgdHJhZGU6IHRoZSBwYXJ0cyBvZiBhIHJ1blxuICAgIC8vIHRoYXQgZGVwZW5kIG9uIHN0YXRlIE9VVFNJREUgdGhlIHJlcG9zaXRvcnkgKEdpdEh1YiBzZXR0aW5ncywgZGVwZW5kZW5jeSB1cGRhdGVzLCB0aGUgZmV0Y2hlZFxuICAgIC8vIC5naXRpZ25vcmUpIGRvIGdldCBza2lwcGVkIHRvbywgd2hpY2ggaXMgd2hhdCAtLWZvcmNlIGlzIGZvci4gVGhlIHJlbGVhc2UtYWdlIGV4ZW1wdGlvbnMgYXJlXG4gICAgLy8gdGhlIGV4Y2VwdGlvbjogdGhleSBleHBpcmUgYnkgZGF0ZSwgYW5kIHJlc3RvcmluZyB0aGUgZ2F0ZSBtdXN0IG5vdCB3YWl0IGZvciBhIG5ldyBidWlsZC5cbiAgICBpZiAoXG4gICAgICBza2lwcGFibGVWZXJzaW9uTGFiZWwgJiZcbiAgICAgIChhd2FpdCByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwocm9vdERpclBhdGgpKSA9PT0gc2tpcHBhYmxlVmVyc2lvbkxhYmVsICYmXG4gICAgICBoYXNDdXJyZW50QnVuUmVsZWFzZUFnZUV4Y2x1ZGVzKHJvb3REaXJQYXRoKVxuICAgICkge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwICR7cm9vdERpclBhdGh9OiB3YmZ5ICR7c2tpcHBhYmxlVmVyc2lvbkxhYmVsfSBpcyBhbHJlYWR5IGFwcGxpZWQuIFBhc3MgLS1mb3JjZSB0byByZS1hcHBseS5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3QgcGFja2FnZXNTdWJEaXJQYXRocyA9IGRpcmVudHNcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSlcbiAgICAgIC5tYXAoKGQpID0+IHBhdGgucmVzb2x2ZShwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuICAgIC8vIEFsc28gY292ZXIgd29ya3NwYWNlcyBkZWNsYXJlZCBvdXRzaWRlIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdGhleSByZWNlaXZlIHRoZSBzYW1lXG4gICAgLy8gbWFuYWdlZCBjb25maWdzICh0c2NvbmZpZy5qc29uLCBwYWNrYWdlLmpzb24gY29udmVudGlvbnMsIOKApikgYXMgcGFja2FnZXMvKiBjaGlsZHJlbi5cbiAgICBjb25zdCByb290UGFja2FnZUpzb24gPVxuICAgICAgaWdub3JlRXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ11cbiAgICAgICkgPz8ge307XG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoOiByb290RGlyUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uOiByb290UGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogcGFja2FnZXNTdWJEaXJQYXRocy5zb21lKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgICApLFxuICAgIH0pO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gWy4uLm5ldyBTZXQoWy4uLnBhY2thZ2VzU3ViRGlyUGF0aHMsIC4uLndvcmtzcGFjZVN1YkRpclBhdGhzXSldLmZpbHRlcihcbiAgICAgIChzdWJEaXJQYXRoKSA9PiBzdWJEaXJQYXRoICE9PSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpXG4gICAgKTtcblxuICAgIC8vIFJlZnVzZWQgd3JpdGVzIG9uIGNvcmUgbWFuYWdlZCBmaWxlcyB3b3VsZCBsZWF2ZSB0aGUgcmVwb3NpdG9yeSBwYXJ0aWFsbHkgdXBkYXRlZCwgc28gc2tpcFxuICAgIC8vIGl0IEJFRk9SRSBhbnkgbXV0YXRpb24gd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgICBjb25zdCBtYW5hZ2VkRmlsZVBhdGhzID0gW1xuICAgICAgLi4uWycuZ2l0YXR0cmlidXRlcycsICdidW5maWcudG9tbCcsICdsZWZ0aG9vay55bWwnLCAncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgbmFtZSlcbiAgICAgICksXG4gICAgICAuLi5zdWJEaXJQYXRocy5mbGF0TWFwKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBbJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PiBwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgbmFtZSkpXG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3Qgd3JpdGFibGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtYW5hZ2VkRmlsZVBhdGhzLm1hcCgoZmlsZVBhdGgpID0+IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSlcbiAgICApO1xuICAgIGlmICh3cml0YWJsZVJlc3VsdHMuaW5jbHVkZXMoZmFsc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiBhIG1hbmFnZWQgY29uZmlnIGZpbGUgaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmbGlnaHRFcnJvcnMgPSBbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXS5mbGF0TWFwKChkaXJQYXRoKSA9PiB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddO1xuICAgICAgICBjb25zdCBlcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoeyBwYWNrYWdlSnNvbiB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9yID8gW2Ake2RpclBhdGh9OiAke2Vycm9yfWBdIDogW107XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtgJHtwYWNrYWdlSnNvblBhdGh9IGlzIGludmFsaWRgXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocHJlZmxpZ2h0RXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06XFxuJHtwcmVmbGlnaHRFcnJvcnMuam9pbignXFxuJyl9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBMZXQgZ2V0UGFja2FnZUNvbmZpZyBkZXJpdmUgaXNSb290IGZvciB0aGUgZW50cnkgcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBpcyBhXG4gICAgLy8gc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgdGFyZ2V0IG11c3Qga2VlcCBpdHMgY2hpbGQgY2xhc3NpZmljYXRpb24sIHNvIGZvcmNpbmdcbiAgICAvLyBgaXNSb290OiB0cnVlYCBoZXJlIHdvdWxkIGFwcGx5IHJvb3Qtb25seSBwcm9jZXNzaW5nIChsZWZ0aG9vayBpbnN0YWxsLCByb290IHRzY29uZmlnLFxuICAgIC8vIEFHRU5UUy5tZCwg4oCmKSB0byBhIHN1YnBhY2thZ2UuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gRXZlcnkgZGlzY292ZXJlZCB3b3Jrc3BhY2UgKGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKSBpcyBhIGNoaWxkXG4gICAgLy8gcGFja2FnZTsgdGhlIHBhY2thZ2VzLyogaGV1cmlzdGljIGluc2lkZSBnZXRQYWNrYWdlQ29uZmlnIHdvdWxkIG1pc2NsYXNzaWZ5IGFwcHMvKiBhcyByb290cy5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgeyBpc1Jvb3Q6IGZhbHNlIH0pKVxuICAgICk7XG4gICAgY29uc3QgaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoID0gc3ViRGlyUGF0aHMuZmluZChcbiAgICAgIChzdWJEaXJQYXRoLCBpbmRleCkgPT4gIW51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3NbaW5kZXhdICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICApO1xuICAgIGlmIChpbnZhbGlkU3ViUGFja2FnZURpclBhdGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06ICR7aW52YWxpZFN1YlBhY2thZ2VEaXJQYXRofS9wYWNrYWdlLmpzb24gaXMgaW52YWxpZC5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG4gICAgLy8gVGhlIG1hbmFnZWQgaWdub3JlIHJ1bGUgaXMgdW5hbmNob3JlZCwgc28gYSBuZXN0ZWQgY29weSAoZS5nLiB3b3JrZXJzL2FwaS8uZW52LmNsb3VkZmxhcmUpIGlzXG4gICAgLy8gYXMgbXVjaCBhIGxlYWsgYXMgYSByb290IG9uZTsgdGhlIHdpbGRjYXJkIHBhdGhzcGVjIGNvdmVycyBldmVyeSBkZXB0aCBpbiBvbmUgcXVlcnkuXG4gICAgY29uc3QgdHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocyA9IGFsbFBhY2thZ2VDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmlzQ2xvdWRmbGFyZSlcbiAgICAgID8gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICAgICAgICdnaXQnLFxuICAgICAgICAgIFsnLWMnLCAnY29yZS5xdW90ZVBhdGg9ZmFsc2UnLCAnbHMtZmlsZXMnLCAnLS0nLCAnLmVudi5jbG91ZGZsYXJlJywgJyovLmVudi5jbG91ZGZsYXJlJ10sXG4gICAgICAgICAgcm9vdENvbmZpZy5kaXJQYXRoXG4gICAgICAgIClcbiAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCkpXG4gICAgICA6IFtdO1xuICAgIGlmICh0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBTRUNVUklUWSBFUlJPUjogQ2xvdWRmbGFyZSBjcmVkZW50aWFscyBtdXN0IGJlIHVudHJhY2tlZC4gUmVtb3ZlICR7dHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5qb2luKFxuICAgICAgICAgICcsICdcbiAgICAgICAgKX0gZnJvbSBHaXQsIHB1cmdlIHRoZSB0b2tlbiBmcm9tIGhpc3RvcnksIGFuZCByb3RhdGUgQ0xPVURGTEFSRV9BUElfVE9LRU4gYmVmb3JlIHJlcnVubmluZyB3YmZ5LmBcbiAgICAgICk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZml4VHlwb3NQcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBhd2FpdCBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIC8vIE1hbmFnZWQgcmVwb3NpdG9yaWVzIHVzZSBCdW4gd2l0aCBtaXNlIChhbmQgb3B0aW9uYWxseSBmbm94KS5cbiAgICBjb25zdCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlID0gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoKTtcbiAgICAvLyBSb290LWxldmVsIGluc3RhbGwgbGF5b3V0IG11c3QgY292ZXIgd29ya3NwYWNlIGFwcHMgdG9vOiBOZXh0LmpzIGNvbW1vbmx5IGxpdmVzIHVuZGVyXG4gICAgLy8gcGFja2FnZXMvKiBvciBhcHBzLyogd2hpbGUgYnVuZmlnLnRvbWwgZXhpc3RzIG9ubHkgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICBjb25zdCB1c2VHbG9iYWxTdG9yZSA9IHJlc29sdmVCdW5HbG9iYWxTdG9yZShhbGxQYWNrYWdlQ29uZmlncywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgc2tpcERlcHMpO1xuICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnLCB1c2VHbG9iYWxTdG9yZSk7XG4gICAgYXdhaXQgZ2VuZXJhdGVNaXNlVG9tbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBnZW5lcmF0ZUZub3hUb21sKHJvb3RDb25maWcpO1xuICAgIC8vIFJ1biBhZnRlciBnZW5lcmF0ZUZub3hUb21sIHNvIGl0cyB0cmFuc2FjdGlvbmFsIHJlY2lwaWVudCBzeW5jIGNhbm5vdCByZXN0b3JlIGEgc25hcHNob3RcbiAgICAvLyBvdmVyIGRlZmluaXRpb25zIGluc2VydGVkIGhlcmUuXG4gICAgYXdhaXQgZW5zdXJlV2JFbnZEZWZpbml0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICAvLyBUaGUgbGF5b3V0IG11c3QgYmUgdmVyaWZpZWQgaW5zdGFsbGFibGUgQkVGT1JFIGFueSBgYnVuIGFkZGAgbXV0YXRlcyBwYWNrYWdlLmpzb24gZmlsZXM6XG4gICAgLy8gcGVyLXBhY2thZ2UgaW5zdGFsbHMgdG9sZXJhdGUgZmFpbHVyZXMgKHNwYXduU3luYyBkaXNjYXJkcyB0aGVpciBzdGF0dXMpLCBzbyBhIGxheW91dCB0aGF0XG4gICAgLy8gY2Fubm90IGluc3RhbGwgd291bGQgc2lsZW50bHkgZHJvcCBldmVyeSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLlxuICAgIC8vIEEgZG9jcy1vbmx5IHJlcG9zaXRvcnkgaGFzIG5vIG1hbmlmZXN0IHRvIHByb2JlIG9uIGl0cyBmaXJzdCBydW47IGdlbmVyYXRlUGFja2FnZUpzb24gYmVsb3dcbiAgICAvLyBjcmVhdGVzIGl0IGJlZm9yZSB0aGUgYXV0aG9yaXRhdGl2ZSByZWZyZXNoQnVuTG9jayBjaGVjay5cbiAgICBpZiAoXG4gICAgICAhc2tpcERlcHMgJiZcbiAgICAgIHJvb3RDb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJlxuICAgICAgIXByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKHJvb3REaXJQYXRoLCByb290Q29uZmlnLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCB1c2VHbG9iYWxTdG9yZSlcbiAgICApIHtcbiAgICAgIC8vIHJlZnJlc2hCdW5Mb2NrIGJlbG93IGlzIHRoZSBhdXRob3JpdHkgb24gd2hldGhlciB0aGUgZmluYWwgaW5zdGFsbCBmYWlsZWQuXG4gICAgICBjb25zb2xlLndhcm4oYGJ1biBpbnN0YWxsIGN1cnJlbnRseSBmYWlscyBpbiAke3Jvb3REaXJQYXRofSB1bmRlciB0aGUgaXNvbGF0ZWQgbGlua2VyLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICAvLyBPdGhlciBvd25lcnMgY2Fubm90IGNhbGwgdGhlIG9yZ2FuaXphdGlvbidzIHJldXNhYmxlIHdvcmtmbG93cyAodGhlaXIgc2VjcmV0cyBhbmQgcnVubmVyc1xuICAgIC8vIGRvIG5vdCBleGlzdCB0aGVyZSksIHNvIGFueSBvdGhlciBHaXRIdWItaG9zdGVkIE5vZGUuanMgcmVwb3NpdG9yeSBnZXRzIHNlbGYtY29udGFpbmVkXG4gICAgLy8gd29ya2Zsb3dzIGluc3RlYWQg4oCUIGtleWVkIG9uIHJlcG9zaXRvcnkgc3RhdGUsIG5ldmVyIG9uIHRoZSBvd25lcidzIGlkZW50aXR5LlxuICAgIC8vIHJvb3RDb25maWcuaXNSb290OiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiAoYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCkga2VlcHNcbiAgICAvLyBpc1Jvb3QgZmFsc2UsIGFuZCBHaXRIdWIgaWdub3JlcyB3b3JrZmxvdyBmaWxlcyBuZXN0ZWQgdW5kZXIgYSBwYWNrYWdlIGRpcmVjdG9yeS5cbiAgICBjb25zdCBzaG91bGRSdW5TZWxmQ29udGFpbmVkV29ya2Zsb3dzID1cbiAgICAgICFzaG91bGRSdW5Xb3JrZmxvd3MgJiZcbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAhIXJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOicpICYmXG4gICAgICByb290Q29uZmlnLmlzUm9vdDtcbiAgICAvLyBmaXhUeXBvcyByZWFkLW1vZGlmeS13cml0ZXMgdGhlIE1hcmtkb3duIGFuZCBZQU1MIGZpbGVzIHRoYXQgdGhlIGdlbmVyYXRvcnMgYmVsb3cgcmV3cml0ZS5cbiAgICBhd2FpdCBmaXhUeXBvc1Byb21pc2U7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGZpeFJhaWx3YXlpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgLi4uKHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPyBbZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC8vIEdpdCBob29rcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBzdGF0ZTogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3Qgd3JpdGUgYVxuICAgICAgLy8gY2hpbGQgbGVmdGhvb2sueW1sIG9yIHJlcGxhY2UgdGhlIGVuY2xvc2luZyByZXBvc2l0b3J5J3MgaG9vayBpbnN0YWxsYXRpb24uXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc1Jvb3QgPyBbZ2VuZXJhdGVMZWZ0aG9vayhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyldIDogW10pLFxuICAgIF0pO1xuICAgIC8vIEFmdGVyIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgKGFuZCBpdHMgcG9vbGVkIHdyaXRlcykgc28gdGhlIGluc3RydWN0aW9uIGZpbGVzIGRlc2NyaWJlIHRoZVxuICAgIC8vIGZpbmFsaXplZCB3b3JrZmxvdyBmaWxlcyBpbnN0ZWFkIG9mIGxhZ2dpbmcgb25lIHJ1biBiZWhpbmQuXG4gICAgYXdhaXQgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmNoYWtyYSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkphdmEoY29uZmlnKSkgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIHNraXBEZXBzKTtcblxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiYgZG9lc0NvbnRhaW5Kc09yVHMocm9vdENvbmZpZykpIHtcbiAgICAgICAgLy8gTW9ub3JlcG8gdmVyaWZpY2F0aW9uIGNhbiBpbnZva2Ugb3hsaW50IGZyb20gZXZlcnkgd29ya3NwYWNlLiBHaXZlXG4gICAgICAgIC8vIG5vbi1jb2RlIHBhY2thZ2VzIGEgbG9jYWwgY29uZmlnIHNvIG94bGludCBkb2VzIG5vdCBjbGltYiB0byB0aGVcbiAgICAgICAgLy8gcm9vdCBjb25maWcgYW5kIHJlamVjdCByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIGZyb20gYSBwYWNrYWdlIGN3ZC5cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgLy8gUnVuIGFmdGVyIGV2ZXJ5IHBvb2xlZCBnZW5lcmF0b3Igd3JpdGUgc28gbm9ybWFsaXphdGlvbiBjYW5ub3Qgb3ZlcndyaXRlIGEgY29uY3VycmVudFxuICAgIC8vIHVwZGF0ZSwgYW5kIGJlZm9yZSBjbGVhbnVwIHNvIGZvcm1hdHRlciBtZXRhZGF0YSBjYWNoZXMgb2JzZXJ2ZSB0aGUgY2hhbmdlZCBmaWxlcy5cbiAgICByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMocm9vdERpclBhdGgpO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIHRyeSB7XG4gICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgZmFpbGVkIGluc3RhbGwgbXVzdCBmYWlsIHRoZSBDTEk6IGV4aXRpbmcgMCB3aXRoIGEgc3RhbGUgb3IgbWlzc2luZyBCdW4gbG9ja2ZpbGUgd291bGRcbiAgICAgIC8vIGhpZGUgYSBicm9rZW4gbWFuYWdlZCBjb25maWd1cmF0aW9uLlxuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlZnJlc2ggdGhlIEJ1biBsb2NrZmlsZTonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJ1biB3cml0ZXMgYnVuLmxvY2sgYmVmb3JlIGxpZmVjeWNsZSBzY3JpcHRzLCBzbyBhIGZhaWxlZCBpbnN0YWxsIGNhbiBzdGlsbCBsZWF2ZSBHdWFyZFxuICAgICAgLy8gVVJMcyBiZWhpbmQuIE5vcm1hbGl6ZSBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgb3V0cHV0IHdpdGhvdXQgcmVwbGFjaW5nIHRoZSBpbnN0YWxsIGVycm9yLlxuICAgICAgY29uc3Qgbm9ybWFsaXplZExvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgICAgIGlmIChub3JtYWxpemVkTG9ja2ZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICR7bm9ybWFsaXplZExvY2tmaWxlUGF0aH0gdG8ga2VlcCBpdCByZWdpc3RyeS1hZ25vc3RpYy5gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIG5vcm1hbGl6ZSB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICBzcGF3blN5bmMoJ2J1bicsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnO1xufVxuXG4vKipcbiAqIFByb2JlcyBgYnVuIGluc3RhbGxgIHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuIEFuIGluY29tcGF0aWJpbGl0eSBtdXN0IGJlIGZpeGVkIGluIHRoZVxuICogcmVwb3NpdG9yeSBvciBpbiB3YmZ5J3MgbWFuYWdlZCBsaXN0cywgbmV2ZXIgYnkgc3dpdGNoaW5nIHRoZSBsaW5rZXIuIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVcbiAqIGluc3RhbGwgZmFpbHMuXG4gKi9cbmZ1bmN0aW9uIHByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICB1c2VHbG9iYWxTdG9yZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIC8vIEEgbGF5b3V0IHN3aXRjaCBtdXN0IHByb2JlIGZyb20gYSBjbGVhbiB0cmVlIGJlY2F1c2UgQnVuIGRvZXMgbm90IHJlbW92ZSB0aGUgcHJldmlvdXMgbGF5b3V0J3MgbGVmdG92ZXJzLlxuICBpZiAocHJldmlvdXNHbG9iYWxTdG9yZSAhPT0gdXNlR2xvYmFsU3RvcmUpIHtcbiAgICByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aCwgcm9vdENvbmZpZyk7XG4gIH1cbiAgLy8gUmV0cnkgb25jZSBzbyBhIHRyYW5zaWVudCBmYWlsdXJlIChyZWdpc3RyeSBoaWNjdXAsIGZsYWt5IGxpZmVjeWNsZSBzY3JpcHQpIGRvZXMgbm90XG4gIC8vIG1hc3F1ZXJhZGUgYXMgYSBsYXlvdXQgaW5jb21wYXRpYmlsaXR5LlxuICBpZiAoc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBDbGVhbiB1cCB0aGUgZmFpbGVkIGF0dGVtcHQgc28gbGF0ZXIgaW5zdGFsbHMgZG8gbm90IHJ1biBvbiBhIHBvbGx1dGVkIHRyZWUuXG4gIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aDogc3RyaW5nLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIENvdmVyIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZTogbGVmdG92ZXJzIGNhbiBrZWVwIHBoYW50b20gZGVwZW5kZW5jaWVzIHJlc29sdmFibGUuXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aHMgPSBbXG4gICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJyksXG4gICAgLi4uWy4uLmdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLnZhbHVlcygpXS5tYXAoKHdvcmtzcGFjZURpcikgPT5cbiAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgd29ya3NwYWNlRGlyLCAnbm9kZV9tb2R1bGVzJylcbiAgICApLFxuICBdO1xuICAvLyBOZXZlciBkZWxldGUgdGhyb3VnaCBhIHdvcmtzcGFjZSBzeW1saW5rIHRoYXQgZXNjYXBlcyB0aGlzIHJlcG9zaXRvcnkuXG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNQYXRoIG9mIG5vZGVNb2R1bGVzUGF0aHMpIHtcbiAgICBjb25zdCByZWFsUGFyZW50RGlyUGF0aCA9IGlnbm9yZUVycm9yKCgpID0+IGZzLnJlYWxwYXRoU3luYyhwYXRoLmRpcm5hbWUobm9kZU1vZHVsZXNQYXRoKSkpO1xuICAgIGlmIChcbiAgICAgICFyZWFsUGFyZW50RGlyUGF0aCB8fFxuICAgICAgKHJlYWxQYXJlbnREaXJQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiYgIXJlYWxQYXJlbnREaXJQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoLCAxKTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzQ5LDUwLDUxLDUyLDUzLDU0XSwibWFwcGluZ3MiOiJvL0JBV0EsTUFBYSxHQUFvRCxDQUMvRCxDQUNFLFFBQVMsTUFDVCxZQUFhLHNHQUNmLEVBQ0EsQ0FDRSxRQUFTLGVBQ1QsWUFDRSxxbkJBQ0osRUFDQSxDQUNFLFFBQVMsbUJBQ1QsWUFDRSw0R0FDSixFQUNBLENBQ0UsUUFBUyxvQkFDVCxZQUNFLHlLQUNK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
|
|
521
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImNoaWxkX3Byb2Nlc3MiLCJpc1BsYWluT2JqZWN0IiwiZnMiLCJ5YW1sIiwieWFtbCIsInBhcnNlSnNvbmMiLCJmc3AiLCJyZWxlYXNlQWdlR2F0ZS5kYXlzIiwicmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMiLCJyZWxlYXNlQWdlR2F0ZS50ZW1wb3JhcnlFeGNsdWRlcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJjb21tb25Db250ZW50Iiwic29ydE9iamVjdEtleXMiLCJnaXRIb29rcyIsImRldGVjdE5ld2xpbmUiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJjb3JlIiwieWFtbCIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50IiwieWFtbCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL2dpdGh1YlRlbXBsYXRlcy50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy90ZXh0LnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvdGVzdGluZ1J1bGVzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9idW5Xb3Jrc3BhY2VzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lcnJuby50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvd3JpdGVGaWxlQXRvbWljLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9idW5Mb2NrZmlsZS50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZG9ja2VyZmlsZS50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZ2xvYi50cyIsIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvdXRpbHMvdHlwZXNjcmlwdEFwaS50cyIsIi4uL3NyYy9maXhlcnMvbmV4dENvbmZpZy50cyIsIi4uL3NyYy9maXhlcnMvY2hha3JhVG9hc3Rlci50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Zub3hUb21sLnRzIiwiLi4vc3JjL3V0aWxzL21lcmdlVXRpbC50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3dvcmtzcGFjZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvc2hlbGxQYXJzZXIudHMiLCIuLi9zcmMvdXRpbHMveWFtbFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvd1J1bm5lclBvbGljeS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2pzb25jVXRpbC50cyIsIi4uL3NyYy91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dsb2JhbFJlbGVhc2VBZ2VHYXRlLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL3V0aWxzL2dlbkkxOG5Ucy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9zb3J0LW9iamVjdC1rZXlzQDIuMS4wLTE4ZGYyZjgzN2U2ZWMyOWEvbm9kZV9tb2R1bGVzL3NvcnQtb2JqZWN0LWtleXMvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LWluZGVudEA3LjAuMi02Yjc1ZGMwZjU2NTMzYmQ5L25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2RldGVjdC1uZXdsaW5lQDQuMC4xLTVkYTlkZjY1MTI1ZWU3OTUvbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL2dpdC1ob29rcy1saXN0QDQuMi4xLTZjYTJiMjY5ZDkxNjMzMmUvbm9kZV9tb2R1bGVzL2dpdC1ob29rcy1saXN0L2luZGV4Lmpzb24iLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvaXMtcGxhaW4tb2JqQDQuMS4wLTQ3ZmRkZDc3MDY0OGU1Nzcvbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9zb3J0LXBhY2thZ2UtanNvbkA0LjAuMC04M2QwYWZmY2JiOWIzYzg1L25vZGVfbW9kdWxlcy9zb3J0LXBhY2thZ2UtanNvbi9pbmRleC5qcyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9sZWZ0aG9vay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2NvbmZpZ0NvbnRlbnQudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9tYW5hZ2VkQ29uZmlnQmxvY2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGZtdENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294bGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JhaWx3YXlpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWFkbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWxlYXNlcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb25jLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy91c2VyQWdlbnRDb25maWdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93YkVudi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21pc2VUb21sLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbnBtcmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9ydWxlc2V0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc2VjdGlvbiBvZiBhIFBSIG9yIGlzc3VlIGJvZHk6IGl0cyBoZWFkaW5nIGFuZCB3aGF0IHRoZSBzZWN0aW9uIG11c3Qgc3RhdGUuIGByZXF1aXJlbWVudGBcbiAqIHN0YXJ0cyBsb3dlcmNhc2UgYW5kIGVuZHMgd2l0aG91dCBwdW5jdHVhdGlvbiwgc28gdGhhdCBpdCByZWFkcyBib3RoIGFzIGEgcGxhY2Vob2xkZXIgc2VudGVuY2VcbiAqIChjYXBpdGFsaXplZCwgd2l0aCBhIHBlcmlvZCBhcHBlbmRlZCkgYW5kIGFzIGEgY2hlY2tsaXN0IGNsYXVzZSBhZnRlciB0aGUgaGVhZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVNlY3Rpb24ge1xuICByZWFkb25seSBoZWFkaW5nOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcXVpcmVtZW50OiBzdHJpbmc7XG59XG5cbi8qKiBTZWN0aW9ucyBvZiBhIHB1bGwgcmVxdWVzdCBib2R5LCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIFBSIHRlbXBsYXRlLiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHtcbiAgICBoZWFkaW5nOiAnV2h5JyxcbiAgICByZXF1aXJlbWVudDogJ3RoZSBwcm9ibGVtLCB3aXRoIHRoZSBudW1iZXJzIG9yIG9ic2VydmF0aW9ucyBiZWhpbmQgaXQsIGFuZCB3aHkgdGhpcyBhcHByb2FjaCBvdmVyIHRoZSBhbHRlcm5hdGl2ZXMnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1JlcXVpcmVtZW50cycsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICBcInRoZSByZXF1aXJlbWVudHMgdGhlIGNoYW5nZSBtdXN0IHNhdGlzZnkgYW5kIHRoZSBndWFyYW50ZWVzIGl0IG11c3Qga2VlcCBhcyB0aGV5IHN0YW5kIG5vdywgb25lIHBlciBsaW5lLCBlYWNoIG1hcmtlZCBgcmVxdWlyZWRgIChhc2tlZCBmb3IgYnkgdGhlIHJlcXVlc3Rlciwgb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24pIG9yIGBjaG9zZW5gICh0aGUgaW1wbGVtZW50ZXIncyBvd24gZGVjaXNpb24gd2l0aCB0aGUgcmVhc29uIHRoYXQgZGVjaWRlZCBpdCwgd2hpY2ggYSBzaW1wbGVyIGRlc2lnbiBtYXkgcmVwbGFjZSk7IHN0YXRlIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgaW4gdGhlIHJlcXVlc3RlcidzIHRlcm1zLCB3aGV0aGVyIHRoZXkgY2FtZSBmcm9tIGFuIGlzc3VlIG9yIGEgY29udmVyc2F0aW9uLCBhbmQga2VlcCBlYWNoIGxpbmUgYXMgaXQgaXMgdW50aWwgdGhlIHJlcXVlc3RlciBvdmVycmlkZXMgb3Igd2l0aGRyYXdzIHRoZSBpbnN0cnVjdGlvbiBiZWhpbmQgaXQgb3IgdGhlIGRlY2lzaW9uIGJlaGluZCBpdCBjaGFuZ2VzLCBhbmQgdGhlbiByZXdyaXRlIG9yIHJlbW92ZSB0aGF0IGxpbmUgaW5zdGVhZCBvZiBhZGRpbmcgb25lIGJlc2lkZSBpdFwiLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0N1c3RvbWVyIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2JlaGF2aW9yLCB3b3JrZmxvdywgb3IgdXNlci12aXNpYmxlIGNoYW5nZXMsIHdyaXR0ZW4gZm9yIHJlYWRlcnMgd2hvIGtub3cgbm90aGluZyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24nLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1RlY2huaWNhbCBTdW1tYXJ5JyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgICdkZWNpc2lvbnMgYW5kIHRoZWlyIHJlYXNvbnMsIGRhdGEgZmxvdywgd2hlcmUgdG8gbG9vayAodGhlIGZpbGVzIHRoYXQgbWF0dGVyIG1vc3QpLCBhbmQgd2hhdCB0byBjaGVjayBoYXJkZXN0OiB0aGUgcGFydHMgd2hvc2UgY29ycmVjdG5lc3MgaXMgYXJndWVkIHJhdGhlciB0aGFuIHByb3ZlbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVzdGluZycsXG4gICAgcmVxdWlyZW1lbnQ6ICdjb21tYW5kcyBydW4sIHRlc3RzIGFkZGVkLCBhbmQgd2hhdCB3YXMgTk9UIGV4ZXJjaXNlZCBhbmQgd2h5JyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdOb3RlcycsXG4gICAgcmVxdWlyZW1lbnQ6ICdrbm93biBsaW1pdGF0aW9ucywgY29tcGF0aWJpbGl0eSBhbmQgbWlncmF0aW9uLCBmb2xsb3ctdXAgd29yazsgZGVsZXRlIHRoaXMgc2VjdGlvbiBpZiB0aGVyZSBpcyBub25lJyxcbiAgfSxcbl07XG5cbi8qKlxuICogSG93IGEgdG9vbCB0aGF0IHdyaXRlcyBvciByZXdyaXRlcyBhIFBSIGJvZHkgZGVyaXZlcyBpdCBmcm9tIHRoZSByZXBvc2l0b3J5J3MgUFIgdGVtcGxhdGUsIGFzXG4gKiBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy4gU3RhdGVkIG9uY2UgaGVyZSBhbmQgcmVuZGVyZWQgYnkgZXZlcnkgd3JpdGVyICh0aGVcbiAqIGdlbmVyYXRlZCBhZ2VudCBpbnN0cnVjdGlvbnMsIHRoZSBQUi1kcmFmdGluZyBza2lsbHMpIHNvIHRoZSB3cml0ZXJzIGNhbm5vdCBkcmlmdCBhcGFydDsgdGhlXG4gKiB0ZW1wbGF0ZS1sZXNzIGJyYW5jaCBsZXRzIHRoZSBzYW1lIHRleHQgc2VydmUgcmVwb3NpdG9yaWVzIG91dHNpZGUgdGhlIG9yZ2FuaXphdGlvbi5cbiAqL1xuY29uc3QgUFVMTF9SRVFVRVNUX1RFTVBMQVRFX1JVTEVTID0gYC0gQmFzZSB0aGUgUFIgYm9keSBvbiBcXGAuZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZFxcYCB3aGVuIGNyZWF0aW5nIG9yIHVwZGF0aW5nIGEgUFIsIGV2ZW4gd2hlbiBhIHNraWxsIG9yIHdvcmtmbG93IHN1cHBsaWVzIGl0cyBvd24gc2tlbGV0b246IGtlZXAgdGhlIHRlbXBsYXRlJ3MgaGVhZGluZ3MgaW4gb3JkZXIsIGZpbGwgZWFjaCBzZWN0aW9uIHdpdGggd2hhdCBpdHMgcGxhY2Vob2xkZXIgY29tbWVudCBhc2tzIGZvciBhdCBhIGxlbmd0aCBmaXR0aW5nIHRoZSBjaGFuZ2UgKGEgc2VudGVuY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBudW1iZXJlZCBzdWJzZWN0aW9ucyBmb3IgYSBsYXJnZSBvbmUpLCBhbmQgZGVsZXRlIHRoZSBwbGFjZWhvbGRlciBjb21tZW50cyBhbmQgYW4gZW1wdHkgTm90ZXMgc2VjdGlvbi4gV2l0aG91dCBhIHRlbXBsYXRlLCB1c2Ugbm8gZml4ZWQgaGVhZGluZ3M6IHN0YXRlIHRoZSBzY29wZSwgdGhlIG1vdGl2YXRpb24sIGFuZCB0aGUgdmVyaWZpY2F0aW9uIGNvbmNpc2VseS5cbi0gU3RhcnQgdGhlIGJvZHkgd2l0aCBcXGBDbG9zZSAjPG4+XFxgIG9ubHkgd2hlbiB0aGUgUFIgcmVzb2x2ZXMgYW4gZXhpc3RpbmcgaXNzdWUuYDtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgd3JpdGVzIG9yIHJld3JpdGVzIGEgUFIgYm9keSBmaWxscyB0aGUgUmVxdWlyZW1lbnRzIHNlY3Rpb24gb2ZcbiAqIGBQVUxMX1JFUVVFU1RfU0VDVElPTlNgLCBhcyBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy4gU2tpbGxzIHRoYXQgZHJhZnQgUFJcbiAqIGJvZGllcyByZW5kZXIgdGhpcyB0ZXh0IGluc3RlYWQgb2YgcmVzdGF0aW5nIGl0LCBzbyB0aGUgd3JpdGVycyBhbmQgdGhlIHJldmlld2VycyB0aGF0IHJlYWQgdGhlXG4gKiBzZWN0aW9uIGFzIHRoZSBib3VuZGFyeSBhIGZpeCBtdXN0IGtlZXAgbmV2ZXIgZGlzYWdyZWUgb24gd2hhdCBhIGxpbmUgbWVhbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfUkVRVUlSRU1FTlRTX1JVTEVTID0gYC0gUmVxdWlyZW1lbnRzIHNlY3Rpb246IHRoZSByZXF1aXJlbWVudHMgaW4gZm9yY2Ugbm93LCBvbmUgbGluZSBwZXIgcmVxdWlyZW1lbnQsIHRha2VuIGZyb20gdGhlIHJlcXVlc3RlcidzIGluc3RydWN0aW9ucyBpbiB0aGUgcmVxdWVzdGVyJ3MgdGVybXMgKHRoZSBpc3N1ZSwgdGhlIGNvbnZlcnNhdGlvbiB0aGF0IGFza2VkIGZvciB0aGUgY2hhbmdlKSwgZWFjaCBtYXJrZWQgXFxgcmVxdWlyZWRcXGAgKGFza2VkIGZvciwgb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24pIG9yIFxcYGNob3NlblxcYCAoeW91ciBvd24gZGVjaXNpb24gd2l0aCB0aGUgcmVhc29uIHRoYXQgZGVjaWRlZCBpdCwgd2hpY2ggYSBzaW1wbGVyIGRlc2lnbiBtYXkgcmVwbGFjZSkuIE5ldmVyIGluZmVyIGEgcmVxdWlyZW1lbnQgZnJvbSB0aGUgZGlmZjogd2hlbiBubyBpc3N1ZSwgUFIgbWVzc2FnZSwgb3IgY29udmVyc2F0aW9uIHN0YXRlcyB0aGUgcmVxdWVzdCwgd3JpdGUgXFxgcmVxdWlyZWQ6IG5vdCByZWNvcmRlZCDigJQgYXNrIHRoZSByZXF1ZXN0ZXJcXGAgYXMgdGhlIG9ubHkgcmVxdWVzdC1kZXJpdmVkIGxpbmUgKGEgXFxgcmVxdWlyZWRcXGAgbGluZSBmb3IgYW4gZXhpc3RpbmcgY29udHJhY3QgY2FsbGVycyBkZXBlbmQgb24gbWF5IHN0aWxsIGJlIGxpc3RlZCkgYW5kIHNheSBzbyBpbiBOb3Rlcy5cbi0gQ3VycmVudC1zdGF0ZSBydWxlOiBhbiBleGlzdGluZyBSZXF1aXJlbWVudHMgc2VjdGlvbiByZWNvcmRzIHdoYXQgdGhlIHJlcXVlc3RlciBhc2tlZCBmb3IgYW5kIHdoYXQgd2FzIGRlY2lkZWQgYXMgaXQgc3RhbmRzIG5vdzsgaXQgaXMgbmVpdGhlciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkaWZmIG5vciBhIGxvZyBvZiBob3cgdGhlIHJlcXVlc3QgZXZvbHZlZC4gS2VlcCBlYWNoIGxpbmUgYXMgaXQgaXMgdW50aWwgdGhlIHJlcXVlc3RlciBvdmVycmlkZXMgb3Igd2l0aGRyYXdzIHRoZSBpbnN0cnVjdGlvbiBiZWhpbmQgaXQgb3IgdGhlIGRlY2lzaW9uIGJlaGluZCBpdCBjaGFuZ2VzLCBhbmQgdGhlbiByZXdyaXRlIG9yIHJlbW92ZSB0aGF0IGxpbmUgaW5zdGVhZCBvZiBhcHBlbmRpbmcgYSBsaW5lIGJlc2lkZSBpdDsgd2l0aCBubyBpbnN0cnVjdGlvbnMgYXZhaWxhYmxlLCBrZWVwIHRoZSByZXF1ZXN0ZXItZGVyaXZlZCBsaW5lcyB1bmNoYW5nZWQuIE5ldmVyIG1hcmsgd2hlbiBhIGxpbmUgd2FzIGFkZGVkIChlLmcuLCBcIihhZGRlZClcIiksIGFuZCBhZGQgYSBcXGBjaG9zZW5cXGAgbGluZSBmb3IgZWFjaCBuZXcgZGVjaXNpb24uIFdoZW4gdGhlIGN1cnJlbnQgZGVzaWduIGNhbm5vdCBiZSB1bmRlcnN0b29kIHdpdGhvdXQgdGhlIGNoYW5nZSBvZiBkaXJlY3Rpb24sIHN0YXRlIGl0IGluIG9uZSBzZW50ZW5jZSBpbiBOb3Rlcy4gQSBzZWN0aW9uIHRoYXQgbWVyZWx5IGRlc2NyaWJlcyB0aGUgaW1wbGVtZW50YXRpb24sIG9yIGhvbGRzIG9ubHkgdGhlIHRlbXBsYXRlJ3MgcGxhY2Vob2xkZXIgb3IgYSBcXGByZXF1aXJlZDogbm90IHJlY29yZGVkXFxgIGxpbmUsIGlzIG5vdCBhIHJlY29yZDogd3JpdGUgaXQgYWZyZXNoIGJ5IHRoZSBydWxlIGFib3ZlLlxuLSBQbGFjZSB0aGUgc2VjdGlvbiB3aGVyZSB0aGUgdGVtcGxhdGUgcHV0cyBpdDsgd2hlbiB0aGUgdGVtcGxhdGUgaGFzIG5vIHN1Y2ggaGVhZGluZywgcmlnaHQgYWZ0ZXIgdGhlIGlzc3VlLWNsb3NpbmcgbGluZSwgb3IgYXQgdGhlIHRvcCBvZiB0aGUgYm9keSB3aGVuIHRoZXJlIGlzIG5vbmUuXG4tIE5ldmVyIGRyb3Agb3Igd2Vha2VuIGEgXFxgcmVxdWlyZWRcXGAgbGluZSB0byBmaXQgd2hhdCB3YXMgaW1wbGVtZW50ZWQ6IHdoZW4gb25lIGNhbm5vdCBob2xkIGluIHRoZSBkaWZmLCBrZWVwIGl0IGFuZCBzYXkgc28gaW4gTm90ZXMuYDtcblxuLyoqIFRoZSBjb21wbGV0ZSBydWxlcyBmb3Igd3JpdGluZyBhIFBSIGJvZHk6IHRoZSB0ZW1wbGF0ZSBydWxlcyBmb2xsb3dlZCBieSB0aGUgUmVxdWlyZW1lbnRzIHJ1bGVzLiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9CT0RZX1JVTEVTID0gYCR7UFVMTF9SRVFVRVNUX1RFTVBMQVRFX1JVTEVTfVxcbiR7UFVMTF9SRVFVRVNUX1JFUVVJUkVNRU5UU19SVUxFU31gO1xuXG4vKipcbiAqIEhvdyBhIHRvb2wgdGhhdCBjcmVhdGVzIGFuIGlzc3VlIGRlcml2ZXMgaXQgZnJvbSB0aGUgcmVwb3NpdG9yeSdzIGlzc3VlIHRlbXBsYXRlcywgYXMgbWFya2Rvd25cbiAqIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zOyBzaGFyZWQgYnkgdGhlIHNhbWUgd3JpdGVycyBhcyBgUFVMTF9SRVFVRVNUX0JPRFlfUlVMRVNgLlxuICogR3VpZGFuY2UgdGhlIHRlbXBsYXRlcyBzdGF0ZSBpbiB0aGVpciBvd24gcGxhY2Vob2xkZXIgY29tbWVudHMgKHdoaWNoIHNlY3Rpb25zIHRvIGtlZXAsIGRlbGV0aW5nXG4gKiB0aGUgY29tbWVudHMpIGlzIGRlbGliZXJhdGVseSBub3QgcmVwZWF0ZWQgaGVyZSwgc2luY2UgdGhlIHdyaXRlciByZWFkcyB0aGUgdGVtcGxhdGUgYW55d2F5LlxuICovXG5leHBvcnQgY29uc3QgSVNTVUVfVEVNUExBVEVfUlVMRVMgPSBgLSBGb2xsb3cgdGhlIGNsb3Nlc3QgdGVtcGxhdGUgdW5kZXIgXFxgLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9cXGA6IFxcYGJ1Zy5tZFxcYCBmb3Igd3JvbmcgYmVoYXZpb3IsIFxcYGNoYW5nZS5tZFxcYCBmb3IgYW55dGhpbmcgdG8gYnVpbGQgb3IgYWx0ZXI7IGEgcXVlc3Rpb24gb3Igbm90ZSBmaXR0aW5nIG5laXRoZXIsIG9yIGEgcmVwb3NpdG9yeSB3aXRob3V0IHRlbXBsYXRlcywgbmVlZHMgbm8gdGVtcGxhdGUuXG4tIFRpdGxlOiBhIENvbnZlbnRpb25hbCBDb21taXRzIHByZWZpeCBmb3IgdGhlIHR5cGUgdGhhdCBmaXRzIHRoZSBjaGFuZ2UgKFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgLCBcXGByZWZhY3RvcjpcXGAsIFxcYGRvY3M6XFxgLCBcXGBjaG9yZTpcXGAsIC4uLik7IHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSB0ZW1wbGF0ZSdzIFxcYHRpdGxlXFxgIHByZWZpeCwgcmVwbGFjZSB0aGUgdGVtcGxhdGUncyB0eXBlIGxhYmVsIChcXGB0OiAuLi5cXGApIHdpdGggdGhlIG9uZSBtYXRjaGluZyB0aGUgdHlwZS5cbi0gVGhlIFlBTUwgZnJvbnQgbWF0dGVyIGJldHdlZW4gdGhlIFxcYC0tLVxcYCBsaW5lcyBpcyBtZXRhZGF0YSwgbm90IGJvZHkgdGV4dDogcGFzcyBpdHMgXFxgbGFiZWxzXFxgIHZpYSBcXGAtLWxhYmVsXFxgIGFuZCBzdWJtaXQgb25seSB0aGUgY29udGVudCBiZWxvdyB0aGUgY2xvc2luZyBcXGAtLS1cXGAgYXMgdGhlIGJvZHkuYDtcblxuLyoqIFNlY3Rpb25zIG9mIGEgYnVnIHJlcG9ydCwgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBpc3N1ZSB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBjb25zdCBCVUdfSVNTVUVfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7IGhlYWRpbmc6ICdQcm9ibGVtJywgcmVxdWlyZW1lbnQ6ICd3aGF0IGhhcHBlbnMsIGFuZCB3aGF0IHNob3VsZCBoYXBwZW4gaW5zdGVhZCcgfSxcbiAgeyBoZWFkaW5nOiAnRXZpZGVuY2UnLCByZXF1aXJlbWVudDogJ3JlcHJvZHVjdGlvbiBzdGVwcywgbG9ncywgcnVuIElEcywgb3IgbGlua3MnIH0sXG4gIHsgaGVhZGluZzogJ0ltcGFjdCcsIHJlcXVpcmVtZW50OiAnd2hvIG9yIHdoYXQgaXMgYWZmZWN0ZWQsIGFuZCBob3cgYmFkbHknIH0sXG4gIHsgaGVhZGluZzogJ1Byb3Bvc2FsJywgcmVxdWlyZW1lbnQ6ICd0aGUgZml4IHlvdSBoYXZlIGluIG1pbmQsIGFuZCB0aGUgcm9vdCBjYXVzZSBpZiBrbm93bicgfSxcbl07XG5cbi8qKlxuICogU2VjdGlvbnMgYSBjaGFuZ2Ugc3BlY2lmaWNhdGlvbiBtdXN0IHNldHRsZSBiZWZvcmUgYSB0aGlyZCBwYXJ0eSBjYW4gaW1wbGVtZW50IGl0LCBkZWZpbmVkXG4gKiBvbmNlIHNvIHRoYXQgdGhlIGlzc3VlIHRlbXBsYXRlIGFuZCBhbnkgdG9vbCB0aGF0IGRyYWZ0cyBvciByZXZpZXdzIHNwZWNpZmljYXRpb25zIGFnYWluc3RcbiAqIHRoZXNlIHNlY3Rpb25zIGNhbm5vdCBkcmlmdCBhcGFydDsgY2hlY2tsaXN0IGNvbnN1bWVycyByZW5kZXIgaXQgd2l0aCBgcmVuZGVyU2VjdGlvbkNoZWNrbGlzdGAuXG4gKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgc3VmZmljZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIHNvIHRoZXkgY29tZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IENIQU5HRV9JU1NVRV9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHtcbiAgICBoZWFkaW5nOiAnQmFja2dyb3VuZCBhbmQgZ29hbCcsXG4gICAgcmVxdWlyZW1lbnQ6ICd0aGUgcHJvYmxlbSBiZWluZyBzb2x2ZWQsIGZvciB3aG9tLCBhbmQgd2hhdCBvdXRjb21lIGNvdW50cyBhcyBzdWNjZXNzJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdCZWhhdmlvcicsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnZXZlcnkgdXNlci0gb3IgY2FsbGVyLW9ic2VydmFibGUgYmVoYXZpb3IsIGluY2x1ZGluZyBpbnB1dHMsIG91dHB1dHMsIGVycm9yIGNhc2VzLCBlZGdlIGNhc2VzLCBhbmQgaW50ZXJhY3Rpb25zIHdpdGggZXhpc3RpbmcgYmVoYXZpb3IsIHN0YXRlZCBwcmVjaXNlbHkgZW5vdWdoIHRoYXQgdHdvIGltcGxlbWVudGVycyB3b3VsZCBidWlsZCB0aGUgc2FtZSB0aGluZycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQWNjZXB0YW5jZSBjcml0ZXJpYScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnY2hlY2thYmxlIGNvbmRpdGlvbnMgKEdpdmVuL1doZW4vVGhlbiBvciBhbiBlcXVpdmFsZW50KSB0aGF0IGRlY2lkZSB3aGV0aGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkb25lJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdTY29wZSBhbmQgbm9uLWdvYWxzJyxcbiAgICByZXF1aXJlbWVudDogJ3doYXQgdGhlIGNoYW5nZSBjb3ZlcnMgYW5kIHdoYXQgaXQgZGVsaWJlcmF0ZWx5IGxlYXZlcyBvdXQsIHNvIGFuIGltcGxlbWVudGVyIGtub3dzIHdoZXJlIHRvIHN0b3AnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0Rlc2lnbiBjb25zdHJhaW50cycsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAndGhlIGRhdGEsIEFQSSwgc2NoZW1hLCBVSSwgYW5kIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgbmFtaW5nLCBhbmQgdGhlIGV4aXN0aW5nIGNvZGUgb3IgY29udmVudGlvbnMgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgZml0IOKAlCBhcyBmYXIgYXMgdGhlIHdyaXRlciBpbnRlbmRzIHRvIGNvbnN0cmFpbiB0aGVtLCB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBleHBsaWNpdGx5IGxlZnQgdG8gdGhlIGltcGxlbWVudGVyJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdDb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24nLFxuICAgIHJlcXVpcmVtZW50OiAnd2hhdCBleGlzdGluZyBkYXRhLCB1c2VycywgY2FsbGVycywgb3IgY29uZmlndXJhdGlvbnMgYXJlIGFmZmVjdGVkIGFuZCBob3cgdGhlIHRyYW5zaXRpb24gaGFwcGVucycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVmVyaWZpY2F0aW9uJyxcbiAgICByZXF1aXJlbWVudDogJ2hvdyB0aGUgY2hhbmdlIGlzIHRlc3RlZCBvciBkZW1vbnN0cmF0ZWQsIGluY2x1ZGluZyB3aGF0IG5lZWRzIG5vIHRlc3QgYW5kIHdoeScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnT3BlbiBxdWVzdGlvbnMnLFxuICAgIHJlcXVpcmVtZW50OiAndW5kZWNpZGVkIHBvaW50cywgZWFjaCB3aXRoIGl0cyBvcHRpb25zOyBlbXB0eSBvbmNlIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGltcGxlbWVudGFibGUnLFxuICB9LFxuXTtcblxuLyoqIFJlbmRlcnMgc2VjdGlvbnMgYXMgbWFya2Rvd24gYnVsbGV0cyAoYC0gKipIZWFkaW5nKio6IHJlcXVpcmVtZW50YCkuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU2VjdGlvbkNoZWNrbGlzdChzZWN0aW9uczogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiBgLSAqKiR7c2VjdGlvbi5oZWFkaW5nfSoqOiAke3NlY3Rpb24ucmVxdWlyZW1lbnR9YCkuam9pbignXFxuJyk7XG59XG5cbi8qKiBSZW5kZXJzIHNlY3Rpb25zIGFzIG1hcmtkb3duIGhlYWRpbmdzLCBlYWNoIGZvbGxvd2VkIGJ5IGl0cyByZXF1aXJlbWVudCBhcyBhIHBsYWNlaG9sZGVyIGNvbW1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU2VjdGlvblRlbXBsYXRlKHNlY3Rpb25zOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9uc1xuICAgIC5tYXAoXG4gICAgICAoc2VjdGlvbikgPT5cbiAgICAgICAgYCMjICR7c2VjdGlvbi5oZWFkaW5nfVxcblxcbjwhLS0gJHtzZWN0aW9uLnJlcXVpcmVtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7c2VjdGlvbi5yZXF1aXJlbWVudC5zbGljZSgxKX0uIC0tPmBcbiAgICApXG4gICAgLmpvaW4oJ1xcblxcbicpO1xufVxuIiwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgLy8gYEpTT04uc3RyaW5naWZ5YCBhbnN3ZXJzIGB1bmRlZmluZWRgIGZvciBgdW5kZWZpbmVkYCwgYSBzeW1ib2wgYW5kIGEgZnVuY3Rpb24sIGFuZCB0aHJvd3NcbiAgLy8gb24gYSBiaWdpbnQgb3IgYSBjeWNsZTsgYG5ldyBFcnJvcih1bmRlZmluZWQpYCBoYXMgYW4gZW1wdHkgbWVzc2FnZSwgd2hpY2ggd291bGQgZHJvcCB0aGVcbiAgLy8gb25seSBkaWFnbm9zdGljIGEgY2FsbGVyIGhhcyBhYm91dCBzdWNoIGEgdGhyb3duIHZhbHVlLiBOZWl0aGVyIHJlcHJlc2VudGF0aW9uIG1heSB0aHJvd1xuICAvLyBvdXQgb2YgaGVyZTogdGhpcyBydW5zIGluIGEgY2F0Y2ggYmxvY2ssIHdoZXJlIGl0IHdvdWxkIHJlcGxhY2UgdGhlIGVycm9yIGl0IGNvbnZlcnRzLlxuICByZXR1cm4gbmV3IEVycm9yKGlnbm9yZUVycm9yKCgpID0+IEpTT04uc3RyaW5naWZ5KG9iaikpID8/IGlnbm9yZUVycm9yKCgpID0+IFN0cmluZyhvYmopKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWVzc2FnZSBvZiBhIHRocm93biBgRXJyb3JgOyBmb3IgYW55IG90aGVyIHRocm93biB2YWx1ZSwgYGZhbGxiYWNrYCBpZiBnaXZlbiwgb3IgZWxzZSBpdHMgc3RyaW5nIGZvcm0uXG4gKiBgZmFsbGJhY2tgIGlzIGFsc28gcmV0dXJuZWQgd2hlbiByZWFkaW5nIHRoZSBtZXNzYWdlIHRocm93cy4gTmV2ZXIgdGhyb3dzLCBzbyBpdCBpcyBzYWZlIHRvIGNhbGwgaW4gYSBjYXRjaCBibG9jay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93biwgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBgU3RyaW5nYCB0aHJvd3MgZm9yIGFuIG9iamVjdCB3aXRob3V0IGEgcHJvdG90eXBlLCBhbmQgZXZlbiBgaW5zdGFuY2VvZmAsIGEgYG1lc3NhZ2VgIGdldHRlciwgYW5kXG4gIC8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCB0aHJvdyBmb3IgYSBwcm94eSBvciBvYmplY3Qgd2hvc2UgdHJhcHMgb3IgZ2V0dGVycyB0aHJvdy5cbiAgcmV0dXJuIChcbiAgICBpZ25vcmVFcnJvcigoKSA9PiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAoZmFsbGJhY2sgPz8gU3RyaW5nKGVycm9yKSkpKSA/P1xuICAgIGZhbGxiYWNrID8/XG4gICAgaWdub3JlRXJyb3IoKCkgPT4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycm9yKSkgPz9cbiAgICAnVW5rbm93biBlcnJvcidcbiAgKTtcbn1cblxuLyoqIFdoZXRoZXIgYSB0aHJvd24gdmFsdWUgY2FycmllcyB0aGUgZ2l2ZW4gYGNvZGVgLCBzdWNoIGFzIGEgTm9kZS5qcyBlcnJubyBjb2RlIChgRU5PRU5UYCwgYEVFWElTVGAsIC4uLikuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRXJyb3JDb2RlPEMgZXh0ZW5kcyBzdHJpbmc+KGVycm9yOiB1bmtub3duLCBjb2RlOiBDKTogZXJyb3IgaXMgeyBjb2RlOiBDIH0ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gY29kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGhhc0Vycm9yQ29kZShlcnJvciwgJ0VOT0VOVCcpKSByZXR1cm47XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChoYXNFcnJvckNvZGUoZXJyb3IsICdFTk9FTlQnKSkgcmV0dXJuO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogRGVjaWRlcyBob3cgbG9uZyB0byB3YWl0IGJlZm9yZSByZXRyeWluZyBhZnRlciBgZXJyb3JgLCBnaXZlbiB0aGUgYmFja29mZiBgc2xlZXBNaWxsaXNlY29uZHNgIGl0IHdvdWxkIG90aGVyd2lzZSB3YWl0LFxuICAgKiBlLmcuIGAoZXJyb3IsIG1zKSA9PiBNYXRoLm1heChtcywgcmV0cnlBdE9mKGVycm9yKSAtIERhdGUubm93KCkpYCB0byBob25vciBhIHJldHJ5IHRpbWUgc2VudCBieSBhIHNlcnZlci5cbiAgICogSXQgZG9lcyBub3QgYWZmZWN0IHRoZSBiYWNrb2ZmIHRoYXQgYHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzYCBhZHZhbmNlcy5cbiAgICovXG4gIGdldFNsZWVwTWlsbGlzZWNvbmRzPzogKGVycm9yOiB1bmtub3duLCBzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgZ2V0U2xlZXBNaWxsaXNlY29uZHMsXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudFNsZWVwTWlsbGlzZWNvbmRzID0gZ2V0U2xlZXBNaWxsaXNlY29uZHM/LihlcnJvciwgc2xlZXBNaWxsaXNlY29uZHMpID8/IHNsZWVwTWlsbGlzZWNvbmRzO1xuICAgICAgaWYgKGN1cnJlbnRTbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoY3VycmVudFNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCIvKiogRXNjYXBlcyBldmVyeSBSZWdFeHAgbWV0YWNoYXJhY3RlciBzbyB0aGUgdGV4dCBtYXRjaGVzIGl0c2VsZiBsaXRlcmFsbHkuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1skKCkqKy4/W1xcXFxcXF1ee3x9XS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbi8qKiBBIFBPU0lYIHNoZWxsIHdvcmQ6IHNhZmUgY2hhcmFjdGVycyBwYXNzIHRocm91Z2gsIGFueXRoaW5nIGVsc2UgaXMgc2luZ2xlLXF1b3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZUZvclNoZWxsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li8tXSskL3UudGVzdCh2YWx1ZSkgPyB2YWx1ZSA6IGAnJHt2YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG59XG5cbi8qKlxuICogV3JhcHMgdGV4dCBpbiBhIE1hcmtkb3duIGNvZGUgYmxvY2sgZmVuY2VkIHdpdGggdGlsZGVzLCB3aGljaCBhcmUgcmFyZXIgdGhhbiBiYWNrdGlja3MgaW4gTWFya2Rvd24gY29udGVudC5cbiAqIFRoZSBmZW5jZSBpcyBsb25nZXIgdGhhbiBhbnkgcnVuIG9mIHRpbGRlcyBpbiB0aGUgdGV4dCBzbyB0aGF0IHRoZSB0ZXh0IGNhbm5vdCBjbG9zZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVGlsZGVDb2RlQmxvY2sodGV4dDogc3RyaW5nLCBsYW5ndWFnZSA9ICcnKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvRmVuY2VkQ29kZUJsb2NrKCd+JywgdGV4dCwgbGFuZ3VhZ2UpO1xufVxuXG4vKipcbiAqIFdyYXBzIHRleHQgaW4gYSBNYXJrZG93biBjb2RlIGJsb2NrIGZlbmNlZCB3aXRoIGJhY2t0aWNrcy5cbiAqIFRoZSBmZW5jZSBpcyBsb25nZXIgdGhhbiBhbnkgcnVuIG9mIGJhY2t0aWNrcyBpbiB0aGUgdGV4dCBzbyB0aGF0IHRoZSB0ZXh0IGNhbm5vdCBjbG9zZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ29kZUJsb2NrKHRleHQ6IHN0cmluZywgbGFuZ3VhZ2UgPSAnJyk6IHN0cmluZyB7XG4gIHJldHVybiB0b0ZlbmNlZENvZGVCbG9jaygnYCcsIHRleHQsIGxhbmd1YWdlKTtcbn1cblxuZnVuY3Rpb24gdG9GZW5jZWRDb2RlQmxvY2soZmVuY2VDaGFyOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgbGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNob3J0ZXN0RmVuY2UgPSBmZW5jZUNoYXIucmVwZWF0KDMpO1xuICBsZXQgbG9uZ2VzdFJ1biA9IDI7XG4gIGxldCBzdGFydCA9IHRleHQuaW5kZXhPZihzaG9ydGVzdEZlbmNlKTtcbiAgd2hpbGUgKHN0YXJ0ICE9PSAtMSkge1xuICAgIGxldCBlbmQgPSBzdGFydCArIDM7XG4gICAgd2hpbGUgKHRleHRbZW5kXSA9PT0gZmVuY2VDaGFyKSBlbmQrKztcbiAgICBsb25nZXN0UnVuID0gTWF0aC5tYXgobG9uZ2VzdFJ1biwgZW5kIC0gc3RhcnQpO1xuICAgIHN0YXJ0ID0gdGV4dC5pbmRleE9mKHNob3J0ZXN0RmVuY2UsIGVuZCk7XG4gIH1cbiAgbGV0IGxhbmd1YWdlU3RhcnQgPSAwO1xuICB3aGlsZSAobGFuZ3VhZ2VbbGFuZ3VhZ2VTdGFydF0gPT09IGZlbmNlQ2hhcikgbGFuZ3VhZ2VTdGFydCsrO1xuICBjb25zdCBmZW5jZSA9IGZlbmNlQ2hhci5yZXBlYXQobG9uZ2VzdFJ1biArIDEgKyBsYW5ndWFnZVN0YXJ0KTtcbiAgcmV0dXJuIGAke2ZlbmNlfSR7bGFuZ3VhZ2Uuc2xpY2UobGFuZ3VhZ2VTdGFydCl9XFxuJHt0ZXh0fSR7dGV4dC5lbmRzV2l0aCgnXFxuJykgPyAnJyA6ICdcXG4nfSR7ZmVuY2V9YDtcbn1cblxuLyoqXG4gKiBTaG9ydGVucyB0ZXh0IHRvIGF0IG1vc3QgYG1heExlbmd0aGAgVVRGLTE2IGNvZGUgdW5pdHMsIGluY2x1ZGluZyB0aGUgYGVsbGlwc2lzYCB0aGF0IG1hcmtzIHRoZSBjdXQuXG4gKiBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2hlbiBgbWF4TGVuZ3RoYCBjYW5ub3QgaG9sZCB0aGUgZWxsaXBzaXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZSh0ZXh0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyLCBlbGxpcHNpcyA9ICfigKYnKTogc3RyaW5nIHtcbiAgaWYgKHRleHQubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIHRleHQ7XG4gIGlmIChtYXhMZW5ndGggPCBlbGxpcHNpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgbWF4TGVuZ3RoICgke21heExlbmd0aH0pIG11c3QgYmUgYXQgbGVhc3QgdGhlIGVsbGlwc2lzIGxlbmd0aCAoJHtlbGxpcHNpcy5sZW5ndGh9KWApO1xuICB9XG4gIHJldHVybiBgJHtzbGljZVdpdGhvdXRTcGxpdHRpbmdTdXJyb2dhdGVzKHRleHQsIG1heExlbmd0aCAtIGVsbGlwc2lzLmxlbmd0aCl9JHtlbGxpcHNpc31gO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGBlbmRgIGNvZGUgdW5pdHMgb2YgYHRleHRgLCBvbmUgZmV3ZXIgd2hlbiB0aGUgbGFzdCBrZXB0IHVuaXQgaXMgYSBoaWdoIHN1cnJvZ2F0ZSwgd2hvc2UgbG93IGhhbGZcbiAqIGlzIGVpdGhlciBjdXQgb2ZmIG9yIGFic2VudCBmcm9tIGB0ZXh0YCwgYmVjYXVzZSBhbiB1bnBhaXJlZCBzdXJyb2dhdGUgaXMgcmVwbGFjZWQgd2l0aCBVK0ZGRkQgYnkgZW5jb2RlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZVdpdGhvdXRTcGxpdHRpbmdTdXJyb2dhdGVzKHRleHQ6IHN0cmluZywgZW5kOiBudW1iZXIpOiBzdHJpbmcge1xuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItY29kZS1wb2ludCAtLSB0aGUgY2hlY2sgaXMgb24gYSBzaW5nbGUgVVRGLTE2IGNvZGUgdW5pdFxuICBjb25zdCBsYXN0S2VwdFVuaXQgPSB0ZXh0LmNoYXJDb2RlQXQoZW5kIC0gMSk7XG4gIHJldHVybiB0ZXh0LnNsaWNlKDAsIGxhc3RLZXB0VW5pdCA+PSAweEQ4XzAwICYmIGxhc3RLZXB0VW5pdCA8PSAweERCX0ZGID8gZW5kIC0gMSA6IGVuZCk7XG59XG5cbmNvbnN0IGh0bWxFbnRpdGllczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gICdcIic6ICcmcXVvdDsnLFxuICAnJic6ICcmYW1wOycsXG4gIFwiJ1wiOiAnJiMzOTsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG59O1xuXG5jb25zdCBodG1sU3BlY2lhbENoYXJhY3RlcnNQYXR0ZXJuID0gL1tcIiYnPD5dL2d1O1xuXG4vKiogRXNjYXBlcyBgJmAsIGA8YCwgYD5gLCBgXCJgLCBhbmQgYCdgLCBzbyB0aGUgcmVzdWx0IGlzIHNhZmUgaW4gSFRNTCB0ZXh0IGFuZCBpbiBxdW90ZWQgYXR0cmlidXRlIHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE1lYXN1cmVkIGluIFY4IGFuZCBKYXZhU2NyaXB0Q29yZTogYSBuYXRpdmUgYHNlYXJjaGAgZmlyc3QgaXMgZmFzdGVyIHRoYW4gYHJlcGxhY2VBbGxgIGFsb25lIGZvciB0ZXh0IHdpdGhvdXQgdGhlc2VcbiAgLy8gY2hhcmFjdGVycywgYW5kIG9uZSBuYXRpdmUgYHJlcGxhY2VBbGxgIGJlYXRzIGEgcGVyLWNvZGUtdW5pdCBsb29wIGZvciB0ZXh0IHdoZXJlIHRoZXkgYXJlIHJhcmUuXG4gIHJldHVybiB0ZXh0LnNlYXJjaChodG1sU3BlY2lhbENoYXJhY3RlcnNQYXR0ZXJuKSA9PT0gLTFcbiAgICA/IHRleHRcbiAgICA6IHRleHQucmVwbGFjZUFsbChodG1sU3BlY2lhbENoYXJhY3RlcnNQYXR0ZXJuLCAoY2hhcmFjdGVyKSA9PiBodG1sRW50aXRpZXNbY2hhcmFjdGVyXSBhcyBzdHJpbmcpO1xufVxuIiwiLyoqXG4gKiBXaGVuIHRvIHdyaXRlIGEgdGVzdCBhbmQgd2hhdCBhIHRlc3QgbWF5IGFzc2VydCwgYXMgbWFya2Rvd24gYnVsbGV0cyBmb3IgYW4gYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBTdGF0ZWQgb25jZSBoZXJlIGFuZCByZW5kZXJlZCBieSB0aGUgZ2VuZXJhdGVkIGFnZW50IGluc3RydWN0aW9ucyBhbmQgdGhlIHRlc3Rpbmcgc2tpbGwgc28gdGhlXG4gKiB0d28gY2Fubm90IGRyaWZ0IGFwYXJ0LlxuICovXG5leHBvcnQgY29uc3QgVEVTVF9XUklUSU5HX1JVTEVTID0gYC0gV3JpdGUgYSB0ZXN0IG9ubHkgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCwgb3Igd2hlbiBhIGJlaGF2aW9yIGlzIGxpa2VseSB0byByZWdyZXNzIGFuZCBubyBleGlzdGluZyBhdXRvbWF0aWMgY2hlY2sgKHR5cGUgY2hlY2tpbmcsIGxpbnRpbmcsIGFuIGV4aXN0aW5nIHRlc3Qgb3IgQ0kgY2hlY2spIHdvdWxkIGNhdGNoIHRoZSBicmVha2FnZS4gTmV2ZXIgYWRkIGEgdGVzdCB0aGF0IG1lcmVseSByZXN0YXRlcyBhIG1hcHBpbmcgZnJvbSBjb25kaXRpb25zIHRvIGNvbnN0YW50IG91dHB1dHMgKGl0IGZhaWxzIG9ubHkgb24gaW50ZW50aW9uYWwgZWRpdHMpIG9yIHRoYXQgb25seSBjb25maXJtcyBhbiBleHRlcm5hbCBmYWN0IChhIGxpYnJhcnkncyBiZWhhdmlvciwgd2hldGhlciBhIHZlcnNpb24gZml4ZXMgYW4gaXNzdWUpOyB2ZXJpZnkgdGhvc2Ugb25jZSBtYW51YWxseS5cbi0gVGVzdCBleHRlcm5hbGx5IG9ic2VydmFibGUgYmVoYXZpb3IgKGUuZy4sIGVtaXR0ZWQgZmlsZXMsIENMSSBvdXRwdXQsIHJlbmRlcmVkIHJlc3VsdHMpIGF0IHRoZSBzeXN0ZW0gYm91bmRhcnksIG5vdCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzOiBkbyBub3QgbWlycm9yIHByb2R1Y3Rpb24gbG9naWMsIGFzc2VydCB0aGF0IGEgYnJhbmNoIGlzIHRha2VuLCBvciBmZWVkIGhhbmQtYXNzZW1ibGVkIGludGVybmFsIG9iamVjdHMgdG8gaW50ZXJuYWwgZnVuY3Rpb25zLlxuLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuLSBBdm9pZCBmaXhlZCB3YWl0cyBpbiBFMkUgdGVzdHM7IHdhaXQgZm9yIGNvbmRpdGlvbnMgaW5zdGVhZC5gO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbi8qKiBUaGUgYHdvcmtzcGFjZXNgIGZpZWxkIG9mIGEgcm9vdCBwYWNrYWdlLmpzb246IHRoZSBhcnJheSBmb3JtIG9yIFlhcm4gdjEncyBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZXNEZWNsYXJhdGlvbiA9IHN0cmluZ1tdIHwgeyBwYWNrYWdlcz86IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSB0aGF0IEJ1biB3b3VsZCBsaW5rXG4gKiBmb3IgdGhlIGdpdmVuIHJvb3QgcGFja2FnZS5qc29uIGB3b3Jrc3BhY2VzYCBkZWNsYXJhdGlvbi4gQ2Fub25pY2FsaXplcyB0aGUgZGVjbGFyZWQgcGF0dGVybnNcbiAqIChzZWUgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMpLCBkcm9wcyBwYXR0ZXJucyBlc2NhcGluZyB0aGUgcmVwb3NpdG9yeSAoc2VlXG4gKiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4pLCBhbmQgcmVzb2x2ZXMgdGhlIHJlc3Qgd2l0aCBCdW4ncyBzZXF1ZW50aWFsIHNlbWFudGljcyAoc2VlXG4gKiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhcbiAgICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5maWx0ZXIoKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybilcbiAgICApLFxuICAgIHJvb3REaXJQYXRoXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd29ya3NwYWNlIHBhdHRlcm5zIHRvIHBhY2thZ2UuanNvbiBwYXRocyBtaW1pY2tpbmcgQnVuJ3MgU0VRVUVOVElBTCBldmFsdWF0aW9uLFxuICogZGVyaXZlZCBlbXBpcmljYWxseSB3aXRoIEJ1biAxLjMuMTQgKGZpeHR1cmUgcmVwb3Mgb2JzZXJ2ZWQgdmlhIGBidW4gaW5zdGFsbCAtLWxvY2tmaWxlLW9ubHlgO1xuICogV2lsbEJvb3N0ZXIvc2hhcmVkIzEwMDQgLyBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNSk6XG4gKiAxLiBQYXR0ZXJucyBhcmUgZXZhbHVhdGVkIGluIGRlY2xhcmF0aW9uIG9yZGVyIGludG8gYW4gYWNjdW11bGF0aW5nIHNldDogYSBwb3NpdGl2ZSBnbG9iXG4gKiAgICBwYXR0ZXJuIGFkZHMgZXZlcnkgcGFja2FnZS5qc29uIGl0IG1hdGNoZXM7IGEgbmVnYXRpb24gZGVsZXRlcyBpdHMgbWF0Y2hlcyBmcm9tIHRoZSBzZXRcbiAqICAgIGFjY3VtdWxhdGVkIFNPIEZBUiwgc28gYSBsYXRlciBwb3NpdGl2ZSByZS1hZGRzIHRoZW0gKGBbXCIhYXBwcy9leGNsdWRlZFwiLCBcImFwcHMvKlwiXWAgbGlua3NcbiAqICAgIGFwcHMvZXhjbHVkZWQsIHdoaWxlIGBbXCJhcHBzLypcIiwgXCIhYXBwcy9leGNsdWRlZFwiXWAgZG9lcyBub3QpLlxuICogMi4gQSBuZWdhdGlvbiB3aG9zZSBub3JtYWxpemVkIGJvZHkgaGFzIEVYQUNUTFkgdHdvIHNlZ21lbnRzLCB3aG9zZSBsYXN0IHNlZ21lbnQgaXMgYSBzdGFyLXJ1blxuICogICAgKGAqYCwgYCoqYCwgYCoqKmAsIOKApiksIGFuZCB3aG9zZSBmaXJzdCBzZWdtZW50IGlzIE5PVCBpdHNlbGYgYSBzdGFyLXJ1biBmaXJzdCBzZWVkcyB0aGVcbiAqICAgIGltcGxpY2l0IGJhc2VsaW5lIGludG8gdGhlIHNldCwgdGhlbiBkZWxldGVzIGl0cyBvd24gbWF0Y2hlczogYSBgKipgIGxhc3Qgc2VnbWVudCBzZWVkc1xuICogICAgYCoqYCAocGFja2FnZXMgYXQgYW55IGRlcHRoKSwgYW55IG90aGVyIHN0YXItcnVuIHNlZWRzIGAqXFwvKmAgKGRlcHRoIDIgb25seSkuIFNlZWRpbmdcbiAqICAgIGhhcHBlbnMgZXZlbiBhbG9uZ3NpZGUgcG9zaXRpdmUgcGF0dGVybnMgKGBbXCJhcHBzLypcIiwgXCIhb3RoZXIvKlwiXWAgbGlua3MgZXZlcnkgZGVwdGgtMlxuICogICAgcGFja2FnZSBvdXRzaWRlIG90aGVyLykuIE5vIG90aGVyIG5lZ2F0aW9uIHNoYXBlIHNlZWRzOiBgISpgLCBgISoqYCwgYCEqXFwvKmAsIGAhKlxcLyoqYCxcbiAqICAgIGAhKipcXC8qYCwgYCFhL2IvKmAsIGAhYS9iLyoqYCwgYCFkaXJgLCBhbmQgYCFkaXIvKnhgIGVhY2ggbGluayBub3RoaW5nIG9uIHRoZWlyIG93bi5cbiAqICAgIGA/YCwgYnJhY2UsIGFuZCBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmUgRVJSQVRJQ0FMTFkgKGBbXCIhb3RoZXIvP1wiXWAgbGlua3NcbiAqICAgIHBhY2thZ2VzL2EgeWV0IG5vdCB0aGUgZXF1YWxseSBiYXNlbGluZS1zaGFwZWQgb3RoZXIveXksIGBbXCIhb3RoZXIvPz9cIl1gIGxpbmtzIG5vdGhpbmcsIGFuZFxuICogICAgYFtcIiE/Lz9cIl1gIGxpbmtzIHRoZSB2ZXJ5IG90aGVyL3ggaXQgbWF0Y2hlcyksIHNvIG5vIGNvbnNpc3RlbnQgcnVsZSBjYW4gbW9kZWwgdGhlbTsgdGhleVxuICogICAgYXJlIGRlbGliZXJhdGVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nIOKAlCBzZWUgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSBhbmQgIzEwMDUuXG4gKiAzLiBBIG5vbi1nbG9iIHBvc2l0aXZlIHBhdHRlcm4gUElOUyBpdHMgZGlyZWN0b3J5OiBpdCBzdGF5cyBhIHdvcmtzcGFjZSByZWdhcmRsZXNzIG9mIHdoZXJlIGFcbiAqICAgIG1hdGNoaW5nIG5lZ2F0aW9uIGFwcGVhcnMgKGBbXCJvdGhlci94XCIsIFwiIW90aGVyL3hcIl1gIGFuZCBgW1wiIW90aGVyL3hcIiwgXCJvdGhlci94XCJdYCBib3RoXG4gKiAgICBsaW5rIG90aGVyL3gpLlxuICogNC4gYCoqYCBtYXRjaGVzIHplcm8gb3IgbW9yZSBwYXRoIHNlZ21lbnRzIChgW1wiYXBwcy8qKlwiXWAgbGlua3MgdGhlIHBhY2thZ2UgYXQgYXBwcyBpdHNlbGYsIGFuZFxuICogICAgYCFhcHBzLyoqYCBkZWxldGVzIGl0KSwgbWF0Y2hpbmcgZmFzdC1nbG9iJ3MgZmlsZS1nbG9iIHNlbWFudGljcy5cbiAqIERvIG5vdCBhcHBseSBnbG9iSWdub3JlIGhlcmU6IHdvcmtzcGFjZSBtZW1iZXJzaGlwIGlzIGRlZmluZWQgc29sZWx5IGJ5IHRoZSBkZWNsYXJlZCBwYXR0ZXJucyxcbiAqIGFuZCBzb3VyY2Utc2Nhbm5pbmcgaWdub3JlcyBzdWNoIGFzIGBidWlsZGAgb3IgYGRpc3RgIHdvdWxkIGhpZGUgbGVnaXRpbWF0ZWx5IG5hbWVkIHdvcmtzcGFjZVxuICogZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyh3b3Jrc3BhY2VQYXR0ZXJuczogc3RyaW5nW10sIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIC8vIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlIHN0b3BzIEdMT0IgdHJhdmVyc2FsIHRocm91Z2ggc3ltbGlua3MsIGJ1dCBhIG5vbi1nbG9iIHBhdHRlcm5cbiAgLy8gbmFtaW5nIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBgbGlua2VkYCB3aXRoIGBsaW5rZWQgLT4gLi4vb3RoZXItcmVwb2ApIHN0aWxsIG1hdGNoZXMg4oCUXG4gIC8vIGZhc3QtZ2xvYiByZXNvbHZlcyBzdGF0aWMgcGF0dGVybnMgd2l0aCBkaXJlY3QgZnMgY2hlY2tzLCBhbmQgQnVuIGRvZXMgbGluayBzdWNoIGEgd29ya3NwYWNlLlxuICAvLyBEZWxpYmVyYXRlbHkgZGl2ZXJnZSBmcm9tIEJ1biB0aGVyZTogY29uc3VtZXJzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIGNsZWFudXAgYW5kIG1hbmlmZXN0XG4gIC8vIHJld3JpdGluZyB3b3VsZCBvdGhlcndpc2UgZGVsZXRlIGFuZCByZXdyaXRlIGZpbGVzIGluIEFOT1RIRVIgcmVwb3NpdG9yeSB0aHJvdWdoIHRoZSBzeW1saW5rLFxuICAvLyBzbyBrZWVwIG9ubHkgbWFuaWZlc3RzIHdob3NlIHJlYWwgcGF0aCBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkncyByZWFsIHJvb3QuIFNjYW5uaW5nIGVhY2hcbiAgLy8gcGF0dGVybiBzZXBhcmF0ZWx5IChubyBjcm9zcy1wYXR0ZXJuIGNhY2hpbmcpIGlzIGRlbGliZXJhdGU6IGRlY2xhcmF0aW9ucyBob2xkIGEgaGFuZGZ1bCBvZlxuICAvLyBwYXR0ZXJucywgc28gYSBjYWNoZSB3b3VsZCBjb21wbGljYXRlIHRoaXMgc2hhcmVkIGNvZGUgd2l0aG91dCBtZWFzdXJhYmxlIGdhaW4uXG4gIGNvbnN0IGdsb2JNYW5pZmVzdFBhdGhzID0gKHBhdHRlcm46IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICAvLyBCdW4gbGlua3MgZG90LWRpcmVjdG9yeSBwYWNrYWdlcyBvbmx5IHRocm91Z2ggZnVsbHkgc3RhdGljIHBhdHRlcm5zOiB3aXRoIEJ1biAxLjMuMTQsXG4gICAgLy8gYC5oaWRkZW4veGAgcGlucyB0aGUgcGFja2FnZSB3aGlsZSBgLmhpZGRlbi8qYCwgYC4qLypgLCBhbmQgYCoqYCBhbGwgbGluayBub3RoaW5nIHVuZGVyXG4gICAgLy8gLmhpZGRlbiDigJQgZXZlbiB3aGVuIHRoZSBkb3R0ZWQgc2VnbWVudCBpdHNlbGYgaXMgbGl0ZXJhbCDigJQgc28gYW55IGR5bmFtaWMgcGF0dGVybiBtdXN0XG4gICAgLy8gZHJvcCBtYXRjaGVzIGNvbnRhaW5pbmcgYSBkb3QtbGVkIHNlZ21lbnQgKGZhc3QtZ2xvYidzIGBkb3Q6IGZhbHNlYCBvbmx5IGNvdmVycyBzZWdtZW50c1xuICAgIC8vIGEgd2lsZGNhcmQgbWF0Y2hlcykuXG4gICAgY29uc3QgZXhjbHVkZXNEb3RTZWdtZW50cyA9IGZnLmlzRHluYW1pY1BhdHRlcm4ocGF0dGVybik7XG4gICAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgICAvLyBmYXN0LWdsb2IgMy4zLjMgcmV0dXJucyBubyBtYXRjaGVzIGZvciBmaWxlIGdsb2JzIHdpdGggYSBsb25lLWA/YCBzZWdtZW50IChlLmcuXG4gICAgLy8gYHBhY2thZ2VzLz8vcGFja2FnZS5qc29uYCksIGFsdGhvdWdoIG1pY3JvbWF0Y2ggbWF0Y2hlcyB0aGVtIGFuZCBCdW4gMS4zLjE0IGxpbmtzIHN1Y2hcbiAgICAvLyB3b3Jrc3BhY2VzOyBmb3IgYD9gLWNhcnJ5aW5nIHBhdHRlcm5zIG9ubHkgKGEgZGlyZWN0b3J5IGdsb2IgZm9yIGUuZy4gYCoqYCB3b3VsZCBzY2FuIGV2ZXJ5XG4gICAgLy8gZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5KSwgZ2xvYmJpbmcgdGhlIGRpcmVjdG9yaWVzICh3aGVyZSBgP2Agd29ya3MpIGFuZCBjaGVja2luZyB0aGVpclxuICAgIC8vIG1hbmlmZXN0cyBjb21wbGVtZW50cyB0aGUgbWFuaWZlc3QgZ2xvYiwgd2hpY2ggc3RheXMgbmVjZXNzYXJ5IGZvciBgKipgJ3MgemVyby1zZWdtZW50XG4gICAgLy8gbWF0Y2hlcyDigJQgYGRpci8qKmAgZG9lcyBub3QgcmV0dXJuIGRpciBpdHNlbGYgYXMgYSBkaXJlY3RvcnkuXG4gICAgY29uc3QgbWFuaWZlc3RQYXRocyA9IG5ldyBTZXQoZmcuZ2xvYlN5bmMocGF0aC5wb3NpeC5qb2luKHBhdHRlcm4sICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpKTtcbiAgICBpZiAocGF0dGVybi5pbmNsdWRlcygnPycpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZmcuZ2xvYlN5bmMocGF0dGVybiwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpIG1hbmlmZXN0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCdzIG93biBtYW5pZmVzdCwgYnV0IEJ1biBuZXZlciB0cmVhdHMgdGhlXG4gICAgLy8gbW9ub3JlcG8gcm9vdCBhcyBpdHMgb3duIHdvcmtzcGFjZS5cbiAgICByZXR1cm4gWy4uLm1hbmlmZXN0UGF0aHNdLmZpbHRlcihcbiAgICAgIChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCAhPT0gJ3BhY2thZ2UuanNvbicgJiZcbiAgICAgICAgKCFleGNsdWRlc0RvdFNlZ21lbnRzIHx8ICFwYWNrYWdlSnNvblBhdGguc3BsaXQoJy8nKS5zb21lKChzZWdtZW50KSA9PiBzZWdtZW50LnN0YXJ0c1dpdGgoJy4nKSkpICYmXG4gICAgICAgIGlzSW5zaWRlUmVhbFJvb3QocGFja2FnZUpzb25QYXRoKVxuICAgICk7XG4gIH07XG4gIGxldCByZWFsUm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaXNJbnNpZGVSZWFsUm9vdCA9IChwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIHRyeSB7XG4gICAgICByZWFsUm9vdERpclBhdGggPz89IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlYWxSb290RGlyUGF0aCwgZnMucmVhbHBhdGhTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSkpO1xuICAgICAgLy8gQ29tcGFyZSB3aG9sZSBzZWdtZW50cywgbm90IGEgYC4uYCBwcmVmaXg6IGEgZGlyZWN0b3J5IGxpdGVyYWxseSBuYW1lZCBlLmcuIGAuLnBrZ2AgaXNcbiAgICAgIC8vIGluc2lkZSB0aGUgcm9vdCwgd2hpbGUgYSBwbGFpbiBzdGFydHNXaXRoKCcuLicpIHdvdWxkIG1pc3JlYWQgaXQgYXMgcGFyZW50IHRyYXZlcnNhbC5cbiAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIG1hbmlmZXN0IHRoYXQgdmFuaXNoZWQgYmV0d2VlbiB0aGUgZ2xvYiBhbmQgdGhlIHJlYWxwYXRoIGNhbGwgaXMgbm90IGEgd29ya3NwYWNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWNjdW11bGF0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwaW5uZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICBjb25zdCBiYXNlbGluZUdsb2IgPSBnZXRTZWVkZWRCYXNlbGluZUdsb2IocGF0dGVybkJvZHkpO1xuICAgICAgaWYgKGJhc2VsaW5lR2xvYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKGJhc2VsaW5lR2xvYikpIGFjY3VtdWxhdGVkUGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIGFjY3VtdWxhdGVkUGF0aHMuZGVsZXRlKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuQm9keSkgPyBhY2N1bXVsYXRlZFBhdGhzIDogcGlubmVkUGF0aHM7XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnbG9iTWFuaWZlc3RQYXRocyhwYXR0ZXJuQm9keSkpIHtcbiAgICAgICAgdGFyZ2V0UGF0aHMuYWRkKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uYWNjdW11bGF0ZWRQYXRocywgLi4ucGlubmVkUGF0aHNdKV0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBzZWVkcyBCdW4ncyBpbXBsaWNpdCB3b3Jrc3BhY2UgYmFzZWxpbmU6IGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZVxuICogbmVnYXRpb24gb2YgdGhlIHNlZWRpbmcgc2hhcGUgKHNlZSByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyBydWxlIDIpLiBNZWFzdXJlZCB3aXRoIEJ1blxuICogMS4zLjE0LCBzZWVkaW5nIGlzIHBlci1uZWdhdGlvbiBhbmQgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJuczsgY29uY3JldGUgb3JcbiAqIG1peGVkLWxpdGVyYWwgbGFzdCBzZWdtZW50cyAoYCFhcHBzL2V4Y2x1ZGVkYCwgYCFhcHBzLypkYCkgbmV2ZXIgc2VlZCwgYW5kIGA/YCwgYnJhY2UsIGFuZFxuICogY2hhcmFjdGVyLWNsYXNzIGxhc3Qgc2VnbWVudHMgYmVoYXZlZCBpbmNvbnNpc3RlbnRseSBhY3Jvc3MgZml4dHVyZXMgKHNvbWV0aW1lcyBkcm9wcGluZyBldmVuXG4gKiB1bnJlbGF0ZWQgc2libGluZyB3b3Jrc3BhY2VzKSwgc28gdGhleSBhcmUgY29uc2VydmF0aXZlbHkgdHJlYXRlZCBhcyBub3Qgc2VlZGluZzsgc2VlXG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKS5zb21lKFxuICAgICh3b3Jrc3BhY2VQYXR0ZXJuKSA9PlxuICAgICAgd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIGdldFNlZWRlZEJhc2VsaW5lR2xvYihub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpKSkgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyB3aXRob3V0IEJ1bidzIG5vLW9wIG9uZXMgKGBcIlwiYCwgYSBsb25lIGBcIiFcImAsIGFuZCBgXCIuXCJgKSwgd2hpY2ggQnVuXG4gKiBpZ25vcmVzIGVudGlyZWx5IOKAlCBhIGxvbmUgYFwiIVwiYCBtdXN0IG5vdCBhY3RpdmF0ZSB0aGUgbmVnYXRpdmUtb25seSBpbXBsaWNpdCBiYXNlbGluZSwgYW5kIGBcIlwiYFxuICogbXVzdCBub3QgbWFrZSB0aGUgcmVwb3NpdG9yeSByb290IGl0c2VsZiBhIGRpc2NvdmVyZWQgd29ya3NwYWNlLiBEZWNsYXJhdGlvbiBvcmRlciBhbmRcbiAqIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGUgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICByZXR1cm4gZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzKVxuICAgIC5tYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IHtcbiAgICAgIC8vIEJ1biBhcHBsaWVzIGxlYWRpbmctYmFuZyBQQVJJVFkgKHZlcmlmaWVkIHdpdGggQnVuIDEuMy4xNCk6IGAhIXBgIGlzIHRoZSBwb3NpdGl2ZSBgcGBcbiAgICAgIC8vIGFuZCBgISEhcGAgdGhlIG5lZ2F0aW9uIGAhcGAsIHNvIGNhbm9uaWNhbGl6ZSB0byBhdCBtb3N0IG9uZSBiYW5nLlxuICAgICAgY29uc3QgYmFuZ0NvdW50ID0gL14hKi91LmV4ZWMod29ya3NwYWNlUGF0dGVybikhWzBdLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gd29ya3NwYWNlUGF0dGVybi5zbGljZShiYW5nQ291bnQpO1xuICAgICAgcmV0dXJuIGJhbmdDb3VudCAlIDIgPT09IDEgPyBgISR7cGF0dGVybkJvZHl9YCA6IHBhdHRlcm5Cb2R5O1xuICAgIH0pXG4gICAgLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICAgICAgLy8gTm9ybWFsaXplIHNvIHNwZWxsaW5ncyBsaWtlIGAuL2AsIGAuLy5gLCBhbmQgYCEuL2AgYXJlIHJlY29nbml6ZWQgYXMgdGhlIHNhbWUgbm8tb3BzXG4gICAgICAvLyAocGF0aC5wb3NpeC5ub3JtYWxpemUoJycpID09PSAnLicsIHNvIHRoZSBlbXB0eSBwYXR0ZXJuIGlzIGNvdmVyZWQgdG9vKS5cbiAgICAgIHJldHVybiBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShwYXR0ZXJuQm9keSkgIT09ICcuJztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgYC8vYCwgcmVzb2x2ZXMgYC4vYCwgYW5kIHN0cmlwcyB0cmFpbGluZyBzbGFzaGVzLCBtaXJyb3JpbmcgQnVuJ3MgcGF0aCBoYW5kbGluZy5cbiAqIEEgcHVyZSBzdGFyLXJ1biBzZWdtZW50IG9mIHRocmVlIG9yIG1vcmUgc3RhcnMgYmVoYXZlcyBsaWtlIGAqYCB1bmRlciBCdW4gKGAhb3RoZXIvKioqYFxuICogbWF0Y2hlcyBvdGhlci94KSBidXQgbm90IHVuZGVyIGZhc3QtZ2xvYiwgc28gY2Fub25pY2FsaXplIGl0IHRvIGAqYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5wb3NpeFxuICAgIC5ub3JtYWxpemUocGF0dGVybkJvZHkpXG4gICAgLnJlcGxhY2UoL1xcLyskL3UsICcnKVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gKC9eXFwqezMsfSQvdS50ZXN0KHNlZ21lbnQpID8gJyonIDogc2VnbWVudCkpXG4gICAgLmpvaW4oJy8nKTtcbn1cblxuLyoqIFRoZSBpbXBsaWNpdCBiYXNlbGluZSBnbG9iIGEgbmVnYXRpb24gc2VlZHMgdW5kZXIgQnVuJ3MgcnVsZSAyIGFib3ZlLCBvciB1bmRlZmluZWQgaWYgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWVkZWRCYXNlbGluZUdsb2IobmVnYXRpb25Cb2R5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWdtZW50cyA9IG5lZ2F0aW9uQm9keS5zcGxpdCgnLycpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoICE9PSAyKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbZmlyc3RTZWdtZW50LCBsYXN0U2VnbWVudF0gPSBzZWdtZW50cyBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoIS9eXFwqKyQvdS50ZXN0KGxhc3RTZWdtZW50KSB8fCAvXlxcKiskL3UudGVzdChmaXJzdFNlZ21lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbGFzdFNlZ21lbnQgPT09ICcqKicgPyAnKionIDogJyovKic7XG59XG5cbi8qKiBXb3Jrc3BhY2UgcGF0dGVybnMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIGB7IHBhY2thZ2VzOiBb4oCmXSB9YCBvYmplY3QgZm9ybS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkod29ya3NwYWNlcykpIHJldHVybiB3b3Jrc3BhY2VzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzPy5wYWNrYWdlcykgPyB3b3Jrc3BhY2VzLnBhY2thZ2VzIDogW107XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJuIChuZWdhdGl2ZSBvbmVzIGluY2x1ZGVkKSBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6XG4gKiBhYnNvbHV0ZSBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBvcGVyYXRlXG4gKiBvbiBhbm90aGVyIHJlcG9zaXRvcnkncyBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuO1xuICByZXR1cm4gIXBhdGgucG9zaXguaXNBYnNvbHV0ZShwYXR0ZXJuQm9keSkgJiYgIXBhdHRlcm5Cb2R5LnNwbGl0KCcvJykuaW5jbHVkZXMoJy4uJyk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVGaWxlQXRvbWljT3B0aW9ucyB7XG4gIG1vZGU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogV3JpdGVzIGEgZmlsZSB0aHJvdWdoIGEgdW5pcXVlbHkgbmFtZWQgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCBhIHJlbmFtZSwgc28gY29uY3VycmVudCByZWFkZXJzXG4gKiBzZWUgZWl0aGVyIHRoZSBvbGQgb3IgdGhlIG5ldyBjb250ZW50LCBuZXZlciBhIHBhcnRpYWwgb25lLCBhbmQgY29uY3VycmVudCB3cml0ZXJzIG5ldmVyIHNoYXJlIGEgdGVtcG9yYXJ5IGZpbGUuXG4gKiBUaGUgZmlsZSBnZXRzIGBvcHRpb25zLm1vZGVgIGV4YWN0bHkgKHdpdGhvdXQgdGhlIHVtYXNrKSwgb3IgZWxzZSBrZWVwcyB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGZpbGUgaXQgcmVwbGFjZXMsIGFzXG4gKiBhbiBpbi1wbGFjZSBgd3JpdGVGaWxlYCB3b3VsZDsgYSBuZXcgZmlsZSB3aXRob3V0IGBvcHRpb25zLm1vZGVgIGdldHMgdGhlIGRlZmF1bHQgcGVybWlzc2lvbnMuXG4gKiBDcmVhdGVzIG1pc3NpbmcgcGFyZW50IGRpcmVjdG9yaWVzLiBUaGUgZGF0YSBpcyBub3QgZnN5bmNlZCwgc28gYSBwb3dlciBsb3NzIGNhbiBzdGlsbCBsb3NlIHRoZSBsYXRlc3Qgd3JpdGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUZpbGVBdG9taWMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksXG4gIG9wdGlvbnM/OiBXcml0ZUZpbGVBdG9taWNPcHRpb25zXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIGNvbnN0IFttb2RlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBvcHRpb25zPy5tb2RlID8/IGdldEV4aXN0aW5nTW9kZShmaWxlUGF0aCksXG4gICAgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBjb25zdCB0ZW1wUGF0aCA9IGdldFRlbXBQYXRoKGRpclBhdGgpO1xuICB0cnkge1xuICAgIC8vIENyZWF0aW5nIHRoZSBmaWxlIHdpdGggdGhlIG1vZGUga2VlcHMgaXQgZnJvbSBiZWluZyBtb3JlIHBlcm1pc3NpdmUgdGhhbiBpbnRlbmRlZCB3aGlsZSBpdCBpcyB3cml0dGVuLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh0ZW1wUGF0aCwgZGF0YSwgbW9kZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogeyBtb2RlIH0pO1xuICAgIGlmIChtb2RlICE9PSB1bmRlZmluZWQpIGF3YWl0IGZzLnByb21pc2VzLmNobW9kKHRlbXBQYXRoLCBtb2RlKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUodGVtcFBhdGgsIGZpbGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBBIGNsZWFudXAgZmFpbHVyZSBtdXN0IG5vdCByZXBsYWNlIHRoZSBlcnJvciB0aGF0IGV4cGxhaW5zIHdoeSB0aGUgd3JpdGUgZmFpbGVkLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRlbXBQYXRoLCB7IGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiogVGhlIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgYHdyaXRlRmlsZUF0b21pY2AuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVGaWxlQXRvbWljU3luYyhcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgb3B0aW9ucz86IFdyaXRlRmlsZUF0b21pY09wdGlvbnNcbik6IHZvaWQge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgY29uc3QgbW9kZSA9IG9wdGlvbnM/Lm1vZGUgPz8gZ2V0RXhpc3RpbmdNb2RlU3luYyhmaWxlUGF0aCk7XG4gIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgdGVtcFBhdGggPSBnZXRUZW1wUGF0aChkaXJQYXRoKTtcbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBQYXRoLCBkYXRhLCBtb2RlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IG1vZGUgfSk7XG4gICAgaWYgKG1vZGUgIT09IHVuZGVmaW5lZCkgZnMuY2htb2RTeW5jKHRlbXBQYXRoLCBtb2RlKTtcbiAgICBmcy5yZW5hbWVTeW5jKHRlbXBQYXRoLCBmaWxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLnJtU3luYyh0ZW1wUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgY2xlYW51cCBmYWlsdXJlIG11c3Qgbm90IHJlcGxhY2UgdGhlIGVycm9yIHRoYXQgZXhwbGFpbnMgd2h5IHRoZSB3cml0ZSBmYWlsZWQuXG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRlbXBQYXRoKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoZSBuYW1lIGRvZXMgbm90IGluY2x1ZGUgdGhlIHRhcmdldCdzLCB3aGljaCBtYXkgYWxyZWFkeSBiZSBuZWFyIHRoZSBmaWxlIG5hbWUgbGVuZ3RoIGxpbWl0LlxuICByZXR1cm4gcGF0aC5qb2luKGRpclBhdGgsIGAuJHtyYW5kb21VVUlEKCl9LnRtcGApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ01vZGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpO1xuICAgIHJldHVybiB0b1Blcm1pc3Npb25CaXRzKHN0YXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBpZ25vcmVNaXNzaW5nRmlsZShlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RXhpc3RpbmdNb2RlU3luYyhmaWxlUGF0aDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdG9QZXJtaXNzaW9uQml0cyhmcy5zdGF0U3luYyhmaWxlUGF0aCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBpZ25vcmVNaXNzaW5nRmlsZShlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9QZXJtaXNzaW9uQml0cyhzdGF0OiBmcy5TdGF0cyk6IG51bWJlciB7XG4gIC8vIGBzdGF0YCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGBjaG1vZGAgaXMgbm90IHNwZWNpZmllZCB0byBhY2NlcHQuXG4gIHJldHVybiBzdGF0Lm1vZGUgJiAwbzc3Nzc7XG59XG5cbmZ1bmN0aW9uIGlnbm9yZU1pc3NpbmdGaWxlKGVycm9yOiB1bmtub3duKTogdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0aHJvdyBlcnJvcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHdyaXRlRmlsZUF0b21pY1N5bmMgfSBmcm9tICcuL3dyaXRlRmlsZUF0b21pYy5qcyc7XG5cbi8qKlxuICogQW5jaG9yZWQgdG8gYFwiLCBgIHNvIG9ubHkgYSByZWdpc3RyeSBlbnRyeSdzIGByZXNvbHZlZGAgc2xvdCBpcyBjbGVhcmVkLiBBIGRpcmVjdCB0YXJiYWxsXG4gKiBkZXBlbmRlbmN5IGNhcnJpZXMgaXRzIFVSTCBpbiB0aGUgd29ya3NwYWNlIGRlc2NyaXB0b3IgYW5kIHR1cGxlIGlkZW50aWZpZXIgaW5zdGVhZCwgYW5kIHRob3NlXG4gKiBVUkxzIG11c3QgcmVtYWluIGludGFjdC5cbiAqL1xuY29uc3QgZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4gPSAvKFwiLCApXCJodHRwczpcXC9cXC9ucG1cXC5mbGF0dFxcLnRlY2hcXC9bXlwiXSpcIi9nO1xuXG4vKipcbiAqIFJlbW92ZSBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBidW4ubG9jay5cbiAqXG4gKiBCdW4gd3JpdGVzIHRoZSB3b3Jrc3BhY2Ugcm9vdCdzIGxvY2tmaWxlIGV2ZW4gd2hlbiBhbiBpbnN0YWxsIHJ1bnMgZnJvbSBhIGNoaWxkIHBhY2thZ2UuIEluIGFcbiAqIEdpdCBjaGVja291dCB0aGUgc2VhcmNoIGNsaW1icyB0byB0aGF0IHJvb3Q7IHdpdGhvdXQgYSBjaGVja291dCBib3VuZGFyeSBpdCBpbnNwZWN0cyBvbmx5IHRoZVxuICogc3RhcnRpbmcgZGlyZWN0b3J5IHNvIGl0IGNhbm5vdCByZXdyaXRlIGFuIHVucmVsYXRlZCBhbmNlc3RvcidzIGxvY2tmaWxlLiBUaGUgcHJveHkgaXNcbiAqIGluc3RhbGwtdGltZSBwb2xpY3kgcmF0aGVyIHRoYW4gcmVwb3NpdG9yeSBzdGF0ZTogYW4gZW1wdHkgcmVzb2x2ZWQgc2xvdCBzdGlsbCBtYWtlcyBCdW4gdXNlIHRoZVxuICogY29uZmlndXJlZCBkZWZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIGxvY2tmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIG5vIGNoYW5nZSB3YXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQnVuTG9ja2ZpbGUoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsb2NrZmlsZVBhdGggPSBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aCk7XG4gIGlmICghbG9ja2ZpbGVQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKGd1YXJkUmVzb2x2ZWRVcmxQYXR0ZXJuLCAnJDFcIlwiJyk7XG4gIGlmIChub3JtYWxpemVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gIC8vIEFuIGF0b21pYyB3cml0ZSBrZWVwcyBhbiBpbnRlcnJ1cHRlZCByZXBsYWNlbWVudCBmcm9tIGxlYXZpbmcgYSB0cnVuY2F0ZWQgYnVuLmxvY2sgYmVoaW5kLlxuICB3cml0ZUZpbGVBdG9taWNTeW5jKGxvY2tmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICByZXR1cm4gbG9ja2ZpbGVQYXRoO1xufVxuXG5mdW5jdGlvbiBmaW5kQnVuTG9ja2ZpbGVQYXRoKHN0YXJ0RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWRTdGFydERpclBhdGggPSBwYXRoLnJlc29sdmUoc3RhcnREaXJQYXRoKTtcbiAgY29uc3QgcmVwb3NpdG9yeVJvb3REaXJQYXRoID0gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChyZXNvbHZlZFN0YXJ0RGlyUGF0aCk7XG4gIGlmICghcmVwb3NpdG9yeVJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgbG9ja2ZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkU3RhcnREaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpID8gbG9ja2ZpbGVQYXRoIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IGRpclBhdGggPSByZXNvbHZlZFN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9ja2ZpbGVQYXRoKSkgcmV0dXJuIGxvY2tmaWxlUGF0aDtcbiAgICBpZiAoZGlyUGF0aCA9PT0gcmVwb3NpdG9yeVJvb3REaXJQYXRoKSByZXR1cm47XG5cbiAgICBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5Um9vdERpclBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgZGlyUGF0aCA9IHN0YXJ0RGlyUGF0aDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJy5naXQnKSkpIHJldHVybiBkaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgcmV0dXJuO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG4iLCIvKiogV2hldGhlciBhIERvY2tlcmZpbGUgY29uc3VtZXMgd2IncyBnZW5lcmF0ZWQgbm9uLXNlY3JldCBlbnZpcm9ubWVudCBkaXJlY3RseSBvciB0aHJvdWdoIGl0cyBoZWxwZXIuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3VtZXNEb2NrZXJFbnYoZG9ja2VyZmlsZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZG9ja2VyZmlsZVRleHRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLnNvbWUoKGxpbmUpID0+ICEvXlxccyojL3UudGVzdChsaW5lKSAmJiAobGluZS5pbmNsdWRlcygnLmRvY2tlci5lbnYnKSB8fCBsaW5lLmluY2x1ZGVzKCdhcHBseS1kb2NrZXItZW52LnNoJykpKTtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy5hbnRpZ3Jhdml0eWNsaS8qKicsXG4gIC8vIEdpdCdzIG9iamVjdCBzdG9yZSBob2xkcyBjb3BpZXMgb2YgdHJhY2tlZCBmaWxlcyAoYW5kIGBkb3Q6IHRydWVgIG1ha2VzIHRoZW0gdmlzaWJsZSksIHNvXG4gIC8vIHNjYW5uaW5nIGl0IHdvdWxkIGJvdGggc2xvdyBldmVyeSBnbG9iIGRvd24gYW5kIGxldCBzdGFsZSBibG9icyBpbmZsdWVuY2UgZGV0ZWN0aW9uLlxuICAnKiovLmdpdC8qKicsXG4gIC8vIFRoZSBvcmctc3RhbmRhcmQgdGVtcG9yYXJ5IGRpcmVjdG9yeTsgc3RhbGUgY29waWVzIHVuZGVyIGl0IChlLmcuIHJldmlldyBzY3JhdGNoIGRpcnMpIG11c3RcbiAgLy8gbm90IGluZmx1ZW5jZSBsYW5ndWFnZSBkZXRlY3Rpb24uXG4gICcqKi8udG1wLyoqJyxcbiAgJyoqLy50bXAtKi8qKicsXG4gIC8vIExvY2FsIGNhY2hlcyBjYW4gY29udGFpbiBjb21wbGV0ZSB0aGlyZC1wYXJ0eSBzb3VyY2UgY2hlY2tvdXRzLiBUcmVhdGluZyB0aG9zZSBhcyByZXBvc2l0b3J5XG4gIC8vIGNvZGUgZ2VuZXJhdGVzIHdvcmtmbG93cyBmb3IgcGF0aHMgdGhhdCBhcmUgZ2l0aWdub3JlZCBhbmQgYWJzZW50IGZyb20gZnJlc2ggQ0kgY2hlY2tvdXRzLlxuICAnKiovLmNhY2hlLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxubGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICAvKiogQ29uZmluZXMgZ2VuZXJhdGVGaWxlIHdyaXRlcyB0byB0aGUgcmVwb3NpdG9yeSByb290ZWQgYXQgcm9vdERpclBhdGggKHVuZGVmaW5lZCBkaXNhYmxlcyBpdCkuICovXG4gIHNldFJvb3REaXJQYXRoKHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICByZWFsUm9vdERpclBhdGggPSByb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIG9ubHkgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gT3RoZXIgZmFpbHVyZXMgKGUuZy4gcGVybWlzc2lvbnMpIGFyZVxuICAgKiByZXRocm93biBzbyBjYWxsZXJzIHJlZ2VuZXJhdGluZyBjb25maWcgZmlsZXMgbmV2ZXIgb3ZlcndyaXRlIGNvbnRlbnQgdGhleSBjb3VsZCBub3QgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciBhIHdyaXRlIHRvIGZpbGVQYXRoIHdvdWxkIHBhc3MgdGhlIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMuICovXG4gIGFzeW5jIGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlYWRzIGEgc291cmNlIGZpbGUsIHJldHVybmluZyB1bmRlZmluZWQgd2hlbiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBPUiB3aGVuIGl0XG4gICAqIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIGEgY29tbWl0dGVkIHN5bWxpbmsgcG9pbnRpbmcgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSBtdXN0XG4gICAqIG5vdCBnZXQgaXRzIHRhcmdldCdzIGNvbnRlbnQgY29waWVkIGludG8gYSB0cmFja2VkIGZpbGUuIEEgc3ltbGluayB3aG9zZSByZXNvbHZlZCB0YXJnZXRcbiAgICogc3RheXMgaW5zaWRlIHRoZSByZXBvc2l0b3J5IGlzIGxlZ2l0aW1hdGUgKGUuZy4gYC5ub2RlLXZlcnNpb24gLT4gLm52bXJjYCkgYW5kIGlzIHJlYWQuXG4gICAqL1xuICBhc3luYyByZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmICghc3RhdHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGxldCByZWFsRmlsZVBhdGg6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlYWxGaWxlUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGZpbGVQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgcmVhZGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgZGFuZ2xpbmcgc3ltYm9saWMgbGluay5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgcmVhbFJvb3REaXJQYXRoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcmVhbEZpbGVQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiZcbiAgICAgICAgIXJlYWxGaWxlUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIGZpbGVQYXRoIChmb3JjZSwgb3B0aW9uYWxseSByZWN1cnNpdmUpIG9ubHkgd2hlbiBpdHMgUEFSRU5UIGRpcmVjdG9yeSByZXNvbHZlcyBpbnNpZGVcbiAgICogdGhlIHJlcG9zaXRvcnksIHNvIGEgc3ltbGlua2VkIGRpcmVjdG9yeSAoZS5nLiBhIGNvbW1pdHRlZCAuZ2l0aHViL3dvcmtmbG93cyBsaW5rKSBjYW4gbmV2ZXJcbiAgICogbWFrZSBjbGVhbnVwIGRlbGV0ZSBmaWxlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LiBSZW1vdmluZyBhIHN5bWxpbmsgZW50cnkgaXRzZWxmIGlzIGFsbG93ZWQ6XG4gICAqIHRoYXQgZGVsZXRlcyBvbmx5IHRoZSBsaW5rLCBuZXZlciBpdHMgdGFyZ2V0LiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlbW92YWwgd2FzIHBlcmZvcm1lZC5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IHJlY3Vyc2l2ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZW1vdmluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IG9wdGlvbnM/LnJlY3Vyc2l2ZSA/PyBmYWxzZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFdyaXRlcyBjb250ZW50IHZlcmJhdGltLCBhcHBseWluZyB0aGUgc2FtZSBzeW1saW5rL3JlcG9zaXRvcnktY29udGFpbm1lbnQgZ3VhcmRzIGFzIGdlbmVyYXRlRmlsZS4gKi9cbiAgYXN5bmMgd3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZmlsZSB3YXMgYWN0dWFsbHkgZ2VuZXJhdGVkIChmYWxzZSB3aGVuIHRoZSBjb25maW5lbWVudCBndWFyZHMgc2tpcCBpdCkuICovXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGxpbmVFbmRpbmc6ICdcXG4nIHwgJ1xcclxcbicgPSAnXFxuJyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghKGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIGB0cmltYCB0cmVhdHMgYSBCT00gYXMgd2hpdGVzcGFjZSwgc28gaXQgaXMgcmVhdHRhY2hlZCBhdCBwb3NpdGlvbiAwOiBkcm9wcGluZyBpdCB3b3VsZFxuICAgIC8vIHJld3JpdGUgdGhlIGVuY29kaW5nIG1hcmtlciBvZiBhIGZpbGUgdGhlIGdlbmVyYXRvciB3YXMgb25seSBhc2tlZCB0byB1cGRhdGUuXG4gICAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IGNvbnRlbnQuc3RhcnRzV2l0aCgn77u/JykgPyAn77u/JyA6ICcnO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgPSBgJHtieXRlT3JkZXJNYXJrfSR7bm9ybWFsaXplZENvbnRlbnR9JHtsaW5lRW5kaW5nfWA7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIE5ldmVyIHdyaXRlIHRocm91Z2ggYSBzeW1saW5rOiBhIChwb3NzaWJseSBkYW5nbGluZykgbGluayBjb21taXR0ZWQgaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5XG4gIC8vIGNvdWxkIHJlZGlyZWN0IHRoZSB3cml0ZSBvdXRzaWRlIGl0LlxuICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIGlmIChzdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB3cml0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBzeW1ib2xpYyBsaW5rLmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIShhd2FpdCBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aCkpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gQSBzeW1saW5rZWQgcGFyZW50IGRpcmVjdG9yeSB3b3VsZCByZWRpcmVjdCByZWFkcywgd3JpdGVzLCBhbmQgcmVtb3ZhbHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSxcbi8vIHNvIHJlcXVpcmUgdGhlIGNsb3Nlc3QgZXhpc3RpbmcgYW5jZXN0b3IgdG8gcmVzb2x2ZSBpbnNpZGUgdGhlIHJvb3Qgc2V0IGJ5IHRoZSBDTEkgZW50cnkgcG9pbnQuXG5hc3luYyBmdW5jdGlvbiBoYXNDb25maW5lZFBhcmVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChyZWFsUm9vdERpclBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIGxldCBhbmNlc3RvclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMoYW5jZXN0b3JQYXRoKSkge1xuICAgIGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvclBhdGgpO1xuICB9XG4gIGNvbnN0IHJlYWxBbmNlc3RvclBhdGggPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFscGF0aChhbmNlc3RvclBhdGgpO1xuICByZXR1cm4gcmVhbEFuY2VzdG9yUGF0aCA9PT0gcmVhbFJvb3REaXJQYXRoIHx8IHJlYWxBbmNlc3RvclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG5cbi8qKlxuICogUnVucyBldmVyeSB0YXNrIGluIGBwcm9taXNlUG9vbGAgYW5kIHJlamVjdHMgd2l0aCB0aGUgZmlyc3QgZXJyb3Igb25seSBhZnRlciBhbGwgb2YgdGhlbSBzZXR0bGUsXG4gKiBzbyBhIGNhbGxlciB0aGF0IGNhdGNoZXMgdGhlIGVycm9yIG5ldmVyIHByb2NlZWRzIHdoaWxlIGEgc2libGluZyB3cml0ZSBpcyBzdGlsbCBydW5uaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQWxsSW5Qb29sKHRhc2tzOiByZWFkb25seSAoKCkgPT4gUHJvbWlzZTx1bmtub3duPilbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHRhc2tzLm1hcCgodGFzaykgPT4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKHRhc2spKSk7XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykgdGhyb3cgcmVzdWx0LnJlYXNvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQVBJIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3luYyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbi8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIChHbykgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGFuZCBub1xuLy8gbG9uZ2VyIGV4cG9zZXMgYW4gaW4tcHJvY2VzcyBwYXJzZXIgc3VjaCBhcyBgdHMuY3JlYXRlU291cmNlRmlsZWAuIFBhcnNpbmcgbm93XG4vLyBoYXBwZW5zIGluIGEgc3Bhd25lZCBjb21waWxlciBzZXJ2ZXIgcmVhY2hlZCB0aHJvdWdoIHRoZSBhc3luY2hyb25vdXMgQVBJLCBzbyB3ZVxuLy8ga2VlcCBhIHNpbmdsZSBsYXppbHktY3JlYXRlZCBpbnN0YW5jZSBhbmQgcmV1c2UgaXQgYWNyb3NzIGV2ZXJ5IGZpeGVyIHRvIGF2b2lkXG4vLyBwYXlpbmcgdGhlIHByb2Nlc3Mtc3Bhd24gY29zdCBwZXIgZmlsZS5cbmxldCBhcGk6IEFQSSB8IHVuZGVmaW5lZDtcbmxldCBjb25uZWN0ZWQ6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUGFyc2VzIGEgc291cmNlIGZpbGUgaW50byBhIFR5cGVTY3JpcHQgQVNUIHVzaW5nIHRoZSBidW5kbGVkIG5hdGl2ZSBjb21waWxlci5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29tcGlsZXIgY2Fubm90IGxvYWQgdGhlIGZpbGUgKGUuZy4gaXQgaXMgbWlzc2luZ1xuICogb3IgdW5wYXJzYWJsZSkgc28gY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIGNvbnNlcnZhdGl2ZSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb3VyY2VGaWxlIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXBpID0gYXdhaXQgZ2V0QXBpKCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBhcGkudXBkYXRlU25hcHNob3QoeyBvcGVuRmlsZXM6IFtmaWxlUGF0aF0gfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IGF3YWl0IHNuYXBzaG90LmdldERlZmF1bHRQcm9qZWN0Rm9yRmlsZShmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHByb2plY3Q/LnByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaHV0cyBkb3duIHRoZSBzcGF3bmVkIGNvbXBpbGVyIHNlcnZlci4gVGhlIHNlcnZlciBrZWVwcyBhbiBvcGVuIElQQyBjaGFubmVsXG4gKiB0aGF0IHdvdWxkIG90aGVyd2lzZSBrZWVwIHRoZSBydW50aW1lIGV2ZW50IGxvb3AgYWxpdmUsIHNvIHdiZnkgbXVzdCBjYWxsIHRoaXNcbiAqIG9uY2UgaXRzIHJ1biBmaW5pc2hlcyBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3Bvc2VUeXBlU2NyaXB0QXBpKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBhcGk/LmNsb3NlKCk7XG4gIGFwaSA9IHVuZGVmaW5lZDtcbiAgY29ubmVjdGVkID0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcGkoKTogUHJvbWlzZTxBUEk+IHtcbiAgYXBpID8/PSBuZXcgQVBJKHsgY3dkOiBwcm9jZXNzLmN3ZCgpIH0pO1xuICAvLyBUaGUgY2xpZW50IG1hcmtzIGl0c2VsZiBjb25uZWN0ZWQgb25seSBvbmNlIGl0cyBmaXJzdCBzcGF3biBjb21wbGV0ZXMsIHNvIGNvbmN1cnJlbnRcbiAgLy8gZmlyc3QgcmVxdWVzdHMgKHRoZSBmaXhlcnMgcnVuIGluIHBhcmFsbGVsKSB3b3VsZCBlYWNoIHNwYXduIGEgY29tcGlsZXIgc2VydmVyOyB0aGVcbiAgLy8gZXh0cmEgc2VydmVycyBhcmUgbmV2ZXIgY2xvc2VkIGFuZCBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlIGFmdGVyIGBkaXNwb3NlVHlwZVNjcmlwdEFwaWAuXG4gIC8vIFRoZSBmaXJzdCByZXF1ZXN0IGlzIHRoZXJlZm9yZSBhd2FpdGVkIG9uY2UgYmVmb3JlIGFueSBvdGhlciBpcyBzZW50OyBhIGZhaWxlZCBvbmUgaXNcbiAgLy8gZm9yZ290dGVuIHNvIHRoYXQgdGhlIG5leHQgcmVxdWVzdCBjb25uZWN0cyBhZ2FpbiBpbnN0ZWFkIG9mIGZhaWxpbmcgZm9yIHRoZSB3aG9sZSBydW4uXG4gIGNvbm5lY3RlZCA/Pz0gYXBpLnVwZGF0ZVNuYXBzaG90KCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgY29ubmVjdGVkID0gdW5kZWZpbmVkO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgYXdhaXQgY29ubmVjdGVkO1xuICByZXR1cm4gYXBpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5cbi8vIFNldHRpbmdzIGV2ZXJ5IFdpbGxCb29zdGVyIE5leHQuanMgcHJvamVjdCBzaG91bGQgY2FycnkuIGBuYW1lYCBpcyB0aGUgdG9wLWxldmVsXG4vLyBwcm9wZXJ0eSBrZXkgdXNlZCB0byBkZXRlY3Qgd2hldGhlciB0aGUgc2V0dGluZyBhbHJlYWR5IGV4aXN0czsgYHRleHRgIGlzIGluc2VydGVkXG4vLyB2ZXJiYXRpbSAoYSB3aG9sZSBga2V5OiB2YWx1ZWAgcGFpcikgd2hlbiB0aGUga2V5IGlzIG1pc3NpbmcuXG5jb25zdCBtYW5hZ2VkUHJvcGVydGllczogcmVhZG9ubHkgeyBuYW1lOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXG4gIHsgbmFtZTogJ3JlYWN0Q29tcGlsZXInLCB0ZXh0OiAncmVhY3RDb21waWxlcjogdHJ1ZScgfSxcbiAgeyBuYW1lOiAncmVhY3RTdHJpY3RNb2RlJywgdGV4dDogJ3JlYWN0U3RyaWN0TW9kZTogdHJ1ZScgfSxcbiAgeyBuYW1lOiAndHlwZXNjcmlwdCcsIHRleHQ6ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nIH0sXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ3RzJywgJ210cycsICdjdHMnLCAnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IGF3YWl0IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGZpbGVQYXRoKTtcbiAgICBpZiAoIWV4dHJhY3RlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgc291cmNlLCBvYmplY3RMaXRlcmFsIH0gPSBleHRyYWN0ZWQ7XG5cbiAgICAvLyBgcHJvcGVydGllc2AgaW5jbHVkZXMgc3ByZWFkIGFzc2lnbm1lbnRzIChgLi4ucmVzdGApIHRoYXQgY2Fycnkgbm8gbmFtZSwgc28gZ3VhcmQgYmVmb3JlIHJlYWRpbmcgaXQuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChcbiAgICAgIG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PlxuICAgICAgICAnbmFtZScgaW4gcHJvcGVydHkgJiYgcHJvcGVydHkubmFtZSA/IGdldFByb3BlcnR5S2V5KHByb3BlcnR5Lm5hbWUsIHNvdXJjZSkgOiB1bmRlZmluZWRcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHMgPSBtYW5hZ2VkUHJvcGVydGllc1xuICAgICAgLmZpbHRlcigocHJvcGVydHkpID0+ICFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKHByb3BlcnR5Lm5hbWUpKVxuICAgICAgLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnRleHQpO1xuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IHNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgLy8gVGhlIG5hdGl2ZSBUUyBBU1QgZG9lcyBub3QgcmVsaWFibHkgZXhwb3NlIGBwcm9wZXJ0aWVzLmhhc1RyYWlsaW5nQ29tbWFgLCBzbyBzY2FuIHRoZSBzb3VyY2VcbiAgICAvLyBiZXR3ZWVuIHRoZSBsYXN0IHByb3BlcnR5IGFuZCB0aGUgY2xvc2luZyBicmFjZS4gU3RyaXAgY29tbWVudHMgZmlyc3Qgc28gYSBjb21tYSBpbnNpZGUgYVxuICAgIC8vIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4gYGZvbzogMSAvLyBhLCBiYCkgaXMgbm90IG1pc3Rha2VuIGZvciBhIHJlYWwgdHJhaWxpbmcgY29tbWEuXG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IHN0cmlwQ29tbWVudHMob2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KSkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHsgc291cmNlOiBhc3QuU291cmNlRmlsZTsgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc291cmNlID0gYXdhaXQgcGFyc2VTb3VyY2VGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkIGRlY2xhcmVzIHRoZSBjb25maWcgYXMgYGNvbnN0IG5leHRDb25maWc6IE5leHRDb25maWcgPSB7IC4uLiB9YCBhbmRcbiAgLy8gZXhwb3J0cyBpdCAocG9zc2libHkgd3JhcHBlZCwgZS5nLiBgd2l0aFNlbnRyeUNvbmZpZyguLi4pYCksIHNvIHRoZSBvYmplY3QgbGl0ZXJhbCBpcyByYXJlbHlcbiAgLy8gdGhlIGRpcmVjdCBvcGVyYW5kIG9mIGBleHBvcnQgZGVmYXVsdGAvYG1vZHVsZS5leHBvcnRzYC4gQ29sbGVjdCBldmVyeSBjYW5kaWRhdGUgYW5kIHBpY2sgdGhlXG4gIC8vIG1vc3QgYXV0aG9yaXRhdGl2ZSBvbmUgYmVsb3cuXG4gIGxldCBkaXJlY3RPYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGxldCBleHBvcnRlZElkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmFyaWFibGVPYmplY3RMaXRlcmFscyA9IG5ldyBNYXA8c3RyaW5nLCBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24+KCk7XG4gIGNvbnN0IHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHM6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbltdID0gW107XG5cbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoYXN0LmlzRXhwb3J0QXNzaWdubWVudChub2RlKSkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5leHByZXNzaW9uKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsKSB7XG4gICAgICAgIGRpcmVjdE9iamVjdExpdGVyYWwgPz89IG9iamVjdExpdGVyYWw7XG4gICAgICB9IGVsc2UgaWYgKGFzdC5pc0lkZW50aWZpZXIobm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUuZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFzdC5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSBhc3QuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJ1xuICAgICkge1xuICAgICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IHVud3JhcE9iamVjdExpdGVyYWwobm9kZS5yaWdodCk7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUucmlnaHQpKSB7XG4gICAgICAgIGV4cG9ydGVkSWRlbnRpZmllciA/Pz0gbm9kZS5yaWdodC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhc3QuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuaW5pdGlhbGl6ZXIpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwgJiYgYXN0LmlzSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuc2V0KG5vZGUubmFtZS5nZXRUZXh0KHNvdXJjZSksIG9iamVjdExpdGVyYWwpO1xuICAgICAgICAvLyBUaGUgYDogTmV4dENvbmZpZ2AgYW5ub3RhdGlvbiB3YmZ5IHdyaXRlcyBtYXJrcyB0aGUgY2Fub25pY2FsIGNvbmZpZyBvYmplY3QgKGFjY2VwdGluZ1xuICAgICAgICAvLyBxdWFsaWZpZWQgbmFtZXMgc3VjaCBhcyBgaW1wb3J0KCduZXh0JykuTmV4dENvbmZpZ2ApLlxuICAgICAgICBjb25zdCBhbm5vdGF0aW9uVHlwZSA9IG5vZGUudHlwZT8uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgICBpZiAoYW5ub3RhdGlvblR5cGUgIT09IHVuZGVmaW5lZCAmJiBpc05leHRDb25maWdUeXBlKGFubm90YXRpb25UeXBlKSkge1xuICAgICAgICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHMucHVzaChvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIGNvbnN0IG9iamVjdExpdGVyYWwgPVxuICAgIHR5cGVkQ29uZmlnT2JqZWN0TGl0ZXJhbHNbMF0gPz9cbiAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/XG4gICAgKGV4cG9ydGVkSWRlbnRpZmllciA/IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KGV4cG9ydGVkSWRlbnRpZmllcikgOiB1bmRlZmluZWQpID8/XG4gICAgdmFyaWFibGVPYmplY3RMaXRlcmFscy5nZXQoJ25leHRDb25maWcnKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWwgPyB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGU6IGFzdC5FeHByZXNzaW9uKTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY3VycmVudCA9IHVud3JhcFBhcmVudGhlc2VzKG5vZGUpO1xuICByZXR1cm4gYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oY3VycmVudCkgPyBjdXJyZW50IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJlbnRoZXNlcyhub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5FeHByZXNzaW9uIHtcbiAgbGV0IGN1cnJlbnQgPSBub2RlO1xuICB3aGlsZSAoYXN0LmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oY3VycmVudCkpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudC5leHByZXNzaW9uO1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vLyBNYXRjaCBib3RoIHRoZSBiYXJlIGBOZXh0Q29uZmlnYCBhbmQgcXVhbGlmaWVkIGZvcm1zIGxpa2UgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgLlxuZnVuY3Rpb24gaXNOZXh0Q29uZmlnVHlwZSh0eXBlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlVGV4dCA9PT0gJ05leHRDb25maWcnIHx8IHR5cGVUZXh0LmVuZHNXaXRoKCcuTmV4dENvbmZpZycpO1xufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBrZXkgd2l0aG91dCBzdXJyb3VuZGluZyBxdW90ZXMsIHNvIGAncmVhY3RDb21waWxlcidgIG1hdGNoZXMgYHJlYWN0Q29tcGlsZXJgLlxuLy8gSWRlbnRpZmllciwgc3RyaW5nLWxpdGVyYWwgYW5kIG51bWVyaWMtbGl0ZXJhbCBuYW1lcyBhbGwgZXhwb3NlIHRoZSB1bnF1b3RlZCB2YWx1ZSB2aWEgYC50ZXh0YC5cbmZ1bmN0aW9uIGdldFByb3BlcnR5S2V5KG5hbWU6IGFzdC5Qcm9wZXJ0eU5hbWUsIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICByZXR1cm4gJ3RleHQnIGluIG5hbWUgJiYgdHlwZW9mIG5hbWUudGV4dCA9PT0gJ3N0cmluZycgPyBuYW1lLnRleHQgOiBuYW1lLmdldFRleHQoc291cmNlKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9cXC9cXC9bXlxcbl0qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4Q2hha3JhVG9hc3RlcicsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuY2hha3JhKSByZXR1cm47XG5cbiAgICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90b2FzdGVyLnt0cyx0c3h9Jywge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgaWdub3JlOiBbJyoqLy4qLyoqJywgJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRlbnQuaW5jbHVkZXMoJ0NyZWF0ZVRvYXN0ZXJSZXR1cm4nKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcyhcImZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnXCIpIHx8XG4gICAgICAgICFjb250ZW50LmluY2x1ZGVzKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gY29udGVudFxuICAgICAgICAucmVwbGFjZShcbiAgICAgICAgICAvXmltcG9ydCAuKiBmcm9tICdAY2hha3JhLXVpXFwvcmVhY3QnOyQvbXUsXG4gICAgICAgICAgXCIkJlxcbmltcG9ydCB0eXBlIHsgQ3JlYXRlVG9hc3RlclJldHVybiB9IGZyb20gJ0BjaGFrcmEtdWkvcmVhY3QnO1wiXG4gICAgICAgIClcbiAgICAgICAgLnJlcGxhY2UoJ2V4cG9ydCBjb25zdCB0b2FzdGVyID0gY3JlYXRlVG9hc3RlcignLCAnZXhwb3J0IGNvbnN0IHRvYXN0ZXI6IENyZWF0ZVRvYXN0ZXJSZXR1cm4gPSBjcmVhdGVUb2FzdGVyKCcpO1xuICAgICAgaWYgKHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiBhc3QuU291cmNlRmlsZTtcbiAgbm9kZTogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0czogYm9vbGVhbik6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IHVzZSA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb24nXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSk7XG5cbiAgaWYgKHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKSB7XG4gICAgdXNlLnByb3BlcnRpZXMuYmFzZVVSTCA9IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyk7XG4gICAgdXNlLm1lbWJlck9yZGVyLnVuc2hpZnQoeyBraW5kOiAncHJvcGVydHknLCBrZXk6ICdiYXNlVVJMJyB9KTtcbiAgfVxuXG4gIHJldHVybiB0b1BhcnNlZE9iamVjdCh7XG4gICAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICAgIHVzZTogeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHVzZSB9LFxuICAgIC4uLihzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0c1xuICAgICAgPyB7XG4gICAgICAgICAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgICAgICAgICBjb21tYW5kOiBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKSxcbiAgICAgICAgICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgICAgICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICAgICAgICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgICAgICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgICAgICAgICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICBleHRyYU1lbWJlcnMsXG4gICAgbWVtYmVyT3JkZXI6IFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHByb3BlcnRpZXMpLm1hcCgoa2V5KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KSksXG4gICAgICAuLi5leHRyYU1lbWJlcnMubWFwKChfLCBpbmRleCk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KSksXG4gICAgXSxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBhd2FpdCBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWRPYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZSwgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICAvLyB3YiBkZXJpdmVzIE5FWFRfUFVCTElDX0JBU0VfVVJMIGZyb20gdGhlIHJlc29sdmVkIHBvcnQgZm9yIE5leHQuanMvdmluZXh0IGFwcHMgKHZpbmV4dFxuICAgIC8vIGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gYGRlcGVuZGluZy5uZXh0YCBjb3ZlcnMgYm90aCksIHNvIHRob3NlIG5lZWQgbm8gZGVjbGFyZWRcbiAgICAvLyB2YXJpYWJsZTsgb3RoZXIgcGFja2FnZXMgc3RpbGwgcmVxdWlyZSBhIGRlY2xhcmF0aW9uLlxuICAgIGNvbnN0IHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzID1cbiAgICAgIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZywgcGFyc2VkKSAmJlxuICAgICAgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCAoYXdhaXQgZG9lc0RlZmluZU5leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKSkpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKG1lcmdlZCwgZGVmYXVsdENvbmZpZyk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeVZhbHVlKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZWQgfSwgMCk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlLnRleHQ7XG4gICAgY29uc3Qgc3RhcnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0U3RhcnQoZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGNvbnN0IGVuZCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBzdGFydCl9JHtuZXdPYmplY3RMaXRlcmFsfSR7b2xkQ29udGVudC5zbGljZShlbmQpfWA7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2U6IFBhcnNlZE9iamVjdCwgb3ZlcnJpZGU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcGVydHlLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhvdmVycmlkZS5wcm9wZXJ0aWVzKSk7XG4gIGNvbnN0IGV4dHJhTWVtYmVycyA9IFsuLi5iYXNlLmV4dHJhTWVtYmVycywgLi4ub3ZlcnJpZGUuZXh0cmFNZW1iZXJzXTtcbiAgLy8gS2VlcCBkZWZhdWx0LW9ubHkgbWVtYmVycyBiZWZvcmUgcGFyc2VkIG1lbWJlcnMgc28gc3ByZWFkcyBhbmQgZXhwbGljaXQgbG9jYWwgcHJvcGVydGllcyByZXRhaW4gcHJlY2VkZW5jZS5cbiAgY29uc3QgbWVtYmVyT3JkZXIgPSBbXG4gICAgLi4uYmFzZS5tZW1iZXJPcmRlci5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgIT09ICdwcm9wZXJ0eScgfHwgIW92ZXJyaWRlUHJvcGVydHlLZXlzLmhhcyhtZW1iZXIua2V5KSksXG4gICAgLi4ub3ZlcnJpZGUubWVtYmVyT3JkZXIubWFwKChtZW1iZXIpOiBPYmplY3RNZW1iZXIgPT4ge1xuICAgICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSByZXR1cm4gbWVtYmVyO1xuICAgICAgcmV0dXJuIHsga2luZDogJ2V4dHJhJywgaW5kZXg6IGJhc2UuZXh0cmFNZW1iZXJzLmxlbmd0aCArIG1lbWJlci5pbmRleCB9O1xuICAgIH0pLFxuICBdO1xuICBjb25zdCBwcm9wZXJ0aWVzID0geyAuLi5iYXNlLnByb3BlcnRpZXMgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGUucHJvcGVydGllcykpIHtcbiAgICBwcm9wZXJ0aWVzW2tleV0gPSBtZXJnZVBhcnNlZFZhbHVlKHByb3BlcnRpZXNba2V5XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB7IGV4dHJhTWVtYmVycywgbWVtYmVyT3JkZXIsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRWYWx1ZShiYXNlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCwgb3ZlcnJpZGU6IFBhcnNlZFZhbHVlKTogUGFyc2VkVmFsdWUge1xuICBpZiAoYmFzZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgb3ZlcnJpZGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlLnZhbHVlLCBvdmVycmlkZS52YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4gb3ZlcnJpZGU7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWFuYWdlZFVzZURlZmF1bHRzKGNvbmZpZzogUGFyc2VkT2JqZWN0LCBkZWZhdWx0Q29uZmlnOiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3QgdXNlID0gY29uZmlnLnByb3BlcnRpZXMudXNlO1xuICBjb25zdCBkZWZhdWx0VXNlID0gZGVmYXVsdENvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgaWYgKHVzZT8ua2luZCAhPT0gJ29iamVjdCcgfHwgZGVmYXVsdFVzZT8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RyYWNlJywgJ3NjcmVlbnNob3QnLCAndmlkZW8nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRVc2UudmFsdWUucHJvcGVydGllc1trZXldO1xuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHVzZS52YWx1ZS5wcm9wZXJ0aWVzW2tleV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1hbmFnZUFwcFNlcnZlckRlZmF1bHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcGFyc2VkOiBQYXJzZWRPYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZGVwZW5kaW5nLm5leHQgfHxcbiAgICBwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgIGRvZXNPYmplY3RIYXZlQmFzZVVybChwYXJzZWQucHJvcGVydGllcy51c2UpIHx8XG4gICAgZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZCB9LCAnTkVYVF9QVUJMSUNfQkFTRV9VUkwnKVxuICApO1xufVxuXG5mdW5jdGlvbiBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwodmFsdWU6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgdmFsdWUudmFsdWUucHJvcGVydGllcy5iYXNlVVJMICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGl0ZXJhbFRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWUuaW5jbHVkZXMobGl0ZXJhbFRleHQpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5JykgcmV0dXJuIHZhbHVlLnZhbHVlLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKTtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnMuc29tZSgobWVtYmVyKSA9PiBtZW1iZXIuaW5jbHVkZXMobGl0ZXJhbFRleHQpKSB8fFxuICAgIE9iamVjdC52YWx1ZXModmFsdWUudmFsdWUucHJvcGVydGllcykuc29tZSgoY2hpbGQpID0+IGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKGNoaWxkLCBsaXRlcmFsVGV4dCkpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgZm9yIChjb25zdCBlbnZGaWxlUGF0aCBvZiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKC9ORVhUX1BVQkxJQ19CQVNFX1VSTFxccyo9L20udGVzdChjb250ZW50KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgZW52IGZpbGVzIGFyZSBleHBlY3RlZCBpbiBzb21lIHJlcG9zLlxuICAgIH1cbiAgfVxuXG4gIC8vIFNvbWUgUGxheXdyaWdodCBjb25maWdzIG9ubHkgZGVmaW5lIGJyb3dzZXIgcHJvamVjdHMgb3IgZml4dHVyZXMgYW5kIGRvIG5vdFxuICAvLyBzdGFydCBhIHdlYiBhcHAuIEF2b2lkIGZvcmNpbmcgYW4gYXBwLXNlcnZlciBVUkwgaW50byB0aG9zZSBwYWNrYWdlcy5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBlbnZGaWxlTmFtZXMgPSBbJ2Zub3gudG9tbCcsICdtaXNlLnRvbWwnLCAnbWlzZS50ZXN0LnRvbWwnXTtcbiAgY29uc3QgZW52RmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAobGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpOyA7IGN1cnJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKSkge1xuICAgIGVudkZpbGVQYXRocy5wdXNoKC4uLmVudkZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsIGZpbGVOYW1lKSkpO1xuXG4gICAgLy8gUGxheXdyaWdodCBjb25maWdzIG9mdGVuIGxpdmUgaW4gcGFja2FnZXMvKiB3aGlsZSBzaGFyZWQgZW52IGZpbGVzIGxpdmUgYXQgdGhlXG4gICAgLy8gcmVwb3NpdG9yeSByb290LCBzbyB3YWxrIHVwd2FyZCB1bnRpbCB0aGUgdGFyZ2V0IHJlcG8gYm91bmRhcnkuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCAnLmdpdCcpKSkgYnJlYWs7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGVudkZpbGVQYXRocztcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChvYmplY3Q6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgY29tbWFuZCA9IHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQ7XG4gIC8vIExpYnJhcmllcyBjYW4gdXNlIFBsYXl3cmlnaHQncyB3ZWJTZXJ2ZXIgdG8gYnVpbGQgYW5kIGxhdW5jaCBhIGZpeHR1cmUgZXZlbiB0aG91Z2ggYHdiIHN0YXJ0YFxuICAvLyBpbnRlbnRpb25hbGx5IGhhcyBubyB0ZXN0IHNlcnZlciBmb3IgdGhlIGxpYnJhcnkgaXRzZWxmLiBQcmVzZXJ2ZSB0aG9zZSBjdXN0b20gbGlmZWN5Y2xlXG4gIC8vIGNvbW1hbmRzOyBvbmx5IGFkZCB0aGUgY29tbWFuZCB3aGVuIHdiZnkgYWxyZWFkeSBvd25zIGl0LlxuICBpZiAoY29tbWFuZCAmJiAhaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZCkpIHJldHVybjtcblxuICAvLyBQbGF5d3JpZ2h0IHJlcXVpcmVzIGBjb21tYW5kYCB3aGVuZXZlciBgd2ViU2VydmVyYCBleGlzdHM7IGFuIGV4dGVybmFsbHkgbWFuYWdlZCBzZXJ2ZXIgc2hvdWxkXG4gIC8vIG9taXQgYHdlYlNlcnZlcmAgaW5zdGVhZC4gS2VlcCBmaWxsaW5nIHRoaXMgcmVxdWlyZWQgZmllbGQgd2hlbiBhIHBhcnRpYWwgbWFuYWdlZCBibG9jayBsYWNrcyBpdC5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKCkpO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFdiU3RhcnRUZXN0Q29tbWFuZChjb21tYW5kOiBQYXJzZWRWYWx1ZSk6IGJvb2xlYW4ge1xuICBpZiAoY29tbWFuZC5raW5kICE9PSAnbGl0ZXJhbCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGNvbW1hbmQudmFsdWUudHJpbSgpID09PSBnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk6IHN0cmluZyB7XG4gIHJldHVybiBgJ2J1biB3YiBzdGFydCAtLW1vZGUgdGVzdCdgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiBhc3QuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3VuZCkgcmV0dXJuO1xuICAgIGlmIChhc3QuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiBhc3QuRXhwcmVzc2lvbiwgc291cmNlOiBhc3QuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKGFzdC5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IGxpdGVyYWwoa2V5KTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8XG4gICAgICAoIWFzdC5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIWFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpXG4gICAgKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlZC5leHRyYU1lbWJlcnMucHVzaChwcm9wZXJ0eS5nZXRUZXh0KHNvdXJjZSkpIC0gMTtcbiAgICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICBpZiAodmFsdWUudmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuXG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGVtaXR0ZWRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlci5mbGF0TWFwKChtZW1iZXIsIGluZGV4KSA9PiB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAnZXh0cmEnKSB7XG4gICAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdE1lbWJlcih2YWx1ZS52YWx1ZS5leHRyYU1lbWJlcnNbbWVtYmVyLmluZGV4XSA/PyAnJywgaW5kZW50KV07XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuZ2V0KG1lbWJlci5rZXkpICE9PSBpbmRleCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzW21lbWJlci5rZXldO1xuICAgIGlmICghaXRlbSB8fCBlbWl0dGVkUHJvcGVydGllcy5oYXMobWVtYmVyLmtleSkpIHJldHVybiBbXTtcbiAgICBlbWl0dGVkUHJvcGVydGllcy5hZGQobWVtYmVyLmtleSk7XG4gICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShtZW1iZXIua2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KV07XG4gIH0pO1xuICBsaW5lcy5wdXNoKFxuICAgIC4uLk9iamVjdC5lbnRyaWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIWVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhrZXkpKVxuICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCkpXG4gICk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkobWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbWVtYmVyXSBvZiBtZW1iZXJPcmRlci5lbnRyaWVzKCkpIHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHtcbiAgICAgIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXkuc2V0KG1lbWJlci5rZXksIGluZGV4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhc3RQcm9wZXJ0eUluZGV4QnlLZXk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdFByb3BlcnR5KGtleTogc3RyaW5nLCBpdGVtOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlciwgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKGl0ZW0sIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgfVxuICB9XG4gIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdE1lbWJlcihtZW1iZXI6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdHJpbmdpZmllZCA9IG1lbWJlci5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgbGluZV0gb2Ygc3RyaW5naWZpZWQuZW50cmllcygpKSB7XG4gICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7bGluZX1gO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG50eXBlIFdpbGxCb29zdGVyT3JnYW5pemF0aW9uID0gJ1dpbGxCb29zdGVyJyB8ICdXaWxsQm9vc3RlckxhYic7XG50eXBlIFJlcG9zaXRvcnlGdWxsTmFtZSA9IGAke1dpbGxCb29zdGVyT3JnYW5pemF0aW9ufS8ke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZub3hSZXBvc2l0b3J5U2NvcGUge1xuICBvcmdhbml6YXRpb25zPzogcmVhZG9ubHkgV2lsbEJvb3N0ZXJPcmdhbml6YXRpb25bXTtcbiAgcmVwb3NpdG9yaWVzPzogcmVhZG9ubHkgUmVwb3NpdG9yeUZ1bGxOYW1lW107XG4gIC8vIFJlc3RyaWN0cyB0aGUgc2NvcGUgdG8gcmVwb3NpdG9yaWVzIG9mIHRoZSBnaXZlbiB2aXNpYmlsaXR5LiBQdWJsaWMgcmVwb3NpdG9yaWVzIHB1Ymxpc2ggdGhlaXJcbiAgLy8gY2lwaGVydGV4dHMgdG8gdGhlIHdvcmxkLCBzbyB0aGV5IG11c3QgdXNlIGEgQ0kgaWRlbnRpdHkgc2VwYXJhdGUgZnJvbSB0aGUgb3JnLWludGVybmFsIG9uZTpcbiAgLy8gbGVha2luZyBlaXRoZXIgQ0kga2V5IG11c3Qgbm90IGV4cG9zZSB0aGUgb3RoZXIgc2lkZSdzIHNlY3JldHMuXG4gIHZpc2liaWxpdHk/OiAncHVibGljJyB8ICdwcml2YXRlJztcbn1cblxuaW50ZXJmYWNlIEZub3hBZ2VQcmluY2lwYWwge1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpY0tleXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZXBvc2l0b3J5U2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGU7XG4gIC8vIE1hcmtzIHRoZSBwcmluY2lwYWwgYXMgYSBDSSBpZGVudGl0eSBhbmQgbmFtZXMgdGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyBpdHMgcHJpdmF0ZSBrZXkuXG4gIC8vIEV2ZXJ5IGZub3gtbWFuYWdlZCByZXBvc2l0b3J5IG11c3QgcmVzb2x2ZSBvbmUgKGdlbmVyYXRlRm5veFRvbWwgZmFpbHMgY2xvc2VkIG90aGVyd2lzZTogYVxuICAvLyByb3N0ZXIgd2l0aG91dCBhIENJIHJlY2lwaWVudCB3b3VsZCByZS1lbmNyeXB0IHNlY3JldHMgdGhhdCBDSSBjYW4gbmV2ZXIgZGVjcnlwdCBhZ2FpbiksIGFuZFxuICAvLyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yIGRlcml2ZXMgaXRzIGNhbGxlciBtYXBwaW5ncyBmcm9tIHRoZSBzYW1lIHJlc29sdXRpb24gc28gdGhlIHR3byBjYW5cbiAgLy8gbmV2ZXIgZGlzYWdyZWUgb24gd2hpY2ggQ0kgaWRlbnRpdHkgYXBwbGllcy5cbiAgY2lBZ2VLZXlTZWNyZXROYW1lPzogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUmVjaXBpZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXk6IHN0cmluZztcbn1cblxuLy8gVGhlIGFnZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgdG8gZGVjcnlwdCBlYWNoIGZub3gtbWFuYWdlZCByZXBvc2l0b3J5LiBUbyBncmFudCBhY2Nlc3MsIGFkZCB0aGVcbi8vIHByaW5jaXBhbCdzIHB1YmxpYyBrZXlzIGFuZCByZXBvc2l0b3J5IHNjb3BlIGhlcmUuIE9yZ2FuaXphdGlvbiBzY29wZXMgaW5jbHVkZSBldmVyeSBjdXJyZW50IGFuZFxuLy8gZnV0dXJlIHJlcG9zaXRvcnkgaW4gdGhhdCBvcmdhbml6YXRpb247IHVzZSByZXBvc2l0b3JpZXMgZm9yIGV4YWN0IG93bmVyL3JlcG9zaXRvcnkgZ3JhbnRzLiBUaGVcbi8vIG5leHQgd2JmeSBydW4gb24gZWFjaCBtYXRjaGluZyByZXBvc2l0b3J5IHJld3JpdGVzIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sIGFuZCByZS1lbmNyeXB0cyBpdHNcbi8vIGNvbW1pdHRlZCBzZWNyZXRzIGZvciB0aGUgcmVzdWx0aW5nIHJlY2lwaWVudCBzZXQuIEEgc2NvcGUncyBvcHRpb25hbCB2aXNpYmlsaXR5IGNvbnN0cmFpbnRcbi8vIHNlbGVjdHMgb25seSBwdWJsaWMgb3Igb25seSBwcml2YXRlIHJlcG9zaXRvcmllcyAodXNlZCB0byBrZWVwIHRoZSBvcmctaW50ZXJuYWwgYW5kIHRoZVxuLy8gcHVibGljLXJlcG9zaXRvcnkgQ0kgaWRlbnRpdGllcyBhcGFydCkuIFJlbW92aW5nIGEgc2NvcGUgY2Fubm90IHJldm9rZSBjaXBoZXJ0ZXh0XG4vLyBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIEdpdCBoaXN0b3J5LCBzbyByb3RhdGUgdGhlIHNlY3JldCB2YWx1ZXMgdGhhdCBwcmluY2lwYWwgY291bGQgZGVjcnlwdC5cbi8vIE9ubHkgcHVibGljIGtleXMgbWF5IGFwcGVhciBoZXJlOyBhIENJIGlkZW50aXR5J3MgcHJpdmF0ZSBrZXkgc3VwcGxpZXMgdGhlIEZOT1hfQUdFX0tFWSAob3IsXG4vLyBmb3IgcHVibGljIHJlcG9zaXRvcmllcywgUFVCTElDX0ZOT1hfQUdFX0tFWSkgb3JnYW5pemF0aW9uIHNlY3JldC5cbmV4cG9ydCBjb25zdCBGTk9YX0FHRV9QUklOQ0lQQUxTID0gW1xuICB7XG4gICAgbmFtZTogJ2V4a2F6dXUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWoyMzU0eGh2bTNmdjl5Nzd0NWc2eTNxOG1leGdrMm1mMDB0Z3JremdwNzN0eW5ydno1NXM4YXVheXcnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncG9uaGFydScsXG4gICAgcHVibGljS2V5czogW1xuICAgICAgJ2FnZTE4cnVnbGRmOWh0YzZ1bTVlcGxweDI3azUzZXA0em4wbGh6d2ZmZ254emhycTBjN3pndnlxM3pjY2R5JyxcbiAgICAgICdhZ2Uxbnoybjk5Y3JqcjducDl4amdsd2ZmZmMzZHVkNDVkaGV3cXpxZnpwenRrZHd1NGhqNzRncTZlbDUzMycsXG4gICAgXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICAvLyBUaGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5ICh0aGUgRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2IudHh0KS5cbiAgICBuYW1lOiAnY2knLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWEyYzZlZjZhaGw2bW1raGdxdHhnMG1ndGQ3eXNzcG50cTdyeHVzdjI2ZWZ4aG51aGxjZHNyOWRwYWsnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddLCB2aXNpYmlsaXR5OiAncHJpdmF0ZScgfSxcbiAgICBjaUFnZUtleVNlY3JldE5hbWU6ICdGTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgLy8gVGhlIENJIGlkZW50aXR5IGRlZGljYXRlZCB0byBwdWJsaWMgcmVwb3NpdG9yaWVzICh0aGUgUFVCTElDX0ZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb25cbiAgICAvLyBzZWNyZXQgLyB+Ly5jb25maWcvZm5veC9hZ2UtY2ktd2ItcHVibGljLnR4dCkuIFNjb3BlZCB0byBXaWxsQm9vc3RlciBvbmx5IGJlY2F1c2UgdGhlXG4gICAgLy8gUFVCTElDX0ZOT1hfQUdFX0tFWSBzZWNyZXQgaXMgcmVnaXN0ZXJlZCBpbiB0aGF0IG9yZ2FuaXphdGlvbiBhbG9uZTsgYSBwdWJsaWNcbiAgICAvLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5IHJlc29sdmVzIE5PIENJIGlkZW50aXR5IGFuZCBnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvbiBpdFxuICAgIC8vIChXaWxsQm9vc3RlckxhYiBkb2VzIG93biBwdWJsaWMgcmVwb3NpdG9yaWVzLCBlLmcuIGl0cyByZXVzYWJsZS13b3JrZmxvd3Mgc3luYyBtaXJyb3IsIGJ1dFxuICAgIC8vIG5vbmUgb2YgdGhlbSB1c2UgZm5veCDigJQgcmVnaXN0ZXIgdGhlIHNlY3JldCB0aGVyZSBhbmQgZXh0ZW5kIHRoaXMgc2NvcGUgaWYgb25lIGV2ZXIgZG9lcykuXG4gICAgbmFtZTogJ2NpLXB1YmxpYycsXG4gICAgcHVibGljS2V5czogWydhZ2UxZmhlYTg1eGp3cDg5bHdxM2pjbndqMzJzd2gzdjI0cHdwYXJxaDVsN3FrZ3ZjNGF4M3AwcWw2ZHUzNiddLFxuICAgIHJlcG9zaXRvcnlTY29wZTogeyBvcmdhbml6YXRpb25zOiBbJ1dpbGxCb29zdGVyJ10sIHZpc2liaWxpdHk6ICdwdWJsaWMnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnUFVCTElDX0ZOT1hfQUdFX0tFWScsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAncmVtaW4nLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW13NHB6OWR1ank5ZG1oazBwYWxxYXdqa2o3bTRrN3p4Nzh5cjlmanQ2M3NhNWwzZTQzdXE2bncwMDQnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXJpZXMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMW5uMGVoeWFlbnlxOGttbnE0Mjk0a3p6Z3h2NWRuZjZwZXAyY2RrcmF4emZxbGs3eGdzcnFxbjZubjknXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogW1xuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnQtY2hhbGxlbmdlcycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9hZ2VudGljLXdvcmtmbG93cy1kYXNoYm9hcmQnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hlZXJsaW5ncycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL3Byb21wdC1zdHVkeScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9leGVyY29kZScsXG4gICAgICAgICdXaWxsQm9vc3Rlci9qdWRnZScsXG4gICAgICBdLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnc3VuYWdhJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTF1bHh6bjZ5NjhrdTM0Y3B4NWZ5YTVnZjdybnJ3ejB1ZmxueWU2dXh1aGczNHAybmpoZ2txbWc3M2c0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFsnV2lsbEJvb3N0ZXIvYWktb2NyJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdheWFtZScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdnhtMmdzMDAzcnV3bThwNmgzaHY3eGFzanUyczhrNG14bWMzNHptNmdyZHd6bnJzMDlucTZ4ejV2eiddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9jaG9mdS13YWxraW5nJywgJ1dpbGxCb29zdGVyL2V4ZXJjb2RlJywgJ1dpbGxCb29zdGVyL2p1ZGdlJ10sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IEZub3hBZ2VQcmluY2lwYWxbXTtcblxuaW50ZXJmYWNlIEZub3hUb21sIHtcbiAgaW1wb3J0PzogdW5rbm93bjtcbiAgcHJvdmlkZXJzPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxubGV0IGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG5sZXQgbWlncmF0aW9uTWFya2VyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG5cbi8qKiBXaGV0aGVyIGFueSBmbm94IHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gZmFpbGVkIGluIHRoZSBjdXJyZW50IHJlcG9zaXRvcnk7IHNldHVwU2VjcmV0cyBtdXN0IG5vdCB1cGxvYWQgdGhlbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGbm94U3luY0ZhaWxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZub3hTeW5jRmFpbGVkO1xufVxuXG4vKipcbiAqIFN5bmNocm9uaXplcyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gZXZlcnkgZm5veC50b21sIHdpdGggdGhlIHByaW5jaXBhbHMgYXV0aG9yaXplZCBmb3IgdGhpc1xuICogcmVwb3NpdG9yeSBhbmQgcmUtZW5jcnlwdHMgdGhlIGNvbW1pdHRlZCBzZWNyZXRzIHdoZW4gdGhlIHJlY2lwaWVudCBzZXQgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRm5veFRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGhlIGZhaWx1cmUgZmxhZyBpcyBwZXIgcmVwb3NpdG9yeTogd2JmeSBjYW4gcHJvY2VzcyBtdWx0aXBsZSB3b3JraW5nIGRpcmVjdG9yaWVzIGluIG9uZVxuICAgIC8vIGludm9jYXRpb24sIGFuZCBhbiBlYXJsaWVyIHJlcG9zaXRvcnkncyBmYWlsdXJlIG11c3Qgbm90IHZldG8gYSBsYXRlciByZXBvc2l0b3J5J3MgdXBsb2FkLlxuICAgIGZub3hTeW5jRmFpbGVkID0gZmFsc2U7XG4gICAgLy8gQSByZXBvc2l0b3J5IG91dHNpZGUgV2lsbEJvb3N0ZXIvV2lsbEJvb3N0ZXJMYWIgbWFuYWdlcyBpdHMgb3duIHJlY2lwaWVudCBzZXQgKGUuZy4gYVxuICAgIC8vIHBlcnNvbmFsIHJlcG9zaXRvcnkgd2l0aCBpdHMgb3duIENJIGlkZW50aXR5KSwgc28gcmV3cml0aW5nIGl0IHRvIHRoZSBvcmcgcm9zdGVyIHdvdWxkIGdyYW50XG4gICAgLy8gb3JnIG1lbWJlcnMgYWNjZXNzIGFuZCByZS1lbmNyeXB0IHNlY3JldHMgZm9yIGEgQ0kga2V5IHRoYXQgcmVwb3NpdG9yeSBkb2VzIG5vdCB1c2UuXG4gICAgLy8gc2V0dXBTZWNyZXRzIG5ldmVyIHVwbG9hZHMgc2VjcmV0cyBmb3Igc3VjaCByZXBvc2l0b3JpZXMgZWl0aGVyLCBzbyBza2lwIGVudGlyZWx5LlxuICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykgcmV0dXJuO1xuICAgIGNvbnN0IGFnZVJlY2lwaWVudHMgPSBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnKTtcbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIEEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgaXMgdW5zdXBwb3J0ZWQ6IHNldHVwU2VjcmV0cyB3b3VsZCB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmRcbiAgICAgIC8vIGRlbGV0ZSBGTk9YX0FHRV9LRVkgZXZlbiB0aG91Z2ggdGhlIG5lc3RlZCBjb25maWcncyBDSSBzdGlsbCBuZWVkcyBpdC5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIE9ubHkgYWdlLXVzaW5nIGNvbmZpZ3MgY2FycnkgdGhhdCByaXNrLiBXaXRob3V0IGEgcm9vdCBwcm92aWRpbmcgdGhlIGFnZSBwcm92aWRlciwgYVxuICAgICAgICAvLyBzdHJheSBjb25maWcgdGhhdCBkZWNsYXJlcyBub25lIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIChlLmcuIGEgcGxhaW50ZXh0IHRlc3RcbiAgICAgICAgLy8gZml4dHVyZSBvciBleGFtcGxlIGNvbmZpZyBhbnkgcmVwb3NpdG9yeSBtYXkgbGVnaXRpbWF0ZWx5IGNvbW1pdCksIHNvIGl0IG5laXRoZXIgbmVlZHNcbiAgICAgICAgLy8gcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBub3Igb3ducyBhbiBGTk9YX0FHRV9LRVkgYW5kIG11c3Qgbm90IGJsb2NrIHRoZSBydW4uXG4gICAgICAgIGNvbnN0IHN0cmF5RmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKS5maWx0ZXIoKGZpbGVQYXRoKSA9PlxuICAgICAgICAgIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoKVxuICAgICAgICApO1xuICAgICAgICBpZiAoc3RyYXlGaWxlUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggY29uZmlncyBleGlzdCB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWw6ICR7c3RyYXlGaWxlUGF0aHMuam9pbignLCAnKX0uIEFkZCBhIHJvb3QgZm5veC50b21sLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGYWlsIGNsb3NlZDogd2l0aG91dCBnaXQgaW5mb3JtYXRpb24gYSBuZXN0ZWQtb25seSBmbm94IGxheW91dCBjYW5ub3QgYmUgcnVsZWQgb3V0LCBhbmRcbiAgICAgICAgLy8gc2V0dXBTZWNyZXRzIHdvdWxkIG90aGVyd2lzZSB0YWtlIHRoZSBkb3RlbnYgcGF0aCBhbmQgZGVsZXRlIEZOT1hfQUdFX0tFWS5cbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY2hlY2sgZm9yIG5lc3RlZCBmbm94IGNvbmZpZ3MgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3J9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIGZhaWxlZCB2aXNpYmlsaXR5IGxvb2t1cCBjb2xsYXBzZXMgaXNQdWJsaWNSZXBvIHRvIGZhbHNlLCB3aGljaCB3b3VsZCBzaWxlbnRseSByZS1lbmNyeXB0XG4gICAgLy8gYSBwdWJsaWMgcmVwb3NpdG9yeSdzIHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzIHRvIHRoZSBvcmctaW50ZXJuYWwgQ0kgaWRlbnRpdHkgKGFuZCB2aWNlXG4gICAgLy8gdmVyc2EgZHJvcCB0aGUgcHVibGljIG9uZSkuIEZhaWwgaW5zdGVhZCBvZiBndWVzc2luZyB3aGVuZXZlciB2aXNpYmlsaXR5IGNoYW5nZXMgdGhlIHJvc3Rlci5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duICYmIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIHRoZSB2aXNpYmlsaXR5IG9mICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChHaXRIdWIgbG9va3VwIGZhaWxlZCkgYW5kIHRoZSBDSSByZWNpcGllbnQgZGVwZW5kcyBvbiBpdC4gQ2hlY2sgbmV0d29yayBhbmQgZ2ggYXV0aGVudGljYXRpb24sIHRoZW4gcmVydW4gd2JmeS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBCb3RoIENJIGlkZW50aXRpZXMgYXJlIHZpc2liaWxpdHktY29uc3RyYWluZWQsIHNvIGEgcmVwb3NpdG9yeSBjYW4gZmFsbCB0aHJvdWdoIEJPVEggKGUuZy4gYVxuICAgIC8vIHB1YmxpYyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3J5LCB3aG9zZSBvcmdhbml6YXRpb24gaGFzIG5vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0KS5cbiAgICAvLyBSZS1lbmNyeXB0aW5nIGZvciBhIHJvc3RlciB3aXRob3V0IGEgQ0kgaWRlbnRpdHkgd291bGQgbGVhdmUgQ0kgdW5hYmxlIHRvIGRlY3J5cHQgYW55dGhpbmcsXG4gICAgLy8gZmFpbGluZyBvbmx5IGF0IHJ1bnRpbWUgaW4gQWN0aW9uczsgZmFpbCBsb3VkbHkgaGVyZSBpbnN0ZWFkLlxuICAgIGlmICghcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUocm9vdENvbmZpZykpIHtcbiAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2Ugbm8gQ0kgaWRlbnRpdHkgaXMgc2NvcGVkIHRvICR7cm9vdENvbmZpZy5yZXBvQXV0aG9yfS8ke3Jvb3RDb25maWcucmVwb05hbWV9IChwdWJsaWMgcmVwb3NpdG9yaWVzIGFyZSBzdXBwb3J0ZWQgb25seSBpbiB0aGUgV2lsbEJvb3N0ZXIgb3JnYW5pemF0aW9uKS4gUHJvdmlzaW9uIHRoZSBtYXRjaGluZyBvcmdhbml6YXRpb24gc2VjcmV0IGFuZCBleHRlbmQgdGhlIENJIHNjb3BlcyBpbiB3YmZ5IGZpcnN0LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSBtaWdyYXRpb24gaXMgdHJhbnNhY3Rpb25hbCBvdmVyIGV2ZXJ5IG1hbmFnZWQgZm5veC50b21sOiByZXJ1bnMgbXVzdCByZXRyeSBmcm9tIHRoZVxuICAgIC8vIG9yaWdpbmFsIHN0YXRlLCBhbmQgYSBwYXJ0aWFsbHkgbWlncmF0ZWQgdHJlZSBjb3VsZCBvdGhlcndpc2UgYmVjb21lIHVuZGVjcnlwdGFibGUgZm9yIHRoZVxuICAgIC8vIGlkZW50aXR5IHBlcmZvcm1pbmcgYSBsYXRlciByZXRyeSAoZS5nLiB3aGVuIGEgcmVjaXBpZW50IGlzIGJlaW5nIHJlbW92ZWQpLlxuICAgIGNvbnN0IHNuYXBzaG90cyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgLy8gQSBmYWlsZWQgc3luY2hyb25pemF0aW9uIG11c3QgZmFpbCB0aGUgd2hvbGUgd2JmeSBydW46IGV4aXRpbmcgemVybyB3aXRoIHN0YWxlIHJlY2lwaWVudHNcbiAgICAvLyB3b3VsZCBsZWF2ZSBzZWNyZXRzIHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzIHdoaWxlIGxvb2tpbmcgc3VjY2Vzc2Z1bC5cbiAgICB0cnkge1xuICAgICAgLy8gQW55IGZub3ggY29uZmlnIChpbmNsdWRpbmcgYWxpYXNlcyBhbmQgbG9jYWwgb3ZlcnJpZGVzKSBpbiBhbiBhbmNlc3RvciBkaXJlY3Rvcnkgd291bGRcbiAgICAgIC8vIG1lcmdlIGludG8gKGFuZCBwb3NzaWJseSBiZSBSRVdSSVRURU4gYnkpIHRoaXMgcmVwb3NpdG9yeSdzIGBmbm94IHJlZW5jcnlwdGAgdGhyb3VnaFxuICAgICAgLy8gaGllcmFyY2hpY2FsIGxvYWRpbmcsIHVzaW5nIHRoaXMgcmVwb3NpdG9yeSdzIHJlY2lwaWVudCBzZXQgZm9yIGZvcmVpZ24gc2VjcmV0cy5cbiAgICAgIGZvciAobGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUocm9vdERpclBhdGgpOyA7IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JGbm94RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpO1xuICAgICAgICBpZiAoYW5jZXN0b3JGbm94RmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBhbiBhbmNlc3RvciBkaXJlY3RvcnkgY29udGFpbnMgZm5veCBjb25maWdzIHRoYXQgZm5veCB3b3VsZCBoaWVyYXJjaGljYWxseSBtZXJnZSBhbmQgcmV3cml0ZTogJHthbmNlc3RvckZub3hGaWxlTmFtZXNcbiAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAuam9pbignLCAnKX0uIFJlbW92ZSB0aGVtIG9yIG1vdmUgdGhlIHJlcG9zaXRvcnkuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLmRpcm5hbWUoZGlyUGF0aCkgPT09IGRpclBhdGgpIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gZm5veCBhbHNvIGxvYWRzIGNvbW1pdHRlZCBjb25maWcgYWxpYXNlcyB0aGlzIGdlbmVyYXRvciBjYW5ub3Qga2VlcCBpbiBzeW5jLlxuICAgICAgY29uc3QgZm5veExpa2VGaWxlUGF0aHMgPSBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGgpO1xuICAgICAgY29uc3QgdW5zdXBwb3J0ZWRGaWxlUGF0aHMgPSBmbm94TGlrZUZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSAhPT0gJ2Zub3gudG9tbCcpO1xuICAgICAgaWYgKHVuc3VwcG9ydGVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG9ubHkgZm5veC50b21sIGZpbGVzIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlUGF0aHMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byB0aGUgYWRqYWNlbnQgZm5veC50b21sLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGlyUGF0aHMgPSBsaXN0Rm5veFRvbWxEaXJQYXRocyhmbm94TGlrZUZpbGVQYXRocyk7XG4gICAgICBpZiAoIWRpclBhdGhzLmluY2x1ZGVzKHJvb3REaXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdmbm94LnRvbWwnKX0gaXMgaW52aXNpYmxlIHRvIGdpdCAoZ2l0aWdub3JlZD8pLiBDb21taXQgaXQgb3IgcmVtb3ZlIGl0LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gR2l0LWJhc2VkIGRpc2NvdmVyeSBjYW5ub3Qgc2VlIGdpdGlnbm9yZWQgZmlsZXMsIHNvIGFsc28gaW5zcGVjdCBldmVyeSBkaXJlY3RvcnkgaW4gZWFjaFxuICAgICAgLy8gbWFuYWdlZCBjb25maWcncyBoaWVyYXJjaHkgdGhyb3VnaCB0aGUgZmlsZXN5c3RlbTogYSBnaXRpZ25vcmVkIGFsaWFzIChlLmcuIC5mbm94LnRvbWwpXG4gICAgICAvLyBvciBhIGdpdGlnbm9yZWQgZm5veC50b21sIGluIGFuIGludGVybWVkaWF0ZSBkaXJlY3Rvcnkgd291bGQgc3RpbGwgYmUgbG9hZGVkIGJ5IGZub3ggYW5kXG4gICAgICAvLyBjb3VsZCBvdmVycmlkZSB0aGUgcHJvdmlkZXIgdXNlZCBmb3IgbmVzdGVkIHJlLWVuY3J5cHRpb24uXG4gICAgICBjb25zdCBtYW5hZ2VkRGlyUGF0aHMgPSBuZXcgU2V0KGRpclBhdGhzKTtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IGhpZXJhcmNoeURpclBhdGggb2YgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpKSB7XG4gICAgICAgICAgY29uc3Qgc3RyYXlGaWxlTmFtZXMgPSBsaXN0Rm5veExpa2VGaWxlTmFtZXMoaGllcmFyY2h5RGlyUGF0aCkuZmlsdGVyKFxuICAgICAgICAgICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnICYmICEobmFtZSA9PT0gJ2Zub3gudG9tbCcgJiYgbWFuYWdlZERpclBhdGhzLmhhcyhoaWVyYXJjaHlEaXJQYXRoKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzdHJheUZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGZub3ggd291bGQgbG9hZCB1bm1hbmFnZWQgKGdpdGlnbm9yZWQ/KSBjb25maWdzOiAke3N0cmF5RmlsZU5hbWVzXG4gICAgICAgICAgICAgICAgLm1hcCgobmFtZSkgPT4gcGF0aC5qb2luKGhpZXJhcmNoeURpclBhdGgsIG5hbWUpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfS4gQ29tbWl0IHRoZW0gYXMgZm5veC50b21sIG9yIHJlbW92ZSB0aGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEEgZm5veC5sb2NhbC50b21sIGFueXdoZXJlIGluIHRoZSBtZXJnZWQgaGllcmFyY2h5IChub3Qgb25seSBuZXh0IHRvIGEgbWFuYWdlZFxuICAgICAgICAgIC8vIGNvbmZpZykgY2FuIG92ZXJyaWRlIHByb3ZpZGVycy5cbiAgICAgICAgICBjb25zdCBsb2NhbElzc3VlID0gZmluZEZub3hMb2NhbFRvbWxJc3N1ZShoaWVyYXJjaHlEaXJQYXRoKTtcbiAgICAgICAgICBpZiAobG9jYWxJc3N1ZSkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2xvY2FsSXNzdWV9LiBLZWVwIG9ubHkgbWFjaGluZS1sb2NhbCBzZWNyZXQgb3ZlcnJpZGVzIHRoZXJlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW4tbWVtb3J5IHNuYXBzaG90cyBkbyBub3Qgc3Vydml2ZSBhIGtpbGxlZCBwcm9jZXNzLCBzbyBhIGR1cmFibGUgbWFya2VyIGlzIHdyaXR0ZW5cbiAgICAgIC8vIGJlZm9yZSB0aGUgZmlyc3QgbXV0YXRpb24gYW5kIHJlbW92ZWQgb25seSB3aGVuIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQgYWdhaW4uIEEgbGVmdG92ZXJcbiAgICAgIC8vIG1hcmtlciBtZWFucyBhIHByZXZpb3VzIHJ1biB3YXMga2lsbGVkIG1pZC1taWdyYXRpb24gKG9yIGNvdWxkIG5vdCByZXN0b3JlKTogc29tZVxuICAgICAgLy8gY2lwaGVydGV4dHMgbWF5IG5vdCBtYXRjaCB0aGUgcmVjaXBpZW50cywgb3IgbWF5IGV2ZW4gYmUgdW5kZWNyeXB0YWJsZSBmb3IgdGhlIGV4ZWN1dG9yJ3NcbiAgICAgIC8vIGlkZW50aXR5IHdoZW4gYSByZWNpcGllbnQgd2FzIGJlaW5nIHJlbW92ZWQg4oCUIHN0YXRlcyB0aGlzIGNvZGUgY2Fubm90IHJlcGFpciBzYWZlbHlcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHdvcmtpbmcgdHJlZSBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIChicmFuY2ggc3dpdGNoZXMsIG1hbnVhbCBlZGl0cykuIFRoZVxuICAgICAgLy8gZm5veC50b21sIGZpbGVzIGFyZSBnaXQtdHJhY2tlZCwgc28gdGhlIHVzZXIgcmVzdG9yZXMgdGhlbSB2aWEgZ2l0IGFuZCBjbGVhcnMgdGhlIG1hcmtlci5cbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICcudG1wJywgJ3diZnktZm5veC1taWdyYXRpb24tbWFya2VyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYSBwcmV2aW91cyBtaWdyYXRpb24gd2FzIGludGVycnVwdGVkLiBSZXN0b3JlIHRoZSBmbm94LnRvbWwgZmlsZXMgdmlhIGdpdCAoZS5nLiBcXGBnaXQgc3RhdHVzXFxgIGFuZCBcXGBnaXQgcmVzdG9yZSAtLSAnKmZub3gqLnRvbWwnXFxgIGlmIHlvdSBoYXZlIG5vIGludGVudGlvbmFsIGxvY2FsIGNoYW5nZXMpLCB0aGVuIGRlbGV0ZSAke21pZ3JhdGlvbk1hcmtlclBhdGh9IGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHRyYWNrZWQgc3ltbGluayBuYW1lZCBmbm94LnRvbWwgKG9yIGEgc3ltbGlua2VkIHBhcmVudCBkaXJlY3RvcnkpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAvLyByZXdyaXRlIGFuZCBgZm5veCByZWVuY3J5cHRgIHJlYWQgYW5kIE1PRElGWSBmaWxlcyBvdXRzaWRlIHRoaXMgcmVwb3NpdG9yeS5cbiAgICAgIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAgICAgY29uc3QgcmVhbFBhdGggPSBmcy5yZWFscGF0aFN5bmMoZm5veFRvbWxQYXRoKTtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmbm94VG9tbFBhdGgpLmlzU3ltYm9saWNMaW5rKCkgfHwgIXJlYWxQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtmbm94VG9tbFBhdGh9IGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5ICgke3JlYWxQYXRofSkuIFJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgaW4tcmVwb3NpdG9yeSBmaWxlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzbmFwc2hvdHMuc2V0KGZub3hUb21sUGF0aCwgZnMucmVhZEZpbGVTeW5jKGZub3hUb21sUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNvcnRlZCBvcmRlciBwcm9jZXNzZXMgYW5jZXN0b3JzIGJlZm9yZSBkZXNjZW5kYW50cywgc28gY29uZmlncyBpbmhlcml0aW5nIGFuIHVwZGF0ZWRcbiAgICAgIC8vIHByb3ZpZGVyIHJlLWVuY3J5cHQgYWdhaW5zdCB0aGUgYWxyZWFkeS11cGRhdGVkIHJlY2lwaWVudHMuXG4gICAgICBjb25zdCBjaGFuZ2VkRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgYW55RmFpbGVkID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3JDaGFuZ2VkID0gY2hhbmdlZERpclBhdGhzLnNvbWUoKGNoYW5nZWREaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoY2hhbmdlZERpclBhdGggKyBwYXRoLnNlcCkpO1xuICAgICAgICAvLyBFdmVyeSBkaXJQYXRoIHdhcyBzbmFwc2hvdHRlZCBhYm92ZS4gQSBtaXNzaW5nIHNuYXBzaG90IG11c3QgZmFpbCBoYXJkOiBmYWxsaW5nIGJhY2sgdG9cbiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvdWxkIGZsb3cgaW50byByZXBsYWNlQWdlUmVjaXBpZW50cyBhbmQgb3ZlcndyaXRlIHRoZSByZWFsIGZub3gudG9tbFxuICAgICAgICAvLyB3aXRoIGEgcmVjaXBpZW50cy1vbmx5IGZpbGUsIGRlc3Ryb3lpbmcgZXZlcnkgY29tbWl0dGVkIHNlY3JldC5cbiAgICAgICAgY29uc3Qgc25hcHNob3RDb250ZW50ID0gc25hcHNob3RzLmdldChwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICAgICAgaWYgKHNuYXBzaG90Q29udGVudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZm5veC50b21sIHNuYXBzaG90IGZvciAke2RpclBhdGh9LmApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICAgICAgICAgIGRpclBhdGgsXG4gICAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgICAgZGlyUGF0aCA9PT0gcm9vdERpclBhdGgsXG4gICAgICAgICAgYW5jZXN0b3JDaGFuZ2VkLFxuICAgICAgICAgIHNuYXBzaG90Q29udGVudCxcbiAgICAgICAgICBhZ2VSZWNpcGllbnRzXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09ICdjaGFuZ2VkJykgY2hhbmdlZERpclBhdGhzLnB1c2goZGlyUGF0aCk7XG4gICAgICAgIGFueUZhaWxlZCB8fD0gcmVzdWx0ID09PSAnZmFpbGVkJztcbiAgICAgIH1cbiAgICAgIGlmIChhbnlGYWlsZWQpIHtcbiAgICAgICAgLy8gQSBmYWlsZWQgcmUtZW5jcnlwdGlvbiBtYXkgaGF2ZSByZXdyaXR0ZW4gc29tZSBjaXBoZXJ0ZXh0cywgc28gcmVzdG9yZSB1bmNvbmRpdGlvbmFsbHkuXG4gICAgICAgIC8vIFRoZSBtYXJrZXIgaXMgcmVtb3ZlZCBvbmx5IHdoZW4gcmVzdG9yYXRpb24gZnVsbHkgc3VjY2VlZGVkIGFuZCB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LlxuICAgICAgICAvLyBSZXN0b3JlIE9OTFkgd2hlbiB0aGlzIHJ1biBvd25zIHRoZSBtYXJrZXI6IGV2ZXJ5IGNvbW1pdHRlZC1jb25maWcgbXV0YXRpb24gaGFwcGVuc1xuICAgICAgICAvLyBhZnRlciBtYXJrZXIgYWNxdWlzaXRpb24sIHNvIGEgbm9uLW93bmVyIChlLmcuIGxvc2luZyBhIHJhY2UgYWdhaW5zdCBhIGNvbmN1cnJlbnQgd2JmeSlcbiAgICAgICAgLy8gaGFzIGNoYW5nZWQgbm90aGluZyBhbmQgbXVzdCBub3Qgb3ZlcndyaXRlIHRoZSBvd25lcidzIGluLXByb2dyZXNzIG1pZ3JhdGlvbi5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbk1hcmtlck93bmVkICYmIHJlc3RvcmVTbmFwc2hvdHMoc25hcHNob3RzKSkgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHtcbiAgICAgICAgcmVtb3ZlT3duZWRNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIH1cbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgZHVlIHRvOiAkeyhlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzeW5jaHJvbml6ZUZub3hBZ2VSZWNpcGllbnRzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIGlzUm9vdDogYm9vbGVhbixcbiAgYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZDogYm9vbGVhbixcbiAgb3JpZ2luYWxDb250ZW50OiBzdHJpbmcsXG4gIGFnZVJlY2lwaWVudHM6IHJlYWRvbmx5IEZub3hBZ2VSZWNpcGllbnRbXVxuKTogUHJvbWlzZTwnY2hhbmdlZCcgfCAndW5jaGFuZ2VkJyB8ICdmYWlsZWQnPiB7XG4gIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG5cbiAgLy8gUmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBvbmx5IHVuZGVyc3RhbmRzIHRoZSBzdGFuZGFyZCBzaW5nbGUtZmlsZSBsYXlvdXQgd2l0aCBvbmVcbiAgLy8gdG9wLWxldmVsIGFnZSBwcm92aWRlciBuYW1lZCBgYWdlYC4gR2l0aWdub3JlZCBjb25maWcgYWxpYXNlcyAoZS5nLiAuZm5veC5sb2NhbC50b21sKSB0aGF0XG4gIC8vIGdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSwgaW1wb3J0cywgZGlmZmVyZW50bHkgbmFtZWQgYWdlIHByb3ZpZGVycywgb3IgcHJvdmlkZXJcbiAgLy8gb3ZlcnJpZGVzIHdvdWxkIGtlZXAgdXNpbmcgcmVjaXBpZW50IHNldHMgdGhpcyBnZW5lcmF0b3IgZG9lcyBub3QgcmV3cml0ZSwgc28gdGhlaXIgc2VjcmV0c1xuICAvLyB3b3VsZCBzaWxlbnRseSBzdGF5IHVuZGVjcnlwdGFibGUgZm9yIG5ldyByZWNpcGllbnRzOyBmYWlsIGluc3RlYWQgb2YgcHJvY2VlZGluZy4gVGhlXG4gIC8vIGdpdGlnbm9yZWQgZm5veC5sb2NhbC50b21sIGlzIGEgc3VwcG9ydGVkIG1hY2hpbmUtbG9jYWwgb3ZlcnJpZGUsIGJ1dCBvbmx5IHdoaWxlIGl0IGxlYXZlc1xuICAvLyBwcm92aWRlcnMgYWxvbmUuXG4gIGNvbnN0IHVuc3VwcG9ydGVkRmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGgpLmZpbHRlcihcbiAgICAobmFtZSkgPT4gbmFtZSAhPT0gJ2Zub3gudG9tbCcgJiYgbmFtZSAhPT0gJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbiAgaWYgKHVuc3VwcG9ydGVkRmlsZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBmYWlsRm5veFN5bmMoXG4gICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgaW4gJHtkaXJQYXRofSBiZWNhdXNlIG9ubHkgZm5veC50b21sIGFuZCBmbm94LmxvY2FsLnRvbWwgYXJlIHN1cHBvcnRlZDogJHt1bnN1cHBvcnRlZEZpbGVOYW1lcy5qb2luKCcsICcpfS4gTWVyZ2UgdGhlbSBpbnRvIGZub3gudG9tbC5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgLy8gQSBzdGFsZSBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBtdXN0IGJlIHJlc3RvcmVkIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAgLy8gb3ZlcnJpZGVzIGFyZSBuZXZlciBzaWxlbnRseSBsb3N0ICh0aGUgbWlncmF0aW9uIG1hcmtlciBzZXBhcmF0ZWx5IGJsb2NrcyB0aGlzIHJ1biB3aGVuIHRoZVxuICAvLyBpbnRlcnJ1cHRpb24gbGVmdCB0aGUgbWlncmF0aW9uIGl0c2VsZiBpbmNvbXBsZXRlKS5cbiAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcblxuICBjb25zdCBsYXlvdXRJc3N1ZSA9IGZpbmRGbm94TGF5b3V0SXNzdWUob3JpZ2luYWxDb250ZW50KTtcbiAgaWYgKGxheW91dElzc3VlKSB7XG4gICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSAke2xheW91dElzc3VlfS5gKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShvcmlnaW5hbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICBjb25zdCBwcm9maWxlTmFtZXMgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSk7XG4gIGNvbnN0IGN1cnJlbnRSZWNpcGllbnRzID0gcmVhZEZub3hBZ2VSZWNpcGllbnRzKG9yaWdpbmFsQ29udGVudCk7XG5cbiAgLy8gQSBuZXN0ZWQgZm5veC50b21sIHdpdGhvdXQgaXRzIG93biBhZ2UgcHJvdmlkZXIgaW5oZXJpdHMgdGhlIG5lYXJlc3QgYW5jZXN0b3IncyBvbmUgdGhyb3VnaFxuICAvLyBmbm94J3MgaGllcmFyY2hpY2FsIGxvYWRpbmcsIHNvIG9ubHkgdGhlIHJvb3QgY29uZmlnIG11c3QgZGVjbGFyZSB0aGUgcHJvdmlkZXIg4oCUIGJ1dCB0aGVcbiAgLy8gbmVzdGVkIGNvbmZpZydzIG93biBjaXBoZXJ0ZXh0cyBzdGlsbCBtdXN0IGJlIHJlLWVuY3J5cHRlZCB3aGVuZXZlciBhbiBhbmNlc3RvcidzIHJlY2lwaWVudHNcbiAgLy8gY2hhbmdlZCwgYW5kIHRoYXQgb25seSBoYXBwZW5zIHdoZW4gYGZub3ggcmVlbmNyeXB0YCBydW5zIGZyb20gdGhlIG5lc3RlZCBkaXJlY3RvcnkuXG4gIGlmICghaXNSb290ICYmICFjdXJyZW50UmVjaXBpZW50cykge1xuICAgIGlmIChhbmNlc3RvclJlY2lwaWVudHNDaGFuZ2VkKSB7XG4gICAgICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICBpZiAoXG4gICAgY3VycmVudFJlY2lwaWVudHMgJiZcbiAgICBjdXJyZW50UmVjaXBpZW50cy5zaXplID09PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCAmJlxuICAgIGFnZVJlY2lwaWVudHMuZXZlcnkoKHJlY2lwaWVudCkgPT4gY3VycmVudFJlY2lwaWVudHMuaGFzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICByZXR1cm4gJ3VuY2hhbmdlZCc7XG4gIH1cblxuICAvLyBSZXdyaXRlIG9ubHkgdGhlIHJlY2lwaWVudHMgYXNzaWdubWVudCBzbyB1c2VyLWF1dGhvcmVkIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIHN1cnZpdmUuXG4gIC8vIFJlLXBhcnNlIGJlZm9yZSB3cml0aW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cykgY291bGQgbWFrZSB0aGUgdGV4dHVhbCBlZGl0XG4gIC8vIHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGUgb3IgbGVhdmUgdGhlIG9sZCByZWNpcGllbnRzIGluIGVmZmVjdC5cbiAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSByZXBsYWNlQWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQsIGFnZVJlY2lwaWVudHMpO1xuICBjb25zdCB1cGRhdGVkUmVjaXBpZW50cyA9IFsuLi4ocmVhZEZub3hBZ2VSZWNpcGllbnRzKHVwZGF0ZWRDb250ZW50KSA/PyBbXSldO1xuICBpZiAoXG4gICAgdXBkYXRlZFJlY2lwaWVudHMubGVuZ3RoICE9PSBhZ2VSZWNpcGllbnRzLmxlbmd0aCB8fFxuICAgICFhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IHVwZGF0ZWRSZWNpcGllbnRzLmluY2x1ZGVzKHJlY2lwaWVudC5wdWJsaWNLZXkpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJld3JpdGluZyB0aGUgYWdlIHJlY2lwaWVudHMgaW4gJHtmbm94VG9tbFBhdGh9IGRpZCBub3QgdGFrZSBlZmZlY3Q7IHVwZGF0ZSB0aGVtIG1hbnVhbGx5LmApO1xuICB9XG4gIHdyaXRlTWlncmF0aW9uTWFya2VyKCk7XG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCB1cGRhdGVkQ29udGVudCk7XG5cbiAgaWYgKCFyZWVuY3J5cHRGbm94U2VjcmV0cyhkaXJQYXRoLCByb290RGlyUGF0aCwgcHJvZmlsZU5hbWVzKSkge1xuICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvbmZpZzoga2VlcGluZyB0aGUgbmV3IHJlY2lwaWVudHMgd2l0aCBvbGQgY2lwaGVydGV4dHMgd291bGQgbWFrZVxuICAgIC8vIHRoaXMgZ2VuZXJhdG9yIHNraXAgcmUtZW5jcnlwdGlvbiBmb3JldmVyIGFuZCBsZXQgc2V0dXBTZWNyZXRzIHVwbG9hZCBhIENJIGtleSB0aGF0XG4gICAgLy8gY2Fubm90IGRlY3J5cHQgYW55dGhpbmcuIFRoZSBvbGQgY2lwaGVydGV4dHMgcmVtYWluIHZhbGlkIGZvciB0aGUgb2xkIHJlY2lwaWVudHMuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byByZS1lbmNyeXB0IGZub3ggc2VjcmV0cyBpbiAke2RpclBhdGh9IGZvciB0aGUgdXBkYXRlZCByZWNpcGllbnRzLiBGaXggdGhlIGVycm9yIGFuZCByZXJ1biB3YmZ5LmBcbiAgICApO1xuICAgIHJldHVybiAnZmFpbGVkJztcbiAgfVxuICByZXR1cm4gJ2NoYW5nZWQnO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBhIGZub3gudG9tbCBsYXlvdXQgdGhhdCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGFuZCB0aGUgQ0kta2V5XG4gKiB2ZXJpZmljYXRpb24gY2Fubm90IGNvdmVyLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUsIHNpbmdsZS1hZ2UtcHJvdmlkZXJcbiAqIGxheW91dCBpcyB1c2VkLlxuICovXG5mdW5jdGlvbiBmaW5kRm5veExheW91dElzc3VlKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZub3hUb21sQ29udGVudCkgYXMgRm5veFRvbWw7XG4gICAgaWYgKHNldHRpbmdzLmltcG9ydCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gJ3VzZXMgdGhlIHVuc3VwcG9ydGVkIGBpbXBvcnRgIHNldHRpbmcnO1xuICAgIGNvbnN0IG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcyA9IE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnByb3ZpZGVycyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFtuYW1lLCBwcm92aWRlcl0pID0+IChwcm92aWRlcj8udHlwZSA9PT0gJ2FnZScpICE9PSAobmFtZSA9PT0gJ2FnZScpKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAobm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgYWdlIHByb3ZpZGVycyBub3QgbmFtZWQgXFxgYWdlXFxgIChvciBhbiBcXGBhZ2VcXGAgcHJvdmlkZXIgb2YgYW5vdGhlciB0eXBlKTogJHtub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICBjb25zdCBwcm9maWxlc1dpdGhQcm92aWRlcnMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm9maWxlcyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoKFssIHByb2ZpbGVdKSA9PiBwcm9maWxlPy5wcm92aWRlcnMpXG4gICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuICAgIGlmIChwcm9maWxlc1dpdGhQcm92aWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBkZWNsYXJlcyB1bnN1cHBvcnRlZCBwcm9maWxlLXNwZWNpZmljIHByb3ZpZGVyczogJHtwcm9maWxlc1dpdGhQcm92aWRlcnMuam9pbignLCAnKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2Nhbm5vdCBiZSBwYXJzZWQgYXMgVE9NTCc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgW3Byb3ZpZGVycy5hZ2VdLnJlY2lwaWVudHMgb2YgYSBmbm94LnRvbWwsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBjb25maWcgZGVjbGFyZXMgbm9cbiAqIGFnZSBwcm92aWRlciAobmVzdGVkIGNvbmZpZ3MgdGhlbiBpbmhlcml0IHRoZSByb290IG9uZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRm5veEFnZVJlY2lwaWVudHMoZm5veFRvbWxDb250ZW50OiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmICghc2V0dGluZ3MucHJvdmlkZXJzPy5hZ2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHNldHRpbmdzLnByb3ZpZGVycy5hZ2UucmVjaXBpZW50cztcbiAgICByZXR1cm4gbmV3IFNldChBcnJheS5pc0FycmF5KHJlY2lwaWVudHMpID8gcmVjaXBpZW50cy5maWx0ZXIoKHIpOiByIGlzIHN0cmluZyA9PiB0eXBlb2YgciA9PT0gJ3N0cmluZycpIDogW10pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBBbiB1bnBhcnNhYmxlIGZub3gudG9tbCB5aWVsZHMgbm8gcmVjaXBpZW50cywgc28gdGhlIGNhbGxlciByZXBvcnRzIGFuIGVycm9yLlxuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cbn1cblxudHlwZSBGbm94UmVwb3NpdG9yeUlkZW50aXR5ID0gUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnIHwgJ2lzUHVibGljUmVwbycgfCAnaXNSZXBvVmlzaWJpbGl0eUtub3duJz47XG5cbi8qKlxuICogVGhlIEdpdEh1YiBzZWNyZXQgaG9sZGluZyB0aGUgcHJpdmF0ZSBrZXkgb2YgdGhlIENJIGlkZW50aXR5IHNjb3BlZCB0byB0aGUgcmVwb3NpdG9yeSwgb3JcbiAqIHVuZGVmaW5lZCB3aGVuIG5vbmUgaXMgKGFuIHVua25vd24gdmlzaWJpbGl0eSwgb3IgYSByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycykuIFRoZSBzaW5nbGVcbiAqIHNvdXJjZSBvZiB0cnV0aCBzaGFyZWQgYnkgdGhlIHJlY2lwaWVudCBzeW5jIGFuZCB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3MgY2FsbGVyIG1hcHBpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoXG4gIGNvbmZpZzogRm5veFJlcG9zaXRvcnlJZGVudGl0eVxuKTogJ0ZOT1hfQUdFX0tFWScgfCAnUFVCTElDX0ZOT1hfQUdFX0tFWScgfCB1bmRlZmluZWQge1xuICBjb25zdCBjaVByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCB8IHVuZGVmaW5lZCA9IEZOT1hfQUdFX1BSSU5DSVBBTFMuZmluZChcbiAgICAocHJpbmNpcGFsOiBGbm94QWdlUHJpbmNpcGFsKSA9PlxuICAgICAgcHJpbmNpcGFsLmNpQWdlS2V5U2VjcmV0TmFtZSAmJiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCBjb25maWcpXG4gICk7XG4gIHJldHVybiBjaVByaW5jaXBhbD8uY2lBZ2VLZXlTZWNyZXROYW1lO1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVjaXBpZW50IHNldCBkaWZmZXJzIGJldHdlZW4gdGhlIHB1YmxpYyBhbmQgcHJpdmF0ZSByZWFkaW5nIG9mIHRoZSByZXBvc2l0b3J5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvZXNGbm94UmVjaXBpZW50U2V0RGVwZW5kT25WaXNpYmlsaXR5KFxuICByb290Q29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdyZXBvQXV0aG9yJyB8ICdyZXBvTmFtZSc+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgcHVibGljS2V5c0ZvciA9IChpc1B1YmxpY1JlcG86IGJvb2xlYW4pOiBzdHJpbmcgPT5cbiAgICBnZXRGbm94QWdlUmVjaXBpZW50cyh7IC4uLnJvb3RDb25maWcsIGlzUHVibGljUmVwbywgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0cnVlIH0pXG4gICAgICAubWFwKCh7IHB1YmxpY0tleSB9KSA9PiBwdWJsaWNLZXkpXG4gICAgICAuam9pbignXFxuJyk7XG4gIHJldHVybiBwdWJsaWNLZXlzRm9yKHRydWUpICE9PSBwdWJsaWNLZXlzRm9yKGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZub3hBZ2VSZWNpcGllbnRzKHJvb3RDb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBGbm94QWdlUmVjaXBpZW50W10ge1xuICByZXR1cm4gRk5PWF9BR0VfUFJJTkNJUEFMUy5maWx0ZXIoKHByaW5jaXBhbCkgPT5cbiAgICBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShwcmluY2lwYWwucmVwb3NpdG9yeVNjb3BlLCByb290Q29uZmlnKVxuICApLmZsYXRNYXAoKHByaW5jaXBhbCkgPT5cbiAgICBwcmluY2lwYWwucHVibGljS2V5cy5tYXAoKHB1YmxpY0tleSwgaW5kZXgpID0+ICh7XG4gICAgICBuYW1lOiBwcmluY2lwYWwucHVibGljS2V5cy5sZW5ndGggPT09IDEgPyBwcmluY2lwYWwubmFtZSA6IGAke3ByaW5jaXBhbC5uYW1lfSR7aW5kZXggKyAxfWAsXG4gICAgICBwdWJsaWNLZXksXG4gICAgfSkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzRm5veFJlcG9zaXRvcnlTY29wZShzY29wZTogRm5veFJlcG9zaXRvcnlTY29wZSwgcmVwb3NpdG9yeTogRm5veFJlcG9zaXRvcnlJZGVudGl0eSk6IGJvb2xlYW4ge1xuICBjb25zdCBvd25lciA9IHJlcG9zaXRvcnkucmVwb0F1dGhvcj8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbmFtZSA9IHJlcG9zaXRvcnkucmVwb05hbWU/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghb3duZXIgfHwgIW5hbWUpIHJldHVybiBmYWxzZTtcblxuICAvLyBBbiB1bmtub3duIHZpc2liaWxpdHkgKGZhaWxlZCBHaXRIdWIgbG9va3VwKSBtYXRjaGVzIG5vIHZpc2liaWxpdHktY29uc3RyYWluZWQgc2NvcGU6IGNhbGxlcnNcbiAgLy8gdGhhdCB3b3VsZCByZXdyaXRlIHJlY2lwaWVudHMgZmFpbCBpbnN0ZWFkIG9mIGVuY3J5cHRpbmcgdG8gdGhlIHdyb25nIENJIGlkZW50aXR5LlxuICBpZiAoXG4gICAgc2NvcGUudmlzaWJpbGl0eSAmJlxuICAgICghcmVwb3NpdG9yeS5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgKHNjb3BlLnZpc2liaWxpdHkgPT09ICdwdWJsaWMnKSAhPT0gcmVwb3NpdG9yeS5pc1B1YmxpY1JlcG8pXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKHNjb3BlLm9yZ2FuaXphdGlvbnM/LnNvbWUoKG9yZ2FuaXphdGlvbikgPT4gb3JnYW5pemF0aW9uLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyKSA/PyBmYWxzZSkgfHxcbiAgICAoc2NvcGUucmVwb3NpdG9yaWVzPy5zb21lKChmdWxsTmFtZSkgPT4gZnVsbE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYCR7b3duZXJ9LyR7bmFtZX1gKSA/PyBmYWxzZSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUFnZVJlY2lwaWVudHMoY29udGVudDogc3RyaW5nLCBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W10pOiBzdHJpbmcge1xuICAvLyBUcmFpbGluZyBuYW1lIGNvbW1lbnRzIGxldCBodW1hbnMgdGVsbCB3aG9zZSBrZXkgZWFjaCByZWNpcGllbnQgaXMgd2l0aG91dCBjb25zdWx0aW5nIHdiZnkuXG4gIGNvbnN0IHJlY2lwaWVudHNUZXh0ID0gYHJlY2lwaWVudHMgPSBbXFxuJHthZ2VSZWNpcGllbnRzXG4gICAgLm1hcCgocmVjaXBpZW50KSA9PiBgICBcIiR7cmVjaXBpZW50LnB1YmxpY0tleX1cIiwgIyAke3JlY2lwaWVudC5uYW1lfWApXG4gICAgLmpvaW4oJ1xcbicpfVxcbl1gO1xuICAvLyB3YmZ5IHdyaXRlcyBhIFtwcm92aWRlcnMuYWdlXSB0YWJsZSAocG9zc2libHkgd2l0aCBhIHRyYWlsaW5nIGNvbW1lbnQpLiBTY2FuIGxpbmUtd2lzZSBzbyB0aGF0XG4gIC8vIGEgYFtgIGluc2lkZSBhIGNvbW1lbnQgb3IgYSBzdHJpbmcgbmV2ZXIgdGVybWluYXRlcyB0aGUgdGFibGUgZWFybHk7IHRoZSB0YWJsZSBlbmRzIGF0IHRoZVxuICAvLyBuZXh0IGxpbmUtc3RhcnQgdGFibGUgaGVhZGVyLiBUaGUgYXNzaWdubWVudCBtYXRjaCBpcyBsaW5lLWFuY2hvcmVkIHNvIGEgY29tbWVudGVkLW91dFxuICAvLyBgIyByZWNpcGllbnRzID0gWy4uLl1gIGlzIG5ldmVyIG1pc3Rha2VuIGZvciB0aGUgcmVhbCBvbmUsIHdoaWxlIG11bHRpbGluZSBhcnJheXMgc3RpbGwgbWF0Y2hcbiAgLy8gYmVjYXVzZSB0aGUgbmVnYXRlZCBjbGFzcyBbXlxcXV0gKHVubGlrZSBgLmApIHNwYW5zIG5ld2xpbmVzLiBBbnkgb3RoZXIgc3BlbGxpbmcgZmFsbHMgdGhyb3VnaFxuICAvLyB0byB0aGUgY2FsbGVyJ3MgcmUtcGFyc2UgdmFsaWRhdGlvbiwgd2hpY2ggZmFpbHMgdGhlIHJ1biBzYWZlbHkgd2l0aCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZlxuICAvLyBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gL15cXHMqXFxbcHJvdmlkZXJzXFwuYWdlXFxdXFxzKig/OiMuKik/JC91LnRlc3QobGluZSkpO1xuICBpZiAoaGVhZGVySW5kZXggIT09IC0xKSB7XG4gICAgbGV0IGVuZEluZGV4ID0gbGluZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gaGVhZGVySW5kZXggKyAxOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKC9eXFxzKlxcWy91LnRlc3QobGluZXNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgICBlbmRJbmRleCA9IGluZGV4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VjdGlvbiA9IGxpbmVzLnNsaWNlKGhlYWRlckluZGV4LCBlbmRJbmRleCkuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVwbGFjZWRTZWN0aW9uID0gc2VjdGlvbi5yZXBsYWNlKC9eXFxzKnJlY2lwaWVudHNcXHMqPVxccypcXFtbXlxcXV0qXFxdL211LCByZWNpcGllbnRzVGV4dCk7XG4gICAgY29uc3QgbmV3U2VjdGlvbiA9XG4gICAgICByZXBsYWNlZFNlY3Rpb24gPT09IHNlY3Rpb25cbiAgICAgICAgPyBbbGluZXNbaGVhZGVySW5kZXhdLCByZWNpcGllbnRzVGV4dCwgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxLCBlbmRJbmRleCldLmpvaW4oJ1xcbicpXG4gICAgICAgIDogcmVwbGFjZWRTZWN0aW9uO1xuICAgIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXgpLCBuZXdTZWN0aW9uLCAuLi5saW5lcy5zbGljZShlbmRJbmRleCldLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bcHJvdmlkZXJzLmFnZV1cXG50eXBlID0gXCJhZ2VcIlxcbiR7cmVjaXBpZW50c1RleHR9XFxuYDtcbn1cblxuLy8gUmUtZW5jcnlwdHMgdGhlIGJhc2Ugc2VjcmV0cyBhbmQgZWFjaCBwcm9maWxlJ3Mgb3duIHNlY3JldHMgKC0tbm8tZGVmYXVsdHMga2VlcHMgdGhlIG1lcmdlZFxuLy8gYmFzZSBzZWNyZXRzIGZyb20gYmVpbmcgZHVwbGljYXRlZCBpbnRvIHByb2ZpbGUgdGFibGVzKSBmb3IgdGhlIGN1cnJlbnQgcmVjaXBpZW50IHNldC4gVGhlXG4vLyBzcGF3bmVkIGZub3ggcnVucyB3aXRoIGFuIGlzb2xhdGVkIEhPTUUvWERHX0NPTkZJR19IT01FIGJlY2F1c2UgZm5veCBtZXJnZXMgdGhlIHVzZXItZ2xvYmFsXG4vLyB+Ly5jb25maWcvZm5veC9jb25maWcudG9tbCBpbnRvIGV2ZXJ5IHByb2plY3QgY29uZmlnIOKAlCBhIHBsYWluIHJlZW5jcnlwdCB3b3VsZCByZXdyaXRlIHRoZVxuLy8gdXNlcidzIGdsb2JhbCBzZWNyZXRzIHRvby4gRGVjcnlwdGlvbiB0aGVyZWZvcmUgbmVlZHMgdGhlIHBlcnNvbmFsIGlkZW50aXR5IHBhc3NlZCBleHBsaWNpdGx5XG4vLyB2aWEgRk5PWF9BR0VfS0VZOyBGTk9YX1BST0ZJTEUgaXMgc3RyaXBwZWQgc28gaXQgY2Fubm90IHJlZGlyZWN0IHRoZSBiYXNlIChubyAtUCkgcnVuLlxuZnVuY3Rpb24gcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aDogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nLCBwcm9maWxlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIFRoZSBpZGVudGl0eSBpcyBvcHRpb25hbDogYSBwbGFpbnRleHQtb25seSBjb25maWcgaGFzIG5vdGhpbmcgdG8gZGVjcnlwdCBhbmQgZm5veCBzdWNjZWVkc1xuICAvLyB3aXRob3V0IG9uZSwgd2hpbGUgZXhpc3RpbmcgY2lwaGVydGV4dHMgbWFrZSBmbm94IGZhaWwgbG91ZGx5IG9uIGl0cyBvd24uXG4gIGNvbnN0IGlkZW50aXR5ID0gcmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KCkgPz8gcHJvY2Vzcy5lbnYuRk5PWF9BR0VfS0VZO1xuICBjb25zdCBmbm94Q29tbWFuZCA9IHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoKTtcbiAgY29uc3QgaXNvbGF0ZWRIb21lRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diZnktZm5veC1ob21lLScpKTtcbiAgdHJ5IHtcbiAgICAvLyBIaWRlIHRoZSBsb2NhbCBvdmVycmlkZXMgb2YgRVZFUlkgZGlyZWN0b3J5IGZub3ggbWVyZ2VzIGhpZXJhcmNoaWNhbGx5IChmcm9tIHRoZSBjb21tYW5kXG4gICAgLy8gZGlyZWN0b3J5IHVwIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpOiBhbiBhbmNlc3RvcidzIGZub3gubG9jYWwudG9tbCB3b3VsZCBvdGhlcndpc2Ugc2hhZG93XG4gICAgLy8gY29tbWl0dGVkIHNlY3JldHMgb3IgaXRzZWxmIGdldCByZXdyaXR0ZW4gYnkgdGhlIHJlLWVuY3J5cHRpb24uXG4gICAgcmV0dXJuIHdpdGhGbm94TG9jYWxzSGlkZGVuKHJvb3REaXJQYXRoLCBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoLCByb290RGlyUGF0aCksICgpID0+IHtcbiAgICAgIGNvbnN0IGVudiA9IHtcbiAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHByb2Nlc3MuZW52KS5maWx0ZXIoKFtrZXldKSA9PiAha2V5LnN0YXJ0c1dpdGgoJ0ZOT1hfJykpKSxcbiAgICAgICAgLi4uKGlkZW50aXR5ID8geyBGTk9YX0FHRV9LRVk6IGlkZW50aXR5IH0gOiB7fSksXG4gICAgICAgIEhPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICAgIFhER19DT05GSUdfSE9NRTogaXNvbGF0ZWRIb21lRGlyUGF0aCxcbiAgICAgIH07XG4gICAgICBjb25zdCBwcm9maWxlQXJnc0xpc3QgPSBbW10sIC4uLnByb2ZpbGVOYW1lcy5tYXAoKG5hbWUpID0+IFsnLS1uby1kZWZhdWx0cycsIGAtLXByb2ZpbGU9JHtuYW1lfWBdKV07XG4gICAgICBmb3IgKGNvbnN0IHByb2ZpbGVBcmdzIG9mIHByb2ZpbGVBcmdzTGlzdCkge1xuICAgICAgICBjb25zdCBhcmdzID0gWydyZWVuY3J5cHQnLCAnLS1mb3JjZScsICctLW5vLWRhZW1vbicsICctLXByb3ZpZGVyJywgJ2FnZScsIC4uLnByb2ZpbGVBcmdzXTtcbiAgICAgICAgY29uc29sZS5sb2coYCQgJHtmbm94Q29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX0gYXQgJHtkaXJQYXRofWApO1xuICAgICAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoZm5veENvbW1hbmQsIGFyZ3MsIHtcbiAgICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICAgIGVudixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgocHJvYy5zdGF0dXMgPz8gMSkgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyhpc29sYXRlZEhvbWVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGZub3ggYmluYXJ5LiBgZm5veGAgb24gUEFUSCBpcyBvZnRlbiBhIG1pc2Ugc2hpbSwgYW5kIG1pc2UgcmVmdXNlcyB0byBydW5cbiAqIG9uY2UgSE9NRS9YREdfQ09ORklHX0hPTUUgcG9pbnQgYXQgdGhlIGlzb2xhdGVkIGRpcmVjdG9yeSAoaXRzIHRydXN0IHN0YXRlIGRpc2FwcGVhcnMpLCBzbyB0aGVcbiAqIGlzb2xhdGVkIHNwYXducyBuZWVkIHRoZSBzaGltIHJlc29sdmVkIHRvIHRoZSByZWFsIGV4ZWN1dGFibGUgYmVmb3JlaGFuZC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUZub3hDb21tYW5kKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnbWlzZScsIFsnd2hpY2gnLCAnZm5veCddLCB7IGN3ZDogZGlyUGF0aCwgZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJyB9KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwcm9jLnN0YXR1cyA9PT0gMCA/IHByb2Muc3Rkb3V0LnRyaW0oKSA6ICcnO1xuICByZXR1cm4gcmVzb2x2ZWQgfHwgJ2Zub3gnO1xufVxuXG4vLyBUaGUgcGVyc29uYWwgaWRlbnRpdHkgZmlsZSBpcyBtYWNoaW5lLWdsb2JhbCwgc28gaXQgaXMgcmVhZCBvbmNlIHBlciBwcm9jZXNzLlxubGV0IGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGZhbHNlO1xubGV0IGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaGFzUmVhZFBlcnNvbmFsQWdlU2VjcmV0S2V5KSByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG4gIGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNvbmZpZycsICdmbm94JywgJ2FnZS50eHQnKSwgJ3V0ZjgnKTtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IGNvbnRlbnRcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maW5kKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdBR0UtU0VDUkVULUtFWS0nKSlcbiAgICAgID8udHJpbSgpO1xuICB9IGNhdGNoIHtcbiAgICBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXk7XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bmN0aW9uIHdoaWxlIHRoZSBtYWNoaW5lLWxvY2FsIGZub3gubG9jYWwudG9tbCBmaWxlcyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3JpZXMgYXJlXG4gKiB0ZW1wb3JhcmlseSBtb3ZlZCBhc2lkZTogZm5veCBsb2FkcyB0aGVtIGF0IGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBjb21taXR0ZWQgZm5veC50b21sLCBzbyBhXG4gKiBsb2NhbCBvdmVycmlkZSBzaGFkb3dpbmcgYSBjb21taXR0ZWQgc2VjcmV0IHdvdWxkIG1ha2UgYGZub3ggcmVlbmNyeXB0YCBza2lwIHRoYXQgc2VjcmV0LlxuICovXG5mdW5jdGlvbiB3aXRoRm5veExvY2Fsc0hpZGRlbjxUPihyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoczogc3RyaW5nW10sIGZ1bmM6ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICByZWNvdmVyU3RhbGVGbm94TG9jYWxCYWNrdXAocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgICAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICAgICAgICBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgZnMucmVuYW1lU3luYyhsb2NhbFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgICAgICBoaWRkZW5EaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKCk7XG4gICAgLy8gQSByZXN0b3JhdGlvbiBjb25mbGljdCB0aHJvd3MgaGVyZSBhbmQgdGhlcmVieSBpbnZhbGlkYXRlcyB0aGUgc2VlbWluZ2x5IHN1Y2Nlc3NmdWwgcmVzdWx0OlxuICAgIC8vIGEgcmVjcmVhdGVkIG92ZXJyaWRlIG1heSBoYXZlIHNoYWRvd2VkIGNvbW1pdHRlZCBzZWNyZXRzIGR1cmluZyB0aGUgZm5veCBydW4sIHNvIHRoZSBvdXRlclxuICAgIC8vIHRyYW5zYWN0aW9uIG11c3QgcmVzdG9yZSBldmVyeSBjb21taXR0ZWQgZm5veC50b21sIGluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgbWlncmF0aW9uLlxuICAgIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoLCBoaWRkZW5EaXJQYXRocyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgb3JpZ2luYWwgZmFpbHVyZSBtdXN0IHdpbjsgYSByZXN0b3JhdGlvbiBjb25mbGljdCBvbiB0aGlzIHBhdGggaXMgb25seSByZXBvcnRlZCBzbyBpdFxuICAgIC8vIGNhbm5vdCBtYXNrIHRoZSByb290IGNhdXNlLlxuICAgIHRyeSB7XG4gICAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIH0gY2F0Y2ggKHJlc3RvcmVFcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKChyZXN0b3JlRXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IFN0cmluZyhyZXN0b3JlRXJyb3IpKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLy8gTW92ZXMgdGhlIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgZmlsZXMgYmFjaywgY2xlYXJpbmcgdGhlIGdpdmVuIGxpc3Qgc28gYSBzZWNvbmQgY2FsbCBpcyBhXG4vLyBuby1vcC4gTmV2ZXIgY2xvYmJlcnMgYSBmbm94LmxvY2FsLnRvbWwgcmVjcmVhdGVkIChlLmcuIGJ5IGFuIGVkaXRvcikgd2hpbGUgZm5veCB3YXMgcnVubmluZzpcbi8vIHRoZSBiYWNrdXAgaXMga2VwdCBhbmQgcmVwb3J0ZWQgZm9yIGEgbWFudWFsIG1lcmdlLlxuZnVuY3Rpb24gcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGg6IHN0cmluZywgaGlkZGVuRGlyUGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZsaWN0aW5nTG9jYWxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGhpZGRlbkRpclBhdGhzLnNwbGljZSgwKSkge1xuICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgICAgY29uZmxpY3RpbmdMb2NhbFBhdGhzLnB1c2gobG9jYWxQYXRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmcy5yZW5hbWVTeW5jKGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpLCBsb2NhbFBhdGgpO1xuICB9XG4gIGlmIChjb25mbGljdGluZ0xvY2FsUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgZm9sbG93aW5nIGZub3gubG9jYWwudG9tbCBmaWxlcyB3ZXJlIHJlY3JlYXRlZCB3aGlsZSBmbm94IHdhcyBydW5uaW5nIChvcmlnaW5hbCBmaWxlcyBhcmUgcHJlc2VydmVkIHVuZGVyICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbG9jYWwtYmFja3VwJyl9IOKAlCBtZXJnZSB0aGVtIG1hbnVhbGx5KTogJHtjb25mbGljdGluZ0xvY2FsUGF0aHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3RvcmVzIGEgZm5veC5sb2NhbC50b21sIGJhY2t1cCBsZWZ0IGJ5IGFuIGludGVycnVwdGVkIGVhcmxpZXIgcnVuIHNvIHRoZSB1c2VyJ3MgbG9jYWxcbiAqIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdC5cbiAqL1xuZnVuY3Rpb24gcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBjb25zdCBiYWNrdXBQYXRoID0gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhiYWNrdXBQYXRoKSkgcmV0dXJuO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCb3RoICR7bG9jYWxQYXRofSBhbmQgaXRzIGJhY2t1cCAke2JhY2t1cFBhdGh9IGV4aXN0OyByZXNvbHZlIHRoZSBsZWZ0b3ZlciBiYWNrdXAgbWFudWFsbHkuYCk7XG4gIH1cbiAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gIGZzLnJlbmFtZVN5bmMoYmFja3VwUGF0aCwgbG9jYWxQYXRoKTtcbn1cblxuLy8gQ3JlYXRlcyB0aGUgYmFja3VwIGRpcmVjdG9yeSBhbmQgcHJvdmVzIG5vIHBhdGggY29tcG9uZW50IGJlbG93IHRoZSByZXBvc2l0b3J5IHJvb3QgaXMgYVxuLy8gc3ltbGluazogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgc3ltbGluayAoZS5nLiBhIHRyYWNrZWQgLnRtcC93YmZ5LWZub3gtbG9jYWwtYmFja3VwIGxpbmspXG4vLyBjb3VsZCBvdGhlcndpc2UgbW92ZSB0aGUgcGxhaW50ZXh0IGxvY2FsIHNlY3JldHMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgb3IgcmVzb2x2ZSB0aGUgYmFja3VwXG4vLyBiYWNrIG9udG8gdGhlIHNvdXJjZSBmaWxlIGFuZCB0dXJuIHRoZSBoaWRlIHJlbmFtZSBpbnRvIGEgbm8tb3AuXG5mdW5jdGlvbiBlbnN1cmVTYWZlRm5veExvY2FsQmFja3VwRGlyKHJvb3REaXJQYXRoOiBzdHJpbmcsIGJhY2t1cFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBiYWNrdXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpO1xuICBmcy5ta2RpclN5bmMoYmFja3VwRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGV4cGVjdGVkUmVhbFBhdGggPSBwYXRoLmpvaW4oZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKSwgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgYmFja3VwRGlyUGF0aCkpO1xuICBpZiAoZnMucmVhbHBhdGhTeW5jKGJhY2t1cERpclBhdGgpICE9PSBleHBlY3RlZFJlYWxQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2JhY2t1cERpclBhdGh9IHJlc29sdmVzIHRocm91Z2ggYSBzeW1saW5rOyByZW1vdmUgdGhlIHN5bWxpbmtlZCBjb21wb25lbnQuYCk7XG4gIH1cbn1cblxuLy8gVGhlIGJhY2t1cCBsaXZlcyB1bmRlciB0aGUgZ2l0aWdub3JlZCAudG1wIHNvIGEgaGlkZGVuIGZub3gubG9jYWwudG9tbCBjYW4gbmV2ZXIgYmVjb21lXG4vLyBzdGFnZWFibGUgKGEgc2libGluZyByZW5hbWUgbGlrZSBmbm94LmxvY2FsLnRvbWwud2JmeS1iYWsgd291bGQgbm8gbG9uZ2VyIG1hdGNoIHRoZSBkb2N1bWVudGVkXG4vLyBgZm5veC5sb2NhbC50b21sYCBpZ25vcmUgZW50cnkgYW5kIGNvdWxkIGJlIGNvbW1pdHRlZCBieSBgZ2l0IGFkZCAtQWApLlxuZnVuY3Rpb24gZm5veExvY2FsQmFja3VwUGF0aChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5yZXNvbHZlKFxuICAgIHJvb3REaXJQYXRoLFxuICAgICcudG1wJyxcbiAgICAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcsXG4gICAgcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgZGlyUGF0aCksXG4gICAgJ2Zub3gubG9jYWwudG9tbCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVNaWdyYXRpb25NYXJrZXIoKTogdm9pZCB7XG4gIGlmICghbWlncmF0aW9uTWFya2VyUGF0aCB8fCBtaWdyYXRpb25NYXJrZXJPd25lZCkgcmV0dXJuO1xuICBjb25zdCB0bXBEaXJQYXRoID0gcGF0aC5kaXJuYW1lKG1pZ3JhdGlvbk1hcmtlclBhdGgpO1xuICBmcy5ta2RpclN5bmModG1wRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIFJlZnVzZSB0byB3cml0ZSB0aHJvdWdoIHN5bWxpbmtzOiBhIHJlcG9zaXRvcnktY29udHJvbGxlZCAudG1wIHN5bWxpbmsgY291bGQgb3RoZXJ3aXNlXG4gIC8vIHJlZGlyZWN0IHRoZSBtYXJrZXIgd3JpdGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS4gVGhlIGB3eGAgZmxhZyBtYWtlcyB0aGUgb3BlbiBpdHNlbGYgZmFpbFxuICAvLyBvbiBhbnkgcHJlLWV4aXN0aW5nIHBhdGgsIGluY2x1ZGluZyBhIGRhbmdsaW5nIHN5bWxpbmsg4oCUIHdoaWNoIGFsc28gYWNxdWlyZXMgdGhlIG1hcmtlclxuICAvLyBhdG9taWNhbGx5LCBzbyBhIGNvbmN1cnJlbnQgd2JmeSBydW4gY2Fubm90IHN0YXJ0IGEgc2Vjb25kIG1pZ3JhdGlvbi5cbiAgaWYgKGZzLmxzdGF0U3luYyh0bXBEaXJQYXRoKS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RtcERpclBhdGh9IGlzIGEgc3ltbGluazsgcmVwbGFjZSBpdCB3aXRoIGEgcmVndWxhciBkaXJlY3RvcnkuYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCxcbiAgICAgICd3YmZ5IGZub3ggbWlncmF0aW9uIGluIHByb2dyZXNzOyBhIGxlZnRvdmVyIG1hcmtlciBibG9ja3MgbmV3IG1pZ3JhdGlvbnNcXG4nLFxuICAgICAge1xuICAgICAgICBmbGFnOiAnd3gnLFxuICAgICAgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBbm90aGVyIHdiZnkgcHJvY2VzcyBhcHBlYXJzIHRvIGJlIG1pZ3JhdGluZyAoJHttaWdyYXRpb25NYXJrZXJQYXRofSBleGlzdHMpOiAke2Vycm9yfWApO1xuICB9XG4gIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gdHJ1ZTtcbn1cblxuLy8gT25seSB0aGUgcnVuIHRoYXQgYWNxdWlyZWQgdGhlIG1hcmtlciBtYXkgcmVtb3ZlIGl0OiBkZWxldGluZyBhIGZvcmVpZ24gbWFya2VyIHdvdWxkIGRpc2FibGVcbi8vIGludGVycnVwdGVkLW1pZ3JhdGlvbiBkZXRlY3Rpb24gZm9yIGEgY29uY3VycmVudGx5IHJ1bm5pbmcgd2JmeS5cbmZ1bmN0aW9uIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlck93bmVkIHx8ICFtaWdyYXRpb25NYXJrZXJQYXRoKSByZXR1cm47XG4gIGZzLnJtU3luYyhtaWdyYXRpb25NYXJrZXJQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90czogTWFwPHN0cmluZywgc3RyaW5nPik6IGJvb2xlYW4ge1xuICBsZXQgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIHNuYXBzaG90cykge1xuICAgIHRyeSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZmFpbEZub3hTeW5jKGBGYWlsZWQgdG8gcmVzdG9yZSAke2ZpbGVQYXRofSBhZnRlciBhIGZhaWxlZCBtaWdyYXRpb246ICR7ZXJyb3J9YCk7XG4gICAgICBzdWNjZWVkZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1Y2NlZWRlZDtcbn1cblxuZnVuY3Rpb24gZmFpbEZub3hTeW5jKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgZm5veFN5bmNGYWlsZWQgPSB0cnVlO1xufVxuXG4vLyBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYW4gdW5zdXBwb3J0ZWQgZm5veC5sb2NhbC50b21sIGluIHRoZSBkaXJlY3RvcnksIG9yIHVuZGVmaW5lZC4gTG9jYWxcbi8vIG92ZXJyaWRlcyBtYXkgb25seSBob2xkIG1hY2hpbmUtbG9jYWwgc2VjcmV0IHZhbHVlczsgaW1wb3J0cyBvciBwcm92aWRlciAocmUpZGVmaW5pdGlvbnMgd291bGRcbi8vIHNpbGVudGx5IGNoYW5nZSB3aGljaCByZWNpcGllbnQgc2V0IGdvdmVybnMgcmUtZW5jcnlwdGlvbi5cbmZ1bmN0aW9uIGZpbmRGbm94TG9jYWxUb21sSXNzdWUoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbG9jYWxUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFRvbWxQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYWxTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFRvbWxQYXRoLCAndXRmOCcpKSBhcyBGbm94VG9tbDtcbiAgY29uc3QgZGVmaW5lc1Byb3ZpZGVycyA9XG4gICAgbG9jYWxTZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCB8fFxuICAgIGxvY2FsU2V0dGluZ3MucHJvdmlkZXJzICE9PSB1bmRlZmluZWQgfHxcbiAgICBPYmplY3QudmFsdWVzKGxvY2FsU2V0dGluZ3MucHJvZmlsZXMgPz8ge30pLnNvbWUoKHByb2ZpbGUpID0+IHByb2ZpbGU/LnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGRlZmluZXNQcm92aWRlcnMgPyBgJHtsb2NhbFRvbWxQYXRofSBkZWZpbmVzIGltcG9ydHMsIHByb3ZpZGVycywgb3IgcHJvZmlsZSBwcm92aWRlcnNgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IGRpcmVjdG9yeSBjb250YWluaW5nIGEgY29tbWl0dGVkIChvciBjb21taXR0YWJsZSkgZm5veC50b21sIGFtb25nIHRoZSBnaXZlblxuICogZ2l0LWRpc2NvdmVyZWQgY29uZmlnIHBhdGhzIChzZWUgbGlzdEZub3hMaWtlRmlsZVBhdGhzOiBnaXQtYmFzZWQgZGlzY292ZXJ5IGV4Y2x1ZGVzIGdpdGlnbm9yZWRcbiAqIHRyZWVzIHN1Y2ggYXMgbm9kZV9tb2R1bGVzIHdpdGhvdXQgZXhjbHVkaW5nIGxlZ2l0aW1hdGUgcGFja2FnZXMgbmFtZWQgbGlrZSBidWlsZCBvdXRwdXRzKS5cbiAqL1xuZnVuY3Rpb24gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBmbm94TGlrZUZpbGVQYXRoc1xuICAgICAgICAuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgPT09ICdmbm94LnRvbWwnKVxuICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIGRlY2xhcmVzIGl0cyBvd24gYFtwcm92aWRlcnMuYWdlXWAsIGkuZS4gcGFydGljaXBhdGVzIGluIGFnZSBlbmNyeXB0aW9uLlxuICogQSBjb25maWcgd2l0aG91dCBvbmUgZWl0aGVyIGluaGVyaXRzIGEgbWFuYWdlZCByb290J3MgcHJvdmlkZXIgKGhhbmRsZWQgYnkgdGhlIHJvb3QtZXhpc3RzIHBhdGgpXG4gKiBvciwgd2hlbiBubyByb290IGV4aXN0cywgdXNlcyBubyBhZ2UgZW5jcnlwdGlvbiBhdCBhbGwg4oCUIHNvIGl0IG5lZWRzIG5vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb25cbiAqIGFuZCBvd25zIG5vIEZOT1hfQUdFX0tFWS5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZXNGbm94QWdlUHJvdmlkZXIoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhaWwgY2xvc2VkOiBhbiB1bnJlYWRhYmxlIGNvbmZpZyBtaWdodCBkZWNsYXJlIGFuIGFnZSBwcm92aWRlci5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBCb29sZWFuKChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbCkucHJvdmlkZXJzPy5hZ2UpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5wYXJzYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZm5veCBjb25maWcgcGF0aCBsaWVzIGluc2lkZSBhIHRlc3QtZml4dHVyZSB0cmVlICh0ZXN0L2ZpeHR1cmVzLCB0ZXN0LWZpeHR1cmVzLFxuICogX190ZXN0c19fKTogZml4dHVyZSBjb25maWdzIGFyZSB0ZXN0IElOUFVUUywgbm90IHJlcG9zaXRvcnkgY29uZmlndXJhdGlvbi4gZm5veCBuZXZlciBsb2Fkc1xuICogdGhlbSBmb3IgcmVhbCBjb21tYW5kcyAoaGllcmFyY2hpY2FsIGxvYWRpbmcgb25seSB3YWxrcyBjd2QgYW5jZXN0b3JzKSwgcmVjaXBpZW50XG4gKiBzeW5jaHJvbml6YXRpb24gbXVzdCBub3QgcmV3cml0ZSBvciByZS1lbmNyeXB0IHRoZW0gKHNoYXJlZC1saWItbm9kZSdzIHVuZGVjcnlwdGFibGUgZml4dHVyZVxuICogZXhpc3RzIHByZWNpc2VseSB0byBzdGF5IHVuZGVjcnlwdGFibGUpLCBhbmQgYSBmaXh0dXJlIG11c3Qgbm90IGZhaWwgdGhlIHN0cmF5LW5lc3RlZC1jb25maWdcbiAqIGNoZWNrIGluIHJlcG9zaXRvcmllcyB3aXRob3V0IGEgcm9vdCBmbm94LnRvbWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Rlc3RGaXh0dXJlRm5veFBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBgZml4dHVyZXNgIGNvdW50cyBvbmx5IGRpcmVjdGx5IHVuZGVyIGEgdGVzdCBkaXJlY3Rvcnk6IHdiZnkgc3VwcG9ydHMgYXJiaXRyYXJ5IHdvcmtzcGFjZXMsXG4gIC8vIHNvIGEgbGVnaXRpbWF0ZSBgcGFja2FnZXMvZml4dHVyZXMvYCB3b3Jrc3BhY2UgbXVzdCBzdGF5IG1hbmFnZWQgYW5kIHZlcmlmaWVkLlxuICBjb25zdCBzZWdtZW50cyA9IGZpbGVQYXRoLnNwbGl0KCcvJyk7XG4gIHJldHVybiBzZWdtZW50cy5zb21lKFxuICAgIChzZWdtZW50LCBpbmRleCkgPT5cbiAgICAgIHNlZ21lbnQgPT09ICd0ZXN0LWZpeHR1cmVzJyB8fFxuICAgICAgc2VnbWVudCA9PT0gJ19fdGVzdHNfXycgfHxcbiAgICAgIChzZWdtZW50ID09PSAnZml4dHVyZXMnICYmIChzZWdtZW50c1tpbmRleCAtIDFdID09PSAndGVzdCcgfHwgc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3RzJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyAteiBwcmludHMgTlVMLWRlbGltaXRlZCB2ZXJiYXRpbSBwYXRoczsgd2l0aG91dCBpdCwgY29yZS5xdW90ZVBhdGggQy1xdW90ZXMgbm9uLUFTQ0lJIHBhdGhzXG4gIC8vIChlLmcuIFwiXFwzNDZcXDIyN1xcMjQ1Li4uXCIpLCB3aGljaCB3b3VsZCBtYWtlIHRoZSBiYXNlbmFtZSBmaWx0ZXIgc2lsZW50bHkgc2tpcCB0aG9zZSBjb25maWdzLlxuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgJ2dpdCcsXG4gICAgWydscy1maWxlcycsICcteicsICctLWNhY2hlZCcsICctLW90aGVycycsICctLWV4Y2x1ZGUtc3RhbmRhcmQnLCAnLS0nLCAnKmZub3gqLnRvbWwnXSxcbiAgICB7IGN3ZDogcm9vdERpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfVxuICApO1xuICAvLyBGYWlsIGNsb3NlZDogdHJlYXRpbmcgYSBnaXQgZmFpbHVyZSBhcyBcIm5vIGZub3ggY29uZmlnc1wiIHdvdWxkIHNraXAgc3luY2hyb25pemF0aW9uIGFuZCBsZXRcbiAgLy8gc2V0dXBTZWNyZXRzIHVwbG9hZCBhIGtleSB0aGF0IHdhcyBuZXZlciB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZXBvc2l0b3J5J3MgY2lwaGVydGV4dHMuXG4gIGlmIChwcm9jLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZ2l0IGxzLWZpbGVzIGZhaWxlZCBpbiAke3Jvb3REaXJQYXRofTogJHsocHJvYy5zdGRlcnIgfHwgcHJvYy5lcnJvcj8ubWVzc2FnZSB8fCAnJykudHJpbSgpfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dFxuICAgIC5zcGxpdCgnXFwwJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiAvXlxcLj9mbm94KFxcLi4rKT9cXC50b21sJC91LnRlc3QocGF0aC5iYXNlbmFtZShsaW5lKSkgJiYgIWlzVGVzdEZpeHR1cmVGbm94UGF0aChsaW5lKSlcbiAgICAubWFwKChsaW5lKSA9PiBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIGxpbmUpKTtcbn1cblxuZnVuY3Rpb24gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KG5hbWUpKVxuICAgICAgLnRvU29ydGVkKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyB7IGNvZGU/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGZub3ggY2FuIHN0aWxsIGxvYWQgYSBjb25maWcgZnJvbSBhIGRpcmVjdG9yeSB0aGlzIHByb2Nlc3MgY2Fubm90IGVudW1lcmF0ZVxuICAgIC8vIChlLmcuIGV4ZWN1dGUtb25seSBwZXJtaXNzaW9uKSwgc28gYW4gZW51bWVyYXRpb24gZmFpbHVyZSBtdXN0IG5vdCByZWFkIGFzIFwibm8gY29uZmlnc1wiLlxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluc3BlY3QgJHtkaXJQYXRofSBmb3IgZm5veCBjb25maWdzOiAke2Vycm9yfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGlyUGF0aHMgPSBbZGlyUGF0aF07XG4gIHdoaWxlIChkaXJQYXRocy5hdCgtMSkgIT09IHJvb3REaXJQYXRoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpclBhdGhzLmF0KC0xKSA/PyAnJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyUGF0aHMuYXQoLTEpKSBicmVhaztcbiAgICBkaXJQYXRocy5wdXNoKHBhcmVudCk7XG4gIH1cbiAgcmV0dXJuIGRpclBhdGhzO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQge1xuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxuICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4sXG4gIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5LFxuICByZXNvbHZlV29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbi8vIFRoZSBCdW4tZXhhY3QgcmVzb2x1dGlvbiBwcmltaXRpdmVzIGxpdmUgaW4gQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSAoc3JjL2J1bldvcmtzcGFjZXMudHMpXG4vLyBzbyB3YidzIHJlbGVhc2UgY29kZSBzaGFyZXMgdGhlbTsgcmUtZXhwb3J0IHRoZSBvbmVzIHdiZnkgbW9kdWxlcyBhbmQgdGVzdHMgY29uc3VtZS5cbmV4cG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIFBhY2thZ2VDb25maWcgdGhhdCB3b3Jrc3BhY2UgZGlzY292ZXJ5IG5lZWRzLCBzbyBpdCBjYW4gcnVuIGJlZm9yZSBjb25maWdzIGV4aXN0LiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlUm9vdExpa2UgPSBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPjtcblxuLyoqXG4gKiBFdmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgZGlyZWN0b3J5IChhYnNvbHV0ZSwgZGVkdXBsaWNhdGVkKSBvZiB0aGUgbW9ub3JlcG8gcm9vdCwgY292ZXJpbmdcbiAqIG5vbi1wYWNrYWdlcy8qIGxheW91dHMgc3VjaCBhcyBhcHBzLyouIFVuY2FjaGVkIGJlY2F1c2UgaW5kZXgudHMgY2FsbHMgaXQgYmVmb3JlIHdiZnkgbXV0YXRlc1xuICogdGhlIHJvb3QgcGFja2FnZS5qc29uIChnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyBjYWNoZXMgdGhlIHBvc3QtbXV0YXRpb24gc3RhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RMaWtlKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGF0aC5yZXNvbHZlKHJvb3RMaWtlLmRpclBhdGgsIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgKVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpLCBpbmNsdWRpbmcgbWFuaWZlc3RzXG4gKiB3aXRob3V0IGEgYG5hbWVgIGZpZWxkIOKAlCB3YmZ5IG5hbWVzIHRob3NlIGxhdGVyLCBzbyBkZXBlbmRlbmN5IHNjYW5zIG11c3Qgbm90IHNraXAgdGhlbS5cbiAqIFJlc29sdXRpb24gbWltaWNzIEJ1bidzIHNlcXVlbnRpYWwgcGF0dGVybiBldmFsdWF0aW9uOyBzZWUgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWc6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdENvbmZpZyksIHJvb3RDb25maWcuZGlyUGF0aCk7XG59XG5cbmludGVyZmFjZSBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8qKiBEaXJlY3Rvcnkgc3VidHJlZXMgKG9yIHBhY2thZ2Utb3duZWQgc3VicGF0aHMpIG1hdGNoZWQgYnkgZWZmZWN0aXZlIG5lZ2F0aW9ucywgZm9yIHRzY29uZmlnIGBleGNsdWRlYCBlbnRyaWVzLiAqL1xuICBleGNsdWRlczogc3RyaW5nW107XG4gIC8qKiBQb3NpdGl2ZSBkaXJlY3RvcnkgcGF0dGVybnMgKG9yIGNvbmNyZXRlIGRpcmVjdG9yaWVzIGZvciBCdW4tb25seSBnbG9iIHN5bnRheCkuICovXG4gIGluY2x1ZGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBTb3J0ZWQgd29ya3NwYWNlIGRpcmVjdG9yeSBwYXR0ZXJucyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290KSBmb3IgZ2VuZXJhdG9ycyB0aGF0XG4gKiBuZWVkIHBhdHRlcm4tc2hhcGVkIGdsb2JzIGNvdmVyaW5nIGV2ZXJ5IHdvcmtzcGFjZSBsYXlvdXQg4oCUIGUuZy4gdGhlIHJvb3QgdHNjb25maWcncyBgYXBwcy8qYFxuICogaW5jbHVkZSBlbnRyaWVzIOKAlCBpbnN0ZWFkIG9mIGNvbmNyZXRlIGRpcmVjdG9yaWVzLCB3aGljaCB3b3VsZCBjaHVybiBnZW5lcmF0ZWQgZmlsZXMgd2hlbmV2ZXIgYVxuICogd29ya3NwYWNlIHBhY2thZ2UgaXMgYWRkZWQgb3IgcmVtb3ZlZC4gRXZlcnkgcmV0dXJuZWQgcGF0dGVybiBpcyB2YWxpZCB0c2NvbmZpZyBnbG9iIHN5bnRheC5cbiAqIEEgcGF0dGVybiBjYW4gbWF0Y2ggYSBzaWJsaW5nIGRpcmVjdG9yeSB3aXRob3V0IGEgcGFja2FnZS5qc29uIChub3QgYSB3b3Jrc3BhY2UgdG8gQnVuKTsgdGhhdFxuICogaXMgZGVsaWJlcmF0ZSwgbWlycm9yaW5nIHRoZSBsb25nLXN0YW5kaW5nIGBwYWNrYWdlcy8qYCBlbnRyaWVzJyBiZWhhdmlvciBpbiBmYXZvciBvZiBzdGFibGVcbiAqIGdlbmVyYXRlZCBvdXRwdXQuIE5lZ2F0aW9ucyBmb2xsb3cgQnVuJ3Mgc2VxdWVudGlhbCBzZW1hbnRpY3MgKHNlZVxuICogcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMpOiBhIG5lZ2F0aW9uIHN0YXlzIHBhdHRlcm4tc2hhcGVkIHdoaWxlIGl0IGV4Y2x1ZGVzIGV4YWN0bHlcbiAqIHdoYXQgaXQgbWF0Y2hlcywgYnV0IGlzIGNvbmNyZXRpemVkIHBlciBtYXRjaGVkIGRpcmVjdG9yeSB3aGVuIGEgbWF0Y2hlZCBkaXJlY3RvcnkgZW5kcyB1cCBhXG4gKiB3b3Jrc3BhY2UgYW55d2F5IChyZS1pbmNsdWRlZCBieSBhIGxhdGVyIHBvc2l0aXZlLCBhIHBpbm5lZCBjb25jcmV0ZSBwb3NpdGl2ZSwgb3IgYSBzZWVkZWRcbiAqIGJhc2VsaW5lOyAjMTAwNSkgb3IgaXMgYW4gYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5LCB3aGVyZSBCdW4gZXhjbHVkZXMgb25seSB0aGVcbiAqIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3RvcnksIHNvIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgYXJlIGV4Y2x1ZGVkICgjMTAwNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBXb3Jrc3BhY2VEaXJQYXR0ZXJucyB7XG4gIC8vIFVubGlrZSBkaXNjb3ZlcnksIGdlbmVyYXRlZCBvdXRwdXQgbXVzdCBub3QgY29udGFpbiBhIG5ldmVyLW1hdGNoaW5nIGBwYWNrYWdlcy8qYCBmYWxsYmFjazpcbiAgLy8gYW4gYXBwcy8qLW9ubHkgbW9ub3JlcG8gd291bGQgZ2V0IGRlYWQgZ2xvYnMgY29tbWl0dGVkIGludG8gaXRzIHJvb3QgdHNjb25maWcuIE1pcnJvclxuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIGZvcmNlcyBgcGFja2FnZXMvKmAgb25seSB3aGVuIGEgbWFuaWZlc3QgYWN0dWFsbHkgbWF0Y2hlcy5cbiAgY29uc3QgaGFzUGFja2FnZXNMYXlvdXQgPVxuICAgIHJvb3RMaWtlLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmXG4gICAgLy8gTWlycm9yIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucycgYmFzZWxpbmUgZ2F0ZSB0b286IHdpdGggYW4gaW1wbGljaXQgYmFzZWxpbmUgc2VlZGVkLFxuICAgIC8vIGBwYWNrYWdlcy8qYCBlbnRyaWVzIHdvdWxkIGJlIGRlYWQgZ2xvYnMgc3Vic3VtZWQgYnkgdGhlIGJhc2VsaW5lLWRlcml2ZWQgb25lcy5cbiAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcykgJiZcbiAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBjd2Q6IHJvb3RMaWtlLmRpclBhdGgsXG4gICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KS5sZW5ndGggPiAwO1xuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9IGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHtcbiAgICAuLi5yb290TGlrZSxcbiAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogaGFzUGFja2FnZXNMYXlvdXQsXG4gIH0pO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IG5ldyBTZXQoXG4gICAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMod29ya3NwYWNlUGF0dGVybnMsIHJvb3RMaWtlLmRpclBhdGgpLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PlxuICAgICAgcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aClcbiAgICApXG4gICk7XG4gIGNvbnN0IGluY2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG5lZ2F0aW9uQm9kaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdHRlcm4gb2Ygd29ya3NwYWNlUGF0dGVybnMpIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJyk7XG4gICAgY29uc3QgcGF0dGVybkJvZHkgPSBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keShpc05lZ2F0aXZlID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm4pO1xuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICAvLyBBIHNlZWRpbmcgbmVnYXRpb24gbWFrZXMgQnVuIGxpbmsgYmFzZWxpbmUtbWF0Y2hlZCBkaXJlY3Rvcmllcywgc28gdGhlIGJhc2VsaW5lIG11c3RcbiAgICAgIC8vIGVudGVyIHRoZSBnZW5lcmF0ZWQgaW5jbHVkZSBwYXR0ZXJucyBldmVuIHdoZW4gZXZlcnkgZGVjbGFyZWQgcGF0dGVybiBpcyBhIG5lZ2F0aW9uLlxuICAgICAgY29uc3QgYmFzZWxpbmVHbG9iID0gZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKHBhdHRlcm5Cb2R5KTtcbiAgICAgIGlmIChiYXNlbGluZUdsb2IgIT09IHVuZGVmaW5lZCkgaW5jbHVkZXMuYWRkKGJhc2VsaW5lR2xvYik7XG4gICAgICBuZWdhdGlvbkJvZGllcy5wdXNoKHBhdHRlcm5Cb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBkaXJQYXR0ZXJuIG9mIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHksIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICAgIGluY2x1ZGVzLmFkZChkaXJQYXR0ZXJuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgZXhjbHVkZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBuZWdhdGlvbkJvZHkgb2YgbmVnYXRpb25Cb2RpZXMpIHtcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVFbnRyeSBvZiB0b0V4Y2x1ZGVFbnRyaWVzKG5lZ2F0aW9uQm9keSwgd29ya3NwYWNlRGlyUGF0aHMsIHJvb3RMaWtlLmRpclBhdGgpKSB7XG4gICAgICBleGNsdWRlcy5hZGQoZXhjbHVkZUVudHJ5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgZXhjbHVkZXM6IFsuLi5leGNsdWRlc10udG9Tb3J0ZWQoKSwgaW5jbHVkZXM6IFsuLi5pbmNsdWRlc10udG9Tb3J0ZWQoKSB9O1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGV4Y2x1ZGUgZW50cmllcyBmb3Igb25lIG5lZ2F0aW9uLiBQYXR0ZXJuLXNoYXBlZCB3aGVuIHRoZSBuZWdhdGlvbiBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMgKHN0YWJsZSBvdXRwdXQpOyBwZXItZGlyZWN0b3J5IG90aGVyd2lzZTogYSBkaXJlY3RvcnkgdGhhdCBpcyBhIHdvcmtzcGFjZVxuICogZGVzcGl0ZSB0aGUgbmVnYXRpb24gaXMgbm90IGV4Y2x1ZGVkIGF0IGFsbCwgYW5kIG5laXRoZXIgaXMgYSBQTEFJTiAocGFja2FnZS5qc29uLWxlc3MpXG4gKiBkZXNjZW5kYW50IG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSDigJQgbmVnYXRpbmcgYSBub24tcGFja2FnZSBkaXJlY3RvcnkgaXMgYSBuby1vcCBmb3IgQnVuLFxuICogYW5kIHRoZSBlbmNsb3Npbmcgd29ya3NwYWNlIHN0YXlzIGFjdGl2ZSAoZS5nLiBgWydhcHBzLyoqJywgJyFhcHBzLyoqJywgJ2FwcHMvd2ViJ11gXG4gKiByZS1pbmNsdWRlcyBhcHBzL3dlYiwgd2hvc2Ugc3JjIG11c3Qga2VlcCB0eXBlLWNoZWNraW5nOyBhIHRzY29uZmlnIGV4Y2x1ZGUgd291bGQgb3ZlcnJpZGVcbiAqIHRoZSBpbmNsdWRlKS4gQSBkZXNjZW5kYW50IHdpdGggaXRzIG93biBtYW5pZmVzdCB0aGF0IHRoZSBuZWdhdGlvbiBrZWVwcyBvdXQgb2YgdGhlIHdvcmtzcGFjZVxuICogc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlIGFuZCBzdGF5cyBleGNsdWRlZC4gQSBkaXJlY3RvcnkgdGhhdCBpcyBhblxuICogYW5jZXN0b3Igb2YgYSB3b3Jrc3BhY2UgZGlyZWN0b3J5IGdldHMgb25seSBpdHMgcGFja2FnZS1vd25lZCBzdWJwYXRocyBleGNsdWRlZCwgYmVjYXVzZSBCdW5cbiAqIGV4Y2x1ZGVzIG9ubHkgdGhlIHBhY2thZ2UgQVQgdGhhdCBkaXJlY3Rvcnkgd2hpbGUga2VlcGluZyBkZXNjZW5kYW50IHdvcmtzcGFjZXMgKCMxMDA0KS5cbiAqL1xuZnVuY3Rpb24gdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IFNldDxzdHJpbmc+LCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpc1dvcmtzcGFjZUFuY2VzdG9yID0gKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBbLi4ud29ya3NwYWNlRGlyUGF0aHNdLnNvbWUoKHdvcmtzcGFjZURpclBhdGgpID0+IHdvcmtzcGFjZURpclBhdGguc3RhcnRzV2l0aChgJHtkaXJQYXRofS9gKSk7XG4gIC8vIE9ubHkgUExBSU4gZGlyZWN0b3JpZXMgKG5vIHBhY2thZ2UuanNvbiBvZiB0aGVpciBvd24pIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGVuY2xvc2luZ1xuICAvLyB3b3Jrc3BhY2U6IGEgbWF0Y2hlZCBkaXJlY3RvcnkgdGhhdCBjYXJyaWVzIGl0cyBvd24gbWFuaWZlc3QgeWV0IGlzIGFic2VudCBmcm9tIHRoZSBmaW5hbFxuICAvLyB3b3Jrc3BhY2Ugc2V0IGlzIGFuIGV4Y2x1ZGVkIG5lc3RlZCBwYWNrYWdlLCBhbmQgaXRzIGV4Y2x1c2lvbiBtdXN0IHN1cnZpdmUuXG4gIGNvbnN0IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudCA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBkaXJQYXRoLnN0YXJ0c1dpdGgoYCR7d29ya3NwYWNlRGlyUGF0aH0vYCkpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBkaXJQYXRoLCAncGFja2FnZS5qc29uJykpO1xuICBjb25zdCBtYXRjaGVkRGlyUGF0aHMgPSBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIGlmIChcbiAgICAhbWF0Y2hlZERpclBhdGhzLnNvbWUoXG4gICAgICAoZGlyUGF0aCkgPT5cbiAgICAgICAgd29ya3NwYWNlRGlyUGF0aHMuaGFzKGRpclBhdGgpIHx8IGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhuZWdhdGlvbkJvZHksIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlZERpclBhdGhzLmZsYXRNYXAoKGRpclBhdGgpID0+IHtcbiAgICAvLyBUaGUgZGVzY2VuZGFudCBjaGVjayBwcmVjZWRlcyB0aGUgYW5jZXN0b3Igb25lOiBhIGRpcmVjdG9yeSBpbnNpZGUgb25lIHdvcmtzcGFjZSBidXQgYWJvdmVcbiAgICAvLyBhIG5lc3RlZCBvbmUgKGUuZy4gYXBwcy93ZWIvcGx1Z2lucyBiZXR3ZWVuIHdvcmtzcGFjZXMgYXBwcy93ZWIgYW5kIGFwcHMvd2ViL3BsdWdpbnMveClcbiAgICAvLyBzdGlsbCBiZWxvbmdzIHRvIHRoZSBlbmNsb3NpbmcgYWN0aXZlIHdvcmtzcGFjZSwgc28gbm90aGluZyBvZiBpdCBtYXkgYmUgZXhjbHVkZWQuXG4gICAgaWYgKHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQoZGlyUGF0aCkpIHJldHVybiBbXTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VBbmNlc3RvcihkaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtgJHtkaXJQYXRofS8qLmNvbmZpZy50c2AsIGAke2RpclBhdGh9L3NjcmlwdHNgLCBgJHtkaXJQYXRofS9zcmNgLCBgJHtkaXJQYXRofS90ZXN0YF07XG4gICAgfVxuICAgIHJldHVybiBbZGlyUGF0aF07XG4gIH0pO1xufVxuXG4vKipcbiAqIERpcmVjdG9yaWVzIGEgbmVnYXRpb24gbWF0Y2hlcy4gVGhlIG1hbmlmZXN0LWJhc2VkIGdsb2IgY29tcGxlbWVudHMgb25seURpcmVjdG9yaWVzIGJlY2F1c2VcbiAqIGZhc3QtZ2xvYidzIGBkaXIvKipgIGRvZXMgbm90IHJldHVybiBgZGlyYCBpdHNlbGYgYXMgYSBkaXJlY3RvcnksIHdoaWxlIGJvdGggQnVuIGFuZCB0aGVcbiAqIG1hbmlmZXN0IGdsb2IgdHJlYXQgYCoqYCBhcyB6ZXJvIG9yIG1vcmUgc2VnbWVudHMgKGBhcHBzLyoqYCBjb3ZlcnMgdGhlIHBhY2thZ2UgYXQgYXBwcykuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoZWREaXJQYXRocyhuZWdhdGlvbkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7IGN3ZDogcm9vdERpclBhdGgsIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfTtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLmZnLmdsb2JTeW5jKG5lZ2F0aW9uQm9keSwgeyAuLi5nbG9iT3B0aW9ucywgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pLFxuICAgICAgLi4uZmdcbiAgICAgICAgLmdsb2JTeW5jKHBhdGgucG9zaXguam9pbihuZWdhdGlvbkJvZHksICdwYWNrYWdlLmpzb24nKSwgZ2xvYk9wdGlvbnMpXG4gICAgICAgIC5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT4gcGF0aC5wb3NpeC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpXG4gICAgICAgIC8vIEEgemVyby1zZWdtZW50IGAqKmAgbWF0Y2ggcmVhY2hlcyB0aGUgcm9vdCBpdHNlbGYsIHdoaWNoIGlzIG5ldmVyIGEgd29ya3NwYWNlLlxuICAgICAgICAuZmlsdGVyKChkaXJQYXRoKSA9PiBkaXJQYXRoICE9PSAnLicpLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogdHNjb25maWcgaW5jbHVkZS9leGNsdWRlIHN1cHBvcnQgb25seSB0aGUgYCpgLCBgP2AsIGFuZCBgKipgIHdpbGRjYXJkcywgd2hpbGUgQnVuIHdvcmtzcGFjZXNcbiAqIGFjY2VwdCBmdWxsIGdsb2Igc3ludGF4IChicmFjZSBleHBhbnNpb24sIGNoYXJhY3RlciBjbGFzc2VzLCDigKYpLCBzbyBleHBhbmQgQnVuLW9ubHkgcGF0dGVybnMgdG9cbiAqIHRoZSBjb25jcmV0ZSBkaXJlY3RvcmllcyB0aGV5IG1hdGNoIHRvIGtlZXAgdGhlIGdlbmVyYXRlZCBnbG9icyB2YWxpZCBmb3IgVHlwZVNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdG9Uc2NvbmZpZ0NvbXBhdGlibGVEaXJQYXR0ZXJucyhwYXR0ZXJuQm9keTogc3RyaW5nLCByb290RGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoIS9bKClbXFxde31dL3UudGVzdChwYXR0ZXJuQm9keSkpIHJldHVybiBbcGF0dGVybkJvZHldO1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybkJvZHksIHtcbiAgICBjd2Q6IHJvb3REaXJQYXRoLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICBvbmx5RGlyZWN0b3JpZXM6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyAobmVnYXRpdmUgb25lcyBpbmNsdWRlZCkgdGhhdCBzdGF5IGluc2lkZSB0aGUgcmVwb3NpdG9yeTogYWJzb2x1dGVcbiAqIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIHJlbW92ZU5vZGVNb2R1bGVzIG9wZXJhdGUgb24gYW5vdGhlclxuICogcmVwb3NpdG9yeSdzIGZpbGVzLiBEZWNsYXJhdGlvbiBvcmRlciBhbmQgZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZVxuICogcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBwb3NpdGlvbiBtYXR0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZTogV29ya3NwYWNlUm9vdExpa2UpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlY2xhcmVkUGF0dGVybnMgPSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcyk7XG4gIC8vIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyBmb3JjZXMgYHBhY2thZ2VzLypgIGludG8gYSBtb25vcmVwbydzIHdvcmtzcGFjZXMgd2hlbiBhXG4gIC8vIHBhY2thZ2VzLyovcGFja2FnZS5qc29uIGFjdHVhbGx5IG1hdGNoZXMsIGJ1dCBpdCBtYXkgbm90IGhhdmUgd3JpdHRlbiB0aGUgcm9vdCBwYWNrYWdlLmpzb25cbiAgLy8geWV0LCBzbyBtaXJyb3IgdGhhdCBub3JtYWxpemF0aW9uIGhlcmUg4oCUIFBSRVBFTkRFRCBsaWtlIHRoZXJlLCBiZWNhdXNlIGEgcG9zaXRpdmUgcGF0dGVyblxuICAvLyBwbGFjZWQgYWZ0ZXIgYSB1c2VyIG5lZ2F0aW9uIHdvdWxkIHJlLWluY2x1ZGUgdGhlIG5lZ2F0ZWQgcGFja2FnZXMgdW5kZXIgQnVuJ3Mgc2VxdWVudGlhbFxuICAvLyBldmFsdWF0aW9uLiBEaXNjb3ZlcnkgY2FsbGVycyBwYXNzIHRoZSBmYWxsYmFjayB1bmNvbmRpdGlvbmFsbHkgZm9yIG1vbm9yZXBvcyDigJQgYVxuICAvLyBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGNvbnRyaWJ1dGVzIG5vIHBhdGhzIHRoZXJlIOKAlCB3aGlsZSBwYXR0ZXJuLXNoYXBlZCBjYWxsZXJzXG4gIC8vIChnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykgZ2F0ZSBpdCBvbiBhbiBhY3R1YWwgbWF0Y2guXG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHJvb3RMaWtlLnBhY2thZ2VKc29uPy53b3Jrc3BhY2VzKVxuICAgICAgPyBbJ3BhY2thZ2VzLyonLCAuLi5kZWNsYXJlZFBhdHRlcm5zXVxuICAgICAgOiBkZWNsYXJlZFBhdHRlcm5zO1xuICByZXR1cm4gd29ya3NwYWNlUGF0dGVybnMuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBkZWNsYXJlZCBwb3NpdGl2ZSBwYXR0ZXJuIGFscmVhZHkgY292ZXJzIGBwYWNrYWdlcy8qYCB1bmRlciBwYXRoIG5vcm1hbGl6YXRpb25cbiAqIChlLmcuIGAuL3BhY2thZ2VzLypgIG9yIGEgdHJhaWxpbmctc2xhc2ggc3BlbGxpbmcpOiBmb3JjaW5nIGEgdGV4dHVhbCBgcGFja2FnZXMvKmAgbmV4dCB0b1xuICogc3VjaCBhIHNwZWxsaW5nIHdvdWxkIHBlcnNpc3QgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybnMgYW5kIHJlLXNjYW4gdGhlIHNhbWUgZGlyZWN0b3JpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4od29ya3NwYWNlczogUGFja2FnZUpzb25bJ3dvcmtzcGFjZXMnXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlcykuc29tZShcbiAgICAod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgICF3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgLy8gQSBgLi5gLXRyYXZlcnNpbmcgb3IgYWJzb2x1dGUgc3BlbGxpbmcgKGUuZy4gYHgvLi4vcGFja2FnZXMvKmApIGlzIGRpc2NhcmRlZCBieVxuICAgICAgLy8gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMsIHNvIGl0IG11c3Qgbm90IGNvdW50IGFzIGNvdmVyaW5nIHBhY2thZ2VzLyog4oCUIHRoYXQgd291bGRcbiAgICAgIC8vIHN1cHByZXNzIHRoZSBmYWxsYmFjayBBTkQgbG9zZSB0aGUgcGF0dGVybiwgbGVhdmluZyBubyBkaXNjb3ZlcmVkIHdvcmtzcGFjZXMuXG4gICAgICBpc0luUmVwb3NpdG9yeVdvcmtzcGFjZVBhdHRlcm4od29ya3NwYWNlUGF0dGVybikgJiZcbiAgICAgIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4pID09PSAncGFja2FnZXMvKidcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuaW1wb3J0IHsgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyB9IGZyb20gJy4vd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IFBSSVZBVEVfU0NPUEUgPSAnQHdpbGxib29zdGVyLXByaXZhdGUvJztcblxuY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5SG9zdCA9ICd2ZXJkYWNjaW8tcHJvZHVjdGlvbi1lMzg5LnVwLnJhaWx3YXkuYXBwJztcbmV4cG9ydCBjb25zdCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcgPSBgQHdpbGxib29zdGVyLXByaXZhdGU6cmVnaXN0cnk9aHR0cHM6Ly8ke3ByaXZhdGVSZWdpc3RyeUhvc3R9L2A7XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHJlcG9zaXRvcnkgZGVhbHMgd2l0aCBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcGFja2FnZXMg4oCUIGJ5IGNvbnZlbnRpb24gdGhhdCBzY29wZVxuICogbGl2ZXMgZXhjbHVzaXZlbHkgb24gdGhlIHByaXZhdGUgVmVyZGFjY2lvIHJlZ2lzdHJ5LCBzbyBleGFjdGx5IHRoZXNlIHJlcG9zaXRvcmllcyBuZWVkIHRoZVxuICogVkVSREFDQ0lPX1RPS0VOIHBhc3MtdGhyb3VnaCBpbiB0aGVpciByZXVzYWJsZS13b3JrZmxvdyBjYWxsZXJzLlxuICpcbiAqIEEgcmVwb3NpdG9yeSBxdWFsaWZpZXMgd2hlbiBhbnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBERUNMQVJFUyBhIGRlcGVuZGVuY3kgaW4gdGhlIHNjb3BlIChhbnlcbiAqIGRlcGVuZGVuY3kgZmllbGQpLCBvciBpcyBpdHNlbGYgTkFNRUQgaW4gdGhlIHNjb3BlIChpdCBwdWJsaXNoZXMgdG8gVmVyZGFjY2lvLCBhbmQgcmVsZWFzZS55bWxcbiAqIGRlcml2ZXMgaXRzIG5wbSBhdXRoIGZyb20gdGhlIHNhbWUgc2VjcmV0KS4gTm90aGluZyBlbHNlIGlzIHNjYW5uZWQ6IGxvY2tmaWxlcyBvbmx5IG1pcnJvciB0aGVcbiAqIGRlY2xhcmVkIGRlcGVuZGVuY2llcywgYW5kIGJ1bmZpZy50b21sJ3MgYG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXNgIG1lbnRpb25zIHRoZSBzY29wZSBldmVuIGluXG4gKiByZXBvc2l0b3JpZXMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RpclBhdGgnIHwgJ2RvZXNDb250YWluU3ViUGFja2FnZUpzb25zJyB8ICdwYWNrYWdlSnNvbic+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgbWFuaWZlc3RSZWxQYXRocyA9IG5ldyBTZXQoWydwYWNrYWdlLmpzb24nLCAuLi5nZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZyldKTtcbiAgcmV0dXJuIFsuLi5tYW5pZmVzdFJlbFBhdGhzXS5zb21lKChyZWxQYXRoKSA9PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbFBhdGgpKTtcbiAgICBpZiAoIW1hbmlmZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hbmlmZXN0Lm5hbWU/LnN0YXJ0c1dpdGgoUFJJVkFURV9TQ09QRSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBbXG4gICAgICBtYW5pZmVzdC5kZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMsXG4gICAgICBtYW5pZmVzdC5wZWVyRGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3Qub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgXS5zb21lKChkZXBlbmRlbmNpZXMpID0+IE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcyA/PyB7fSkuc29tZSgobmFtZSkgPT4gbmFtZS5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkUGFja2FnZUpzb25JZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiB3YmZ5J3Mgb3duIHBhY2thZ2UuanNvbiBjYXJyaWVzIGluIHRoZSByZXBvc2l0b3J5LiBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCByZXdyaXRlc1xuICogaXQgaW4gdGhlIHB1Ymxpc2hlZCB0YXJiYWxsIG9ubHkgKGl0IGlzIG5ldmVyIGNvbW1pdHRlZCBiYWNrKSwgc28gYSB3YmZ5IHJ1biBzdGFydGVkIGZyb20gYSBnaXRcbiAqIGNoZWNrb3V0IHJlcG9ydHMgdGhpcyBwbGFjZWhvbGRlciBpbnN0ZWFkIG9mIGEgcmVhbCB2ZXJzaW9uLlxuICovXG5jb25zdCB1bnJlbGVhc2VkVmVyc2lvblByZWZpeCA9ICcwLjAuMC0nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb24oKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlYWRXYmZ5UGFja2FnZUpzb24oKS52ZXJzaW9uO1xufVxuXG4vKiogd2JmeSdzIGxvY2F0aW9uIGluc2lkZSBpdHMgb3duIHJlcG9zaXRvcnksIHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QuICovXG5jb25zdCB3YmZ5RGlyUGF0aEluUmVwbyA9IHBhdGguam9pbigncGFja2FnZXMnLCAnd2JmeScpO1xuXG4vKipcbiAqIElkZW50aWZpZXMgdGhlIHdiZnkgYnVpbGQgdGhhdCBwcm9kdWNlZCB0aGUgZ2VuZXJhdGVkIGZpbGVzOiB0aGUgcmVsZWFzZWQgdmVyc2lvbiwgb3JcbiAqIGA8c2hvcnQgY29tbWl0IGhhc2g+Wy1kaXJ0eV0tbG9jYWxgIHdoZW4gd2JmeSBydW5zIGZyb20gaXRzIG93biBnaXQgY2hlY2tvdXQuIFVuZGVmaW5lZCB3aGVuXG4gKiBuZWl0aGVyIGlzIGF2YWlsYWJsZSAoZS5nLiBhbiB1bnJlbGVhc2VkIGJ1aWxkIGV4dHJhY3RlZCBmcm9tIGEgc291cmNlIGFyY2hpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2JmeVZlcnNpb25MYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBOZWl0aGVyIHRoZSBpbnN0YWxsZWQgcGFja2FnZS5qc29uIG5vciB0aGUgZ2l0IHN0YXRlIG9mIHdiZnkncyBvd24gY2hlY2tvdXQgY2FuIGNoYW5nZVxuICAvLyBtaWQtcnVuLCBhbmQgY29tcHV0aW5nIHRoZSBsYWJlbCBzcGF3bnMgc2V2ZXJhbCBnaXQgc3VicHJvY2Vzc2VzLCBzbyBpdCBpcyBjb21wdXRlZCBvbmNlLlxuICBpZiAoIWhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsKSB7XG4gICAgY2FjaGVkVmVyc2lvbkxhYmVsID0gY29tcHV0ZVdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgICBoYXNDb21wdXRlZFZlcnNpb25MYWJlbCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25MYWJlbDtcbn1cblxubGV0IGhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsID0gZmFsc2U7XG5sZXQgY2FjaGVkVmVyc2lvbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGNvbXB1dGVXYmZ5VmVyc2lvbkxhYmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiwgZGlyUGF0aCB9ID0gcmVhZFdiZnlQYWNrYWdlSnNvbigpO1xuICBpZiAoIXZlcnNpb24uc3RhcnRzV2l0aCh1bnJlbGVhc2VkVmVyc2lvblByZWZpeCkpIHJldHVybiB2ZXJzaW9uO1xuXG4gIC8vIGdpdCByZXNvbHZlcyB0aGUgTkVBUkVTVCBlbmNsb3NpbmcgcmVwb3NpdG9yeSwgd2hpY2ggZm9yIGFuIHVucmVsZWFzZWQgYnVpbGQgcGxhY2VkIHVuZGVyIGFcbiAgLy8gdGFyZ2V0IHJlcG9zaXRvcnkgKG5vZGVfbW9kdWxlcywgb3IgYSB2ZW5kb3JlZC9leHRyYWN0ZWQgc291cmNlIHRyZWUpIGlzIHRoYXQgcmVwb3NpdG9yeSDigJQgaXRzXG4gIC8vIGNvbW1pdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHdiZnkgYnVpbGQgdGhhdCByYW4uIE9ubHkgd2JmeSdzIG93biBsb2NhdGlvbiBpbnNpZGUgaXRzIG93blxuICAvLyByZXBvc2l0b3J5IGlkZW50aWZpZXMgYSBnZW51aW5lIGNoZWNrb3V0LCBzbyBhbnl0aGluZyBlbHNlIGZhbGxzIGJhY2sgdG8gdGhlIHZlcnNpb24tbGVzcyBsYWJlbC5cbiAgY29uc3QgZ2l0Um9vdERpclBhdGggPSBydW5HaXQoWydyZXYtcGFyc2UnLCAnLS1zaG93LXRvcGxldmVsJ10sIGRpclBhdGgpO1xuICBpZiAoXG4gICAgIWdpdFJvb3REaXJQYXRoIHx8XG4gICAgcGF0aC5yZWxhdGl2ZShnaXRSb290RGlyUGF0aCwgZGlyUGF0aCkgIT09IHdiZnlEaXJQYXRoSW5SZXBvIHx8XG4gICAgIWlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGgpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgY29tbWl0SGFzaCA9IHJ1bkdpdChbJ3Jldi1wYXJzZScsICctLXNob3J0PTgnLCAnSEVBRCddLCBkaXJQYXRoKTtcbiAgaWYgKCFjb21taXRIYXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBUaGUgY29tbWl0IGFsb25lIHdvdWxkIG1pc2lkZW50aWZ5IGEgYnVpbGQgbWFkZSBmcm9tIGFuIGVkaXRlZCBjaGVja291dCwgc28gdW5jb21taXR0ZWQgY2hhbmdlc1xuICAvLyBhcmUgcmVwb3J0ZWQgdG9vIOKAlCBidXQgb25seSB1bmRlciBwYWNrYWdlcy8qL3NyYywgcGFja2FnZXMvKi9iaW4gYW5kIHBhY2thZ2VzLyovY29uZmlncywgdGhlXG4gIC8vIHNvdXJjZSwgZW50cnktcG9pbnQgd3JhcHBlciBhbmQgcG9saWN5IGZpbGVzIHdiZnkgYW5kIGl0cyB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IHJ1blxuICAvLyBmcm9tLiBFdmVyeXRoaW5nIHdiZnkgR0VORVJBVEVTIHdoZW4gaXQgdGFyZ2V0cyBpdHMgb3duIHJlcG9zaXRvcnkgbGl2ZXMgb3V0c2lkZSB0aG9zZSAodGhlXG4gIC8vIHJvb3QgUkVBRE1FIHRoaXMgbGFiZWwgZ29lcyBpbnRvLCBhbmQgZWFjaCBwYWNrYWdlJ3MgLmdpdGlnbm9yZSwgcGFja2FnZS5qc29uLCB0c2NvbmZpZywg4oCmKSwgc29cbiAgLy8gYSBmaXJzdCBydW4gY2Fubm90IG1ha2UgdGhlIG5leHQgb25lIHJlbGFiZWwgdGhlIGJhZGdlIGAtZGlydHktbG9jYWxgIGJ5IGl0c2VsZi5cbiAgLy8gTWFuaWZlc3RzIHN0YXkgb3V0IG9uIHB1cnBvc2UsIGV2ZW4gdGhvdWdoIGFuIGVkaXRlZCBgZXhwb3J0c2AgbWFwIGNhbiByZWRpcmVjdCB3aGljaCBjb2RlXG4gIC8vIGxvYWRzOiB3YmZ5IEdFTkVSQVRFUyBwYWNrYWdlLmpzb24sIHNvIGluY2x1ZGluZyBpdCB3b3VsZCBtYWtlIGV2ZXJ5IHJ1biByZXBvcnQgaXRzZWxmIGRpcnR5LlxuICAvLyBUaGUgbGFiZWwgaXMgYmVzdC1lZmZvcnQgYnVpbGQgcHJvdmVuYW5jZSwgbm90IGEgcmVwcm9kdWNpYmxlLWJ1aWxkIGF0dGVzdGF0aW9uLlxuICBjb25zdCBpc0RpcnR5ID0gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aCk7XG4gIGlmIChpc0RpcnR5ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc0RpcnR5KSByZXR1cm4gYCR7Y29tbWl0SGFzaH0tZGlydHktbG9jYWxgO1xuICAvLyBBbiB1bm1vZGlmaWVkIGNoZWNrb3V0IHNpdHRpbmcgb24gYSByZWxlYXNlIHRhZyBydW5zIGV4YWN0bHkgdGhlIGNvZGUgdGhhdCB3YXMgcHVibGlzaGVkIHVuZGVyXG4gIC8vIHRoYXQgdmVyc2lvbiwgc28gaXQgaXMgbGFiZWxlZCB3aXRoIHRoZSB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGNvbW1pdCB0aGF0IG9ubHkgd2JmeSBkZXZlbG9wZXJzXG4gIC8vIGNvdWxkIHJlc29sdmUgYmFjayB0byBvbmUuXG4gIHJldHVybiBmaW5kUmVsZWFzZWRWZXJzaW9uQXRIZWFkKG5hbWUsIGRpclBhdGgpID8/IGAke2NvbW1pdEhhc2h9LWxvY2FsYDtcbn1cblxuLyoqIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHRhZ3MgZWFjaCByZWxlYXNlIGA8cGFja2FnZSBuYW1lPkA8dmVyc2lvbj5gLiAqL1xuZnVuY3Rpb24gZmluZFJlbGVhc2VkVmVyc2lvbkF0SGVhZChwYWNrYWdlTmFtZTogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ1ByZWZpeCA9IGAke3BhY2thZ2VOYW1lfUBgO1xuICAvLyBBIGNvbW1pdCBjYXJyaWVzIGF0IG1vc3Qgb25lIHJlbGVhc2UgdGFnIHBlciBwYWNrYWdlLCBzbyB0aGUgZmlyc3QgbWF0Y2ggaXMgdGhlIG9ubHkgbWF0Y2guXG4gIHJldHVybiBydW5HaXQoWyd0YWcnLCAnLS1wb2ludHMtYXQnLCAnSEVBRCddLCBjd2QpXG4gICAgPy5zcGxpdCgnXFxuJylcbiAgICAuZmluZCgodGFnKSA9PiB0YWcuc3RhcnRzV2l0aCh0YWdQcmVmaXgpKVxuICAgID8uc2xpY2UodGFnUHJlZml4Lmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGlzV2JmeVJlcG9zaXRvcnkoZ2l0Um9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBFdmVyeSByZW1vdGUgY291bnRzLCBub3QganVzdCBgb3JpZ2luYDogYSBmb3JrIGNoZWNrb3V0IGNhcnJpZXMgdGhlIGNhbm9uaWNhbCByZXBvc2l0b3J5IGFzXG4gIC8vIGB1cHN0cmVhbWAsIGFuZCBpdCBpcyBzdGlsbCBhIGdlbnVpbmUgd2JmeSBjaGVja291dCB3aG9zZSBjb21taXQgaWRlbnRpZmllcyB0aGUgYnVpbGQuXG4gIGNvbnN0IHJlbW90ZVVybHMgPSBydW5HaXQoWydyZW1vdGUnLCAnLXYnXSwgZ2l0Um9vdERpclBhdGgpO1xuICByZXR1cm4gISFyZW1vdGVVcmxzPy5zcGxpdCgnXFxuJykuc29tZSgobGluZSkgPT4gaXNDYW5vbmljYWxSZW1vdGVVcmwobGluZS5zcGxpdCgvWyBcXHRdKy91KVsxXSA/PyAnJykpO1xufVxuXG5jb25zdCBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aCA9IC9eXFwvP1dpbGxCb29zdGVyXFwvc2hhcmVkKD86XFwuZ2l0KT8kL2l1O1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlbW90ZSBVUkwgcG9pbnRzIGF0IHdiZnkncyBvd24gcmVwb3NpdG9yeS4gVGhlIGhvc3QgaXMgY29tcGFyZWQgYWZ0ZXIgUEFSU0lORyByYXRoZXJcbiAqIHRoYW4gbWF0Y2hlZCBpbnNpZGUgdGhlIHN0cmluZzogYW55IHBhdHRlcm4gbG9vc2UgZW5vdWdoIHRvIGFjY2VwdCBldmVyeSBVUkwgZm9ybSBnaXQgc3VwcG9ydHNcbiAqIGFsc28gYWNjZXB0ZWQgYSBsb29rYWxpa2UgdGhhdCBtZXJlbHkgY29udGFpbnMgdGhlIGhvc3QsIHN1Y2ggYXNcbiAqIGBodHRwczovL2V2aWwuZXhhbXBsZS8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCwgbGV0dGluZyBhbiB1bnJlbGF0ZWQgY2hlY2tvdXQgY2xhaW0gdG9cbiAqIGJlIGEgZ2VudWluZSB3YmZ5IGJ1aWxkLlxuICovXG5mdW5jdGlvbiBpc0Nhbm9uaWNhbFJlbW90ZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBzY3Atc3R5bGUgKGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3Rlci9zaGFyZWQuZ2l0YCkgaXMgbm90IGEgVVJMLCBzbyBpdCBpcyBtYXRjaGVkIHNlcGFyYXRlbHkuXG4gIC8vIFRoZSBsb29rYWhlYWQga2VlcHMgYSBzY2hlbWUncyBgOi8vYCBmcm9tIGJlaW5nIHJlYWQgYXMgdGhlIGBob3N0OnBhdGhgIHNlcGFyYXRvci5cbiAgY29uc3Qgc2NwTWF0Y2ggPSAvXig/OlteQC9dK0ApPyhbXi86XSspOig/IVxcLykoLiopJC91LmV4ZWModXJsKTtcbiAgaWYgKHNjcE1hdGNoKSB7XG4gICAgcmV0dXJuIHNjcE1hdGNoWzFdIS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbScgJiYgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGgudGVzdChzY3BNYXRjaFsyXSEpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgeyBob3N0bmFtZSwgcGF0aG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nICYmIGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoLnRlc3QocGF0aG5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2l0RGlydHlTdGF0ZShnaXRSb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhcbiAgICAnZ2l0JyxcbiAgICBbXG4gICAgICAnc3RhdHVzJyxcbiAgICAgICctLXBvcmNlbGFpbicsXG4gICAgICAnLS11bnRyYWNrZWQtZmlsZXM9YWxsJyxcbiAgICAgICctLScsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9zcmMvKipgLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9LyovYmluLyoqYCxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL2NvbmZpZ3MvKipgLFxuICAgIF0sXG4gICAgeyBjd2Q6IGdpdFJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgcmV0dXJuIHByb2Muc3RhdHVzID09PSAwID8gISFwcm9jLnN0ZG91dC50cmltKCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1bkdpdChhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ2dpdCcsIGFyZ3MsIHsgY3dkLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH0pO1xuICByZXR1cm4gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xufVxuXG5sZXQgY2FjaGVkV2JmeVBhY2thZ2VKc29uOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJQYXRoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuLyoqIFJldHVybnMgd2JmeSdzIG93biBwYWNrYWdlIGRpcmVjdG9yeSwgd2hpY2ggYWxzbyBob2xkcyBpdHMgY29uZmlncyAoZS5nLiByZWxlYXNlQWdlR2F0ZS5qc29uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5RGlyUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFdiZnlQYWNrYWdlSnNvbigpLmRpclBhdGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRXYmZ5UGFja2FnZUpzb24oKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgZGlyUGF0aDogc3RyaW5nIH0ge1xuICBpZiAoY2FjaGVkV2JmeVBhY2thZ2VKc29uKSByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xuICAvLyBmaWxlVVJMVG9QYXRoLCBub3QgVVJMLnBhdGhuYW1lOiB0aGUgbGF0dGVyIGtlZXBzIHBlcmNlbnQtZW5jb2RpbmcsIHNvIGFuIGluc3RhbGxhdGlvbiBwYXRoXG4gIC8vIGNvbnRhaW5pbmcgZS5nLiBhIHNwYWNlIHdvdWxkIHJlc29sdmUgdG8gYSBub25leGlzdGVudCBkaXJlY3RvcnkgYW5kIHRoZSBzZWFyY2ggd291bGQgd2FsayB1cFxuICAvLyB0byBhbiB1bnJlbGF0ZWQgcGFja2FnZS5cbiAgbGV0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShkaXJQYXRoKTtcbiAgICAvLyBwYXRoLmRpcm5hbWUoJy8nKSA9PT0gJy8nLCBzbyB0aGUgc2VhcmNoIG11c3Qgc3RvcCBleHBsaWNpdGx5IGF0IHRoZSBmaWxlc3lzdGVtIHJvb3QuXG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHRocm93IG5ldyBFcnJvcihcIndiZnkncyBvd24gcGFja2FnZS5qc29uIGlzIG1pc3NpbmcuXCIpO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIGNhY2hlZFdiZnlQYWNrYWdlSnNvbiA9IHsgbmFtZTogcGFja2FnZUpzb24ubmFtZSwgdmVyc2lvbjogcGFja2FnZUpzb24udmVyc2lvbiwgZGlyUGF0aCB9O1xuICByZXR1cm4gY2FjaGVkV2JmeVBhY2thZ2VKc29uO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgTGFuZ3VhZ2UsIHR5cGUgTm9kZSwgUGFyc2VyIH0gZnJvbSAnd2ViLXRyZWUtc2l0dGVyJztcblxuaW1wb3J0IHsgZ2V0V2JmeURpclBhdGggfSBmcm9tICcuL3ZlcnNpb24uanMnO1xuXG4vLyB3YmZ5IG11c3QgcmVzb2x2ZSBiZWZvcmUgaXQgcmVmcmVzaGVzIGdsb2JhbCByZWxlYXNlLWFnZSBleGNsdXNpb25zLiBTaGlwIHRoZSBCYXNoIGdyYW1tYXJcbi8vIHdpdGggdGhlIHBhY2thZ2Ugc28gYSBuZXdseSBwdWJsaXNoZWQgZ3JhbW1hciByZWxlYXNlIGNhbm5vdCBibG9jayB0aGF0IGZpcnN0IGluc3RhbGxhdGlvbi5cbmF3YWl0IFBhcnNlci5pbml0KCk7XG5jb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKCk7XG5wYXJzZXIuc2V0TGFuZ3VhZ2UoYXdhaXQgTGFuZ3VhZ2UubG9hZChwYXRoLmpvaW4oZ2V0V2JmeURpclBhdGgoKSwgJ2NvbmZpZ3MnLCAndHJlZS1zaXR0ZXItYmFzaC53YXNtJykpKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB1bnF1b3RlZCB3b3JkcyAoY29tbWFuZCBuYW1lIGZpcnN0KSBvZiBldmVyeSBzaW1wbGUgY29tbWFuZCBpbiBhIEJhc2ggc2NyaXB0LCBpbmNsdWRpbmcgdGhvc2UgbmVzdGVkXG4gKiBpbiBzdWJzaGVsbHMsIGNvbXBvdW5kIHN0YXRlbWVudHMsIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbnMsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzY3JpcHQgZG9lcyBub3QgcGFyc2UuXG4gKiBDb21tZW50cyBhbmQgbGl0ZXJhbCBoZXJlZG9jIHRleHQgYXJlIG5vdCBjb21tYW5kcyAoY29tbWFuZCBzdWJzdGl0dXRpb25zIGluIGFuIHVucXVvdGVkIGhlcmVkb2MgYXJlKSwgYW5kIGZ1bmN0aW9uXG4gKiBib2RpZXMgYXJlIHNraXBwZWQgYmVjYXVzZSB0aGV5IHJ1biBvbmx5IHdoZW4gY2FsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTaGVsbENvbW1hbmRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW11bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJvb3ROb2RlID0gcGFyc2VyLnBhcnNlKHNjcmlwdCk/LnJvb3ROb2RlO1xuICBpZiAoIXJvb3ROb2RlIHx8IHJvb3ROb2RlLmhhc0Vycm9yKSByZXR1cm47XG4gIHJldHVybiByb290Tm9kZS5kZXNjZW5kYW50c09mVHlwZSgnY29tbWFuZCcpLmZsYXRNYXAoKGNvbW1hbmQpID0+IHtcbiAgICBjb25zdCBuYW1lID0gY29tbWFuZC5jaGlsZEZvckZpZWxkTmFtZSgnbmFtZScpO1xuICAgIGlmICghbmFtZSB8fCBpc0luRnVuY3Rpb25Cb2R5KGNvbW1hbmQpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtbbmFtZSwgLi4uY29tbWFuZC5jaGlsZHJlbkZvckZpZWxkTmFtZSgnYXJndW1lbnQnKV0ubWFwKCh3b3JkKSA9PiB1bnF1b3RlV29yZCh3b3JkKSldO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNJbkZ1bmN0aW9uQm9keShub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGFuY2VzdG9yID0gbm9kZS5wYXJlbnQ7IGFuY2VzdG9yOyBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudCkge1xuICAgIGlmIChhbmNlc3Rvci50eXBlID09PSAnZnVuY3Rpb25fZGVmaW5pdGlvbicpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdW5xdW90ZVdvcmQobm9kZTogTm9kZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSAnY29tbWFuZF9uYW1lJzoge1xuICAgICAgcmV0dXJuIG5vZGUuZmlyc3RDaGlsZCA/IHVucXVvdGVXb3JkKG5vZGUuZmlyc3RDaGlsZCkgOiBub2RlLnRleHQ7XG4gICAgfVxuICAgIGNhc2UgJ2NvbmNhdGVuYXRpb24nOiB7XG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB1bnF1b3RlV29yZChjaGlsZCkpLmpvaW4oJycpO1xuICAgIH1cbiAgICBjYXNlICdyYXdfc3RyaW5nJzoge1xuICAgICAgcmV0dXJuIG5vZGUudGV4dC5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgIHJldHVybiBub2RlLnRleHRcbiAgICAgICAgLnNsaWNlKDEsIC0xKVxuICAgICAgICAucmVwbGFjZUFsbCgnXFxcXFxcbicsICcnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFxcXChbJGBcIlxcXFxdKS9ndSwgJyQxJyk7XG4gICAgfVxuICAgIGNhc2UgJ3dvcmQnOiB7XG4gICAgICByZXR1cm4gbm9kZS50ZXh0LnJlcGxhY2VBbGwoJ1xcXFxcXG4nLCAnJykucmVwbGFjZUFsbCgvXFxcXCguKS9nc3UsICckMScpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICAvLyBFeHBhbnNpb25zIGFuZCBzdWJzdGl0dXRpb25zIGhhdmUgbm8gc3RhdGljIHZhbHVlOyB0aGVpciBzb3VyY2UgdGV4dCBuZXZlciBlcXVhbHMgYSBsaXRlcmFsIHdvcmQuXG4gICAgICByZXR1cm4gbm9kZS50ZXh0O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMganNZYW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgaXNNYXAsIGlzTm9kZSwgaXNTY2FsYXIsIGlzU2VxLCBQYWlyLCBwYXJzZURvY3VtZW50IH0gZnJvbSAneWFtbCc7XG5pbXBvcnQgdHlwZSB7IE5vZGUsIFlBTUxNYXAsIFlBTUxTZXEgfSBmcm9tICd5YW1sJztcblxuLyoqXG4gKiBTZXJpYWxpemVzIGB2YWx1ZWAgYXMgdGhlIFlBTUwgdGV4dCB0aGF0IHJlcGxhY2VzIGBvbGRDb250ZW50YC4gVGhlIG5vZGVzIG9mIGBvbGRDb250ZW50YCB0aGF0IGB2YWx1ZWAga2VlcHMga2VlcFxuICogdGhlaXIgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgYXMgd3JpdHRlbiAoZS5nLiBhIGJhcmUgYHdvcmtmbG93X2Rpc3BhdGNoOmApOyBuZXcgYW5kIGNoYW5nZWQgdmFsdWVzIGFyZSB3cml0dGVuIGFzXG4gKiBganMteWFtbGAgZHVtcHMgdGhlbSwgd2hpY2ggaXMgYWxzbyB0aGUgd2hvbGUgb3V0cHV0IHdoZW4gYG9sZENvbnRlbnRgIGlzIGFic2VudCBvciBub3QgYSBwYXJzYWJsZSBtYXBwaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHVtcFlhbWxPdmVyKG9sZENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IG9iamVjdCk6IHN0cmluZyB7XG4gIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBkdW1wWWFtbCh2YWx1ZSk7XG4gIGNvbnN0IGRvY3VtZW50ID0gcGFyc2VEb2N1bWVudChvbGRDb250ZW50KTtcbiAgaWYgKGRvY3VtZW50LmVycm9ycy5sZW5ndGggPiAwIHx8ICFpc01hcChkb2N1bWVudC5jb250ZW50cykpIHJldHVybiBkdW1wWWFtbCh2YWx1ZSk7XG5cbiAgdXBkYXRlTm9kZShkb2N1bWVudC5jb250ZW50cywgdmFsdWUsIG9sZENvbnRlbnQpO1xuICAvLyBGb2xkaW5nIGF0IGEgbGluZSB3aWR0aCB3b3VsZCBzcGxpdCBsb25nIHZhbHVlcyB0aGF0IGBqcy15YW1sYCB3cml0ZXMgb24gb25lIGxpbmUuXG4gIHJldHVybiBkb2N1bWVudC50b1N0cmluZyh7IGZsb3dDb2xsZWN0aW9uUGFkZGluZzogZmFsc2UsIGxpbmVXaWR0aDogMCB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTm9kZShub2RlOiB1bmtub3duLCB2YWx1ZTogdW5rbm93biwgc291cmNlOiBzdHJpbmcpOiBOb2RlIHtcbiAgaWYgKGlzTWFwKG5vZGUpICYmIGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgLy8ganMteWFtbCBvbWl0cyB1bmRlZmluZWQgcHJvcGVydGllcy5cbiAgICBub2RlLml0ZW1zID0gT2JqZWN0LmVudHJpZXModmFsdWUpXG4gICAgICAuZmlsdGVyKChbLCBpdGVtVmFsdWVdKSA9PiBpdGVtVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1WYWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgcGFpciA9IG5vZGUuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXNTY2FsYXIoaXRlbS5rZXkpICYmIFN0cmluZyhpdGVtLmtleS52YWx1ZSkgPT09IGtleSk7XG4gICAgICAgIGlmICghcGFpcikgcmV0dXJuIG5ldyBQYWlyKGNyZWF0ZU5vZGUoa2V5KSwgY3JlYXRlTm9kZShpdGVtVmFsdWUpKTtcbiAgICAgICAgbW92ZUlubGluZUNvbW1lbnRUb0tleShwYWlyLCBzb3VyY2UpO1xuICAgICAgICAvLyBPbmx5IGEgbWFwcGluZyB1bmRlciBhIGtleTogYHlhbWxgIHdvdWxkIHByaW50IHRoZSBjb21tZW50IG9mIGEgc2VxdWVuY2UgZW50cnkgYWZ0ZXIgaXRzIGAtIGAgaW5kaWNhdG9yLlxuICAgICAgICBpZiAoaXNNYXAocGFpci52YWx1ZSkpIG1vdmVMZWFkaW5nQ29tbWVudFRvRmlyc3RJdGVtKHBhaXIudmFsdWUsIHBhaXIudmFsdWUuaXRlbXNbMF0/LmtleSk7XG4gICAgICAgIHBhaXIudmFsdWUgPSB1cGRhdGVOb2RlKHBhaXIudmFsdWUsIGl0ZW1WYWx1ZSwgc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICB9KTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICBpZiAoaXNTZXEobm9kZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBvbGRJdGVtcyA9IG5vZGUuaXRlbXM7XG4gICAgbW92ZUxlYWRpbmdDb21tZW50VG9GaXJzdEl0ZW0obm9kZSwgaXNTY2FsYXIob2xkSXRlbXNbMF0pID8gb2xkSXRlbXNbMF0gOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHVudXNlZEl0ZW1zID0gbmV3IFNldChvbGRJdGVtcyk7XG4gICAgLy8gQSBzY2FsYXIgZW50cnkgaXMgaWRlbnRpZmllZCBieSBpdHMgdmFsdWUgYW5kIGEgbWFwcGluZyBlbnRyeSBieSBpdHMgcG9zaXRpb24sIHNvIHRoYXQgdGhlIGNvbW1lbnRzIG9mIGEgcmVtb3ZlZFxuICAgIC8vIHNjYWxhciBlbnRyeSBnbyB3aXRoIGl0IGluc3RlYWQgb2YgbGFuZGluZyBvbiB0aGUgZW50cnkgdGhhdCB0YWtlcyBpdHMgcG9zaXRpb24uXG4gICAgbm9kZS5pdGVtcyA9IHZhbHVlLm1hcCgoaXRlbVZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGlzUGxhaW5PYmplY3QoaXRlbVZhbHVlKSkge1xuICAgICAgICBjb25zdCBpdGVtID0gb2xkSXRlbXNbaW5kZXhdO1xuICAgICAgICByZXR1cm4gaXNNYXAoaXRlbSkgPyB1cGRhdGVOb2RlKGl0ZW0sIGl0ZW1WYWx1ZSwgc291cmNlKSA6IGNyZWF0ZU5vZGUoaXRlbVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhbWVTY2FsYXIgPSBvbGRJdGVtcy5maW5kKChpdGVtKSA9PiB1bnVzZWRJdGVtcy5oYXMoaXRlbSkgJiYgaXNTY2FsYXIoaXRlbSkgJiYgaXRlbS52YWx1ZSA9PT0gaXRlbVZhbHVlKTtcbiAgICAgIGlmICghc2FtZVNjYWxhcikgcmV0dXJuIGNyZWF0ZU5vZGUoaXRlbVZhbHVlKTtcbiAgICAgIHVudXNlZEl0ZW1zLmRlbGV0ZShzYW1lU2NhbGFyKTtcbiAgICAgIHJldHVybiBzYW1lU2NhbGFyO1xuICAgIH0pO1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIGlmIChpc1NjYWxhcihub2RlKSAmJiBub2RlLnZhbHVlID09PSB2YWx1ZSkgcmV0dXJuIG5vZGU7XG5cbiAgY29uc3QgbmV3Tm9kZSA9IGNyZWF0ZU5vZGUodmFsdWUpO1xuICBpZiAoaXNOb2RlKG5vZGUpKSB7XG4gICAgbmV3Tm9kZS5jb21tZW50QmVmb3JlID0gbm9kZS5jb21tZW50QmVmb3JlO1xuICAgIG5ld05vZGUuY29tbWVudCA9IG5vZGUuY29tbWVudDtcbiAgICBuZXdOb2RlLnNwYWNlQmVmb3JlID0gbm9kZS5zcGFjZUJlZm9yZTtcbiAgfVxuICByZXR1cm4gbmV3Tm9kZTtcbn1cblxuLyoqXG4gKiBgeWFtbGAgYXR0YWNoZXMgYSBjb21tZW50IHRoYXQgZm9sbG93cyBhIGtleSBvbiBpdHMgbGluZSB0byB0aGUga2V5J3MgbWFwcGluZyBvciBzZXF1ZW5jZSB2YWx1ZSwgdG9nZXRoZXIgd2l0aCB0aGVcbiAqIGNvbW1lbnRzIGFib3ZlIHRoZSB2YWx1ZSdzIGZpcnN0IGVudHJ5LlxuICovXG5mdW5jdGlvbiBtb3ZlSW5saW5lQ29tbWVudFRvS2V5KHsga2V5LCB2YWx1ZSB9OiBQYWlyLCBzb3VyY2U6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWlzTm9kZShrZXkpIHx8ICFrZXkucmFuZ2UgfHwgIShpc01hcCh2YWx1ZSkgfHwgaXNTZXEodmFsdWUpKSB8fCAhdmFsdWUuY29tbWVudEJlZm9yZSB8fCAhdmFsdWUucmFuZ2UpIHJldHVybjtcbiAgLy8gVGhlIHZhbHVlJ3MgYW5jaG9yIGFuZCB0YWcgcHJlY2VkZSB0aGUgY29tbWVudCBvbiB0aGUga2V5J3MgbGluZS5cbiAgaWYgKCEvXlsgXFx0XSo6KD86WyBcXHRdK1shJl1cXFMqKSpbIFxcdF0rIy91LnRlc3Qoc291cmNlLnNsaWNlKGtleS5yYW5nZVsxXSwgdmFsdWUucmFuZ2VbMF0pKSkgcmV0dXJuO1xuXG4gIGNvbnN0IFtpbmxpbmVDb21tZW50LCAuLi5jb21tZW50TGluZXNdID0gdmFsdWUuY29tbWVudEJlZm9yZS5zcGxpdCgnXFxuJyk7XG4gIGtleS5jb21tZW50ID0gaW5saW5lQ29tbWVudDtcbiAgdmFsdWUuY29tbWVudEJlZm9yZSA9IGNvbW1lbnRMaW5lcy5sZW5ndGggPiAwID8gY29tbWVudExpbmVzLmpvaW4oJ1xcbicpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGB5YW1sYCBhdHRhY2hlcyB0aGUgY29tbWVudCBhYm92ZSB0aGUgZmlyc3QgZW50cnkgb2YgYSBuZXN0ZWQgY29sbGVjdGlvbiB0byB0aGUgY29sbGVjdGlvbiwgd2hlcmUgaXQgd291bGQgc3RheSB3aGVuXG4gKiB0aGF0IGVudHJ5IGlzIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIG1vdmVMZWFkaW5nQ29tbWVudFRvRmlyc3RJdGVtKG5vZGU6IFlBTUxNYXAgfCBZQU1MU2VxLCB0YXJnZXQ6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKCFub2RlLmNvbW1lbnRCZWZvcmUgfHwgIWlzTm9kZSh0YXJnZXQpKSByZXR1cm47XG4gIHRhcmdldC5jb21tZW50QmVmb3JlID0gdGFyZ2V0LmNvbW1lbnRCZWZvcmUgPyBgJHtub2RlLmNvbW1lbnRCZWZvcmV9XFxuJHt0YXJnZXQuY29tbWVudEJlZm9yZX1gIDogbm9kZS5jb21tZW50QmVmb3JlO1xuICBub2RlLmNvbW1lbnRCZWZvcmUgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGUodmFsdWU6IHVua25vd24pOiBOb2RlIHtcbiAgY29uc3QgY29udGVudHMgPSBwYXJzZURvY3VtZW50KGR1bXBZYW1sKHZhbHVlKSkuY29udGVudHM7XG4gIGlmICghaXNOb2RlKGNvbnRlbnRzKSkgdGhyb3cgbmV3IEVycm9yKGBqcy15YW1sIGR1bXBlZCBubyBZQU1MIG5vZGUgZm9yICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfS5gKTtcbiAgcmV0dXJuIGNvbnRlbnRzO1xufVxuXG5mdW5jdGlvbiBkdW1wWWFtbCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBqc1lhbWwuZHVtcCh2YWx1ZSwgeyBsaW5lV2lkdGg6IC0xIH0pO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBydW5uZXJTY2hlbWEgPSB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSk7XG5jb25zdCB3b3JrZmxvd1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgam9iczogei5yZWNvcmQoXG4gICAgei5zdHJpbmcoKSxcbiAgICB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ3J1bnMtb24nOiBydW5uZXJTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgc3RyYXRlZ3k6IHoub2JqZWN0KHsgbWF0cml4OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkgfSkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAubnVsbGFibGUoKVxuICApLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8ICFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSByZXR1cm47XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5jYXRjaCgoZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgZm9yIChjb25zdCB7IG5hbWU6IGZpbGVOYW1lIH0gb2YgZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiAvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkpIHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHdvcmtmbG93U2NoZW1hLnBhcnNlKHlhbWwubG9hZChhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpKSk7XG4gICAgZm9yIChjb25zdCBbam9iTmFtZSwgam9iXSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvdy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2I/LlsncnVucy1vbiddKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IGpvYlsncnVucy1vbiddO1xuICAgICAgaWYgKGlzU2VsZkhvc3RlZChydW5uZXIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG1hdGNoID0gdHlwZW9mIHJ1bm5lciA9PT0gJ3N0cmluZycgJiYgL15cXCRcXHtcXHtcXHMqbWF0cml4XFwuKFxcdyspXFxzKlxcfVxcfSQvdS5leGVjKHJ1bm5lcik7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzOiB1bmtub3duW10gPSBbXTtcbiAgICAgIGlmIChtYXRjaCAmJiBqb2Iuc3RyYXRlZ3kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV0hO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBqb2Iuc3RyYXRlZ3kubWF0cml4O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB6LmFycmF5KHoudW5rbm93bigpKS5zYWZlUGFyc2UobWF0cml4W2tleV0pO1xuICAgICAgICBpZiAodmFsdWVzLnN1Y2Nlc3MpIGNhbmRpZGF0ZXMucHVzaCguLi52YWx1ZXMuZGF0YSk7XG4gICAgICAgIGNvbnN0IGluY2x1ZGUgPSB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSkuc2FmZVBhcnNlKG1hdHJpeC5pbmNsdWRlKTtcbiAgICAgICAgaWYgKGluY2x1ZGUuc3VjY2VzcylcbiAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goLi4uaW5jbHVkZS5kYXRhLm1hcCgocm93KSA9PiByb3dba2V5XSkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJ1bm5lcik7XG4gICAgICB9XG4gICAgICBjb25zdCBhbGxvd2VkID1cbiAgICAgICAgY2FuZGlkYXRlcy5sZW5ndGggPiAwICYmXG4gICAgICAgIGNhbmRpZGF0ZXMuZXZlcnkoXG4gICAgICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgICAgIGlzU2VsZkhvc3RlZChjYW5kaWRhdGUpIHx8XG4gICAgICAgICAgICAoY29uZmlnLnJlcG9zaXRvcnk/LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWI6d2lsbGJvb3N0ZXIvY2hlZXJsaW5ncycgJiZcbiAgICAgICAgICAgICAgZmlsZU5hbWUgPT09ICdidWlsZC1kZXNrdG9wLWFwcHMueW1sJyAmJlxuICAgICAgICAgICAgICBqb2JOYW1lID09PSAnYnVpbGQnICYmXG4gICAgICAgICAgICAgIGNhbmRpZGF0ZSA9PT0gJ3dpbmRvd3MtbGF0ZXN0JylcbiAgICAgICAgKTtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7ZmlsZU5hbWV9OiBqb2JzLiR7am9iTmFtZX0ucnVucy1vbiBtdXN0IHNlbGVjdCBzZWxmLWhvc3RlZCBydW5uZXJzIGluIGEgcHJpdmF0ZSByZXBvc2l0b3J5LiBGaXggdGhlIHdvcmtmbG93IGJlZm9yZSBydW5uaW5nIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlbGZIb3N0ZWQocnVubmVyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhYmVscyA9IHJ1bm5lclNjaGVtYS5zYWZlUGFyc2UocnVubmVyKTtcbiAgaWYgKCFsYWJlbHMuc3VjY2VzcykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheShsYWJlbHMuZGF0YSkpIHJldHVybiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKTtcbiAgcmV0dXJuIGxhYmVscy5kYXRhID09PSAnc2VsZi1ob3N0ZWQnO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcnVuQWxsSW5Qb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgcGFyc2VTaGVsbENvbW1hbmRzIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGxQYXJzZXIuanMnO1xuaW1wb3J0IHsgZHVtcFlhbWxPdmVyIH0gZnJvbSAnLi4vdXRpbHMveWFtbFV0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyB9IGZyb20gJy4vd29ya2Zsb3dSdW5uZXJQb2xpY3kuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xuICBxdWV1ZT86ICdzaW5nbGUnIHwgJ21heCc7XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgJ2luaGVyaXQnO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgICAgLy8gTGV0IG1haW50YWluZXJzIHJlLXJ1biB0aGUgdGVzdHMgYnkgaGFuZC5cbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgLy8gTm9uZSBvZiB0aGVzZSBtYXkgYmUgbmFycm93ZWQganVzdCBiZWNhdXNlIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IG5ldmVyIHB1c2hlczpcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHRoZSB0ZXN0IGpvYidzIHNraXAtZHVwbGljYXRlLWFjdGlvbnMgY2FsbCB3aXRoIGNhbmNlbF9vdGhlcnM6IHRydWUgKHRoZSByZXVzYWJsZVxuICAgICAgLy8gdGVzdCB3b3JrZmxvdyBkZWNsYXJlcyBubyBwZXJtaXNzaW9ucyBvZiBpdHMgb3duLCBzbyBpdHMgam9icyBydW4gb24gdGhpcyB0b2tlbilcbiAgICAgIGFjdGlvbnM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgYHNlbWFudGljLXJlbGVhc2UgLS1kcnktcnVuYCwgd2hpY2ggZG9lcyBhIGBnaXQgcHVzaCAtLWRyeS1ydW5gIHRvIHZlcmlmeSB3cml0ZVxuICAgICAgLy8gYWNjZXNzIGFuZCBhYm9ydHMgd2l0aCBFR0lUTk9QRVJNSVNTSU9OIHdpdGhvdXQgaXRcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHBrZy1wcmVmbGlnaHQgUFIgZmlsZSBsaXN0aW5nXG4gICAgICAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3Rlc3QtcnVzdCc6IHtcbiAgICBuYW1lOiAnVGVzdCBSdXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd0ZXN0LXJ1c3QnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC1ydXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gYHF1ZXVlOiBtYXhgIGhlcmUgdG9vICgjOTc0KTogR2l0SHViJ3MgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGNhbmNlbHMgYW4gYWxyZWFkeS1QRU5ESU5HXG4gICAgLy8gY2FsbGVyIHJ1biB3aGVuIGFub3RoZXIgb25lIHF1ZXVlcyDigJQgYmVmb3JlIGl0cyBqb2IgKGFuZCB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBvd25cbiAgICAvLyBqb2ItbGV2ZWwgYHF1ZXVlOiBtYXhgKSBldmVyIHN0YXJ0cyDigJQgc2lsZW50bHkgZHJvcHBpbmcgdGhhdCByZWxlYXNlIHRyaWdnZXIuXG4gICAgLy8gVGhlIGNhbGxlci1sZXZlbCBncm91cCBtdXN0IE5PVCByZXVzZSB0aGUgcmV1c2FibGUgd29ya2Zsb3cncyBqb2ItbGV2ZWwgZ3JvdXAgbmFtZVxuICAgIC8vIChgcmVsZWFzZS0ke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX1gKTogd29ya2Zsb3ctbGV2ZWwgYW5kIGpvYi1sZXZlbCBncm91cHMgc2hhcmUgb25lXG4gICAgLy8gcmVwb3NpdG9yeS13aWRlIG5hbWVzcGFjZSwgYW5kIGlkZW50aWNhbCBuYW1lcyBkZWFkbG9jayB0aGUgcnVuIChcIkNhbmNlbGluZyBzaW5jZSBhXG4gICAgLy8gZGVhZGxvY2sgZm9yIGNvbmN1cnJlbmN5IGdyb3VwIC4uLiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiAndG9wIGxldmVsIHdvcmtmbG93JyBhbmQgJzxqb2I+J1wiKS5cbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIHF1ZXVlOiAnbWF4JyxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbi8qKlxuICogUGFyc2VzIGEgYHVzZXM6YCB2YWx1ZSBjYWxsaW5nIG9uZSBvZiBXaWxsQm9vc3RlcidzIG93biByZXVzYWJsZSB3b3JrZmxvd3MgKG9yIHRoZVxuICogV2lsbEJvb3N0ZXJMYWIgc3luYyBtaXJyb3IpIGludG8gdGhlIHdvcmtmbG93IG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBhbmQgZ2l0IHJlZi4gT25seSB0aG9zZVxuICogZm9sbG93IHRoZSBjb250cmFjdCB3YmZ5IGVuZm9yY2VzIOKAlCBjYWxsZXJzIG9mIGFub3RoZXIgb3JnYW5pemF0aW9uJ3Mgc2FtZS1uYW1lZCByZXBvc2l0b3J5IGFyZVxuICogbGVmdCBhbG9uZS4gR2l0SHViIHRyZWF0cyBvd25lci9yZXBvc2l0b3J5IG5hbWVzIGNhc2UtaW5zZW5zaXRpdmVseSwgc28gdGhlIGNvbXBhcmlzb24gZG9lc1xuICogdG9vLCB3aGlsZSB0aGUgd29ya2Zsb3cgcGF0aCBhbmQgcmVmIHN0YXkgY2FzZS1zZW5zaXRpdmUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoXG4gIHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogeyB3b3JrZmxvd05hbWU6IHN0cmluZzsgZXh0ZW5zaW9uOiBzdHJpbmc7IHJlZjogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaCA9IC9eKFteL10rKVxcLyhbXi9dKylcXC9cXC5naXRodWJcXC93b3JrZmxvd3NcXC8oW14vQF0rPylcXC4oeWE/bWwpQCguKykkL3UuZXhlYyh1c2VzID8/ICcnKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3duZXIgPSBtYXRjaFsxXSEudG9Mb3dlckNhc2UoKTtcbiAgaWYgKChvd25lciAhPT0gJ3dpbGxib29zdGVyJyAmJiBvd25lciAhPT0gJ3dpbGxib29zdGVybGFiJykgfHwgbWF0Y2hbMl0hLnRvTG93ZXJDYXNlKCkgIT09ICdyZXVzYWJsZS13b3JrZmxvd3MnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4geyB3b3JrZmxvd05hbWU6IG1hdGNoWzNdISwgZXh0ZW5zaW9uOiBtYXRjaFs0XSEsIHJlZjogbWF0Y2hbNV0hIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHtcbiAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgd29ya2Zsb3cgZ2VuZXJhdGlvbiBiZWNhdXNlIHJlcG9zaXRvcnkgdmlzaWJpbGl0eSBpcyB1bmtub3duLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJiAoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgYXdhaXQgYXNzZXJ0UHJpdmF0ZVdvcmtmbG93UnVubmVycyhyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoKTtcbiAgfVxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2l0aCAuZ2l0aHViIG9yIC5naXRodWIvd29ya2Zsb3dzIHN5bWxpbmtlZCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCB3cml0ZVlhbWwncyBndWFyZHNcbiAgICAvLyBhbHJlYWR5IHJlZnVzZSB0aGUgd3JpdGVzLCBidXQgcmVhZGRpci9ybSBiZWxvdyB3b3VsZCBzdGlsbCBlbnVtZXJhdGUgYW5kIERFTEVURSBmaWxlc1xuICAgIC8vIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkg4oCUIHNvIHJlcXVpcmUgdGhlIGRpcmVjdG9yeSB0byByZXNvbHZlIGluc2lkZSBpdCBiZWZvcmUgYW55XG4gICAgLy8gdHJhdmVyc2FsLCBta2Rpciwgb3IgY2xlYW51cC5cbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgLy8gd2JmeSB3cml0ZXMgLnltbCB3b3JrZmxvd3MsIHNvIGVhY2gga2luZCBtYXBzIHRvIGl0cyAueW1sIGZpbGUuXG4gICAgY29uc3QgZmlsZU5hbWVzQnlLaW5kID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkgY29udGludWU7XG4gICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGVudHJ5Lm5hbWUuc2xpY2UoMCwgLScueW1sJy5sZW5ndGgpLCBlbnRyeS5uYW1lKTtcbiAgICB9XG4gICAgY29uc3QgbWFuZGF0b3J5S2luZHMgPSBbJ3Rlc3QnLCAnc2VtYW50aWMtcHInXTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCdyZWxlYXNlJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3Rlc3QtcnVzdCcpO1xuICAgIH1cbiAgICAvLyBBIHByZXZpb3VzIHJ1biBtYXkgaGF2ZSBtaXN0YWtlbiBhIGdpdGlnbm9yZWQgdGhpcmQtcGFydHkgY2hlY2tvdXQgZm9yIHJlcG9zaXRvcnkgUnVzdCBjb2RlLlxuICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBnZW5lcmF0ZWQtc3R5bGUgY2FsbGVyOiBhIHNhbWUtbmFtZWQgY3VzdG9tIHdvcmtmbG93IHdpdGggYW55IG90aGVyIGpvYiBzdGF5cy5cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHRlc3RSdXN0RmlsZU5hbWUgPSBmaWxlTmFtZXNCeUtpbmQuZ2V0KCd0ZXN0LXJ1c3QnKTtcbiAgICAgIGlmICh0ZXN0UnVzdEZpbGVOYW1lICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lLCAndGVzdC1ydXN0JykpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgndGVzdC1ydXN0Jyk7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjbG9zZUNvbW1lbnRGaWxlTmFtZSA9IGZpbGVOYW1lc0J5S2luZC5nZXQoJ2Nsb3NlLWNvbW1lbnQnKTtcbiAgICBpZiAoY2xvc2VDb21tZW50RmlsZU5hbWUgJiYgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93KHdvcmtmbG93c1BhdGgsIGNsb3NlQ29tbWVudEZpbGVOYW1lLCAnY2xvc2UtY29tbWVudCcpKSB7XG4gICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCdjbG9zZS1jb21tZW50Jyk7XG4gICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGNsb3NlQ29tbWVudEZpbGVOYW1lKSk7XG4gICAgfVxuICAgIGZpbGVOYW1lc0J5S2luZC5kZWxldGUoJ3diZnknKTtcbiAgICBmb3IgKGNvbnN0IGtpbmQgb2YgbWFuZGF0b3J5S2luZHMpIHtcbiAgICAgIGlmICghZmlsZU5hbWVzQnlLaW5kLmhhcyhraW5kKSkge1xuICAgICAgICBmaWxlTmFtZXNCeUtpbmQuc2V0KGtpbmQsIGAke2tpbmR9LnltbGApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmlsZU5hbWVzQnlLaW5kLmhhcygnc3luYycpKSB7XG4gICAgICAvLyBUaGUgc3luYyB3b3JrZmxvdydzIGdlbmVyYXRpb24gb3ducyB0aGUgZm9yY2Utc3luYyB3b3JrZmxvdywgc28gcHJvY2Vzc2luZyBpdCBhcyBhblxuICAgICAgLy8gaW5kZXBlbmRlbnQga2luZCB3b3VsZCByYWNlIGNvbmN1cnJlbnQgd3JpdGVzIG9uIHRoZSBzYW1lIHBhdGguXG4gICAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCdzeW5jLWZvcmNlJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFxuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBbLi4uZmlsZU5hbWVzQnlLaW5kXS5tYXAoXG4gICAgICAgIChba2luZCwgZmlsZU5hbWVdKSA9PlxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kIGFzIEtub3duS2luZCwgZmlsZU5hbWUpXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENhc2UtaW5zZW5zaXRpdmU6IEdpdEh1YiByZXBvc2l0b3J5IG5hbWVzIGFyZSwgYW5kIGEgcmVtb3RlIG1heSBzcGVsbCB0aGlzIG9uZSBhbnkgd2F5LiBHZXR0aW5nIGl0IHdyb25nXG4gIC8vIGxldHMgd2JmeSByZXdyaXRlIHRoZSByZXBvc2l0b3J5IHRoYXQgaG9zdHMgdGhlIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICByZXR1cm4gcmVwb3NpdG9yeT8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZXZlcnkgam9iIG9mIHRoZSB3b3JrZmxvdyBmaWxlIGNhbGxzIHRoZSBuYW1lZCBXaWxsQm9vc3RlciByZXVzYWJsZSB3b3JrZmxvdyAob3duZXJcbiAqIHJlc3RyaWN0ZWQgdmlhIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwpLiBVc2VkIHRvIGRlY2lkZSB3aGV0aGVyIHdiZnkgb3ducyBhIGZpbGUgZW5vdWdoIHRvXG4gKiBkZWxldGUgaXQ6IHVucGFyc2FibGUgZmlsZXMgYW5kIGZpbGVzIHdpdGggYW55IG90aGVyIGpvYiByZXR1cm4gZmFsc2Ug4oCUIGRlbGV0aW5nIGEgd2hvbGVcbiAqIHdvcmtmbG93IG9uIGEgbG9vc2UgbWF0Y2ggd291bGQgYmUgdG9vIGFnZ3Jlc3NpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCB3b3JrZmxvd05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKCcueW1sJykpIHJldHVybiBmYWxzZTtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBpc1RhcmdldENhbGwgPSAodXNlczogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgICB0eXBlb2YgdXNlcyA9PT0gJ3N0cmluZycgJiYgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSB3b3JrZmxvd05hbWU7XG4gIHRyeSB7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGpvYnMgPSBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpO1xuICAgICAgcmV0dXJuIGpvYnMubGVuZ3RoID4gMCAmJiBqb2JzLmV2ZXJ5KChqb2IpID0+IGlzVGFyZ2V0Q2FsbChqb2I/LnVzZXMpKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIFVucGFyc2FibGUgY29udGVudCBpcyBub3QgcHJvdmFibHkgYSBjYWxsZXIgb2YgdGhlIG5hbWVkIHdvcmtmbG93LlxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgd29ya2Zsb3dzUGF0aDogc3RyaW5nLFxuICBraW5kOiBLbm93bktpbmQsXG4gIGZpbGVOYW1lID0gYCR7a2luZH0ueW1sYFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKVxuICAgID8gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCdcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBBIG5vbi1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbCBpbiBhIHJlcG8gd2l0aG91dCBSdXN0IGNvZGUgbWVyZWx5IHNoYXJlcyB0aGUgbmFtZTsgbGVhdmUgaXQgYWxvbmUuXG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0JyAmJiBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFdvcmtmbG93O1xuICAgIHRyeSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHdvcmtmbG93IHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlIHRlbXBsYXRlXG4gICAgICAvLyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcmVwb3NpdG9yeSdzIHdvcmtmbG93LlxuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgWUFNTC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8geWFtbC5sb2FkIHJldHVybnMgdW5kZWZpbmVkIGZvciBlbXB0eS9jb21tZW50LW9ubHkgZmlsZXMgYW5kIG5vbi1vYmplY3RzIGZvciBzY2FsYXJcbiAgICAvLyBkb2N1bWVudHMgd2l0aG91dCB0aHJvd2luZzsgZGVlcG1lcmdlIHdvdWxkIGNyYXNoIG9uIHRoZW0uXG4gICAgaWYgKHR5cGVvZiBvbGRTZXR0aW5ncyAhPT0gJ29iamVjdCcgfHwgb2xkU2V0dGluZ3MgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IGEgd29ya2Zsb3cuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nSm9iID0gb2xkU2V0dGluZ3Muam9icz8uW2tpbmRdO1xuICAgIGlmIChuZXdTZXR0aW5ncy5qb2JzPy5ba2luZF0/LnVzZXMgJiYgZXhpc3RpbmdKb2IgJiYgIXBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwoZXhpc3RpbmdKb2IudXNlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfVxuXG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICAvLyBVbmxpa2UgdGhlIHJlbGVhc2UgY2FsbGVyLCB0aGUgZGVmYXVsdCBxdWV1ZSAoYHNpbmdsZWApIGlzIGludGVudGlvbmFsIGhlcmU6IGEgcGVuZGluZ1xuICAgICAgLy8gZGVwbG95IHRoYXQgaXMgY2FuY2VsbGVkIGFuZCByZXBsYWNlZCBieSBhIG5ld2VyIG9uZSBsb3NlcyBub3RoaW5nIOKAlCB0aGUgbmV3ZXIgZGVwbG95XG4gICAgICAvLyBjb252ZXJnZXMgdGhlIGVudmlyb25tZW50IHRvIHRoZSBsYXRlc3Qgc3RhdGUgYW55d2F5LlxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZSkge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWU7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgZW1wdHkgam9icyAoYSBiYXJlIGBqb2JOYW1lOmAgcGFyc2VzIGFzIG51bGwpLCBub24tcmV1c2FibGUgd29ya2Zsb3dzLCBhbmQgb3RoZXJcbiAgICAvLyBvcmdhbml6YXRpb25zJyByZXVzYWJsZSB3b3JrZmxvd3M6IGEgc2FtZS1uYW1lZCBgcmV1c2FibGUtd29ya2Zsb3dzYCByZXBvc2l0b3J5IGVsc2V3aGVyZVxuICAgIC8vIGZvbGxvd3MgYSBkaWZmZXJlbnQgY29udHJhY3QsIGFuZCBub3JtYWxpemluZyBpdHMgY2FsbGVycyAoc2VjcmV0IGluamVjdGlvbi9yZW1vdmFsLFxuICAgIC8vIHBlcm1pc3Npb25zKSBjb3VsZCBicmVhayB0aGVtLlxuICAgIGlmICgham9iIHx8ICFwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICAvLyBEZXBsb3kgY2FsbGVycyBuZWVkIG5vIHJlcG9zaXRvcnkgd3JpdGVzOiB0aGUgY2FsbGVkIHJldXNhYmxlIHdvcmtmbG93IGluaGVyaXRzIHRoZSBjYWxsZXInc1xuICAvLyB0b2tlbiBwZXJtaXNzaW9ucywgcmVwb3NpdG9yaWVzIGRlZmF1bHQgdGhlIHRva2VuIHRvIHdyaXRlLCBhbmQgdGhlIHJldXNhYmxlIGRlcGxveSB3b3JrZmxvd1xuICAvLyBhdCBtYWluIHBlcmZvcm1zIG5vIEdJVEhVQl9UT0tFTiB3cml0ZXMuIFRoZSByZWFkLW9ubHkgZGVmYXVsdCBpcyBpbmplY3RlZCBhdCB0aGUgSk9CIGxldmVsXG4gIC8vIChqb2IgcGVybWlzc2lvbnMgZG8gbm90IGFmZmVjdCBzaWJsaW5nIGpvYnMsIHNvIGlubGluZSBqb2JzIG9yIHBpbm5lZCBjYWxsZWVzIOKAlCB3aG9zZSB3cml0ZVxuICAvLyBuZWVkcyBhcmUgdW5hdWRpdGVkIOKAlCBrZWVwIHRoZWlycyksIGFuZCBvbmx5IHdoZW4gbmVpdGhlciB0aGUgd29ya2Zsb3cgbm9yIHRoZSBqb2IgZGVjbGFyZXNcbiAgLy8gaXRzIG93biBwZXJtaXNzaW9ucyAoT0lEQyBkZXBsb3lzIGFsd2F5cyBkbywgZm9yIGlkLXRva2VuKS4gcnVuLXNjcmlwdCBjYWxsZXJzIGFyZSBleGNsdWRlZFxuICAvLyBiZWNhdXNlIGFyYml0cmFyeSBwYWNrYWdlIHNjcmlwdHMgbWF5IHB1c2ggY29tbWl0cy5cbiAgaWYgKCFuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAgIGlmICgham9iKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgICAgIGlmICgham9iLnBlcm1pc3Npb25zICYmIGNhbGw/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveScgJiYgY2FsbC5yZWYgPT09ICdtYWluJykge1xuICAgICAgICBqb2IucGVybWlzc2lvbnMgPSB7IGNvbnRlbnRzOiAncmVhZCcgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOlxuICAgIGNhc2UgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93IGJhc2VkIG9uIHRoZSBzeW5jIHdvcmtmbG93IGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbi8vIHdiJ3MgZ2xvYmFsIG9wdGlvbnMgdGhhdCBjb25zdW1lIGEgZm9sbG93aW5nIHZhbHVlIHRva2VuIChmcm9tIHNoYXJlZE9wdGlvbnNCdWlsZGVyIHBsdXNcbi8vIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpOyBldmVyeSBvdGhlciBgLWAtcHJlZml4ZWQgdG9rZW4gYmVmb3JlIHRoZSBzdWJjb21tYW5kIGlzIGEgYm9vbGVhbi5cbmNvbnN0IHdiR2xvYmFsVmFsdWVPcHRpb25zID0gbmV3IFNldChbJy0td29ya2luZy1kaXInLCAnLXcnLCAnLS1lbnYnLCAnLS1jYXNjYWRlLWVudiddKTtcblxuLy8gU3ViY29tbWFuZHMgdGhhdCBydW4gYSBCSU5BUlkgKHNvIHRoZSBmb2xsb3dpbmcgdG9rZW4gY2FuIGJlIHRoZSB3YiBleGVjdXRhYmxlKSwgcGVyIHJ1bm5lcjogYnVuXG4vLyByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGEgcGFja2FnZSBzY3JpcHQgb2YgdGhhdCBuYW1lKSwgbnBtIGhhcyBgZXhlY2AvYHhgLFxuLy8gYW5kIHBucG0veWFybiAoQmVycnkpIGhhdmUgYGV4ZWNgL2BkbHhgLlxuY29uc3QgcnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSB7XG4gIG5wbTogbmV3IFNldChbJ2V4ZWMnLCAneCddKSxcbiAgcG5wbTogbmV3IFNldChbJ2V4ZWMnLCAnZGx4J10pLFxuICB5YXJuOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIGJ1bjogbmV3IFNldChbJ3gnXSksXG59O1xuXG4vLyBSdW5uZXIgb3B0aW9ucyB0aGF0IGNvbnN1bWUgdGhlIEZPTExPV0lORyB0b2tlbiBhcyB0aGVpciB2YWx1ZSwgc28gaXQgaXMgbm90IHRoZSB3YiBleGVjdXRhYmxlXG4vLyAoZS5nLiBgYnVuIC0tY3dkIGRpciB3YiBkZXBsb3lgLCBgbnB4IC1wIHBrZyB3YiBkZXBsb3lgKS4gQSBjb25zZXJ2YXRpdmUgc3VwZXJzZXQgYWNyb3NzXG4vLyBucG0vcG5wbS95YXJuL2J1biBhbmQgdGhlIG5weC9idW54IHBhY2thZ2UgZXhlY3V0b3JzLlxuY29uc3QgcnVubmVyVmFsdWVPcHRpb25zID0gbmV3IFNldChbXG4gICctLWN3ZCcsXG4gICctQycsXG4gICctLXByZWZpeCcsXG4gICctLWZpbHRlcicsXG4gICctRicsXG4gICctLXdvcmtzcGFjZScsXG4gICctdycsXG4gICctLWRpcicsXG4gICctcCcsXG4gICctLXBhY2thZ2UnLFxuICAnLWMnLFxuICAnLS1jYWxsJyxcbl0pO1xuXG4vKiogQWR2YW5jZSBwYXN0IGEgcnVubmVyJ3Mgb3B0aW9ucywgY29uc3VtaW5nIGEgc2VwYXJhdGUgdmFsdWUgdG9rZW4gd2hlcmUgb25lIGFwcGxpZXMuICovXG5mdW5jdGlvbiBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnM6IHN0cmluZ1tdLCBzdGFydEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBzdGFydEluZGV4O1xuICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb25zdCBvcHRpb24gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCFvcHRpb24uaW5jbHVkZXMoJz0nKSAmJiBydW5uZXJWYWx1ZU9wdGlvbnMuaGFzKG9wdGlvbikgJiYgaW5kZXggPCB0b2tlbnMubGVuZ3RoKSBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVwbG95IHNjcmlwdCBpbnZva2VzIGB3YiDigKYgZGVwbG95YCBhdCBjb21tYW5kIHBvc2l0aW9uLiBQYWNrYWdlIHJ1bm5lcnMgYW5kIGdsb2JhbCB5YXJncyBvcHRpb25zXG4gKiAod2l0aCB0aGVpciB2YWx1ZSB0b2tlbnMpIG1heSBwcmVjZWRlIHRoZSBkZXBsb3kgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQ6IHN0cmluZywgc2NyaXB0TmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0b2tlbnMgb2YgcGFyc2VTaGVsbENvbW1hbmRzKGRlcGxveVNjcmlwdCkgPz8gW10pIHtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIC8vIExlYWRpbmcgbGF1bmNoZXJzIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6IGBlbnZgICh3aXRoIG9wdGlvbnMgKyBLRVk9dmFsdWUgYXNzaWdubWVudHMpXG4gICAgLy8gYW5kIHRoZSBQT1NJWCBgY29tbWFuZGAgYnVpbHRpbiAod2l0aCBpdHMgYC1wYC9gLXZgL2AtVmAgb3B0aW9ucykuIFRoZSBncmFtbWFyIHBhcnNlcyB0aGVcbiAgICAvLyBgdGltZWAga2V5d29yZCBhcyBhIHdyYXBwZXIsIHNvIGB0aW1lIHdiIGRlcGxveWAgYWxyZWFkeSB5aWVsZHMgYHdiYCBmaXJzdC4gT3RoZXIgbGF1bmNoZXJzXG4gICAgLy8gKGBleGVjYCwgYG5pY2VgLCDigKYpIGFyZSBOT1QgbW9kZWxlZDogdGhleSBsZWF2ZSBhIG5vbi1gd2JgIGZpcnN0IHRva2VuLCBzbyB0aGUgY29tbWFuZCBzaW1wbHlcbiAgICAvLyBkb2VzIG5vdCBtYXRjaC4gVGhpcyBpcyBhIGRlbGliZXJhdGUgZmFsc2UtbmVnYXRpdmUgZm9yIGdlbmVyYXRlZCBndWlkYW5jZS5cbiAgICBpZiAodG9rZW5zW2luZGV4XSA9PT0gJ2VudicpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgICAgaWYgKC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKj0vdS50ZXN0KHRva2VuKSkgaW5kZXgrKztcbiAgICAgICAgLy8gZW52J3MgZGlyZWN0b3J5IHZhbHVlIG1heSBiZSBzZXBhcmF0ZSBvciBhdHRhY2hlZCAoYC1DZGlyYCwgYC0tY2hkaXI9ZGlyYCkuIEl0IGNoYW5nZXNcbiAgICAgICAgLy8gd2hlcmUgd2IgcnVucyBidXQgbm90IHdoZXRoZXIgdGhlIGNvbW1hbmQgaW52b2tlcyB3YiBkZXBsb3kuXG4gICAgICAgIGVsc2UgaWYgKHRva2VuID09PSAnLUMnIHx8IHRva2VuID09PSAnLS1jaGRpcicpIGluZGV4ICs9IDI7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJy1DJykgfHwgdG9rZW4uc3RhcnRzV2l0aCgnLS1jaGRpcj0nKSkgaW5kZXgrKztcbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctdScpIGluZGV4ICs9IDI7XG4gICAgICAgIGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJy0nKSkgaW5kZXgrKztcbiAgICAgICAgZWxzZSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYGNvbW1hbmQgQ01EYCBleGVjdXRlcyBDTUQsIGJ1dCBgY29tbWFuZCAtdmAvYC1WIENNRGAgb25seSBRVUVSWSBpdHMgYXZhaWxhYmlsaXR5IHdpdGhvdXRcbiAgICAvLyBydW5uaW5nIGl0LCBzbyBhIGRlcGxveSBiZWhpbmQgdGhlbSBkb2VzIG5vdCBydW4uIFRoZSBgdmAvYFZgIGZsYWcgbWF5IGJlIGNsdXN0ZXJlZCB3aXRoXG4gICAgLy8gb3RoZXIgb3B0aW9uIGxldHRlcnMgKGBjb21tYW5kIC1wdiB3YmApLCBzbyBtYXRjaCBhbnkgb3B0aW9uIGxldHRlciBjbHVzdGVyIGNvbnRhaW5pbmcgaXQuXG4gICAgd2hpbGUgKHRva2Vuc1tpbmRleF0gPT09ICdjb21tYW5kJykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIGxldCBxdWVyaWVzT25seSA9IGZhbHNlO1xuICAgICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAodG9rZW5zW2luZGV4XSA/PyAnJykuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIGlmICgvXi1bQS1aYS16XSpbdlZdW0EtWmEtel0qJC91LnRlc3QodG9rZW5zW2luZGV4XSA/PyAnJykpIHF1ZXJpZXNPbmx5ID0gdHJ1ZTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChxdWVyaWVzT25seSkge1xuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4IDwgMCkgY29udGludWU7XG4gICAgLy8gUmVzb2x2ZSBhIHJ1bm5lciBwcmVmaXggdG8gd2hldGhlciB0aGUgZm9sbG93aW5nIHRva2VuIGlzIGEgQklOQVJZICh0aGUgd2IgZXhlY3V0YWJsZSkgb3IgYVxuICAgIC8vIHBhY2thZ2UgU0NSSVBUIG5hbWUuIGBidW54YC9gbnB4YCBhbmQgYDxwbT4geHxkbHh8ZXhlY2AgcnVuIGEgYmluYXJ5OyBgPHBtPiBydW58cnVuLXNjcmlwdGBcbiAgICAvLyAoYW5kIGJhcmUgYG5wbSA8bmFtZT5gLCBvciBhbnkgcnVubmVyIGZvbGxvd2VkIGJ5IGAtLWApIHJ1biBhIHBhY2thZ2Ugc2NyaXB0IOKAlCBzb1xuICAgIC8vIGBucG0gcnVuIHdiIGRlcGxveWAgZXhlY3V0ZXMgdGhlIHNjcmlwdCBuYW1lZCBgd2JgLCBub3QgdGhlIHdiIGJpbmFyeSwgYW5kIG11c3QgYmUgcmVqZWN0ZWQuXG4gICAgaWYgKFsnbnBtJywgJ3BucG0nLCAneWFybicsICdidW4nXS5pbmNsdWRlcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgY29uc3QgcnVubmVyID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGluZGV4ID0gc2tpcFJ1bm5lck9wdGlvbnModG9rZW5zLCBpbmRleCArIDEpO1xuICAgICAgY29uc3Qgc3ViY29tbWFuZCA9IHRva2Vuc1tpbmRleF0gPz8gJyc7XG4gICAgICBpZiAoWydydW4nLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKHN1YmNvbW1hbmQpKSBjb250aW51ZTsgLy8gcnVucyBhIHBhY2thZ2Ugc2NyaXB0LCBub3Qgd2JcbiAgICAgIC8vIEV4ZWN1dG9yIHN1YmNvbW1hbmRzIGFyZSBydW5uZXItU1BFQ0lGSUM6IGJ1biByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGFcbiAgICAgIC8vIHBhY2thZ2Ugc2NyaXB0IG5hbWVkIGRseC9leGVjKS4gUmVhbCBidWlsdC1pbiBleGVjdXRvcnMgKGBleGVjYC9geGAsIGFuZCBgZGx4YCBmb3IgcG5wbSlcbiAgICAgIC8vIHRha2UgcHJlY2VkZW5jZSBvdmVyIGEgc2FtZS1uYW1lZCBzY3JpcHQsIHNvIHRoZXkgYXJlIE5PVCBzaGFkb3ctY2hlY2tlZC4gT25seSBgeWFybiBkbHhgIGlzXG4gICAgICAvLyBhbWJpZ3VvdXMg4oCUIGEgQmVycnkgYnVpbHQtaW4gYnV0IGEgcGFja2FnZSBTQ1JJUFQgaW4gWWFybiBDbGFzc2ljIOKAlCBzbyBhIGRlY2xhcmVkIGBkbHhgXG4gICAgICAvLyBzY3JpcHQgbWFrZXMgYHlhcm4gZGx4YCBkZWNsaW5lIChmYWxsIHRocm91Z2ggdG8gdGhlIHBhY2thZ2Utc2NyaXB0IGNoZWNrcykuXG4gICAgICBjb25zdCBpc1lhcm5EbHhTaGFkb3dlZEJ5U2NyaXB0ID0gcnVubmVyID09PSAneWFybicgJiYgc3ViY29tbWFuZCA9PT0gJ2RseCcgJiYgc2NyaXB0TmFtZXMuaGFzKCdkbHgnKTtcbiAgICAgIGlmIChydW5uZXJFeGVjdXRvclN1YmNvbW1hbmRzQnlSdW5uZXJbcnVubmVyXT8uaGFzKHN1YmNvbW1hbmQpICYmICFpc1lhcm5EbHhTaGFkb3dlZEJ5U2NyaXB0KSB7XG4gICAgICAgIGluZGV4Kys7IC8vIGJpbmFyeSBydW5uZXIgKHBucG0gZGx4LCBidW4geCwgYG5wbSBleGVjIC0tIHdiIOKApmApXG4gICAgICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnLS0nKSBpbmRleCsrOyAvLyB0aGUgZXhlY3V0b3IncyBvcHRpb25hbCBgLS1gIGJlZm9yZSB0aGUgY29tbWFuZFxuICAgICAgfSBlbHNlIGlmIChydW5uZXIgPT09ICducG0nKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBiYXJlIGBucG0gd2JgIG5ldmVyIHJ1bnMgYSBiaW5hcnlcbiAgICAgIH0gZWxzZSBpZiAodG9rZW5zW2luZGV4XSA9PT0gJ3diJyAmJiBzY3JpcHROYW1lcy5oYXMoJ3diJykpIHtcbiAgICAgICAgLy8gQmFyZSBgYnVuL3BucG0veWFybiB3YmAgcnVucyBhIHBhY2thZ2UgU0NSSVBUIG5hbWVkIGB3YmAgd2hlbiBvbmUgZXhpc3RzIChwYXNzaW5nIGBkZXBsb3lgXG4gICAgICAgIC8vIGFzIGl0cyBhcmd1bWVudCksIG5vdCB0aGUgd2IgYmluYXJ5LlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFsnYnVueCcsICducHgnXS5pbmNsdWRlcyh0b2tlbnNbaW5kZXhdID8/ICcnKSkge1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgfVxuICAgIGlmICh0b2tlbnNbaW5kZXhdICE9PSAnd2InKSBjb250aW51ZTtcbiAgICBjb25zdCB3YkFyZ3MgPSB0b2tlbnMuc2xpY2UoaW5kZXggKyAxKTtcbiAgICAvLyBTa2lwIGdsb2JhbCBvcHRpb25zIChhbmQgYW55IHZhbHVlIHRva2VuIGEgdmFsdWUtYmVhcmluZyBvcHRpb24gY29uc3VtZXMpIHNvIHRoZSBGSVJTVFxuICAgIC8vIGNvbW1hbmQgdG9rZW4gZGVjaWRlczogYHdiIC0tY2FzY2FkZS1lbnYgcHJvZHVjdGlvbiBkZXBsb3lgIGFuZCBgd2IgLXcgcGFja2FnZXMvYXBpIGRlcGxveWBcbiAgICAvLyBtYXRjaCwgd2hpbGUgc3ViY29tbWFuZHMgb3duaW5nIHRoZWlyIG93biBgZGVwbG95YCAoYHdiIHByaXNtYSBkZXBsb3lgLCBgd2IgcmV0cnkgZGVwbG95YClcbiAgICAvLyBkbyBub3QuIGAtLW9wdD12YWx1ZWAgY2FycmllcyBpdHMgdmFsdWUgaW5saW5lLCBzbyBvbmx5IHRoZSBzcGFjZS1zZXBhcmF0ZWQgZm9ybSBza2lwcyBvbmUuXG4gICAgbGV0IGNvbW1hbmRJbmRleCA9IDA7XG4gICAgd2hpbGUgKGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGggJiYgKHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgIGNvbnN0IGZsYWcgPSB3YkFyZ3NbY29tbWFuZEluZGV4XSA/PyAnJztcbiAgICAgIGNvbW1hbmRJbmRleCsrO1xuICAgICAgaWYgKHdiR2xvYmFsVmFsdWVPcHRpb25zLmhhcyhmbGFnKSAmJiBjb21tYW5kSW5kZXggPCB3YkFyZ3MubGVuZ3RoKSBjb21tYW5kSW5kZXgrKztcbiAgICB9XG4gICAgaWYgKHdiQXJnc1tjb21tYW5kSW5kZXhdICE9PSAnZGVwbG95JykgY29udGludWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHdvcmtmbG93cyBkaXJlY3RvcnkgaG9sZHMgYSBsaXZlIGNhbGxlciBvZiB0aGUgcmV1c2FibGUgQ2xvdWRmbGFyZSBkZXBsb3kgd29ya2Zsb3cuXG4gKiBZQU1MIGlzIHBhcnNlZCBhbmQgb25seSBgam9icy4qLnVzZXNgIHZhbHVlcyBhcmUgaW5zcGVjdGVkIChhIHJhdy10ZXh0IHNlYXJjaCB3b3VsZCBtYXRjaFxuICogY29tbWVudHMgb3IgYHJ1bjpgIHN0cmluZ3MpLCB3aXRoIGEgYGRlcGxveSpgLWZpbGVuYW1lIHNob3J0Y3V0IGFuZCBhIGNvbnNlcnZhdGl2ZSByYXctdGV4dFxuICogZmFsbGJhY2sgZm9yIHVucGFyc2VhYmxlIGZpbGVzLiBVc2VkIGJ5IHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBnZW5lcmF0b3Igc28gZ2VuZXJhdGVkIGd1aWRhbmNlXG4gKiBkZXNjcmliZXMgb25seSB3b3JrZmxvd3MgdGhhdCBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdyh3b3JrZmxvd3NEaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICB0cnkge1xuICAgIGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG93bmVyL3JlcG9zaXRvcnkgKEdpdEh1YiB0cmVhdHMgdGhlbSBzbyksIGNhc2Utc2Vuc2l0aXZlIHBhdGgvcmVmIOKAlCBtYXRjaGluZ1xuICAvLyBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsLCB1c2VkIGZvciB0aGUgdW5wYXJzZWFibGUtWUFNTCByYXctdGV4dCBmYWxsYmFjayBvbmx5LlxuICBjb25zdCBkZXBsb3lDYWxsUGF0dGVybiA9IC9bXi9dK1xcL3JldXNhYmxlLXdvcmtmbG93c1xcL1xcLmdpdGh1YlxcL3dvcmtmbG93c1xcL2RlcGxveVxcLnlhP21sQC9pdTtcbiAgY29uc3QgY2FsbHNEZXBsb3lXb3JrZmxvdyA9ICh1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gICAgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSAnZGVwbG95JztcbiAgcmV0dXJuIGVudHJpZXMuc29tZSgoZW50cnkpID0+IHtcbiAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICEvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NEaXJQYXRoLCBlbnRyeS5uYW1lKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtmbG93ID0geWFtbC5sb2FkKGNvbnRlbnQpIGFzIFdvcmtmbG93IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMod29ya2Zsb3cuam9icykuc29tZSgoam9iKSA9PiBjYWxsc0RlcGxveVdvcmtmbG93KGpvYj8udXNlcykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGRlcGxveUNhbGxQYXR0ZXJuLnRlc3QoY29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gVGhlIHJldXNhYmxlIHdvcmtmbG93cyB0aGF0IGRlY2xhcmUgRk5PWF9BR0VfS0VZIGFuZCBWRVJEQUNDSU9fVE9LRU4gdW5kZXJcbi8vIG9uLndvcmtmbG93X2NhbGwuc2VjcmV0cyAoc2VlIFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cykuIFBhc3NpbmcgZWl0aGVyIHNlY3JldCB0byBhbnlcbi8vIG90aGVyIGNhbGxlZSBpcyBhIEdpdEh1YiBlcnJvci5cbmNvbnN0IGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MgPSBuZXcgU2V0KFsnZGVwbG95JywgJ3JlbGVhc2UnLCAncnVuLXNjcmlwdCcsICd0ZXN0J10pO1xuY29uc3QgcmV1c2FibGVXb3JrZmxvd1Blcm1pc3Npb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgLy8gc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyByZWFkcyB3b3JrZmxvdyBydW5zOyBjYW5jZWxfb3RoZXJzIGlzIGZhbHNlLCBzbyByZWFkIGlzIGVub3VnaC5cbiAgJ3Rlc3QtcnVzdCc6IHsgYWN0aW9uczogJ3JlYWQnLCBjb250ZW50czogJ3JlYWQnIH0sXG4gICdzZW1hbnRpYy1wcic6IHsgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsIHN0YXR1c2VzOiAnd3JpdGUnIH0sXG59O1xuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgLy8gYHNlY3JldHM6IGluaGVyaXRgIChwYXJzZWQgYnkganMteWFtbCBhcyBhIHBsYWluIHN0cmluZykgYWxyZWFkeSBmb3J3YXJkcyBldmVyeSBjYWxsZXIgc2VjcmV0XG4gIC8vIGluY2x1ZGluZyB0aGUgb25lcyBpbmplY3RlZCBiZWxvdywgc28gcHJlc2VydmUgaXQgdW50b3VjaGVkIOKAlCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvbiB0aGVcbiAgLy8gc3RyaW5nIHdvdWxkIHRocm93LiBDYXZlYXQ6IGBpbmhlcml0YCBmb3J3YXJkcyBzZWNyZXRzIHVuZGVyIHRoZWlyIGV4aXN0aW5nIE5BTUVTLCBzbyBpdCBjYW5cbiAgLy8gbmV2ZXIgZmVlZCBQVUJMSUNfRk5PWF9BR0VfS0VZIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWTsgYSBoYW5kLXdyaXR0ZW5cbiAgLy8gaW5oZXJpdCBjYWxsZXIgaW4gYSBQVUJMSUMgZm5veCByZXBvc2l0b3J5IG11c3QgYmUgY29udmVydGVkIHRvIGFuIGV4cGxpY2l0IG1hcHBpbmcgbWFudWFsbHlcbiAgLy8gKHdiZnkgbmV2ZXIgZ2VuZXJhdGVzIHRoZSBpbmhlcml0IGZvcm0sIGFuZCBoYW5kLXdyaXR0ZW4gZGV2aWF0aW9ucyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuICAvLyByZXBvc2l0b3J5IGJ5IHBvbGljeSkuXG4gIGNvbnN0IHNlY3JldHMgPSBqb2Iuc2VjcmV0cyA9PT0gJ2luaGVyaXQnID8gdW5kZWZpbmVkIDogKGpvYi5zZWNyZXRzID0gam9iLnNlY3JldHMgPz8ge30pO1xuXG4gIGlmIChzZWNyZXRzICYmIChraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3JlbGVhc2UnKSkge1xuICAgIHNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIC8vIGZub3gudG9tbCBjYXJyaWVzIGFnZS1lbmNyeXB0ZWQgYXBwIHNlY3JldHM7IENJIGRlY3J5cHRzIHRoZW0gd2l0aCB0aGUgRk5PWF9BR0VfS0VZIChvciwgZm9yXG4gIC8vIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG4gIC8vIEtleSB0aGUgaW5qZWN0aW9uIG9uIHRoZSAqY2FsbGVkKiByZXVzYWJsZSB3b3JrZmxvdywgbm90IHRoZSBjYWxsZXIncyBmaWxlbmFtZTogY2FsbGVycyBtYXkgaGF2ZVxuICAvLyBhcmJpdHJhcnkgbmFtZXMgKGUuZy4gc2NoZWR1bGVkIHJ1bi1zY3JpcHQgY2FsbGVycyksIGFuZCBHaXRIdWIgcmVqZWN0cyBwYXNzaW5nIGEgc2VjcmV0IHRoYXQgdGhlXG4gIC8vIGNhbGxlZSBkb2VzIG5vdCBkZWNsYXJlLlxuICAvLyBPbmx5IGFuIEBtYWluIGNhbGxlZSBpcyBrbm93biB0byBmb2xsb3cgdGhlIGN1cnJlbnQgc2VjcmV0IGNvbnRyYWN0OiBhIHdvcmtmbG93IHBpbm5lZCB0byBhblxuICAvLyBvbGRlciB0YWcgb3IgU0hBIG1heSBzdGlsbCBkZWNsYXJlIE5QTV9UT0tFTiAoYW5kIG5vdCBWRVJEQUNDSU9fVE9LRU4pLCBhbmQgR2l0SHViIHJlamVjdHMgYVxuICAvLyBjYWxsZXIgd2hvc2Ugc2VjcmV0cyBkbyBub3QgbWF0Y2ggdGhlIHNlbGVjdGVkIHJldmlzaW9uJ3MgZGVjbGFyYXRpb25zLCBzbyBwaW5uZWQgY2FsbGVycyBrZWVwXG4gIC8vIHRoZWlyIHNlY3JldHMgdW50b3VjaGVkLlxuICBjb25zdCBvcmdXb3JrZmxvd0NhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgY29uc3QgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA9IG9yZ1dvcmtmbG93Q2FsbD8ucmVmID09PSAnbWFpbicgPyBvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXF1aXJlZFBlcm1pc3Npb25zID0gY2FsbGVkUmV1c2FibGVXb3JrZmxvdyA/IHJldXNhYmxlV29ya2Zsb3dQZXJtaXNzaW9uc1tjYWxsZWRSZXVzYWJsZVdvcmtmbG93XSA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlcXVpcmVkUGVybWlzc2lvbnMpIGpvYi5wZXJtaXNzaW9ucyA9IHsgLi4ucmVxdWlyZWRQZXJtaXNzaW9ucyB9O1xuICBpZiAoc2VjcmV0cyAmJiBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ID09PSAndGVzdCcpIHtcbiAgICAvLyBUaGUgY2FsbGVlJ3MgXCJUZXN0IGRlcGxveSBzY3JpcHRcIiBzdGVwIHJ1bnMgYHdiIGRlcGxveSAtLWRyeS1ydW5gLCB3aGljaCBwbGFucyB0aGUgUmFpbHdheSBJYUMuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJhaWx3YXknLCAncmFpbHdheS50cycpKSkge1xuICAgICAgc2VjcmV0cy5SQUlMV0FZX0FQSV9UT0tFTiA9ICcke3sgc2VjcmV0cy5SQUlMV0FZX0FQSV9UT0tFTiB9fSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBzZWNyZXRzLlJBSUxXQVlfQVBJX1RPS0VOO1xuICAgIH1cbiAgfVxuICBpZiAoc2VjcmV0cyAmJiBjYWxsZWRSZXVzYWJsZVdvcmtmbG93ICYmIGluc3RhbGxDYXBhYmxlUmV1c2FibGVXb3JrZmxvd3MuaGFzKGNhbGxlZFJldXNhYmxlV29ya2Zsb3cpKSB7XG4gICAgLy8gVGhlIGNhbGxlZSByb3V0ZXMgcHVibGljIChkZWZhdWx0LXJlZ2lzdHJ5KSBpbnN0YWxscyB0aHJvdWdoIHRoZSBUYWt1bWkgR3VhcmRcbiAgICAvLyBtYWxpY2lvdXMtcGFja2FnZS1ibG9ja2luZyBwcm94eSB3aGVuIHRoaXMgdG9rZW4gcmVzb2x2ZXM7IGFuIHVuc2V0IG9yZ2FuaXphdGlvbiBzZWNyZXRcbiAgICAvLyBleHBhbmRzIHRvICcnIGFuZCB0aGUgY2FsbGVlIHRyZWF0cyB0aGF0IGFzIFwiZmVhdHVyZSBvZmZcIiwgc28gcGFzc2luZyBpdCBpcyBhbHdheXMgc2FmZS5cbiAgICBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiA9ICcke3sgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nO1xuICAgIC8vIFRoZSBjYWxsZWUgZ2VuZXJhdGVzIHRoZSB3b3Jrc3BhY2UgLm5wbXJjIGZvciBAd2lsbGJvb3N0ZXItcHJpdmF0ZS8qIGZyb20gVkVSREFDQ0lPX1RPS0VOXG4gICAgLy8gYmVmb3JlIGluc3RhbGxpbmcgZGVwZW5kZW5jaWVzLiBPbmx5IHJlcG9zaXRvcmllcyB0aGF0IGFjdHVhbGx5IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlc1xuICAgIC8vIChvciBwdWJsaXNoIHRvIFZlcmRhY2NpbykgZ2V0IHRoZSBwYXNzLXRocm91Z2g6IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgY3JlZGVudGlhbCB3b3VsZCBmbG93XG4gICAgLy8gaW50byBDSSBydW5zIHRoYXQgbmV2ZXIgdXNlIGl0LCBzbyB0aGUgbGluZSBpcyByZW1vdmVkIGluc3RlYWQuIFRoZSBHaXRIdWIgc2VjcmV0IGl0c2VsZiBpc1xuICAgIC8vIGFsd2F5cyByZWdpc3RlcmVkIG1hbnVhbGx5IGFuZCBzdGF5cyByZWdpc3RlcmVkIGVpdGhlciB3YXkuXG4gICAgaWYgKHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhjb25maWcpKSB7XG4gICAgICBzZWNyZXRzLlZFUkRBQ0NJT19UT0tFTiA9ICcke3sgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gfX0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU47XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgLy8gUHVibGljIHJlcG9zaXRvcmllcyBjb21taXQgd29ybGQtcmVhZGFibGUgY2lwaGVydGV4dHMsIHNvIHRoZXkgZGVjcnlwdCB3aXRoIGEgZGVkaWNhdGVkXG4gICAgICAvLyBDSSBpZGVudGl0eSAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uIHNlY3JldCkgaW5zdGVhZCBvZiB0aGUgb3JnLWludGVybmFsXG4gICAgICAvLyBvbmU7IHRoZSBjYWxsZWUgc3RpbGwgcmVjZWl2ZXMgaXQgdW5kZXIgaXRzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSBuYW1lLiBXaGVuIG5vIENJXG4gICAgICAvLyBpZGVudGl0eSByZXNvbHZlcyAoc2VlIGZub3hBZ2VLZXlNYXBwaW5nKSwgbGVhdmUgYW55IGV4aXN0aW5nIG1hcHBpbmcgdW50b3VjaGVkIGFuZCBhZGRcbiAgICAgIC8vIG5vbmU6IGNyZWF0aW5nIG9yIHJld3JpdGluZyBvbmUgb24gaW5jb21wbGV0ZSBpbmZvcm1hdGlvbiB3b3VsZCBtYXAgYSBwb3NzaWJseS1wdWJsaWNcbiAgICAgIC8vIHJlcG9zaXRvcnkgdG8gdGhlIHdyb25nIGlkZW50aXR5LCBhbmQgYSBmbm94IHJlY2lwaWVudCBzeW5jIGZhaWx1cmUgZG9lcyBub3Qgc3RvcCB0aGlzXG4gICAgICAvLyBnZW5lcmF0b3IgZnJvbSB3cml0aW5nIGZpbGVzIOKAlCB0aGUgZmFpbGVkIHJ1bidzIHJlcnVuIGZpbGxzIHRoZSBtYXBwaW5nIGluLlxuICAgICAgY29uc3QgbWFwcGluZyA9IGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZyk7XG4gICAgICBpZiAobWFwcGluZykge1xuICAgICAgICBzZWNyZXRzLkZOT1hfQUdFX0tFWSA9IG1hcHBpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0Jykge1xuICAgIGNvbnN0IFtydXN0RGlyUGF0aF0gPSBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHM7XG4gICAgaWYgKHJ1c3REaXJQYXRoICYmIHJ1c3REaXJQYXRoICE9PSAnLicpIHtcbiAgICAgIGpvYi53aXRoLndvcmtpbmdfZGlyZWN0b3J5ID0gcnVzdERpclBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWNvbnN0cnVjdCBmcm9tIHRoZSBwYXJzZWQgY2FsbCBzbyBhIGRpZmZlcmVudGx5IGNhc2VkIG93bmVyIChHaXRIdWIgaXMgY2FzZS1pbnNlbnNpdGl2ZVxuICAvLyB0aGVyZSkgaXMgYWxzbyBub3JtYWxpemVkIHRvIHRoZSByZXBvc2l0b3J5J3Mgb3duIG9yZ2FuaXphdGlvbiAvIG1pcnJvci5cbiAgaWYgKG9yZ1dvcmtmbG93Q2FsbCAmJiBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzLyR7b3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZX0uJHtvcmdXb3JrZmxvd0NhbGwuZXh0ZW5zaW9ufUAke29yZ1dvcmtmbG93Q2FsbC5yZWZ9YDtcbiAgfSBlbHNlIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyTGFiL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgY29uc3QgYWNjZXB0c1J1bm5lcklucHV0ID0gWyd0ZXN0JywgJ3Rlc3QtcnVzdCcsICdkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoXG4gICAgb3JnV29ya2Zsb3dDYWxsPy53b3JrZmxvd05hbWUgPz8gJydcbiAgKTtcbiAgaWYgKGNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24pIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyAmJiBhY2NlcHRzUnVubmVySW5wdXQpIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgam9iLndpdGgucnVuc19vbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBsYWJlbHMgPSB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAudHJhbnNmb3JtKCh2YWx1ZSwgY3R4KSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKSBhcyB1bmtub3duO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY3R4LmFkZElzc3VlKHsgY29kZTogJ2N1c3RvbScsIG1lc3NhZ2U6ICdFeHBlY3RlZCBKU09OIHJ1bm5lciBsYWJlbHMnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHouTkVWRVI7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAucGlwZSh6LmFycmF5KHouc3RyaW5nKCkpKVxuICAgICAgICAuc2FmZVBhcnNlKGpvYi53aXRoLnJ1bnNfb24pO1xuICAgICAgaWYgKGxhYmVscy5zdWNjZXNzICYmIGxhYmVscy5kYXRhLmluY2x1ZGVzKCdzZWxmLWhvc3RlZCcpKSB7XG4gICAgICAgIGpvYi53aXRoLnJ1bnNfb24gPSBKU09OLnN0cmluZ2lmeShsYWJlbHMuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlbW92ZWQgcnVuc19vbiBmcm9tICR7am9iLnVzZXN9OiBwcml2YXRlIHJlcG9zaXRvcmllcyByZXF1aXJlIGEgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXkuYCk7XG4gICAgICAgIGRlbGV0ZSBqb2Iud2l0aC5ydW5zX29uO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKHNlY3JldHMpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKHNlY3JldHMpO1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhlIHNlY3JldCBleHByZXNzaW9uIHRoZSBjYWxsZXIgbWFwcyBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVksIG9yIHVuZGVmaW5lZFxuICogd2hlbiB0aGUgcmVwb3NpdG9yeSBzdGF0ZSBkb2VzIG5vdCBpZGVudGlmeSBhIHVzYWJsZSBDSSBpZGVudGl0eSDigJQgYW4gdW5rbm93biB2aXNpYmlsaXR5LCBhXG4gKiByZXBvc2l0b3J5IG5vIENJIHNjb3BlIGNvdmVycyAoZGVyaXZpbmcgZnJvbSB0aGUgc2FtZSBwcmluY2lwYWwgcm9zdGVyIGFzIHRoZSByZWNpcGllbnQgc3luY1xuICoga2VlcHMgdGhlIHR3byBmcm9tIGV2ZXIgZGlzYWdyZWVpbmcpLCBvciBhIGZhaWxlZCBmbm94IHJlY2lwaWVudCBzeW5jLCB3aG9zZSBjaXBoZXJ0ZXh0cyBtYXlcbiAqIHN0aWxsIHRhcmdldCB0aGUgcHJldmlvdXMgaWRlbnRpdHkuIFRoZSBjYWxsZXIgbXVzdCB0aGVuIHByZXNlcnZlIGFueSBleGlzdGluZyBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBmbm94QWdlS2V5TWFwcGluZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gfHwgaGFzRm5veFN5bmNGYWlsZWQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VjcmV0TmFtZSA9IHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKGNvbmZpZyk7XG4gIHJldHVybiBzZWNyZXROYW1lICYmIGBcXCR7eyBzZWNyZXRzLiR7c2VjcmV0TmFtZX0gfX1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEEgcGVybWlzc2lvbnMgb2JqZWN0IGVtcHRpZWQgYnkgdGhlIHBlci1raW5kIGRlbGV0aW9ucyAoZS5nLiBhbiBleGlzdGluZyB0ZXN0LXJ1c3QgY2FsbGVyXG4gIC8vIHdob3NlIG9ubHkgZW50cnkgd2FzIGBhY3Rpb25zYCkgbXVzdCBiZSBkcm9wcGVkIGVudGlyZWx5OiBgcGVybWlzc2lvbnM6IHt9YCBzdHJpcHMgRVZFUllcbiAgLy8gdG9rZW4gcGVybWlzc2lvbiBmcm9tIHRoZSB3b3JrZmxvdywgdW5saWtlIHRoZSBhYnNlbnQga2V5IHdoaWNoIGtlZXBzIHRoZSBkZWZhdWx0cy5cbiAgaWYgKG5ld1NldHRpbmdzLnBlcm1pc3Npb25zICYmIE9iamVjdC5rZXlzKG5ld1NldHRpbmdzLnBlcm1pc3Npb25zKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM7XG4gIH1cbiAgYXdhaXQgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKGZpbGVQYXRoLCBkdW1wWWFtbE92ZXIoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpLCBuZXdTZXR0aW5ncykpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcnVuQWxsSW5Qb29sKFtcbiAgICAgIC4uLmRvY0ZpbGVzLm1hcCgoZmlsZSkgPT4gZml4RmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSksIGZpeFR5cG9zSW5UZXh0LCBwYWNrYWdlQ29uZmlnLCAnZG9jJykpLFxuICAgICAgLi4udHNGaWxlcy5tYXAoKGZpbGUpID0+IGZpeEZpbGUocGF0aC5qb2luKGRpclBhdGgsIGZpbGUpLCBmaXhUeXBvc0luQ29kZSwgcGFja2FnZUNvbmZpZywgJ3RzJykpLFxuICAgICAgLi4udGV4dEJhc2VkRmlsZXMubWFwKChmaWxlKSA9PiBmaXhGaWxlKHBhdGguam9pbihkaXJQYXRoLCBmaWxlKSwgZml4VHlwb3NJblRleHQsIHBhY2thZ2VDb25maWcsICd0ZXh0JykpLFxuICAgIF0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4RmlsZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZml4VHlwb3M6IChjb250ZW50OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0J1xuKTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKGZpeFR5cG9zKGNvbnRlbnQpLCBwYWNrYWdlQ29uZmlnLCBwcm9wTmFtZSk7XG4gICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50XG4gICAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgICAvLyBUaGUgd29yZCBib3VuZGFyeSBhbmQgdHJhaWxpbmctd2hpdGVzcGFjZSBndWFyZCBrZWVwIHdvcmRzIG1lcmVseSBlbmRpbmcgaW4gdGhlXG4gICAgICAvLyBhYmJyZXZpYXRpb24gbGV0dGVycyAoZS5nLiBcImNvb2tpZS5cIiwgXCJsZWcuXCIpIGludGFjdC5cbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnJDEvLyQyY2YuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJlZ1xcLig/PVxcc3wkKS9nLCAnJDEvLyQyZS5nLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiaWVcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmkuZS4nKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgLy8gVGhlIGRvdCBtdXN0IGJlIGVzY2FwZWQ6IGFuIHVuZXNjYXBlZCBgLmAgbWF0Y2hlcyBBTlkgY2hhcmFjdGVyLCBzbyBgbGVnaXRgIGxvc3QgaXRzIGBsYCBhbmQgYGVgLlxuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC9cXC5naXQkL3UsICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICAvLyBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHNvIGNyZWRlbnRpYWwgc2VsZWN0aW9uIChhbmQgdGhlIGNhY2hlIGtleSkgbXVzdFxuICAvLyBub3QgZGVwZW5kIG9uIGhvdyBhIHJlbW90ZSBVUkwgaGFwcGVucyB0byBzcGVsbCB0aGUgb3JnYW5pemF0aW9uLlxuICBjb25zdCBrZXkgPSBvd25lcj8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG9uIHB1cnBvc2U6IGEgbm9uY2Fub25pY2FsbHkgY2FzZWQgcmVtb3RlIChlLmcuIGdpdGh1Yi5jb20vd2lsbGJvb3N0ZXJsYWIv4oCmKVxuICAvLyBtdXN0IHN0aWxsIHNlbGVjdCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIFBBVCDigJQgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIGJyYW5jaCB3b3VsZFxuICAvLyBwcmVmZXIgdGhlIE9USEVSIG9yZ2FuaXphdGlvbidzIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgdGhpcyBvcmdhbml6YXRpb24ncyBwcml2YXRlXG4gIC8vIHJlcG9zaXRvcmllcy5cbiAgY29uc3Qgbm9ybWFsaXplZE93bmVyID0gb3duZXI/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXJsYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IGFwcGx5RWRpdHMsIGNyZWF0ZVNjYW5uZXIsIGZpbmROb2RlQXRMb2NhdGlvbiwgbW9kaWZ5LCBwYXJzZSBhcyBwYXJzZUpzb25jLCBwYXJzZVRyZWUgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG4vLyBqc29uYy1wYXJzZXIgZGVjbGFyZXMgU3ludGF4S2luZC9TY2FuRXJyb3IgYXMgYW1iaWVudCBjb25zdCBlbnVtcywgd2hpY2ggY2Fubm90IGJlIGltcG9ydGVkXG4vLyB1bmRlciB2ZXJiYXRpbU1vZHVsZVN5bnRheDsgbWlycm9yIHRoZSBuZWVkZWQgbWVtYmVyIHZhbHVlcyBsb2NhbGx5LlxuY29uc3Qgc3ludGF4S2luZCA9IHsgbGluZUNvbW1lbnRUcml2aWE6IDEyLCBibG9ja0NvbW1lbnRUcml2aWE6IDEzLCBsaW5lQnJlYWtUcml2aWE6IDE0LCB0cml2aWE6IDE1LCBlb2Y6IDE3IH07XG5jb25zdCBzY2FuRXJyb3JOb25lID0gMDtcblxuZXhwb3J0IGNvbnN0IGpzb25jVXRpbCA9IHtcbiAgLyoqXG4gICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaG9sZHMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwg4oCUIG9ubHkgd2hpdGVzcGFjZSwgY29tcGxldGUgY29tbWVudHMsXG4gICAqIGFuZC9vciBhIEJPTS4gdHNjIHRyZWF0cyBzdWNoIGEgdHNjb25maWcuanNvbiBhcyBhbiBlbXB0eSBjb25maWcsIHNvIGdlbmVyYXRvcnMgc2hvdWxkIHRyZWF0XG4gICAqIGl0IGxpa2UgYSBtaXNzaW5nIGZpbGUgKGFuZCBnZW5lcmF0ZSBkZWZhdWx0cykgaW5zdGVhZCBvZiByZWZ1c2luZyB0byBtYW5hZ2UgaXQuIExleGljYWxseVxuICAgKiBicm9rZW4gdHJpdmlhIChlLmcuIGFuIHVudGVybWluYXRlZCBibG9jayBjb21tZW50KSBpcyBOT1QgdHJpdmlhLW9ubHk6IHRoZSBmaWxlIG11c3QgYmUgbGVmdFxuICAgKiB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gb3ZlcndyaXR0ZW4gd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGlzVHJpdmlhT25seShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgaWYgKFxuICAgICAgICAoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSB8fFxuICAgICAgICAoa2luZCAhPT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC50cml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmxpbmVCcmVha1RyaXZpYSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUGFyc2VzIGEgSlNPTkMgKEpTT04gd2l0aCBjb21tZW50cykgb2JqZWN0IGZyb20gY29uZmlnIGZpbGVzIHN1Y2ggYXMgdHNjb25maWcuanNvbixcbiAgICogcHlyaWdodGNvbmZpZy5qc29uLCByZW5vdmF0ZS5qc29uLCAudnNjb2RlL3NldHRpbmdzLmpzb24sIGFuZCB3cmFuZ2xlci5qc29uYy5cbiAgICpcbiAgICoganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCByZXR1cm5zIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCwgd2hpY2ggbXVzdFxuICAgKiBub3QgYmUgdHJlYXRlZCBhcyB0aGUgZmlsZSdzIGNvbmZpZ3VyYXRpb247IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IgaW5zdGVhZC4gQSBsZWFkaW5nIEJPTSBpc1xuICAgKiBzdHJpcHBlZCBiZWNhdXNlIFR5cGVTY3JpcHQgYWNjZXB0cyBCT00nZCBjb25maWcgZmlsZXMgd2hpbGUganNvbmMtcGFyc2VyIHJlcG9ydHMgdGhlIEJPTSBhc1xuICAgKiBhIHBhcnNlIGVycm9yLiBDYWxsZXJzIHdob3NlIHJlYWRlciByZWplY3RzIHRyYWlsaW5nIGNvbW1hcyB0dXJuIGBhbGxvd1RyYWlsaW5nQ29tbWFgXG4gICAqIG9mZiBzbyBzdWNoIGEgZmlsZSBpcyByZXBvcnRlZCBhcyBtYWxmb3JtZWQgaGVyZSB0b28uXG4gICAqL1xuICBwYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VCBleHRlbmRzIG9iamVjdD4oY29udGVudDogc3RyaW5nLCBhbGxvd1RyYWlsaW5nQ29tbWEgPSB0cnVlKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VKc29uYyhjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpLCBwYXJzZUVycm9ycywgeyBhbGxvd1RyYWlsaW5nQ29tbWEgfSkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBjYXJyaWVzIGF0IGxlYXN0IG9uZSBjb21tZW50LCBpLmUuIGNvbnRlbnQgSlNPTi5zdHJpbmdpZnkgd291bGQgZHJvcC4gKi9cbiAgY29udGFpbnNDb21tZW50KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICAvLyBBIGxleGljYWwgZXJyb3IgbWVhbnMgdGhlIHJlbWFpbmluZyB0b2tlbnMgYXJlIHVucmVsaWFibGU7IHJlcG9ydCBubyBjb21tZW50IHJhdGhlciB0aGFuXG4gICAgICAvLyBndWVzc2luZy4gQSBjYWxsZXIgdGhhdCBvbmx5IHdhcm5zIGFib3V0IGRyb3BwZWQgY29tbWVudHMgbG9zZXMgbm90aGluZywgYW5kIG9uZSB0aGF0XG4gICAgICAvLyByZWZ1c2VzIGEgY29tbWVudGVkIGZpbGUgZm9yIGEgc3RyaWN0LUpTT04gcmVhZGVyIHN0aWxsIHJlamVjdHMgc3VjaCBjb250ZW50IHdoZW4gaXRcbiAgICAgIC8vIHBhcnNlcyBpdC5cbiAgICAgIGlmICgoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGtpbmQgPT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgfHwga2luZCA9PT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGBzZXR0aW5nc2AgaW50byBgb2xkQ29udGVudGAsIGVkaXRpbmcgb25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzXG4gICAqIGNoYW5nZWQgc28gdGhlIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIG9mIGFuIGV4aXN0aW5nIGZpbGUgc3Vydml2ZS4gQ2FsbGVycyBuZXZlciBkcm9wXG4gICAqIHByb3BlcnRpZXMgKGdlbmVyYXRlZCBzZXR0aW5ncyBhcmUgbWVyZ2VkIE9OIFRPUCBvZiB0aGUgZXhpc3Rpbmcgb25lcyksIHNvIHJlbW92YWxzIGFyZSBub3RcbiAgICogaGFuZGxlZDogYSBwcm9wZXJ0eSBtaXNzaW5nIGZyb20gYHNldHRpbmdzYCBpcyBsZWZ0IHVudG91Y2hlZCByYXRoZXIgdGhhbiBkZWxldGVkLlxuICAgKlxuICAgKiBUcml2aWEtb25seSBjb250ZW50IGtlZXBzIGl0cyBjb21tZW50cyBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW5cbiAgICogYmVpbmcgcmVwbGFjZWQgb3V0cmlnaHQgb3IgcnVuIHRocm91Z2ggbW9kaWZ5KCkgKHdoaWNoIHdvdWxkIG1vdmUgdGhlIG9iamVjdCBpbiBmcm9udCBvZiB0aGVtKS5cbiAgICovXG4gIHN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgb2xkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB7IGNvbnRlbnQ6IHN0cmluZzsga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSB9IHtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSwga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2xkQ29udGVudCk7XG4gICAgLy8gRHJvcCBhIGxlYWRpbmcgQk9NOiBtb2RpZnkoKSBpbnNlcnRzIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IEJFRk9SRSBhbnkgbGVhZGluZyB0cml2aWEsIHdoaWNoXG4gICAgLy8gd291bGQgbGVhdmUgdGhlIEJPTSBzdHJhbmRlZCBtaWQtZmlsZSB3aGVyZSBpdCBpcyBhIHN5bnRheCBlcnJvciByYXRoZXIgdGhhbiBhbiBpZ25vcmVkIG1hcmsuXG4gICAgbGV0IGNvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpO1xuICAgIGlmIChqc29uY1V0aWwuaXNUcml2aWFPbmx5KGNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBjb250ZW50LnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IGAke2hlYWRlciA/IGhlYWRlciArICdcXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKX1gLFxuICAgICAgICBrZXlzTG9zaW5nQ29tbWVudHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbW9kaWZ5T3B0aW9ucyA9IHsgZm9ybWF0dGluZ09wdGlvbnM6IGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQpIH07XG4gICAgY29uc3Qga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5ld0VudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncykpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkU2V0dGluZ3M/LltrZXldO1xuICAgICAgLy8gQ29tcGFyZSBzZXJpYWxpemVkIGZvcm1zIHNvIGRlZXAtZXF1YWwgdmFsdWVzIChlLmcuIGEgcmUtbWVyZ2VkIGBleHRlbmRzYCBhcnJheSkgZG8gbm90XG4gICAgICAvLyByZXdyaXRlIHRoZSBwcm9wZXJ0eSBhbmQgcmVmbG93IGl0cyBmb3JtYXR0aW5nLlxuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2luZyBhIHdob2xlIGFycmF5IHdvdWxkIGRpc2NhcmQgdGhlIGNvbW1lbnRzIGJldHdlZW4gaXRzIGVsZW1lbnRzLCBzbyBncm93IGl0IHdpdGhcbiAgICAgIC8vIHBlci1lbGVtZW50IGluc2VydGlvbnMgd2hlbmV2ZXIgdGhlIG5ldyB2YWx1ZSBvbmx5IGFkZHMgdG8gaXQuXG4gICAgICBjb25zdCBpbnNlcnRpb25zID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZSwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBpbnNlcnRpb24gb2YgaW5zZXJ0aW9ucyA/PyBbXSkge1xuICAgICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIG1vZGlmeShjb250ZW50LCBba2V5LCBpbnNlcnRpb24uaW5kZXhdLCBpbnNlcnRpb24udmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgaXNBcnJheUluc2VydGlvbjogdHJ1ZSB9KVxuICAgICAgICApO1xuICAgICAgICBjb250ZW50ID0gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50LCBrZXksIGluc2VydGlvbi5pbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zZXJ0aW9ucykgY29udGludWU7XG4gICAgICAvLyBSZXdyaXRpbmcgdGhlIHdob2xlIHZhbHVlIGlzIHRoZSBvbmx5IG9wdGlvbiBsZWZ0ICh0aGUgbmV3IG9uZSBkcm9wcyBvciByZW9yZGVycyBlbGVtZW50cyksXG4gICAgICAvLyBhbmQgaXQgdGFrZXMgYW55IGNvbW1lbnQgbmVzdGVkIGluc2lkZSBpdCBhbG9uZy4gUmVwb3J0IHRoYXQgcmF0aGVyIHRoYW4gbG9zaW5nIGl0IHF1aWV0bHkuXG4gICAgICBjb25zdCByZXBsYWNlZFRleHQgPSB2YWx1ZVRleHRPZihjb250ZW50LCBrZXkpO1xuICAgICAgaWYgKHJlcGxhY2VkVGV4dCAhPT0gdW5kZWZpbmVkICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQocmVwbGFjZWRUZXh0KSkga2V5c0xvc2luZ0NvbW1lbnRzLnB1c2goa2V5KTtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIG1vZGlmeU9wdGlvbnMpKTtcbiAgICB9XG4gICAgLy8gUHJlcGVuZCByYXRoZXIgdGhhbiBhcHBlbmQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmV3OiBhcHBlbmRpbmcgZGV0YWNoZXMgYSB0cmFpbGluZ1xuICAgIC8vIHNhbWUtbGluZSBjb21tZW50IGZyb20gdGhlIGxhc3QgcHJvcGVydHksIGxlYXZpbmcgaXQgdG8gZGVzY3JpYmUgdGhlIGdlbmVyYXRlZCB2YWx1ZVxuICAgIC8vIGluc3RlYWQuIEluc2VydGluZyBpbiByZXZlcnNlIGtlZXBzIHRoZSBvcmRlciB0aGUgc2V0dGluZ3MgZGVjbGFyZSB0aGVtIGluLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMudG9SZXZlcnNlZCgpKSB7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGdldEluc2VydGlvbkluZGV4OiAoKSA9PiAwIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH07XG4gIH0sXG59O1xuXG4vKiogUmV0dXJucyB0aGUgc291cmNlIHRleHQgb2YgYSB0b3AtbGV2ZWwgcHJvcGVydHkncyB2YWx1ZSwgY29tbWVudHMgYW5kIGFsbC4gKi9cbmZ1bmN0aW9uIHZhbHVlVGV4dE9mKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBub2RlID0gcm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pO1xuICByZXR1cm4gbm9kZSAmJiBjb250ZW50LnNsaWNlKG5vZGUub2Zmc2V0LCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoKTtcbn1cblxuLy8gVGhlIHdob2xlIHNhbWUtbGluZSBjb21tZW50IHNlcXVlbmNlLCBub3QganVzdCB0aGUgZmlyc3Qgb25lOiBhIGxpbmUgY29tbWVudCBlbmRzIGl0IChpdCBydW5zIHRvXG4vLyB0aGUgbmV3bGluZSksIGJ1dCBhbnkgbnVtYmVyIG9mIGJsb2NrIGNvbW1lbnRzIGNhbiBwcmVjZWRlIGl0LCBhbmQgbW92aW5nIG9ubHkgdGhlIGZpcnN0IHdvdWxkXG4vLyBsZWF2ZSB0aGUgcmVzdCBkZXNjcmliaW5nIHRoZSB3cm9uZyBlbGVtZW50LlxuY29uc3QgdHJhaWxpbmdDb21tZW50UGF0dGVybiA9IC9eKD86W15cXFNcXG5dKlxcL1xcKltcXFNcXHNdKj9cXCpcXC8pKig/OlteXFxTXFxuXSpcXC9cXC9bXlxcbl0qKT8vdTtcblxuLyoqXG4gKiBSZWF0dGFjaGVzIGEgc2FtZS1saW5lIGNvbW1lbnQgdG8gdGhlIGVsZW1lbnQgaXQgZGVzY3JpYmVzLiBJbnNlcnRpbmcgaW50byBhbiBhcnJheSBwbGFjZXMgdGhlXG4gKiBuZXcgZWxlbWVudCBCRUZPUkUgdGhlIHRyaXZpYSB0aGF0IGZvbGxvd3MgaXRzIHByZWRlY2Vzc29yLCBzbyBhcHBlbmRpbmcgYWZ0ZXJcbiAqIGB7IC4uLiB9IC8vIHdoeSB0aGlzIHJ1bGUgZXhpc3RzYCBsZWF2ZXMgdGhhdCBjb21tZW50IGV4cGxhaW5pbmcgdGhlIGdlbmVyYXRlZCBlbGVtZW50IGluc3RlYWQuXG4gKiBBIGZyZXNobHkgc2VyaWFsaXplZCBlbGVtZW50IG5ldmVyIGNhcnJpZXMgYSBjb21tZW50IG9mIGl0cyBvd24sIHNvIGFueXRoaW5nIHRyYWlsaW5nIHRoZVxuICogaW5zZXJ0aW9uIGJlbG9uZ2VkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBpbnNlcnRlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaW5zZXJ0ZWRJbmRleCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IGVsZW1lbnRzID0gKHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKSk/LmNoaWxkcmVuO1xuICBjb25zdCBpbnNlcnRlZCA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleF07XG4gIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4IC0gMV07XG4gIGlmICghaW5zZXJ0ZWQgfHwgIXByZXZpb3VzKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5zZXJ0ZWRFbmQgPSBpbnNlcnRlZC5vZmZzZXQgKyBpbnNlcnRlZC5sZW5ndGg7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuLmV4ZWMoY29udGVudC5zbGljZShpbnNlcnRlZEVuZCkpPy5bMF07XG4gIGlmICghY29tbWVudCkgcmV0dXJuIGNvbnRlbnQ7XG4gIC8vIExhbmQgdGhlIGNvbW1lbnQgYWZ0ZXIgdGhlIHNlcGFyYXRpbmcgY29tbWEgc28gdGhlIGVsZW1lbnQga2VlcHMgaXRzIG93biBsaW5lIGludGFjdC5cbiAgY29uc3QgcHJldmlvdXNFbmQgPSBwcmV2aW91cy5vZmZzZXQgKyBwcmV2aW91cy5sZW5ndGg7XG4gIGNvbnN0IHJlc3RvcmVPZmZzZXQgPSBwcmV2aW91c0VuZCArICgvXlxccyosL3UuZXhlYyhjb250ZW50LnNsaWNlKHByZXZpb3VzRW5kKSk/LlswXS5sZW5ndGggPz8gMCk7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCByZXN0b3JlT2Zmc2V0KSArXG4gICAgY29tbWVudCArXG4gICAgY29udGVudC5zbGljZShyZXN0b3JlT2Zmc2V0LCBpbnNlcnRlZEVuZCkgK1xuICAgIGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQgKyBjb21tZW50Lmxlbmd0aClcbiAgKTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBpbmRlbnRhdGlvbiB0aGUgZmlsZSBhbHJlYWR5IHVzZXMsIHNvIGEgc2VtYW50aWMgY2hhbmdlIGRvZXMgbm90IHJlaW5kZW50IHVucmVsYXRlZFxuICogbGluZXMuIFRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgaW5kZW50ZWQgbGluZSwgYmVjYXVzZSBhIGRlY29yYXRlZFxuICogYmxvY2sgY29tbWVudCAoYCAqIC4uLmApIHdvdWxkIG90aGVyd2lzZSBwYXNzIGZvciB0aGUgZmlsZSdzIGluZGVudGF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSB0d29cbiAqIHNwYWNlcyBldmVyeSBnZW5lcmF0ZWQgY29uZmlnIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQ6IHN0cmluZyk6IHsgaW5zZXJ0U3BhY2VzOiBib29sZWFuOyB0YWJTaXplOiBudW1iZXIgfSB7XG4gIGNvbnN0IGZpcnN0UHJvcGVydHkgPSBwYXJzZVRyZWUoY29udGVudCk/LmNoaWxkcmVuPy5bMF07XG4gIGNvbnN0IGluZGVudGF0aW9uID1cbiAgICBmaXJzdFByb3BlcnR5ICYmIGNvbnRlbnQuc2xpY2UoY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpICsgMSwgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpO1xuICBpZiAoIWluZGVudGF0aW9uIHx8ICEvXltcXHQgXSskL3UudGVzdChpbmRlbnRhdGlvbikpIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogMiB9O1xuICBpZiAoaW5kZW50YXRpb24uc3RhcnRzV2l0aCgnXFx0JykpIHJldHVybiB7IGluc2VydFNwYWNlczogZmFsc2UsIHRhYlNpemU6IDEgfTtcbiAgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiBpbmRlbnRhdGlvbi5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBpbnNlcnQgaW50byBgb2xkVmFsdWVgIHRvIHR1cm4gaXQgaW50byBgbmV3VmFsdWVgLCBvciB1bmRlZmluZWQgd2hlblxuICogdGhhdCBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgYG5ld1ZhbHVlYCBkcm9wcyBvciByZW9yZGVycyBhbiBleGlzdGluZyBlbGVtZW50ICh0aGUgY2FsbGVyIG11c3RcbiAqIHRoZW4gcmVwbGFjZSB0aGUgYXJyYXkgd2hvbGVzYWxlKS4gSW5kaWNlcyBhZGRyZXNzIHRoZSBhcnJheSBhcyBpdCBncm93cywgc28gYXBwbHlpbmcgdGhlXG4gKiBpbnNlcnRpb25zIGxlZnQgdG8gcmlnaHQgeWllbGRzIGBuZXdWYWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlOiB1bmtub3duW10sIG5ld1ZhbHVlOiB1bmtub3duW10pOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc2VydGlvbnM6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdID0gW107XG4gIGxldCBvbGRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgW25ld0luZGV4LCBlbGVtZW50XSBvZiBuZXdWYWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAob2xkSW5kZXggPCBvbGRWYWx1ZS5sZW5ndGggJiYgSlNPTi5zdHJpbmdpZnkob2xkVmFsdWVbb2xkSW5kZXhdKSA9PT0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpIHtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaW5zZXJ0aW9ucy5wdXNoKHsgaW5kZXg6IG5ld0luZGV4LCB2YWx1ZTogZWxlbWVudCB9KTtcbiAgfVxuICByZXR1cm4gb2xkSW5kZXggPT09IG9sZFZhbHVlLmxlbmd0aCA/IGluc2VydGlvbnMgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBSZWNvZ25pemVzIHRoZSBtYW5hZ2VkIGB3YiBnZW4tY29kZWAgc2VnbWVudCwgYSBvbmUtbGV2ZWwgcGFja2FnZS1zY3JpcHQgd3JhcHBlciBhcm91bmQgaXQsIGFuZFxuICogY3VzdG9tIHNlZ21lbnRzIHRoYXQgd2JmeSBsZWF2ZXMgYWxvbmUuXG4gKi9cbnR5cGUgU2NyaXB0U2VnbWVudEtpbmQgPSAnY3VzdG9tJyB8ICdnZW5Db2RlJyB8ICdnZW5Db2RlV3JhcHBlcic7XG5cbmNvbnN0IGdlbkNvZGVTZWdtZW50UGF0dGVybiA9IC9eYnVuXFxzK3diXFxzK2dlbi1jb2RlJC91O1xuXG4vLyBBIHJ1bm5lciBkZWxlZ2F0aW5nIHRvIG9uZSBvZiB0aGlzIHBhY2thZ2UncyBvd24gc2NyaXB0cywgZS5nLiBgYnVuIHJ1biBnZW4tdHlwZXNgLlxuY29uc3Qgc2NyaXB0UnVubmVyUGF0dGVybiA9IC9eYnVuXFxzK3J1blxccysoXFxTKykkL3U7XG5cbi8vIEFueXRoaW5nIHdiZnkncyBgJiZgIHNwbGl0IGNhbm5vdCBtb2RlbCAocGlwZXMsIHNlcXVlbmNpbmcsIHJlZGlyZWN0aW9ucywgcXVvdGluZywgc3Vic3RpdHV0aW9ucywgZGlyZWN0b3J5XG4vLyBjaGFuZ2VzKS4gU2NyaXB0cyBjb250YWluaW5nIGl0IGFyZSBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG5jb25zdCB1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybiA9IC9bXFxuO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3U7XG5cbi8qKlxuICogU3BsaXRzIGEgc2NyaXB0IGludG8gYCYmYC1zZXBhcmF0ZWQgc2VnbWVudHMsIG9yIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCB1c2VzIHNoZWxsIHN5bnRheCB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAodW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm47XG4gIHJldHVybiBzY3JpcHRcbiAgICAuc3BsaXQoJyYmJylcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTY3JpcHRTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIGZvbGxvd3NXcmFwcGVyID0gdHJ1ZVxuKTogU2NyaXB0U2VnbWVudEtpbmQge1xuICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgaWYgKGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KG5vcm1hbGl6ZWQpKSByZXR1cm4gJ2dlbkNvZGUnO1xuICAvLyBBIG9uZS1sZXZlbCB3cmFwcGVyIGxvb2t1cCBjb3ZlcnMgYFwicG9zdGluc3RhbGxcIjogXCJidW4gcnVuIGdlbi10eXBlc1wiYCwgdGhlIHNoYXBlIHRoZXNlIHJlcG9zaXRvcmllcyB1c2U7XG4gIC8vIGRlZXBlciBjaGFpbnMgc3RheSBjdXN0b20gc28gd2JmeSBjYW5ub3QgbG9vcCBvbiBhIHNlbGYtcmVmZXJlbnRpYWwgc2NyaXB0LlxuICBjb25zdCBzY3JpcHROYW1lID0gZm9sbG93c1dyYXBwZXIgPyBzY3JpcHRSdW5uZXJQYXR0ZXJuLmV4ZWMobm9ybWFsaXplZCk/LlsxXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiAnY3VzdG9tJztcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHRhcmdldCk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgc3RpbGwgcGVyZm9ybXMgdGhlIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiwgc28gaXQgY291bnRzIGFzIGdlbi1jb2RlOyB0cmVhdGluZyBpdCBhcyBjdXN0b20gd291bGQgYXBwZW5kIGEgc2Vjb25kIGB3YiBnZW4tY29kZWAgYW5kIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuXG4gIGlmIChzZWdtZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIG1hbmFnZWQgZ2VuZXJhdGlvbiBBTkQgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IGlzIHRoZSBpbnN0YWxsLXRpbWUgZW50cnkgcG9pbnQ6IGl0IG11c3QgYmUga2VwdCBhc1xuICAgIC8vIHdyaXR0ZW4uIFJlcGxhY2luZyBpdCB3aXRoIGEgYmFyZSBgd2IgZ2VuLWNvZGVgIHdvdWxkIGRyb3AgdGhvc2Ugc3RlcHM7IGFwcGVuZGluZyBvbmUgd291bGQgcnVuIGV2ZXJ5XG4gICAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICAgIHJldHVybiBzZWdtZW50cz8uc29tZSgoaW5uZXIpID0+IGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KGlubmVyLnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpKSlcbiAgICAgID8gJ2dlbkNvZGVXcmFwcGVyJ1xuICAgICAgOiAnY3VzdG9tJztcbiAgfVxuICByZXR1cm4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnRzWzBdID8/ICcnLCBzY3JpcHRzLCBmYWxzZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZCwgYXJncywgY3dkKVsxXTtcbn1cblxuZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dCA6IHN0ZG91dC50b1N0cmluZygpO1xuICByZXR1cm4gW3Byb2Muc3RhdHVzID8/IDEsIHN0ZG91dFRleHQudHJpbSgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICAvLyBXaGV0aGVyIGlzUHVibGljUmVwbyBjb21lcyBmcm9tIGFuIGFjdHVhbCBHaXRIdWIgQVBJIHJlc3BvbnNlOiBhIGZhaWxlZCBsb29rdXAgKG9mZmxpbmUsXG4gIC8vIHJhdGUtbGltaXRlZCwgYmFkIGNyZWRlbnRpYWwpIGNvbGxhcHNlcyB0byBpc1B1YmxpY1JlcG89ZmFsc2UsIHdoaWNoIHZpc2liaWxpdHktc2Vuc2l0aXZlXG4gIC8vIGdlbmVyYXRvcnMgbXVzdCBub3QgbWlzdGFrZSBmb3IgYSBjb25maXJtZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICBpc1JlcG9WaXNpYmlsaXR5S25vd246IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0Nsb3VkZmxhcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW47XG4gIGlzUmFpbHdheTogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLyoqIERpcmVjdG9yaWVzIGNvbnRhaW5pbmcgQ2FyZ28udG9tbCAocmVsYXRpdmUgdG8gZGlyUGF0aCwgcm9vdC1tb3N0IGZpcnN0KS4gRW1wdHkgaWYgdGhlIHJlcG8gaGFzIG5vIFJ1c3QgY29kZS4gKi9cbiAgY2FyZ29Ub21sRGlyUGF0aHM6IHN0cmluZ1tdO1xuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgUHl0aG9uIGxvY2tmaWxlIChwb2V0cnkubG9jayAvIHV2LmxvY2spIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBNYXZlbiBwb20ueG1sIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUG9tWG1sQW55d2hlcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgU2xpZGV2IGRlY2sgKGAqLnNsaWRldi5tZGApIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluU2xpZGV2TWQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWc6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFJ1bnRpbWU6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHNsaWRldjogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgdGF1cmk6IGJvb2xlYW47XG4gICAgdmluZXh0OiBib29sZWFuO1xuICAgIHZpdGU6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gICAgY2hha3JhOiBib29sZWFuO1xuICAgIGRyaXp6bGU6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgbnBtOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEFuIGV4cGxpY2l0IG5wbS1wdWJsaXNoaW5nIHBsdWdpbiBlbnRyeSBwdWJsaXNoZXMgdGhlIHJvb3QgbWFuaWZlc3QgaXRzZWxmXG4gICAgICogKG5vIHBrZ1Jvb3QgcmVkaXJlY3Rpb24gYW5kIG5wbVB1Ymxpc2ggbm90IGRpc2FibGVkKS5cbiAgICAgKi9cbiAgICBucG1QdWJsaXNoZXNSb290OiBib29sZWFuO1xuICB9O1xuICBtaXNlVGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuLy8gd2IncyByZWxlYXNlIHBsdWdpbiBwdWJsaXNoZXMgdGhlIG5wbSBwYWNrYWdlIGluIGl0cyByZXF1aXJlZCBwa2dSb290LlxuY29uc3QgbnBtUHVibGlzaGluZ1JlbGVhc2VQbHVnaW5zID0gbmV3IFNldChbJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScsICdAd2lsbGJvb3N0ZXIvd2IvcmVsZWFzZS1wbHVnaW4nXSk7XG5cbi8qKlxuICogVGhlIHNlbWFudGljLXJlbGVhc2UgY29uZmlnIGZpbGVzIHdiZnkgZXhwZWN0cywgaW4gY29zbWljb25maWcncyByZXNvbHV0aW9uIG9yZGVyICh0aGUgbGVhZGluZ1xuICogcGFja2FnZS5qc29uIGVudHJ5IGlzIGNoZWNrZWQgYnkgdGhlIGNhbGxlcikuIHdiZnkgZ2VuZXJhdGVzIC5yZWxlYXNlcmMuanNvbjsgdGhlIG90aGVyIHNwZWxsaW5nc1xuICogYXJlIGxpc3RlZCBvbmx5IHRvIGRldGVjdCBhIGhhbmQtd3JpdHRlbiBjb25maWcsIHdob3NlIGZvcm1hdCBKU09OLnBhcnNlIGNhbm5vdCByZWFkIGFuZCB3aG9zZVxuICogcGx1Z2luIGxpc3QgaXMgdGhlcmVmb3JlIHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZS5cbiAqL1xuY29uc3Qgc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzOiB7IGZpbGVOYW1lOiBzdHJpbmc7IGpzb25QYXJzZWFibGU6IGJvb2xlYW4gfVtdID0gW1xuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IGlzUm9vdD86IGJvb2xlYW4gfVxuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gZmFsc2U7XG4gICAgbGV0IHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290ID0gZmFsc2U7XG4gICAgLy8gVGhlIEZJUlNUIGV4aXN0aW5nIHNlYXJjaCBwbGFjZSB3aW5zIChjb3NtaWNvbmZpZyBzaG9ydC1jaXJjdWl0cyksIHNvIGEgSlMvWUFNTC9UUyBjb25maWdcbiAgICAvLyBvciBhbiBgZXh0ZW5kc2AgcHJlc2V0IG1ha2VzIHRoZSBlZmZlY3RpdmUgcGx1Z2luIGxpc3Qgc3RhdGljYWxseSB1bmluc3BlY3RhYmxlIChtaXJyb3JzXG4gICAgLy8gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyBpbiB3YidzIHJlbGVhc2UudHMpLiBUcmVhdGluZyBpdCBhcyB1bmtub3duIGtlZXBzXG4gICAgLy8gYHJlbGVhc2UubnBtYCBjb25zZXJ2YXRpdmVseSB0cnVlLCBzbyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgbmV2ZXIgZm9yY2VzXG4gICAgLy8gYHByaXZhdGU6IHRydWVgIG9uIGEgbW9ub3JlcG8gdGhhdCBhY3R1YWxseSBwdWJsaXNoZXMgdG8gbnBtLlxuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdHlwZSBSZWxlYXNlQ29uZmlnID1cbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlcz86IHVua25vd247XG4gICAgICAgICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XSlbXTtcbiAgICAgICAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAvLyBjb3NtaWNvbmZpZyBzZWFyY2hlcyBwYWNrYWdlLmpzb24ncyBgcmVsZWFzZWAga2V5IEJFRk9SRSBhbnkgcmMvY29uZmlnIGZpbGVcbiAgICAgIC8vIChzZW1hbnRpYy1yZWxlYXNlIDI1IGRlbGVnYXRlcyB0byBjb3NtaWNvbmZpZyA5J3MgZGVmYXVsdCBzZWFyY2hQbGFjZXMpLlxuICAgICAgbGV0IHJlbGVhc2VDb25maWcgPSAocGFja2FnZUpzb24gYXMgeyByZWxlYXNlPzogUmVsZWFzZUNvbmZpZyB9KS5yZWxlYXNlO1xuICAgICAgaWYgKHJlbGVhc2VDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgICAgICBjb25zdCByZWxlYXNlcmNQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVsZWFzZXJjUGF0aCkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICghanNvblBhcnNlYWJsZSkge1xuICAgICAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBgLnJlbGVhc2VyY2AgYW5kIGAuY29uZmlnL3JlbGVhc2VyY2AgbWF5IGFsc28gaG9sZCBZQU1MOyBhIEpTT04ucGFyc2UgZmFpbHVyZSBsYW5kc1xuICAgICAgICAgIC8vIGluIHRoZSBjYXRjaCBiZWxvdyBhbmQgbWFya3MgdGhlIHBsdWdpbiBsaXN0IHVua25vd24gaW5zdGVhZCBvZiBzaWxlbnRseSByZXBvcnRpbmdcbiAgICAgICAgICAvLyBcIm5vIHBsdWdpbnNcIi5cbiAgICAgICAgICByZWxlYXNlQ29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjUGF0aCwgJ3V0ZjgnKSkgYXMgUmVsZWFzZUNvbmZpZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSBhY2NlcHRzIGEgc2NhbGFyIGJyYW5jaCBvciBicmFuY2ggb2JqZWN0cyAoeyBuYW1lLCBwcmVyZWxlYXNlLCAuLi4gfSk7XG4gICAgICAvLyBub3JtYWxpemUgdG8gcGxhaW4gYnJhbmNoIG5hbWVzIGZvciBjb25zdW1lcnMgc3VjaCBhcyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yLlxuICAgICAgY29uc3QgcmF3QnJhbmNoZXMgPSByZWxlYXNlQ29uZmlnPy5icmFuY2hlcztcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IChBcnJheS5pc0FycmF5KHJhd0JyYW5jaGVzKSA/IHJhd0JyYW5jaGVzIDogcmF3QnJhbmNoZXMgPT09IHVuZGVmaW5lZCA/IFtdIDogW3Jhd0JyYW5jaGVzXSlcbiAgICAgICAgLm1hcCgoYnJhbmNoOiB1bmtub3duKSA9PlxuICAgICAgICAgIHR5cGVvZiBicmFuY2ggPT09ICdzdHJpbmcnID8gYnJhbmNoIDogKGJyYW5jaCBhcyB7IG5hbWU/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5uYW1lXG4gICAgICAgIClcbiAgICAgICAgLmZpbHRlcigoYnJhbmNoTmFtZSk6IGJyYW5jaE5hbWUgaXMgc3RyaW5nID0+IHR5cGVvZiBicmFuY2hOYW1lID09PSAnc3RyaW5nJyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxlYXNlQ29uZmlnPy5wbHVnaW5zKSkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW5FbnRyeSBvZiByZWxlYXNlQ29uZmlnLnBsdWdpbnMpIHtcbiAgICAgICAgICBjb25zdCBbcGx1Z2luTmFtZSwgcGx1Z2luT3B0aW9uc10gPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KSA/IHBsdWdpbkVudHJ5IDogW3BsdWdpbkVudHJ5LCB1bmRlZmluZWRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTmFtZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLnB1c2gocGx1Z2luTmFtZSk7XG4gICAgICAgICAgaWYgKCFucG1QdWJsaXNoaW5nUmVsZWFzZVBsdWdpbnMuaGFzKHBsdWdpbk5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBXaXRoIHBrZ1Jvb3QgdGhlIHBsdWdpbiBwdWJsaXNoZXMgYW5vdGhlciBtYW5pZmVzdCAoaXQgcmVzb2x2ZXMgcGtnUm9vdCBhZ2FpbnN0IHRoZVxuICAgICAgICAgIC8vIHJlcG8gcm9vdCwgc28gYC5gIGFuZCBgLi9gIGJvdGggbWVhbiB0aGUgcm9vdCBpdHNlbGYpLCBhbmQgQHNlbWFudGljLXJlbGVhc2UvbnBtJ3NcbiAgICAgICAgICAvLyBucG1QdWJsaXNoOiBmYWxzZSBkaXNhYmxlcyBwdWJsaXNoaW5nIGVudGlyZWx5OyBvbmx5IHRoZSByZW1haW5pbmcgc2hhcGUgcHJvdmVzIHRoZVxuICAgICAgICAgIC8vIFJPT1QgaXMgcHVibGlzaGVkLlxuICAgICAgICAgIGNvbnN0IHBrZ1Jvb3QgPSBwbHVnaW5PcHRpb25zPy5wa2dSb290O1xuICAgICAgICAgIGNvbnN0IHB1Ymxpc2hlc1Jvb3QgPVxuICAgICAgICAgICAgKHBsdWdpbk5hbWUgIT09ICdAc2VtYW50aWMtcmVsZWFzZS9ucG0nIHx8IHBsdWdpbk9wdGlvbnM/Lm5wbVB1Ymxpc2ggIT09IGZhbHNlKSAmJlxuICAgICAgICAgICAgKHBrZ1Jvb3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAodHlwZW9mIHBrZ1Jvb3QgPT09ICdzdHJpbmcnICYmIHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwa2dSb290KSA9PT0gcGF0aC5yZXNvbHZlKGRpclBhdGgpKSk7XG4gICAgICAgICAgcmVsZWFzZU5wbVBsdWdpblB1Ymxpc2hlc1Jvb3QgfHw9IHB1Ymxpc2hlc1Jvb3Q7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVsZWFzZUNvbmZpZyAmJiByZWxlYXNlQ29uZmlnLmV4dGVuZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCBhbiBleHBsaWNpdCBwbHVnaW4gbGlzdCwgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgbGlzdCBhcHBsaWVzLCB3aGljaCBpbmNsdWRlc1xuICAgIC8vIEBzZW1hbnRpYy1yZWxlYXNlL25wbS5cbiAgICBjb25zdCB1c2VzU2VtYW50aWNSZWxlYXNlID0gISEoXG4gICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICk7XG5cbiAgICAvLyBUaGUgY2FsbGVyIG1heSBjbGFzc2lmeSBleHBsaWNpdGx5IChpbmRleC50cyBwYXNzZXMgZmFsc2UgZm9yIGV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlLFxuICAgIC8vIGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKTsgdGhlIGhldXJpc3RpYyBjbGFzc2lmaWVzIHRoZSBDTEkgZW50cnlcbiAgICAvLyBwYXRoIGl0c2VsZiwgc28gYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBhbmQgYHdiZnkgPHJlcG8+L2FwcHMvPGFwcD5gIGtlZXAgdGhlaXIgY2hpbGRcbiAgICAvLyBjbGFzc2lmaWNhdGlvbi5cbiAgICBjb25zdCBpc1Jvb3QgPSBvcHRpb25zPy5pc1Jvb3QgPz8gIWlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGgpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAvLyBGZXRjaCB2aXNpYmlsaXR5IGZvciB0aGUgQ0xJIGVudHJ5IGV2ZW4gd2hlbiBpdCBpcyBhIHdvcmtzcGFjZSBjaGlsZCAoYHdiZnlcbiAgICAvLyA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKTogZ2VuZXJhdG9ycyByZWFkIGlzUHVibGljUmVwbyBmcm9tIHRoZWlyIHJvb3RDb25maWcgcGFyYW1ldGVyLFxuICAgIC8vIHdoaWNoIElTIHRoZSBjaGlsZCBjb25maWcgaW4gdGhhdCBpbnZvY2F0aW9uLCBzbyBhIHN0dWIgYGZhbHNlYCB0aGVyZSB3b3VsZCBkcm9wIHRoZVxuICAgIC8vIHB1YmxpYy1yZXBvIHB1Ymxpc2hDb25maWcgaGFuZGxpbmcuIERpc2NvdmVyZWQgY2hpbGRyZW4gKG9wdGlvbnMuaXNSb290ID09PSBmYWxzZSkgc3RpbGxcbiAgICAvLyBza2lwIHRoZSBmZXRjaCDigJQgdGhleSBpbmhlcml0IHRoZSBlbmNsb3Npbmcgcm9vdCdzIHZpc2liaWxpdHkgdmlhIHJvb3RDb25maWcgaW5zdGVhZC5cbiAgICBpZiAob3B0aW9ucz8uaXNSb290ICE9PSBmYWxzZSkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE9ubHkgdGhlIHJvb3QgZmV0Y2hlcyByZXBvIGluZm8sIGFuZCB0aGF0IGZldGNoIG5lZWRzIG5ldHdvcmsgYW5kIGEgdG9rZW4sIHNvIGlkZW50aXR5LWRlcml2ZWRcbiAgICAvLyBmbGFncyBiZWxvdyB3b3VsZCBvdGhlcndpc2UgYmUgZmFsc2UgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlIGFuZCBmb3IgZXZlcnkgb2ZmbGluZSBvclxuICAgIC8vIHJhdGUtbGltaXRlZCBydW4uIFRoZSBnaXQgcmVtb3RlIGFuc3dlcnMgdGhlIHNhbWUgcXVlc3Rpb24gbG9jYWxseSwgZm9yIGV2ZXJ5IHBhY2thZ2UuXG4gICAgaWYgKCFyZXBvQXV0aG9yIHx8ICFyZXBvTmFtZSkge1xuICAgICAgW3JlcG9BdXRob3IsIHJlcG9OYW1lXSA9IGF3YWl0IHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuICAgIC8vIEJ1aWx0IGZyb20gdGhlIFJFU09MVkVEIGlkZW50aXR5IHNvIHdvcmtzcGFjZSBwYWNrYWdlcyBhbmQgb2ZmbGluZSBydW5zIGFsc28gZ2V0IGl0OyBjb25zdW1lcnMgZGVyaXZlXG4gICAgLy8gdGhlIG93bmVyIGZyb20gdGhpcyBmaWVsZCAoZS5nLiB0byBzZXQgYGF1dGhvcmApLlxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvQXV0aG9yICYmIHJlcG9OYW1lID8gYGdpdGh1Yjoke3JlcG9BdXRob3J9LyR7cmVwb05hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICAvLyBUYXVyaSBvZmZpY2lhbGx5IHN1cHBvcnRzIEpTT04sIEpTT041LCBhbmQgVE9NTCBjb25maWd1cmF0aW9uIGZvcm1hdHMuXG4gICAgY29uc3QgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyA9IFsndGF1cmkuY29uZi5qc29uJywgJ3RhdXJpLmNvbmYuanNvbjUnLCAnVGF1cmkudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NyYy10YXVyaScsIGZpbGVOYW1lKSlcbiAgICApO1xuICAgIC8vIFJvb3QtbGV2ZWwgXCJJblBhY2thZ2VzXCIgc2lnbmFscyBtdXN0IHNlZSBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdFxuICAgIC8vIGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSwgc28gc2NhbiBlYWNoIGRpc2NvdmVyZWQgd29ya3NwYWNlIGRpcmVjdG9yeS5cbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICB9KTtcbiAgICBjb25zdCBjb250YWluc0FueUluV29ya3NwYWNlcyA9IChwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgICB3b3Jrc3BhY2VTdWJEaXJQYXRocy5zb21lKCh3b3Jrc3BhY2VTdWJEaXJQYXRoKSA9PiBjb250YWluc0FueShwYXR0ZXJuLCB3b3Jrc3BhY2VTdWJEaXJQYXRoKSk7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyA9IGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpO1xuICAgIGNvbnN0IHdvcmtmbG93Q29udGVudHMgPSByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aCk7XG4gICAgY29uc3QgaW1wb3J0c1BsYXl3cmlnaHRBdFJ1bnRpbWUgPSBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0eXBlb2YgcmVwb0luZm8/LnByaXZhdGUgPT09ICdib29sZWFuJyxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQ2xvdWRmbGFyZTogZGV0ZWN0Q2xvdWRmbGFyZShwYWNrYWdlSnNvbiwgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZywgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgsIHJlcG9OYW1lKSxcbiAgICAgIGNhcmdvVG9tbERpclBhdGhzOiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aCksXG4gICAgICAvLyBBbHNvIGhvbm9yIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyBiZXlvbmQgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0cmVhdGluZyBhblxuICAgICAgLy8gYXBwcy8qLW9ubHkgbW9ub3JlcG8gYXMgYSBwbGFpbiBwYWNrYWdlIHdvdWxkIGRlbGV0ZSBpdHMgYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uIGluXG4gICAgICAvLyBnZW5lcmF0ZVBhY2thZ2VKc29uIGFuZCBza2lwIG1vbm9yZXBvLW9ubHkgY29udmVudGlvbnMgc3VjaCBhcyByb290IGBwcml2YXRlOiB0cnVlYC5cbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCkgfHwgd29ya3NwYWNlU3ViRGlyUGF0aHMubGVuZ3RoID4gMCxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIC8vIFJlY3Vyc2l2ZSBsaWtlIGRvZXNDb250YWluSmF2YTogbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yaWVzIGtlZXAgbGFuZ3VhZ2UgZGlyZWN0b3JpZXNcbiAgICAgIC8vIChlLmcuIFB5dGhvbiB0b29saW5nIG9yIE1hdmVuIG1vZHVsZXMpIG91dHNpZGUgdGhlIHJvb3QgYW5kIG91dHNpZGUgZGVjbGFyZWQgd29ya3NwYWNlcy5cbiAgICAgIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBjb250YWluc0FueSgnKiove3BvZXRyeS5sb2NrLHV2LmxvY2t9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBjb250YWluc0FueSgnKiovcG9tLnhtbCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluU2xpZGV2TWQ6IGNvbnRhaW5zQW55KCcqKi8qLnNsaWRldi5tZCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcyhcbiAgICAgICAgJ3NyYy10YXVyaS97dGF1cmkuY29uZi5qc29uLHRhdXJpLmNvbmYuanNvbjUsVGF1cmkudG9tbH0nXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JyksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygnKiovKi5qYXZhJyksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBjaGFrcmE6ICEhZGV2RGVwZW5kZW5jaWVzWydAY2hha3JhLXVpL2NsaSddLFxuICAgICAgICBkcml6emxlOiAhIWRlcGVuZGVuY2llc1snZHJpenpsZS1vcm0nXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZHJpenpsZS1raXQnXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICAvLyBBIGJhcmUgYHBsYXl3cmlnaHRgIGlzIGEgbGlicmFyeSwgZS5nLiB0aGUgcHJvdmlkZXIgb2YgYEB2aXRlc3QvYnJvd3Nlci1wbGF5d3JpZ2h0YC5cbiAgICAgICAgcGxheXdyaWdodFRlc3Q6ICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSxcbiAgICAgICAgcGxheXdyaWdodFJ1bnRpbWU6IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBzbGlkZXY6ICEhZGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHRhdXJpOlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICAgIHZpbmV4dDogISFkZXBlbmRlbmNpZXMudmluZXh0IHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpbmV4dCxcbiAgICAgICAgdml0ZTogISFkZXBlbmRlbmNpZXMudml0ZSB8fCAhIWRldkRlcGVuZGVuY2llcy52aXRlLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuc29tZSgocGx1Z2luTmFtZSkgPT4gbnBtUHVibGlzaGluZ1JlbGVhc2VQbHVnaW5zLmhhcyhwbHVnaW5OYW1lKSkgfHwgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgICAgICAgOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBucG1QdWJsaXNoZXNSb290OiByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCxcbiAgICAgIH0sXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwgfHxcbiAgICAgIC8vIEEgcmVwb3NpdG9yeSBjYW4gbGVnaXRpbWF0ZWx5IGNvbnRhaW4gb25seSBkb2N1bWVudGF0aW9uLiBJdHMgR2l0IG1ldGFkYXRhIGlzIGVub3VnaCB0b1xuICAgICAgLy8gZXN0YWJsaXNoIHRoYXQgdGhlIENMSSB0YXJnZXQgaXMgYSBwcm9qZWN0IHJvb3Q7IHJlcXVpcmluZyBhIGxhbmd1YWdlIG1hbmlmZXN0IGhlcmUgd291bGRcbiAgICAgIC8vIG1ha2Ugd2JmeSB1bmFibGUgdG8gY3JlYXRlIHRoZSBwYWNrYWdlLmpzb24gdGhhdCBpdCBtYW5hZ2VzIGZvciBzdWNoIHJlcG9zaXRvcmllcy4gQm90aFxuICAgICAgLy8gb3JkaW5hcnkgY2hlY2tvdXRzIChgLmdpdGAgZGlyZWN0b3J5KSBhbmQgd29ya3RyZWVzIChgLmdpdGAgZmlsZSkgc2F0aXNmeSB0aGlzIGNoZWNrLlxuICAgICAgKGNvbmZpZy5pc1Jvb3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXQnKSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB3YmZ5IG1hbmFnZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuIFRoZSBmaWxlIGlzIGdpdGlnbm9yZWQgYW5kIHVudHJhY2tlZFxuICogYmVjYXVzZSB0aGUgYHdiIGdlbi1jb2RlYCBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCBvbiBldmVyeSBpbnN0YWxsLCBzbyB0aGUgcGFja2FnZSBoYXMgdG8gb3duIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyAoYHdyYW5nbGVyIHR5cGVzYCBleGl0cyBub24temVybyB3aXRob3V0IG9uZSksIHRvIGRlcGVuZCBvbiB3cmFuZ2xlciAoYSBwYWNrYWdlIGRlcGxveWluZyB2aWEgYVxuICogQ0kgYWN0aW9uIGNhbm5vdCByZXNvbHZlIHRoZSBjb21tYW5kKSwgYW5kIHRvIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCBmaWxlLlxuICpcbiAqIElOVkFSSUFOVCDigJQgdGhpcyBkZWNpc2lvbiBtdXN0IGNvbnZlcmdlIGFjcm9zcyBtYWNoaW5lcyBob2xkaW5nIHRoZSBzYW1lIGNvbW1pdC4gSXQgbXVzdCBORVZFUiBjb25zdWx0XG4gKiBnaXRpZ25vcmVkIGZpbGVzIChgLmRldi52YXJzKmAsIGAuZW52KmAsIC4uLiksIHdoaWNoIGB3YiBzdGFydGAgYW5kIGB3YiBkZXBsb3lgIGNyZWF0ZSByb3V0aW5lbHkgYW5kIHdoaWNoXG4gKiB0aGVyZWZvcmUgc3RheSB1bnRyYWNrZWQgb24gZGV2IG1hY2hpbmVzIGZvcmV2ZXI6IGEgZm9ybWVyIGNoZWNrIHRoYXQgdHJlYXRlZCB0aGVtIGFzIGlycmVwcm9kdWNpYmxlIGlucHV0c1xuICogbWFkZSB3YmZ5IHJ1bnMgb24gZGV2IG1hY2hpbmVzIHJlLXRyYWNrIHRoZSB+MTVrLWxpbmUgZ2VuZXJhdGVkIGZpbGUgdGhhdCBydW5zIGZyb20gY2xlYW4gY2hlY2tvdXRzIGhhZFxuICogdW50cmFja2VkLCBvc2NpbGxhdGluZyBldGVybmFsbHkgKGUuZy4gYWktZ2FtZS1idWlsZGVyICM2ODQg4oaSICM3NDYpLiBSZWFkaW5nIGNvbW1pdHRhYmxlIHJlcG9zaXRvcnkgZmlsZXNcbiAqIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAodGhlIHdyYW5nbGVyIGNvbmZpZywgcGFja2FnZS5qc29uLCB0c2NvbmZpZyDigJQgYXMgZXZlcnkgd2JmeSBnZW5lcmF0b3IgZG9lcykgaXMgZmluZTpcbiAqIGFueSBkaXZlcmdlbmNlIHRoZXJlIGlzIHRyYW5zaWVudCBhbmQgZGlzYXBwZWFycyBvbmNlIHRoZSBmaWxlIGlzIGNvbW1pdHRlZCBvciByZW1vdmVkLlxuICogVGhlIGhhemFyZCB0aGF0IGNoZWNrIGd1YXJkZWQgYWdhaW5zdCBubyBsb25nZXIgZXhpc3RzOiBgd2IgZ2VuLWNvZGVgIHJ1bnMgYHdyYW5nbGVyIHR5cGVzIC0tZW52LWZpbGVgIHdpdGhcbiAqIGEga2V5IHN0dWIgZGVyaXZlZCBzb2xlbHkgZnJvbSB0aGUgY29tbWl0dGVkIGZub3gudG9tbCAoc2VlIHdiJ3Mgd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIpLCBzbyBsb2NhbCBkb3RlbnZcbiAqIGZpbGVzIG5ldmVyIGluZmx1ZW5jZSB0aGUgZ2VuZXJhdGVkIGBFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcgJiYgaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uKSAmJiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncGFja2FnZUpzb24nPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNjcmlwdHMgPSBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQpO1xuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSA9IHNlZ21lbnRzPy5zb21lKChzZWdtZW50KSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC9eKD86KD86YnVufGJ1bngpKD86IC0tYnVuKT8oPzogcnVuKT8gKT93YiBnZW4tY29kZSQvdS50ZXN0KG5vcm1hbGl6ZWQpICYmXG4gICAgICAgIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSkgcmV0dXJuIGAke25hbWV9IG11c3QgdXNlIHRoZSBjYW5vbmljYWwgYnVuIHdiIGdlbi1jb2RlIGNvbW1hbmRgO1xuICB9XG4gIC8vIE9ubHkgYGJ1biBydW4gPHNjcmlwdD5gIGlzIHJlY29nbml6ZWQgYXMgYSB3cmFwcGVyOyBhbm90aGVyIHJ1bm5lciBzcGVsbGluZyB3b3VsZCBnZXQgYSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24gYXBwZW5kZWQgbmV4dCB0byBpdCBhbmQgcnVuIGV2ZXJ5IGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC4gV2l0aG91dCBhIGdlbi1jb2RlXG4gIC8vIHBpcGVsaW5lIG5vdGhpbmcgaXMgYXBwZW5kZWQsIHNvIHRoZSBzcGVsbGluZyBpcyBpcnJlbGV2YW50IHRoZXJlLlxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnKSA/PyBbXSkge1xuICAgIGNvbnN0IHNjcmlwdE5hbWUgPSAvXig/OmJ1bnxidW54KSg/OlxccystLWJ1bik/KD86XFxzK3J1bik/XFxzKyhcXFMrKSQvdS5leGVjKHNlZ21lbnQpPy5bMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICBpZiAoXG4gICAgICB0YXJnZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgc2VnbWVudCAhPT0gYGJ1biBydW4gJHtzY3JpcHROYW1lfWAgJiZcbiAgICAgIChzY3JpcHRzWydnZW4tY29kZSddICE9PSB1bmRlZmluZWQgfHwgdGFyZ2V0LmluY2x1ZGVzKCd3YiBnZW4tY29kZScpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGBwb3N0aW5zdGFsbCBtdXN0IGludm9rZSB0aGUgJHtzY3JpcHROYW1lfSBzY3JpcHQgYXMgYnVuIHJ1biAke3NjcmlwdE5hbWV9YDtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIC8oPzpefCYmKVxccyooPzpucG18bnB4fHBucG18eWFybilcXHMrKD86cnVuKD86LXNjcmlwdCk/XFxzKyk/KD86Z2VuLWNvZGV8d2JcXHMrZ2VuLWNvZGUpXFxzKig/OiYmfCQpL3UudGVzdChcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPz8gJydcbiAgICApXG4gICkge1xuICAgIHJldHVybiAncG9zdGluc3RhbGwgbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2YgYSBub24tQnVuIGdlbi1jb2RlIHJ1bm5lcic7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChzY3JpcHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSBidW4gd2IgZ2VuLWNvZGUgaW5zdGVhZCBvZiB3cmFuZ2xlciB0eXBlc2A7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gW1xuICAgIHBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8ub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LnBlZXJEZXBlbmRlbmNpZXMsXG4gIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBkZXBlbmRlbmNpZXM/LndyYW5nbGVyICE9PSB1bmRlZmluZWQpO1xufVxuXG5jb25zdCBzaGVsbFdvcmRQYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpcIig/OlxcXFwufFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxdKSonfCg/OlxcXFwufFteXFxzXCInXFxcXF0pKylgO1xuY29uc3Qgd3JhbmdsZXJPcHRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2BcXHMrLS0/W0EtWmEtel1bXFx3LV0qKD86PSR7c2hlbGxXb3JkUGF0dGVybn18XFxzKyg/IS18dHlwZXNcXGIpJHtzaGVsbFdvcmRQYXR0ZXJufSk/YDtcbmNvbnN0IHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gIFN0cmluZy5yYXdgW1wiJ10/XFxid3JhbmdsZXIoPzpAW15cXHNcIiddKyk/XFxiW1wiJ10/KD86JHt3cmFuZ2xlck9wdGlvblBhdHRlcm59KSpcXHMrdHlwZXNcXGJgLFxuICAndSdcbik7XG5cbi8qKlxuICogQSBwYWNrYWdlIHdob3NlIFR5cGVTY3JpcHQgcHJvamVjdCBjYW5ub3QgaW5jbHVkZSB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIChlLmcuIG9uZSBvbiBhIGhhbmQtbWFpbnRhaW5lZFxuICogbWluaW1hbCBgRW52YCB3aXRoIGB0eXBlczogW1wiYnVuXCJdYCwgdGhlIHN0YW5kYXJkIGVzY2FwZSB3aGVuIHRoZSBhbWJpZW50IHdyYW5nbGVyIGdsb2JhbHMgY29uZmxpY3Qgd2l0aCB0aGVcbiAqIGBAdHlwZXMvYnVuYCBnbG9iYWxzIGl0cyB0ZXN0cyBuZWVkKSBnYWlucyBub3RoaW5nIGZyb20gcmVnZW5lcmF0aW5nIHRoZSB+NTAwS0IgZmlsZSBvbiBldmVyeSBpbnN0YWxsLCBzbyB3YmZ5XG4gKiBsZWF2ZXMgc3VjaCBwYWNrYWdlcyB1bm1hbmFnZWQgaW5zdGVhZCBvZiByZS1hZGRpbmcgdGhlIGdlbmVyYXRpb24gc3RlcC4gQ29uc3VtcHRpb24gaXMgZGV0ZWN0ZWQgdHdvIHdheXM6XG4gKiBhIHRleHR1YWwgYHdvcmtlci1jb25maWd1cmF0aW9uYCByZWZlcmVuY2UgaW4gYW55IHRyYWNrZWQgZmlsZSBvZiB0aGUgcGFja2FnZSAoY292ZXJzIGltcG9ydHMsIHRyaXBsZS1zbGFzaFxuICogcmVmZXJlbmNlcywgYW5kIGV4cGxpY2l0IHRzY29uZmlnIGVudHJpZXMpLCBvciBhIGBmaWxlc2AvYGluY2x1ZGVgL2BleGNsdWRlYCBzZXQgdGhhdCBjYW4gbWF0Y2ggdGhlIGZpbGUg4oCUXG4gKiByZXNvbHZlZCB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnMgd2l0aCBlYWNoIHBhdHRlcm4ga2VwdCByZWxhdGl2ZSB0byB0aGUgY29uZmlnIHRoYXQgZGVjbGFyZWQgaXQsXG4gKiBtYXRjaGluZyB0c2MuIFdoZW5ldmVyIHRoZSBlZmZlY3RpdmUgc2V0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIChtaXNzaW5nIG9yIHVucGFyc2VhYmxlIHRzY29uZmlnLCBwYWNrYWdlLW5hbWVcbiAqIGBleHRlbmRzYCBwcmVzZXRzLCBvciBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiksIHRoZSBjdXJyZW50IG1hbmFnZWQgYmVoYXZpb3IgaXMga2VwdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJz4pOiBib29sZWFuIHtcbiAgLy8gYGdpdCBncmVwYCBzZWFyY2hlcyB0cmFja2VkIGZpbGVzIG9ubHksIHNvIHRoZSBnaXRpZ25vcmVkIGdlbmVyYXRlZCBmaWxlIGl0c2VsZiBuZXZlciBtYXRjaGVzLlxuICAvLyB3YmZ5J3Mgb3duIG1hbmFnZWQgYXJ0aWZhY3RzIGFyZSBleGNsdWRlZDogdGhlIGAuZ2l0aWdub3JlYCBydWxlIChgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNgKVxuICAvLyB3YmZ5IGNvbW1pdHRlZCB3aGlsZSBpdCBtYW5hZ2VkIHRoZSBwYWNrYWdlIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLCBvciBhIG9uY2UtbWFuYWdlZFxuICAvLyBwYWNrYWdlIGNvdWxkIG5ldmVyIG9wdCBvdXQuXG4gIGNvbnN0IGdyZXBSZXN1bHQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ2dpdCcsXG4gICAgLy8gdHNjb25maWcgZmlsZXMgYXJlIGNsYXNzaWZpZWQgYnkgdGhlIHJlc29sdmVkIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSBsb2dpYyBiZWxvdyDigJQgYSB0ZXh0dWFsXG4gICAgLy8gaGl0IHRoZXJlIChlLmcuIGFuIGBleGNsdWRlYCBlbnRyeSkgbXVzdCBub3QgY291bnQgYXMgY29uc3VtcHRpb24uXG4gICAgW1xuICAgICAgJ2dyZXAnLFxuICAgICAgJy1sJyxcbiAgICAgICd3b3JrZXItY29uZmlndXJhdGlvbicsXG4gICAgICAnLS0nLFxuICAgICAgJy4nLFxuICAgICAgJzooZXhjbHVkZSkuZ2l0aWdub3JlJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGF0dHJpYnV0ZXMnLFxuICAgICAgU3RyaW5nLnJhd2A6KGdsb2IsZXhjbHVkZSkqKi90c2NvbmZpZyouanNvbmAsXG4gICAgXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xuICBpZiAoZ3JlcFJlc3VsdC50cmltKCkpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgY29uc3QgZmlsZVNldCA9IHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpLCBjb25maWcuZGlyUGF0aCwgNSk7XG4gIGlmICghZmlsZVNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1hdGNoZXMgPSAocGF0dGVyblNldDogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFwYXR0ZXJuU2V0IHx8ICFBcnJheS5pc0FycmF5KHBhdHRlcm5TZXQucGF0dGVybnMpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYXR0ZXJuU2V0LmJhc2VEaXJQYXRoLCB3b3JrZXJUeXBlc1BhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgIHJldHVybiBwYXR0ZXJuU2V0LnBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIGAke2NvbmZpZ0Rpcn1gLXByZWZpeGVkIHBhdHRlcm5zIHdlcmUgZXhwYW5kZWQgdG8gYWJzb2x1dGUgcGF0aHMgYXQgcmVzb2x2ZSB0aW1lLlxuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgd29ya2VyVHlwZXNQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgICB9XG4gICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuLCByZWxhdGl2ZVBhdGgsIHBhdHRlcm5TZXQuZXhwYW5kc0RpcmVjdG9yaWVzKTtcbiAgICB9KTtcbiAgfTtcbiAgLy8gYGZpbGVzYCBlbnRyaWVzIGFyZSBhbHdheXMgcGFydCBvZiB0aGUgcHJvZ3JhbSwgZXZlbiB3aGVuIGBleGNsdWRlYCBtYXRjaGVzIHRoZW0uXG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZmlsZXMpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG1hdGNoZXMoZmlsZVNldC5leGNsdWRlKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBOZWl0aGVyIGluY2x1ZGUgbm9yIGZpbGVzIGRlY2xhcmVkOiBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiBjb3ZlcnMgdGhlIGZpbGUuXG4gIGlmICghZmlsZVNldC5pbmNsdWRlICYmICFmaWxlU2V0LmZpbGVzKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIG1hdGNoZXMoZmlsZVNldC5pbmNsdWRlKTtcbn1cblxuaW50ZXJmYWNlIFRzY29uZmlnUGF0dGVyblNldCB7XG4gIC8qKiBEaXJlY3Rvcnkgb2YgdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIHRoZSBwYXR0ZXJuczsgdHNjIHJlc29sdmVzIHRoZW0gcmVsYXRpdmUgdG8gaXQuICovXG4gIGJhc2VEaXJQYXRoOiBzdHJpbmc7XG4gIC8qKiBpbmNsdWRlL2V4Y2x1ZGUgdHJlYXQgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBwYXR0ZXJuIGFzIGEgZGlyZWN0b3J5IHN1YnRyZWU7IGBmaWxlc2AgZG9lcyBub3QuICovXG4gIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbjtcbiAgcGF0dGVybnM6IHVua25vd247XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ0ZpbGVTZXQge1xuICBleGNsdWRlPzogVHNjb25maWdQYXR0ZXJuU2V0O1xuICBmaWxlcz86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgaW5jbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbn1cblxuLyoqIFJlc29sdmVzIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnM7IHVuZGVmaW5lZCB3aGVuIHVucmVhZGFibGUuICovXG5mdW5jdGlvbiByZXNvbHZlVHNjb25maWdGaWxlU2V0KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25zdW1lckRpclBhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nRGVwdGg6IG51bWJlclxuKTogVHNjb25maWdGaWxlU2V0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlbWFpbmluZ0RlcHRoIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCB0c2NvbmZpZyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8e1xuICAgIGV4Y2x1ZGU/OiB1bmtub3duO1xuICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIGZpbGVzPzogdW5rbm93bjtcbiAgICBpbmNsdWRlPzogdW5rbm93bjtcbiAgfT4oY29udGVudCk7XG4gIGlmICghdHNjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICAvLyBgJHtjb25maWdEaXJ9YCByZXNvbHZlcyB0byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBST09UIChjb25zdW1pbmcpIGNvbmZpZywgd2hlcmV2ZXIgaXQgYXBwZWFycy5cbiAgY29uc3QgdG9QYXR0ZXJuU2V0ID0gKHBhdHRlcm5zOiB1bmtub3duLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBUc2NvbmZpZ1BhdHRlcm5TZXQgfCB1bmRlZmluZWQgPT5cbiAgICBBcnJheS5pc0FycmF5KHBhdHRlcm5zKVxuICAgICAgPyB7XG4gICAgICAgICAgYmFzZURpclBhdGg6IGRpclBhdGgsXG4gICAgICAgICAgZXhwYW5kc0RpcmVjdG9yaWVzLFxuICAgICAgICAgIHBhdHRlcm5zOiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+XG4gICAgICAgICAgICB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycgJiYgcGF0dGVybi5zdGFydHNXaXRoKCcke2NvbmZpZ0Rpcn0nKVxuICAgICAgICAgICAgICA/IHBhdGguam9pbihjb25zdW1lckRpclBhdGgsIHBhdHRlcm4uc2xpY2UoJyR7Y29uZmlnRGlyfScubGVuZ3RoKSlcbiAgICAgICAgICAgICAgOiBwYXR0ZXJuXG4gICAgICAgICAgKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbGVTZXQ6IFRzY29uZmlnRmlsZVNldCA9IHtcbiAgICBleGNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZXhjbHVkZSwgdHJ1ZSksXG4gICAgZmlsZXM6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5maWxlcywgZmFsc2UpLFxuICAgIGluY2x1ZGU6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5pbmNsdWRlLCB0cnVlKSxcbiAgfTtcbiAgY29uc3QgcGFyZW50cyA9XG4gICAgdHlwZW9mIHRzY29uZmlnLmV4dGVuZHMgPT09ICdzdHJpbmcnID8gW3RzY29uZmlnLmV4dGVuZHNdIDogQXJyYXkuaXNBcnJheSh0c2NvbmZpZy5leHRlbmRzKSA/IHRzY29uZmlnLmV4dGVuZHMgOiBbXTtcbiAgLy8gV2l0aCBhbiBgZXh0ZW5kc2AgYXJyYXksIGxhdGVyIGVudHJpZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzLCBhbmQgdGhlIGNoaWxkIG92ZXJyaWRlcyBhbGwg4oCUXG4gIC8vIHNvIGZpbGwgZWFjaCBzdGlsbC1taXNzaW5nIGtleSBmcm9tIHRoZSBsYXN0IHBhcmVudCB0aGF0IGRlZmluZXMgaXQuXG4gIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMudG9SZXZlcnNlZCgpKSB7XG4gICAgaWYgKGZpbGVTZXQuZXhjbHVkZSAmJiBmaWxlU2V0LmZpbGVzICYmIGZpbGVTZXQuaW5jbHVkZSkgYnJlYWs7XG4gICAgLy8gUGFja2FnZS1uYW1lIGV4dGVuZHMgKGUuZy4gYEB0c2NvbmZpZy9idW5gKSBhcmUgY29tcGlsZXJPcHRpb25zIHByZXNldHMgd2l0aG91dCBmaWxlIHNldHMuXG4gICAgaWYgKHR5cGVvZiBwYXJlbnQgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnQuc3RhcnRzV2l0aCgnLicpKSBjb250aW51ZTtcbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwYXJlbnQpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXJlbnRQYXRoKSAmJiBmcy5leGlzdHNTeW5jKGAke3BhcmVudFBhdGh9Lmpzb25gKSkgcGFyZW50UGF0aCArPSAnLmpzb24nO1xuICAgIGNvbnN0IHBhcmVudEZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhcmVudFBhdGgsIGNvbnN1bWVyRGlyUGF0aCwgcmVtYWluaW5nRGVwdGggLSAxKTtcbiAgICBpZiAoIXBhcmVudEZpbGVTZXQpIGNvbnRpbnVlO1xuICAgIGZpbGVTZXQuZXhjbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5leGNsdWRlO1xuICAgIGZpbGVTZXQuZmlsZXMgPz89IHBhcmVudEZpbGVTZXQuZmlsZXM7XG4gICAgZmlsZVNldC5pbmNsdWRlID8/PSBwYXJlbnRGaWxlU2V0LmluY2x1ZGU7XG4gIH1cbiAgcmV0dXJuIGZpbGVTZXQ7XG59XG5cbmZ1bmN0aW9uIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdHRlcm4ucmVwbGFjZSgvXlxcLlxcLy91LCAnJyk7XG4gIC8vIEEgYmFyZSBgLmAgaW5jbHVkZSBjb3ZlcnMgZXZlcnl0aGluZyB1bmRlciB0aGUgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICBpZiAobm9ybWFsaXplZCA9PT0gJycgfHwgbm9ybWFsaXplZCA9PT0gJy4nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gQWJzb2x1dGUgcGF0dGVybnMgKGV4cGFuZGVkIGAke2NvbmZpZ0Rpcn1gKSBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSB0YXJnZXQ7IGRyb3AgdGhlXG4gIC8vIGxlYWRpbmcgc2xhc2hlcyBmcm9tIGJvdGggc28gdGhlIHNlZ21lbnQtYnVpbHQgcmVnZXggYW5jaG9ycyBpZGVudGljYWxseS5cbiAgdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXlxcLysvdSwgJycpO1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgIT09ICcnKTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBzZWdtZW50c1xuICAgIC5tYXAoKHNlZ21lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChzZWdtZW50ID09PSAnKionKSByZXR1cm4gaXNMYXN0ID8gJy4qJyA6IFN0cmluZy5yYXdgKD86W14vXSsvKSpgO1xuICAgICAgY29uc3Qgc2VnbWVudFNvdXJjZSA9IHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgU3RyaW5nLnJhd2BbXi9dKmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgU3RyaW5nLnJhd2BbXi9dYCk7XG4gICAgICByZXR1cm4gaXNMYXN0ID8gc2VnbWVudFNvdXJjZSA6IGAke3NlZ21lbnRTb3VyY2V9L2A7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG4gIC8vIHRzYyB0cmVhdHMgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBpbmNsdWRlL2V4Y2x1ZGUgZW50cnkgYXMgYSBkaXJlY3Rvcnkgd2hvc2Ugc3VidHJlZSBpcyBpbmNsdWRlZC5cbiAgY29uc3QgbGFzdFNlZ21lbnQgPSBzZWdtZW50cy5hdCgtMSkgPz8gJyc7XG4gIGNvbnN0IGRpcmVjdG9yeVN1ZmZpeCA9XG4gICAgZXhwYW5kc0RpcmVjdG9yaWVzICYmICEvWyo/XS91LnRlc3QobGFzdFNlZ21lbnQpICYmICFsYXN0U2VnbWVudC5pbmNsdWRlcygnLicpID8gU3RyaW5nLnJhd2AoPzovLiopP2AgOiAnJztcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSR7ZGlyZWN0b3J5U3VmZml4fSRgLCAndScpLnRlc3QodGFyZ2V0UGF0aCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB0aGUgZGlyZWN0b3J5IG93bnMgYSBXb3JrZXIsIHVubGlrZSB0aGUgaXNDbG91ZGZsYXJlIGhldXJpc3RpYywgd2hpY2ggYWxzbyBtYXRjaGVzIGEgcGFja2FnZSB0aGF0XG4gKiBtZXJlbHkgbWVudGlvbnMgd3JhbmdsZXIgaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cgKGUuZy4gdGhlIHJvb3Qgb2YgYSBtb25vcmVwbyB3aG9zZSBXb3JrZXIgbGl2ZXMgaW4gYSBzdWItcGFja2FnZSkuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGRpclBhdGggYmVsb25ncyB0byB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByZXBvc2l0b3J5LiBQcmVmZXJzIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBHaXRIdWIgcmVwbyBuYW1lLCB3aGljaCBpcyBpbW11bmUgdG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBsYXlvdXQuIFRoYXQgbmFtZSBpcyBmZXRjaGVkIG9ubHkgZm9yIHRoZVxuICogcm9vdCwgc28gc3ViLXBhY2thZ2VzIChhbmQgb2ZmbGluZSByb290cykgd2FsayB1cCB0byB0aGUgbmVhcmVzdCBnaXQgcm9vdCBhbmQgbWF0Y2ggaXRzIGRpcmVjdG9yeVxuICogbmFtZTogYSBzaWJsaW5nIHJlcG8gY2xvbmVkIHVuZGVyIGEgcGFyZW50IGRpcmVjdG9yeSBuYW1lZCB3aWxsYm9vc3Rlci1jb25maWdzIHN0b3BzIGF0IGl0cyBvd25cbiAqIGAuZ2l0YCwgc28gaXQgaXMgbm90IG1pc2NsYXNzaWZpZWQuIFRoZSBwYXRoIHNlZ21lbnQgcmVtYWlucyBhIGxhc3QgcmVzb3J0IHdoZW4gbm8gZ2l0IHJvb3QgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmIChyZXBvTmFtZSkgcmV0dXJuIHJlcG9OYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgbGV0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBwYXRoLmRpcm5hbWUoY3VycmVudCkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5naXQnKSkpIHtcbiAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGN1cnJlbnQpLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgICB9XG4gICAgY3VycmVudCA9IHBhdGguZGlybmFtZShjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gcGFja2FnZUpzb25QYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJy93aWxsYm9vc3Rlci1jb25maWdzLycpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RDbG91ZGZsYXJlKFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW4sXG4gIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIGlmIChzY3JpcHRzICYmIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiBzY3JpcHQuaW5jbHVkZXMoJ3dyYW5nbGVyJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL2Nsb3VkZmxhcmV8d3JhbmdsZXIvaXUudGVzdChjb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFJhaWx3YXkoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCdyYWlsd2F5JykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3JhaWx3YXkuanNvbicpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5LnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJhaWx3YXknLCAncmFpbHdheS50cycpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd0NvbnRlbnRzLnNvbWUoKGNvbnRlbnQpID0+IC9yYWlsd2F5L2l1LnRlc3QoY29udGVudCkpO1xufVxuXG4vKiogQ29udGVudHMgb2YgdGhlIHJlYWRhYmxlIC5naXRodWIvd29ya2Zsb3dzIFlBTUwgZmlsZXMsIHJlYWQgb25jZSBmb3IgZXZlcnkgZGV0ZWN0b3IgbmVlZGluZyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVhZFdvcmtmbG93RmlsZUNvbnRlbnRzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnNcbiAgICAgIC5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKVxuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IC9cXC55YT9tbCQvaXUudGVzdChmaWxlTmFtZSkpXG4gICAgICAuZmxhdE1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gW2ZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpXTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNaXNlVGFza3MoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IHRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgeyB0YXNrcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MudGFza3MgPz8ge30pKSB7XG4gICAgICAgIHRhc2tzW25hbWVdID0gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIG9yIHRlbXBvcmFyaWx5IGludmFsaWQgbWlzZSBmaWxlcyBzaG91bGQgbm90IGJsb2NrIG90aGVyIHdiZnkgZ2VuZXJhdG9ycy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhc2tzO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgLy8gUHJlc2VydmUgYXJyYXktZm9ybSBtaXNlIGNvbW1hbmRzIHNvIHJlY3Vyc2lvbiBjaGVja3MgY2FuIHN0aWxsIHNlZSBwYWNrYWdlIHNjcmlwdCBjYWxscy5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbW1hbmQgPT09ICdzdHJpbmcnKS5qb2luKCdcXG4nKTtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiByZWFkTWlzZVRhc2tDb21tYW5kKCh2YWx1ZSBhcyB7IHJ1bj86IHVua25vd24gfSkucnVuKTtcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZGlyUGF0aCBpcyBhIGNoaWxkIHdvcmtzcGFjZSBvZiBhbiBlbmNsb3NpbmcgbW9ub3JlcG8gcm9vdDogZWl0aGVyIHRoZSBjb252ZW50aW9uYWxcbiAqIGA8cm9vdD4vcGFja2FnZXMvPG5hbWU+YCBsYXlvdXQsIG9yIGEgZGlyZWN0b3J5IG1hdGNoaW5nIGEgd29ya3NwYWNlIHBhdHRlcm4gZGVjbGFyZWQgYnkgYW5cbiAqIGFuY2VzdG9yIHBhY2thZ2UuanNvbiAocGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXAsIGUuZy4gYGV4YW1wbGVzLyoqYCkuIFRoZSB3YWxrIHN0b3BzXG4gKiBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZyByZXBvc2l0b3J5J3Mgd29ya3NwYWNlcyBjYW5cbiAqIG5ldmVyIHJlY2xhc3NpZnkgYW4gaW5kZXBlbmRlbnQgcmVwb3NpdG9yeSBhcyBhIGNoaWxkLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZU9mRW5jbG9zaW5nUm9vdChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVzb2x2ZWREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAvLyBBIGRpcmVjdG9yeSB3aXRoIGl0cyBvd24gLmdpdCBpcyBhIHJlcG9zaXRvcnkgaW4gaXRzIG93biByaWdodCwgbmV2ZXIgYSBjaGlsZCB3b3Jrc3BhY2Ug4oCUXG4gIC8vIGNoZWNrZWQgRklSU1Qgc28gYW4gaW5kZXBlbmRlbnQgcmVwb3NpdG9yeSB1bmRlciBzb21lIGBwYWNrYWdlcy9gIGRpcmVjdG9yeSBzdGF5cyBhIHJvb3QuXG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuZ2l0JykpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuLicpKSA9PT0gJ3BhY2thZ2VzJyAmJlxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJlc29sdmVkRGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKFxuICAgIGxldCBjYW5kaWRhdGVSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShyZXNvbHZlZERpclBhdGgpO1xuICAgIDtcbiAgICBjYW5kaWRhdGVSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShjYW5kaWRhdGVSb290RGlyUGF0aClcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3RQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUoY2FuZGlkYXRlUm9vdERpclBhdGgsIHJlc29sdmVkRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoe1xuICAgICAgICBkaXJQYXRoOiBjYW5kaWRhdGVSb290RGlyUGF0aCxcbiAgICAgICAgcGFja2FnZUpzb246IHJvb3RQYWNrYWdlSnNvbixcbiAgICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGZhbHNlLFxuICAgICAgfSkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+IHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKTtcbiAgICAgIGlmICh3b3Jrc3BhY2VEaXJQYXRocy5pbmNsdWRlcyhyZWxhdGl2ZURpclBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vIG9yIHVucGFyc2FibGUgbWFuaWZlc3QgYXQgdGhpcyBhbmNlc3Rvcjoga2VlcCB3YWxraW5nLlxuICAgIH1cbiAgICBjb25zdCBpc1JlcG9Cb3VuZGFyeSA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gY2FuZGlkYXRlUm9vdERpclBhdGggPT09IHBhdGguZGlybmFtZShjYW5kaWRhdGVSb290RGlyUGF0aCk7XG4gICAgaWYgKGlzUmVwb0JvdW5kYXJ5IHx8IGlzRmlsZXN5c3RlbVJvb3QpIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIGZpbmRDYXJnb1RvbWxEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBmZ1xuICAgIC5nbG9iU3luYygnKiovQ2FyZ28udG9tbCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KVxuICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5zcGxpdCgnLycpLmxlbmd0aCAtIGIuc3BsaXQoJy8nKS5sZW5ndGggfHwgYS5sb2NhbGVDb21wYXJlKGIpKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UGxheXdyaWdodFJ1bnRpbWVJbXBvcnQoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVzID0gZmcuZ2xvYlN5bmMoJ3thcHAsc3JjfS8qKi8qLntjanMsY3RzLGpzLGpzeCxtanMsbXRzLHRzLHRzeH0nLCB7XG4gICAgZG90OiB0cnVlLFxuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAnKiovX190ZXN0c19fLyoqJywgJyoqLyouc3BlYy4qJywgJyoqLyoudGVzdC4qJywgJyoqL3BsYXl3cmlnaHQuY29uZmlnLionXSxcbiAgfSk7XG4gIGNvbnN0IHBsYXl3cmlnaHRJbXBvcnRQYXR0ZXJuID0gYnVpbGRSdW50aW1lSW1wb3J0UmVnRXhwKCdwbGF5d3JpZ2h0Jyk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGUpLCAndXRmOCcpO1xuICAgIGlmIChwbGF5d3JpZ2h0SW1wb3J0UGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUnVudGltZUltcG9ydFJlZ0V4cChwYWNrYWdlTmFtZTogc3RyaW5nKTogUmVnRXhwIHtcbiAgLy8gTWF0Y2ggdGhlIGJhcmUgc3BlY2lmaWVyIG9yIGFueSBzdWJwYXRoIG9mIGl0IChgcGtnYCAvIGBwa2cvc3ViYCksIGJ1dCBuZXZlciBhIGRpZmZlcmVudCBwYWNrYWdlXG4gIC8vIHRoYXQgbWVyZWx5IHNoYXJlcyB0aGUgcHJlZml4IChgcGtnLW90aGVyYCksIHNpbmNlIHRoZSBjaGFyIGFmdGVyIHRoZSBuYW1lIG11c3QgYmUgYC9gIG9yIGEgcXVvdGUuXG4gIGNvbnN0IHNwZWNpZmllciA9IFN0cmluZy5yYXdgWydcIl0ke2VzY2FwZVJlZ0V4cChwYWNrYWdlTmFtZSl9KD86L1teJ1wiXSopP1snXCJdYDtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgU3RyaW5nLnJhd2BcXGJmcm9tXFxzKyR7c3BlY2lmaWVyfXxcXGJpbXBvcnRcXHMqXFwoXFxzKiR7c3BlY2lmaWVyfVxccypcXCl8XFxicmVxdWlyZVxccypcXChcXHMqJHtzcGVjaWZpZXJ9XFxzKlxcKWAsXG4gICAgJ3UnXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlbW90ZVVybCA9IGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoKTtcbiAgaWYgKHJlbW90ZVVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvbi4gVGhlIG93bmVyIE1VU1QgYmUgcGFzc2VkOiBnZXRPY3Rva2l0KCkgd2l0aG91dCBpdCBwcmVmZXJzIHRoZVxuICAgIC8vIFdpbGxCb29zdGVyIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgcHJpdmF0ZSBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3JpZXMsIGNvbGxhcHNpbmcgdGhlaXJcbiAgICAvLyB2aXNpYmlsaXR5IHRvIHVua25vd24gKGFuZCBlLmcuIHNraXBwaW5nIHRoZSB3YmZ5IGNhbGxlciBnZW5lcmF0aW9uIGluZGVmaW5pdGVseSkuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG9yZykucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIC8vIFJlLWZldGNoIHVuZGVyIHRoZSByZWRpcmVjdGVkIGlkZW50aXR5IHNvIGEgcmVuYW1lZCByZXBvc2l0b3J5IHN0aWxsIGdldHMgY29tcGxldGVcbiAgICAgIC8vIG1ldGFkYXRhICh2aXNpYmlsaXR5IGluY2x1ZGVkKSBpbnN0ZWFkIG9mIGEgYmFyZSBmdWxsX25hbWUgdGhhdCB3b3VsZCBsZWF2ZVxuICAgICAgLy8gaXNSZXBvVmlzaWJpbGl0eUtub3duIGZhbHNlIG9uIGV2ZXJ5IHN1YnNlcXVlbnQgcnVuIHdpdGggdGhlIHN0YWxlIHJlbW90ZSBVUkwuXG4gICAgICBjb25zdCBbcmVkaXJlY3RlZE9yZywgcmVkaXJlY3RlZE5hbWVdID0gcmVkaXJlY3RlZEZ1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVkaXJlY3RlZE9yZyAmJiByZWRpcmVjdGVkTmFtZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChyZWRpcmVjdGVkT3JnKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXI6IHJlZGlyZWN0ZWRPcmcsXG4gICAgICAgICAgICByZXBvOiByZWRpcmVjdGVkTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiYXJlIGlkZW50aXR5IGJlbG93OiB0aGUgcmVwb3NpdG9yeSBpcyBzdGlsbCBjYW5vbmljYWxpemVkLCBvbmx5XG4gICAgICAgICAgLy8gaXRzIHZpc2liaWxpdHkgc3RheXMgdW5rbm93bi5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZnVsbF9uYW1lOiByZWRpcmVjdGVkRnVsbE5hbWUgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBgPG9yZz4vPG5hbWU+YCBmcm9tIHRoZSBnaXQgcmVtb3RlIChmYWxsaW5nIGJhY2sgdG8gcGFja2FnZS5qc29uJ3MgYHJlcG9zaXRvcnlgKSB3aXRob3V0XG4gKiBjYWxsaW5nIHRoZSBHaXRIdWIgQVBJLiBJdCB3b3JrcyBmb3IgZXZlcnkgd29ya3NwYWNlIHBhY2thZ2UsIG5vdCBqdXN0IHRoZSByb290IOKAlCBvbmx5IHRoZSByb290XG4gKiBmZXRjaGVzIHJlcG8gaW5mbyDigJQgYW5kIGl0IGtlZXBzIHdvcmtpbmcgb2ZmbGluZSBvciByYXRlLWxpbWl0ZWQsIHdoZXJlIGFuIHVuZGVmaW5lZCBpZGVudGl0eVxuICogd291bGQgc2lsZW50bHkgcmVjbGFzc2lmeSB0aGUgcmVwb3NpdG9yeSAoZS5nLiBtYWtpbmcgd2JmeSB3cml0ZSB3aWxsYm9vc3Rlci1jb25maWdzJyBSZW5vdmF0ZVxuICogcHJlc2V0IGludG8gdGhlIHByZXNldCBpdHNlbGYgYWdhaW4pLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlTG9jYWxSZXBvSWRlbnRpdHkoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBQcm9taXNlPFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZF0+IHtcbiAgY29uc3QgcmVtb3RlVXJsID0gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGgpO1xuICBpZiAocmVtb3RlVXJsKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSByZWFkR2l0SHViSWRlbnRpdHkocmVtb3RlVXJsKTtcbiAgICBpZiAoaWRlbnRpdHkpIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSByZWFkR2l0SHViSWRlbnRpdHkodXJsKTtcbiAgICBpZiAoaWRlbnRpdHkpIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JpZ2luUmVtb3RlVXJsKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ2dpdCcsIFsnY29uZmlnJywgJy0tZ2V0JywgJ3JlbW90ZS5vcmlnaW4udXJsJ10sIGRpclBhdGgpIHx8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBgZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lYCBpcyBob3N0LWFnbm9zdGljLCBzbyBpdCBoYXBwaWx5IHR1cm5zIGEgR2l0TGFiIFVSTCBpbnRvIGFuIGA8b3JnPi88cmVwbz5gIHBhaXIuXG4gKiBFdmVyeXRoaW5nIGRvd25zdHJlYW0gdHJlYXRzIHRoZSByZXN1bHRpbmcgaWRlbnRpdHkgYXMgR2l0SHViICh0aGUgYGdpdGh1YjpgIHJlcG9zaXRvcnkgZmllbGQgaXMgcmV3cml0dGVuXG4gKiBpbnRvIHBhY2thZ2UuanNvbiksIHNvIHRoZSBob3N0IG11c3QgYmUgdmVyaWZpZWQgZmlyc3Q7IGEgbm9uLUdpdEh1YiByZW1vdGUgeWllbGRzIG5vIGlkZW50aXR5LCBhcyBiZWZvcmUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRHaXRIdWJJZGVudGl0eSh1cmw6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10gfCB1bmRlZmluZWQge1xuICBpZiAoIXRhcmdldHNHaXRIdWIodXJsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsKTtcbiAgcmV0dXJuIG9yZyAmJiBuYW1lID8gW2Nhbm9uaWNhbGl6ZU93bmVyKG9yZyksIG5hbWVdIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIFVSTCdzIEhPU1QgaXMgZ2l0aHViLmNvbS4gUGFyc2VkIHJhdGhlciB0aGFuIHN1YnN0cmluZy1tYXRjaGVkOiBhIHBhdGggc3VjaCBhc1xuICogYGh0dHBzOi8vZ2l0bGFiLmNvbS9naXRodWIuY29tL293bmVyL3JlcG8uZ2l0YCB3b3VsZCBvdGhlcndpc2UgYmUgdGFrZW4gZm9yIEdpdEh1YiwgYW5kIGFuIHVwcGVyY2FzZVxuICogYEdJVEhVQi5DT01gIHdvdWxkIGJlIHJlamVjdGVkLiBgZ2l0aHViOm93bmVyL3JlcG9gIGlzIG5wbSdzIHNob3J0aGFuZCBhbmQgbmFtZXMgbm8gaG9zdCwgc28gaXQgaXNcbiAqIHJlY29nbml6ZWQgc2VwYXJhdGVseTsgbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIGFjY2VwdHMgdGhlIHNhbWUgc2hvcnRoYW5kLlxuICovXG5mdW5jdGlvbiB0YXJnZXRzR2l0SHViKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICgvXmdpdGh1YjovaXUudGVzdCh1cmwpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gc2NwLXN0eWxlIHJlbW90ZXMgKGBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvLmdpdGApIGFyZSBub3QgdmFsaWQgVVJMcy5cbiAgY29uc3Qgc2NwSG9zdCA9IC9eW14vQF0qQChbXjovXSspOi91LmV4ZWModXJsKT8uWzFdO1xuICBpZiAoc2NwSG9zdCkgcmV0dXJuIHNjcEhvc3QudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybC5yZXBsYWNlKC9eZ2l0XFwrL3UsICcnKSkuaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dpdGh1Yi5jb20nO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIGFuZCBhIHJlbW90ZSBvciBtYW5pZmVzdCBVUkwgbWF5IHNwZWxsIHRoZW0gYW55IHdheSwgYnV0IHRoZSBBUEknc1xuICogYGZ1bGxfbmFtZWAgYWx3YXlzIHJldHVybmVkIHRoZSBjYW5vbmljYWwgc3BlbGxpbmcg4oCUIHdoaWNoIHRoZSBtYW55IGV4YWN0IGA9PT0gJ1dpbGxCb29zdGVyJ2AgcG9saWN5IGNoZWNrc1xuICogKG9yZ2FuaXphdGlvbiB3b3JrZmxvd3MsIGF1dGhvciBtZXRhZGF0YSwgdGhlIFdpbGxCb29zdGVyTGFiIHByZS1wdXNoIGd1YXJkKSBkZXBlbmQgb24uIENhbm9uaWNhbGl6ZSBoZXJlIHNvXG4gKiB0aGUgbG9jYWwgZmFsbGJhY2sgeWllbGRzIHRoZSBzYW1lIGlkZW50aXR5IHRoZSBBUEkgZGlkLCBpbnN0ZWFkIG9mIHNpbGVudGx5IHNraXBwaW5nIHRob3NlIHBvbGljaWVzLlxuICovXG5mdW5jdGlvbiBjYW5vbmljYWxpemVPd25lcihvd25lcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2Fub25pY2FsT3duZXJzID0gWydXaWxsQm9vc3RlcicsICdXaWxsQm9vc3RlckxhYiddO1xuICByZXR1cm4gY2Fub25pY2FsT3duZXJzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnRvTG93ZXJDYXNlKCkgPT09IG93bmVyLnRvTG93ZXJDYXNlKCkpID8/IG93bmVyO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgSVNTVUVfVEVNUExBVEVfUlVMRVMsIFBVTExfUkVRVUVTVF9CT0RZX1JVTEVTLCBURVNUX1dSSVRJTkdfUlVMRVMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcnVuQWxsSW5Qb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdywgaW52b2tlc1diRGVwbG95IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290Q29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IHVzZXNXYkRlcGxveSA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiB7XG4gICAgICBjb25zdCBzY3JpcHRzID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9O1xuICAgICAgY29uc3QgZGVwbG95U2NyaXB0ID0gc2NyaXB0c1snZGVwbG95J107XG4gICAgICByZXR1cm4gdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiYgaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdCwgbmV3IFNldChPYmplY3Qua2V5cyhzY3JpcHRzKSkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHVzZXNXYkRlcGxveSwgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBydW5BbGxJblBvb2woW1xuICAgICAgLi4uKFxuICAgICAgICBbXG4gICAgICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgICAgIF0gYXMgY29uc3RcbiAgICAgICkubWFwKChbZmlsZU5hbWUsIHRvb2xOYW1lXSkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCB1c2VzV2JEZXBsb3ksIGV4dHJhQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgICB9KSxcbiAgICAgICgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpLFxuICAgIF0pO1xuICB9KTtcbn1cblxuY29uc3QgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuXG4vKipcbiAqIFJlYWRzIHRoZSByb290J3MgdXNlci1hdXRob3JlZCBBR0VOVFNfRVhUUkEubWQgb25jZSBwZXIgcHJvY2Vzczogd2JmeSBuZXZlciByZXdyaXRlcyB0aGUgZmlsZSxcbiAqIGFuZCBib3RoIHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBhbmQgR2VtaW5pIGdlbmVyYXRvcnMgbmVlZCBpdHMgY29udGVudC4gQ2FjaGluZyB0aGUgcmVzb2x2ZWRcbiAqIHZhbHVlIChub3QgdGhlIFByb21pc2UpIGlzIHJhY2UtZnJlZSBiZWNhdXNlIHRoZSB0d28gY2FsbGVycyBydW4gc2VxdWVudGlhbGx5IGluIGluZGV4LnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gIGlmICghYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuaGFzKGFnZW50c0V4dHJhUGF0aCkpIHtcbiAgICBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5zZXQoYWdlbnRzRXh0cmFQYXRoLCBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhhZ2VudHNFeHRyYVBhdGgpKTtcbiAgfVxuICByZXR1cm4gYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuZ2V0KGFnZW50c0V4dHJhUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB1c2VzV2JEZXBsb3k6IGJvb2xlYW4sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIHVzZXNXYkRlcGxveSwgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5leHBvcnQgY29uc3QgTEFOR1VBR0VfQk9VTkRfVEVYVF9FWENFUFRJT04gPVxuICAnZXhjZXB0IHRleHQgd2hvc2UgbGFuZ3VhZ2UgaXMgcGFydCBvZiB3aGF0IHRoZSBjb2RlIGhhbmRsZXMgKGUuZy4sIFVJIHN0cmluZ3MsIHRlc3QgaW5wdXRzKSc7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICB1c2VzV2JEZXBsb3k6IGJvb2xlYW4sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSAnYnVuJztcbiAgY29uc3QgZGVzY3JpcHRpb24gPSByb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbjtcbiAgY29uc3QgZm5veEluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpXG4gICAgPyBgXFxuLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHNlY3JldHMgbGl2ZSBpbiBcXGBmbm94LnRvbWxcXGAgKG1pc2UgKyBmbm94KTsgbmV2ZXIgY3JlYXRlIFxcYC5lbnZcXGAsIFxcYC5lbnYuKlxcYCwgb3IgXFxgLmRldi52YXJzXFxgIGZpbGVzLiBSdW4gY29tbWFuZHMgdGhyb3VnaCBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiAuLi5cXGAgb3IgXFxgZm5veCBydW4gLVAgPHByb2ZpbGU+IC0tIDxjb21tYW5kPlxcYC4gUHJvZmlsZSBzZWNyZXRzIGxvYWQgb25seSB3aGVuIGEgcHJvZmlsZSBpcyBzZWxlY3RlZDogbW9kZS1hd2FyZSB3YiBjb21tYW5kcyAoZS5nLiBcXGB3YiBzdGFydFxcYCwgXFxgd2IgdGVzdFxcYCkgYW5kIFxcYHdiIGRvdGVudlxcYCBzZWxlY3QgaXQgdGhlbXNlbHZlcyAoXFxgd2IgZG90ZW52XFxgIHVzZXMgXFxgV0JfRU5WXFxgLCBlbHNlIFxcYEZOT1hfUFJPRklMRVxcYCwgZWxzZSBcXGBOT0RFX0VOVlxcYCwgZWxzZSB0aGUgZGV2ZWxvcG1lbnQgcHJvZmlsZTsgXFxgV0JfRU5WXFxgIGFjY2VwdHMgb25seSBcXGBkZXZlbG9wbWVudFxcYC9cXGB0ZXN0XFxgL1xcYHN0YWdpbmdcXGAvXFxgcHJvZHVjdGlvblxcYCwgc28gdXNlIFxcYEZOT1hfUFJPRklMRVxcYCBmb3IgYW55IG90aGVyIHByb2ZpbGUpLCB3aGlsZSBiYXJlIFxcYGZub3ggcnVuXFxgIG5lZWRzIGFuIGV4cGxpY2l0IFxcYC1QIDxwcm9maWxlPlxcYC5gXG4gICAgOiAnJztcbiAgLy8gbWlzZSBvd25zIHRoZSBwaW5uZWQgdG9vbCB2ZXJzaW9ucywgc28gYSB2ZXJzaW9uIG1pc21hdGNoIGlzIGZpeGVkIGJ5IGVkaXRpbmcgbWlzZS50b21sIOKAlCBub3RcbiAgLy8gYnkgaW5zdGFsbGluZyBhIGRpZmZlcmVudCB2ZXJzaW9uIGdsb2JhbGx5LCB3aGljaCB0aGUgbmV4dCBgbWlzZSBpbnN0YWxsYCBzaWxlbnRseSBvdmVycmlkZXMuXG4gIGNvbnN0IG1pc2VJbnN0cnVjdGlvbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ21pc2UudG9tbCcpKVxuICAgID8gJ1xcbi0gVG9vbCB2ZXJzaW9ucyAoZS5nLiwgbm9kZSkgYXJlIHBpbm5lZCBpbiBgbWlzZS50b21sYDsgcnVuIGBtaXNlIGluc3RhbGxgIGFmdGVyIGNoYW5naW5nIGl0IGFuZCBuZXZlciBpbnN0YWxsIHRob3NlIHRvb2xzIGdsb2JhbGx5IGluc3RlYWQuJ1xuICAgIDogJyc7XG4gIC8vIElzb2xhdGVkIGluc3RhbGxzIGFyZSB0aGUgb3JnIHN0YW5kYXJkICh3YmZ5IGdlbmVyYXRlcyBubyBvdGhlciBsaW5rZXIpIGFuZCB0aGUgbW9zdFxuICAvLyBhZ2VudC1ob3N0aWxlIHBhcnQgb2YgdGhlIHN0YWNrOiBhIHBhY2thZ2UgdGhhdCBpcyBvbmx5IHJlYWNoYWJsZSBiZWNhdXNlIGEgZGVwZW5kZW5jeSBob2lzdGVkXG4gIC8vIGl0IG5vIGxvbmdlciByZXNvbHZlcywgYW5kIHRoZSByZWZsZXggZml4IChzd2l0Y2hpbmcgdGhlIGxpbmtlciBiYWNrKSBzaWxlbnRseSByZWludHJvZHVjZXNcbiAgLy8gdGhlIHBoYW50b20gZGVwZW5kZW5jaWVzIHRoZSBsYXlvdXQgZXhpc3RzIHRvIGNhdGNoLlxuICBjb25zdCBpc29sYXRlZEluc3RhbGxJbnN0cnVjdGlvbiA9IGBcXG4tIFxcYGJ1bmZpZy50b21sXFxgIHVzZXMgQnVuJ3MgaXNvbGF0ZWQgbGlua2VyLCBzbyBvbmx5IGRlY2xhcmVkIGRlcGVuZGVuY2llcyByZXNvbHZlLiBJZiBhbiBpbXBvcnQgZmFpbHMgdG8gcmVzb2x2ZSwgZGVjbGFyZSB0aGF0IHBhY2thZ2UgaW4gdGhlIFxcYHBhY2thZ2UuanNvblxcYCB0aGF0IGltcG9ydHMgaXQ7IG5ldmVyIHN3aXRjaCBcXGBsaW5rZXJcXGAgdG8gXFxgaG9pc3RlZFxcYCBvciBhZGQgdG8gXFxgcHVibGljSG9pc3RQYXR0ZXJuXFxgIHRvIHdvcmsgYXJvdW5kIGl0LmA7XG4gIC8vIEV2ZXJ5IGNsYXVzZSBzdGF0ZXMgb25seSBhIHZlcmlmaWVkIGZhY3QsIHJldXNpbmcgdGhlIHdvcmtmbG93IGdlbmVyYXRvcidzIG93biBkZXRlY3RvcnM6IHRoZVxuICAvLyB3cmFuZ2xlci1jb25maWcgY2xhdXNlIG5lZWRzIGFuIGFjdHVhbCBjb25maWcgZmlsZSAoaXNDbG91ZGZsYXJlIGFsc28gbWF0Y2hlcyBhIG1lcmUgd3JhbmdsZXJcbiAgLy8gbWVudGlvbiBpbiBhIHNjcmlwdCBvciB3b3JrZmxvdyksIHRoZSB3b3JrZmxvdyBjbGF1c2UgbmVlZHMgYSBsaXZlIHJldXNhYmxlLWRlcGxveSBjYWxsZXJcbiAgLy8gKFlBTUwtcGFyc2VkIGpvYnMuKi51c2VzLCBub3QgYSByYXctdGV4dC9jb21tZW50IG1hdGNoKSwgYW5kIHRoZSBgd2IgZGVwbG95YCBjbGF1c2UgbmVlZHMgYVxuICAvLyBkZXBsb3kgc2NyaXB0IHdob3NlIGNvbW1hbmQgdG9rZW4gaXMgYHdiIOKApiBkZXBsb3lgLlxuICBjb25zdCBvd25zV3JhbmdsZXJDb25maWcgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcpO1xuICAvLyBPbmx5IGNsYWltIHRoZSBmaWxlIGlzIGdlbmVyYXRlZCB3aGVyZSBpdCBhY3R1YWxseSBpczogYSBwYWNrYWdlIHRoYXQgaGFuZC1tYWludGFpbnMgaXRzIGBFbnZgIChlLmcuIHVuZGVyXG4gIC8vIGB0eXBlczogW1wiYnVuXCJdYCkgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgdW5tYW5hZ2VkLCBhbmQgdGVsbGluZyBhbiBhZ2VudCB0byBydW4gYHdiIGdlbi1jb2RlYCB0aGVyZSB3b3VsZCBzZW5kXG4gIC8vIGl0IGFmdGVyIGEgZmlsZSB0aGF0IG5ldmVyIGFwcGVhcnMg4oCUIGFuZCBhd2F5IGZyb20gdGhlIGBFbnZgIGl0IHNob3VsZCBiZSBlZGl0aW5nLlxuICBjb25zdCBvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnKSk7XG4gIGNvbnN0IGhhc0RlcGxveVdvcmtmbG93ID0gaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93KHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViL3dvcmtmbG93cycpKTtcbiAgLy8gSW5kZXBlbmRlbnQgZmFjdHMgc3RheSBzZXBhcmF0ZSBzZW50ZW5jZXM6IHRoZSB3b3JrZmxvdydzIG93biBkZXBsb3kgbWVjaGFuaXNtIGlzIG5vdFxuICAvLyBpbnNwZWN0ZWQsIHNvIHRoZSB3Yi1kZXBsb3kgY2xhdXNlIG11c3Qgbm90IGNsYWltIHRoZSB3b3JrZmxvdyBpbnZva2VzIGl0LlxuICBjb25zdCBjbG91ZGZsYXJlSW5zdHJ1Y3Rpb24gPSBvd25zV3JhbmdsZXJDb25maWdcbiAgICA/IGBcXG4tIFRoaXMgcHJvamVjdCBydW5zIG9uIENsb3VkZmxhcmUgV29ya2VyczogdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBob2xkcyB0aGUgV29ya2VyJ3MgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIGJpbmRpbmdzIGFuZCBwZXItZW52aXJvbm1lbnQgb3ZlcnJpZGVzLiR7aGFzRGVwbG95V29ya2Zsb3cgPyAnIFRoZSBkZXBsb3kgd29ya2Zsb3dzIHVuZGVyIGAuZ2l0aHViL3dvcmtmbG93c2AgcGVyZm9ybSBkZXBsb3ltZW50cy4nIDogJyd9JHt1c2VzV2JEZXBsb3kgPyAnIFRoZSBgZGVwbG95YCBwYWNrYWdlIHNjcmlwdCBydW5zIGB3YiBkZXBsb3lgLicgOiAnJ30ke293bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA/IGBcXG4tIFxcYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNcXGAgaXMgZ2l0aWdub3JlZCBhbmQgZ2VuZXJhdGVkIGJ5IFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIGdlbi1jb2RlXFxgOyBhZnRlciBjaGFuZ2luZyBiaW5kaW5ncyBvciB2YXJzIGluIHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uLCByZS1ydW4gaXQgaW5zdGVhZCBvZiBlZGl0aW5nIHRoZSBmaWxlIGJ5IGhhbmQuYCA6ICcnfWBcbiAgICA6ICcnO1xuICBjb25zdCByYWlsd2F5SW5zdHJ1Y3Rpb24gPSAhcm9vdENvbmZpZy5pc1JhaWx3YXlcbiAgICA/ICcnXG4gICAgOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmFpbHdheScsICdyYWlsd2F5LnRzJykpXG4gICAgICA/IFwiXFxuLSBgLnJhaWx3YXkvcmFpbHdheS50c2AgaG9sZHMgdGhlIFJhaWx3YXkgcHJvamVjdCBJRCwgdGhlIHNlcnZpY2UgcGVyIGVudmlyb25tZW50LCB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uLCBhbmQgdGhlIHZhcmlhYmxlcyBSYWlsd2F5IHN1cHBsaWVzIChlLmcuIGEgbGlua2VkIGRhdGFiYXNlJ3MgYERBVEFCQVNFX1VSTGAsIHdoaWNoIHRoZSBkZXBsb3llZCBmbm94IHByb2ZpbGUgbXVzdCBub3QgZXhwb3J0KTsgZXZlcnkgb3RoZXIgc2VjcmV0IGFuZCBhcHBsaWNhdGlvbi1yZWFkIHZhbHVlIHN0YXlzIGluIGBmbm94LnRvbWxgLiBgd2IgZGVwbG95YCBhcHBsaWVzIGl0IGFuZCBkZXBsb3lzLCBhbmQgYHdiIGRlcGxveSAtLWRyeS1ydW5gIG9ubHkgY2hlY2tzIHRoZSBwbGFuLlwiXG4gICAgICA6ICdcXG4tIFJhaWx3YXkgcHJvamVjdCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgLic7XG4gIGNvbnN0IHBsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb24gPSBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihhbGxDb25maWdzKVxuICAgID8gYFxcbi0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0XFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmBcbiAgICA6ICcnO1xuICBjb25zdCBjb0F1dGhvckluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbiAgLSBFbmQgeW91ciBjb21taXQgbWVzc2FnZSB3aXRoIGEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYCwgdGhlIG9ubHkgQUkgYXR0cmlidXRpb24gdG8gYWRkLmBcbiAgICA6ICcnO1xuICBjb25zdCBwclRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSBgXFxuJHtQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUy5yZXBsYWNlQWxsKC9eL2dtLCAnICAnKX1gO1xuICBjb25zdCByZXF1aXJlbWVudHNFeGVtcHRpb24gPVxuICAgIFwiIG90aGVyIHRoYW4gdGhlIFBSIGJvZHkncyBSZXF1aXJlbWVudHMgc2VjdGlvbiAod2hpY2ggc3RhdGVzIHdoYXQgaXMgY3VycmVudGx5IGFza2VkIGZvciByYXRoZXIgdGhhbiB3aGF0IHRoZSBjb2RlIGNvbnRhaW5zKVwiO1xuICBjb25zdCBpc3N1ZVRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSBgXFxuLSBXaGVuIGNyZWF0aW5nIGFuIGlzc3VlOlxcbiR7SVNTVUVfVEVNUExBVEVfUlVMRVMucmVwbGFjZUFsbCgvXi9nbSwgJyAgJyl9YDtcbiAgY29uc3QgbGFuZ3VhZ2VJbnN0cnVjdGlvbiA9XG4gICAgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2Uocm9vdENvbmZpZykgPT09ICdKYXBhbmVzZSdcbiAgICAgID8gYFxcbi0gVW5sZXNzIGluc3RydWN0ZWQgb3RoZXJ3aXNlLCB3cml0ZSBpc3N1ZXMsIFBSIGJvZGllcywgcmV2aWV3IGNvbW1lbnRzLCBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgcGVvcGxlIChSRUFETUUsIFxcYGRvY3MvXFxgKSBpbiBKYXBhbmVzZSwgYW5kIGV2ZXJ5IG90aGVyIGFydGlmYWN0IChpbmNsdWRpbmcgY29tbWl0IG1lc3NhZ2VzLCBQUiB0aXRsZXMsIGlkZW50aWZpZXJzLCBjb2RlIGNvbW1lbnRzLCBKU0RvYywgYW5kIGFnZW50IGluc3RydWN0aW9ucykgaW4gRW5nbGlzaCwgJHtMQU5HVUFHRV9CT1VORF9URVhUX0VYQ0VQVElPTn0uYFxuICAgICAgOiBgXFxuLSBXcml0ZSBldmVyeSBhcnRpZmFjdCBpbiBFbmdsaXNoLCAke0xBTkdVQUdFX0JPVU5EX1RFWFRfRVhDRVBUSU9OfS5gO1xuICBjb25zdCBydW5uZXJJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/ICdcXG4tIFByaXZhdGUgcmVwb3NpdG9yaWVzIHVzZSBzZWxmLWhvc3RlZCBDSSBydW5uZXJzLiBLZWVwIE9TL3NpemUgY29uc3RyYWludHMgaW4gYW4gZXhwbGljaXQgc2VsZi1ob3N0ZWQgbGFiZWwgYXJyYXk7IGZpeCBtaXNzaW5nIHJ1bm5lciBjYXBhYmlsaXRpZXMgaW5zdGVhZCBvZiBzd2l0Y2hpbmcgdG8gR2l0SHViLWhvc3RlZCBydW5uZXJzLiBUaGUgc29sZSBhcHByb3ZlZCBleGNlcHRpb24gaXMgdGhlIFdpbmRvd3MgZGVza3RvcCBidWlsZCBpbiBXaWxsQm9vc3Rlci9jaGVlcmxpbmdzLidcbiAgICA6ICcnO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHJvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cHJvamVjdE5hbWV9XFxgJHtkZXNjcmlwdGlvbiA/IGBcXG4tIERlc2NyaXB0aW9uOiAke2Rlc2NyaXB0aW9ufWAgOiAnJ31cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIElmIG9uIFxcYG1haW5cXGAsIGNyZWF0ZSBhIG5ldyBicmFuY2g7IG90aGVyd2lzZSB3b3JrIG9uIHRoZSBjdXJyZW50IGJyYW5jaC5cbi0gUnVuIFxcYGdpdFxcYCBjb21tYW5kcyBvbmUgYXQgYSB0aW1lIHRvIGF2b2lkIFxcYGluZGV4LmxvY2tcXGAgY29uZmxpY3RzLiR7bGFuZ3VhZ2VJbnN0cnVjdGlvbn1cbiR7VEVTVF9XUklUSU5HX1JVTEVTfVxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBhcyBhIHJ1bGUsIHJ1biBvbmx5IHdoYXQgaXMgbmVjZXNzYXJ5IGZvciB0aGUgY2hhbmdlIGxvY2FsbHksIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnlcXGAgKHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmc7IHVwIHRvIDEwIG1pbnV0ZXMpIGFuZCB0aGUgcmVsZXZhbnQgdGVzdHMsIGFuZCBsZWF2ZSB0aGUgZnVsbCB0ZXN0IHN1aXRlIChcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGxcXGA7IHVwIHRvIDEgaG91cikgdG8gdGhlIFBSJ3MgQ0kuIElmIFBSIENJIGRvZXMgbm90IHJ1biB0aGUgZnVsbCBzdWl0ZSwgcnVuIGl0IGxvY2FsbHkuIEZpeCBlcnJvcnMsIGluY2x1ZGluZyBDSSBmYWlsdXJlcywgYW5kIHJlLXJ1biB1bnRpbCB0aGV5IHBhc3MuXG4gIC0gUnVuIHJlbGV2YW50IHRlc3RzIHdpdGggXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgdGVzdCB0ZXN0L3VuaXQvZXhhbXBsZS50ZXN0LnRzIC0tZ3JlcCAnY2FzZSBuYW1lJ1xcYCAob21pdCBcXGAtLWdyZXBcXGAgZm9yIHRoZSB3aG9sZSBmaWxlOyB1c2UgXFxgLXcgcGFja2FnZXMvZXhhbXBsZVxcYCBpbiBhIG1vbm9yZXBvKS4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgdmVyaWZ5IC0tZnVsbCA8dGVzdC1wYXRoPiAtLWdyZXAgJ2Nhc2UgbmFtZSdcXGAgY29tYmluZXMgdmVyaWZpY2F0aW9uIHdpdGggc2VsZWN0ZWQgdGVzdHMuXG4gIC0gV2FpdCBmb3IgaXQgdG8gZmluaXNoIHdpdGhvdXQgcmVzdGFydGluZyBpdDogcHJlZmVyIGNvbXBsZXRpb24gbm90aWZpY2F0aW9ucywgb3RoZXJ3aXNlIHRoZSBsb25nZXN0IHBlcm1pdHRlZCB3YWl0OyBubyBvdXRwdXQgZG9lcyBub3QgbWVhbiBpdCBoYXMgc3RvcHBlZC4gSWYgdGhlIGRpc3BsYXllZCBleGNlcnB0IGlzIGluc3VmZmljaWVudCwgcmVhZCB0aGUgaW5kaWNhdGVkIGxvZyBmaWxlIGJlZm9yZSByZXJ1bm5pbmcuIElmIHRoZSBlbnZpcm9ubWVudCBraWxscyBsb25nLXJ1bm5pbmcgY29tbWFuZHMsIHJ1biB0aGVtIGRldGFjaGVkIHdpdGggYSBzYXZlZCBsb2cgYW5kIGV4aXQgc3RhdHVzLlxuLSBPbmNlIHZlcmlmaWVkLCBjb21taXQgYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgKG5vbi1tYWluKSBicmFuY2gsIGFuZCBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAgaWYgbm9uZSBleGlzdHMgZm9yIHRoZSBicmFuY2guXG4gIC0gRm9sbG93IHRoZSBDb252ZW50aW9uYWwgQ29tbWl0cyBmb3JtYXQgKGUuZy4sIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgKS4ke2NvQXV0aG9ySW5zdHJ1Y3Rpb259XG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0czsgYXZvaWQgXFxgLS1hbWVuZFxcYC4ke3ByVGVtcGxhdGVJbnN0cnVjdGlvbn0ke2lzc3VlVGVtcGxhdGVJbnN0cnVjdGlvbn1cbi0gSW4gYW55IGV4cGxhbmF0b3J5IHRleHQgKGNvbW1pdCBtZXNzYWdlcywgUFIgZGVzY3JpcHRpb25zLCBkb2N1bWVudGF0aW9uLCBjb2RlIGNvbW1lbnRzLCBldGMuKSR7cmVxdWlyZW1lbnRzRXhlbXB0aW9ufSwgZGVzY3JpYmUgb25seSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbjogZHJvcCBhbnkgc3RhdGVtZW50IG5hbWluZyBhbiBpZGVudGlmaWVyLCBmZWF0dXJlLCBvciBjb25jZXB0IHlvdSBjYW5ub3QgY29uZmlybSBleGlzdHMgaW4gdGhlIGZpbmFsIGRpZmYgb3IgdGhlIGN1cnJlbnQgY29kZWJhc2UgKGUuZy4sIG9uZSBhZGRlZCBhbmQgbGF0ZXIgcmVtb3ZlZCBvciByZW5hbWVkIGFsb25nIHRoZSB3YXkpLiBXaGVuZXZlciBkb2N1bWVudGF0aW9uIG9yIGNvbW1lbnRzIG5vIGxvbmdlciBtYXRjaCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAocmVtb3ZlZCBvcHRpb25zLCBkZXByZWNhdGVkIHVzYWdlLCBvdXRkYXRlZCBiZWhhdmlvciksIGRlbGV0ZSBvciByZXdyaXRlIHRoZW0sIGV2ZW4gaW4gZmlsZXMgeW91IGFyZSBub3Qgb3RoZXJ3aXNlIGNoYW5naW5nLiBNZW50aW9uIGEgcGFzdCBzdGF0ZSBvbmx5IHdoZXJlIGl0IGlzIG5lZWRlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGUgY3VycmVudCBkZXNpZ24gaXMgYXMgaXQgaXMsIG9yIHdoZW4gZXhwbGljaXRseSBhc2tlZDsgZmlsZXMgdGhhdCByZWNvcmQgaGlzdG9yeSBieSBkZXNpZ24gKGUuZy4sIGEgY2hhbmdlbG9nKSBhcmUgZXhlbXB0LlxuLSBVc2UgaGVyZWRvYyBmb3IgbXVsdGktbGluZSBjb21tYW5kIGlucHV0IChlLmcuLCBcXGBnaXQgY29tbWl0IC1GIC1cXGAsIFxcYGdoIHByIGNyZWF0ZSAtLWJvZHktZmlsZSAtXFxgLCBcXGBnaCBpc3N1ZSBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCkuXG4tIFB1dCB0ZW1wb3JhcnkgZmlsZXMgaW4gXFxgLnRtcFxcYDsgdXNlIFxcYC90bXBcXGAgb25seSBmb3IgZmlsZXMgdGhhdCBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgcmVwby5cbi0gXFxgQUdFTlRTLm1kXFxgLCBcXGBDTEFVREUubWRcXGAsIFxcYEdFTUlOSS5tZFxcYCwgXFxgLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kY1xcYCwgYW5kIFxcYC5nZW1pbmkvc3R5bGVndWlkZS5tZFxcYCBhcmUgZ2VuZXJhdGVkIGZyb20gXFxgQUdFTlRTX0VYVFJBLm1kXFxgIGFuZCBvdmVyd3JpdHRlbiBvbiBldmVyeSBcXGB3YmZ5XFxgIHJ1bjsgdG8gY2hhbmdlIGFnZW50IGluc3RydWN0aW9ucywgZWRpdCBvbmx5IFxcYEFHRU5UU19FWFRSQS5tZFxcYC4ke21pc2VJbnN0cnVjdGlvbn0ke2lzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9ufSR7Zm5veEluc3RydWN0aW9ufSR7Y2xvdWRmbGFyZUluc3RydWN0aW9ufSR7cmFpbHdheUluc3RydWN0aW9ufSR7cGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbn0ke3J1bm5lckluc3RydWN0aW9ufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShyb290Q29uZmlnLCBhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuLyoqXG4gKiBUaGUgbGFuZ3VhZ2UgYSByZXBvc2l0b3J5IGlzIHdyaXR0ZW4gaW46IEphcGFuZXNlIG9ubHkgaW4gYSBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiXG4gKiByZXBvc2l0b3J5IGNvbmZpcm1lZCBwcml2YXRlLCB3aGVyZSBpdCBzdGlsbCBhcHBsaWVzIG9ubHkgdG8gaXNzdWVzLCBQUiBib2RpZXMsIHJldmlldyBjb21tZW50cyxcbiAqIGFuZCBkb2N1bWVudGF0aW9uIGZvciBwZW9wbGUuIEFuIHVua25vd24gdmlzaWJpbGl0eSAob2ZmbGluZSBydW4sIGZhaWxlZCBsb29rdXApIHlpZWxkcyBFbmdsaXNoIHNvXG4gKiB0aGF0IGEgSmFwYW5lc2UgZGVmYXVsdCBpcyBuZXZlciB3cml0dGVuIGludG8gYSBwdWJsaWMgcmVwb3NpdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRQcm9zZUxhbmd1YWdlKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiAnRW5nbGlzaCcgfCAnSmFwYW5lc2UnIHtcbiAgcmV0dXJuIHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gJiYgcm9vdENvbmZpZy5pc1JlcG9WaXNpYmlsaXR5S25vd24gJiYgIXJvb3RDb25maWcuaXNQdWJsaWNSZXBvXG4gICAgPyAnSmFwYW5lc2UnXG4gICAgOiAnRW5nbGlzaCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gVGF1cmkgZGVza3RvcCBhcHBzIHNoaXAgV2luZG93cyBidWlsZHMsIGFuZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBhcHAgY29kZSBhbmQgc2hhcmVkIGNvZGUgaXNcbiAgLy8gdG9vIGZ1enp5IHRvIHNjb3BlIHRoZSBtYWNPUy9MaW51eC1vbmx5IHJ1bGUgcGVyIHBhY2thZ2UsIHNvIHN1Y2ggcmVwb3NpdG9yaWVzIHRhcmdldCBhbGxcbiAgLy8gdGhyZWUgT1NlcyBpbnN0ZWFkLlxuICBjb25zdCBoYXNEZXNrdG9wQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy50YXVyaSB8fCBjLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKTtcbiAgLy8gQSBwdWJsaWMgcmVwb3NpdG9yeSB3aXRoIG5vIGBAd2lsbGJvb3N0ZXIvYCBwYWNrYWdlIGlzIE9TUyBmb3IgdGhlIGdlbmVyYWwgcHVibGljLCB3aG9zZSB1c2Vyc1xuICAvLyBtYXkgcnVuIFdpbmRvd3MsIHNvIG5vIE9TIHJlc3RyaWN0aW9uIGFwcGxpZXMgdGhlcmUuIEFuIHVua25vd24gdmlzaWJpbGl0eSBjb2xsYXBzZXMgdG9cbiAgLy8gaXNQdWJsaWNSZXBvPWZhbHNlIGFuZCB0aGVyZWZvcmUga2VlcHMgdGhlIHJlc3RyaWN0aXZlIGRlZmF1bHQuXG4gIGNvbnN0IGlzR2VuZXJhbFB1YmxpY09zcyA9XG4gICAgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWxsQ29uZmlncy5ldmVyeSgoYykgPT4gIWMucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIC8vIE9ubHkgcHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHBhY2thZ2VzIHRvIHRoZSBwdWJsaWMgbnBtIHJlZ2lzdHJ5LCB3aG9zZSB1c2VycyByZWFkIHRoZVxuICAvLyBKU0RvYyB3aXRob3V0IHRoZSBzb3VyY2U7IHByaXZhdGUgcmVwb3NpdG9yaWVzIGFyZSByZWFkIG9ubHkgYnkgYWdlbnRzIHRoYXQgaGF2ZSB0aGUgc291cmNlLlxuICBjb25zdCBucG1BcGlFeGNlcHRpb24gPSByb290Q29uZmlnLmlzUHVibGljUmVwb1xuICAgID8gJyBFeGNlcHRpb246IHRoZSBleHBvcnRlZCBBUEkgb2YgYSBwYWNrYWdlIHB1Ymxpc2hlZCB0byBucG0gbWF5IGNhcnJ5IEpTRG9jIGRlc2NyaWJpbmcgd2hhdCBpdCBkb2VzIGFuZCBob3cgdG8gY2FsbCBpdCwgYmVjYXVzZSBpdHMgdXNlcnMgcmVhZCBpdCB3aXRob3V0IHRoZSBzb3VyY2UuJ1xuICAgIDogJyc7XG4gIGNvbnN0IGNvbW1lbnRJbnN0cnVjdGlvbiA9IGAtIENvbW1lbnRzIGFuZCBKU0RvYzogZXZlcnkgcmVhZGVyIGhhcyB0aGUgc291cmNlLCBzbyBuZXZlciByZXN0YXRlIHdoYXQgdGhlIGNvZGUsIGl0cyBuYW1lcywgb3IgaXRzIHR5cGVzIGFscmVhZHkgc2F5IChlLmcuLCBcXGBAcGFyYW0gbmFtZSBUaGUgbmFtZVxcYCkuIFdyaXRlIG9uZSBvbmx5IHdoZW4gYSBwbGF1c2libGUgZWRpdCB3b3VsZCBicmVhayBzb21ldGhpbmcgd2l0aG91dCB0aGF0IGtub3dsZWRnZSBhbmQgbm8gdHlwZSBjaGVjaywgbGludCBydWxlLCBvciB0ZXN0IHdvdWxkIGNhdGNoIGl0OyBmaXJzdCBlbmNvZGUgdGhlIGtub3dsZWRnZSBpbiBjb2RlIChhIG5hbWUsIGEgdHlwZSwgYW4gXFxgYXNzZXJ0XFxgLCBhIHRlc3QpIGFuZCBjb21tZW50IG9ubHkgd2hhdCBjYW5ub3QgYmUgZW5jb2RlZDogYW4gb2RkLWxvb2tpbmcgd29ya2Fyb3VuZCwgYSBkZXBlbmRlbmN5IG9uIGEgZmFjdCBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBvciBhIHJlamVjdGVkIGFsdGVybmF0aXZlIGFuZCB3aHkuIFB1dCBhIGNvbnRyYWN0IG9mIHRoZSBkZWNsYXJlZCBzeW1ib2wgaW4gSlNEb2MgYW5kIGxpbmUtc3BlY2lmaWMga25vd2xlZGdlIGluIGFuIGlubGluZSBjb21tZW50LiBEZWxldGUgY29tbWVudHMgdGhhdCBmYWlsIHRoaXMgdGVzdCBpbiBmaWxlcyB5b3UgdG91Y2guJHtucG1BcGlFeGNlcHRpb259YDtcbiAgY29uc3Qgb3NDb21wYXRpYmlsaXR5SW5zdHJ1Y3Rpb24gPSBpc0dlbmVyYWxQdWJsaWNPc3NcbiAgICA/ICcnXG4gICAgOiBoYXNEZXNrdG9wQXBwXG4gICAgICA/ICctIEVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cywgbWFjT1MsIGFuZCBMaW51eC4nXG4gICAgICA6ICctIEVuc3VyZSBjb21wYXRpYmlsaXR5IG9ubHkgd2l0aCBtYWNPUyBhbmQgTGludXg7IGRvIG5vdCBpbmNsdWRlIFdpbmRvd3Mtc3BlY2lmaWMgY29kZS4nO1xuICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgZXhlY3V0ZSBhY3Jvc3MgbWFueSBlcGhlbWVyYWwgaXNvbGF0ZXMgYW5kIHR3byByZXF1ZXN0cyBhcmUgbm90IGd1YXJhbnRlZWRcbiAgLy8gdG8gaGl0IHRoZSBzYW1lIGluc3RhbmNlLCBzbyB0aGUgc2luZ2xlLWluc3RhbmNlIHNpbXBsaWZpY2F0aW9uIHNpbGVudGx5IGxvc2VzIHN0YXRlIHRoZXJlIOKAlFxuICAvLyBidXQgV29ya2VycyBkZWxpYmVyYXRlbHkgcmV1c2UgZXhlY3V0aW9uIGNvbnRleHRzLCBzbyBiZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBzdGF5XG4gIC8vIGxlZ2l0aW1hdGUgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3JlZmVyZW5jZS9ob3ctd29ya2Vycy13b3Jrcy8pLiBUaGVcbiAgLy8gc2lnbmFscyBhcmUgY29ycmVsYXRlZCBQRVIgUEFDS0FHRTogYSBtb25vcmVwbyBjYW4gaG9zdCBhIHNpbmdsZS1pbnN0YW5jZSBzZXJ2ZXIgYXBwIG5leHQgdG9cbiAgLy8gYW4gdW5yZWxhdGVkIFdvcmtlciwgYW5kIG5laXRoZXIgbWF5IG92ZXJyaWRlIHRoZSBvdGhlcidzIHJ1bGUuIGRvZXNDb250YWluV3JhbmdsZXJDb25maWcgaXNcbiAgLy8gdGhlIGFjY3VyYXRlIFdvcmtlcnMgc2lnbmFsIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlciBtZW50aW9uIGluIGEgc2NyaXB0IG9yXG4gIC8vIHdvcmtmbG93KS5cbiAgY29uc3QgaGFzV29ya2Vyc0FwcCA9IGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKTtcbiAgY29uc3QgaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHAgPSBhbGxDb25maWdzLnNvbWUoXG4gICAgKGMpID0+IChjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dCkgJiYgIWMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZ1xuICApO1xuICBjb25zdCB3b3JrZXJzSW5zdHJ1Y3Rpb24gPVxuICAgICctIENsb3VkZmxhcmUgV29ya2VycyBydW4gYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzLCBzbyB0d28gcmVxdWVzdHMgbWF5IGhpdCBkaWZmZXJlbnQgaW5zdGFuY2VzOiBuZXZlciBsZXQgY29ycmVjdG5lc3MgZGVwZW5kIG9uIG1vZHVsZS1sZXZlbCBtdXRhYmxlIHN0YXRlOyBwZXJzaXN0IGF1dGhvcml0YXRpdmUgc2hhcmVkIHN0YXRlIGluIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpLiBCZXN0LWVmZm9ydCBpc29sYXRlLWxvY2FsIGNhY2hlcyBvZiBub24tcmVxdWVzdC1zY29wZWQgZGF0YSBhcmUgZmluZS4nO1xuICBjb25zdCBzZXJ2ZXJJbnN0YW5jZUluc3RydWN0aW9uID0gaGFzV29ya2Vyc0FwcFxuICAgID8gaGFzU2luZ2xlSW5zdGFuY2VTZXJ2ZXJBcHBcbiAgICAgID8gYCR7d29ya2Vyc0luc3RydWN0aW9ufSBUaGlzIGFwcGxpZXMgdG8gYWxsIGNvZGUgcnVubmluZyBvbiBDbG91ZGZsYXJlIFdvcmtlcnMgKHRoZSB3cmFuZ2xlci1jb25maWd1cmVkIHBhY2thZ2VzIGFuZCBhbnkgd29ya3NwYWNlIHBhY2thZ2UgdGhleSBpbXBvcnQpOyBhc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgb3RoZXIgc2VydmVyIGFwcHMuYFxuICAgICAgOiB3b3JrZXJzSW5zdHJ1Y3Rpb25cbiAgICA6IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/ICctIEFzc3VtZSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuJ1xuICAgICAgOiAnJztcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZmlsZSBuYW1lcyBmb3IgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IChQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzKS5cbi0gU2ltcGxpZnkgY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRhbmN5LlxuLSBEZXNpZ24gbW9kdWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aCBoaWdoIGNvaGVzaW9uIGFuZCBsb3cgY291cGxpbmc7IHNwbGl0IGxhcmdlIG1vZHVsZXMgd2hlbiBuZWVkZWQuXG4tIFBsYWNlIGNhbGxpbmcgZnVuY3Rpb25zIGFib3ZlIHRoZSBmdW5jdGlvbnMgdGhleSBjYWxsICh0b3AtZG93biBvcmRlcik7IHBsYWNlIHZhcmlhYmxlIGFuZCB0eXBlIGRlY2xhcmF0aW9ucyBhYm92ZSB0aGVpciB1c2FnZS5cbiR7Y29tbWVudEluc3RydWN0aW9ufVxuLSBOZXZlciBleHBsYWluIGhvdyBXaWxsQm9vc3RlcidzIGluLWhvdXNlIHRvb2xzIChlLmcuLCBcXGB3YlxcYCwgXFxgd2JmeVxcYCkgd29yayBpbiBjb2RlIGNvbW1lbnRzIG9yIGRvY3VtZW50cyBvdXRzaWRlIHRoZSB0b29sJ3Mgb3duIHBhY2thZ2UsIGV4Y2VwdCBpbiBpbnN0cnVjdGlvbnMgZm9yIEFJIGFnZW50cyAoZS5nLiwgZG8gbm90IG5vdGUgdGhhdCBcXGBQT1JUXFxgIGlzIHVuc2V0IGJlY2F1c2UgXFxgd2JcXGAgcGlja3MgYSBmcmVlIHBvcnQpLlxuLSBJZiBsaW50IGVycm9ycyBvciB3YXJuaW5ncyBjYW5ub3QgYmUgZml4ZWQsIHVzZSBpZ25vcmUgY29tbWVudHMgd2l0aCByZWFzb25zIChlLmcuLCBcXGAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgPHJ1bGU+IC0tIDxyZWFzb24+XFxgKS5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBWYWxpZGF0ZSBKYXZhU2NyaXB0IG9iamVjdHMgKGUuZy4sIHBhcnNlZCBKU09OLCBBUEkgcmVzcG9uc2VzKSB3aXRoIFxcYHpvZFxcYCB3aGVuZXZlciBwb3NzaWJsZSBpbnN0ZWFkIG9mIGhhbmQtd3JpdHRlbiBjaGVja3Mgb3IgdHlwZSBhc3NlcnRpb25zLlxuLSBCdWlsZCBwcm9tcHRzIGFzIGEgc2luZ2xlIHRlbXBsYXRlIGxpdGVyYWwgaW5zdGVhZCBvZiBcXGBqb2luKClcXGAgb24gYSBwcmUtY29tcHV0YWJsZSBhcnJheSBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZDsgaWYgdmFsaWRhdGlvbiBpcyBuZWVkZWQsIFxcYGFzc2VydFxcYCB0aGVtIGF0IHN0YXJ0dXAgdG8gZmFpbCBmYXN0LlxuLSBBc3N1bWUgbG9jYWwgdG9vbHMgc3VjaCBhcyBcXGBnaXRcXGAsIFxcYGdoXFxgLCBhbmQgXFxgZ2hxXFxgIGFyZSBpbnN0YWxsZWQgYW5kIGF1dGhlbnRpY2F0ZWQuXG4ke29zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9ufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBSZWdpc3RlciBzdHJpbmcgbGl0ZXJhbHMgZm9yIFJlYWN0IGNvbXBvbmVudHMgaW4gdGhlIFxcYGkxOG5cXGAgcmVzb3VyY2UgZmlsZXMgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGUgXFxgaTE4blxcYCB1dGlsaXR5IChlLmcuLCBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgKS5gXG4gICAgOiAnJ1xufVxuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQgfHwgYy5kZXBlbmRpbmcudmluZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIG92ZXIgXFxgdXNlU3RhdGVcXGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbi0gVXNlIFxcYGF1dG9Gb2N1c1xcYCB3aGVyZSBpdCByZWR1Y2VzIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIGN1cnJlbnQgd2ViLWFwcCBmcmFtZXdvcmsgYW5kIGVuYWJsZXMgdGhlIFJlYWN0IENvbXBpbGVyIGp1c3QgYXMgTmV4dC5qc1xuICAvLyBkb2VzLCBzbyBpdCBtdXN0IG5vdCBtaXNzIHRoaXMgcnVsZS5cbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGBcbi0gVGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCBzbyBcXGB1c2VDYWxsYmFja1xcYCBhbmQgXFxgdXNlTWVtb1xcYCBhcmUgdW5uZWNlc3NhcnkgZm9yIHBlcmZvcm1hbmNlLlxuYFxuICAgIDogJydcbn1cbiR7c2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KTtcbn1cbiIsIiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCByZWxlYXNlQWdlR2F0ZSBmcm9tICcuLi8uLi9jb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfTtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgICBnbG9iYWxTdG9yZT86IGJvb2xlYW47XG4gICAgbGlua2VyPzogc3RyaW5nO1xuICAgIG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXM/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuLy8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uIGlzIHRoZSBvcmdhbml6YXRpb24ncyBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgcG9saWN5OiB0aGVcbi8vIG1hY2hpbmVzJyBnbG9iYWwgY29uZmlncyBnZXQgaXQgdGhyb3VnaCBjb25maWdzL2FwcGx5UmVsZWFzZUFnZUdhdGUuc2ggKHJ1biBieSB3YmZ5IGl0c2VsZiwgYnlcbi8vIHJldXNhYmxlLXdvcmtmbG93cyBvbiBDSSwgYW5kIGJ5IHNlbGYtaG9zdC11dGlscyBvbiB0aGUgcnVubmVycyksIGFuZCByZXBvc2l0b3JpZXMgZ2V0IGl0IGhlcmUuXG4vLyBPdXIgb3duIHBhY2thZ2VzIGFyZSBleGVtcHQ6IHdlIGNvbnRyb2wgd2hvIHB1Ymxpc2hlcyB0aGVtLCBzbyBhIGNvbXByb21pc2VkIHJlbGVhc2UgY2Fubm90XG4vLyByZWFjaCB1cyB0aHJvdWdoIGFuIHVwc3RyZWFtIG1haW50YWluZXIncyBzdG9sZW4gY3JlZGVudGlhbHMuIFRoYXQgY292ZXJzIGV2ZXJ5XG4vLyBAd2lsbGJvb3N0ZXItcHJpdmF0ZSBwYWNrYWdlICh0aGUgc2NvcGUgcmVzb2x2ZXMgb25seSBmcm9tIG91ciBvd24gcmVnaXN0cnkpLCBidXQgYnVuLCBucG0sIGFuZFxuLy8gWWFybiBtYXRjaCBleGNsdWRlIGVudHJpZXMgYnkgZXhhY3QgbmFtZSDigJQgbm8gQHNjb3BlLyogcGF0dGVybnMg4oCUIHNvIGVhY2ggbmV3IHBhY2thZ2UgaW4gdGhlXG4vLyBzY29wZSBtdXN0IGJlIGFkZGVkIHRvIGNvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiB3aGVuIGl0IGlzIGZpcnN0IHB1Ymxpc2hlZC4gVGhlIG9ubHkgcGVybWFuZW50XG4vLyB0aGlyZC1wYXJ0eSBleGVtcHRpb24gaXMgdGhlIENvZGV4IENMSSwgd2hvc2UgbmV3ZXN0IG1vZGVscyBydW4gb25seSBvbiBpdHMgbGF0ZXN0IHJlbGVhc2VzLlxuLy8gT3RoZXIgdGhpcmQtcGFydHkgcGFja2FnZXMg4oCUIGluY2x1ZGluZyB0b29saW5nIHdiZnkgcGlucyBpdHNlbGYg4oCUIHN0YXkgYWdlLWdhdGVkO1xuLy8gZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbiBpbiBwYWNrYWdlSnNvbi50cyBwaW5zIHRoZSBuZXdlc3QgcmVsZWFzZSBvbGQgZW5vdWdoIHRvIHBhc3Ncbi8vIHRoZSBnYXRlLCBzbyBwaW5uaW5nIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBhbiBleGVtcHRpb24uIGB0ZW1wb3JhcnlFeGNsdWRlc2AgbGV0cyBhIHRoaXJkLXBhcnR5XG4vLyByZWxlYXNlIG5lZWRlZCBub3cgKGEgc2VjdXJpdHkgZml4LCBvciBhbiBTREsgYSBuZXcgbW9kZWwgcmVxdWlyZXMpIGluIGltbWVkaWF0ZWx5IGFuZCBnYXRlcyB0aGVcbi8vIHBhY2thZ2UgYWdhaW4gZnJvbSB0aGUgZ2l2ZW4gVVRDIGRhdGUsIHNvIHRoZSBuZXh0IHdiZnkgcnVuIHJlc3RvcmVzIHRoZSBnYXRlIHdpdGhvdXQgYW55b25lXG4vLyBoYXZpbmcgdG8gcmVtZW1iZXIgdG8gcmVtb3ZlIHRoZSBlbnRyeS4gTGlzdCBldmVyeSBwYWNrYWdlIHRoYXQgcmVsZWFzZSBwaW5zIGV4YWN0bHkgYW5kXG4vLyBwdWJsaXNoZXMgYWxvbmdzaWRlIGl0LCBzaW5jZSBleGNsdXNpb24gbWF0Y2hlcyBleGFjdCBuYW1lcyBvbmx5LlxuZXhwb3J0IGNvbnN0IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyA9IHJlbGVhc2VBZ2VHYXRlLmRheXMgKiAyNCAqIDYwICogNjA7XG5jb25zdCB0b2RheSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG5leHBvcnQgY29uc3QgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgLi4ucmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMsXG4gIC4uLk9iamVjdC5lbnRyaWVzKHJlbGVhc2VBZ2VHYXRlLnRlbXBvcmFyeUV4Y2x1ZGVzKVxuICAgIC5maWx0ZXIoKFssIGdhdGVkQWdhaW5Gcm9tXSkgPT4gdG9kYXkgPCBnYXRlZEFnYWluRnJvbSlcbiAgICAubWFwKChbcGFja2FnZU5hbWVdKSA9PiBwYWNrYWdlTmFtZSksXG5dO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlcG9zaXRvcnkncyBidW5maWcudG9tbCBsaXN0cyB0b2RheSdzIGV4ZW1wdGlvbnMuIGB0ZW1wb3JhcnlFeGNsdWRlc2AgY2hhbmdlcyB0aGVtIGJ5XG4gKiBkYXRlIGFsb25lLCBzbyBhIHJlcG9zaXRvcnkgYWxyZWFkeSBjb25maWd1cmVkIGJ5IHRoZSBydW5uaW5nIHdiZnkgYnVpbGQgbXVzdCBub3QgYmUgc2tpcHBlZFxuICogb25jZSB0aGV5IGRpZmZlciwgb3IgYW4gZXhwaXJlZCBleGVtcHRpb24gd291bGQgb3V0bGl2ZSBpdHMgZGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0N1cnJlbnRCdW5SZWxlYXNlQWdlRXhjbHVkZXMocm9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybiB0cnVlO1xuICBjb25zdCBleGNsdWRlcyA9IHBhcnNlQnVuZmlnVG9tbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpPy5pbnN0YWxsPy5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzO1xuICByZXR1cm4gZXhjbHVkZXM/LmpvaW4oJ1xcbicpID09PSBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLmpvaW4oJ1xcbicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdidW5maWcudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcGFyc2VCdW5maWdUb21sKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk/Lmluc3RhbGw/Lmdsb2JhbFN0b3JlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKFxuICBjb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHNraXBEZXBzOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVmYXVsdFVzZUdsb2JhbFN0b3JlID0gc2hvdWxkVXNlQnVuR2xvYmFsU3RvcmUoY29uZmlncyk7XG4gIHJldHVybiBza2lwRGVwcyA/IChwcmV2aW91c0dsb2JhbFN0b3JlID8/IGRlZmF1bHRVc2VHbG9iYWxTdG9yZSkgOiBkZWZhdWx0VXNlR2xvYmFsU3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VCdW5HbG9iYWxTdG9yZShjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBib29sZWFuIHtcbiAgLy8gQmxpdHogYnVpbGRzIG9uIE5leHQuanMgYnV0IG5lZWQgbm90IGRlY2xhcmUgaXQgZGlyZWN0bHksIGFuZCBpdHMgY29kZWdlbiBhbHNvIHBhdGNoZXMgTmV4dFxuICAvLyBpbnNpZGUgbm9kZV9tb2R1bGVzLiBCb3RoIGZyYW1ld29ya3MgdGhlcmVmb3JlIHJlcXVpcmUgcHJvamVjdC1sb2NhbCBpc29sYXRlZCBpbnN0YWxscy5cbiAgLy8gU2xpZGV2IGxvYWRzIG9wdGlvbmFsIFZ1ZSBjb21waWxlciBwZWVycyB0aHJvdWdoIGxvY2FsLXBrZy4gVGhlIGdsb2JhbCBzdG9yZSByZWFscGF0aHNcbiAgLy8gbG9jYWwtcGtnIG91dHNpZGUgdGhlIHByb2plY3QsIHNvIE5vZGUgY2Fubm90IHJlc29sdmUgYSBjb21waWxlciBkZWNsYXJlZCBieSB0aGUgcHJvamVjdC5cbiAgcmV0dXJuICFjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5zbGlkZXYpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgdXNlR2xvYmFsU3RvcmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCwgdXNlR2xvYmFsU3RvcmUpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLCB1c2VHbG9iYWxTdG9yZTogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgLy8gbWluaW11bVJlbGVhc2VBZ2UgYW5kIG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgYXJlIG9yZyBwb2xpY3ksIG5ldmVyIHJlcG9zaXRvcnkgcG9saWN5OiBib3RoXG4gIC8vIGFyZSByZXdyaXR0ZW4gdG8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uJ3MgdmFsdWVzIG9uIGV2ZXJ5IHJ1biwgc28gYSBoYW5kLWVkaXRlZCAod2Vha2VuZWQpXG4gIC8vIGdhdGUgY2Fubm90IHN1cnZpdmUgcmVnZW5lcmF0aW9uLiBEcm9wcGluZyByZXBvc2l0b3J5LXNwZWNpZmljIGV4Y2x1ZGUgZW50cmllcyBpcyBmYWlsLXNhZmUg4oCUIGFuXG4gIC8vIHVuY292ZXJlZCBwYWNrYWdlIGJlY29tZXMgYWdlLWdhdGVkIGFuZCBzdXJmYWNlcyBhdCBpbnN0YWxsIHRpbWUgaW5zdGVhZCBvZiB3ZWFrZW5pbmcgdGhlIGdhdGUuXG4gIC8vIFR1cmJvcGFjayByZWplY3RzIGdsb2JhbC1zdG9yZSBzeW1saW5rcyBiZWNhdXNlIHRoZXkgcmVzb2x2ZSBvdXRzaWRlIGl0cyBmaWxlc3lzdGVtIHJvb3QuXG4gIC8vIEtlZXBpbmcgTmV4dC5qcyBpbnN0YWxscyBwcm9qZWN0LWxvY2FsIGF2b2lkcyB3aWRlbmluZyB0aGF0IHJvb3QgdG8gJEhPTUUgKG9yIGAvYCBpbiBEb2NrZXIpLFxuICAvLyB3aGljaCB3b3VsZCBleHBhbmQgZGV2ZWxvcG1lbnQgZmlsZXN5c3RlbSB3YXRjaGluZyBhbmQgYnlwYXNzIHRoZSBib3VuZGFyeSdzIGNhY2hlIGJlbmVmaXRzLlxuICBjb25zdCBnbG9iYWxTdG9yZUxpbmUgPSB1c2VHbG9iYWxTdG9yZSA/ICdnbG9iYWxTdG9yZSA9IHRydWUnIDogJ2dsb2JhbFN0b3JlID0gZmFsc2UnO1xuICAvLyBObyBgW3J1bl0gYnVuID0gdHJ1ZWA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzXG4gIC8vIHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpOyBhbnkgZXhpc3Rpbmcgc2V0dGluZyBpcyBkcm9wcGVkLlxuICAvLyBwdWJsaWNIb2lzdFBhdHRlcm4g4oCUIHRzeDogYnVpbGQtdHMgdW5kZXIgTm9kZS5qcyBzcGF3bnMgYG5vZGUgLS1pbXBvcnQgdHN4YCwgd2hpY2ggcmVzb2x2ZXNcbiAgLy8gdHN4IGZyb20gdGhlIGNvbnN1bWVyIHBhY2thZ2UncyBkaXJlY3RvcnksIG5vdCBmcm9tIGJ1aWxkLXRzJ3Mgb3duIGRlcGVuZGVuY2llcy5cbiAgLy8gdW5kaWNpLXR5cGVzOiBidW4tdHlwZXMgcmVmZXJlbmNlcyBpdCB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KTtcbiAgLy8gZ2VuZXJhdGVkIHRzY29uZmlncyBhbHNvIG1hcCB1bmRpY2ktdHlwZXMgdG8gdGhlIGhvaXN0ZWQgY29weSAoc2VlIHRzY29uZmlnLnRzKSBiZWNhdXNlIHRoZVxuICAvLyBnbG9iYWwgc3RvcmUgcmVhbHBhdGhzIGJ1bi10eXBlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2V4dHJhY3RSYXdUZXN0U2VjdGlvbnMoZXhpc3RpbmdDb250ZW50KX1baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxuJHtnbG9iYWxTdG9yZUxpbmV9XG5saW5rZXIgPSBcImlzb2xhdGVkXCJcbnB1YmxpY0hvaXN0UGF0dGVybiA9IFtcInRzeFwiLCBcInVuZGljaS10eXBlc1wiXVxubWluaW11bVJlbGVhc2VBZ2UgPSAke2J1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kc31cbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke2J1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuLyoqXG4gKiBQcmVzZXJ2ZSB0aGUgcHJvamVjdCdzIGBbdGVzdF1gIHNlY3Rpb25zIChlLmcuIHByZWxvYWQgc2NyaXB0cyBzd2FwcGluZyBhIENsb3VkZmxhcmUgRDEgY2xpZW50XG4gKiBmb3IgYSBsb2NhbCBTUUxpdGUgb25lKSB2ZXJiYXRpbSwgY29tbWVudHMgaW5jbHVkZWQ7IHdiZnkgbWFuYWdlcyBvbmx5IHRoZSBvdGhlciBzZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSYXdUZXN0U2VjdGlvbnMoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50KSByZXR1cm4gJyc7XG5cbiAgY29uc3QgcHJlc2VydmVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpblRlc3RTZWN0aW9uID0gZmFsc2U7XG4gIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IHNlY3Rpb25NYXRjaCA9IC9eXFxzKlxcWyhbXlxcXV0rKVxcXS8uZXhlYyhsaW5lKTtcbiAgICBpZiAoc2VjdGlvbk1hdGNoKSB7XG4gICAgICBpblRlc3RTZWN0aW9uID0gc2VjdGlvbk1hdGNoWzFdID09PSAndGVzdCcgfHwgKHNlY3Rpb25NYXRjaFsxXSBhcyBzdHJpbmcpLnN0YXJ0c1dpdGgoJ3Rlc3QuJyk7XG4gICAgfVxuICAgIGlmIChpblRlc3RTZWN0aW9uICYmIGxpbmUudHJpbSgpKSB7XG4gICAgICBwcmVzZXJ2ZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcHJlc2VydmVkTGluZXMubGVuZ3RoID4gMCA/IGAke3ByZXNlcnZlZExpbmVzLmpvaW4oJ1xcbicpfVxcblxcbmAgOiAnJztcbn1cblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZSBkZXBsb3lzIEdpdC1iYXNlZCBwcml2YXRlIHBhY2thZ2VzIGZyb20gbm9kZV9tb2R1bGVzLCBidXQgdGhlIERvY2tlciBjb250ZXh0IHNob3VsZCBzdGF5IG5hcnJvdy5cbmNvbnN0IGluY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJucyA9IFsnQHdpbGxib29zdGVyJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4uZW52KlxuKiovLkRTX1N0b3JlXG4qKi8uY2FjaGVcbioqLy5jbGF1ZGVcbioqLy5jdXJzb3JcbioqLy5lZGl0b3Jjb25maWdcbioqLy5lc2xpbnRjYWNoZVxuKiovLmdlbWluaVxuKiovLmdpdFxuKiovLmdpdGF0dHJpYnV0ZXNcbioqLy5naXRodWJcbioqLy5naXRpZ25vcmVcbioqLy5pZGVhXG4qKi8ubGVmdGhvb2tcbioqLy5teXB5X2NhY2hlXG4qKi8ubmV4dC9jYWNoZVxuKiovLm5wbVxuKiovLnBhcmNlbC1jYWNoZVxuKiovLnBucG0tc3RvcmVcbioqLy5weXRlc3RfY2FjaGVcbioqLy5yYWlsd2F5aWdub3JlXG4qKi8ucmVsZWFzZXJjLmpzb25cbioqLy5ydWZmX2NhY2hlXG4qKi8udG1wXG4qKi8udG1wLSovKipcbioqLy50dXJib1xuKiovLnRveFxuKiovLnZzY29kZVxuKiovLnlhcm4vY2FjaGVcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG4qKi9fX3B5Y2FjaGVfX1xuKiovKi5sb2dcbioqLyoucHljXG4qKi8qLnRzYnVpbGRpbmZvXG4qKi9jb3ZlcmFnZVxuKiovbm9kZV9tb2R1bGVzLyoqXG4ke2luY2x1ZGVkTm9kZU1vZHVsZXNQYXR0ZXJuc1xuICAubWFwKFxuICAgIChwYXR0ZXJuKSA9PiBgISoqL25vZGVfbW9kdWxlcy8ke3BhdHRlcm59XG4hKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn0vKipgXG4gIClcbiAgLmpvaW4oJ1xcbicpfVxuKiovbm9kZV9tb2R1bGVzLy5jYWNoZVxuKiovcGxheXdyaWdodC1yZXBvcnRcbioqL3N0b3J5Ym9vay1zdGF0aWNcbioqL3RhcmdldFxuKiovdGVzdC1yZXN1bHRzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIG94bGludDogWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10udG9Tb3J0ZWQoKSxcbiAgb3hmbXQ6IFtcbiAgICAnYXN0cm8nLFxuICAgICdjanMnLFxuICAgICdjc3MnLFxuICAgICdjdHMnLFxuICAgICdncWwnLFxuICAgICdncmFwaHFsJyxcbiAgICAnaGJzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ2pzJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdqc3gnLFxuICAgICdsZXNzJyxcbiAgICAnbWQnLFxuICAgICdtZHgnLFxuICAgICdtanMnLFxuICAgICdtdHMnLFxuICAgICdzY3NzJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAndG9tbCcsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXJPbmx5OiBbJ2phdmEnXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gVGhlIGlnbm9yZSBmaWxlcycgbWFjT1MgYEljb25cXHJcXHJgIHJ1bGUgZW5kcyBpbiB0d28gQ1JzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHBhdHRlcm4sIHdoaWNoIGFuIGVkaXRvciBhcHBseWluZ1xuLy8gYGVuZF9vZl9saW5lID0gbGZgIG9yIGB0cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlYCB3b3VsZCBzdHJpcC5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7LmdpdGlnbm9yZSwucHJldHRpZXJpZ25vcmV9XVxuZW5kX29mX2xpbmUgPSB1bnNldFxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlLCBnZXREZWZhdWx0UHJvc2VMYW5ndWFnZSwgcmVhZEFnZW50c0V4dHJhQ29udGVudCB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55YW1sJyk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcblxuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbENvbmZpZyA9ICEhKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSkpO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxDb25maWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2NvbmZpZ0ZpbGVQYXRofSBiZWNhdXNlICR7bm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGh9IGlzIG5vdCBhIHN1cHBvcnRlZCBHZW1pbmkgY29uZmlnIGxvY2F0aW9uLiBSZW5hbWUgaXQgbWFudWFsbHkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGVmYXVsdENvbmZpZyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IHVuZGVmaW5lZCA6IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoY29uZmlnRmlsZVBhdGgpO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9sZENvbmZpZyA9IEJ1bi5ZQU1MLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgICAvLyBNZXJnZSBvbmx5IGEgbWFwcGluZzogZW1wdHksIGNvbW1lbnQtb25seSwgb3Igc2NhbGFyIFlBTUwgd291bGQgZWl0aGVyIHRocm93IGluXG4gICAgICAgIC8vIG1lcmdlLmFsbCBvciBwb2xsdXRlIHRoZSBjb25maWcgd2l0aCBpbmRleCBrZXlzLlxuICAgICAgICBpZiAob2xkQ29uZmlnICYmIHR5cGVvZiBvbGRDb25maWcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9sZENvbmZpZykpIHtcbiAgICAgICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgY2FuJ3QgYmUgcGFyc2VkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBCdW4uWUFNTC5zdHJpbmdpZnkobmV3Q29uZmlnLCB1bmRlZmluZWQsIDIpO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYFJldmlldyBpbiAke2dldERlZmF1bHRQcm9zZUxhbmd1YWdlKGNvbmZpZyl9IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy5cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShjb25maWcsIGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBhd2FpdCBydW5BbGxJblBvb2woW1xuICAgICAgLi4uKGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IFtdIDogWygpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KV0pLFxuICAgICAgKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBnaXRPdXRwdXRNYXhCdWZmZXIgPSA2NCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG4vLyBgLXRleHRgIGtlZXBzIHRoZSBtYWNPUyB0ZW1wbGF0ZSdzIGBJY29uXFxyXFxyYCBydWxlIG9mIHRoZSBpZ25vcmUgZmlsZXMgaW50YWN0LiBgdGV4dD1hdXRvYCBrZWVwcyBpdCBvbmx5IGJlY2F1c2UgdGhlXG4vLyBsb25lIENSIG1ha2VzIHRoZSBmaWxlIGxvb2sgYmluYXJ5OyBhIGB0ZXh0YCBhdHRyaWJ1dGUgd291bGQgc3RyaXAgb25lIENSIHBlciBjaGVja2luIHVudGlsIHRoZSBydWxlIG1hdGNoZXMgbm90aGluZy5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuLmdpdGlnbm9yZSAtdGV4dFxuLnByZXR0aWVyaWdub3JlIC10ZXh0XG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzKGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBsZXQgb3V0cHV0OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gY2hpbGRfcHJvY2Vzcy5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS1lb2wnLCAnLXonXSwge1xuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIG1heEJ1ZmZlcjogZ2l0T3V0cHV0TWF4QnVmZmVyLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB0cmFja2VkIGxpbmUtZW5kaW5nIHJlbm9ybWFsaXphdGlvbjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCByZW5vcm1hbGl6ZWRDb3VudCA9IDA7XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIG91dHB1dC5zcGxpdCgnXFwwJykpIHtcbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHJlY29yZC5pbmRleE9mKCdcXHQnKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSByZWNvcmQuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpO1xuICAgIC8vIE9ubHkgYHRleHRgIHdpdGggYGVvbGAgY29udmVydHMgYSBibG9iIHRoYXQgYWxyZWFkeSBob2xkcyBDUiBpbiB0aGUgaW5kZXg6IEdpdCBrZWVwcyBzdWNoIGEgYmxvYiB1bmRlclxuICAgIC8vIGB0ZXh0PWF1dG9gLCBldmVuIHdpdGggYGVvbGAsIHNvIENScyB0aGVyZSBhcmUgY29udGVudCAoZS5nLiBhIGZpeHR1cmUgdGVzdGluZyBDUikgYW5kIG11c3Qgc3RheS5cbiAgICBpZiAoIS9eaVxcLyg/OmNybGZ8bWl4ZWQpXFxzL3UudGVzdChhdHRyaWJ1dGVzKSB8fCAhL1xcc2F0dHJcXC90ZXh0IGVvbD0oPzpsZnxjcmxmKSg/Olxcc3wkKS91LnRlc3QoYXR0cmlidXRlcykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlY29yZC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIGNvbnN0IHRyYWNrZWRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgIGNvbnN0IHN0YXRzID0gZnMubHN0YXRTeW5jKHRyYWNrZWRGaWxlUGF0aCwgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk7XG4gICAgaWYgKCFzdGF0cz8uaXNGaWxlKCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gR2l0J3Mgc3RhdCBjYWNoZSBjYW4gaGlkZSBwcmUtZXhpc3RpbmcgQ1JMRiBibG9icyBhZnRlciB3YmZ5IGludHJvZHVjZXMgdGV4dCBhdHRyaWJ1dGVzLlxuICAgIC8vIE5vcm1hbGl6ZSBieXRlcyBpbiB0aGUgd29ya3RyZWUgc28gdGhlIGNhbGxlcidzIG5vcm1hbCBgZ2l0IGFkZCAtQWAgcmVjb3JkcyB0aGUgY2Fub25pY2FsXG4gICAgLy8gYmxvYjsgdGhpcyBhbHNvIHByZXZlbnRzIFByZXR0aWVyJ3MgbWV0YWRhdGEgY2FjaGUgZnJvbSBza2lwcGluZyB0aGUgbmV3bHkgY2hhbmdlZCBmaWxlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModHJhY2tlZEZpbGVQYXRoKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRyYWNrZWRGaWxlUGF0aCwgQnVmZmVyLmZyb20oY29udGVudC50b1N0cmluZygnYmluYXJ5JykucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLCAnYmluYXJ5JykpO1xuICAgIHJlbm9ybWFsaXplZENvdW50Kys7XG4gIH1cbiAgaWYgKHJlbm9ybWFsaXplZENvdW50ID4gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVub3JtYWxpemVkIGxpbmUgZW5kaW5ncyBpbiAke3Jlbm9ybWFsaXplZENvdW50fSB0cmFja2VkIGZpbGUocykuYCk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcywgdHlwZSBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG5fX2dlbmVyYXRlZF9fL1xuLmFpZGVyKlxuLmFudGlncmF2aXR5Y2xpL1xuLmNsYXVkZS8qLmxvY2FsLipcbi5jbGF1ZGUvc2NoZWR1bGVkX3Rhc2tzLmxvY2tcbi5kZXZjb250YWluZXIvXG4uZG9ja2VyLmVudlxuLmVudipcbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4ucGxheXdyaWdodC1tY3AvXG4uc2VyZW5hL1xuLnRtcC9cbi50bXAtKi9cbi50b2tlbnNhdmUvXG4ud2IvXG5Ad2lsbGJvb3N0ZXIvXG5Ad2lsbGJvb3N0ZXItcHJpdmF0ZS9cbiovbW91bnQvKi5oYXNoXG5DTEFVREUubG9jYWwubWRcbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICAvLyBFdmVyeSBhY2NlcHRlZCByZXBvc2l0b3J5IHJvb3QgcmVjZWl2ZXMgYSBtYW5hZ2VkIHBhY2thZ2UuanNvbiBsYXRlciBpbiB0aGUgc2FtZSBydW4sIHNvIGl0c1xuICAgIC8vIGRlcGVuZGVuY3kgdHJlZSBtdXN0IGJlIGlnbm9yZWQgZXZlbiB3aGVuIHRoZSBtYW5pZmVzdCBkaWQgbm90IGV4aXN0IGF0IGNvbmZpZy1kZXRlY3Rpb24gdGltZS5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHwgY29uZmlnLmlzUm9vdCkge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3QgcG9tLnhtbCk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBpdHMgTWF2ZW5cbiAgICAvLyBtb2R1bGVzIGluIHN1YmRpcmVjdG9yaWVzLCBhbmQgZHJvcHBpbmcgdGhlIG1hdmVuIHRlbXBsYXRlIHdvdWxkIGxldCB0YXJnZXQvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWxBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnkuIFJlY3Vyc2l2ZSBkZXRlY3Rpb24gKG5vdCBqdXN0IGEgcm9vdFxuICAgIC8vIGxvY2tmaWxlKTogYSBtdWx0aS1sYW5ndWFnZSByZXBvc2l0b3J5IGtlZXBzIFB5dGhvbiBkaXJlY3RvcmllcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kXG4gICAgLy8gZHJvcHBpbmcgdGhlIHB5dGhvbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgX19weWNhY2hlX18vIGFuZCAudmVudi8gZ2V0IHRyYWNrZWQuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB5dGhvbkxvY2tBbnl3aGVyZSkge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgfHwgY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydXN0Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UYXVyaUNvbmZpZykge1xuICAgICAgLy8gIUNhcmdvLmxvY2sgb3ZlcnJpZGVzIGFueSBwcmUtZXhpc3RpbmcgdW5hbmNob3JlZCBDYXJnby5sb2NrIHJ1bGUgZnJvbSBhXG4gICAgICAvLyBwYXJlbnQgLmdpdGlnbm9yZSwgc28gdGhlIGFwcGxpY2F0aW9uIGxvY2tmaWxlIHN0YXlzIGNvbW1pdHRhYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAhQ2FyZ28ubG9ja1xuc3JjLXRhdXJpL2dlbi9zY2hlbWFzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNDbG91ZGZsYXJlIHx8IHJvb3RDb25maWcuaXNDbG91ZGZsYXJlKSB7XG4gICAgICAvLyAuZGV2LnZhcnMqIGhvbGQgbG9jYWwgc2VjcmV0cyBmb3Igd3JhbmdsZXIgZGV2IGFuZCBtdXN0IG5ldmVyIGJlIGNvbW1pdHRlZC5cbiAgICAgIC8vIC5lbnYuY2xvdWRmbGFyZSBjYXJyaWVzIENMT1VERkxBUkVfQVBJX1RPS0VOOiBDSSB3cml0ZXMgaXQgZnJvbSBhIHNlY3JldCwgYW5kIGEgbG9jYWxcbiAgICAgIC8vIGB3YiBkZXBsb3lgIG5lZWRzIGEgcmVhbCB0b2tlbiBpbiBpdCwgc28gY29tbWl0dGluZyBpdCB3b3VsZCBsZWFrIGFjY291bnQgY3JlZGVudGlhbHMuXG4gICAgICAvLyBJdCBpcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGUgQ2xvdWRmbGFyZS1zcGVjaWZpYyBjcmVkZW50aWFsIHBvbGljeSByZW1haW5zIHZpc2libGUuXG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5kZXYudmFycypcbi5lbnYuY2xvdWRmbGFyZVxuLndyYW5nbGVyL1xuYDtcbiAgICB9XG4gICAgLy8gSWdub3JlZCBvbmx5IHdoZXJlIHBvc3RpbnN0YWxsIHJlZ2VuZXJhdGVzIGl0LCBzbyB3YmZ5IG5ldmVyIGlnbm9yZXMgYSBmaWxlIHRoYXQgbm90aGluZyByZWNyZWF0ZXMuIFRoaXMga2VlcHNcbiAgICAvLyBpdHMgdGhvdXNhbmRzIG9mIGxpbmVzIG91dCBvZiBldmVyeSB3cmFuZ2xlciBidW1wJ3MgZGlmZi4gQW5jaG9yZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2ggYmVjYXVzZSBgd3JhbmdsZXIgdHlwZXNgXG4gICAgLy8gYW5kIHRoZSBvcHQtb3V0IGRlbGV0aW9uIGJlbG93IG9ubHkgZXZlciB0b3VjaCB0aGlzIHBhY2thZ2UncyBvd24gZmlsZSwgbm90IGEgbmVzdGVkIG9uZSBhdCBhbnkgZGVwdGguXG4gICAgaWYgKGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyAmJiAhY29uc3VtZXNHZW5lcmF0ZWRXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICAvLyBPbiBhIGdlbnVpbmUgd29ya2VyLXR5cGVzIG9wdC1vdXQgKG5vdGhpbmcgY29uc3VtZXMgdGhlIGdlbmVyYXRlZCBmaWxlOyBnZW5lcmF0ZXNXb3JrZXJUeXBlc1xuICAgICAgLy8gYWxvbmUgaXMgZmFsc2UgZm9yIHVucmVsYXRlZCByZWFzb25zIHN1Y2ggYXMgYSBtaXNzaW5nIGxvY2FsIHdyYW5nbGVyIGRlcGVuZGVuY3ksIHdoZXJlIHRoZVxuICAgICAgLy8gZmlsZSBtYXkgc3RpbGwgYmUgY29uc3VtZWQpIHRoZSBpZ25vcmUgcnVsZVxuICAgICAgLy8gYWJvdmUgZGlzYXBwZWFycywgc28gYW4gYWxyZWFkeS1nZW5lcmF0ZWQgZmlsZSB3b3VsZCBzdXJmYWNlIGFzIHVudHJhY2tlZCBub2lzZSBvbiBldmVyeVxuICAgICAgLy8gY2hlY2tvdXQg4oCUIGRlbGV0ZSBpdC4gTm8gcmVwb3NpdG9yeSB0cmFja3MgdGhlIGZpbGUgKGRvY3MvZXhwZWN0ZWQtcmVwb3NpdG9yeS1ydWxlcy5tZCksXG4gICAgICAvLyBzbyBhbiBleGlzdGluZyBjb3B5IGlzIGFsd2F5cyBhIGRpc3Bvc2FibGUgZ2VuZXJhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtlclR5cGVzUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzLnByb21pc2VzLnJtKHdvcmtlclR5cGVzUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZpbmV4dC9cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBnaXRpZ25vcmUgdHJlYXRzIGAjYCBhcyBhIGNvbW1lbnQgb25seSBhdCBsaW5lIHN0YXJ0LCBzbyBhIHRyYWlsaW5nIGNvbW1lbnQgKGUuZy4sIHZpbSdzIGAhKi5zdmcgICMgLi4uYClcbiAgICAvLyB0dXJucyB0aGUgd2hvbGUgbGluZSBpbnRvIGEgcGF0dGVybiB0aGF0IG5ldmVyIG1hdGNoZXMuXG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oW14jXFxzXS4qPylbIFxcdF0rKCMuKikkL2dtLCAnJDJcXG4kMScpO1xuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUncyB1bmFuY2hvcmVkIGRlYnVnLyB3b3VsZCBhbHNvIGhpZGUgZnJvbnRlbmQgc291cmNlXG4gICAgICAvLyBkaXJlY3RvcmllcyBzdWNoIGFzIHNyYy9kZWJ1Zy87IGNhcmdvIG91dHB1dCBpcyBhbHJlYWR5IGNvdmVyZWQgYnkgdGFyZ2V0Ly5cbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eZGVidWdcXC8kL2dtLCAnIyBkZWJ1Zy8nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8IGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnSW5QYWNrYWdlcykge1xuICAgICAgLy8gVGhlIHJ1c3QgdGVtcGxhdGUgaWdub3JlcyBDYXJnby5sb2NrLCBidXQgYSBzcmMtdGF1cmkgY29uZmlndXJhdGlvbiBtYXJrcyBhblxuICAgICAgLy8gYXBwbGljYXRpb24sIHdob3NlIENhcmdvLmxvY2sgbXVzdCBiZSBjb21taXR0ZWQgZm9yIHJlcHJvZHVjaWJsZSBidWlsZHMuIFRoZVxuICAgICAgLy8gcnVsZSBpcyBhbHNvIGRpc2FibGVkIHdoZW4gYSBzdWIgcGFja2FnZSBjb250YWlucyBhIFRhdXJpIGFwcGxpY2F0aW9uLCBiZWNhdXNlXG4gICAgICAvLyBhbiB1bmFuY2hvcmVkIENhcmdvLmxvY2sgcnVsZSBpbiBhIHBhcmVudCAuZ2l0aWdub3JlIHdvdWxkIGhpZGUgdGhlIG5lc3RlZFxuICAgICAgLy8gYXBwbGljYXRpb24ncyBsb2NrZmlsZS4gVGF1cmkgcGx1Z2luIGxpYnJhcmllcyAoZGV0ZWN0ZWQgb25seSB2aWFcbiAgICAgIC8vIEB0YXVyaS1hcHBzLyogZGVwZW5kZW5jaWVzKSBrZWVwIHRoZSB0ZW1wbGF0ZSdzIHBvbGljeSBvZiBpZ25vcmluZyBDYXJnby5sb2NrLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15DYXJnb1xcLmxvY2skL2dtLCAnIyBDYXJnby5sb2NrJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRXYmZ5RGlyUGF0aCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG9yZ2FuaXphdGlvbidzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IHRvIHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIEdMT0JBTFxuICogcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3MuIFJlcG9zaXRvcnkgY29uZmlncyBndWFyZCBvbmx5IHdiZmllZCByZXBvc2l0b3JpZXM7IGEgYnJhbmQtbmV3IGxvY2FsXG4gKiBwcm9qZWN0IGhhcyBubyBidW5maWcudG9tbCB5ZXQsIHNvIHRoZSBnbG9iYWwgZmlsZXMgYXJlIHRoZSBvbmx5IGdhdGUgYmV0d2VlbiBgYnVuIGNyZWF0ZWAgL1xuICogYG5wbSBpbml0YCBhbmQgYSBmcmVzaGx5IGNvbXByb21pc2VkIHJlbGVhc2UuIFRoZSBzYW1lIHNjcmlwdCBydW5zIG9uIENJIGFuZCBvbiB0aGUgc2VsZi1ob3N0ZWRcbiAqIHJ1bm5lcnMsIHNvIGV2ZXJ5IG1hY2hpbmUgZW5kcyB1cCB3aXRoIGJ5dGUtaWRlbnRpY2FsIHNldHRpbmdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk6IGJvb2xlYW4ge1xuICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKCdiYXNoJywgW3BhdGguam9pbihnZXRXYmZ5RGlyUGF0aCgpLCAnY29uZmlncycsICdhcHBseVJlbGVhc2VBZ2VHYXRlLnNoJyldLCB7XG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGlmIChzdGF0dXMgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFwcGx5IHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGUgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzLicpO1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSnNPclRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YSB8fCBjb25maWcuZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gS2VlcCBwYWNrYWdlLW1hbmFnZXIgc2hpbXMgaW4gdGhlIEZpbGUgV2F0Y2hlciBwcm9ncmFtIGZpZWxkIHNvIG5vZGUgZG9lcyBub3Rcbi8vIHBhcnNlIHdyYXBwZXIgc2NyaXB0cyBwYXNzZWQgdGhyb3VnaCBhcmd1bWVudHMuXG5jb25zdCBveGZtdFByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9veGZtdCc7XG5jb25zdCBwcmV0dGllclByb2dyYW0gPSAnJFByb2plY3RGaWxlRGlyJC9ub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnKSkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+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/LmZpbGVzKSAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbi5maWxlcy5sZW5ndGggPiAwXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAsIHF1b3RlRm9yU2hlbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi4vdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyxcbiAgaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuLFxuICBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lLFxufSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcbmltcG9ydCB7IGJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMsIGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyB9IGZyb20gJy4vYnVuZmlnLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0RGVwZW5kZW5jeSA9ICd0eXBlc2NyaXB0Jztcbi8vIFR5cGVTY3JpcHQgNydzIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGlzIHRoZSB0c2dvIG5hdGl2ZSBjb21waWxlciBhbmQgZXhwb3NlcyBub1xuLy8gcHJvZ3JhbW1hdGljIEFQSS4gTmV4dC5qcydzIGJ1aWxkLXRpbWUgYHZlcmlmeVR5cGVTY3JpcHRTZXR1cGAgbmVlZHMgdGhhdCBBUEksIHNvXG4vLyBgbmV4dCBidWlsZGAgZmFpbHMgKFwidHJ5aW5nIHRvIHVzZSBUeXBlU2NyaXB0IGJ1dCBkbyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgcGFja2FnZShzKVwiKVxuLy8gd2l0aCBvbmx5IGB0eXBlc2NyaXB0YCB2NyBpbnN0YWxsZWQuIE5leHQuanMgcmVzb2x2ZXMgdGhlIHRzZ28gYmluYXJ5IHRocm91Z2ggdGhlXG4vLyBzZXBhcmF0ZSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgIHBhY2thZ2UsIHNvIE5leHQuanMtZmFtaWx5IHJlcG9zIG11c3QgaW5zdGFsbFxuLy8gYm90aDsgb3RoZXIgcmVwb3Mgb25seSBuZWVkIGB0eXBlc2NyaXB0YCBmb3IgYHRzY2AgdHlwZWNoZWNrcy5cbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCBsZWZ0aG9va0RlcGVuZGVuY3kgPSAnbGVmdGhvb2snO1xuY29uc3QgbWFuYWdlZERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoW1xuICB3YkRlcGVuZGVuY3ksXG4gIGJ1aWxkVHNEZXBlbmRlbmN5LFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHREZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0R29EZXBlbmRlbmN5LFxuICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAvLyBNaXhlZCBAdHlwZXMvYnVuIHZlcnNpb25zIGFjcm9zcyBhIG1vbm9yZXBvIGxvYWQgdHdvIGJ1bi10eXBlcyBjb3BpZXMsIHdoaWNoXG4gIC8vIGJyZWFrcyBnbG9iYWwgaW50ZXJmYWNlIG1lcmdpbmcgKGUuZy4gUmVzcG9uc2UvSGVhZGVycykgZHVyaW5nIHR5cGUgY2hlY2tpbmcuXG4gICdAdHlwZXMvYnVuJyxcbiAgLi4ub3hsaW50RGVwcyxcbl0pO1xuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBwYWNrYWdlQWdlR2F0ZU1zID0gYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzICogMTAwMDtcbmNvbnN0IG5wbVBhY2thZ2VUaW1lc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd29ya2VyVHlwZXNTY3JpcHRFcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoY29uZmlnKTtcbiAgaWYgKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpIHRocm93IG5ldyBFcnJvcih3b3JrZXJUeXBlc1NjcmlwdEVycm9yKTtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAvLyBPbiBhIGZpcnN0IHJ1biB0aGVyZSBpcyBubyBtYW5pZmVzdCBmb3IgYGJ1biBhZGRgIHRvIHVwZGF0ZSByZWxpYWJseS4gV3JpdGUgdGhlIHJlc29sdmVkXG4gIC8vIGRlcGVuZGVuY3kgdmVyc2lvbnMgaW50byB0aGUgbmV3IG1hbmlmZXN0IGRpcmVjdGx5OyB0aGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGBidW4gaW5zdGFsbGBcbiAgLy8gdGhlbiBpbnN0YWxscyB0aGVtIGFuZCByZW1haW5zIHRoZSBhdXRob3JpdGF0aXZlIGZhaWx1cmUgY2hlY2suXG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBkZXBlbmRlbmN5VXBkYXRlcyxcbiAgICBza2lwQWRkaW5nRGVwcyB8fCAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb25cbiAgKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGdlbmVyYXRlZFxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgLy8gQSByZWZ1c2VkIHdyaXRlIChlLmcuIGEgc3ltbGlua2VkIHBhY2thZ2UuanNvbikgbXVzdCBhbHNvIGFib3J0IHRoZSBkZXBlbmRlbmN5IGluc3RhbGxhdGlvblxuICAvLyBiZWxvdzogYGJ1biBhZGRgIGZvbGxvd3MgdGhlIHN5bWxpbmsgYW5kIHdvdWxkIG1vZGlmeSB0aGUgZmlsZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSkpKSByZXR1cm47XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgICAvLyBBIG5ld2x5IGNyZWF0ZWQgbWFuaWZlc3QgaXMgYWxyZWFkeSBzb3J0ZWQgYnkgd2JmeSdzIGJ1bmRsZWQgc2VyaWFsaXplcjsgdGhlIHRhcmdldCBmb3JtYXR0ZXJcbiAgICAvLyBpcyBhdmFpbGFibGUgd2l0aG91dCBhbiBleHRyYSBmZXRjaCBvbmx5IHdoZW4gdGhpcyBydW4gc3RhcnRlZCB3aXRoIHBhY2thZ2UuanNvbi5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBmaWxlUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBsZXQganNvbk9iajogUGFja2FnZUpzb24gPSB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBEb2N1bWVudGF0aW9uLW9ubHkgcmVwb3NpdG9yaWVzIGhhdmUgbm8gbWFuaWZlc3Qgb24gdGhlaXIgZmlyc3Qgd2JmeSBydW4uIFN0YXJ0aW5nIGZyb20gYW5cbiAgICAvLyBlbXB0eSBvYmplY3QgbGV0cyB0aGUgbm9ybWFsIGdlbmVyYXRvciBlc3RhYmxpc2ggdGhlIHNhbWUgbWFuYWdlZCBiYXNlbGluZSBhcyBldmVyeSBvdGhlclxuICAgIC8vIHJlcG9zaXRvcnk7IG1hbGZvcm1lZCBvciB1bnJlYWRhYmxlIGV4aXN0aW5nIG1hbmlmZXN0cyBtdXN0IHN0aWxsIGZhaWwgbG91ZGx5LlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICAvLyBSdW4gYmVmb3JlIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucywgd2hpY2ggcmUtYWRkcyB0c2dvIG9ubHkgZm9yIGN1cnJlbnQgTmV4dC5qcy1mYW1pbHkgcmVwb3NpdG9yaWVzLlxuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xufVxuXG4vKipcbiAqIEtlZXBzIHRoZSBwcm9qZWN0J3Mgb3duIHNlZ21lbnRzIGluIG9yZGVyLCByZXBsYWNpbmcgdGhlIGZpcnN0IG1hbmFnZWQgZ2VuLWNvZGUgc3BlbGxpbmcgd2l0aFxuICogYGJ1biB3YiBnZW4tY29kZWAgYW5kIGRyb3BwaW5nIGxhdGVyIGR1cGxpY2F0ZXMuIEFwcGVuZHMgZ2VuZXJhdGlvbiBvbmx5IHdoZW4gdGhlIHNjcmlwdFxuICogY29udGFpbmVkIG5vbmUsIHNvIG5vdGhpbmcgaXMgcmVvcmRlcmVkLlxuICovXG5mdW5jdGlvbiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50czogc3RyaW5nW10sIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtpbmRzID0gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwgc2NyaXB0cywgdHJ1ZSkpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IGdlbmVyYXRlczsgYWRkaW5nIGFub3RoZXIgaW52b2NhdGlvbiB3b3VsZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICBsZXQgZ2VuZXJhdGlvblBsYWNlZCA9IGtpbmRzLmluY2x1ZGVzKCdnZW5Db2RlV3JhcHBlcicpO1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBraW5kID0ga2luZHNbaW5kZXhdO1xuICAgIGlmIChraW5kID09PSAnY3VzdG9tJyB8fCBraW5kID09PSAnZ2VuQ29kZVdyYXBwZXInKSB7XG4gICAgICByZXN1bHQucHVzaChzZWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSB7XG4gICAgICByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gICAgICBnZW5lcmF0aW9uUGxhY2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFnZW5lcmF0aW9uUGxhY2VkKSByZXN1bHQucHVzaCgnYnVuIHdiIGdlbi1jb2RlJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnRzIHdoaWxlIGtlZXBpbmcgdGhlIGZpcnN0IHNlZ21lbnQncyBwb3NpdGlvbiBzbyBhIGN1c3RvbVxuICogc3RlcCB0aGF0IGNvbnN1bWVzIGdlbmVyYXRlZCBvdXRwdXQgc3RpbGwgcnVucyBhZnRlciBpdC4gUmV0dXJucyB3aXRob3V0IGNoYW5naW5nIGFuXG4gKiB1bnBhcnNlYWJsZSBzY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBvc3RpbnN0YWxsU2NyaXB0KHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIG1hbmFnZXNXb3JrZXJUeXBlczogYm9vbGVhbik6IHZvaWQge1xuICAvLyBgYnVuIHdiIGdlbi1jb2RlYCByZWdlbmVyYXRlcyB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIGl0c2VsZiwgc28gYSBwYWNrYWdlIHdpdGggYVxuICAvLyBjb2RlLWdlbmVyYXRpb24gb3Igd29ya2VyLXR5cGVzIHBpcGVsaW5lIGdldHMgb25lIG1hbmFnZWQgZ2VuZXJhdGlvbiBzZWdtZW50LlxuICBpZiAoc2NyaXB0c1snZ2VuLWNvZGUnXSB8fCBtYW5hZ2VzV29ya2VyVHlwZXMpIHtcbiAgICAvLyBQcm9qZWN0LW93bmVkIHN0ZXBzIGFyZSBuZXZlciBkcm9wcGVkLCBhbmQgdGhlaXIgUE9TSVRJT04gcmVsYXRpdmUgdG8gZ2VuZXJhdGlvbiBpcyBwcmVzZXJ2ZWQ6IGEgc3RlcFxuICAgIC8vIGJlZm9yZSBpdCBtYXkgcHJvZHVjZSBgd3JhbmdsZXIgdHlwZXNgJyBpbnB1dHMgKGEgd3JhbmdsZXIgY29uZmlnLCBgLmRldi52YXJzYCksIHdoaWxlIG9uZSBhZnRlciBpdCBtYXlcbiAgICAvLyBjb25zdW1lIHRoZSBnZW5lcmF0ZWQgdHlwZXMuIFNvIHRoZSBtYW5hZ2VkIGdlbmVyYXRpb24gcmVwbGFjZXMgdGhlIGZpcnN0IG1hbmFnZWQgc2VnbWVudCBpbiBwbGFjZSwgYW5kIGlzXG4gICAgLy8gYXBwZW5kZWQgb25seSB3aGVuIHRoZSBzY3JpcHQgaGFkIG5vbmUuIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgcGVyZm9ybXMgdGhlXG4gICAgLy8gZ2VuZXJhdGlvbiBwbHVzIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBzdXBwcmVzc2VzIHRoZSByZXBsYWNlbWVudCBlbnRpcmVseS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHNjcmlwdHMucG9zdGluc3RhbGwgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsKTtcbiAgICBjb25zdCBrZXB0U2VnbWVudHMgPSBzZWdtZW50cyAmJiByZWJ1aWxkUG9zdGluc3RhbGxTZWdtZW50cyhzZWdtZW50cywgc2NyaXB0cyk7XG4gICAgaWYgKGtlcHRTZWdtZW50cykge1xuICAgICAgc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGtlcHRTZWdtZW50cy5qb2luKCcgJiYgJyk7XG4gICAgfVxuICAgIC8vIEFueSBvdGhlciB1bnBhcnNlYWJsZSBwb3N0aW5zdGFsbCBpcyBsZWZ0IHRvIGEgaHVtYW4gcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIC8vIExlZnRob29rIGdlbmVyYXRpb24gaXMgYmVzdC1lZmZvcnQgYW5kIC5sZWZ0aG9vayBpcyBhYnNlbnQgZnJvbSBEb2NrZXIgYnVpbGQgY29udGV4dHMsIHNvIGFcbiAgICAvLyBtaXNzaW5nIG5vcm1hbGl6ZXIgaXMgdmFsaWQuIE9uY2UgcHJlc2VudCwgaXRzIGZhaWx1cmUgbXVzdCBhYm9ydCBpbnN0YWxsIHJhdGhlciB0aGFuIGxlYXZlIGFcbiAgICAvLyBHdWFyZC1waW5uZWQgbG9ja2ZpbGUgYmVoaW5kOyBrZWVwIHRoYXQgZmFpbC1mYXN0IGdyb3VwaW5nIGV4cGxpY2l0IGJlZm9yZSBhbnkgd29ya3NwYWNlIGJ1aWxkLlxuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID1cbiAgICAgICcoYnVuIGxlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSkgJiYgKHRlc3QgISAtZiAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCB8fCBiYXNoIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoKSc7XG4gICAgLy8gV2hlbiBAd2lsbGJvb3N0ZXIvd2IgaXMgYSB3b3Jrc3BhY2Ugb2YgdGhpcyByZXBvc2l0b3J5LCB0aGUgZ2VuZXJhdGVkIGBidW4gd2Ig4oCmYCBzY3JpcHRzIHJ1blxuICAgIC8vIGl0cyBnaXRpZ25vcmVkIGRpc3QgYnVpbGQgKGJpbi9pbmRleC5qcyBpbXBvcnRzIC4uL2Rpc3QvaW5kZXguanMpLCBzbyBhIGZyZXNoIGNoZWNrb3V0IG11c3RcbiAgICAvLyBidWlsZCBpdCBkdXJpbmcgaW5zdGFsbDsgcmVnaXN0cnkgaW5zdGFsbHMgc2hpcCBhIHByZWJ1aWx0IGRpc3QgYW5kIG5lZWQgbm8gZXh0cmEgc3RlcC5cbiAgICBjb25zdCB3YldvcmtzcGFjZURpciA9IGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmdldCh3YkRlcGVuZGVuY3kpO1xuICAgIGlmICh3YldvcmtzcGFjZURpcikge1xuICAgICAgLy8gUXVvdGVkIHVubGVzcyB0aGUgbmFtZSBjYXJyaWVzIG5vIHNoZWxsIG1lYW5pbmcsIHNvIHRoYXQgYCQo4oCmKWAgb3IgYSB2YXJpYWJsZSBhIGhvc3RpbGVcbiAgICAgIC8vIGRpcmVjdG9yeSBuYW1lIGNvdWxkIHNtdWdnbGUgaW50byB0aGUgZ2VuZXJhdGVkIHNjcmlwdCBuZXZlciByZWFjaGVzIHRoZSBzaGVsbCB1bnF1b3RlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlICs9IGAgJiYgYnVuIHJ1biAtLWN3ZCAke3F1b3RlRm9yU2hlbGwod2JXb3Jrc3BhY2VEaXIpfSBidWlsZGA7XG4gICAgfVxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGxlZnRob29rRGVwZW5kZW5jeSk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2UoanNvbk9iai5zY3JpcHRzLnJlbGVhc2UpKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0UnVudGltZSkge1xuICAgICAgLy8gUnVudGltZSBpbXBvcnRzIG5lZWQgdGhlIHN0YW5kYWxvbmUgcGFja2FnZSBhZnRlciBEb2NrZXIgcHJ1bmluZyByZW1vdmVzIGRldkRlcGVuZGVuY2llcy5cbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz89XG4gICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz9cbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSA/P1xuICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ3BsYXl3cmlnaHQnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby4gWWFybiB2MSdzIG9iamVjdCBmb3JtIGtlZXBzIGl0c1xuICAgICAgLy8gZGVjbGFyZWQgcGF0dGVybnMgKHdvcmtzcGFjZXMucGFja2FnZXMpOyBvbmx5IGV4dHJhcyBzdWNoIGFzIG5vaG9pc3QgYXJlIGRyb3BwZWQuXG4gICAgICAvLyBGb3JjZSBgcGFja2FnZXMvKmAgb25seSB3aGVuIGl0IGFjdHVhbGx5IG1hdGNoZXMgYSB3b3Jrc3BhY2UgbWFuaWZlc3Q6IGFuIGFwcHMvKi1vbmx5XG4gICAgICAvLyBtb25vcmVwbyBtdXN0IG5vdCBnZXQgYSBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGFwcGVuZGVkIHRvIGl0cyBkZWNsYXJhdGlvbi4gQVxuICAgICAgLy8gYmFzZWxpbmUtc2VlZGluZyBkZWNsYXJhdGlvbiBuZWVkcyBubyBmb3JjZWQgcGF0dGVybiBhdCBhbGwg4oCUIHRoZSBzZWVkZWQgYmFzZWxpbmVcbiAgICAgIC8vIChgKi8qYCBvciBgKipgKSBhbHJlYWR5IGNvdmVycyBwYWNrYWdlcy8qLiBUaGUgZm9yY2VkIHBhdHRlcm4gaXMgUFJFUEVOREVEOiBCdW5cbiAgICAgIC8vIGV2YWx1YXRlcyB3b3Jrc3BhY2UgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBhIHBvc2l0aXZlIHBhdHRlcm4gcGxhY2VkIGFmdGVyIGEgdXNlclxuICAgICAgLy8gbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcy4gQSBkZWNsYXJhdGlvbiB0aGF0IGFscmVhZHkgY292ZXJzXG4gICAgICAvLyBwYWNrYWdlcy8qIHVuZGVyIG5vcm1hbGl6YXRpb24gKGUuZy4gYC4vcGFja2FnZXMvKmApIGlzIGtlcHQgdmVyYmF0aW06IGZvcmNpbmcgYSB0ZXh0dWFsXG4gICAgICAvLyBgcGFja2FnZXMvKmAgbmV4dCB0byBpdCB3b3VsZCBwZXJzaXN0IGEgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybi5cbiAgICAgIGNvbnN0IGZvcmNlZFBhdHRlcm5zID1cbiAgICAgICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUoanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgeyBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfSkubGVuZ3RoID4gMFxuICAgICAgICAgID8gWydwYWNrYWdlcy8qJ11cbiAgICAgICAgICA6IFtdO1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gbWVyZ2UuYWxsKFtmb3JjZWRQYXR0ZXJucywgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhqc29uT2JqLndvcmtzcGFjZXMpXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIEJvdGggaW5wdXRzIGNhbiBiZSBlbXB0eSAoZS5nLiBwYWNrYWdlcy9wYWNrYWdlLmpzb24gd2l0aG91dCBhbnkgcGFja2FnZXMvKi9wYWNrYWdlLmpzb25cbiAgICAgIC8vIGFuZCBubyBkZWNsYXJlZCB3b3Jrc3BhY2VzKTsgZG8gbm90IHBlcnNpc3QgYSBtZWFuaW5nbGVzcyBgd29ya3NwYWNlczogW11gLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSAmJiBqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpeGVycy9uZXh0Q29uZmlnLnRzIGVuYWJsZXMgYHJlYWN0Q29tcGlsZXI6IHRydWVgIGZvciBldmVyeSBOZXh0LmpzIHByb2plY3QsIGFuZCBOZXh0LmpzXG4gIC8vIHJlc29sdmVzIGBiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXJgIGF0IGJ1aWxkIHRpbWUgd2hlbiBSZWFjdCBDb21waWxlciBpcyBvbi4gQWRkIGl0IGhlcmUgc29cbiAgLy8gdGhlIG1hbmFnZWQgbmV4dC5jb25maWcgbmV2ZXIgYnJlYWtzIGBuZXh0IGJ1aWxkYCB3aXRoIGFuIHVucmVzb2x2ZWQtcGFja2FnZSBlcnJvci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXInKTtcbiAgfVxuXG4gIC8vIGB3YiB2ZXJpZnkgLS1mdWxsYCBhdWRpdHMgZXZlcnkgYCouc2xpZGV2Lm1kYCBkZWNrIHdpdGggc2xpZGV2LWNoZWNrLCBzbyB0aGUgY2hlY2tlciBoYXMgdG8gYmVcbiAgLy8gaW5zdGFsbGVkIHdoZXJldmVyIGEgZGVjayBsaXZlcy5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblNsaWRldk1kKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NsaWRldi1jaGVjaycpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIC8vIEEgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBkZXBlbmRzIG9uIHRoZSB3YiBkZXZlbG9wZWQgaW4gdGhpcyByZXBvc2l0b3J5IChlLmcuXG4gICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGl0c2VsZik7IGluc3RhbGxpbmcgdGhlIGxhdGVzdCByZWdpc3RyeSByZWxlYXNlIG92ZXIgaXQgd291bGQgc2lsZW50bHlcbiAgICAvLyByZXBsYWNlIHRoZSBsb2NhbCBidWlsZCB3aXRoIGEgcHVibGlzaGVkIG9uZSwgc28gbGVhdmUgc3VjaCBhIGRlY2xhcmF0aW9uIHVudG91Y2hlZC5cbiAgICBjb25zdCB3YlNwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XTtcbiAgICBpZiAoIXdiU3BlY2lmaWVyPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgICAvLyBUaGUgZ2VuZXJhdGVkICouY29uZmlnLnRzIGZpbGVzIGFyZSB0eXBlLWNoZWNrZWQgYnkgdGhlIGxpbnQgcHJvamVjdCBldmVuIGluIEphdmFTY3JpcHQtb25seVxuICAgIC8vIHJlcG9zaXRvcmllcy4gUmVhY3QgTmF0aXZlIHJlbGllcyBvbiBAdHNjb25maWcvcmVhY3QtbmF0aXZlJ3MgYW1iaWVudCB0eXBlcyBpbnN0ZWFkLlxuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSwgc28gaXQgaXNcbiAgICAvLyBub3cgdGhlIG1hbmFnZWQgY29tcGlsZXIgZm9yIGV2ZXJ5IFR5cGVTY3JpcHQgcmVwbyAodHlwZWNoZWNraW5nIHJ1bnMgYHRzY2ApLlxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHREZXBlbmRlbmN5KTtcbiAgICAvLyBOZXh0LmpzJ3MgYG5leHQgYnVpbGRgIGluc3BlY3RzIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHRvIHJ1biBpdHMgdHlwZVxuICAgIC8vIGNoZWNrOyB0aGUgYHR5cGVzY3JpcHRgIHY3IHBhY2thZ2UgYWxvbmUgbGFja3MgdGhlIEFQSSBuZXh0IG5lZWRzLCBzbyBrZWVwIGJvdGhcbiAgICAvLyBpbnN0YWxsZWQgZm9yIE5leHQuanMtZmFtaWx5IHJlcG9zLiBTZWUgdGhlIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgY29tbWVudCBhYm92ZS5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBweXRob25EZXZEZXBlbmRlbmNpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBweXRob25EZXZEZXBlbmRlbmNpZXMgfTtcbn1cblxuZnVuY3Rpb24gZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9cXGIoPzpidW54fG5weHxwbnBtXFxzK2RseHx5YXJuXFxzK2RseClcXHMrc2VtYW50aWMtcmVsZWFzZSg/OkBcXFMrKT9cXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwga2VlcEFzUnVudGltZV0gb2YgW1xuICAgIFt3YkRlcGVuZGVuY3ksIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICAgIFtidWlsZFRzRGVwZW5kZW5jeSwgc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgXSBhcyBjb25zdCkge1xuICAgIGlmIChrZWVwQXNSdW50aW1lKSB7XG4gICAgICBjb25zdCBkZXZWZXJzaW9uID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWRldlZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghcnVudGltZVZlcnNpb24gfHwgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGRldlZlcnNpb24sIHJ1bnRpbWVWZXJzaW9uKSkge1xuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGRldlZlcnNpb247XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfSBlbHNlIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkge1xuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPz89IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gaW1hZ2VzIHJ1biBtaWdyYXRpb25zIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLCBqdXN0IGFzIHBhY2thZ2UgbWFuYWdlcnNcbiAgLy8gcnVuIHBvc3RpbnN0YWxsIGR1cmluZyBwcm9kdWN0aW9uIGluc3RhbGxzLCBzbyBib3RoIGVudHJ5IHBvaW50cyBtdXN0IHJldGFpbiB0aGUgd2IgYmluYXJ5LlxuICAvLyBLZWVwIHRoZSB3b3JkIG1hdGNoIGNvbnNlcnZhdGl2ZTogc3VwcG9ydGVkIGN1c3RvbSB3cmFwcGVycyBjYW4gcHV0IHdiIGluc2lkZSBzaGVsbCBsb29wcyB0aGF0XG4gIC8vIHRoZSBjb21tYW5kLXBvc2l0aW9uIHBhcnNlciBjYW5ub3QgY2xhc3NpZnksIHdoaWxlIGEgZmFsc2UgcG9zaXRpdmUgb25seSByZXRhaW5zIHRoZSBDTEkuXG4gIHJldHVybiBbanNvbk9iai5zY3JpcHRzPy5wb3N0aW5zdGFsbCwganNvbk9iai5zY3JpcHRzPy5bJ2RiLW1pZ3JhdGUnXV0uc29tZShcbiAgICAoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2JcXGIvdS50ZXN0KHNjcmlwdClcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaXNtYSA9IGpzb25PYmoucHJpc21hIGFzIHsgc2VlZD86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMocHJpc21hPy5zZWVkKSB8fCBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKGpzb25PYmouc2NyaXB0cz8uc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoc2VlZENvbW1hbmQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBEb2NrZXIgaW1hZ2VzIHJ1biBzZWVkIHNjcmlwdHMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsXG4gIC8vIHNvIFR5cGVTY3JpcHQgc2VlZCBydW5uZXJzIG11c3QgcmVtYWluIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuICByZXR1cm4gdHlwZW9mIHNlZWRDb21tYW5kID09PSAnc3RyaW5nJyAmJiAvKD88IVtcXHctXSlidWlsZC10cyg/IVtcXHctXSkvdS50ZXN0KHNlZWRDb21tYW5kKTtcbn1cblxuY29uc3QgZGVwZW5kZW5jeURlY2xhcmF0aW9uU2VjdGlvbnMgPSBbXG4gICdkZXBlbmRlbmNpZXMnLFxuICAnZGV2RGVwZW5kZW5jaWVzJyxcbiAgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJyxcbiAgJ3BlZXJEZXBlbmRlbmNpZXMnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JjZXMgc3RvcmUtaW5jb21wYXRpYmxlIHBhY2thZ2VzIHRvIHN0YXkgcHJvamVjdC1sb2NhbCB3aGVuIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgZW5hYmxlc1xuICogQnVuJ3MgZ2xvYmFsIHN0b3JlOiBgY2hha3JhIHR5cGVnZW5gIChydW4gYnkgYHdiIGdlbi1jb2RlYClcbiAqIHdyaXRlcyBnZW5lcmF0ZWQgdHlwZXMgaW50byB0aGUgaW5zdGFsbGVkIEBjaGFrcmEtdWkvcmVhY3QgcGFja2FnZSwgd2hpY2ggd291bGQgb3RoZXJ3aXNlXG4gKiBtdXRhdGUgdGhlIG1hY2hpbmUtd2lkZSBzdG9yZSBzaGFyZWQgYWNyb3NzIHJlcG9zaXRvcmllcywgYW5kIGRyaXp6bGUta2l0IHJlcXVpcmVzIGRyaXp6bGUtb3JtXG4gKiB3aXRob3V0IGRlY2xhcmluZyBpdCwgd2hpY2ggdGhlIHN0b3JlIHJlYWxwYXRoIHBsYWNlcyBiZXlvbmQgYSBwbGFpbiBub2RlX21vZHVsZXMgd2Fsay11cC5cbiAqIExpc3RpbmcgdGhlbSBpbiBgdHJ1c3RlZERlcGVuZGVuY2llc2AgbWFrZXMgQnVuIG1hdGVyaWFsaXplIGEgcGVyLXByb2plY3QgY29weSB1bmRlclxuICogYG5vZGVfbW9kdWxlcy8uYnVuL2AsIHdob3NlIHNpYmxpbmcgYG5vZGVfbW9kdWxlcy8uYnVuL25vZGVfbW9kdWxlcy9gIGxpbmtzIGV2ZXJ5IGluc3RhbGxlZFxuICogcGFja2FnZSBhbmQgdGhlcmVmb3JlIHJlc29sdmVzIHRoZSB1bmRlY2xhcmVkIHJlcXVpcmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBCdW4gY29uc3VsdHMgdHJ1c3RlZERlcGVuZGVuY2llcyBpbiB0aGUgd29ya3NwYWNlIHJvb3QncyBwYWNrYWdlLmpzb24gb25seSwgc28gdGhlIGxpc3QgaXNcbiAgLy8gbWFuYWdlZCB0aGVyZSBhbmQgbXVzdCBjb3ZlciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgYW55d2hlcmUgaW4gdGhlIHJlcG9zaXRvcnkuXG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuICBjb25zdCBidW5Kc29uT2JqID0ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uICYgeyB0cnVzdGVkRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfTtcbiAgLy8gQnVuIGluc3RhbGxzIG9wdGlvbmFsIGFuZCBwZWVyIGRlcGVuZGVuY2llcyBieSBkZWZhdWx0LCBzbyBhbGwgZGVjbGFyYXRpb24gc2VjdGlvbnMgY291bnQuXG4gIC8vIEV2ZXJ5IGRlY2xhcmVkIHJhbmdlIGlzIGtlcHQgcGVyIHBhY2thZ2U6IGEgcm9vdCBkZWNsYXJhdGlvbiBtdXN0IG5vdCBtYXNrIGEgd29ya3NwYWNlIG9uZVxuICAvLyAoZS5nLiByb290IEBjaGFrcmEtdWkvY2xpIHYyIGFsb25nc2lkZSBhIHdvcmtzcGFjZSBvbiB2MykuXG4gIGNvbnN0IGRlY2xhcmVkRGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBjb25zdCBhZGREZWNsYXJlZERlcGVuZGVuY2llcyA9IChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZGVwZW5kZW5jeURlY2xhcmF0aW9uU2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCB2ZXJzaW9uUmFuZ2VdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uW3NlY3Rpb25dID8/IHt9KSkge1xuICAgICAgICBpZiAodHlwZW9mIHZlcnNpb25SYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCB2ZXJzaW9uUmFuZ2VzID0gZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KGRlcGVuZGVuY3lOYW1lKTtcbiAgICAgICAgICBpZiAodmVyc2lvblJhbmdlcykge1xuICAgICAgICAgICAgdmVyc2lvblJhbmdlcy5wdXNoKHZlcnNpb25SYW5nZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlY2xhcmVkRGVwZW5kZW5jaWVzLnNldChkZXBlbmRlbmN5TmFtZSwgW3ZlcnNpb25SYW5nZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoY29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBhZGREZWNsYXJlZERlcGVuZGVuY2llcyhcbiAgICAgICAgSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucmVhZGFibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICAvLyBPbmx5IEBjaGFrcmEtdWkvY2xpIHYzJ3MgYGNoYWtyYSB0eXBlZ2VuYCB3cml0ZXMgaW50byB0aGUgaW5zdGFsbGVkIEBjaGFrcmEtdWkvcmVhY3Q7XG4gIC8vIHYyJ3MgYGNoYWtyYS1jbGkgdG9rZW5zYCB3cml0ZXMgaW50byBAY2hha3JhLXVpL3N0eWxlZC1zeXN0ZW0gaW5zdGVhZCwgc28gdHJ1c3RpbmdcbiAgLy8gQGNoYWtyYS11aS9yZWFjdCB0aGVyZSB3b3VsZCBmb3JjZSBhIHVzZWxlc3MgcHJvamVjdC1sb2NhbCBjb3B5IHdpdGhvdXQgZml4aW5nIGdlbi1jb2RlLlxuICAvLyBNaXJyb3Igd2IgZ2VuLWNvZGUncyBjbGFzc2lmaWNhdGlvbjogb25seSBhIHJhbmdlIHdob3NlIGxlYWRpbmcgbWFqb3IgcGFyc2VzIHRvIDIgc2VsZWN0cyB0aGVcbiAgLy8gdjIgY29tbWFuZCwgc28gZGlnaXRsZXNzIHNwZWNzIGxpa2UgYGxhdGVzdGAgb3IgY2F0YWxvZyByZWZlcmVuY2VzIGNvdW50IGFzIHYzLlxuICBjb25zdCBoYXNDaGFrcmFDbGlWMyA9IChkZWNsYXJlZERlcGVuZGVuY2llcy5nZXQoJ0BjaGFrcmEtdWkvY2xpJykgPz8gW10pLnNvbWUoXG4gICAgKHZlcnNpb25SYW5nZSkgPT4gL1xcZCsvdS5leGVjKHZlcnNpb25SYW5nZSk/LlswXSAhPT0gJzInXG4gICk7XG4gIGNvbnN0IHJlcXVpcmVkV2JmeVBhY2thZ2VzID0gW1xuICAgIC4uLihoYXNDaGFrcmFDbGlWMyAmJiBkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0BjaGFrcmEtdWkvcmVhY3QnKSA/IFsnQGNoYWtyYS11aS9yZWFjdCddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2RyaXp6bGUta2l0JykgPyBbJ2RyaXp6bGUta2l0J10gOiBbXSksXG4gICAgLy8gVGhlc2UgZ2l0LWRlcGVuZGVuY3kgYnVpbGRzIGltcG9ydCBwYWNrYWdlcyB0aGV5IGRvIG5vdCBkZWNsYXJlIChlLmcuIHpvZCksIHdoaWNoIHRoZVxuICAgIC8vIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwOyBhIHByb2plY3QtbG9jYWwgY29weSB1bmRlclxuICAgIC8vIG5vZGVfbW9kdWxlcy8uYnVuIHJlc29sdmVzIHRoZW0gKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3Byb21wdC1zdHVkeSkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykgPyBbJ0B3aWxsYm9vc3Rlci9qdWRnZSddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSA/IFsnQHdpbGxib29zdGVyL2xsbS1wcm94eSddIDogW10pLFxuICAgIC8vIGJsaXR6IGFuZCBAYmxpdHpqcy9hdXRoIHJlcXVpcmUgcmVhY3QgKGFuZCBvdGhlciBwZWVycykgd2l0aG91dCBkZWNsYXJpbmcgdGhlbSwgcmVseWluZyBvblxuICAgIC8vIGhvaXN0aW5nLCB3aGljaCB0aGUgZ2xvYmFsLXN0b3JlIGxheW91dCBwbGFjZXMgYmV5b25kIHRoZWlyIHdhbGstdXAgKG9ic2VydmVkIGluXG4gICAgLy8gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbTogYG5leHQgYnVpbGRgIHBhZ2UtZGF0YSBjb2xsZWN0aW9uIGRpZXMgd2l0aCBcIkNhbm5vdCBmaW5kIG1vZHVsZVxuICAgIC8vICdyZWFjdCdcIiBmcm9tIEBibGl0empzL2F1dGgpLiBAYmxpdHpqcy9ycGMgaXMgTk9UIGxpc3RlZCBiZWNhdXNlIGl0IHByb3Blcmx5IGRlY2xhcmVzIGl0c1xuICAgIC8vIHJlYWN0L0B0YW5zdGFjayBwZWVycywgc28gQnVuIGxpbmtzIHRoZW0gaW50byBpdHMgc3RvcmUgZW50cnkuIEBibGl0empzL25leHQgaXNcbiAgICAvLyBkZWxpYmVyYXRlbHkgTk9UIGxpc3RlZCBlaXRoZXI6IHRydXN0aW5nIGl0IHdvdWxkIHJ1biBpdHMgcG9zdGluc3RhbGwgKGBibGl0eiBjb2RlZ2VuYCksXG4gICAgLy8gd2hpY2ggcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbiBwbGFjZSDigJQgcmVwb3NpdG9yaWVzIHBhdGNoIG91dCB0aGF0IHBvc3RpbnN0YWxsXG4gICAgLy8gd2l0aCBgYnVuIHBhdGNoYCBpbnN0ZWFkLCB3aGljaCBhbHNvIGtlZXBzIHRoZSBwYWNrYWdlIHByb2plY3QtbG9jYWwuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnYmxpdHonKSA/IFsnYmxpdHonXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAYmxpdHpqcy9hdXRoJykgPyBbJ0BibGl0empzL2F1dGgnXSA6IFtdKSxcbiAgICAvLyBCdW4gZG9lcyBub3QgbGluayBAaG9va2Zvcm0vcmVzb2x2ZXJzJyBPUFRJT05BTCB2YWxpZGF0b3IgcGVlcnMgKGUuZy4gem9kKSBpbnRvIGl0c1xuICAgIC8vIGdsb2JhbC1zdG9yZSBlbnRyeSBldmVuIHdoZW4gdGhlIHByb2plY3QgaW5zdGFsbHMgdGhlbSwgc28gaXRzIHNlcnZlci1zaWRlXG4gICAgLy8gYGltcG9ydCAnem9kJ2AgZmFpbHMgZnJvbSB0aGUgc3RvcmUgKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW0pLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0Bob29rZm9ybS9yZXNvbHZlcnMnKSA/IFsnQGhvb2tmb3JtL3Jlc29sdmVycyddIDogW10pLFxuICAgIC8vIEB6b29tL3J0bXMgaW5zdGFsbHMgaXRzIG5hdGl2ZSBydG1zLm5vZGUgYmluZGluZyBpbiBhIGxpZmVjeWNsZSBzY3JpcHQuIFdpdGhvdXQgZXhwbGljaXRcbiAgICAvLyB0cnVzdCwgQnVuIHNraXBzIHRoYXQgc2NyaXB0IGFuZCB0aGUgcGFja2FnZSBmYWlscyBhcyBzb29uIGFzIHRoZSBab29tIGJvdCBpbXBvcnRzIGl0XG4gICAgLy8gKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3NtYXJ0c2Utem9vbS1ib3QpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B6b29tL3J0bXMnKSA/IFsnQHpvb20vcnRtcyddIDogW10pLFxuICBdO1xuXG4gIC8vIHdiZnkgZnVsbHkgb3ducyB0aGlzIGZpZWxkOiBhIHBhY2thZ2Ugd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgbXVzdCBydW4gZ2V0cyBhZGRlZCB0byB3YmZ5XG4gIC8vIGl0c2VsZiBpbnN0ZWFkIG9mIHRvIGluZGl2aWR1YWwgcmVwb3NpdG9yaWVzLCBzbyB1bm1hbmFnZWQgZW50cmllcyBhcmUgYWx3YXlzIHJlbW92ZWQg4oCUXG4gIC8vIGluY2x1ZGluZyBhbiBleHBsaWNpdGx5IGVtcHR5IGRlbnktYWxsIGxpc3QsIHdob3NlIGRlbGV0aW9uIGRlbGliZXJhdGVseSByZXN0b3JlcyBCdW4nc1xuICAvLyBkZWZhdWx0IGFsbG93LWxpc3QgKHRoZSBvd25lcnNoaXAgcG9saWN5IGNob3NlbiBpbiAjOTc1KS5cbiAgY29uc3QgZXhpc3RpbmdUcnVzdGVkID0gYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzO1xuICBpZiAocmVxdWlyZWRXYmZ5UGFja2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGV4aXN0aW5nVHJ1c3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBEZWxldGluZyB0aGUgZmllbGQgcmVzdG9yZXMgQnVuJ3MgZnVsbCBkZWZhdWx0IGFsbG93LWxpc3QsIHNvIG9ubHkgZW50cmllcyBvdXRzaWRlIHRoYXRcbiAgICAgIC8vIGxpc3QgYWN0dWFsbHkgbG9zZSB0aGVpciBsaWZlY3ljbGUgc2NyaXB0cy5cbiAgICAgIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywgZXhpc3RpbmdUcnVzdGVkLCBuZXcgU2V0KCkpO1xuICAgICAgZGVsZXRlIGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQW4gZXhwbGljaXQgdHJ1c3RlZERlcGVuZGVuY2llcyBsaXN0IFJFUExBQ0VTIEJ1bidzIGRlZmF1bHQgYWxsb3ctbGlzdCBpbnN0ZWFkIG9mIGV4dGVuZGluZ1xuICAvLyBpdCwgYW5kIEJ1biBwcmludHMgbm8gd2FybmluZyBmb3IgdGhlIHBvc3RpbnN0YWxscyBpdCBjb25zZXF1ZW50bHkgc2tpcHMgKGUuZy4gQHJhaWx3YXkvY2xpXG4gIC8vIGRvd25sb2FkcyBpdHMgYmluYXJ5IGluIHBvc3RpbnN0YWxsIGFuZCBleGl0cyAxIHdpdGhvdXQgb25lKS4gSW5jbHVkZSB0aGUgRU5USVJFIGRlZmF1bHQgbGlzdDpcbiAgLy8gZW50cmllcyBmb3IgcGFja2FnZXMgdGhhdCBhcmUgbm90IGluc3RhbGxlZCBhcmUgaW5lcnQsIGFuZCB0aGlzIGlzIHRoZSBvbmx5IHJlcHJlc2VudGF0aW9uXG4gIC8vIHRoYXQgc3RheXMgY29ycmVjdCBmb3IgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgdGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVzb2x2ZXMgYWZ0ZXIgdGhpc1xuICAvLyBydW5zIOKAlCBhbiBpbnRlcnNlY3Rpb24gd2l0aCBhIG1pc3Npbmcgb3Igc3RhbGUgbG9ja2ZpbGUgd291bGQgc2lsZW50bHkgZHJvcCB0aGVtLlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIC8vIGxlZnRob29rIGlzIGFwcGVuZGVkIGV4cGxpY2l0bHkgc28gdGhlIGRlZmF1bHQtbGlzdCBsb29rdXAgZmFpbGluZyBjYW5ub3QgZHJvcCBpdDogaXQgaXNcbiAgLy8gcmVxdWlyZWQgaW4gZXZlcnkgbWFuYWdlZCByZXBvc2l0b3J5LlxuICBjb25zdCBuZXdUcnVzdGVkUGFja2FnZXMgPSBuZXcgU2V0KFtcbiAgICAuLi5yZXF1aXJlZFdiZnlQYWNrYWdlcyxcbiAgICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gICAgLi4uKGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID8/IFtdKSxcbiAgXSk7XG4gIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywgZXhpc3RpbmdUcnVzdGVkID8/IFtdLCBuZXdUcnVzdGVkUGFja2FnZXMpO1xuICBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXMgPSBbLi4ubmV3VHJ1c3RlZFBhY2thZ2VzXS50b1NvcnRlZCgpO1xufVxuXG4vLyBUaGUgcGFja2FnZXMgd2JmeSBpdHNlbGYgbWF5IHdyaXRlIGludG8gdHJ1c3RlZERlcGVuZGVuY2llczsgdGhlaXIgcmVtb3ZhbCBpcyBtYW5hZ2VkIGNsZWFudXAsXG4vLyBuZXZlciBhIGxvc3Mgb2YgdXNlciBwb2xpY3kuXG5jb25zdCB3YmZ5TWFuYWdlZFRydXN0ZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFtcbiAgJ0BibGl0empzL2F1dGgnLFxuICAnQGNoYWtyYS11aS9yZWFjdCcsXG4gICdAaG9va2Zvcm0vcmVzb2x2ZXJzJyxcbiAgJ0B3aWxsYm9vc3Rlci9qdWRnZScsXG4gICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JyxcbiAgJ0B6b29tL3J0bXMnLFxuICAnYmxpdHonLFxuICAnZHJpenpsZS1raXQnLFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG5dKTtcblxuZnVuY3Rpb24gd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZXhpc3RpbmdUcnVzdGVkOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2VwdFBhY2thZ2VzOiBSZWFkb25seVNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgLy8gQSBkZWZhdWx0LXRydXN0ZWQgZW50cnkgbmV2ZXIgbG9zZXMgYW55dGhpbmcgYnkgcmVtb3ZhbDogd2hpbGUgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIHRoZVxuICAvLyBrZXB0IGxpc3QgKG9yLCB3aGVuIHRoZSBmaWVsZCBpcyBkZWxldGVkLCBCdW4ncyBvd24gZGVmYXVsdCBsaXN0KSBzdGlsbCB0cnVzdHMgaXQuXG4gIGNvbnN0IGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgY29uc3QgcmVtb3ZlZFBhY2thZ2VzID0gZXhpc3RpbmdUcnVzdGVkLmZpbHRlcihcbiAgICAocGtnKSA9PiAha2VwdFBhY2thZ2VzLmhhcyhwa2cpICYmICF3YmZ5TWFuYWdlZFRydXN0ZWREZXBlbmRlbmNpZXMuaGFzKHBrZykgJiYgIWRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzPy5oYXMocGtnKVxuICApO1xuICBpZiAocmVtb3ZlZFBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgUmVtb3ZpbmcgdW5tYW5hZ2VkIHRydXN0ZWREZXBlbmRlbmNpZXMgZW50cmllczogJHtyZW1vdmVkUGFja2FnZXMuam9pbignLCAnKX0uIHdiZnkgb3ducyB0aGlzIGZpZWxkOyBpZiB0aGVpciBsaWZlY3ljbGUgc2NyaXB0cyBhcmUgcmVxdWlyZWQsIGFkZCB0aGUgcGFja2FnZXMgdG8gd2JmeSBpdHNlbGYuYFxuICAgICk7XG4gIH1cbn1cblxubGV0IGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuLyoqIEZldGNoZXMgQnVuJ3MgZGVmYXVsdCB0cnVzdGVkLWRlcGVuZGVuY3kgYWxsb3ctbGlzdCBmcm9tIHRoZSBCdW4gdmVyc2lvbiBpbnN0YWxsaW5nIHRoZSByZXBvc2l0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBpZiAoIWNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKSB7XG4gICAgLy8gQnVuIGNvbG9yaXplcyB0aGUgbGlzdCBtYXJrZXJzIHdoZW4gRk9SQ0VfQ09MT1IgaXMgc2V0IChlLmcuIGJ5IHRlc3QgcnVubmVycyBvbiBDSSksIHNvXG4gICAgLy8gQU5TSSBlc2NhcGUgc2VxdWVuY2VzIG11c3QgYmUgc3RyaXBwZWQgYmVmb3JlIHBhcnNpbmcuXG4gICAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdidW4nLCBbJ3BtJywgJ2RlZmF1bHQtdHJ1c3RlZCddLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbChcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIG1hdGNoaW5nIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyByZXF1aXJlcyB0aGUgRVNDIGNvbnRyb2wgY2hhcmFjdGVyXG4gICAgICAvXFx1MDAxQlxcW1swLTk7XSptL2d1LFxuICAgICAgJydcbiAgICApO1xuICAgIGNvbnN0IHBhcnNlZERlcGVuZGVuY2llcyA9IG5ldyBTZXQoWy4uLnN0ZG91dC5tYXRjaEFsbCgvXlxccyotXFxzKyhcXFMrKSQvZ211KV0ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0gYXMgc3RyaW5nKSk7XG4gICAgaWYgKHBhcnNlZERlcGVuZGVuY2llcy5zaXplID09PSAwKSB7XG4gICAgICAvLyBEbyBub3QgY2FjaGUgdGhlIGZhaWx1cmU6IGEgdGFyZ2V0LWxvY2FsIHByb2JsZW0gKGUuZy4gYW4gdW5yZWFkYWJsZSBwYWNrYWdlLmpzb24pIG11c3RcbiAgICAgIC8vIG5vdCBkZW55IHRoZSBkZWZhdWx0IGxpc3QgdG8gZXZlcnkgbGF0ZXIgdGFyZ2V0IG9mIGEgbXVsdGktcGF0aCBydW4uXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZWFkIHRoZSBkZWZhdWx0IGFsbG93LWxpc3QgdmlhIGBidW4gcG0gZGVmYXVsdC10cnVzdGVkYC4nKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gcGFyc2VkRGVwZW5kZW5jaWVzO1xuICB9XG4gIHJldHVybiBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICAvLyBFeHBsaWNpdCByb290IHB1Ymxpc2hpbmcgaW50ZW50IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB3YmZ5J3MgcHJpdmF0ZSBtb25vcmVwby1yb290IGRlZmF1bHQuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgKGNvbmZpZy5yZWxlYXNlLm5wbVB1Ymxpc2hlc1Jvb3QgfHwganNvbk9iai5wdWJsaXNoQ29uZmlnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnByaXZhdGU7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmICFjb25maWcucmVsZWFzZS5ucG0gJiYgIWpzb25PYmoucHVibGlzaENvbmZpZykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICAgIC8vIFdpdGhvdXQgYW4gZXhwbGljaXQgcmVnaXN0cnksIG5wbSByZXNvbHZlcyB0aGUgcHVibGlzaCB0YXJnZXQgZnJvbSB0aGUgd29ya3NwYWNlIC5ucG1yYyxcbiAgICAvLyB3aG9zZSBkZWZhdWx0IHJlZ2lzdHJ5IG9uIENJIG1heSBiZSB0aGUgVGFrdW1pIEd1YXJkIGluc3RhbGwgcHJveHkg4oCUIHdoaWNoIHJlamVjdHNcbiAgICAvLyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1IChzaGFyZWQjMTA3MikuIGA/Pz1gIGtlZXBzIGEgZGVsaWJlcmF0ZWx5IGRpZmZlcmVudCByZWdpc3RyeS5cbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcucmVnaXN0cnkgPz89ICdodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8nO1xuICB9XG4gIGNvbnN0IG93bmVyID0gY29uZmlnLnJlcG9BdXRob3I7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAnYnVuIHJ1biBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBjb25zdCBzY3JpcHRSdW5uZXIgPSAnYnVuIHJ1bic7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYCR7c2NyaXB0UnVubmVyfSBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gXSA9IGdldFB5dGhvblNldHVwQ29tbWFuZChweXRob25QYWNrYWdlTWFuYWdlcik7XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGNvbnN0IHB5dGhvblJ1bm5lciA9IGAke3B5dGhvblBhY2thZ2VNYW5hZ2VyfSBydW5gO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGAke3B5dGhvblJ1bm5lcn0gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmICR7cHl0aG9uUnVubmVyfSBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGAke3NjcmlwdFJ1bm5lcn0gbGludGA7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQpO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBnZW5Db2RlU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICBpZiAoc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnKSkge1xuICAgIC8vIFByZXNlcnZlIHByb2plY3Qtc3BlY2lmaWMgc3RlcHMgYSByZXBvIGFwcGVuZGVkIHRvIHRoZSBtYW5hZ2VkIGBidW4gd2IgZ2VuLWNvZGVgIChlLmcuIGJ1aWxkaW5nIGV4dHJhIGRlcGxveVxuICAgIC8vIGFzc2V0cykgaW5zdGVhZCBvZiBkaXNjYXJkaW5nIHRoZW07IG9ubHkgdGhlIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudCBpcyB3YmZ5J3MgdG9cbiAgICAvLyByZWdlbmVyYXRlLiBBbiB1bnBhcnNlYWJsZSBzY3JpcHQgaXMgbGVmdCBhbG9uZSByYXRoZXIgdGhhbiByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuICAgIGNvbnN0IHNlZ21lbnRzID0gZ2VuQ29kZVNjcmlwdCA9PT0gdW5kZWZpbmVkID8gW10gOiBzcGxpdFNjcmlwdFNlZ21lbnRzKGdlbkNvZGVTY3JpcHQpO1xuICAgIGNvbnN0IGN1c3RvbVNlZ21lbnRzID0gc2VnbWVudHM/LmZpbHRlcihcbiAgICAgIChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwganNvbk9iai5zY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICApO1xuICAgIGlmIChjdXN0b21TZWdtZW50cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gWydidW4gd2IgZ2VuLWNvZGUnLCAuLi5jdXN0b21TZWdtZW50c10uam9pbignICYmICcpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5jaGFrcmEgfHwgY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgY29uZmlnLmRlcGVuZGluZy5wcmlzbWE7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGZvcm1hdFNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZvcm1hdFNjcmlwdCA/IGAke2Zvcm1hdFNjcmlwdH0gJiYgYnVuIHJ1biBmb3JtYXQtY29kZWAgOiAnYnVuIHJ1biBmb3JtYXQtY29kZSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbmZpZ01qc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcubWpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdNanNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmoudHlwZSA9ICdtb2R1bGUnO1xuXG4gIGNvbnN0IGNvbmZpZ0R0c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC50cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRHRzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLmZpbGVzID0gWy4uLm5ldyBTZXQoWy4uLihqc29uT2JqLmZpbGVzID8/IFtdKSwgJ2NvbmZpZy5kLm10cyddKV07XG4gIC8vIE5vZGVOZXh0IHJlc29sdmVzIGEgcmVsYXRpdmUgYC4vY29uZmlnLm1qc2AgaW1wb3J0IHRvIGBjb25maWcuZC5tdHNgLCBub3RcbiAgLy8gdGhlIHBhY2thZ2UtbGV2ZWwgYHR5cGVzYCBmaWVsZC4gS2VlcCB0aGUgcHVibGlzaGVkIGNvbmZpZyBpbXBvcnRhYmxlIGZyb21cbiAgLy8gcGFja2FnZS1sb2NhbCBUeXBlU2NyaXB0IGxpbnRlciBzZXR0aW5ncy5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+XG4gICAgZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpXG4gICk7XG59XG5cbmNvbnN0IGNvbmZpZ0RtdHNDb250ZW50ID0gYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5gO1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICBjb25zdCBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcywganNvbk9iaildLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcywganNvbk9iaildLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcykuZmlsdGVyKFxuICAgIChkZXBlbmRlbmN5KSA9PlxuICAgICAgbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkgJiZcbiAgICAgIC8vIEEgcHVibGljIHBhY2thZ2UncyBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIG11c3QgbmV2ZXIgYmUgcmUtbWFuYWdlZCB2aWEgYSByZWdpc3RyeSBpbnN0YWxsXG4gICAgICAvLyAocHJpdmF0ZSBvbmVzIGFyZSBub3JtYWxpemVkIHRvIGB3b3Jrc3BhY2U6KmAgbGF0ZXIpLiBUaGlzIGFsc28gY292ZXJzIHJ1bm5pbmcgd2JmeSBvbiBhXG4gICAgICAvLyBtb25vcmVwbyBTVUJESVJFQ1RPUlksIHdoZXJlIHRoZSBwYXJlbnQncyB3b3Jrc3BhY2VzIGFyZSBpbnZpc2libGUgYW5kIHRoZSB3b3Jrc3BhY2UtbWFwXG4gICAgICAvLyBndWFyZCBpbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyBjYW5ub3QgcHJvdGVjdCB0aGUgc3BlY2lmaWVyLlxuICAgICAgKGpzb25PYmoucHJpdmF0ZSB8fCAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IHZvaWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICAgIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHJvb3RDb25maWcsIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICAvLyBgbWlzZSB3aGljaCBweXRob25gIHlpZWxkcyB0aGUgc2luZ2xlIGFjdGl2ZSBpbnRlcnByZXRlciBwYXRoOyBgbWlzZSBjdXJyZW50IHB5dGhvbmAgY2FuXG4gIC8vIHByaW50IG11bHRpcGxlIHNwYWNlLXNlcGFyYXRlZCB2ZXJzaW9ucyAobWlzZSBzdXBwb3J0cyBtdWx0aS12ZXJzaW9uIHBpbnMpLCB3aGljaCB3b3VsZCBwYXNzXG4gIC8vIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIGBwb2V0cnkgZW52IHVzZWAuIFdoZW4gbWlzZSBpcyBtaXNzaW5nIG9yIHB5dGhvbiBpc1xuICAvLyB1bmNvbmZpZ3VyZWQsIHNraXAgYHBvZXRyeSBlbnYgdXNlYCBhbmQgZmFsbCBiYWNrIHRvIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIgaW5zdGVhZCBvZlxuICAvLyBhYm9ydGluZyB0aGUgY2hhaW4uXG4gIC8vIFRoZSBgfHwgdHJ1ZWAgY292ZXJzIG9ubHkgdGhlIG1pc2UgcmVzb2x1dGlvbjogYSBtaXNzaW5nL3VuY29uZmlndXJlZCBtaXNlIGZhbGxzIGJhY2sgdG9cbiAgLy8gcG9ldHJ5J3MgZGVmYXVsdCBpbnRlcnByZXRlciwgd2hpbGUgYSBmYWlsaW5nIGBwb2V0cnkgZW52IHVzZWAgc3RpbGwgYWJvcnRzIHRoZSBjaGFpbi5cbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiB7IHB5dGhvbl9wYXRoPVwiJChtaXNlIHdoaWNoIHB5dGhvbiAyPi9kZXYvbnVsbClcIiB8fCB0cnVlOyB9ICYmIHsgWyAteiBcIiRweXRob25fcGF0aFwiIF0gfHwgcG9ldHJ5IGVudiB1c2UgXCIkcHl0aG9uX3BhdGhcIjsgfSAmJiBwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgJiYgcG9ldHJ5IGluc3RhbGwnO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbXG4gICAgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpKSksXG4gIF07XG4gIHNwYXduU3luYygnYnVuJywgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAnLS1leGFjdCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgLy8gQSBwcml2YXRlIHBhY2thZ2Ugd2hvc2UgbW9ub3JlcG8gY29udGFpbnMgdGhpcyBkZXBlbmRlbmN5IGFzIGEgd29ya3NwYWNlIG11c3QgcmVmZXJlbmNlIGl0XG4gICAgLy8gdmlhIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2w6IHBpbm5pbmcgYSByZWdpc3RyeSB2ZXJzaW9uIG1ha2VzIEJ1biBzaGFkb3cgdGhlIHNhbWUtbmFtZVxuICAgIC8vIHdvcmtzcGFjZSBhbmQgc2tpcCBpbnN0YWxsaW5nIHRoZSB3b3Jrc3BhY2UncyBvd24gZGVwZW5kZW5jaWVzLiAoUHVibGlzaGVkIHBhY2thZ2VzIGluc3RlYWRcbiAgICAvLyBwaW4gYSBjb25jcmV0ZSB2ZXJzaW9uIGJlY2F1c2UgYG5wbSBwdWJsaXNoYCByZWplY3RzIGB3b3Jrc3BhY2U6KmAgc3BlY2lmaWVycyDigJQgYnV0IGFuXG4gICAgLy8gRVhJU1RJTkcgYHdvcmtzcGFjZTpgIGRlY2xhcmF0aW9uIGlzIGFsd2F5cyBrZXB0OiBvdmVyd3JpdGluZyBpdCB3aXRoIGEgcmVnaXN0cnkgcmVsZWFzZVxuICAgIC8vIHdvdWxkIHNpbGVudGx5IGJyZWFrIHRoZSBsb2NhbCB3b3Jrc3BhY2UgbGluay4pXG5cbiAgICAvLyBBIGRlY2xhcmVkIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgYWx3YXlzIHdpbnMsIHdoZXRoZXIgb3Igbm90IHRoZSB3b3Jrc3BhY2UgbWFwIHNlZXMgdGhlXG4gICAgLy8gcGFja2FnZTogcnVubmluZyB3YmZ5IG9uIGEgbW9ub3JlcG8gU1VCRElSRUNUT1JZIGhpZGVzIHRoZSBwYXJlbnQncyB3b3Jrc3BhY2VzLCBzbyB0aGUgbWFwXG4gICAgLy8gYWxvbmUgY2Fubm90IGJlIHRydXN0ZWQgdG8gZGV0ZWN0IGEgbG9jYWwgd29ya3NwYWNlIGxpbmsuXG4gICAgaWYgKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChqc29uT2JqLnByaXZhdGUpIHtcbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSAnd29ya3NwYWNlOionO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChqc29uT2JqLnByaXZhdGUgJiYgZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykuaGFzKGRlcGVuZGVuY3kpKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFleGlzdGluZ1NwZWNpZmllciB8fCBleGlzdGluZ1NwZWNpZmllci5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSAnd29ya3NwYWNlOionO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIEFuIGV4aXN0aW5nIENPTkNSRVRFIHBpbiBvbiBhIHdvcmtzcGFjZSBwYWNrYWdlIGlzIGEgZGVsaWJlcmF0ZSBjaG9pY2UgYW5kIG11c3Qgbm90IGJlXG4gICAgICAvLyBjb252ZXJ0ZWQgdG8gdGhlIHdvcmtzcGFjZSBwcm90b2NvbC4gTm90ZSB0aGUgdHJhZGUtb2ZmIGVpdGhlciB3YXk6IG5wbSAod2hpY2hcbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHNoZWxscyBvdXQgdG8pIGNhbm5vdCBwYXJzZSBgd29ya3NwYWNlOmAgc3BlY2lmaWVycywgd2hpbGVcbiAgICAgIC8vIGEgcmVnaXN0cnkgcGluIG1ha2VzIGEgY29sZCBidW4gaW5zdGFsbCBzaGFkb3cgdGhlIHdvcmtzcGFjZSBhbmQgc2tpcCBpdHMgZGVwZW5kZW5jaWVzIOKAlFxuICAgICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGtlZXBzIGB3b3Jrc3BhY2U6KmAgYW5kIHN0cmlwcyB0aGUgcHJvdG9jb2wgb24gdGhlIENJIGNoZWNrb3V0IHJpZ2h0XG4gICAgICAvLyBiZWZvcmUgcmVsZWFzaW5nIChzY3JpcHRzL3N0cmlwV29ya3NwYWNlUHJvdG9jb2wubWpzKS4gRmFsbCB0aHJvdWdoIHNvIGEgY29uY3JldGUgcGluXG4gICAgICAvLyBrZWVwcyBiZWluZyBidW1wZWQgbGlrZSBhbnkgbWFuYWdlZCBkZXBlbmRlbmN5LlxuICAgIH1cbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgY29uZmlnLFxuICAgICAgcm9vdENvbmZpZyxcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICAgIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICAgICAgLy8gYGJ1biBhZGQgZGVwZW5kZW5jeWAgcHJlc2VydmVzIGFuIGV4aXN0aW5nIGV4YWN0IHBpbiwgc28gd3JpdGUgdGhlIGFnZS1jbGVhcmVkIHZlcnNpb25cbiAgICAgICAgLy8gZGlyZWN0bHkuIFRoZSBmaW5hbCByZXBvc2l0b3J5LXdpZGUgaW5zdGFsbCByZWZyZXNoZXMgdGhlIGxvY2tmaWxlIGFmdGVyIGV2ZXJ5IHBhY2thZ2VcbiAgICAgICAgLy8gbWFuaWZlc3QgaGFzIGNvbnZlcmdlZCBvbiB0aGUgZ2VuZXJhdGVkIHJlbGVhc2UtYWdlIHBvbGljeS5cbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBtYW5hZ2VkVmVyc2lvbjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICAgIGlmICghc2tpcEFkZGluZ0RlcHMpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICBpZiAobGF0ZXN0VmVyc2lvbiA9PT0gJyonICYmIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGxhdGVzdFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvSW5zdGFsbDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWc6IFBhY2thZ2VDb25maWcsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZUZpbGVQYXRoKSByZXR1cm47XG5cbiAgLy8gUmV1c2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3Mgb3duIGZvcm1hdHRlciBhZnRlciBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbiBzb1xuICAvLyBwYWNrYWdlLmpzb24gbWF0Y2hlcyB3aGF0ZXZlciBpdHMgY3VycmVudCBzb3J0LXBhY2thZ2UtanNvbiB2ZXJzaW9uIGV4cGVjdHMuXG4gIC8vIFRoaXMgYXZvaWRzIGZvbGxvdy11cCBhdXRvZml4IGNvbW1pdHMgY2F1c2VkIG9ubHkgYnkgZm9ybWF0dGVyIHZlcnNpb24gZHJpZnRcbiAgLy8gYmV0d2VlbiB3YmZ5IGFuZCB0aGUgcHJvamVjdCBiZWluZyB1cGRhdGVkLlxuICBzcGF3blN5bmMoJ2J1bngnLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHVzZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlZERlcGVuZGVuY3lTZXQgPSBuZXcgU2V0KHVzZWREZXBlbmRlbmNpZXMpO1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGF3YWl0IGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHVzZWREZXBlbmRlbmN5U2V0LmhhcyhkZXBlbmRlbmN5KSB8fCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBiYXNlLWNvbmZpZyBwYWNrYWdlcy4gUmVtb3ZlIHN0YWxlIHZhcmlhbnRzIHdoZW4gcmVwb1xuICAgIC8vIGNhcGFiaWxpdGllcyBjaGFuZ2UsIHN1Y2ggYXMgTmV4dC5qcyB0YWtpbmcgb3duZXJzaGlwIG9mIHRzY29uZmlnLmpzb24uXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90c2NvbmZpZyouanNvbicsIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgY29uc3QgYWJzb2x1dGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIC8vIFR5cGVTY3JpcHQgNydzIG5hdGl2ZSBjb21waWxlciBkcm9wcGVkIHRoZSBpbi1wcm9jZXNzIGBwYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uYFxuICAgIC8vIGhlbHBlciwgc28gcGFyc2UgdGhlIHRzY29uZmlnIGludG8gYW4gQVNUIGFuZCByZWFkIGl0cyB0b3AtbGV2ZWwgYGV4dGVuZHNgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShhYnNvbHV0ZUZpbGVQYXRoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgY29uc29sZS53YXJuKGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQuYCk7XG4gICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZSkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gZGVwZW5kZW5jeSB8fCB2YWx1ZS5zdGFydHNXaXRoKGAke2RlcGVuZGVuY3l9L2ApKSB7XG4gICAgICAgICAgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzO1xufVxuXG4vKiogUmVhZHMgdGhlIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZW50cmllcyAoYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncykgZnJvbSBhIHBhcnNlZCB0c2NvbmZpZy4gKi9cbmZ1bmN0aW9uIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlKSkge1xuICAgIGlmIChhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpICYmIGFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkgJiYgcHJvcGVydHkubmFtZS50ZXh0ID09PSAnZXh0ZW5kcycpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKHByb3BlcnR5LmluaXRpYWxpemVyLCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiByZWFkb25seSBhc3QuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlW10ge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzb3VyY2Uuc3RhdGVtZW50cykge1xuICAgIGlmIChhc3QuaXNFeHByZXNzaW9uU3RhdGVtZW50KHN0YXRlbWVudCkgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pKSB7XG4gICAgICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb24ucHJvcGVydGllcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhub2RlOiBhc3QuRXhwcmVzc2lvbiwgdmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAoYXN0LmlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgIHZhbHVlcy5wdXNoKG5vZGUudGV4dCk7XG4gIH0gZWxzZSBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihub2RlKSkge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBub2RlLmVsZW1lbnRzKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhlbGVtZW50LCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoZGVwZW5kZW5jeSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLnNldChkZXBlbmRlbmN5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeSkpIHtcbiAgICByZXR1cm4gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICB9XG5cbiAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdGltZXMgPSBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeSk7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGlmIChsYXRlc3RWZXJzaW9uICE9PSAnKicgJiYgaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHRpbWVzW2xhdGVzdFZlcnNpb25dKSkge1xuICAgIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICB9XG5cbiAgcmV0dXJuIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzKVswXSA/PyAnKic7XG59XG5cbi8qKiBFdmVyeSBzdGFibGUgcmVsZWFzZSBpbiBgdGltZXNgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2UgZ2F0ZSwgbmV3ZXN0IGZpcnN0LiAqL1xuZnVuY3Rpb24gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcodGltZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh0aW1lcylcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IHNlbXZlci52YWxpZCh2ZXJzaW9uKSlcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IChzZW12ZXIucHJlcmVsZWFzZSh2ZXJzaW9uKT8ubGVuZ3RoID8/IDApID09PSAwKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gTnVtYmVyLmlzRmluaXRlKERhdGUucGFyc2UocHVibGlzaGVkQXQpKSlcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IG5vdyAtIERhdGUucGFyc2UocHVibGlzaGVkQXQpID49IHBhY2thZ2VBZ2VHYXRlTXMpXG4gICAgLnRvU29ydGVkKChbdmVyc2lvbkFdLCBbdmVyc2lvbkJdKSA9PiBzZW12ZXIucmNvbXBhcmUodmVyc2lvbkEsIHZlcnNpb25CKSlcbiAgICAubWFwKChbdmVyc2lvbl0pID0+IHZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUocHVibGlzaGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXB1Ymxpc2hlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHB1Ymxpc2hlZFRpbWUgPSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwdWJsaXNoZWRUaW1lKSAmJiBEYXRlLm5vdygpIC0gcHVibGlzaGVkVGltZSA+PSBwYWNrYWdlQWdlR2F0ZU1zO1xufVxuXG5mdW5jdGlvbiBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZGVwZW5kZW5jeS5yZXBsYWNlKC9AW15AL10rJC91LCAnJyk7XG4gIGNvbnN0IGNhY2hlZFRpbWVzID0gbnBtUGFja2FnZVRpbWVzQ2FjaGUuZ2V0KHBhY2thZ2VOYW1lKTtcbiAgaWYgKGNhY2hlZFRpbWVzKSByZXR1cm4gY2FjaGVkVGltZXM7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICducG0nLFxuICAgIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndGltZScsICctLWpzb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgcHJvY2Vzcy5jd2QoKVxuICApO1xuICBpZiAoIXN0ZG91dCkgcmV0dXJuIHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBbUmVjb3JkPHN0cmluZywgc3RyaW5nPl07XG4gICAgY29uc3QgdGltZXMgPSBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWRbMF0gOiBwYXJzZWQ7XG4gICAgaWYgKCF0aW1lcykgcmV0dXJuIHt9O1xuICAgIG5wbVBhY2thZ2VUaW1lc0NhY2hlLnNldChwYWNrYWdlTmFtZSwgdGltZXMpO1xuICAgIHJldHVybiB0aW1lcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEtlZXAgcGlubmluZyBhbGlnbmVkIHdpdGggQnVuJ3MgZXhlbXB0aW9ucy4gd2JmeSdzIGdlbmVyYXRlZCBjb25maWd1cmF0aW9uIGNhbiByZWx5IG9uIHRoZVxuICAvLyBjdXJyZW50IHdiIGNvbnRyYWN0LCBzbyBpbmRlcGVuZGVudGx5IHNvYWtpbmcgb3IgZG93bmdyYWRpbmcgd2Igd291bGQgcGFpciBuZXcgZ2VuZXJhdGVkIGZpbGVzXG4gIC8vIHdpdGggYW4gaW5jb21wYXRpYmxlIG9sZCBDTEksIGFuZCBhIHRlbXBvcmFyaWx5IGV4ZW1wdGVkIHBhY2thZ2UgbXVzdCByZWFjaCBpdHMgc2VjdXJpdHkgZml4LlxuICAvLyBPbmx5IHBhY2thZ2VzIEJ1biBpdHNlbGYgZ2F0ZXMgbWF5IGJlIHNlbGVjdGVkIGZyb20gb2xkZXIgdGFncy5cbiAgcmV0dXJuICFidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLnNvbWUoKHBhdHRlcm4pID0+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/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHF1b3RlRm9yU2hlbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG4vLyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gdGhlIHVucXVvdGVkIGxvb3BzIGJlbG93IGtlZXAgcGF0aHNcbi8vIHdpdGggc3BhY2VzIGludGFjdC5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gYnVuIHJlY29yZHMgYW4gYWJzb2x1dGUgYHJlc29sdmVkYCBVUkwgZm9yIGFuIGFscmVhZHktbG9ja2VkIHBhY2thZ2Ugd2hlbmV2ZXIgdGhlXG4gICAgICAvLyBjb25maWd1cmVkIHJlZ2lzdHJ5IGRvZXMgbm90IHNlcnZlIHRoZSB0YXJiYWxsIGhvc3QgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEg4oCUIHdoaWNoIGlzXG4gICAgICAvLyBleGFjdGx5IHdoYXQgdGhlIFRha3VtaSBHdWFyZCBwcm94eSBkb2VzLiBTbyBhbiBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBkZWZhdWx0XG4gICAgICAvLyByZWdpc3RyeSAoQ0ksIG9yIGEgZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50b1xuICAgICAgLy8gYnVuLmxvY2ssIGFuZCBjb21taXR0aW5nIHRoZW0gcGlucyBhIFNIQVJFRCBsb2NrZmlsZSB0byBvbmUgZW52aXJvbm1lbnQncyBtaXJyb3I6IGV2ZXJ5XG4gICAgICAvLyBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoIHRoZSBwcm94eSwgYW5kIGEgY29sZC1jYWNoZSBpbnN0YWxsIGZhaWxzIG91dHJpZ2h0IHdpdGhcbiAgICAgIC8vIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYSByZWdpc3RyeS5ucG1qcy5vcmcgdG9rZW4sIGJlY2F1c2UgYnVuIHNlbmRzIHRoZVxuICAgICAgLy8gZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3QgdGhlIGxvY2tmaWxlIG5hbWVzLiBHdWFyZCBjb3ZlcmFnZSBkb2VzXG4gICAgICAvLyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuIGRlcml2ZXMgdGhlIGRvd25sb2FkIFVSTCBmcm9tXG4gICAgICAvLyB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gc3RyaXAgdGhlbS4gT25seSB0aGUgR3VhcmQgaG9zdCBpcyBzdHJpcHBlZDogYSBzY29wZWRcbiAgICAgIC8vIHJlZ2lzdHJ5IHN1Y2ggYXMgVmVyZGFjY2lvIGxlZ2l0aW1hdGVseSByZWNvcmRzIGl0cyBvd24gVVJMIGZvciBwcml2YXRlIHBhY2thZ2VzLlxuICAgICAgbmFtZTogJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUnLFxuICAgICAgZ2xvYjogJ2J1bi5sb2NrJyxcbiAgICAgIHJ1bjogJ2Jhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gge3N0YWdlZF9maWxlc30nLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBPbmx5IHdpbGxib29zdGVyLWNvbmZpZ3MgZ2V0cyB0aGlzIGpvYjogZXZlcnkgb3RoZXIgcmVwb3NpdG9yeSdzIHJlbm92YXRlLmpzb25jIG1lcmVseVxuICAgICAgLy8gZXh0ZW5kcyB0aGUgc2hhcmVkIHByZXNldCwgYW5kIHRoZSB2YWxpZGF0b3IgZG9lcyBub3QgcmVzb2x2ZSByZW1vdGUgcHJlc2V0cywgc28gcnVubmluZyBpdFxuICAgICAgLy8gdGhlcmUgd291bGQgdmFsaWRhdGUgdHdvIGxpbmVzIGFuZCBjYXRjaCBub3RoaW5nLiBgLS1uby1nbG9iYWxgIHZhbGlkYXRlcyB0aGUgcHJlc2V0IGFzIGFcbiAgICAgIC8vIHJlcG8gY29uZmlnIGluc3RlYWQgb2YgYSBzZWxmLWhvc3RlZCBnbG9iYWwgY29uZmlnLCBhbmQgYEBsYXRlc3RgIGtlZXBzIG5wbSBmcm9tIHNpbGVudGx5XG4gICAgICAvLyBpbnN0YWxsaW5nIGFuIGFuY2llbnQgUmVub3ZhdGUgdGhhdCBjYW5ub3QgZXZlbiBwYXJzZSBKU09OQyB3aGVuIHRoZSBsb2NhbCBOb2RlIGxhZ3MgYmVoaW5kLlxuICAgICAgLy8gU3RhZ2luZyBhIGRlbGV0aW9uIG9mIHJlbm92YXRlLmpzb25jIGxlYXZlcyBubyBmaWxlIGZvciBpbnNwZWN0aW9uLCBzbyBMZWZ0aG9vayBza2lwcyB0aGlzXG4gICAgICAvLyBqb2IgaW5zdGVhZCBvZiBydW5uaW5nIHRoZSB2YWxpZGF0b3Igb24gYSBtaXNzaW5nIHBhdGgg4oCUIGRlbGliZXJhdGVseSwgYmVjYXVzZSBkZWxldGluZyB0aGVcbiAgICAgIC8vIHNoYXJlZCBwcmVzZXQgaXMgbm90IGFuIG9wZXJhdGlvbiB0aGlzIGhvb2sgbmVlZHMgdG8gZ3VhcmQuXG4gICAgICBuYW1lOiAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyxcbiAgICAgIGdsb2I6ICdyZW5vdmF0ZS5qc29uYycsXG4gICAgICBydW46ICducHggLS15ZXMgLS1wYWNrYWdlIHJlbm92YXRlQGxhdGVzdCAtLSByZW5vdmF0ZS1jb25maWctdmFsaWRhdG9yIC0tc3RyaWN0IC0tbm8tZ2xvYmFsIHtzdGFnZWRfZmlsZXN9JyxcbiAgICB9LFxuICBdLFxufTtcblxuLy8gR2l0IGhvb2tzIGNhbGwgTGVmdGhvb2sgdGhyb3VnaCBhbiBhYnNvbHV0ZSBwYXRoLCBzbyB0aGV5IGFsc28gZmlyZSBpbiBhIGZyZXNoIHdvcmt0cmVlIHdpdGhvdXRcbi8vIG5vZGVfbW9kdWxlcy4gSW5zdGFsbGluZyBvbiBldmVyeSBydW4gd291bGQgc2xvdyBlYWNoIGhvb2sgcnVuIGFuZCB3b3VsZCBhbHNvIHJ1biBgcHJlcGFyZWAuXG5jb25zdCBpbnN0YWxsTWlzc2luZ0RlcHNDb21tYW5kID0gJ1sgLWQgbm9kZV9tb2R1bGVzIF0gfHwgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgfHwgZXhpdCc7XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIC8vIHByZXBhcmUgY2FsbHMgdGhpcyB3aXRob3V0IGFyZ3VtZW50cyBhZnRlciBCdW4gc2F2ZXMgdGhlIHJvb3QgbG9ja2ZpbGU7IExlZnRob29rIHBhc3NlcyBpdHNcbiAgLy8gc3RhZ2VkIHBhdGguIFRoZSB1bnByZWRpY3RhYmxlIHNpYmxpbmcgZmlsZSBtYWtlcyByZXBsYWNlbWVudCBhdG9taWMsIGBjcCAtcGAgcHJlc2VydmVzIGl0c1xuICAvLyBtb2RlLCBhbmQgdGhlIGFuY2hvcmVkIHBhdHRlcm4gY2Fubm90IGVyYXNlIGEgZGlyZWN0IHRhcmJhbGwgZGVwZW5kZW5jeSBVUkwuXG4gIG5vcm1hbGl6ZUJ1bkxvY2tmaWxlOiBgXG4jIS9iaW4vYmFzaFxuc2V0IC1lXG5cbmlmIFtbIFwiJCNcIiAtZXEgMCBdXTsgdGhlblxuICBzZXQgLS0gYnVuLmxvY2tcbmZpXG5cbm5vcm1hbGl6ZWQ9XCJcIlxudHJhcCAnW1sgLXogXCIkbm9ybWFsaXplZFwiIF1dIHx8IHJtIC1mIFwiJG5vcm1hbGl6ZWRcIicgRVhJVFxuZm9yIGZpbGUgaW4gXCIkQFwiOyBkb1xuICBbWyAtZiBcIiRmaWxlXCIgXV0gfHwgY29udGludWVcbiAgbm9ybWFsaXplZD1cIiQobWt0ZW1wIFwiJGZpbGUud2JmeS1ub3JtYWxpemluZy5YWFhYWFhcIilcIlxuICBjcCAtcCBcIiRmaWxlXCIgXCIkbm9ybWFsaXplZFwiXG4gIHNlZCAtRSAncyMoXCIsIClcImh0dHBzOi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC9bXlwiXSpcIiNcXFxcMVwiXCIjZycgXCIkZmlsZVwiID4gXCIkbm9ybWFsaXplZFwiXG4gIGlmICEgY21wIC1zIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCI7IHRoZW5cbiAgICBtdiBcIiRub3JtYWxpemVkXCIgXCIkZmlsZVwiXG4gICAgZWNobyBcIlJlbW92ZWQgVGFrdW1pIEd1YXJkIHByb3h5IFVSTHMgZnJvbSAkZmlsZSBzbyB0aGUgbG9ja2ZpbGUgc3RheXMgcmVnaXN0cnktYWdub3N0aWMuXCJcbiAgZmlcbiAgcm0gLWYgXCIkbm9ybWFsaXplZFwiXG4gIG5vcm1hbGl6ZWQ9XCJcIlxuZG9uZVxuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbY29uZmlnXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIGFsbENvbmZpZ3MpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmIChsaW50KSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGdldFByZVB1c2hTY3JpcHQoY29uZmlnKTtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnLCBhbGxDb25maWdzKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gnKSwgc2NyaXB0cy5ub3JtYWxpemVCdW5Mb2NrZmlsZSArICdcXG4nLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgIG1vZGU6IDBvNzU1LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9IGAke2luc3RhbGxNaXNzaW5nRGVwc0NvbW1hbmR9XFxuYnVuIHdiIGxpbnQgLS1xdWlldGA7XG4gIC8vIE5vIHNlcGFyYXRlIHR5cGVjaGVjayBzdGVwIG5lZWRlZCDigJQgdGhlIGxpbnQgY29tbWFuZCBhbHJlYWR5IGluY2x1ZGVzIHR5cGVjaGVja2luZy5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7cXVpZXRMaW50Q29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiBxdWlldExpbnRDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IExlZnRob29rSm9iW10ge1xuICByZXR1cm4gcHJlQ29tbWl0U2V0dGluZ3Muam9ic1xuICAgIC5maWx0ZXIoKGpvYikgPT4gam9iLm5hbWUgIT09ICd2YWxpZGF0ZS1yZW5vdmF0ZS1jb25maWcnIHx8IGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncylcbiAgICAubWFwKChqb2IpID0+XG4gICAgICBqb2IubmFtZSA9PT0gJ2NsZWFudXAnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uam9iLFxuICAgICAgICAgICAgZ2xvYjogZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZyksXG4gICAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgICAgfVxuICAgICAgICA6IGpvYlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID0gWy4uLmV4dGVuc2lvbnMucHJldHRpZXJPbmx5XTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtpbnN0YWxsTWlzc2luZ0RlcHNDb21tYW5kfVxcbiR7Z2V0Q2xlYW51cENvbW1hbmRCb2R5KGNvbmZpZyl9YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmRCb2R5KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbmJ1biBydW4gLS1jd2QgcGFja2FnZXMvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cbiAgLy8gUHl0aG9uLW9ubHkgQnVuIHJlcG9zIGluc3RhbGwgd2IgZm9yIHNoYXJlZCBzY3JpcHRzIGJ1dCBub3QgT3hsaW50LCBzb1xuICAvLyBzdGFnZWQtZmlsZSBob29rcyBtdXN0IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZm9ybWF0dGVyIHBhdGggYmVsb3cuXG4gIGNvbnN0IGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICBpZiAoY2FuVXNlV2JGb3JTdGFnZWRGaWxlcykge1xuICAgIHJldHVybiBgXG5idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nLnJhd2BcbnBhY2thZ2VfanNvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcIlxuJHtoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpID8gU3RyaW5nLnJhd2BweXRob25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwucHkkJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCA/IFN0cmluZy5yYXdgZGFydF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5kYXJ0JCcgfCBncmVwIC12ICdnZW5lcmF0ZWQnIHwgZ3JlcCAtdiAnXFwuZnJlZXplZFxcLmRhcnQkJyB8IGdyZXAgLXYgJ1xcLmdcXC5kYXJ0JCcgfHwgdHJ1ZSlcImAgOiAnJ31cblxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIGJ1biBzb3J0LXBhY2thZ2UtanNvbiAkcGFja2FnZV9qc29uX2ZpbGVzXG5maVxuJHtcbiAgaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKVxuICAgID8gYGlmIFsgLW4gXCIkcHl0aG9uX2ZpbGVzXCIgXTsgdGhlblxuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBibGFjayAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGZsYWtlOCAkcHl0aG9uX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbFxuICAgID8gYGlmIFsgLW4gXCIkZGFydF9maWxlc1wiIF07IHRoZW5cbiAgZGFydCBmb3JtYXQgJGRhcnRfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2NhbFdiUGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZXMnLCAnd2InLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93Yic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfHJ1c3QtdG9vbGNoYWluKFxcLnRvbWwpPylgO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICAvLyBgbWlzZSBhY3RpdmF0ZWAgdXBkYXRlcyBQQVRIIG9ubHkgd2hlbiB0aGUgcHJvbXB0IGlzIGRyYXduLCBzbyB0aGUgaG9vayBpbmhlcml0cyB0aGUgdG9vbFxuICAvLyB2ZXJzaW9ucyBwaW5uZWQgYmVmb3JlIHRoZSBtZXJnZTsgcmVmcmVzaCBQQVRIIHNvIGEgcHVsbGVkIEJ1biBwaW4gaW5zdGFsbHMgd2l0aCB0aGF0IEJ1bi5cbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaCgnZXZhbCBcIiQobWlzZSBlbnYgLXMgYmFzaClcIicpO1xuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9ICdidW4gaW5zdGFsbCc7XG4gIC8vIERvIE5PVCBhZGQgYC52aW5leHRgIGhlcmU6IGl0IGhvbGRzIG9ubHkgdmluZXh0J3MgY29udGVudC1oYXNoZWQgZm9udCBjYWNoZSBhbmQgdGhlIGRldlxuICAvLyBzZXJ2ZXIncyBsb2NrIGZpbGUgKGRlbGV0aW5nIHRoZSBsb2NrIGRpc2FibGVzIHRoZSBkdXBsaWNhdGUtZGV2LXNlcnZlciBndWFyZCBmb3IgYSBydW5uaW5nXG4gIC8vIHNlcnZlcikuIHZpbmV4dCdzIGJ1aWxkIG91dHB1dCBnb2VzIHRvIGBkaXN0L2AsIGFuZCBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpcyBoYW5kbGVkIGJ5XG4gIC8vIHRoZSBzZXBhcmF0ZSBpbnN0YWxsLWxheW91dCBob29rIGJlbG93LlxuICAvLyBTY2FuIGV2ZXJ5IHdvcmtzcGFjZSBjb25maWcgKG5vdCBqdXN0IHRoZSByb290KTogaW4gYSBtb25vcmVwbyB0aGUgYXBwIHVzdWFsbHkgbGl2ZXMgaW5cbiAgLy8gcGFja2FnZXMvPGFwcD4gb3IgYXBwcy88YXBwPiwgYW5kIHRoZSBjYWNoZSBkaXJlY3RvcmllcyBhcmUgd29ya3NwYWNlLXJlbGF0aXZlLlxuICBjb25zdCBuZXh0Q2FjaGVEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5uZXh0LFxuICAgICcubmV4dCdcbiAgKTtcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3JpZXMgPVxuICAgIG5leHRDYWNoZURpclBhdGhzLmxlbmd0aCA+IDAgPyBgICYmIHJtIC1SZiAtLSAke25leHRDYWNoZURpclBhdGhzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9YCA6ICcnO1xuICAvLyBCdW4gZG9lcyBub3QgcmVsaW5rIGFuIGV4aXN0aW5nIGlzb2xhdGVkIHRyZWUgd2hlbiBnbG9iYWxTdG9yZS9saW5rZXIgc2V0dGluZ3MgY2hhbmdlLiBJbnNwZWN0XG4gIC8vIHRob3NlIGtleXMgcmF0aGVyIHRoYW4gZXZlcnkgYnVuZmlnIGNoYW5nZTogbWluaW11bVJlbGVhc2VBZ2UgdXBkYXRlcyBtdXN0IG5vdCBkZXN0cm95IGFcbiAgLy8gY29udHJpYnV0b3IncyB3b3JraW5nIGluc3RhbGwgYmVmb3JlIGEgcG90ZW50aWFsbHkgbmV0d29yay1kZXBlbmRlbnQgcmVwbGFjZW1lbnQgc3VjY2VlZHMuXG4gIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhjb25maWcsIGFsbENvbmZpZ3MsICgpID0+IHRydWUsICdub2RlX21vZHVsZXMnKTtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YGlmIGdpdCBkaWZmIC0tbm8tY29sb3IgLVUwIE9SSUdfSEVBRCBIRUFEIC0tICcqYnVuZmlnLnRvbWwnIHwgZ3JlcCAtLXF1aWV0IC1FICdeWystXSAqKGdsb2JhbFN0b3JlfGxpbmtlcnxwdWJsaWNIb2lzdFBhdHRlcm4pJzsgdGhlbiBybSAtUmYgLS0gJHtub2RlTW9kdWxlc0RpclBhdGhzLm1hcChxdW90ZUZvclNoZWxsKS5qb2luKCcgJyl9OyBmaWBcbiAgKTtcbiAgLy8gYnVuLmxvY2stb25seSBtZXJnZXMgKFJlbm92YXRlIGxvY2tmaWxlIG1haW50ZW5hbmNlKSwgYnVuZmlnLnRvbWwgLyAubnBtcmMgY2hhbmdlcyAobGlua2VyLFxuICAvLyByZWdpc3RyeSwgaG9pc3RpbmcpLCBhbmQgcGF0Y2ggZWRpdHMgYWxsIGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dCB0b3VjaGluZyBwYWNrYWdlLmpzb24uXG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihwYWNrYWdlXFwuanNvbnxidW5cXC5sb2NrfGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmN8cGF0Y2hlcy8pXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3JpZXN9XCIgfHwgZXhpdGBcbiAgKTtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChpbnN0YWxsTWlzc2luZ0RlcHNDb21tYW5kKTtcbiAgLy8gVml0ZSdzIGRlcGVuZGVuY3kgY2FjaGUgaW4gbm9kZV9tb2R1bGVzLy52aXRlIHNlbGYtaW52YWxpZGF0ZXMgb24gbG9ja2ZpbGUgLyBwYXRjaGVzIC9cbiAgLy8gY29uZmlnIC8gTk9ERV9FTlYgY2hhbmdlcyAoc2VlIFZpdGUncyBkZXAgcHJlLWJ1bmRsaW5nIGRvY3MpLCBzbyB0aGUgcmVzaWR1YWwgc3RhbGUgY2FzZSBpc1xuICAvLyBpbnN0YWxsLWxheW91dCBjaGFuZ2VzIChidW5maWcudG9tbCBsaW5rZXIsIC5ucG1yYyk6IHRoZXkgY2hhbmdlIHRoZSBpbnN0YWxsZWQgdHJlZSB3aXRob3V0XG4gIC8vIHRvdWNoaW5nIHRoZSBsb2NrZmlsZSwgYW5kIHRoZXkgYXJlIGFic2VudCBmcm9tIFZpdGUncyBjYWNoZSBrZXkuXG4gIGNvbnN0IHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgICBjb25maWcsXG4gICAgYWxsQ29uZmlncyxcbiAgICAod29ya3NwYWNlQ29uZmlnKSA9PiB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpbmV4dCB8fCB3b3Jrc3BhY2VDb25maWcuZGVwZW5kaW5nLnZpdGUsXG4gICAgJ25vZGVfbW9kdWxlcy8udml0ZSdcbiAgKTtcbiAgaWYgKHJtVml0ZUNhY2hlRGlyZWN0b3JpZXMubGVuZ3RoID4gMCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmMpXCIgXCJybSAtUmYgLS0gJHtybVZpdGVDYWNoZURpcmVjdG9yaWVzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9XCJgXG4gICAgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICAvLyBCbGl0eiByZXBvc2l0b3JpZXMgZGVsaWJlcmF0ZWx5IGdldCB0aGUgc2FtZSB3Yi1kcml2ZW4gcHJpc21hIGNvbW1hbmRzIGFzIGV2ZXJ5b25lIGVsc2U6XG4gIC8vIHRoZSBibGl0eiBDTEkncyBjb2RlZ2VuIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2UsIHdoaWNoIG11c3QgbmV2ZXIgcnVuXG4gIC8vIHVuZGVyIEJ1bidzIHNoYXJlZCBnbG9iYWwgc3RvcmUuIFlhcm4tZXJhIEJsaXR6IHJlcG9zIGdldCB0aGVpciByb3V0ZSBtYW5pZmVzdCBmcm9tXG4gIC8vIGB3YiBnZW4tY29kZWAncyBgYmxpdHogY29kZWdlbmAgc3RlcCwgYW5kIGN1cnJlbnQgd2Igcm91dGVzIG9ubHkgYHdiIHByaXNtYSBzZWVkYCB0aHJvdWdoXG4gIC8vIHRoZSBibGl0eiBDTEksIG9ubHkgZm9yIG5vbi1CdW4gcmVwb3MgKHNlZSBwYWNrYWdlcy93Yi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzKTsgdGhlXG4gIC8vIHBvc3QtbWVyZ2UgaG9va3Mgc3RheSB3Yi1kcml2ZW4gYmVjYXVzZSBgcHJpc21hIGRlcGxveWAvYGdlbmVyYXRlYCBuZWVkIG5vIGJsaXR6IGxvYWRlci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwiYnVuIHdiIHByaXNtYSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuLy8gVGhlIGdlbmVyYXRlZCBjb21tYW5kIHBhc3NlcyB0aHJvdWdoIFRXTyBzaGVsbCBwYXJzaW5nIHN0YWdlczogdGhlIHByZXBhcmUuc2ggbGluZSBwYXJzZXMgaXQgYXNcbi8vIGEgZG91YmxlLXF1b3RlZCBhcmd1bWVudCAocHJvY2Vzc2luZyBcXCwgYCwgJCBhbmQgXCIgaW1tZWRpYXRlbHkpLCBhbmQgcnVuX2lmX2NoYW5nZWQgdGhlbiBldmFsJ3Ncbi8vIGl0ICh3b3JkLXNwbGl0dGluZyBhbmQgZ2xvYmJpbmcpLiBBbiB1bnF1b3RlZCBwYXRoIGNvbnRhaW5pbmcgc3BhY2VzIChlLmcuIGBhcHBzL215IGFwcC8ubmV4dGApXG4vLyB3b3VsZCB3b3JkLXNwbGl0IGludG8gdW5yZWxhdGVkIHJtIHRhcmdldHMsIGFuZCBgJGAvYmFja3RpY2sgd291bGQgZXhwYW5kIGF0IHRoZSBmaXJzdCBzdGFnZS5cbi8vIFNvOiBxdW90ZSBmb3IgdGhlIGV2YWwgc3RhZ2Ug4oCUIGBxdW90ZUZvclNoZWxsYCBsZWF2ZXMgb25seSB3b3JkcyB0aGF0IGNhcnJ5IG5vIHNoZWxsIG1lYW5pbmdcbi8vIHVucXVvdGVkIOKAlCB0aGVuIGJhY2tzbGFzaC1lc2NhcGUgdGhlIGRvdWJsZS1xdW90ZS1jb250ZXh0IHNwZWNpYWxzLlxuZnVuY3Rpb24gcXVvdGVGb3JFdmFsdWF0ZWRTaGVsbChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXZhbFF1b3RlZCA9IHF1b3RlRm9yU2hlbGwoZmlsZVBhdGgpO1xuICByZXR1cm4gZXZhbFF1b3RlZC5yZXBsYWNlQWxsKC9bXFxcXGAkXCJdL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlLXJlbGF0aXZlIGRpcmVjdG9yaWVzIChyb290IGZpcnN0LCBkZWR1cGxpY2F0ZWQsIGA8c3ViRGlyTmFtZT5gIGFwcGVuZGVkKSBvZiBldmVyeVxuICogd29ya3NwYWNlIHdob3NlIGNvbmZpZyBtYXRjaGVzIHRoZSBwcmVkaWNhdGUuIFRoZSBob29rIHNjcmlwdCBydW5zIGF0IHRoZSByZXBvc2l0b3J5IHJvb3QsIHNvXG4gKiBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBwcmVkaWNhdGU6IChjb25maWc6IFBhY2thZ2VDb25maWcpID0+IGJvb2xlYW4sXG4gIHN1YkRpck5hbWU6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBhbGxDb25maWdzXG4gICAgICAgIC5maWx0ZXIoKGNvbmZpZykgPT4gcHJlZGljYXRlKGNvbmZpZykpXG4gICAgICAgIC5tYXAoKGNvbmZpZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdENvbmZpZy5kaXJQYXRoLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0aXZlRGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihyZWxhdGl2ZURpclBhdGgsIHN1YkRpck5hbWUpIDogc3ViRGlyTmFtZTtcbiAgICAgICAgfSlcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2s7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblJ1bm5lcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5IHJ1bicgfCAndXYgcnVuJyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgPyAndXYgcnVuJyA6ICdwb2V0cnkgcnVuJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJpbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgIGZpbGVQYXRoLFxuICAgIH0pO1xuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBveGZtdEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hmbXQgY29uZmlnIGZpbGVzIGFyZSBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGZtdENvbmZpZyA9IHJlcXVpcmUoJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IG94Zm10Q29uZmlnLmRlZmF1bHQgPz8gb3hmbXRDb25maWc7YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9JztcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBjb25maWc7YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UsXG4gIHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSxcbn0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGxpbnQnLFxuICB0b29sTmFtZTogJ294bGludCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBnZW5lcmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVwbGFjZSBwYWNrYWdlLXByb3ZpZGVkIGxpbnRlciBzZXR0aW5ncy4gR2VuZXJhdGVkIGZpbGVzIHdpdGhcbiAgICAvLyBtYW5hZ2VkIGJsb2NrcyBhcmUgc3RpbGwgc2FmZSB0byB1cGRhdGUuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50ICYmICFtYW5hZ2VkQ29uZmlnQmxvY2tzLmhhc01hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50KTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50XG4gICAgICA/IGV4aXN0aW5nQ29udGVudFxuICAgICAgOiBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICB9KTtcblxuICAgIGlmIChub3JtYWxpemVDb25maWdDb250ZW50KGV4aXN0aW5nQ29udGVudCkgIT09IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZGVzaXJlZENvbnRlbnQpKSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBkZXNpcmVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBpc1Jvb3RDb25maWcgPSBjb25maWcuaXNSb290O1xuICBjb25zdCBveGxpbnRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG4vLyBveGxpbnQtZGlzYWJsZSB1bmljb3JuL3ByZWZlci1tb2R1bGUgLS0gT3hsaW50IG9ubHkgYXV0by1kaXNjb3ZlcnMgLnRzIGNvbmZpZyBmaWxlcywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94bGludEJhc2VDb25maWcgPSByZXF1aXJlKCcke294bGludEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnLmRlZmF1bHQgPz8gb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICAgICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbmltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZycsIGlzUm9vdENvbmZpZyl9YFxuICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG5cbi8vIHN0cnVjdHVyZWRDbG9uZSBrZWVwcyBhIHBhY2thZ2UtbG9jYWwgY29weSBzbyByZXBvc2l0b3JpZXMgY2FuIGFkZCBzZXR0aW5ncyBvdXRzaWRlIG1hbmFnZWRcbi8vIGJsb2NrcyB3aXRob3V0IG11dGF0aW5nIHRoZSBzaGFyZWQgaW1wb3J0ZWQgY29uZmlnIG9iamVjdC4gVGhlIHJvb3QgY29uZmlnIGZvcmNlcyB0aGUgdHlwZS1hd2FyZVxuLy8gb3B0aW9ucyBvbiBpbnNpZGUgdGhlIG1hbmFnZWQgYmxvY2sgc28gbm8gY3VzdG9taXphdGlvbiBjYW4gc2lsZW50bHkgZGlzYWJsZSB0eXBlIGNoZWNraW5nOyBldmVyeVxuLy8gb3RoZXIgY29uZmlnIGRlbGV0ZXMgdGhlbSBiZWNhdXNlIE94bGludCByZWplY3RzIHRob3NlIHJvb3Qtb25seSBvcHRpb25zIGVsc2V3aGVyZSAodHlwZSBjaGVja2luZ1xuLy8gc3Vydml2ZXM6IHRoZSBsaW50IGNvbW1hbmRzIHBhc3MgLS10eXBlLWF3YXJlIGFuZCAtLXR5cGUtY2hlY2sgZXhwbGljaXRseSkuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zID0geyAuLi5veGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zLCB0eXBlQXdhcmU6IHRydWUsIHR5cGVDaGVjazogdHJ1ZSB9O2A7XG4gIH1cblxuICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xuZGVsZXRlIG94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnM7YDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICAvLyBweXJpZ2h0Y29uZmlnLmpzb24gYWxsb3dzIEpTT05DOyBhbiBleGlzdGluZyBmaWxlIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdFxuICAgICAgLy8gdW50b3VjaGVkIGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgYmFyZSB0ZW1wbGF0ZS5cbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHB5cmlnaHRjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShuZXdTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBjb25zdW1lc0RvY2tlckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBtYW5hZ2VkU2NyaXB0c0Jsb2NrID0gYHNjcmlwdHMvKipcbiFzY3JpcHRzL1xuIXNjcmlwdHMvKi5zaGA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhSYWlsd2F5aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFJhaWx3YXlpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheWlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgY29uc3QgdXNlc0RvY2tlckVudiA9IGNvbnN1bWVzRG9ja2VyRW52KGNvbmZpZy5kb2NrZXJmaWxlKTtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIGlmIChjb25maWcuaXNSYWlsd2F5ICYmIHVzZXNEb2NrZXJFbnYpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsICchLmRvY2tlci5lbnZcXG4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL15zY3JpcHRzXFwvJC9tLCBtYW5hZ2VkU2NyaXB0c0Jsb2NrKTtcbiAgICAvLyBgcmFpbHdheSB1cGAgc3RyaXBzIGdpdGlnbm9yZWQgZmlsZXMgZnJvbSB0aGUgdXBsb2FkZWQgYnVpbGQgY29udGV4dCwgc28gdGhlIGdlbmVyYXRlZFxuICAgIC8vIG5vbi1zZWNyZXQgLmRvY2tlci5lbnYgKGB3YiBnZW4tZG9ja2VyLWVudmAgb3V0cHV0KSBuZWVkcyBhbiBleHBsaWNpdCB1bi1pZ25vcmUgdG8gcmVhY2hcbiAgICAvLyB0aGUgcmVtb3RlIERvY2tlciBidWlsZC4gQXBwZW5kZWQsIG5vdCBwcmVwZW5kZWQ6IGlnbm9yZSBmaWxlcyBhcmUgbGFzdC1tYXRjaC13aW5zLCBzbyBhXG4gICAgLy8gaGFuZC13cml0dGVuIHBhdHRlcm4gc3VjaCBhcyBgKi5lbnZgIGVhcmxpZXIgaW4gdGhlIGZpbGUgbXVzdCBub3Qgc2lsZW50bHkgcmUtZXhjbHVkZSBpdC5cbiAgICBpZiAodXNlc0RvY2tlckVudiAmJiAhL14hXFwuZG9ja2VyXFwuZW52JC9tLnRlc3QobmV3Q29udGVudCkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBgJHtuZXdDb250ZW50LnJlcGxhY2UoL1xcbj8kLywgJ1xcbicpfSEuZG9ja2VyLmVudlxcbmA7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9ja2VyZmlsZSAmJiAhdXNlc0RvY2tlckVudikge1xuICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZSgvXiFcXC5kb2NrZXJcXC5lbnZcXG4/L20sICcnKTtcbiAgICB9XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PlxuICAgICAgbmV3Q29udGVudCA/IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpIDogZnNVdGlsLnJlbW92ZUNvbmZpbmVkKGZpbGVQYXRoKVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbWFnZSwgTGluaywgUGFyYWdyYXBoLCBQaHJhc2luZ0NvbnRlbnQsIFJvb3RDb250ZW50IH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHsgZnJvbU1hcmtkb3duIH0gZnJvbSAnbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmNvbnN0IHdiZnlCYWRnZVVybFByZWZpeCA9ICdodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3diZnktJztcbmNvbnN0IHdiZnlCYWRnZVVybFN1ZmZpeCA9ICctMWU5MGZmLnN2Zyc7XG5jb25zdCB3YmZ5QmFkZ2VMaW5rID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvdHJlZS9tYWluL3BhY2thZ2VzL3diZnknO1xuXG5jb25zdCBucG1QYWNrYWdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlLyc7XG5jb25zdCBucG1MaWNlbnNlQmFkZ2VQYXR0ZXJuID0gL15cXFshXFxbW15cXF1dKlxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL25wbVxcL2xcXC9bXilcXHNdK1xcKVxcXVxcKFteKVxcc10rXFwpJC91O1xuXG5jb25zdCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucyA9IFtcbiAgL15cXFshXFxbd2JmeVxcXVxcKGh0dHBzOlxcL1xcL2ltZ1xcLnNoaWVsZHNcXC5pb1xcL2JhZGdlXFwvd2JmeS1bXilcXHNdKy0xZTkwZmZcXC5zdmdcXClcXF1cXChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9XaWxsQm9vc3RlclxcL3NoYXJlZFxcL3RyZWVcXC9tYWluXFwvcGFja2FnZXNcXC93YmZ5XFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoKGh0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcL1teKVxcc10rXFwvYWN0aW9uc1xcL3dvcmtmbG93c1xcL1teKVxcc10rKVxcL2JhZGdlXFwuc3ZnXFwpXFxdXFwoXFwxXFwpJC91LFxuICAvXlxcWyFcXFtbXlxcXV0qXFxdXFwoW14pXFxzXStcXClcXF1cXChodHRwcz86XFwvXFwvKD86d3d3XFwuKT9ucG1qc1xcLmNvbVxcL3BhY2thZ2VcXC9bXilcXHNdKlxcKSQvdSxcbiAgbnBtTGljZW5zZUJhZGdlUGF0dGVybixcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkV2JmeUJhZGdlKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIeXBoZW5zIGFyZSBlc2NhcGVkIGFzIGAtLWAgcGVyIHNoaWVsZHMuaW8ncyBiYWRnZSBwYXRoIHN5bnRheCwgc28gYHYxLjIuMy1yYy4xYCBzdGF5cyBpbnRhY3QuXG4gIHJldHVybiBgWyFbd2JmeV0oJHt3YmZ5QmFkZ2VVcmxQcmVmaXh9JHtsYWJlbC5yZXBsYWNlQWxsKCctJywgJy0tJyl9JHt3YmZ5QmFkZ2VVcmxTdWZmaXh9KV0oJHt3YmZ5QmFkZ2VMaW5rfSlgO1xufVxuXG4vKiogVGhlIHZlcnNpb24gbGFiZWwgdGhlIHdiZnkgYmFkZ2UgaW4gdGhlIHJlcG9zaXRvcnkncyBSRUFETUUgcmVjb3JkcywgaS5lLiB0aGUgYnVpbGQgdGhhdCB3YmZpZWQgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIENvbmZpbmVkLCBhbmQgdG9sZXJhbnQgb2YgYW55IHJlYWQgZmFpbHVyZTogYSBSRUFETUUgdGhhdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IChhXG4gIC8vIGNvbW1pdHRlZCBzeW1saW5rKSBvciBjYW5ub3QgYmUgcmVhZCBhdCBhbGwgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoIGJ1aWxkIGNvbmZpZ3VyZWQgVEhJU1xuICAvLyByZXBvc2l0b3J5LCBhbmQgdGhlIGFuc3dlciBvbmx5IGV2ZXIgc3VwcHJlc3NlcyB3b3JrIOKAlCBzbyBhbnl0aGluZyBidXQgYSByZWFkYWJsZSBpbi1yZXBvc2l0b3J5XG4gIC8vIFJFQURNRSBtZWFucyBcIm5vdCBrbm93biB0byBiZSBhcHBsaWVkXCIgYW5kIHRoZSBydW4gcHJvY2VlZHMuXG4gIGNvbnN0IHJlYWRtZSA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdSRUFETUUubWQnKSkuY2F0Y2goKCkgPT4ge30pO1xuICBpZiAocmVhZG1lID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIFJFQURNRSBpcyBwYXJzZWQgcmF0aGVyIHRoYW4gc2Nhbm5lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3cml0ZUJhZGdlQmxvY2sgcGFyc2VzIGl0LCBhbmRcbiAgLy8gb25seSB0aGUgc2hhcGUgd3JpdGVCYWRnZUJsb2NrIGl0c2VsZiB3cml0ZXMgY291bnRzIGFzIGFuIGFwcGxpZWQgYmFkZ2U6IGEgdG9wLWxldmVsIHBhcmFncmFwaFxuICAvLyBvZiBiYWRnZXMuIEEgYmFkZ2UgYW55d2hlcmUgZWxzZSBpcyBjb250ZW50IHRoYXQgbWVyZWx5IG1lbnRpb25zIG9uZSDigJQgYSBmZW5jZWQgZXhhbXBsZSAod2JmeSdzXG4gIC8vIG93biBkb2N1bWVudGF0aW9uIGhhcyB0aG9zZSksIGEgYmxvY2sgcXVvdGUsIGEgbGlzdCBpdGVtIOKAlCBhbmQgcmVhZGluZyBpdCBhcyBhcHBsaWVkIHdvdWxkIHNraXBcbiAgLy8gZXZlcnkgZml4ZXIgZm9yIHRoZSByZXBvc2l0b3J5LlxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZnJvbU1hcmtkb3duKHJlYWRtZSkuY2hpbGRyZW4pIHtcbiAgICBpZiAoIWlzQmFkZ2VCbG9ja05vZGUobm9kZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYmFkZ2Ugb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKCFpc0JhZGdlTm9kZShiYWRnZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyB1cmwgfSA9IGJhZGdlLmNoaWxkcmVuWzBdO1xuICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHdiZnlCYWRnZVVybFByZWZpeCkgJiYgdXJsLmVuZHNXaXRoKHdiZnlCYWRnZVVybFN1ZmZpeCkpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSh3YmZ5QmFkZ2VVcmxQcmVmaXgubGVuZ3RoLCAtd2JmeUJhZGdlVXJsU3VmZml4Lmxlbmd0aCkucmVwbGFjZUFsbCgnLS0nLCAnLScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICAvLyBUaGUgd2JmeSBiYWRnZSBtYXJrcyBhIHJlcG9zaXRvcnkgYXMgd2JmaWVkLCBzbyBhIHJlcG9zaXRvcnkgd2l0aG91dCBhIFJFQURNRSBzdGlsbCBnZXRzIG9uZS5cbiAgICAvLyByZWFkRmlsZUlmRXhpc3RzIGZhbGxzIGJhY2sgT05MWSBvbiBFTk9FTlQ6IGEgUkVBRE1FIHRoYXQgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZCAoZS5nLlxuICAgIC8vIHBlcm1pc3Npb25zLCBFTUZJTEUpIG11c3QgYWJvcnQgdGhlIGdlbmVyYXRvciBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIHN0dWIuXG4gICAgbGV0IG5ld0NvbnRlbnQgPVxuICAgICAgKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz9cbiAgICAgIGAjICR7Y29uZmlnLnBhY2thZ2VKc29uPy5uYW1lID8/IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSl9XFxuYDtcblxuICAgIC8vIE9yZGVyZWQgYnkgd2hhdCBhIHJlYWRlciBjYXJlcyBhYm91dCBtb3N0OiB0aGUgbnBtIGJhZGdlIG5hbWVzIHRoZSBwYWNrYWdlIGEgcmVhZGVyIGluc3RhbGxzLFxuICAgIC8vIHRoZW4gdGhlIHdvcmtmbG93IGJhZGdlcyByZXBvcnQgd2hldGhlciB0aGUgY29kZSBpcyBjdXJyZW50bHkgaGVhbHRoeSwgdGhlbiBob3cgaXQgaXNcbiAgICAvLyByZWxlYXNlZCwgYW5kIGxhc3QgdGhlIHdiZnkgYnVpbGQgdGhhdCBjb25maWd1cmVkIGl0LlxuICAgIGNvbnN0IGJhZGdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGF3YWl0IGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZyk7XG4gICAgaWYgKHBhY2thZ2VOYW1lKSB7XG4gICAgICBiYWRnZXMucHVzaChidWlsZE5wbUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICBjb25zdCBsaWNlbnNlID0gY29uZmlnLnBhY2thZ2VKc29uPy5saWNlbnNlO1xuICAgICAgaWYgKGxpY2Vuc2UgJiYgbGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnKSB7XG4gICAgICAgIGJhZGdlcy5wdXNoKGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJhZGdlcy5wdXNoKC4uLihhd2FpdCBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZykpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIGJhZGdlcy5wdXNoKHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICBiYWRnZXMucHVzaChidWlsZFdiZnlCYWRnZShnZXRXYmZ5VmVyc2lvbkxhYmVsKCkgPz8gJ2FwcGxpZWQnKSk7XG5cbiAgICAvLyBUaGUgYmxvY2sgaXMgd3JpdHRlbiBpbiBvbmUgcGFzcyBmcm9tIHRoZSBiYWRnZXMgd2JmeSBtYW5hZ2VzIHJpZ2h0IG5vdy4gQSBiYWRnZSB0aGF0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIHdhbnRlZCDigJQgYSBzdXBlcnNlZGVkIHZlcnNpb24sIG9yIG9uZSB3aG9zZSB3b3JrZmxvdyBpcyBnb25lIOKAlCBzaW1wbHkgaXMgbm90IGluIHRoZVxuICAgIC8vIGxpc3QsIHNvIG5vdGhpbmcgaGFzIHRvIHJlbW92ZSBpdC5cbiAgICBuZXdDb250ZW50ID0gd3JpdGVCYWRnZUJsb2NrKG5ld0NvbnRlbnQsIGJhZGdlcyk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT5cbiAgICAgIGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQsIGdldExpbmVFbmRpbmcobmV3Q29udGVudCkpXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICAvLyBBIG1vbm9yZXBvIGhhcyBubyBzaW5nbGUgbnBtIHZlcnNpb24gcmVwcmVzZW50aW5nIHRoZSB3aG9sZSByZXBvc2l0b3J5LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIHx8ICFjb25maWcucmVsZWFzZS5ucG0gfHwgIXBhY2thZ2VKc29uPy5uYW1lIHx8IHBhY2thZ2VKc29uLnByaXZhdGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiAoYXdhaXQgaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VKc29uLm5hbWUpKSA/IHVuZGVmaW5lZCA6IHBhY2thZ2VKc29uLm5hbWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaXN0cnkgYW5zd2VycyB0aGF0IGl0IGhhcyBubyBzdWNoIHBhY2thZ2Ug4oCUIHRoZSBPTkxZIGFuc3dlciB0aGF0IHJlbW92ZXMgYSBiYWRnZS5cbiAqIEEgY2hlY2sgdGhhdCBjYW5ub3QgcnVuIChvZmZsaW5lLCBhbiBvdXRhZ2UsIGEgdGltZW91dCkgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBwYWNrYWdlLCBhbmRcbiAqIHRyZWF0aW5nIGl0IGFzIGFic2VudCB3b3VsZCBzdHJpcCB0aGUgYmFkZ2Ugb3V0IG9mIGV2ZXJ5IHB1Ymxpc2hlZCByZXBvc2l0b3J5IHdiZnkgdG91Y2hlc1xuICogZHVyaW5nIHRoZSBvdXRhZ2UgYW5kIHB1dCBpdCBiYWNrIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHNjb3BlIHNlcGFyYXRvciBtdXN0IHN1cnZpdmUgYXMgYSBwYXRoIHNlZ21lbnQsIHNvIHRoZSBuYW1lIGlzIGVuY29kZWQgcGllY2V3aXNlLlxuICAgIGNvbnN0IGVuY29kZWROYW1lID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcvJyk7XG4gICAgLy8gQSBiYWRnZSBpcyBkZWNvcmF0aW9uOiBhIHN0YWxsZWQgcmVnaXN0cnkgY29ubmVjdGlvbiBtdXN0IG5vdCBob2xkIHRoZSB3aG9sZSBydW4gZm9yIGhvd2V2ZXJcbiAgICAvLyBsb25nIHRoZSBuZXR3b3JraW5nIHN0YWNrIHdvdWxkIHdhaXQuIFRoZSBidWRnZXQgaXMgZ2VuZXJvdXMgYmVjYXVzZSBhIHRpbWVvdXQgYW5zd2Vyc1xuICAgIC8vIFwidW5rbm93blwiLCB3aGljaCBrZWVwcyB0aGUgYmFkZ2Ug4oCUIGFuZCBvbiBhIHJlcG9zaXRvcnkgdGhhdCBpcyBub3Qgb24gbnBtIHRoYXQgbWVhbnMgd3JpdGluZ1xuICAgIC8vIG9uZSBpdCBzaG91bGQgbm90IGhhdmU7IGEgd2JmeSBydW4gYWxyZWFkeSBzcGVuZHMgbWludXRlcyBvbiBpbnN0YWxscywgc28gd2FpdGluZyBhIGxpdHRsZVxuICAgIC8vIGxvbmdlciBmb3IgYSByZWFsIGFuc3dlciBjb3N0cyBsZXNzIHRoYW4gYWN0aW5nIG9uIGEgbWlzc2luZyBvbmUuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVkTmFtZX1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQwNDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbnBtIHZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL3YvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFshW2xpY2Vuc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL2wvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFyZXBvc2l0b3J5IHx8ICFmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpKSByZXR1cm4gW107XG5cbiAgLy8gV29ya2Zsb3cgYW5kIFJFQURNRSBnZW5lcmF0aW9uIHJ1biBjb25jdXJyZW50bHkuIERvIG5vdCByZXRhaW4gYSBzdGFsZSBSdXN0IGJhZGdlIHdoaWxlIHRoZVxuICAvLyB3b3JrZmxvdyBnZW5lcmF0b3IgcmVtb3ZlcyBhIGNhbGxlciBjcmVhdGVkIGZyb20gYSBmb3JtZXJseSBtaXNkZXRlY3RlZCBsb2NhbCBjYWNoZSDigJQgYnV0XG4gIC8vIG1pcnJvciBpdHMgb3duZXJzaGlwIGNoZWNrOiBhIGN1c3RvbSBzYW1lLW5hbWVkIHdvcmtmbG93IHN1cnZpdmVzLCBzbyBpdHMgYmFkZ2UgbXVzdCB0b28uXG4gIC8vIERlY2lkZWQgc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIGxvb3AncyBmaXJzdCBhd2FpdDogdGhlIGdlbmVyYXRvcidzIGRlbGV0ZSBjYW4gb25seSBsYW5kIGF0XG4gIC8vIGFuIGF3YWl0IHBvaW50LCBhbmQgYSBwb3N0LWRlbGV0ZSByZWFkIHdvdWxkIG1pc3JlcG9ydCB0aGUgd2JmeS1vd25lZCBjYWxsZXIgYXMgY3VzdG9tLlxuICAvLyBObyBleGlzdHNTeW5jIHByZS1jaGVjazogdGhlIGhlbHBlciBhbHJlYWR5IHRyZWF0cyBhIG1pc3NpbmcgZmlsZSBhcyBub3Qgb3duZWQsIGFuZCB0aGlzIHJ1bnNcbiAgLy8gb25jZSBwZXIgcmVwb3NpdG9yeSwgc28gdGhlIGV4Y2VwdGlvbmFsIEVOT0VOVCByZWFkIGNvc3RzIG5vdGhpbmcgd29ydGggYSByZWR1bmRhbnQgc3RhdC5cbiAgY29uc3QgZHJvcHNUZXN0UnVzdEJhZGdlID1cbiAgICBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCAndGVzdC1ydXN0LnltbCcsICd0ZXN0LXJ1c3QnKTtcblxuICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkpIHtcbiAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuICAgIGlmIChmaWxlTmFtZSA9PT0gJ3Rlc3QtcnVzdC55bWwnICYmIGRyb3BzVGVzdFJ1c3RCYWRnZSkgY29udGludWU7XG4gICAgLy8gR2l0SHViJ3MgYmFkZ2UgZW5kcG9pbnQgcmV0dXJucyA0MDQgdW50aWwgdGhlIHdvcmtmbG93IGhhcyBhdCBsZWFzdCBvbmUgcnVuLCBzbyBhIGJhZGdlIGZvciBhXG4gICAgLy8gZGlzcGF0Y2gtb25seSBkZXBsb3kgd29ya2Zsb3cgdGhhdCBoYXMgbmV2ZXIgcnVuIHJlbmRlcnMgYXMgYSBicm9rZW4gaW1hZ2UuIFRlc3Qgd29ya2Zsb3dzIHJ1blxuICAgIC8vIG9uIGV2ZXJ5IFBSLCBzbyBvbmx5IGRlcGxveSBiYWRnZXMgbmVlZCB0aGUgZ3VhcmQuXG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmICEoYXdhaXQgaGFzQW55V29ya2Zsb3dSdW4ocmVwb3NpdG9yeSwgZmlsZU5hbWUsIGNvbmZpZy5pc1B1YmxpY1JlcG8pKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGJhZGdlTmFtZSA9IChmaWxlTmFtZVswXSA/PyAnJykudG9VcHBlckNhc2UoKSArIGZpbGVOYW1lLnNsaWNlKDEsIGZpbGVOYW1lLmluZGV4T2YoJy4nKSkucmVwbGFjZSgnLScsICcgJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtlbmNvZGVVcmxQYXRoKGZpbGVOYW1lKX1gO1xuICAgIGJhZGdlcy5wdXNoKGBbIVske2JhZGdlTmFtZX1dKCR7d29ya2Zsb3dVcmx9L2JhZGdlLnN2ZyldKCR7d29ya2Zsb3dVcmx9KWApO1xuICB9XG4gIHJldHVybiBiYWRnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FueVdvcmtmbG93UnVuKFxuICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gIHdvcmtmbG93RmlsZU5hbWU6IHN0cmluZyxcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IHJlcG9zaXRvcnkuc3BsaXQoJy8nKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG93bmVyKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVucycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0ZpbGVOYW1lLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZvciBhIFBVQkxJQyByZXBvc2l0b3J5IHRoZSBydW5zIGVuZHBvaW50IG5lZWRzIG5vIGF1dGhvcml6YXRpb24sIHNvIDQwNCByZWxpYWJseSBtZWFucyB0aGVcbiAgICAvLyB3b3JrZmxvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVtb3RlIChlLmcuIGFkZGVkIGxvY2FsbHksIG5ldmVyIHB1c2hlZCkg4oCUIGxpa2UgemVybyBydW5zLCBpdHNcbiAgICAvLyBiYWRnZSB3b3VsZCByZW5kZXIgYnJva2VuLiBGb3IgYSBQUklWQVRFIHJlcG9zaXRvcnkgR2l0SHViIGFsc28gYW5zd2VycyA0MDQgd2hlbiB0aGUgdG9rZW5cbiAgICAvLyBpcyBtaXNzaW5nIG9yIHVuZGVyLXNjb3BlZCwgc28gNDA0IGlzIGFtYmlndW91cyB0aGVyZSBhbmQgdGhlIGJhZGdlIGlzIGtlcHQuXG4gICAgaWYgKChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwNCAmJiBpc1B1YmxpY1JlcG8pIHJldHVybiBmYWxzZTtcbiAgICAvLyBLZWVwIHRoZSBwcmUtZ3VhcmQgYmVoYXZpb3IgKGluc2VydCB0aGUgYmFkZ2UpIHdoZW4gdGhlIGNoZWNrIGl0c2VsZiBjYW5ub3QgcnVuLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGJhZGdlIGJsb2NrcyBkaXJlY3RseSB1bmRlciB0aGUgdGl0bGUgd2l0aCBgbWFuYWdlZEJhZGdlc2AsIGtlZXBpbmcgYW55IGJhZGdlIHRoZXJlXG4gKiB0aGF0IHdiZnkgZG9lcyBub3QgbWFuYWdlLCBhbmQgcmVhc3NlbWJsZXMgdGhlIFJFQURNRSBhcm91bmQgdGhlbSB3aXRoIGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgb25cbiAqIGVhY2ggc2lkZS5cbiAqXG4gKiBCb3RoIHRoZSB0aXRsZSBhbmQgdGhlIGJsb2NrIGFyZSBsb2NhdGVkIGluIGEgQ29tbW9uTWFyayBzeW50YXggdHJlZSByYXRoZXIgdGhhbiBieSBzY2FubmluZ1xuICogbGluZXM6IG9ubHkgYSByZWFsIHBhcnNlciBrbm93cyB3aGV0aGVyIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgYSBiYWRnZSBpcyBhIGJhZGdlIChhIHBhcmFncmFwaCBvZlxuICogbGlua2VkIGltYWdlcykgb3IgY29udGVudCB0aGF0IG1lcmVseSByZWFkcyBsaWtlIG9uZSAoYW4gaW5kZW50ZWQgY29kZSBibG9jaywgYSBibG9jayBxdW90ZSwgYVxuICogZmVuY2VkIGV4YW1wbGUsIGEgbXVsdGlsaW5lIGNvZGUgc3BhbiwgYW4gSFRNTCBibG9jaykuIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgYmxvY2sgaXMgY29waWVkIGJhY2tcbiAqIHZlcmJhdGltIGZyb20gdGhlIG9yaWdpbmFsIHRleHQgdGhyb3VnaCB0aGUgcGFyc2VyJ3MgcG9zaXRpb25hbCBvZmZzZXRzLCBzbyBubyByZWZvcm1hdHRpbmcgb2YgdGhlXG4gKiB1c2VyJ3MgY29udGVudCBpcyBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQmFkZ2VCbG9jayhyZWFkbWU6IHN0cmluZywgbWFuYWdlZEJhZGdlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lRW5kaW5nID0gZ2V0TGluZUVuZGluZyhyZWFkbWUpO1xuICAvLyBBIEJPTSBpcyBub3QgTWFya2Rvd246IGxlZnQgaW4gdGhlIHRleHQgaXQgaGlkZXMgdGhlIGAjYCBvZiB0aGUgdGl0bGUgZnJvbSB0aGUgcGFyc2VyLCBhbmRcbiAgLy8gcHJlcGVuZGluZyB0aGUgYmxvY2sgYWhlYWQgb2YgaXQgd291bGQgc3RyaXAgdGhlIG1hcmtlciBmcm9tIHRoZSBmaWxlJ3MgZmlyc3QgYnl0ZS5cbiAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IHJlYWRtZS5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gIC8vIEZyb250IG1hdHRlciBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNhbWUgYC0tLWAgYSBTZXRleHQgaGVhZGluZyBhbmQgYSB0aGVtYXRpYyBicmVhayB1c2UsIHNvIGl0IGlzXG4gIC8vIGRldGFjaGVkIGJlZm9yZSBwYXJzaW5nIGluc3RlYWQgb2YgYmVpbmcgdG9sZCBhcGFydCBhZnRlcndhcmRzOyBpdCBhbHNvIGhhcyB0byBzdGF5IGZpcnN0IGluIHRoZVxuICAvLyBmaWxlLCB3aGljaCBtYWtlcyBpdCBhIHByZWZpeCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGUgQk9NIGlzLlxuICBjb25zdCB3aXRob3V0TWFyayA9IHJlYWRtZS5zbGljZShieXRlT3JkZXJNYXJrLmxlbmd0aCk7XG4gIGNvbnN0IGZyb250TWF0dGVyID0gd2l0aG91dE1hcmsuc3RhcnRzV2l0aCgnLS0tJylcbiAgICA/ICgvXi0tLVsgXFx0XSpcXHI/XFxuW1xcc1xcU10qP14tLS1bIFxcdF0qKD86XFxyP1xcbnwkKS9tdS5leGVjKHdpdGhvdXRNYXJrKT8uWzBdID8/ICcnKVxuICAgIDogJyc7XG4gIGNvbnN0IHByZWZpeCA9IGAke2J5dGVPcmRlck1hcmt9JHtmcm9udE1hdHRlcn1gO1xuICAvLyBUaGUgZmluYWwgbmV3bGluZSBpcyBzZXQgYXNpZGUgcmF0aGVyIHRoYW4gcGFyc2VkIGFzIHRyYWlsaW5nIGJsYW5rIHNwYWNlLCB3aGljaCB0aGUgYmxhbmstbGluZVxuICAvLyB0cmltbWluZyBiZWxvdyB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdy5cbiAgY29uc3QgZW5kc1dpdGhOZXdsaW5lID0gL1xccj9cXG4kL3UudGVzdChyZWFkbWUpO1xuICBjb25zdCBjb250ZW50ID0gd2l0aG91dE1hcmsuc2xpY2UoZnJvbnRNYXR0ZXIubGVuZ3RoKS5yZXBsYWNlKC9cXHI/XFxuJC91LCAnJyk7XG5cbiAgY29uc3Qgbm9kZXMgPSBmcm9tTWFya2Rvd24oY29udGVudCkuY2hpbGRyZW47XG4gIC8vIEEgbGVhZGluZyBiYWRnZSBibG9jayBpcyB0aGUgdXNlcidzIG93biBsYXlvdXQ6IGl0IHN0YXlzIGFib3ZlIHRoZSB0aXRsZSwgYW5kIHdiZnkncyBibG9jayBnb2VzIGJlbG93LlxuICBjb25zdCBrZWVwc0xlYWRpbmdCbG9jayA9ICEhbm9kZXNbMF0gJiYgaXNCYWRnZUJsb2NrTm9kZShub2Rlc1swXSkgJiYgaXNUaXRsZU5vZGUobm9kZXNbMV0pO1xuICBjb25zdCB0aXRsZUluZGV4ID0ga2VlcHNMZWFkaW5nQmxvY2sgPyAxIDogaXNUaXRsZU5vZGUobm9kZXNbMF0pID8gMCA6IC0xO1xuICAvLyBXaXRob3V0IGEgcmVjb2duaXphYmxlIHRpdGxlIHRoZSBibG9jayBzaXRzIGF0IHRoZSB2ZXJ5IHRvcCwgYWJvdmUgZXZlcnl0aGluZy5cbiAgY29uc3QgaGVhZFN0YXJ0Tm9kZSA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gbm9kZXNbMF0hIDogbm9kZXNbdGl0bGVJbmRleF07XG4gIGNvbnN0IGhlYWQgPVxuICAgIHRpdGxlSW5kZXggPT09IC0xXG4gICAgICA/ICcnXG4gICAgICA6IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGhlYWRTdGFydE5vZGUhKSwgbm9kZXNbdGl0bGVJbmRleF0hLnBvc2l0aW9uIS5lbmQub2Zmc2V0KTtcblxuICBjb25zdCBiYWRnZUJsb2NrTm9kZXM6IFBhcmFncmFwaFtdID0gW107XG4gIGZvciAobGV0IG5vZGVJbmRleCA9IHRpdGxlSW5kZXggKyAxOyA7IG5vZGVJbmRleCsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW25vZGVJbmRleF07XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBicmVhaztcbiAgICBiYWRnZUJsb2NrTm9kZXMucHVzaChub2RlKTtcbiAgICAvLyBXaXRob3V0IGEgdGl0bGUsIG1lcmdpbmcgbGVhZGluZyBibG9ja3MgY291bGQgY2hhbmdlIHdoaWNoIG5vZGUgaXMgcmVjb2duaXplZCBhcyB0aGUgdGl0bGUgb24gdGhlIG5leHQgcnVuLlxuICAgIGlmICh0aXRsZUluZGV4ID09PSAtMSkgYnJlYWs7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmcgPSBiYWRnZUJsb2NrTm9kZXMuZmxhdE1hcCgobm9kZSkgPT4gcmVhZEJhZGdlcyhub2RlLCBjb250ZW50KSk7XG4gIGNvbnN0IGJvZHlOb2RlID0gbm9kZXNbdGl0bGVJbmRleCArIDEgKyBiYWRnZUJsb2NrTm9kZXMubGVuZ3RoXTtcbiAgY29uc3QgYm9keSA9IGJvZHlOb2RlID8gY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgYm9keU5vZGUpKSA6ICcnO1xuXG4gIC8vIFN1cGVyc2VkaW5nIGEgbWFuYWdlZCBiYWRnZSBpcyBqdXN0IGRyb3BwaW5nIHRoZSBvbGQgb25lOiBhIHZlcnNpb24sIHdvcmtmbG93LCBucG0sIG9yIGxpY2Vuc2VcbiAgLy8gY2hhbmdlIGxlYXZlcyBubyBzdGFsZSBjb3B5LCB3aGlsZSBhbnkgb3RoZXIgYmFkZ2UgaW4gdGhlIG1hbmFnZWQgcmVnaW9uIGlzIGtlcHQuXG4gIGNvbnN0IGJhZGdlcyA9IFsuLi5tYW5hZ2VkQmFkZ2VzLCAuLi5leGlzdGluZy5maWx0ZXIoKGJhZGdlKSA9PiAhaXNNYW5hZ2VkQmFkZ2UoYmFkZ2UpKV07XG4gIC8vIENvbnRlbnQgaXMgc2xpY2VkIGZyb20gaXRzIG5vZGUncyBzdGFydCBvZmZzZXQsIHNvIHdoYXRldmVyIGJsYW5rIHNwYWNlIGZvbGxvd2VkIHRoZSBmcm9udFxuICAvLyBtYXR0ZXIgaXMgZ29uZTsgZXhhY3RseSBvbmUgYmxhbmsgbGluZSBpcyByZXN0b3JlZCBoZXJlLiBBIGNsb3NpbmcgZGVsaW1pdGVyIHRoYXQgZW5kZWQgYXQgRU9GXG4gIC8vIGNhcnJpZXMgbm8gbmV3bGluZSBvZiBpdHMgb3duIGFuZCBuZWVkcyBib3RoLCBvciBgLS0tYCB3b3VsZCBmdXNlIHdpdGggdGhlIGZpcnN0IGJhZGdlIGFuZFxuICAvLyBkZXN0cm95IHRoZW0gYm90aC4gQSBCT00gbmVlZHMgbm8gc2VwYXJhdG9yOiBpdCBpcyBhIGJ5dGUgbWFya2VyLCBub3QgYSBsaW5lLlxuICBjb25zdCBzZXBhcmF0b3IgPSBmcm9udE1hdHRlciA/ICgvXFxyP1xcbiQvdS50ZXN0KGZyb250TWF0dGVyKSA/IGxpbmVFbmRpbmcgOiBgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKSA6ICcnO1xuICBjb25zdCByZXN1bHQgPVxuICAgIHByZWZpeCArIHNlcGFyYXRvciArIFtoZWFkLCBiYWRnZXMuam9pbihsaW5lRW5kaW5nKSwgYm9keV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCk7XG4gIHJldHVybiBlbmRzV2l0aE5ld2xpbmUgPyBgJHtyZXN1bHR9JHtsaW5lRW5kaW5nfWAgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBleHRlbmRlZCBiYWNrIG92ZXIgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBpdHMgb3duIGxpbmUuIENvbW1vbk1hcmtcbiAqIGFsbG93cyBvbmUgdG8gdGhyZWUgc3BhY2VzIG9mIGluZGVudGF0aW9uIGJlZm9yZSBhIGJsb2NrLCBhbmQgbWRhc3QgcmVwb3J0cyB0aGUgb2Zmc2V0IEFGVEVSXG4gKiB0aGVtIOKAlCBzbyBzbGljaW5nIGZyb20gaXQgc2lsZW50bHkgcmVpbmRlbnRzIGNvbnRlbnQgdGhpcyBnZW5lcmF0b3IgcHJvbWlzZXMgdG8gY29weSB2ZXJiYXRpbS5cbiAqL1xuZnVuY3Rpb24gc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQ6IHN0cmluZywgbm9kZTogUm9vdENvbnRlbnQpOiBudW1iZXIge1xuICBjb25zdCBzdGFydCA9IG5vZGUucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCE7XG4gIGNvbnN0IGxpbmVTdGFydCA9IGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIHN0YXJ0IC0gMSkgKyAxO1xuICByZXR1cm4gL15bIFxcdF0qJC91LnRlc3QoY29udGVudC5zbGljZShsaW5lU3RhcnQsIHN0YXJ0KSkgPyBsaW5lU3RhcnQgOiBzdGFydDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBub2RlIG9wZW5zIHRoZSBSRUFETUUgd2l0aCBhIHRpdGxlLiBPbmx5IHRoZSBGSVJTVCBwaWVjZSBvZiBjb250ZW50IGNhbiBiZSBvbmU6IGFcbiAqIHRpdGxlIGlzIHdoYXQgYSBSRUFETUUgb3BlbnMgd2l0aCwgYW5kIGFuY2hvcmluZyB0aGUgYmFkZ2VzIHRvIGEgaGVhZGluZyBmdXJ0aGVyIGRvd24gd291bGQgYnVyeVxuICogdGhlbSBiZWxvdyBjb250ZW50IHRoZSBhdXRob3IgcHV0IGZpcnN0LlxuICovXG5mdW5jdGlvbiBpc1RpdGxlTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ2hlYWRpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgLy8gTWFueSBSRUFETUVzIGNlbnRlciB0aGVpciB0aXRsZSBpbiBIVE1MIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLCB3aGljaCB0aGVcbiAgLy8gcGFyc2VyIHJlcG9ydHMgYXMgb25lIG9wYXF1ZSBIVE1MIGJsb2NrOyB0aGUgYmFkZ2VzIGdvIGFmdGVyIHRoZSB3aG9sZSBibG9jay5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2h0bWwnICYmIGNvbnRhaW5zUmVuZGVyZWRIMShub2RlLnZhbHVlKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBIVE1MIGJsb2NrIHVuYW1iaWd1b3VzbHkgUkVOREVSUyBhbiBgPGgxPmAg4oCUIHRoZSBjZW50ZXJlZC10aXRsZSBsYXlvdXQgbWFueSBSRUFETUVzXG4gKiB1c2UgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBhIGdlbmVyYWwgSFRNTCBwYXJzZXIuIERlY2lkaW5nIHRoaXMgZXhhY3RseSByZXF1aXJlcyB0aGUgcmVhbCB0b2tlbml6ZXInc1xuICogc3RhdGVzIOKAlCByYXcgdGV4dCwgUkNEQVRBLCBzY3JpcHQgZGF0YSwgYXR0cmlidXRlIHZhbHVlcywgdGVtcGxhdGUgY29udGVudHMsIGRlY2xhcmF0aW9ucyDigJQgYW5kXG4gKiBhcHByb3hpbWF0aW5nIHRoZW0gd2l0aCByZWdleGVzIGlzIHRoZSBzYW1lIGxvc2luZyBnYW1lIHRoZSBNYXJrZG93biBzY2FubmluZyB0aGlzIG1vZHVsZVxuICogcmVwbGFjZWQgd2FzIHBsYXlpbmcuIFNvIHRoZSBydWxlIGlzOiB0b2tlbml6ZSBvbmx5IHRoZSBzaW1wbGUgY2FzZSwgYW5kIHRyZWF0IGFueXRoaW5nIGNhcnJ5aW5nXG4gKiBhIGNvbnN0cnVjdCB3aG9zZSBwYXJzaW5nIGRlcGVuZHMgb24gdGhvc2Ugc3RhdGVzIGFzIE5PVCBhIHRpdGxlLiBCZWluZyB3cm9uZyB0aGF0IHdheSBwdXRzIHRoZVxuICogYmFkZ2VzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIHdoaWNoIGlzIG1lcmVseSB1bmhlbHBmdWw7IGJlaW5nIHdyb25nIHRoZSBvdGhlciB3YXkgcmV3cml0ZXMgdGhlXG4gKiB1c2VyJ3MgUkVBRE1FIGFyb3VuZCB0aGUgd3JvbmcgYW5jaG9yLlxuICovXG5mdW5jdGlvbiBjb250YWluc1JlbmRlcmVkSDEoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbW1lbnRzIGNhbm5vdCBuZXN0IGFuZCBlbmQgdW5hbWJpZ3VvdXNseSwgc28gdGhleSBhcmUgc2ltcGx5IHJlbW92ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZy5cbiAgY29uc3Qgd2l0aG91dENvbW1lbnRzID0gaHRtbC5yZXBsYWNlQWxsKC88IS0tW1xcc1xcU10qPyg/Oi0tPnwkKS9ndSwgJycpO1xuICAvLyBDREFUQSwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGRlY2xhcmF0aW9ucywgZWxlbWVudHMgd2hvc2UgY29udGVudCBpcyByYXcgdGV4dCAvIFJDREFUQSAvXG4gIC8vIHNjcmlwdCBkYXRhLCBhbmQgYDx0ZW1wbGF0ZT5gICh3aG9zZSBjb250ZW50cyBhcmUgaW5lcnQpLiBBIHF1b3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyBgPGBcbiAgLy8gbWFrZXMgZXZlbiBsb2NhdGluZyB0aGVzZSB1bnJlbGlhYmxlLCBzbyBpdCBkaXNxdWFsaWZpZXMgdGhlIGJsb2NrIHRvby5cbiAgY29uc3QgYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybiA9XG4gICAgLzwhXFxbQ0RBVEFcXFt8PFxcP3w8IVthLXpBLVpdfDxcXC8/KD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlfGlmcmFtZXxub2ZyYW1lc3xub2VtYmVkfHhtcHx0ZW1wbGF0ZSlcXGJ8XCJbXlwiXSo8W15cIl0qXCJ8J1teJ10qPFteJ10qJy9pdTtcbiAgaWYgKGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4udGVzdCh3aXRob3V0Q29tbWVudHMpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFF1b3RpbmcgaXMgc2lnbmlmaWNhbnQgb25seSBpbnNpZGUgYSBzdGFydCB0YWcsIHNvIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyBjb25zdW1lZCB3aXRoIGl0cyBvd25cbiAgLy8gdGFnIHdoaWxlIHF1b3RhdGlvbiBtYXJrcyBpbiBvcmRpbmFyeSB0ZXh0IHN0YXkgdGV4dDogYDxkaXYgdGl0bGU9XCImbHQ7aDEmZ3Q7XCI+YCBkb2VzIG5vdCBjb3VudCxcbiAgLy8gYFwiPGgxPlByb2plY3Q8L2gxPlwiYCBkb2VzLlxuICBjb25zdCBzdGFydFRhZ1BhdHRlcm4gPSAvPChbYS16QS1aXVteXFxzLz5dKikoPzpcIlteXCJdKlwifCdbXiddKid8W14+XCInXSkqPi9ndTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB3aXRob3V0Q29tbWVudHMubWF0Y2hBbGwoc3RhcnRUYWdQYXR0ZXJuKSkge1xuICAgIGlmIChtYXRjaFsxXT8udG9Mb3dlckNhc2UoKSA9PT0gJ2gxJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogV2hldGhlciB0aGUgbm9kZSBpcyBhIHBhcmFncmFwaCBvZiBiYWRnZXMgYW5kIG5vdGhpbmcgZWxzZSDigJQgdGhlIG9ubHkgY29udGVudCB3YmZ5IHB1dHMgaW4gdGhlIGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNCYWRnZUJsb2NrTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IG5vZGUgaXMgUGFyYWdyYXBoIHtcbiAgcmV0dXJuIChcbiAgICAhIW5vZGUgJiZcbiAgICBub2RlLnR5cGUgPT09ICdwYXJhZ3JhcGgnICYmXG4gICAgbm9kZS5jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKSAmJlxuICAgIG5vZGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgICAoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSB8fCBjaGlsZC50eXBlID09PSAnYnJlYWsnIHx8IChjaGlsZC50eXBlID09PSAndGV4dCcgJiYgIWNoaWxkLnZhbHVlLnRyaW0oKSlcbiAgICApXG4gICk7XG59XG5cbi8qKiBBIGJhZGdlIGlzIG9uZSBgWyFbYWx0XShpbWFnZSldKGxpbmspYCwgdGhlIG9ubHkgc2hhcGUgd2JmeSBldmVyIHdyaXRlcy4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgUGhyYXNpbmdDb250ZW50KTogbm9kZSBpcyBMaW5rICYgeyBjaGlsZHJlbjogW0ltYWdlXSB9IHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2xpbmsnICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuY2hpbGRyZW5bMF0/LnR5cGUgPT09ICdpbWFnZSc7XG59XG5cbi8qKlxuICogVGhlIGJhZGdlcyBpbiB0aGUgYmxvY2ssIGFzIHRoZSBleGFjdCBzb3VyY2UgdGV4dCB0aGF0IHByb2R1Y2VkIHRoZW06IGEgYmFkZ2Ugd2JmeSBkb2VzIG5vdCBtYW5hZ2VcbiAqIGlzIHdyaXR0ZW4gYmFjayBieXRlIGZvciBieXRlIGluc3RlYWQgb2YgYmVpbmcgcmUtc2VyaWFsaXplZCBmcm9tIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiByZWFkQmFkZ2VzKG5vZGU6IFBhcmFncmFwaCwgY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpXG4gICAgLm1hcCgoY2hpbGQpID0+IGNvbnRlbnQuc2xpY2UoY2hpbGQucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCwgY2hpbGQucG9zaXRpb24hLmVuZC5vZmZzZXQpKTtcbn1cblxuLyoqXG4gKiBQZXJjZW50LWVuY29kZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBlbmQgYSBNYXJrZG93biBkZXN0aW5hdGlvbiBlYXJseS4gQSB3b3JrZmxvdyBmaWxlIG1heSBiZVxuICogbmFtZWQgYW55dGhpbmcgd2l0aCBhIGAueW1sYCBleHRlbnNpb24sIGFuZCBvbmUgY29udGFpbmluZyBgKGAgb3IgYClgIHByb2R1Y2VkIGEgYmFkZ2UgdGhhdCB3YmZ5J3NcbiAqIG93biBiYWRnZSBwYXR0ZXJuIGNvdWxkIG5vdCByZWFkIGJhY2sg4oCUIHNvIHRoZSBsaW5lIGxlZnQgdGhlIGJsb2NrIGFuZCB0aGUgYmFkZ2Ugd2FzIGR1cGxpY2F0ZWQuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVybFBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bKClcXHNdL2d1LCAoY2hhcmFjdGVyKSA9PiBgJSR7Y2hhcmFjdGVyLmNvZGVQb2ludEF0KDApIS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIG9uZSB3YmZ5IHdyaXRlcyBpdHNlbGYsIGFuZCBzbyBtYXkgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgYmxvY2suICovXG5mdW5jdGlvbiBpc01hbmFnZWRCYWRnZShiYWRnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBiYWRnZSA9PT0gc2VtYW50aWNSZWxlYXNlQmFkZ2UgfHwgbWFuYWdlZEJhZGdlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGJhZGdlKSk7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVFbmRpbmcoY29udGVudDogc3RyaW5nKTogJ1xcbicgfCAnXFxyXFxuJyB7XG4gIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXHJcXG4nKSA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuXG5jb25zdCBzaGFyZWRQcmVzZXQgPSAnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbmMnO1xuY29uc3QgZ2VuZXJhdGVkU2V0dGluZ3MgPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogW3NoYXJlZFByZXNldF0sXG59O1xuXG50eXBlIFNldHRpbmdzID0gUGFydGlhbDx0eXBlb2YgZ2VuZXJhdGVkU2V0dGluZ3M+ICYge1xuICBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdO1xufTtcblxuY29uc3QgbWFuYWdlZEZpbGVOYW1lID0gJ3Jlbm92YXRlLmpzb25jJztcblxuLy8gd2JmeSBzdXBwb3J0cyBvbmUgY2Fub25pY2FsIFJlbm92YXRlIGxvY2F0aW9uLiBOb24tY2Fub25pY2FsIGNvbmZpZ3MgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbi8vIHJlcG9zaXRvcnkgaW5zdGVhZCBvZiBiZWluZyBwYXJzZWQsIG1lcmdlZCwgb3IgZGVsZXRlZCBoZXJlLlxuY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMgPSBbXG4gICdyZW5vdmF0ZS5qc29uJyxcbiAgJ3Jlbm92YXRlLmpzb241JyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbicsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb25jJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbjUnLFxuICAnLnJlbm92YXRlcmMnLFxuICAnLnJlbm92YXRlcmMuanNvbicsXG4gICcucmVub3ZhdGVyYy5qc29uNScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgbWFuYWdlZEZpbGVOYW1lKTtcbiAgICBjb25zdCBtYW5hZ2VkRmlsZVN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAobWFuYWdlZEZpbGVTdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGNhbmRpZGF0ZSkuY2F0Y2goKCkgPT4ge30pKSA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdQYXRoID0gbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAobm9uQ2Fub25pY2FsQ29uZmlnUGF0aCB8fCBjb25maWcucGFja2FnZUpzb24/LnJlbm92YXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgcmVwb3NpdG9yeSBoYXMgYSBub24tY2Fub25pY2FsIFJlbm92YXRlIGNvbmZpZyR7XG4gICAgICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA/IGAgYXQgJHtub25DYW5vbmljYWxDb25maWdQYXRofWAgOiAnIGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgfS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8U2V0dGluZ3M+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRTZXR0aW5ncz8uZXh0ZW5kcyAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4dGVuZHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiZXh0ZW5kc1wiIGlzIG5vdCBhbiBhcnJheS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZFByZXNldCA9IG9sZFNldHRpbmdzPy5leHRlbmRzPy5maW5kKFxuICAgICAgKHByZXNldCkgPT4gcHJlc2V0LnN0YXJ0c1dpdGgoJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOicpICYmIHByZXNldCAhPT0gc2hhcmVkUHJlc2V0XG4gICAgKTtcbiAgICBpZiAocmVtb3ZlZFByZXNldCkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcIiR7cmVtb3ZlZFByZXNldH1cIiBubyBsb25nZXIgZXhpc3RzOyByZW1vdmUgaXQgbWFudWFsbHkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSBidWlsZFNldHRpbmdzKGNvbmZpZywgb2xkU2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICAgIG9sZENvbnRlbnQsXG4gICAgICBuZXdTZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBub3JtYWxpemUoY29udGVudCkgPT09IG5vcm1hbGl6ZShvbGRDb250ZW50KSkgcmV0dXJuO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IFNldHRpbmdzIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBvbGRTZXR0aW5nc1xuICAgID8gKG1lcmdlLmFsbChbZ2VuZXJhdGVkU2V0dGluZ3MsIG9sZFNldHRpbmdzLCBnZW5lcmF0ZWRTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncylcbiAgICA6IHN0cnVjdHVyZWRDbG9uZShnZW5lcmF0ZWRTZXR0aW5ncyk7XG4gIGNvbnN0IGV4aXN0aW5nRXh0ZW5kcyA9IG9sZFNldHRpbmdzPy5leHRlbmRzID8/IFtdO1xuICBzZXR0aW5ncy5leHRlbmRzID0gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzXG4gICAgPyBleGlzdGluZ0V4dGVuZHMuZmlsdGVyKChwcmVzZXQpID0+IHByZXNldCAhPT0gc2hhcmVkUHJlc2V0KVxuICAgIDogZXhpc3RpbmdFeHRlbmRzLmluY2x1ZGVzKHNoYXJlZFByZXNldClcbiAgICAgID8gZXhpc3RpbmdFeHRlbmRzXG4gICAgICA6IFtzaGFyZWRQcmVzZXQsIC4uLmV4aXN0aW5nRXh0ZW5kc107XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gIHJldHVybiB0cmltbWVkQ29udGVudCA/IHRyaW1tZWRDb250ZW50ICsgJ1xcbicgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgLy8gYGFwcC8qKmAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBldmVuIHRob3VnaCB0aGUgZG9lc0NvbnRhaW4qU2NyaXB0IHNpZ25hbHMgc2NhbiBpdDogYXBwXG4gIC8vIGRpcmVjdG9yaWVzIGJlbG9uZyB0byBmcmFtZXdvcmsgcGFja2FnZXMgKE5leHQuanMvQmxpdHopLCB3aGljaCBvd24gdGhlaXIgdHNjb25maWdcbiAgLy8gKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSksIGFuZCBjaGVja2luZyBmcmFtZXdvcmsgc291cmNlcyB1bmRlciB0aGlzIHByb2plY3QncyBjb21waWxlclxuICAvLyBvcHRpb25zIHdvdWxkIHByb2R1Y2UgZmFsc2UgZXJyb3JzLlxuICAvLyBgKi5jb25maWcubXRzYCBjb3ZlcnMgVml0ZS1sb2FkZWQgY29uZmlncyAoZS5nLiB2aXRlc3QuY29uZmlnLm10cykgb2YgQ29tbW9uSlMgcGFja2FnZXMgKG5vXG4gIC8vIGBcInR5cGVcIjogXCJtb2R1bGVcImAsIGUuZy4gdHJlZS1zaXR0ZXIgZ3JhbW1hcnMpLCB3aGljaCB1c2UgdGhhdCBleHRlbnNpb24gc28gTm9kZSBhbmQgVml0ZSBsb2FkXG4gIC8vIHRoZW0gYXMgRVMgbW9kdWxlcy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy5tdHMnLCAnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmsgYW5kIG93bnMgaXRzIHRzY29uZmlnIGp1c3QgbGlrZSBOZXh0L0JsaXR6LFxuICAgIC8vIHNvIGl0IG11c3Qgc2tpcCB0aGUgc3RhbmRhcmQgZ2VuZXJhdGlvbiB0aGF0IHdvdWxkIG92ZXJ3cml0ZSB0aGUgZnJhbWV3b3JrJ3Mgb3duIHNldHRpbmdzLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgYXdhaXQgbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSAoY29uZmlnLmlzUm9vdCA/IGJ1aWxkUm9vdEpzb25PYmooY29uZmlnKSA6IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSkgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cbiAgICBpZiAoaGFzUmFpbHdheUlhYyhjb25maWcpKSBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJy5yYWlsd2F5LyoqLyonKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvLyBBIGZpbGUgd2l0aCBubyBjb25maWd1cmF0aW9uIChlbXB0eSBvciBjb21tZW50LW9ubHkpIGlzIHRyZWF0ZWQgbGlrZSBhIG1pc3Npbmcgb25lLCBhcyB0c2MgZG9lcy5cbiAgICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHRzY29uZmlnLmpzb24gd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGVcbiAgICAgIC8vIGdlbmVyYXRlZCBzZXR0aW5ncyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcHJvamVjdCdzIGNvbmZpZ3VyYXRpb24uXG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykpKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgICAgIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoY29uZmlnLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH1cbiAgICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKG5ld1NldHRpbmdzLCBjb25maWcpO1xuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIC8vIFBhY2thZ2UgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UgZXhwb3J0cyBpbnN0ZWFkIG9mIGJhc2VVcmwuXG4gICAgLy8gcGF0aHMgaXMgaW50ZW50aW9uYWxseSBwcmVzZXJ2ZWQgc28gcmVwby1sb2NhbCB0b29saW5nIGNhbiBrZWVwIGV4cGxpY2l0XG4gICAgLy8gYWxpYXNlcyB3aXRob3V0IHJlbHlpbmcgb24gYmFzZVVybCdzIGJyb2FkIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LXVwLXRvLWRhdGUgdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbW9ub3JlcG8tcm9vdCB0c2NvbmZpZywgd2hvc2UgaW5jbHVkZS9leGNsdWRlIGNvdmVyIGV2ZXJ5IERFQ0xBUkVEIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy5cbiAqIGBhcHBzLypgIGFsb25nc2lkZSBgcGFja2FnZXMvKmApIHNvIHR5cGUtYXdhcmUgbGludGluZyBydW4gZnJvbSB0aGUgcm9vdCBzZWVzIGFsbCB3b3Jrc3BhY2VcbiAqIHNvdXJjZXMsIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUm9vdEpzb25PYmooY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogVHNDb25maWdKc29uIHtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKGNvbmZpZylcbiAgICA6IHsgZXhjbHVkZXM6IFtdLCBpbmNsdWRlczogW10gfTtcbiAgY29uc3Qgc2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICBzZXR0aW5ncy5leGNsdWRlID0gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMubWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0L2ZpeHR1cmVzYCksXG4gICAgICAvLyBOZWdhdGl2ZSB3b3Jrc3BhY2UgcGF0dGVybnMgKGUuZy4gYCFwYWNrYWdlcy9leGNsdWRlZGApIG9wdCB3b3Jrc3BhY2Ugc3VidHJlZXMgb3V0IG9mIHRoZVxuICAgICAgLy8gbW9ub3JlcG8sIHNvIHRoZWlyIHNvdXJjZXMgbXVzdCBub3QgZW50ZXIgdGhlIHJvb3QgdHlwZS1jaGVjayBwcm9qZWN0IGVpdGhlci4gQSBuZWdhdGlvblxuICAgICAgLy8gd2hvc2UgZGlyZWN0b3J5IGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIHlpZWxkcyBwYWNrYWdlLW93bmVkIHN1YnBhdGggZW50cmllc1xuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgd2hvbGUgc3VidHJlZSAoc2VlIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKS5cbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmV4Y2x1ZGVzLFxuICAgICAgLy8gVGhlIG1hbmFnZWQgaW5jbHVkZXMgYWJvdmUgZGVsaWJlcmF0ZWx5IG9taXQgZnJhbWV3b3JrIGBhcHAvKipgIGRpcmVjdG9yaWVzIChzZWVcbiAgICAgIC8vIHN1Ykpzb25PYmouaW5jbHVkZSdzIGNvbW1lbnQpLCBidXQgYSByZXBvLWF1dGhvcmVkIGJyb2FkIGluY2x1ZGUgc3VjaCBhcyBgZTJlLyoqXFwvKmBcbiAgICAgIC8vIGNhbiBzdGlsbCBkcmFnIGEgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBzb3VyY2VzIGludG8gdGhlIHJvb3QgcHJvamVjdCwgd2hlcmUgdGhleVxuICAgICAgLy8gZmFpbCB1bmRlciB0aGUgcm9vdCBjb21waWxlciBvcHRpb25zIOKAlCB0aGVpciBiYXJlIGBuZXh0LypgIGltcG9ydHMgcmVzb2x2ZSBvbmx5IHRocm91Z2hcbiAgICAgIC8vIHRoZSBmcmFtZXdvcmsgd29ya3NwYWNlJ3Mgb3duIHRzY29uZmlnIGBwYXRoc2AuIEV4Y2x1ZGUgdGhvc2UgYXBwIGRpcmVjdG9yaWVzIHNvIHRoZVxuICAgICAgLy8gcm9vdCBwcm9qZWN0IG5ldmVyIHR5cGUtY2hlY2tzIHRoZW0sIG5vIG1hdHRlciBob3cgYnJvYWQgdGhlIHJlcG8ncyBpbmNsdWRlIGdsb2JzIGFyZS5cbiAgICAgIC4uLmdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZyksXG4gICAgICAuLi4oc2V0dGluZ3MuZXhjbHVkZSA/PyBbXSksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbiAgc2V0dGluZ3MuaW5jbHVkZSA9IFtcbiAgICAuLi4oc2V0dGluZ3MuaW5jbHVkZSA/PyBbXSksXG4gICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMuZmxhdE1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gW1xuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vKi5jb25maWcudHNgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc2NyaXB0cy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NyYy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvKiovKmAsXG4gICAgXSksXG4gIF07XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuLy8gRnJhbWV3b3JrIHBhY2thZ2VzIG93biB0aGVpciB0c2NvbmZpZyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSBhbmQgc2hpbSBiYXJlIGltcG9ydHMgc3VjaCBhc1xuLy8gYG5leHQvbmF2aWdhdGlvbmAgdGhyb3VnaCBwYWNrYWdlLWxvY2FsIGBwYXRoc2A7IHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29ya1xuLy8gYW5kIGJlaGF2ZXMgdGhlIHNhbWUuIFRoZWlyIGFwcCBzb3VyY2VzIHRoZXJlZm9yZSBvbmx5IHR5cGUtY2hlY2sgdW5kZXIgdGhlaXIgb3duIGNvbmZpZy5cbmNvbnN0IGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcyA9IFsnYmxpdHonLCAnbmV4dCcsICd2aW5leHQnXTtcblxuLy8gQSBmcmFtZXdvcmsgYXBwIGxpdmVzIGluIGBhcHAvYCBvciwgdW5kZXIgdGhlIHNyYy1kaXJlY3RvcnkgbGF5b3V0LCBgc3JjL2FwcC9gLiBUaGUgcm9vdCBwcm9qZWN0XG4vLyBpbmNsdWRlcyBgPHdvcmtzcGFjZT4vc3JjLyoqLypgLCBzbyBgc3JjL2FwcGAgbGVha3MgaW4ganVzdCBhcyBhIHJlcG8td2lkZSBnbG9iIGNhbiBwdWxsIGluIGBhcHBgLlxuY29uc3QgZnJhbWV3b3JrQXBwRGlyTmFtZXMgPSBbJ2FwcCcsICdzcmMvYXBwJ107XG5cbi8qKiBSb290IGBleGNsdWRlYCBlbnRyaWVzIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIHJvb3QpIGZvciBldmVyeSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIGdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHJldHVybiBbXTtcbiAgY29uc3QgZXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlRGlyUGF0aCBvZiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpKSB7XG4gICAgaWYgKCFkZXBlbmRzT25GcmFtZXdvcmsocGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYXBwRGlyTmFtZSBvZiBmcmFtZXdvcmtBcHBEaXJOYW1lcykge1xuICAgICAgY29uc3QgYXBwRGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCBhcHBEaXJOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFwcERpclBhdGgpKSBleGNsdWRlcy5wdXNoKHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGFwcERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4Y2x1ZGVzO1xufVxuXG5mdW5jdGlvbiBkZXBlbmRzT25GcmFtZXdvcmsobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IG1hbmlmZXN0OiBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIHRyeSB7XG4gICAgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEEgbWFuaWZlc3QgdGhhdCBwYXJzZXMgdG8gYSBub24tb2JqZWN0IChlLmcuIGEgZmlsZSBsaXRlcmFsbHkgY29udGFpbmluZyBgbnVsbGApIGRlY2xhcmVzIG5vXG4gIC8vIGRlcGVuZGVuY2llczsgZ3VhcmQgdGhlIHByb3BlcnR5IGFjY2Vzcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IG91dHNpZGUgdGhlIHRyeSBhYm92ZS5cbiAgaWYgKCFtYW5pZmVzdCB8fCB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHsgLi4ubWFuaWZlc3QuZGVwZW5kZW5jaWVzLCAuLi5tYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMgfTtcbiAgcmV0dXJuIGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcy5zb21lKChkZXBlbmRlbmN5TmFtZSkgPT4gZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3lOYW1lXSk7XG59XG5cbmNvbnN0IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMgPSBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXTtcblxuLyoqXG4gKiBSb290IGluY2x1ZGUvZXhjbHVkZSBlbnRyaWVzIHdiZnkgZ2VuZXJhdGVkIGZvciBhbiBlYXJsaWVyIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy4gYHBhY2thZ2VzLypgXG4gKiBnbG9icyBpbiBhIHJlcG8gdGhhdCBub3cgZGVjbGFyZXMgb25seSBgYXBwcy8qYCkgbXVzdCBub3Qgc3Vydml2ZSB0aGUgbWVyZ2Ugd2l0aCB0aGUgZXhpc3RpbmdcbiAqIHRzY29uZmlnLCBvciB0aGUgb2Jzb2xldGUgZGlyZWN0b3JpZXMgd291bGQga2VlcCBlbnRlcmluZyByb290IHR5cGUgY2hlY2tpbmcgZm9yZXZlci4gQSBwcmVmaXhcbiAqIGNvdW50cyBhcyB3YmZ5LW1hbmFnZWQgb25seSB3aGVuIHRoZSBDT01QTEVURSBnZW5lcmF0ZWQgaW5jbHVkZSBzZXQgZm9yIGl0IGlzIHByZXNlbnQgYW5kIG5vXG4gKiBsb25nZXIgZ2VuZXJhdGVkIOKAlCBhIHVzZXItYXV0aG9yZWQgZW50cnkgc3VjaCBhcyBhIGxvbmUgYHRvb2xzLypcXC9zcmMvKipcXC8qYCBuZXZlciBxdWFsaWZpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgb2xkU2V0dGluZ3M6IFRzQ29uZmlnSnNvbixcbiAgbmV3U2V0dGluZ3M6IFRzQ29uZmlnSnNvblxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YWxlUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuaW5jbHVkZSkpIHtcbiAgICBjb25zdCBvbGRJbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpO1xuICAgIGNvbnN0IGdlbmVyYXRlZEluY2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmluY2x1ZGUpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygb2xkSW5jbHVkZSkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSk7XG4gICAgICBpZiAod29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5ldmVyeSgoc3VmZml4KSA9PlxuICAgICAgICBvbGRJbmNsdWRlLmluY2x1ZGVzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBjb25zdCBpc1N0aWxsR2VuZXJhdGVkID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5zb21lKChzdWZmaXgpID0+XG4gICAgICAgIGdlbmVyYXRlZEluY2x1ZGUuaGFzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wbGV0ZSAmJiAhaXNTdGlsbEdlbmVyYXRlZCkgc3RhbGVQcmVmaXhlcy5hZGQod29ya3NwYWNlUHJlZml4KTtcbiAgICB9XG4gICAgaWYgKHN0YWxlUHJlZml4ZXMuc2l6ZSA+IDApIHtcbiAgICAgIG9sZFNldHRpbmdzLmluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgIXN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4Y2x1ZGUpKSByZXR1cm47XG4gIGNvbnN0IGdlbmVyYXRlZEV4Y2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmV4Y2x1ZGUpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKS5tYXAoKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIHBhdGgucmVsYXRpdmUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSwgd29ya3NwYWNlRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJylcbiAgICAgIClcbiAgICA6IFtdO1xuICBvbGRTZXR0aW5ncy5leGNsdWRlID0gb2xkU2V0dGluZ3MuZXhjbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycgfHwgZ2VuZXJhdGVkRXhjbHVkZS5oYXMoZW50cnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZW50cnkuZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykpIHtcbiAgICAgIHJldHVybiAhc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLScvdGVzdC9maXh0dXJlcycubGVuZ3RoKSk7XG4gICAgfVxuICAgIC8vIEEgZnJhbWV3b3JrIGFwcCBleGNsdWRlIChgPHdvcmtzcGFjZT4vYXBwYCwgYDx3b3Jrc3BhY2U+L3NyYy9hcHBgKSBmb3IgYSBzdGlsbC1kZWNsYXJlZFxuICAgIC8vIHdvcmtzcGFjZSBpcyBwcnVuZWQgYnkgY292ZXJzV29ya3NwYWNlRGlyIGJlbG93IHdoZW4gbm8gbG9uZ2VyIGdlbmVyYXRlZDsgdGhpcyBjYXRjaGVzIHRoZVxuICAgIC8vIHJlbWFpbmluZyBjYXNlLCB3aGVyZSB0aGUgd29ya3NwYWNlIGl0c2VsZiB3YXMgcmVtb3ZlZCBhbmQgaXRzIHByZWZpeCBpcyB0aGVyZWZvcmUgc3RhbGUuXG4gICAgLy8gKEEgd3Jvbmcgc3VmZml4IHN0cmlwIHlpZWxkcyBhIHByZWZpeCBhYnNlbnQgZnJvbSBzdGFsZVByZWZpeGVzLCBzbyB0ZXN0aW5nIGV2ZXJ5IG5hbWUgaXMgc2FmZS4pXG4gICAgaWYgKFxuICAgICAgZnJhbWV3b3JrQXBwRGlyTmFtZXMuc29tZShcbiAgICAgICAgKGFwcERpck5hbWUpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHthcHBEaXJOYW1lfWApICYmIHN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0oYXBwRGlyTmFtZS5sZW5ndGggKyAxKSkpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5LCB3b3Jrc3BhY2VEaXJQYXRocyk7XG4gIH0pO1xufVxuXG4vLyBXaGV0aGVyIGFuIGV4Y2x1ZGUgZW50cnkgaXMgYSB3b3Jrc3BhY2UgbmVnYXRpb24gKGAhYXBwcy9leGNsdWRlZGApIHdob3NlIG5lZ2F0aW9uIGlzIGdvbmU6IHRoZVxuLy8gZGlyZWN0b3J5IGlzIGEgd29ya3NwYWNlIGFnYWluIGFuZCBtdXN0IHJlLWVudGVyIHRoZSByb290IHByb2plY3QuIHdiZnkgd3JpdGVzIHN1Y2ggYSBuZWdhdGlvbiBhc1xuLy8gYSBkaXJlY3RvcnkgcGF0aCwgYXMgYSBkaXJlY3RvcnkgUEFUVEVSTiB3aGVuIGl0IGV4Y2x1ZGVzIGV4YWN0bHkgd2hhdCBpdCBtYXRjaGVzIChgYXBwcy8qYmApLCBvclxuLy8gYXMgYW4gYW5jZXN0b3IncyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIChgYXBwcy94L3NyY2ApIOKAlCBzbyB0aGUgZW50cnkgbWF5IGNvdmVyIGEgZGlzY292ZXJlZFxuLy8gd29ya3NwYWNlIGRpcmVjdG9yeSBvciBzaXQgdW5kZXIgb25lLiBBIGdsb2JzdGFyIHNlZ21lbnQgbWFya3MgYSBoeWdpZW5lIGdsb2IgKG5vZGVfbW9kdWxlcywgZTJlXG4vLyBhbmQgZnJpZW5kcyksIHdoaWNoIGlzIG5ldmVyIG5lZ2F0aW9uLWRlcml2ZWQgYW5kIG11c3Qgc3Vydml2ZS5cbmZ1bmN0aW9uIGNvdmVyc1dvcmtzcGFjZURpcihlbnRyeTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKGVudHJ5LnNwbGl0KCcvJykuaW5jbHVkZXMoJyoqJykpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBlbnRyeVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT5cbiAgICAgIHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgJ1teL10qJylcbiAgICAgICAgLnJlcGxhY2VBbGwoJz8nLCAnW14vXScpXG4gICAgKVxuICAgIC5qb2luKCcvJyk7XG4gIGNvbnN0IGVudHJ5UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSg/Oi8uKik/JGAsICd1Jyk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJQYXRocy5zb21lKFxuICAgICh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBlbnRyeVBhdHRlcm4udGVzdCh3b3Jrc3BhY2VEaXJQYXRoKSB8fCBlbnRyeS5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoZWRTdWZmaXggPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmZpbmQoKHN1ZmZpeCkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke3N1ZmZpeH1gKSk7XG4gIGlmICghbWF0Y2hlZFN1ZmZpeCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZW50cnkuc2xpY2UoMCwgLShtYXRjaGVkU3VmZml4Lmxlbmd0aCArIDEpKTtcbiAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gJycgPyB1bmRlZmluZWQgOiB3b3Jrc3BhY2VQcmVmaXg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBpZiAoZXhpc3RpbmdDb250ZW50ID09PSB1bmRlZmluZWQgfHwganNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSByZXR1cm47XG4gIGNvbnN0IHNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gIGlmICghc2V0dGluZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgY2xlYW5pbmcgdXAgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gIGFkZEluY2x1ZGVzRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5ncywgY29uZmlnKTtcbiAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5ncywgY29uZmlnKTtcbiAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAvLyBhbHJlYWR5LWNsZWFuIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZSgoKSA9PlxuICAgIGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKVxuICApO1xufVxuXG4vKipcbiAqIGJ1bi10eXBlcyByZWZlcmVuY2VzIHVuZGljaS10eXBlcyB3aXRob3V0IGRlY2xhcmluZyBpdCBhcyBhIGRlcGVuZGVuY3kgKG92ZW4tc2gvYnVuIzIyODA1KSwgc29cbiAqIEJ1bidzIGlzb2xhdGVkIGxpbmtlciAoZXNwZWNpYWxseSB3aXRoIHRoZSBnbG9iYWwgc3RvcmUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSkgY2Fubm90IHJlc29sdmVcbiAqIGl0IGZyb20gYnVuLXR5cGVzJyBsb2NhdGlvbiwgd2hpY2ggc2lsZW50bHkgZGVncmFkZXMgZ2xvYmFsIGZldGNoIHR5cGVzIHN1Y2ggYXMgUmVzcG9uc2UuIE1hcCBpdFxuICogdG8gdGhlIGNvcHkgdGhhdCBidW5maWcudG9tbCdzIHB1YmxpY0hvaXN0UGF0dGVybiBwbGFjZXMgaW4gdGhlIHJvb3Qgbm9kZV9tb2R1bGVzLlxuICovXG5mdW5jdGlvbiBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICAvLyBNYXAgdW5kaWNpLXR5cGVzIG9ubHkgd2hlbiBidW4tdHlwZXMgYWN0dWFsbHkgbG9hZHM6IGFuIGV4cGxpY2l0IGB0eXBlc2AgbGlzdCBsb2FkcyBpdCBpZmYgaXRcbiAgLy8gY29udGFpbnMgXCJidW5cIiAoZXZlbiBvbiBSZWFjdCBOYXRpdmUsIHdob3NlIHByb2plY3RzIG1heSBvcHQgaW4gYnkgaGFuZCk7IHdpdGggYHR5cGVzYFxuICAvLyBvbWl0dGVkLCBUeXBlU2NyaXB0J3MgYXV0b21hdGljIEB0eXBlcyBpbmNsdXNpb24gbG9hZHMgaXQgYmVjYXVzZSB3YmZ5IGluc3RhbGxzIEB0eXBlcy9idW5cbiAgLy8gZm9yIGV2ZXJ5IEphdmFTY3JpcHQgb3IgVHlwZVNjcmlwdCBwcm9qZWN0IGV4Y2VwdCBSZWFjdCBOYXRpdmUsIHdoaWNoIHVzZXNcbiAgLy8gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSBpbnN0ZWFkLlxuICBjb25zdCB0eXBlcyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXM7XG4gIGlmICh0eXBlcyA/ICF0eXBlcy5pbmNsdWRlcygnYnVuJykgOiBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSByZXR1cm47XG4gIGNvbnN0IGNvcnJlY3RNYXBwaW5nID0gYCR7Z2V0Um9vdERpcihjb25maWcpfS9ub2RlX21vZHVsZXMvdW5kaWNpLXR5cGVzL2luZGV4LmQudHNgO1xuICBjb25zdCBleGlzdGluZ01hcHBpbmcgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnBhdGhzPy5bJ3VuZGljaS10eXBlcyddO1xuICBpZiAoZXhpc3RpbmdNYXBwaW5nKSB7XG4gICAgLy8gUmV3cml0ZSB0aGUgZ2VuZXJhdGVkIG1hcHBpbmcgd2hlbiBhIHdvcmtzcGFjZSBtb3ZlcyB0byBhIGRpZmZlcmVudCByb290IGRlcHRoLiBBbnkgb3RoZXJcbiAgICAvLyB2YWx1ZSBpcyBhIGRlbGliZXJhdGUgcmVwby1sb2NhbCBtYXBwaW5nIChlLmcuIHBhdGNoZWQgdHlwZXMpIGFuZCBtdXN0IGJlIGtlcHQuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmdNYXBwaW5nLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdHlwZW9mIGV4aXN0aW5nTWFwcGluZ1swXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIC8oPzpefFxcLylub2RlX21vZHVsZXNcXC91bmRpY2ktdHlwZXNcXC9pbmRleFxcLmRcXC50cyQvdS50ZXN0KGV4aXN0aW5nTWFwcGluZ1swXSlcbiAgICApIHtcbiAgICAgIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyEucGF0aHMhWyd1bmRpY2ktdHlwZXMnXSA9IFtjb3JyZWN0TWFwcGluZ107XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyA9IHtcbiAgICAuLi5zZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMsXG4gICAgJ3VuZGljaS10eXBlcyc6IFtjb3JyZWN0TWFwcGluZ10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVzRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGNvbnN0IGluY2x1ZGVDb3VudCA9IHNldHRpbmdzLmluY2x1ZGUubGVuZ3RoO1xuICBhZGRJbmNsdWRlUGF0aChzZXR0aW5ncywgJ3NjcmlwdHMvKiovKicpO1xuICAvLyBJbmNsdWRlIHdpbGRjYXJkcyBza2lwIGRvdCBkaXJlY3Rvcmllcywgc28gZnJhbWV3b3JrIGdsb2JzIHN1Y2ggYXMgYCoqLyoudHNgIG5ldmVyIHJlYWNoIGAucmFpbHdheS9gLlxuICBpZiAoaGFzUmFpbHdheUlhYyhjb25maWcpKSBhZGRJbmNsdWRlUGF0aChzZXR0aW5ncywgJy5yYWlsd2F5LyoqLyonKTtcbiAgLy8gU29ydGluZyBhbiB1bmNoYW5nZWQgaW5jbHVkZSB3b3VsZCByZXdyaXRlIGFuIGFscmVhZHktY2xlYW4gdHNjb25maWcgYW5kIGRyb3AgaXRzIGNvbW1lbnRzLlxuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5sZW5ndGggPiBpbmNsdWRlQ291bnQpIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBoYXNSYWlsd2F5SWFjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmFpbHdheScsICdyYWlsd2F5LnRzJykpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIC8vIFRoZSB1bmRpY2ktdHlwZXMgcGF0aCBtYXBwaW5nIG11c3QgcmVhY2ggdGhlIG1vbm9yZXBvIHJvb3QncyBub2RlX21vZHVsZXMgKGJ1bmZpZy50b21sJ3NcbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIGhvaXN0cyB0aGUgcGFja2FnZSB0aGVyZSksIGFuZCB3b3Jrc3BhY2UgcGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXBcbiAgLy8gKGUuZy4gYGV4YW1wbGVzLyoqYCksIHNvIGEgZml4ZWQgdHdvLWxldmVsIHByb2JlIGlzIG5vdCBlbm91Z2guIFByZWZlciB0aGUgbmVhcmVzdCBhbmNlc3RvclxuICAvLyBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIHdvcmtzcGFjZXMgKHRoZSBtb25vcmVwbyByb290KTsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbmVhcmVzdFxuICAvLyBhbmNlc3RvciBtYW5pZmVzdC4gU3RvcCBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZ1xuICAvLyByZXBvc2l0b3J5J3MgbWFuaWZlc3QgY2FuIG5ldmVyIGJlIGNob3Nlbi5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCk7XG4gIGxldCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7IDsgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCkpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgcm9vdERpclBhdGggPz89IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgICAgLy8gQnVuIG5vLW9wIHBhdHRlcm5zIChlLmcuIGB3b3Jrc3BhY2VzOiBbXCJcIl1gKSBkbyBub3QgbWFrZSBhIG1hbmlmZXN0IGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICAgIGlmIChnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhtYW5pZmVzdC53b3Jrc3BhY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm9vdERpclBhdGggPSBhbmNlc3RvckRpclBhdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbiB1bnBhcnNhYmxlIG1hbmlmZXN0IHN0aWxsIG1hcmtzIGEgcHJvamVjdCBkaXJlY3Rvcnk7IGtlZXAgY2xpbWJpbmcgZm9yIGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gYW5jZXN0b3JEaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgYnJlYWs7XG4gIH1cbiAgaWYgKCFyb290RGlyUGF0aCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgcm9vdERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpIHx8ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VTZXR0aW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIFJlYWN0IE5hdGl2ZSBnZXRzIGl0cyBhbWJpZW50IHR5cGVzIGZyb20gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSAocmVhY3QtbmF0aXZlLCBqZXN0KS5cbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbi8vIFRoaXMgY29udGVudCBpcyBsb2FkZWQgaW50byBldmVyeSBhZ2VudCBzZXNzaW9uLCBzbyBpdCBpcyBrZXB0IGFzIHNob3J0IGFzIGl0IGNhbiBiZSB3aGlsZVxuLy8gc3RheWluZyB1bmFtYmlndW91czogZS5nLiwgdGhlIGV4Y2x1ZGVkIG9yZ2FuaXphdGlvbnMgYXJlIHdyaXR0ZW4gYXMgc2hlbGwgYnJhY2UgZXhwYW5zaW9uLCB3aGljaFxuLy8gdGhlIGFnZW50cyByZWFkIGFzIGEgcGF0aCBjb25kaXRpb24gd2l0aG91dCBhbnkgcnVudGltZSBtYXRjaGluZy5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbi0gT3V0c2lkZSBcXGB+L2docS9naXRodWIuY29tL3tXaWxsQm9vc3RlcixXaWxsQm9vc3RlckxhYn0vXFxgLCBmb2xsb3cgdGhlIHJlcG9zaXRvcnkncyBjb250cmlidXRpb24gZ3VpZGUgKGUuZy4sIENPTlRSSUJVVElORy5tZCwgXFxgLmdpdGh1Yi9cXGApIGFuZCBpc3N1ZS9QUiB0ZW1wbGF0ZXMsIG1hdGNoIGl0cyBjb21taXQgYW5kIGNvZGUgY29udmVudGlvbnMsIGFuZCBob25vciBpdHMgcnVsZXMgb24gQUktYXNzaXN0ZWQgY29udHJpYnV0aW9ucy4gV3JpdGUgaXRzIGlzc3VlcyBhbmQgUFJzIHdpdGggb25seSB3aGF0IGEgcmV2aWV3ZXIgdW5mYW1pbGlhciB3aXRoIHRoZSB3b3JrIG5lZWRzIHRvIHVuZGVyc3RhbmQgYW5kIGFzc2VzcyBpdCwgYXMgY29uY2lzZWx5IGFzIHRoYXQgY29udGV4dCBhbGxvd3MuXG5gO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIHNldHRpbmdzIG1lcmdlZCBpbnRvIGVhY2ggYWdlbnQncyBKU09OIHNldHRpbmdzIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBob21lXG4gKiBkaXJlY3RvcnkuXG4gKlxuICogRXZlcnkgYWdlbnQgdGhhdCBjYXJyaWVzIGZhY3RzIGZyb20gb25lIHNlc3Npb24gaW50byB0aGUgbmV4dCBpcyB0dXJuZWQgb2ZmIGhlcmUgYmVjYXVzZSBzdWNoXG4gKiBtZW1vcnkgbWFrZXMgYSBzZXNzaW9uIGRlcGVuZCBvbiBpbnZpc2libGUgbWFjaGluZS1sb2NhbCBzdGF0ZTogaXRzIGJlaGF2aW9yIHN0b3BzIGJlaW5nXG4gKiByZXByb2R1Y2libGUgYWNyb3NzIGRldmVsb3BlcnMgYW5kIENJLCBhbmQgYSBzdGFsZSBvciB3cm9uZyBtZW1vcnkgc2lsZW50bHkgb3ZlcnJpZGVzIHRoZVxuICogaW5zdHJ1Y3Rpb24gZmlsZXMgYWJvdmUuIENvZGV4IG5lZWRzIG5vIGVudHJ5IGJlY2F1c2UgaXRzIG1lbW9yaWVzIGFyZSBvcHQtaW5cbiAqIChgW2ZlYXR1cmVzXSBtZW1vcmllcyA9IHRydWVgIGluIGB+Ly5jb2RleC9jb25maWcudG9tbGApLCBzbyBsZWF2aW5nIHRoYXQgZmxhZyB1bnNldCBpcyBlbm91Z2guXG4gKi9cbmNvbnN0IGFnZW50U2V0dGluZ3MgPSBbXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuY2xhdWRlL3NldHRpbmdzLmpzb24nLFxuICAgIGFjY2VwdHNDb21tZW50czogZmFsc2UsXG4gICAgLyoqXG4gICAgICogQ2xhdWRlIENvZGUgaW5qZWN0cyBpdHMgb3duIGF0dHJpYnV0aW9uIGRpcmVjdGl2ZSAoYSBgQ28tQXV0aG9yZWQtQnlgIHRyYWlsZXIsIGEgXCJHZW5lcmF0ZWRcbiAgICAgKiB3aXRoXCIgZm9vdGVyLCBhbmQgYSBzZXNzaW9uIGxpbmspIGludG8gdGhlIHRvb2wgZGVzY3JpcHRpb25zIGFuZCBtaWQtc2Vzc2lvbiByZW1pbmRlcnMsIGFuZFxuICAgICAqIHRoYXQgZGlyZWN0aXZlIGRlY2xhcmVzIGl0c2VsZiB0byByZXBsYWNlIGVhcmxpZXIgZ3VpZGFuY2UsIHNvIHRoZSBpbnN0cnVjdGlvbiBmaWxlIGFsb25lXG4gICAgICogY2Fubm90IHN1cHByZXNzIGl0LiBPbmx5IHRoaXMgc2V0dGluZyByZW1vdmVzIHRoZSBkaXJlY3RpdmUgYXQgaXRzIHNvdXJjZS4gQXV0byBtZW1vcnkgaXMgb25cbiAgICAgKiBieSBkZWZhdWx0LCBzbyBpdCBtdXN0IGJlIHR1cm5lZCBvZmYgZXhwbGljaXRseS5cbiAgICAgKi9cbiAgICBzZXR0aW5nczoge1xuICAgICAgYXR0cmlidXRpb246IHtcbiAgICAgICAgY29tbWl0OiAnJyxcbiAgICAgICAgcHI6ICcnLFxuICAgICAgICBzZXNzaW9uVXJsOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBhdXRvTWVtb3J5RW5hYmxlZDogZmFsc2UsXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHJlbGF0aXZlUGF0aDogJy5nZW1pbmkvc2V0dGluZ3MuanNvbicsXG4gICAgLy8gR2VtaW5pIENMSSBzdHJpcHMgY29tbWVudHMgYmVmb3JlIHBhcnNpbmcgaXRzIHNldHRpbmdzIGZpbGUsIHVubGlrZSBDbGF1ZGUgQ29kZSwgd2hpY2hcbiAgICAvLyByZWplY3RzIGEgY29tbWVudGVkIGZpbGUgYXMgbWFsZm9ybWVkLlxuICAgIGFjY2VwdHNDb21tZW50czogdHJ1ZSxcbiAgICBzZXR0aW5nczoge1xuICAgICAgZXhwZXJpbWVudGFsOiB7XG4gICAgICAgIGF1dG9NZW1vcnk6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBPdmVyd3JpdGVzIHRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGVzIG9mIGV2ZXJ5IHN1cHBvcnRlZCBhZ2VudCB3aXRoIHRoZSBmaXhlZCBjb250ZW50IGFuZFxuICogbWVyZ2VzIHRoZSBmaXhlZCBzZXR0aW5ncyBpbnRvIGVhY2ggYWdlbnQncyB1c2VyIHNldHRpbmdzLiBSZXR1cm5zIGZhbHNlIHdoZW4gYW55IGZpbGUgd2FzXG4gKiBza2lwcGVkIChlLmcuIGEgc3ltbGlua2VkIG9yIHVucGFyc2FibGUgZmlsZSksIHNvIHRoZSBjb21tYW5kIGNhbiBmYWlsIGxvdWRseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgbGV0IGhhc1dyaXR0ZW5BbGwgPSB0cnVlO1xuICBmb3IgKGNvbnN0IHJlbGF0aXZlUGF0aCBvZiB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocykge1xuICAgIGNvbnN0IGhhc1dyaXR0ZW4gPSBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCksIHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzV3JpdHRlbjtcbiAgfVxuICBmb3IgKGNvbnN0IHsgYWNjZXB0c0NvbW1lbnRzLCByZWxhdGl2ZVBhdGgsIHNldHRpbmdzIH0gb2YgYWdlbnRTZXR0aW5ncykge1xuICAgIC8vIEF3YWl0ZWQgc2VwYXJhdGVseTogYCYmPWAgd291bGQgc2tpcCB0aGUgbWVyZ2Ugb25jZSBhbiBlYXJsaWVyIGZpbGUgd2FzIHNraXBwZWQuXG4gICAgY29uc3QgaGFzTWVyZ2VkID0gYXdhaXQgbWVyZ2VBZ2VudFNldHRpbmdzKHJlbGF0aXZlUGF0aCwgc2V0dGluZ3MsIGFjY2VwdHNDb21tZW50cyk7XG4gICAgaGFzV3JpdHRlbkFsbCAmJj0gaGFzTWVyZ2VkO1xuICB9XG4gIHJldHVybiBoYXNXcml0dGVuQWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtZXJnZUFnZW50U2V0dGluZ3MoXG4gIHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuICBuZXdTZXR0aW5nczogb2JqZWN0LFxuICBhY2NlcHRzQ29tbWVudHM6IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksIHJlbGF0aXZlUGF0aCk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgbGV0IGV4aXN0aW5nU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGlmIChleGlzdGluZ0NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEFuIGFnZW50IGlnbm9yZXMgaXRzIHdob2xlIHNldHRpbmdzIGZpbGUgd2hlbiB0aGUgZmlsZSBicmVha3MgdGhlIGdyYW1tYXIgdGhlIGFnZW50IHJlYWRzIGl0XG4gICAgLy8gd2l0aCwgc28gd2JmeSBsZWF2ZXMgc3VjaCBhIGZpbGUgdG8gdGhlIGRldmVsb3BlciB0byByZXBhaXIgcmF0aGVyIHRoYW4gcmV3cml0aW5nIGl0IGludG8gYVxuICAgIC8vIGZpbGUgdGhlIGFnZW50IHN0aWxsIGlnbm9yZXM6IGNvbW1lbnRzIGFyZSB0b2xlcmF0ZWQgb25seSB3aGVyZSB0aGUgYWdlbnQgc3RyaXBzIHRoZW0sIGFuZFxuICAgIC8vIHRyYWlsaW5nIGNvbW1hcyBub3doZXJlLCBzaW5jZSBib3RoIGFnZW50cyBwYXJzZSB3aXRoIEpTT04ucGFyc2UgaW4gdGhlIGVuZC4gQ29tbWVudC1vbmx5XG4gICAgLy8gY29udGVudCBpcyBjaGVja2VkIHRvbywgYmVjYXVzZSBpdCBpcyBrZXB0IGFzIGEgaGVhZGVyIGFib3ZlIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LlxuICAgIGlmICghYWNjZXB0c0NvbW1lbnRzICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhpcyBhZ2VudCByZWFkcyBpdCBhcyBzdHJpY3QgSlNPTiwgY29tbWVudHMgYW5kIGFsbC5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oZXhpc3RpbmdDb250ZW50LCBmYWxzZSk7XG4gICAgICBpZiAoIXBhcnNlZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBhIHN0cmljdCBKU09OIG9iamVjdCAoYSB0cmFpbGluZyBjb21tYSwgZm9yIGV4YW1wbGUsIGlzIG5vdCBhbGxvd2VkKS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nU2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2V0dGluZ3MgPSBtZXJnZShleGlzdGluZ1NldHRpbmdzLCBuZXdTZXR0aW5ncyk7XG4gIC8vIE9ubHkgdGhlIHByb3BlcnRpZXMgd2hvc2UgdmFsdWUgY2hhbmdlcyBhcmUgcmV3cml0dGVuLCBzbyB0aGUgZmlsZSBrZWVwcyBpdHMgb3duIGZvcm1hdHRpbmdcbiAgLy8gYW5kLCB3aGVyZSB0aGUgYWdlbnQgYWxsb3dzIHRoZW0sIGl0cyBjb21tZW50cy5cbiAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKGV4aXN0aW5nQ29udGVudCwgc2V0dGluZ3MpO1xuICBpZiAoIShhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSkpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICAgIC8vIC52c2NvZGUvc2V0dGluZ3MuanNvbiBpcyBKU09OQyBieSBkZWZpbml0aW9uOyBKU09OLnBhcnNlIHdvdWxkIG1ha2Ugd2JmeSBzaWxlbnRseSBza2lwXG4gICAgLy8gY29tbWVudGVkIGZpbGVzLlxuICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxvYmplY3Q+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShwYXJzZWRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICBsZXQgc2V0dGluZ3MgPSBwYXJzZWRTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICB9XG4gICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LWNsZWFuIHNldHRpbmdzLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuaW50ZXJmYWNlIEZub3hUb21sU3VidHJlZSB7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB7IHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgdW5kZWZpbmVkPjtcbn1cblxuLy8gVGhlIGZvdXIgc3RhbmRhcmQgV0JfRU5WIG1vZGVzOyBzdGFnaW5nIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGNvbXBsZXRlZCB3aGVuIHRoZSByZXBvc2l0b3J5XG4vLyBhbHJlYWR5IGRlY2xhcmVzIHRoZSBzdGFnaW5nIHByb2ZpbGUuXG5jb25zdCB3YkVudk1vZGVzID0gWydkZXZlbG9wbWVudCcsICd0ZXN0JywgJ3N0YWdpbmcnLCAncHJvZHVjdGlvbiddIGFzIGNvbnN0O1xudHlwZSBXYkVudk1vZGUgPSAodHlwZW9mIHdiRW52TW9kZXMpW251bWJlcl07XG5cbi8qKlxuICogRW5zdXJlcyBhIGZub3ggcmVwb3NpdG9yeSBkZWZpbmVzIFdCX0VOViBmb3IgZXZlcnkgc3RhbmRhcmQgbW9kZSAoYW5kIE5FWFRfUFVCTElDX1dCX0VOViB3aGVuXG4gKiBhbnkgd29ya3NwYWNlIGRlcGVuZHMgb24gTmV4dC5qcyBvciB2aW5leHQpIGluIGZub3gudG9tbCBwcm9maWxlcy4gRXhpc3RpbmcgZGVmaW5pdGlvbnMgYXJlXG4gKiBhbHdheXMgbGVmdCB1bnRvdWNoZWQuIE5vbi1mbm94IHJlcG9zaXRvcmllcyBhcmUgc2tpcHBlZDogLmVudiBmaWxlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2Vuc3VyZVdiRW52RGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmVlZHNOZXh0UHVibGljID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZykpO1xuICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKTtcbiAgICAvLyBsc3RhdCwgbm90IGV4aXN0c1N5bmM6IGV4aXN0c1N5bmMgaXMgZmFsc2UgZm9yIGEgREFOR0xJTkcgZm5veC50b21sIHN5bWxpbms7IGFueSBmbm94LnRvbWxcbiAgICAvLyBkaXJlY3RvcnkgZW50cnkgbWFya3MgYSBmbm94IHJlcG9zaXRvcnksIGFuZCBhIHJlZnVzZWQvZGFuZ2xpbmcgb25lIGFib3J0cyBpbnN0ZWFkIG9mXG4gICAgLy8gYmVpbmcgdHJlYXRlZCBhcyBhIG5vbi1mbm94IHJlcG9zaXRvcnkgd2hpbGUgdGhlIGZub3ggc3luY2hyb25pemF0aW9uIGlzIGZhaWxpbmcuXG4gICAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZm5veFRvbWxQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoZm5veFRvbWxQYXRoKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50LCBuZWVkc05leHRQdWJsaWMpO1xuICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZWRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogTWlycm9ycyB3YidzIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52IGNvbnRyYWN0IChwYWNrYWdlcy93Yi9zcmMvcHJvamVjdC50cyk6IHRoZSBmcmFtZXdvcmsgbWF5XG4gKiBiZSBkZWNsYXJlZCBpbiBBTlkgb2YgdGhlIGZvdXIgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBgbmV4dGAgYXMgYSBkZXZEZXBlbmRlbmN5IGluIGEgc2hhcmVkXG4gKiBjb21wb25lbnQgbGlicmFyeSksIHdoaWxlIHdiZnkncyBgZGVwZW5kaW5nLm5leHRgIGxvb2tzIG9ubHkgYXQgcmVndWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVzTmV4dFB1YmxpY1diRW52KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXS5zb21lKChzZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gY29uZmlnLnBhY2thZ2VKc29uPy5bc2VjdGlvbiBhcyAnZGVwZW5kZW5jaWVzJ107XG4gICAgcmV0dXJuICEhZGVwZW5kZW5jaWVzPy5bJ25leHQnXSB8fCAhIWRlcGVuZGVuY2llcz8uWyd2aW5leHQnXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBtaXNzaW5nIFdCX0VOViAoYW5kIG9wdGlvbmFsbHkgTkVYVF9QVUJMSUNfV0JfRU5WKSBlbnRyaWVzIGludG8gYSBmbm94LnRvbWw6IHRoZSBiYXNlXG4gKiBgW3NlY3JldHNdYCB0YWJsZSBjYXJyaWVzIHRoZSBkZXZlbG9wbWVudCBkZWZhdWx0cyBhbmQgYFtwcm9maWxlcy48bW9kZT4uc2VjcmV0c11gIG92ZXJsYXlzXG4gKiBlYWNoIG90aGVyIG1vZGUsIG1hdGNoaW5nIHRoZSBvcmctc3RhbmRhcmQgbGF5b3V0LiBGb3JtYXR0aW5nIGFuZCBjb21tZW50cyBhcmUgcHJlc2VydmVkOyBvbmx5XG4gKiBtaXNzaW5nIGxpbmVzIGFyZSBpbnNlcnRlZCBvciBtaXNzaW5nIHNlY3Rpb25zIGFwcGVuZGVkLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBjb250ZW50XG4gKiBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZCAodW5wYXJzYWJsZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVkaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudDogc3RyaW5nLCBuZWVkc05leHRQdWJsaWM6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2V0dGluZ3M6IEZub3hUb21sU3VidHJlZTtcbiAgdHJ5IHtcbiAgICBzZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSBpdCBpcyBub3QgcGFyc2FibGUgYXMgVE9NTC4nKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qga2V5TmFtZXMgPSBuZWVkc05leHRQdWJsaWMgPyBbJ1dCX0VOVicsICdORVhUX1BVQkxJQ19XQl9FTlYnXSA6IFsnV0JfRU5WJ107XG4gIGxldCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQ7XG4gIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgLy8gVGhlIHN0YWdpbmcgbW9kZSBpcyBvcHRpb25hbDogY29tcGxldGUgaXQgb25seSB3aGVuIHRoZSByZXBvc2l0b3J5IGFscmVhZHkgZGVjbGFyZXMgdGhlIHByb2ZpbGUuXG4gICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHNldHRpbmdzLnNlY3JldHMgOiBzZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgIGZvciAoY29uc3Qga2V5TmFtZSBvZiBrZXlOYW1lcykge1xuICAgICAgY29uc3QgZGVmaW5lZCA9IGRlZmluZWRLZXlzPy5ba2V5TmFtZV07XG4gICAgICBjb25zdCBkZWZpbmVkVmFsdWUgPVxuICAgICAgICB0eXBlb2YgZGVmaW5lZCA9PT0gJ3N0cmluZycgPyBkZWZpbmVkIDogKGRlZmluZWQgYXMgeyBkZWZhdWx0PzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZGVmYXVsdDtcbiAgICAgIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWUsIGRlZmluZWRWYWx1ZSwgbW9kZSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmdMaW5lcyA9IGtleU5hbWVzXG4gICAgICAuZmlsdGVyKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChrZXlOYW1lKSA9PiBgJHtrZXlOYW1lfSA9IHsgZGVmYXVsdCA9IFwiJHttb2RlfVwiIH1gKTtcbiAgICBpZiAobWlzc2luZ0xpbmVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgdXBkYXRlZENvbnRlbnQgPSBpbnNlcnRJbnRvRm5veFNlY3Rpb24oXG4gICAgICB1cGRhdGVkQ29udGVudCxcbiAgICAgIG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyAnc2VjcmV0cycgOiBgcHJvZmlsZXMuJHttb2RlfS5zZWNyZXRzYCxcbiAgICAgIG1pc3NpbmdMaW5lc1xuICAgICk7XG4gIH1cbiAgaWYgKHVwZGF0ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm4gY29udGVudDtcblxuICAvLyBSZS1wYXJzZSBiZWZvcmUgcmV0dXJuaW5nOiBhbiB1bnVzdWFsIGxheW91dCAoZS5nLiBkb3R0ZWQga2V5cyB3aXRob3V0IGEgdGFibGUgaGVhZGVyKSBjb3VsZFxuICAvLyBtYWtlIHRoZSB0ZXh0dWFsIGVkaXQgcHJvZHVjZSBhIGR1cGxpY2F0ZSB0YWJsZTsgZmFpbCBzYWZlbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHRoZSBmaWxlLlxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRTZXR0aW5ncyA9IEJ1bi5UT01MLnBhcnNlKHVwZGF0ZWRDb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGRlZmluZWRLZXlzID0gbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IHVwZGF0ZWRTZXR0aW5ncy5zZWNyZXRzIDogdXBkYXRlZFNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgICBpZiAoa2V5TmFtZXMuc29tZSgoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnNlcnRlZCAke21vZGV9IGVudHJpZXMgZGlkIG5vdCB0YWtlIGVmZmVjdGApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS5gKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQ29udGVudDtcbn1cblxuLyoqXG4gKiBXYXJucyB3aGVuIGFuIGV4aXN0aW5nIFdCX0VOVi1mYW1pbHkgZGVmaW5pdGlvbiBuYW1lcyBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9uZSBpdCBpc1xuICogZGVmaW5lZCBmb3IgKGEgdHlwbyBsaWtlIGBwcm9kY3V0aW9uYCBvciBgcHJvZHVjdGlvbjFgLCBvciBhIGNvcHktcGFzdGVkIHdyb25nIG1vZGUpOiB3YlxuICogcmVqZWN0cyBub24tc3RhbmRhcmQgdmFsdWVzIGF0IHJ1bnRpbWUsIHNvIHN1cmZhY2luZyB0aGUgbWlzbWF0Y2ggZHVyaW5nIHdiZnkgaXMgdGhlIGVhcmxpZXN0XG4gKiBwb3NzaWJsZSBzaWduYWwuIFRoZSBwYXNzZWQgdmFsdWUgaXMgYWx3YXlzIHBsYWludGV4dCAoYSBmbm94IGBkZWZhdWx0YCBmaWVsZCkg4oCUIGVuY3J5cHRlZFxuICogZm5veCBlbnRyaWVzIGFyZSBgeyBwcm92aWRlciwgdmFsdWUgfWAgb2JqZWN0cyB3aG9zZSBgZGVmYXVsdGAgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBtb2RlOiBXYkVudk1vZGUpOiB2b2lkIHtcbiAgLy8gQW4gRU1QVFkgdmFsdWUgY291bnRzIGFzIHVuc2V0ICh3YiBzdXBwbGllcyB0aGUgZmFsbGJhY2sgbW9kZSksIG5vdCBhcyBhIG1pc21hdGNoaW5nIG1vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAvLyBBIGR5bmFtaWMgdmFsdWUgKGUuZy4gYE5FWFRfUFVCTElDX1dCX0VOVj0ke1dCX0VOVn1gKSBtYXkgbGVnaXRpbWF0ZWx5IHJlc29sdmUgdG8gdGhlIG1vZGVcbiAgLy8gdGhyb3VnaCBleHBhbnNpb24sIHdoaWNoIHRoaXMgc3RhdGljIGNoZWNrIGNhbm5vdCBldmFsdWF0ZSDigJQgc2tpcCBpbnN0ZWFkIG9mIG1pc2ZpcmluZy5cbiAgLy8gZm5veCBleHBhbmRzIG9ubHkgYCR7Li4ufWAgKGEgYmFyZSBgJFVOU0VUYCBzdGF5cyBsaXRlcmFsKS5cbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCckeycpKSByZXR1cm47XG4gIGlmIChrZXlOYW1lID09PSAnTkVYVF9QVUJMSUNfV0JfRU5WJykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2Igb3ZlcnJpZGVzIGl0IHdpdGggV0JfRU5WLCBidXQgYSBkaXJlY3QgZnJhbWV3b3JrIGJ1aWxkIHdvdWxkIGlubGluZSB0aGlzIHZhbHVlLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiByZWplY3RzIHZhbHVlcyBvdXRzaWRlIGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGxpbmVzIGF0IHRoZSB0b3Agb2YgYSBUT01MIHNlY3Rpb24sIHJpZ2h0IGFmdGVyIGl0cyBgW2hlYWRlcl1gIGxpbmUgc28gcHJvZmlsZS1zcGVjaWZpY1xuICogZW50cmllcyBzdGF5IGdyb3VwZWQgd2l0aCB0aGVpciBoZWFkZXI7IHRoZSBzZWN0aW9uIGlzIGFwcGVuZGVkIGF0IHRoZSBlbmQgd2hlbiBpdCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEludG9Gbm94U2VjdGlvbihjb250ZW50OiBzdHJpbmcsIHNlY3Rpb25OYW1lOiBzdHJpbmcsIGluc2VydGVkTGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gd2JmeSB3cml0ZXMgdGhlIGhlYWRlciB3aXRob3V0IHdoaXRlc3BhY2UgYXJvdW5kIHRoZSBkb3R0ZWQta2V5IGNvbXBvbmVudHMuXG4gIGNvbnN0IGhlYWRlclBhdHRlcm4gPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXlxccypcXFske3NlY3Rpb25OYW1lLnJlcGxhY2VBbGwoJy4nLCBTdHJpbmcucmF3YFxcLmApfVxcXVxccyooPzojLiopPyRgLCAndScpO1xuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBoZWFkZXJJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gaGVhZGVyUGF0dGVybi50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5bJHtzZWN0aW9uTmFtZX1dXFxuJHtpbnNlcnRlZExpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW5lcy5zbGljZSgwLCBoZWFkZXJJbmRleCArIDEpLCAuLi5pbnNlcnRlZExpbmVzLCAuLi5saW5lcy5zbGljZShoZWFkZXJJbmRleCArIDEpXS5qb2luKCdcXG4nKTtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJ1bkFsbEluUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLyoqXG4gKiBSZXBvc2l0b3JpZXMgb3V0c2lkZSBXaWxsQm9vc3RlciAvIFdpbGxCb29zdGVyTGFiIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZVxuICogd29ya2Zsb3dzOiB0aG9zZSB3b3JrZmxvd3MgZGVwZW5kIG9uIG9yZ2FuaXphdGlvbiBzZWNyZXRzIChWRVJEQUNDSU9fVE9LRU4sIERpc2NvcmQgd2ViaG9va3MpXG4gKiBhbmQgc2VsZi1ob3N0ZWQgcnVubmVycyB0aGF0IG90aGVyIG93bmVycyBkbyBub3QgaGF2ZS4gVGhpcyBnZW5lcmF0b3IgaW5zdGVhZCBlbWl0c1xuICogc2VsZi1jb250YWluZWQgd29ya2Zsb3dzIGJ1aWx0IG9ubHkgZnJvbSB3aGF0IGFueSByZXBvc2l0b3J5IG93bmVyIGNhbiBwcm92aWRlOiB0aGUgcmVwb3NpdG9yeVxuICogY29udGVudHMgKG1pc2UudG9tbCwgcGFja2FnZS5qc29uIHNjcmlwdHMpIGFuZCB0aGUgc2luZ2xlIGBGTk9YX0FHRV9LRVlgIHJlcG9zaXRvcnkgc2VjcmV0IHdoZW5cbiAqIHRoZSByZXBvc2l0b3J5IHVzZXMgZm5veC4gR2VuZXJhdGlvbiBpcyBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXInc1xuICogaWRlbnRpdHksIHNvIGl0IHdvcmtzIGZvciBhcmJpdHJhcnkgcGVyc29uYWwgcmVwb3NpdG9yaWVzLlxuICovXG5cbi8qKiBGaXJzdCBsaW5lIG9mIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlOyBmaWxlcyB3aXRob3V0IGl0IGFyZSBoYW5kLXdyaXR0ZW4gYW5kIG5ldmVyIHRvdWNoZWQuICovXG5leHBvcnQgY29uc3Qgc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnkuJztcblxuLy8gU2FtZSBwaW5zIGFzIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MgLyB0aGVpciBjb25zdW1lcnM7IFJlbm92YXRlIHVwZGF0ZXMgdGhlbSBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkuXG5jb25zdCBjaGVja291dEFjdGlvbiA9ICdhY3Rpb25zL2NoZWNrb3V0QHY3LjAuMSc7XG5jb25zdCBtaXNlQWN0aW9uID0gJ2pkeC9taXNlLWFjdGlvbkB2NC4yLjMnO1xuY29uc3QgY2FjaGVBY3Rpb24gPSAnYWN0aW9ucy9jYWNoZUB2Ni4xLjAnO1xuY29uc3QgdXBsb2FkQXJ0aWZhY3RBY3Rpb24gPSAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjcuMC4xJztcbi8vIHY2LjEuMTsgdGhlIHNhbWUgcGluIGFzIHRoZSByZXVzYWJsZSBzZW1hbnRpYy1wciB3b3JrZmxvdy5cbmNvbnN0IHNlbWFudGljUHVsbFJlcXVlc3RBY3Rpb24gPSAnYW1hbm5uL2FjdGlvbi1zZW1hbnRpYy1wdWxsLXJlcXVlc3RANDViOWVkN2NmMjQwODdhMmY3Nzg1YmY1NWJlOTczOTRiYTg3ZTFjMic7XG4vLyB2My4wLjM7IGRlcGxveXMgYXJlIG5ldHdvcmstaGVhdnkgYW5kIGJlbmVmaXQgZnJvbSByZXRyaWVzIHdpdGggYSBsb25nIHRpbWVvdXQuXG5jb25zdCByZXRyeUFjdGlvbiA9ICduaWNrLWZpZWxkcy9yZXRyeUBkZDU2ZjFjYThjYTk5MWUyMzg1YzE4YWI2ZGQzNmVhN2Y5ZmRiNTVmJztcblxuLyoqXG4gKiBKb2ItbGV2ZWwgZW52IHRoYXQgdHVybnMgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHBhdGggb24sIG1pcnJvcmluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzLlxuICpcbiAqIGBzZWNyZXRzYCBpcyB1bmF2YWlsYWJsZSBpbiBhIHN0ZXAtbGV2ZWwgYGlmOmAsIHNvIHRoZSBwcmVzZW5jZSBvZiB0aGUgdG9rZW4gaXMgZXhwb3NlZCBhcyBhXG4gKiBub24tc2VjcmV0IHNpZ25hbDsgYW4gdW5zZXQgc2VjcmV0IGV4cGFuZHMgdG8gYGZhbHNlYCBhbmQgbGVhdmVzIGV2ZXJ5IEd1YXJkIHN0ZXAgc2tpcHBlZCwgd2hpY2hcbiAqIGlzIHdoYXQga2VlcHMgdGhlIGdlbmVyYXRlZCB3b3JrZmxvd3MgcnVubmFibGUgaW4gYSByZXBvc2l0b3J5IHRoYXQgbmV2ZXIgcmVnaXN0ZXJzIHRoZSBzZWNyZXQuXG4gKiBUQUtVTUlfR1VBUkRfVE9LRU4gaXRzZWxmIGlzIGRlZmluZWQtYnV0LUVNUFRZIGpvYi13aWRlIHNvIHRoZSBgJHtUQUtVTUlfR1VBUkRfVE9LRU59YCByZWZlcmVuY2VcbiAqIGluIHRoZSBnZW5lcmF0ZWQgLm5wbXJjIHN0aWxsIGV4cGFuZHMgKHRvICcnKSBpbiB0aGUgc3RlcHMgdGhhdCBkZWxpYmVyYXRlbHkgcnVuIHdpdGhvdXQgdGhlXG4gKiB0b2tlbjsgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkIHZhcmlhYmxlIGlzIHdoYXQgYnJlYWtzIGFuIGluc3RhbGwsIGFuIGVtcHR5IG9uZSBpcyBmaW5lLlxuICovXG5jb25zdCBndWFyZEpvYkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgSEFTX1RBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyAhIXNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JyxcbiAgVEFLVU1JX0dVQVJEX1RPS0VOOiAnJyxcbn07XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgbmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICB1c2VzPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gICd3b3JraW5nLWRpcmVjdG9yeSc/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbmN1cnJlbmN5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7ICdydW5zLW9uJzogc3RyaW5nOyBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0ZXBzOiBTdGVwW10gfVxuICA+O1xufVxuXG5jb25zdCBkZXBsb3lUcmlnZ2VyU2NoZW1hID0gei5vYmplY3Qoe1xuICBvbjogelxuICAgIC5vYmplY3Qoe1xuICAgICAgcHVzaDogelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICBwYXRoczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgICAgICdwYXRocy1pZ25vcmUnOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtyb290Q29uZmlnXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB1c2VzRm5veCA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICBjb25zdCB3b3JrZmxvd0J5RmlsZU5hbWU6IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PiA9IHtcbiAgICAgICd0ZXN0LnltbCc6IGJ1aWxkVGVzdFdvcmtmbG93KHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzLCB1c2VzRm5veCksXG4gICAgICAnc2VtYW50aWMtcHIueW1sJzogYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKSxcbiAgICB9O1xuICAgIC8vIERlcGxveSB3b3JrZmxvd3MgYXJlIGdlbmVyYXRlZCBwZXIgZGVwbG95IHNjcmlwdCB0aGUgcmVwb3NpdG9yeSBkZWNsYXJlcywgc28gYSByZXBvc2l0b3J5XG4gICAgLy8gd2l0aG91dCBhIHN0YWdpbmcgZW52aXJvbm1lbnQgc2ltcGx5IGdldHMgbm8gc3RhZ2luZyB3b3JrZmxvdy4gT25seSBzY3JpcHRzIHRoYXQgaW52b2tlXG4gICAgLy8gYHdiIGRlcGxveWAgcXVhbGlmeTogYSBiZXNwb2tlIGRlcGxveSBzY3JpcHQgbWF5IG5vdCBiZSBzYWZlIHRvIHRyaWdnZXIgYXV0b21hdGljYWxseVxuICAgIC8vIChkZXBsb3ktc3RhZ2luZyBydW5zIG9uIGV2ZXJ5IHB1c2ggdG8gdGhlIGRlZmF1bHQgYnJhbmNoKS5cbiAgICBjb25zdCBzY3JpcHRzID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPSBpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveSddKTtcbiAgICBpZiAoaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93KSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1wcm9kdWN0aW9uLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygncHJvZHVjdGlvbicsICdkZXBsb3knLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveTpzdGFnaW5nJ10pKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1zdGFnaW5nLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygnc3RhZ2luZycsICdkZXBsb3k6c3RhZ2luZycsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSAmJiByb290Q29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydyZWxlYXNlLnltbCddID0gYnVpbGRSZWxlYXNlV29ya2Zsb3cocm9vdENvbmZpZywgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93LCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGF3YWl0IHJ1bkFsbEluUG9vbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93QnlGaWxlTmFtZSkubWFwKFxuICAgICAgICAoW2ZpbGVOYW1lLCB3b3JrZmxvd10pID0+XG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksIHdvcmtmbG93KVxuICAgICAgKVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhmaWxlUGF0aDogc3RyaW5nLCB3b3JrZmxvdzogV29ya2Zsb3cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgLy8gVW5saWtlIFdpbGxCb29zdGVyLW9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMsIHdiZnkgZG9lcyBub3Qgb3duIGFyYml0cmFyeSByZXBvc2l0b3JpZXMnIENJOlxuICAvLyBvbmx5IGZpbGVzIGl0IGdlbmVyYXRlZCAoaWRlbnRpZmllZCBieSB0aGUgbWFya2VyKSBhcmUgcmVnZW5lcmF0ZWQsIGFuZCBoYW5kLXdyaXR0ZW5cbiAgLy8gd29ya2Zsb3dzIGFyZSBuZXZlciB0b3VjaGVkLiBPd25lcnMgb3B0IG91dCBwZXJtYW5lbnRseSBieSByZW1vdmluZyB0aGUgbWFya2VyIGxpbmUuXG4gIC8vIEFuIGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBmaWxlIGNhcnJpZXMgbm8gaGFuZC13cml0dGVuIGNvbnRlbnQsIHNvIGl0IGlzIHRyZWF0ZWQgYXMgYWJzZW50LlxuICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG9sZENvbnRlbnQudHJpbSgpICE9PSAnJyAmJiAhb2xkQ29udGVudC5zdGFydHNXaXRoKHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF0aC5iYXNlbmFtZShmaWxlUGF0aCkuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgd29ya2Zsb3cub24ucHVzaCAmJiBvbGRDb250ZW50Py50cmltKCkpIHtcbiAgICBjb25zdCBleGlzdGluZ1B1c2ggPSBkZXBsb3lUcmlnZ2VyU2NoZW1hLnBhcnNlKHlhbWwubG9hZChvbGRDb250ZW50KSkub24/LnB1c2g7XG4gICAgd29ya2Zsb3cub24ucHVzaCA9IHtcbiAgICAgIC4uLnoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKS5wYXJzZSh3b3JrZmxvdy5vbi5wdXNoKSxcbiAgICAgIHBhdGhzOiBleGlzdGluZ1B1c2g/LnBhdGhzLFxuICAgICAgJ3BhdGhzLWlnbm9yZSc6IGV4aXN0aW5nUHVzaD8uWydwYXRocy1pZ25vcmUnXSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gYCR7c2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyfSBSZW1vdmUgdGhpcyBsaW5lIHRvIHN0b3Agd2JmeSBmcm9tIG92ZXJ3cml0aW5nIHRoaXMgZmlsZS5cXG5gO1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcCh3b3JrZmxvdywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIGhlYWRlciArIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gd29ya2luZ0RpcihkaXJQYXRoOiBzdHJpbmcpOiBQaWNrPFN0ZXAsICd3b3JraW5nLWRpcmVjdG9yeSc+IHtcbiAgcmV0dXJuIGRpclBhdGggPyB7ICd3b3JraW5nLWRpcmVjdG9yeSc6IGRpclBhdGggfSA6IHt9O1xufVxuXG5mdW5jdGlvbiBpc1diRGVwbG95U2NyaXB0KHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiIGRlcGxveVxcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZXN0V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgLy8gUGxheXdyaWdodCBtYXkgYmUgZGVjbGFyZWQgb25seSBpbiB3b3Jrc3BhY2UgcGFja2FnZXM7IGB3YiB0ZXN0LW9uLWNpYCBydW5zIGV2ZXJ5IGRlY2xhcmluZ1xuICAvLyBwYWNrYWdlJ3MgZTJlIHRlc3RzLCBzbyB0aGUgd29ya2Zsb3cgbXVzdCBpbnN0YWxsIGJyb3dzZXJzIGZvciBlYWNoIG9mIHRoZW0gKHRoZWlyIHZlcnNpb25zXG4gIC8vIG1heSBkaWZmZXIsIGFuZCBlYWNoIGxpYnJhcnkgdmVyc2lvbiByZXF1aXJlcyBpdHMgbWF0Y2hpbmcgYnJvd3NlciBiaW5hcmllcykuIEJ1bidzIGlzb2xhdGVkXG4gIC8vIGxpbmtlciByZXNvbHZlcyB0aGUgcGxheXdyaWdodCBiaW5hcnkgb25seSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSwgaGVuY2UgdGhlXG4gIC8vIHdvcmtpbmctZGlyZWN0b3J5IG9uIGV2ZXJ5IHN0ZXAuIFRoZSBicm93c2VycyBsYW5kIGluIH4vLmNhY2hlL21zLXBsYXl3cmlnaHQsIHNoYXJlZCBhY3Jvc3NcbiAgLy8gd29ya3NwYWNlcywgc28gc2FtZS12ZXJzaW9uIGluc3RhbGxzIG5hdHVyYWxseSBkZWR1cGxpY2F0ZS5cbiAgY29uc3QgcGxheXdyaWdodERpclBhdGhzID0gWy4uLmFsbFBhY2thZ2VDb25maWdzXVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5kaXJQYXRoLmxvY2FsZUNvbXBhcmUoYi5kaXJQYXRoKSlcbiAgICAuZmlsdGVyKChwYWNrYWdlQ29uZmlnKSA9PiBwYWNrYWdlQ29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdClcbiAgICAubWFwKChwYWNrYWdlQ29uZmlnKSA9PiBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlQ29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgLy8gU3RlcC1zY29wZWQgbGlrZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdzogZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyBydW4gYnkgYGJ1biBpbnN0YWxsYFxuICAvLyBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICBjb25zdCBmbm94RW52OiBQaWNrPFN0ZXAsICdlbnYnPiA9IHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fTtcblxuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24gfSxcbiAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAuLi5idWlsZEluc3RhbGxTdGVwcyh0cnVlKSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gKFtcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoLCBpbmRleCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBHZXQgUGxheXdyaWdodCB2ZXJzaW9uJHtkaXJQYXRoID8gYCAoJHtkaXJQYXRofSlgIDogJyd9YCxcbiAgICAgICAgICAgIC8vIFRoZSBJTlNUQUxMRUQgdmVyc2lvbiwgbm90IHRoZSBwYWNrYWdlLmpzb24gc3BlY2lmaWVyOiBhIHJhbmdlIGxpa2UgYF4xLjQ1LjBgXG4gICAgICAgICAgICAvLyBzdGF5cyB1bmNoYW5nZWQgYWNyb3NzIGxvY2tmaWxlIHVwZGF0ZXMsIHNvIGtleWluZyB0aGUgY2FjaGUgb24gaXQgd291bGQgcmVzdG9yZVxuICAgICAgICAgICAgLy8gc3RhbGUgYnJvd3NlcnMgdGhhdCBubyBsb25nZXIgbWF0Y2ggdGhlIGxpYnJhcnkuIFJ1bnMgYWZ0ZXIgYGJ1biBpbnN0YWxsYCwgc28gdGhlXG4gICAgICAgICAgICAvLyBwYWNrYWdlIGlzIHJlc29sdmFibGUgZnJvbSB0aGUgZGVjbGFyaW5nIHBhY2thZ2UncyBkaXJlY3RvcnkuXG4gICAgICAgICAgICBpZDogYHBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fWAsXG4gICAgICAgICAgICBydW46ICdlY2hvIFwidmVyc2lvbj0kKGJ1biAtZSBcInRyeSB7IGNvbnNvbGUubG9nKHJlcXVpcmUoXFwnQHBsYXl3cmlnaHQvdGVzdC9wYWNrYWdlLmpzb25cXCcpLnZlcnNpb24pIH0gY2F0Y2gge31cIilcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0NhY2hlIFBsYXl3cmlnaHQgYnJvd3NlcnMnLFxuICAgICAgICAgICAgaWQ6ICdwbGF5d3JpZ2h0LWNhY2hlJyxcbiAgICAgICAgICAgIHVzZXM6IGNhY2hlQWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBwYXRoOiAnfi8uY2FjaGUvbXMtcGxheXdyaWdodCcsXG4gICAgICAgICAgICAgIGtleTogYHBsYXl3cmlnaHQtXFwke3sgcnVubmVyLm9zIH19LSR7cGxheXdyaWdodERpclBhdGhzXG4gICAgICAgICAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IGBcXCR7eyBzdGVwcy5wbGF5d3JpZ2h0LXZlcnNpb24tJHtpbmRleH0ub3V0cHV0cy52ZXJzaW9uIH19YClcbiAgICAgICAgICAgICAgICAuam9pbignLScpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGJyb3dzZXJzIHN0aWxsIG5lZWQgdGhlaXIgc3lzdGVtIGRlcGVuZGVuY2llcyBvbiBhIGZyZXNoIHJ1bm5lci5cbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF0gc2F0aXNmaWVzIFN0ZXBbXSlcbiAgICAgIDogW10pLFxuICAgIC4uLihoYXNUeXBlY2hlY2sgPyBbeyBydW46ICdidW4gcnVuIHR5cGVjaGVjaycsIC4uLmZub3hFbnYgfV0gOiBbXSksXG4gICAgeyBydW46ICdidW4gcnVuIGxpbnQnLCAuLi5mbm94RW52IH0sXG4gICAge1xuICAgICAgbmFtZTogJ1Rlc3QnLFxuICAgICAgaWQ6ICd0ZXN0JyxcbiAgICAgIHJ1bjogYGlmIFtbIFwiJFVQTE9BRF9URVNUX0xPR1wiICE9IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGV4ZWMgYnVuIHJ1biB0ZXN0L2NpXG5maVxubG9nX2Rpcj0kKG1rdGVtcCAtZCBcIiRSVU5ORVJfVEVNUC90ZXN0LW91dHB1dC5YWFhYWFhcIilcbmVjaG8gXCJsb2dfcGF0aD0kbG9nX2Rpci90ZXN0LmxvZ1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxuIyBLZWVwIGRyYWluaW5nIHRlc3Qgb3V0cHV0IHdoZW4gdGhlIGxvZyByZWFjaGVzIGEgZmlsZS1zaXplIGxpbWl0Llxuc2V0ICtlXG5idW4gcnVuIHRlc3QvY2kgMj4mMSB8ICh0cmFwICcnIFhGU1o7IHRlZSBcIiRsb2dfZGlyL3Rlc3QubG9nXCIpXG50ZXN0X3N0YXR1cz0oXCJcXCR7UElQRVNUQVRVU1tAXX1cIilcbmlmICgoIHRlc3Rfc3RhdHVzWzBdICE9IDAgKSk7IHRoZW4gZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1swXX1cIjsgZmlcbmV4aXQgXCJcXCR7dGVzdF9zdGF0dXNbMV19XCJgLFxuICAgICAgZW52OiB7IC4uLmZub3hFbnYuZW52LCBVUExPQURfVEVTVF9MT0c6ICcke3sgdmFycy5VUExPQURfVEVTVF9MT0cgfX0nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgbG9nJyxcbiAgICAgIGlmOiBcIiR7eyBhbHdheXMoKSAmJiB2YXJzLlVQTE9BRF9URVNUX0xPRyA9PSAndHJ1ZScgJiYgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoICE9ICcnIH19XCIsXG4gICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgbmFtZTogJ3Rlc3Qtb3V0cHV0LSR7eyBydW5uZXIub3MgfX0tJHt7IGpvYi5jaGVja19ydW5faWQgfX0tJHt7IGdpdGh1Yi5ydW5fYXR0ZW1wdCB9fScsXG4gICAgICAgIHBhdGg6ICcke3sgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoIH19JyxcbiAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdlcnJvcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgLi4uKHBsYXl3cmlnaHREaXJQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgcmVzdWx0cycsXG4gICAgICAgICAgICBpZjogJyR7eyBhbHdheXMoKSB9fScsXG4gICAgICAgICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Rlc3QtcmVzdWx0cycsXG4gICAgICAgICAgICAgIC8vIEV2ZXJ5IGRlY2xhcmluZyBwYWNrYWdlIHdyaXRlcyBpdHMgb3duIHRlc3QtcmVzdWx0cyBkaXJlY3Rvcnk7IGEgbmV3bGluZS1zZXBhcmF0ZWRcbiAgICAgICAgICAgICAgLy8gbGlzdCB1cGxvYWRzIHRoZW0gYWxsLlxuICAgICAgICAgICAgICBwYXRoOiBwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChkaXJQYXRoKSA9PiAoZGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAndGVzdC1yZXN1bHRzJykgOiAndGVzdC1yZXN1bHRzJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAnaWYtbm8tZmlsZXMtZm91bmQnOiAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIDogW10pLFxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgRk9SQ0VfQ09MT1I6ICczJywgV0JfRU5WOiAndGVzdCcsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZERlcGxveVdvcmtmbG93KGVudmlyb25tZW50OiAnc3RhZ2luZycgfCAncHJvZHVjdGlvbicsIHNjcmlwdE5hbWU6IHN0cmluZywgdXNlc0Zub3g6IGJvb2xlYW4pOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogYERlcGxveSBhcHAgb24gJHtlbnZpcm9ubWVudH1gLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICAgIC8vIFByb2R1Y3Rpb24gZGVwbG95cyBmb2xsb3cgcHVibGlzaGVkIHJlbGVhc2VzIChzZWUgdGhlIHJlbGVhc2Ugd29ya2Zsb3cncyB0cmlnZ2VyIHN0ZXApO1xuICAgICAgLy8gc3RhZ2luZyBjb252ZXJnZXMgb24gZXZlcnkgZGVmYXVsdC1icmFuY2ggcHVzaC5cbiAgICAgIC4uLihlbnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgID8geyByZWxlYXNlOiB7IHR5cGVzOiBbJ3B1Ymxpc2hlZCddIH0gfVxuICAgICAgICA6IHsgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10sICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSB9IH0pLFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogJ3JlYWQnIH0sXG4gICAgam9iczoge1xuICAgICAgZGVwbG95OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgV0JfRU5WOiBlbnZpcm9ubWVudCwgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwIHNvIGBnaXQgZGVzY3JpYmVgIHNlZXMgdGhlIHRhZ3MgV0JfVkVSU0lPTiBpcyBkZXJpdmVkIGZyb20uXG4gICAgICAgICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiwgd2l0aDogeyAnZmV0Y2gtZGVwdGgnOiAwIH0gfSxcbiAgICAgICAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnU2V0IFdCX1ZFUlNJT04nLFxuICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5XQl9WRVJTSU9OPSQoZ2l0IGRlc2NyaWJlIC0tYWx3YXlzIC0tdGFncylcXG5lY2hvIFwiV0JfVkVSU0lPTj0kV0JfVkVSU0lPTlwiID4+IFwiJEdJVEhVQl9FTlZcIicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5idWlsZEluc3RhbGxTdGVwcyhmYWxzZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0RlcGxveScsXG4gICAgICAgICAgICB1c2VzOiByZXRyeUFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgdGltZW91dF9taW51dGVzOiA2MCxcbiAgICAgICAgICAgICAgbWF4X2F0dGVtcHRzOiA1LFxuICAgICAgICAgICAgICBjb21tYW5kOiBgYnVuIHJ1biAke3NjcmlwdE5hbWV9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieVxuICAgICAgICAgICAgLy8gYGJ1biBpbnN0YWxsYCBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICAgICAgICAgICAgLi4uKHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZWxlYXNlV29ya2Zsb3coXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93OiBib29sZWFuLFxuICB1c2VzRm5veDogYm9vbGVhblxuKTogV29ya2Zsb3cge1xuICBjb25zdCBmbm94RW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gdXNlc0Zub3ggPyB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSA6IHt9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDogeyBicmFuY2hlczogWy4uLmNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGRpc3BhdGNoaW5nIHRoZSBwcm9kdWN0aW9uIGRlcGxveSB3b3JrZmxvdyBhZnRlciBhIHJlbGVhc2VcbiAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPyB7IGFjdGlvbnM6ICd3cml0ZScgfSA6IHt9KSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIC8vIFJlbGVhc2VzIGJ1aWxkIHByb2R1Y3Rpb24gYXJ0aWZhY3RzLCBoZW5jZSB0aGUgZW52aXJvbm1lbnQg4oCUIHRoZSBzYW1lIGRlZmF1bHQgYXMgdGhlXG4gICAgICAgIC8vIHJldXNhYmxlIHJlbGVhc2Ugd29ya2Zsb3cuIHdiJ3MgQ0kgZ3VhcmQgYWxzbyByZXF1aXJlcyBhbiBleHBvcnRlZCBXQl9FTlYsIHNvIHdpdGhvdXRcbiAgICAgICAgLy8gaXQgYSBgcG9zdGluc3RhbGxgIHRoYXQgY2FsbHMgd2IgKGUuZy4gYHdiIGdlbi1jb2RlYCkgZXhpdHMgMSBiZWZvcmUgc2VtYW50aWMtcmVsZWFzZVxuICAgICAgICAvLyBydW5zLlxuICAgICAgICBlbnY6IHsgV0JfRU5WOiAncHJvZHVjdGlvbicsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgLy8gZmV0Y2gtZGVwdGggMDogc2VtYW50aWMtcmVsZWFzZSByZWFkcyB0aGUgZnVsbCBoaXN0b3J5IHRvIGNvbXB1dGUgdGhlIG5leHQgdmVyc2lvbi5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93XG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnR2V0IGN1cnJlbnQgbGF0ZXN0IHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3ByZS1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmVjaG8gXCJ0YWc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgICAgICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlIGNoZWNrcyBOb2RlLmpzIHJ1bnRpbWUgcmVxdWlyZW1lbnRzOyBgYnVuIDxiaW4+YCByZXNwZWN0cyBpdHNcbiAgICAgICAgICAgIC8vIGAjIS91c3IvYmluL2VudiBub2RlYCBzaGViYW5nLCBzbyBpdCBzdGlsbCBydW5zIHVuZGVyIHJlYWwgTm9kZS5cbiAgICAgICAgICAgIHJ1bjogJ2J1biBzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgICAgICAgICAgICBMRUZUSE9PSzogJzAnLFxuICAgICAgICAgICAgICAuLi5mbm94RW52LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQ2hlY2sgZm9yIG5ldyByZWxlYXNlIHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3Bvc3QtcmVsZWFzZS10YWcnLFxuICAgICAgICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5naXQgZmV0Y2ggLS10YWdzIC0tZm9yY2VcXG5ORVdfVEFHPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0wIDI+L2Rldi9udWxsIHx8IGVjaG8gXFwnXFwnKVxcbmVjaG8gXCJ0YWc9JE5FV19UQUdcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5pZiBbWyAtbiBcIiRORVdfVEFHXCIgJiYgXCIkTkVXX1RBR1wiICE9IFwiJHt7IHN0ZXBzLnByZS1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiIF1dOyB0aGVuXFxuICBlY2hvIFwiY3JlYXRlZD10cnVlXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXFxuZmknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWY6IFwic3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLmNyZWF0ZWQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnVHJpZ2dlciBwcm9kdWN0aW9uIGRlcGxveScsXG4gICAgICAgICAgICAgICAgICAvLyBBIEdJVEhVQl9UT0tFTi1jcmVhdGVkIHJlbGVhc2UgZG9lcyBub3QgZmlyZSB0aGUgZGVwbG95IHdvcmtmbG93J3NcbiAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UtcHVibGlzaGVkIHRyaWdnZXIsIHNvIGRpc3BhdGNoIGl0IGV4cGxpY2l0bHkgb24gdGhlIG5ldyB0YWcuXG4gICAgICAgICAgICAgICAgICBydW46ICdnaCB3b3JrZmxvdyBydW4gZGVwbG95LXByb2R1Y3Rpb24ueW1sIC0tcmVmIFwiJHt7IHN0ZXBzLnBvc3QtcmVsZWFzZS10YWcub3V0cHV0cy50YWcgfX1cIicsXG4gICAgICAgICAgICAgICAgICBlbnY6IHsgR0hfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGluc3RhbGwgc2VxdWVuY2UgZXZlcnkgZ2VuZXJhdGVkIHdvcmtmbG93IHNoYXJlczogYGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlYCwgaGFyZGVuZWQgaW50byB0aGVcbiAqIHJldXNhYmxlIHdvcmtmbG93cycgdGhyZWUtc3RlcCBkYW5jZSB3aGVuIHRoZSByZXBvc2l0b3J5IHJlZ2lzdGVycyBhIFRBS1VNSV9HVUFSRF9UT0tFTiBzZWNyZXQuXG4gKlxuICogVGFrdW1pIEd1YXJkIChodHRwczovL2ZsYXR0LnRlY2gvdGFrdW1pL2ZlYXR1cmVzL2d1YXJkKSBpcyBhIHJlZ2lzdHJ5IHByb3h5IHRoYXQgYmxvY2tzXG4gKiBrbm93bi1tYWxpY2lvdXMgcGFja2FnZXMuIFJvdXRpbmcgdGhlIERFRkFVTFQgcmVnaXN0cnkgdGhyb3VnaCBpdCBpcyB3aGF0IHByb3RlY3RzIHRoZSBpbnN0YWxsLFxuICogYW5kIHRoZSB0b2tlbiBhdXRoZW50aWNhdGVzIHRoYXQgcHJveHkg4oCUIHNvIHRoZSB0b2tlbiBoYXMgdG8gYmUgcHJlc2VudCB3aGlsZSBkZXBlbmRlbmNpZXMgYXJlXG4gKiByZXNvbHZlZCwgd2hpY2ggaXMgZXhhY3RseSB3aGVuIGEgY29tcHJvbWlzZWQgZGVwZW5kZW5jeSdzIGxpZmVjeWNsZSBzY3JpcHQgd291bGQgcnVuLiBIZW5jZSB0aGVcbiAqIHNwbGl0OiByZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGAtLWlnbm9yZS1zY3JpcHRzYCBhbmQgdGhlIHRva2VuLCB0aGVuIHJlcGxheSB0aGUgc2tpcHBlZFxuICogbGlmZWN5Y2xlIHNjcmlwdHMgaW4gYSBzZWNvbmQgaW5zdGFsbCB0aGF0IGhhcyBubyB0b2tlbiAoZXZlcnkgcGFja2FnZSBpcyBhbHJlYWR5IGNhY2hlZCwgYW5kXG4gKiBHdWFyZCBzZXJ2ZXMgYW5vbnltb3VzbHkgYW55d2F5KS4gT25seSBidW4gaXMgZ2VuZXJhdGVkIGhlcmUsIGFuZCBidW4gcmVhZHMgLm5wbXJjLCBzbyBub1xuICogcGFja2FnZS1tYW5hZ2VyIGJyYW5jaGluZyBpcyBuZWVkZWQuXG4gKlxuICogVGhlIHNoZWxsIGRldGFpbHMgZGVsaWJlcmF0ZWx5IG1pcnJvciByZXVzYWJsZS13b3JrZmxvd3MnIHByb2R1Y3Rpb24tcHJvdmVuIGluc3RhbGwgc3RlcHM6IGJhcmVcbiAqIGAkUlVOTkVSX1RFTVBgIChzZXQgYnkgdGhlIHJ1bm5lciBhcHBsaWNhdGlvbiBvbiBldmVyeSBydW5uZXIsIGFuZCBgc2V0IC11YCBmYWlscyBsb3VkbHkgaWYgbm90KSxcbiAqIGBbWyAtZSAubnBtcmMgXV1gLCBhbmQgdGhlIHNlY29uZCBgcm0gLXJmIG5vZGVfbW9kdWxlc2AgaW4gdGhlIGZhbGxiYWNrIChhbiBpbnRlcnJ1cHRlZCBsaWZlY3ljbGVcbiAqIHJ1biBtYXkgbGVhdmUgbm9kZV9tb2R1bGVzIGluY29uc2lzdGVudCwgc28gdGhlIHJldHJ5IHN0YXJ0cyBjbGVhbiByYXRoZXIgdGhhbiB0cnVzdGluZyBhIHJlcGFpcikuXG4gKlxuICogYHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZWAgZGVjaWRlcyB3aGF0IGEgZmFpbGluZyBsaWZlY3ljbGUtc2NyaXB0IHJlcGxheSBkb2VzLiBFdmVyeVxuICogcmVwbGF5IHJ1bnMgdG9rZW5sZXNzIGFuZCB3aXRob3V0IEZOT1hfQUdFX0tFWSAodGhlIGtleSBpcyBzY29wZWQgdG8gdGhlIGxhdGVyIERlcGxveS9SZWxlYXNlXG4gKiBzdGVwKSwgc28gYSBwb3N0aW5zdGFsbCB0aGF0IG5lZWRzIGRlY3J5cHRlZCBzZWNyZXRzIGlzIHVuc3VwcG9ydGVkIGluIGFsbCBvZiB0aGVtIGJ5IGRlc2lnbi5cbiAqIFRoZSB0ZXN0IHdvcmtmbG93IHRvbGVyYXRlcyB0aGUgZmFpbHVyZSBiZWNhdXNlIHR5cGVjaGVjay9saW50L3Rlc3QgZmFpbCBsb3VkbHkgb24gYSBkZWdyYWRlZFxuICogdHJlZSBhbnl3YXkuIERlcGxveSBhbmQgcmVsZWFzZSB3b3JrZmxvd3MgbXVzdCBub3Q6IGEgYDo6d2FybmluZzo6YCBkb2VzIG5vdCBmYWlsIHRoZSBqb2IsIHNvXG4gKiB0aGUgZmFsbGJhY2sgd291bGQgc2hpcCBhIHRyZWUgd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgKGUuZy4gYSBgcG9zdGluc3RhbGw6IHdiIGdlbi1jb2RlYClcbiAqIG5ldmVyIHJhbiwgc2lsZW50bHkgZGVwbG95aW5nIGRlZ3JhZGVkIG91dHB1dCAoIzExMjcpLlxuICovXG5mdW5jdGlvbiBidWlsZEluc3RhbGxTdGVwcyh0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmU6IGJvb2xlYW4pOiBTdGVwW10ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdHZW5lcmF0ZSAubnBtcmMgZm9yIFRha3VtaSBHdWFyZCcsXG4gICAgICAvLyBUaGUgdG9rZW4gaXMgd3JpdHRlbiBhcyBhIGxpdGVyYWwgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlIHRoYXQgYnVuIGV4cGFuZHMgYXRcbiAgICAgIC8vIGluc3RhbGwgdGltZSwgc28gdGhlIHNlY3JldCBpdHNlbGYgbmV2ZXIgbGFuZHMgaW4gYSBmaWxlLiBUaGUgbWFuYWdlZCBsaW5lcyBhcmUgc3RyaXBwZWRcbiAgICAgIC8vIGZyb20gYW4gZXhpc3RpbmcgLm5wbXJjIGZpcnN0OiBhIHJlcG9zaXRvcnkgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9ucyBtYXkgbGVnaXRpbWF0ZWx5XG4gICAgICAvLyBjb21taXQgb25lIChzY29wZSBtYXBwaW5ncyBmb3IgYW5vdGhlciByZWdpc3RyeSksIGFuZCBkcm9wcGluZyBvbmx5IHRoZXNlIHR3byBsaW5lcyBrZWVwc1xuICAgICAgLy8gdGhlIHJlc3Qgb2YgaXQgaW4gZWZmZWN0LiBSZXBsYWNpbmcgdGhlIGZpbGUgd2l0aCBgbXZgIHJhdGhlciB0aGFuIGFwcGVuZGluZyBpbiBwbGFjZSBzdG9wc1xuICAgICAgLy8gYSBjb21taXR0ZWQgc3ltbGluayBmcm9tIHJlZGlyZWN0aW5nIHRoZSB3cml0ZSBpbnRvLCBzYXksIGEgcGVyc2lzdGVudCBob21lIG5wbXJjLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbk5QTVJDPVwiJChta3RlbXAgXCIkUlVOTkVSX1RFTVAvbnBtcmMuWFhYWFhYXCIpXCJcbmlmIFtbIC1lIC5ucG1yYyBdXTsgdGhlblxuICBncmVwIC12RSAnXnJlZ2lzdHJ5PXxeLy9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoLzpfYXV0aFRva2VuJyAubnBtcmMgPiBcIiROUE1SQ1wiIHx8IHRydWVcbmZpXG5lY2hvICdyZWdpc3RyeT1odHRwczovL25wbS5mbGF0dC50ZWNoLycgPj4gXCIkTlBNUkNcIlxuZWNobyAnLy9ucG0uZmxhdHQudGVjaC86X2F1dGhUb2tlbj1cXCR7VEFLVU1JX0dVQVJEX1RPS0VOfScgPj4gXCIkTlBNUkNcIlxucm0gLWYgLm5wbXJjXG5tdiBcIiROUE1SQ1wiIC5ucG1yY2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgLy8gLS1mcm96ZW4tbG9ja2ZpbGU6IGEgcGxhaW4gYGJ1biBpbnN0YWxsYCBzaWxlbnRseSByZXBhaXJzIGEgYnVuLmxvY2sgdGhhdCBpcyBzdGFsZSBhZ2FpbnN0XG4gICAgICAvLyBwYWNrYWdlLmpzb24sIHNvIENJIHdvdWxkIHJ1biBkZXBlbmRlbmN5IHJlc29sdXRpb25zIHRoYXQgd2VyZSBuZXZlciByZXZpZXdlZCAoIzExMjYpLlxuICAgICAgLy8gV2l0aCBOTyBidW4ubG9jayBhdCBhbGwsIC0tZnJvemVuLWxvY2tmaWxlIHNpbGVudGx5IGluc3RhbGxzIGZyZXNoLCB1bnBpbm5lZCByZXNvbHV0aW9uc1xuICAgICAgLy8gKEJ1biAxLjMuMTQgZXhpdHMgMCBhbmQgd3JpdGVzIG5vIGxvY2tmaWxlKSwgc28gYSBtaXNzaW5nIGxvY2tmaWxlIG11c3QgZmFpbCBleHBsaWNpdGx5LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIFtbICEgLWUgYnVuLmxvY2sgXV07IHRoZW5cbiAgZWNobyBcIjo6ZXJyb3I6OmJ1bi5sb2NrIGlzIG1pc3Npbmc7IGNvbW1pdCBpdCBzbyBDSSBpbnN0YWxscyBzdGF5IHJlcHJvZHVjaWJsZVwiXG4gIGV4aXQgMVxuZmlcbmlmIFtbIFwiJEhBU19UQUtVTUlfR1VBUkRfVE9LRU5cIiA9PSBcInRydWVcIiBdXTsgdGhlblxuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG5lbHNlXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG5maWAsXG4gICAgICAvLyBTdGVwLXNjb3BlZDogYSBqb2ItbGV2ZWwgdG9rZW4gd291bGQgYmUgcmVhZGFibGUgYnkgZXZlcnkgZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0IHRoZVxuICAgICAgLy8gdG9rZW5sZXNzIHJlcGxheSBiZWxvdyBydW5zLlxuICAgICAgZW52OiB7IFRBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSdW4gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzJyxcbiAgICAgIC8vIEEgcmVwZWF0ZWQgYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgcmVwbGF5cyBub3RoaW5nLCBzbyBub2RlX21vZHVsZXMgaGFzIHRvIGdvIGZpcnN0LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbnJtIC1yZiBub2RlX21vZHVsZXNcbmJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJHtcbiAgICAgICAgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlXG4gICAgICAgICAgPyBgIHx8IHtcbiAgZWNobyBcIjo6d2FybmluZzo6TGlmZWN5Y2xlIHNjcmlwdHMgZmFpbGVkOyBjb21wbGV0aW5nIHRoZSBpbnN0YWxsIHdpdGhvdXQgdGhlbVwiXG4gIHJtIC1yZiBub2RlX21vZHVsZXNcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgLS1pZ25vcmUtc2NyaXB0c1xufWBcbiAgICAgICAgICA6ICcnXG4gICAgICB9YCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSZW1vdmUgdGhlIGdlbmVyYXRlZCAubnBtcmMnLFxuICAgICAgLy8gTm90aGluZyBhZnRlciB0aGUgaW5zdGFsbCBuZWVkcyB0aGUgcHJveHksIGFuZCBsZWF2aW5nIGl0IGluIHBsYWNlIHdvdWxkIGJyZWFrIHRoZSBvbmVcbiAgICAgIC8vIHRoaW5nIEd1YXJkIHJlZnVzZXMgdG8gc2VydmU6IGl0IGFuc3dlcnMgYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSwgc28gYSByZWxlYXNlIHdvcmtmbG93XG4gICAgICAvLyB3aG9zZSBwYWNrYWdlIGxhY2tzIGFuIGV4cGxpY2l0IHB1Ymxpc2hDb25maWcucmVnaXN0cnkgd291bGQgZmFpbCB0byBwdWJsaXNoLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggLS0gLm5wbXJjID4gL2Rldi9udWxsIDI+JjE7IHRoZW5cbiAgZ2l0IGNoZWNrb3V0IC0tIC5ucG1yY1xuZWxzZVxuICBybSAtZiAubnBtcmNcbmZpYCxcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7IHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gVGhlIGFjdGlvbiByZWFkcyB0aGUgcHVsbCByZXF1ZXN0LCBhbmQgaXRzIGB3aXBgIHN1cHBvcnQgcG9zdHMgYSBjb21taXQgc3RhdHVzOyBuZWl0aGVyXG4gICAgICAgIC8vIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB3aGVuIHRoZSByZXBvc2l0b3J5IHJlc3RyaWN0cyBkZWZhdWx0IHdvcmtmbG93IHBlcm1pc3Npb25zLlxuICAgICAgICBwZXJtaXNzaW9uczogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDogeyB3aXA6IHRydWUgfSxcbiAgICAgICAgICAgIGVudjogeyBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIE1pc2VUb21sIHtcbiAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gVGhlIG9sZGVzdCBCdW4gcnVudGltZSB3YmZ5IHN1cHBvcnRzLlxuZXhwb3J0IGNvbnN0IG1pbmltdW1CdW5WZXJzaW9uID0gJzEuNC4wJztcblxuLyoqXG4gKiBQaW5zIE5vZGUuanMgYW5kIHRoZSBsYXRlc3QgQnVuIGFuZCAod2hlbiBmbm94LnRvbWwgZXhpc3RzKSBmbm94IHZlcnNpb25zLiBPbmx5IHRoZSBjaGFuZ2VkIHBpblxuICogbGluZXMgYXJlIGVkaXRlZCBpbiBwbGFjZTogcmUtc2VyaWFsaXppbmcgdGhlIHBhcnNlZCBUT01MIHdvdWxkIGRyb3AgZXZlcnkgY29tbWVudCBhbmQgY29sbGFwc2VcbiAqIG11bHRpLWxpbmUgc3RyaW5ncyAoZS5nLiBtaXNlIHRhc2sgc2NyaXB0cykgaW4gdGhlIHJlc3Qgb2YgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1pc2VUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTWlzZVRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWlzZVRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRNaXNlVG9tbChtaXNlVG9tbFBhdGgpO1xuICAgIC8vIEEgcGFyc2UgZmFpbHVyZSBtdXN0IGFib3J0OiBlZGl0aW5nIHBpbnMgaW4gYSBicm9rZW4gbWlzZS50b21sIHdvdWxkIGhpZGUgdGhlIGJyZWFrYWdlLlxuICAgIGNvbnN0IHRvb2xzID0gKEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sKS50b29scyA/PyB7fTtcblxuICAgIGNvbnN0IHBpbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgLy8gRW5zdXJlIE5vZGUuanMgaXMgYWx3YXlzIHBpbm5lZDogZ2VuZXJhdGVkIGhvb2tzIGFuZCBDSSBydW4gYG1pc2UgaW5zdGFsbGAsIGFuZCBhbiB1bnBpbm5lZFxuICAgICAgLy8gTm9kZSB3b3VsZCBjb21lIGZyb20gd2hhdGV2ZXIgaGFwcGVucyB0byBiZSBvbiBQQVRILlxuICAgICAgLy8gTGlmdC10aGVuLXBpbjogdGhlIGxpZnQgb25seSB0b3VjaGVzIGV4YWN0IHBpbnMgYW5kIHRoZSBwaW4gb25seSB0b3VjaGVzIHNlbGVjdG9ycywgc29cbiAgICAgIC8vIG9yZGVyaW5nIHRoZSBsaWZ0IGZpcnN0IGF2b2lkcyByZXNvbHZpbmcgYG1pc2UgbGF0ZXN0IG5vZGVAbHRzYCB0d2ljZSBmb3IgdW5waW5uZWQgcmVwb3MuXG4gICAgICBub2RlOiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgICAnbm9kZScsXG4gICAgICAgIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3IoJ25vZGVAbHRzJywgdG9vbHMubm9kZSwgY29uZmlnLmRpclBhdGgpLFxuICAgICAgICBjb25maWcuZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGJ1bjogcGluTGF0ZXN0VG9vbFZlcnNpb24oJ2J1bicsIHRvb2xzLmJ1biwgY29uZmlnLmRpclBhdGgpLFxuICAgIH07XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICBwaW5zLmZub3ggPSBwaW5MYXRlc3RUb29sVmVyc2lvbignZm5veCcsIHRvb2xzLmZub3gsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBbdG9vbCwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMocGlucykpIHtcbiAgICAgIGlmICh2ZXJzaW9uID09PSB0b29sc1t0b29sXSkgY29udGludWU7XG4gICAgICBhc3NlcnQub2sodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnLCBgVGhlIHJlc29sdmVkICR7dG9vbH0gcGluIG11c3QgYmUgYSB2ZXJzaW9uIHN0cmluZy5gKTtcbiAgICAgIG5ld0NvbnRlbnQgPSBzZXRUb29sVmVyc2lvbihuZXdDb250ZW50LCB0b29sLCB2ZXJzaW9uKTtcbiAgICAgIC8vIEEgbGluZSBlZGl0IGJyZWFrcyBwaW5zIHdyaXR0ZW4gaW4gYW55IG90aGVyIGZvcm0gKGEgbXVsdGktbGluZSB2YWx1ZSwgYSBgdG9vbHMuYnVuYFxuICAgICAgLy8gZG90dGVkIGtleSwgYSBgW3Rvb2xzLmJ1bl1gIHN1Yi10YWJsZSksIHNvIG5ldmVyIHdyaXRlIGEgcmVzdWx0IHRoZSBwYXJzZXIgZGlzYWdyZWVzIHdpdGguXG4gICAgICBhc3NlcnQub2soXG4gICAgICAgIHBhcnNlVG9vbHMobmV3Q29udGVudCk/Llt0b29sXSA9PT0gdmVyc2lvbixcbiAgICAgICAgYFdyaXRlIHRoZSAke3Rvb2x9IHBpbiBpbiBtaXNlLnRvbWwgYXMgb25lIFxcYCR7dG9vbH0gPSAuLi5cXGAgbGluZSB1bmRlciBbdG9vbHNdLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUobWlzZVRvbWxQYXRoLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldFRvb2xWZXJzaW9uKGNvbnRlbnQ6IHN0cmluZywgdG9vbDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwaW4gPSBgJHt0b29sfSA9IFwiJHt2ZXJzaW9ufVwiYDtcbiAgY29uc3Qgc2VjdGlvbiA9IC9eXFxbdG9vbHNcXF0oPyFbXlxcbl0pKD86XFxuKD8hXFxbKS4qKSovbXUuZXhlYyhjb250ZW50KT8uWzBdO1xuICBpZiAoc2VjdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYCR7Y29udGVudCAmJiBgJHtjb250ZW50LnRyaW1FbmQoKX1cXG5cXG5gfVt0b29sc11cXG4ke3Bpbn1cXG5gO1xuXG4gIGNvbnN0IHBpblBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHt0b29sfSA9IC4qPyhcXFxccyojLiopPyRgLCAnbXUnKTtcbiAgLy8gQmxhbmsgbGluZXMgYW5kIGNvbW1lbnRzIHRoYXQgZW5kIHRoZSBzZWN0aW9uIGxlYWQgdGhlIG5leHQgdGFibGUsIHNvIGEgbmV3IHBpbiBnb2VzIGFib3ZlIHRoZW0uXG4gIGNvbnN0IHBpbnNFbmQgPSAvKD86XFxuW1xcdCBdKig/OiMuKik/KSokL3UuZXhlYyhzZWN0aW9uKT8uaW5kZXggPz8gc2VjdGlvbi5sZW5ndGg7XG4gIGNvbnN0IG5ld1NlY3Rpb24gPSBwaW5QYXR0ZXJuLnRlc3Qoc2VjdGlvbilcbiAgICA/IHNlY3Rpb24ucmVwbGFjZShwaW5QYXR0ZXJuLCBgJHtwaW59JDFgKVxuICAgIDogYCR7c2VjdGlvbi5zbGljZSgwLCBwaW5zRW5kKX1cXG4ke3Bpbn0ke3NlY3Rpb24uc2xpY2UocGluc0VuZCl9YDtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShzZWN0aW9uLCAoKSA9PiBuZXdTZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb29scyhjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBNaXNlVG9tbCkudG9vbHM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIFVwZGF0ZXMgdG8gdGhlIGxhdGVzdCByZWxlYXNlIGFjcm9zcyBtYWpvciB2ZXJzaW9ucyB3aXRob3V0IGRvd25ncmFkaW5nIGV4aXN0aW5nIGV4YWN0IHBpbnMuICovXG5mdW5jdGlvbiBwaW5MYXRlc3RUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIC8vIFJlc29sdmUgaW5kZXBlbmRlbnRseSBvZiB0aGUgdGFyZ2V0J3MgdHJ1c3Qgc3RhdGUgYW5kIHRvb2wgYWxpYXNlcy5cbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWyctLW5vLWNvbmZpZycsICdsYXRlc3QnLCB0b29sXSwgY3dkKTtcbiAgaWYgKCFzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSkgcmV0dXJuIHZlcnNpb24gPz8gJ2xhdGVzdCc7XG4gIC8vIEEgY2FjaGVkIHJlbGVhc2UgbGlzdGluZyBjYW4gbGFnIGJlaGluZCBhbm90aGVyIG1hY2hpbmUgdGhhdCBhbHJlYWR5IHVwZGF0ZWQgdGhlIHBpbi5cbiAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJiBzZW12ZXIudmFsaWQodmVyc2lvbikgJiYgc2VtdmVyLmd0KHZlcnNpb24sIHJlc29sdmVkVmVyc2lvbilcbiAgICA/IHZlcnNpb25cbiAgICA6IHJlc29sdmVkVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBMaWZ0cyBhbiBleGFjdCB0b29sIHBpbiBiZWxvdyB0aGUgbGF0ZXN0IHJlc29sdmFibGUgdmVyc2lvbiDigJQgd2l0aGluIHRoZSBTQU1FIG1ham9yIOKAlCB0byB0aGF0XG4gKiB2ZXJzaW9uIChOb2RlLmpzIHJlc29sdmVzIGFnYWluc3QgdGhlIGxhdGVzdCBMVFMpOiB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmUgc3RhbmRhcmQgdHJhY2tzIHRoZVxuICogY3VycmVudCB0b29sY2hhaW4gYWNyb3NzIHJlcG9zaXRvcmllcyBhbmQgUmVub3ZhdGUgZG9lcyBub3QgbWFuYWdlIG1pc2UudG9tbCBwaW5zLCBzb1xuICogcGF0Y2gvbWlub3IgZHJpZnQgKGUuZy4gbm9kZSAyNC4xNi4wIHZzIDI0LjE4LjApIG5ldmVyIHNlbGYtaGVhbHMuIEEgcGluXG4gKiBvbiBhbiBvbGRlciBtYWpvciBpcyBhIGRlbGliZXJhdGUgY29tcGF0aWJpbGl0eSBjaG9pY2UgYW5kIGlzIGtlcHQsIGFzIGFyZSBub24tZXhhY3QgYW5kXG4gKiBub24tc3RyaW5nIGZvcm1zLiBXaGVuIG1pc2UgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgcGluIGlzIGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3Ioc2VsZWN0b3I6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc2VtdmVyLnZhbGlkKHZlcnNpb24pKSByZXR1cm4gdmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbWlzZScsIFsnbGF0ZXN0Jywgc2VsZWN0b3JdLCBjd2QpO1xuICByZXR1cm4gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pICYmXG4gICAgc2VtdmVyLm1ham9yKGxhdGVzdFZlcnNpb24pID09PSBzZW12ZXIubWFqb3IodmVyc2lvbikgJiZcbiAgICBzZW12ZXIubHQodmVyc2lvbiwgbGF0ZXN0VmVyc2lvbilcbiAgICA/IGxhdGVzdFZlcnNpb25cbiAgICA6IHZlcnNpb247XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW4gdW5waW5uZWQgc2VsZWN0b3IgKGBsYXRlc3RgLCBhIHJhbmdlIHN1Y2ggYXMgXCIyNFwiLCBhbiBhbGlhcywgb3IgYSBtaXNzaW5nIGVudHJ5KVxuICogd2l0aCB0aGUgbmV3ZXN0IGNvbmNyZXRlIHZlcnNpb24gbWlzZSByZXNvbHZlcyBmb3IgaXQsIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlXG4gKiBzdGFuZGFyZCByZXF1aXJlcyBjb25jcmV0ZSBwaW5zOiBDSSBpbnN0YWxscyB3aGF0ZXZlciBhbiB1bnBpbm5lZCBzZWxlY3RvciByZXNvbHZlcyB0byBhdCBydW5cbiAqIHRpbWUsIHNvIGJ1aWxkcyBkcmlmdCBhY3Jvc3MgcnVucy4gRXhhY3QgdmVyc2lvbnMgYXJlIGtlcHQgYXMtaXMsIGFuZCBub24tc3RyaW5nIGZvcm1zIChtaXNlJ3NcbiAqIGFycmF5IGFuZCBgeyB2ZXJzaW9uID0gXCLigKZcIiB9YCBmb3JtcykgYXJlIHVzZXItbWFuYWdlZCBhbmQgbGVmdCB1bnRvdWNoZWQuIFdoZW4gbWlzZSBpc1xuICogdW5hdmFpbGFibGUgb3IgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgaXMga2VwdCDigJRcbiAqIGFuIHVucGlubmVkIHRvb2wgaXMgYmV0dGVyIHRoYW4gYSBicm9rZW4gY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcGluQ29uY3JldGVUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBzZW12ZXIudmFsaWQodmVyc2lvbikpKSByZXR1cm4gdmVyc2lvbjtcbiAgLy8gTm9ybWFsaXplIHNlbGVjdG9yIGZvcm1zIGBtaXNlIGxhdGVzdGAgY2Fubm90IHJlc29sdmUgZXZlbiB0aG91Z2ggbWlzZSBjb25maWd1cmF0aW9uIGFjY2VwdHNcbiAgLy8gdGhlbTogYHByZWZpeDoyNGAgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgd2hpbGUgYDI0YCByZXNvbHZlcywgYW5kIGBsdHMvKmAgeWllbGRzIGVtcHR5IG91dHB1dFxuICAvLyB3aGlsZSBgbHRzYCByZXNvbHZlcy4gTW9kaWZpZXIgc2VsZWN0b3JzIHN1Y2ggYXMgYHN1Yi0yOmx0c2Agc3RheSB1bnJlc29sdmFibGUgYW5kIGZhbGwgYmFja1xuICAvLyB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVsb3cuXG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnID8gdmVyc2lvbi5yZXBsYWNlKC9ecHJlZml4Oi91LCAnJykucmVwbGFjZSgvXFwvXFwqJC91LCAnJykgOiB1bmRlZmluZWQ7XG4gIC8vIFdpdGggbm8gbWVhbmluZ2Z1bCBzZWxlY3RvciwgTm9kZS5qcyBwaW5zIHRvIHRoZSBsYXRlc3QgTFRTIChtYXRjaGluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzJ1xuICAvLyBgbHRzLypgIGZhbGxiYWNrKSByYXRoZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UuXG4gIGNvbnN0IGRlZmF1bHRTZWxlY3RvciA9IHRvb2wgPT09ICdub2RlJyA/ICdub2RlQGx0cycgOiB0b29sO1xuICBjb25zdCBzZWxlY3RvciA9IHJhbmdlICYmIHJhbmdlICE9PSAnbGF0ZXN0JyA/IGAke3Rvb2x9QCR7cmFuZ2V9YCA6IGRlZmF1bHRTZWxlY3RvcjtcbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSA/IHJlc29sdmVkVmVyc2lvbiA6ICh2ZXJzaW9uID8/ICdsYXRlc3QnKTtcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUb21sKG1pc2VUb21sUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKG1pc2VUb21sUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IGEgcmVwb3NpdG9yeSB3aXRob3V0IG1pc2UudG9tbCBzdGFydHMgZnJvbSBhbiBlbXB0eSBjb25maWd1cmF0aW9uOyBhbiB1bnJlYWRhYmxlIGZpbGVcbiAgICAvLyAoZS5nLiBwZXJtaXNzaW9ucykgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggZ2VuZXJhdGVkIHNldHRpbmdzLlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuICcnO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcsIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4uL3V0aWxzL3ByaXZhdGVQYWNrYWdlcy5qcyc7XG5cbi8qKlxuICogQnVuIHJlYWRzIHJlZ2lzdHJ5IHNjb3BlIG1hcHBpbmdzIGZyb20gYSBwaHlzaWNhbCByZXBvc2l0b3J5IC5ucG1yYyBkdXJpbmcgUmVub3ZhdGUgYXJ0aWZhY3RcbiAqIHVwZGF0ZXM7IFJlbm92YXRlJ3MgbnBtcmMgc2V0dGluZyBpcyB1c2VkIG9ubHkgYnkgaXRzIGRhdGFzb3VyY2UgbGF5ZXIuIEtlZXAgdGhlIG5vbi1zZWNyZXRcbiAqIG1hcHBpbmcgaW4gcmVwb3NpdG9yaWVzIHRoYXQgcmVzb2x2ZSBwcml2YXRlIHBhY2thZ2VzLCB3aGlsZSBhdXRoZW50aWNhdGlvbiByZW1haW5zIGluIHRoZVxuICogZGV2ZWxvcGVyJ3Mgfi8ubnBtcmMgbG9jYWxseSBhbmQgaW4gdGVtcG9yYXJ5IENJIG9yIE1lbmQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvQXV0aG9yID0gY29uZmlnc1swXT8ucmVwb0F1dGhvcjtcbiAgaWYgKHJlcG9BdXRob3IgIT09ICdXaWxsQm9vc3RlcicgJiYgcmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuXG4gIGNvbnN0IG5wbXJjUGF0aHMgPSBuZXcgU2V0KGNvbmZpZ3MubWFwKChjb25maWcpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5ucG1yYycpKSk7XG4gIGNvbnN0IHJvb3RDb25maWcgPSBjb25maWdzLmZpbmQoKGNvbmZpZykgPT4gY29uZmlnLmlzUm9vdCk7XG4gIGlmIChyb290Q29uZmlnICYmIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhyb290Q29uZmlnKSkge1xuICAgIGNvbnN0IHJvb3ROcG1yY1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJyk7XG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShyb290TnBtcmNQYXRoLCBwcml2YXRlUmVnaXN0cnlTY29wZU1hcHBpbmcpO1xuICAgIG5wbXJjUGF0aHMuZGVsZXRlKHJvb3ROcG1yY1BhdGgpO1xuICB9XG5cbiAgZm9yIChjb25zdCBucG1yY1BhdGggb2YgbnBtcmNQYXRocykgYXdhaXQgcmVtb3ZlTnBtcmMobnBtcmNQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTnBtcmMobnBtcmNQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCEoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQobnBtcmNQYXRoKS5jYXRjaCgoKSA9PiB7fSkpKSByZXR1cm47XG4gIGlmIChhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQobnBtcmNQYXRoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBub24tY2Fub25pY2FsIHJlcG9zaXRvcnkgbnBtcmMgJHtucG1yY1BhdGh9LmApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5pbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhcmdldDogJ2JyYW5jaCc7XG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJztcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBpbmNsdWRlOiBzdHJpbmdbXTtcbiAgICAgIGV4Y2x1ZGU6IHN0cmluZ1tdO1xuICAgIH07XG4gIH07XG4gIHJ1bGVzOiAoXG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdkZWxldGlvbicgfCAnbm9uX2Zhc3RfZm9yd2FyZCc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogYm9vbGVhbjtcbiAgICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczoge1xuICAgICAgICAgICAgY29udGV4dDogc3RyaW5nO1xuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IG51bWJlcjtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogbnVtYmVyO1xuICAgICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW107XG4gICAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGJvb2xlYW47XG4gICAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddO1xuICAgICAgICB9O1xuICAgICAgfVxuICApW107XG4gIGJ5cGFzc19hY3RvcnM6IHtcbiAgICBhY3Rvcl9pZDogbnVtYmVyO1xuICAgIGFjdG9yX3R5cGU6ICdUZWFtJztcbiAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCc7XG4gIH1bXTtcbn1cblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBzb3VyY2VfdHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUiA9IHtcbiAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxufSBhcyBjb25zdDtcblxuY29uc3QgR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQgPSAxNV8zNjg7XG5cbmNvbnN0IFBST1RFQ1RfTUFJTl9SVUxFU0VUOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQgPSB7XG4gIG5hbWU6ICdQcm90ZWN0IG1haW4nLFxuICB0YXJnZXQ6ICdicmFuY2gnLFxuICBlbmZvcmNlbWVudDogJ2FjdGl2ZScsXG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgZXhjbHVkZTogW10sXG4gICAgICBpbmNsdWRlOiBbJ35ERUZBVUxUX0JSQU5DSCddLFxuICAgIH0sXG4gIH0sXG4gIHJ1bGVzOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2RlbGV0aW9uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBmYWxzZSxcbiAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiB0cnVlLFxuICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3Rlc3QgLyB0ZXN0JyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICdzZW1hbnRpYy1wciAvIHNlbWFudGljLXByJyxcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdub25fZmFzdF9mb3J3YXJkJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiAwLFxuICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld2VyczogW10sXG4gICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGZhbHNlLFxuICAgICAgICByZXF1aXJlX2xhc3RfcHVzaF9hcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogZmFsc2UsXG4gICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgYnlwYXNzX2FjdG9yczogW1xuICAgIHtcbiAgICAgIGFjdG9yX2lkOiAxN183NzdfNDk1LFxuICAgICAgYWN0b3JfdHlwZTogJ1RlYW0nLFxuICAgICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnLFxuICAgIH0sXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInKSByZXR1cm47XG4gICAgLy8gVGhlIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGhvc3RzIHdvcmtmbG93X2NhbGwgZGVmaW5pdGlvbnMsIHNvIHRoZVxuICAgIC8vIFByb3RlY3QgbWFpbiBydWxlc2V0IHdvdWxkIHJlcXVpcmUgdGVzdC9zZW1hbnRpYy1wciBjaGVja3MgdGhhdCBuZXZlciBydW4gdGhlcmUuXG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKGNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWcpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBSZXBvc2l0b3J5IHJ1bGVzZXRzIHJlcXVpcmUgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgd2hpY2ggbG9jYWwgcnVuc1xuICAgICAgLy8gbWF5IG5vdCBoYXZlIGV2ZW4gd2hlbiBmaWxlLWdlbmVyYXRpb24gYW5kIHB1c2hlcyBhcmUgYWxsb3dlZC5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIGNvbnN0IHJ1bGVzZXQgPSBzdHJ1Y3R1cmVkQ2xvbmUoUFJPVEVDVF9NQUlOX1JVTEVTRVQpO1xuICBpZiAoY29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXNldC5ydWxlcykge1xuICAgICAgaWYgKHJ1bGUudHlwZSAhPT0gJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnKSBjb250aW51ZTtcbiAgICAgIC8vIFRoZSBjb250ZXh0IGlzIGA8Y2FsbGVyIGpvYiBpZD4gLyA8cmV1c2FibGUgam9iIGlkPmAgb2YgdGhlIHdiZnktZ2VuZXJhdGVkIHRlc3QtcnVzdC55bWwuXG4gICAgICBydWxlLnBhcmFtZXRlcnMucmVxdWlyZWRfc3RhdHVzX2NoZWNrcy5wdXNoKHtcbiAgICAgICAgY29udGV4dDogJ3Rlc3QtcnVzdCAvIHRlc3QtcnVzdCcsXG4gICAgICAgIGludGVncmF0aW9uX2lkOiBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnVsZXNldDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBzZXJ0UHJvdGVjdE1haW5SdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldCA9IGF3YWl0IGZpbmRSZXBvc2l0b3J5UnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgcnVsZXNldC5uYW1lKTtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0SWQgPSBleGlzdGluZ1J1bGVzZXQ/LmlkO1xuXG4gIGF3YWl0IHdpdGhSZXRyeShcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoZXhpc3RpbmdSdWxlc2V0SWQpIHtcbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3tydWxlc2V0X2lkfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHJ1bGVzZXRfaWQ6IGV4aXN0aW5nUnVsZXNldElkLFxuICAgICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIC4uLnJ1bGVzZXQsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldE5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3aXRoUmV0cnkoXG4gICAgKCkgPT5cbiAgICAgIG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cycsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICAgIGluY2x1ZGVzX3BhcmVudHM6IGZhbHNlLFxuICAgICAgICB0YXJnZXRzOiAnYnJhbmNoJyxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pLFxuICAgIHtcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgfVxuICApO1xuICBjb25zdCBydWxlc2V0cyA9IHJlc3BvbnNlLmRhdGE7XG4gIGlmICghQXJyYXkuaXNBcnJheShydWxlc2V0cykpIHJldHVybjtcbiAgcmV0dXJuIHJ1bGVzZXRzLmZpbmQoKHJ1bGVzZXQpID0+IHJ1bGVzZXQubmFtZSA9PT0gcnVsZXNldE5hbWUgJiYgcnVsZXNldC5zb3VyY2VfdHlwZSA9PT0gJ1JlcG9zaXRvcnknKTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuLCBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvciB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cEdpdEh1YlNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVwb3NpdG9yeSBzZXR0aW5ncyBuZWVkIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHVubGlrZSBmaWxlIGdlbmVyYXRpb24uXG4gICAgICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc193aWtpOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc19wcm9qZWN0czogZmFsc2UsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gTG9jYWwgd2JmeSBydW5zIG9mdGVuIGhhdmUgcHVzaCBwZXJtaXNzaW9uIHdpdGhvdXQgYWRtaW4gcGVybWlzc2lvbi5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cEdpdEh1YlNldHRpbmdzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBkaXNhYmxlRGlzY3Vzc2lvbnMob2N0b2tpdCwgb3duZXIsIHJlcG8pLCB7XG4gICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJTZXR0aW5nc0Vycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgZGlzYWJsaW5nIEdpdEh1YiBEaXNjdXNzaW9ucyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2FibGVEaXNjdXNzaW9ucyhvY3Rva2l0OiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRPY3Rva2l0Piwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9zaXRvcnlSZXNwb25zZSA9IGF3YWl0IG9jdG9raXQuZ3JhcGhxbDx7IHJlcG9zaXRvcnk/OiB7IGlkPzogc3RyaW5nIH0gfT4oXG4gICAgYHF1ZXJ5KCRvd25lcjogU3RyaW5nISwgJHJlcG86IFN0cmluZyEpIHtcbiAgICAgIHJlcG9zaXRvcnkob3duZXI6ICRvd25lciwgbmFtZTogJHJlcG8pIHsgaWQgfVxuICAgIH1gLFxuICAgIHsgb3duZXIsIHJlcG8gfVxuICApO1xuICBjb25zdCByZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5UmVzcG9uc2UucmVwb3NpdG9yeT8uaWQ7XG4gIGlmICghcmVwb3NpdG9yeUlkKSByZXR1cm47XG4gIGF3YWl0IG9jdG9raXQuZ3JhcGhxbChcbiAgICBgbXV0YXRpb24oJGlucHV0OiBVcGRhdGVSZXBvc2l0b3J5SW5wdXQhKSB7XG4gICAgICB1cGRhdGVSZXBvc2l0b3J5KGlucHV0OiAkaW5wdXQpIHsgcmVwb3NpdG9yeSB7IGlkIH0gfVxuICAgIH1gLFxuICAgIHsgaW5wdXQ6IHsgcmVwb3NpdG9yeUlkLCBoYXNEaXNjdXNzaW9uc0VuYWJsZWQ6IGZhbHNlIH0gfVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgcmV0dXJuIHRydWU7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCAhKCdlcnJvcnMnIGluIGVycm9yKSB8fCAhQXJyYXkuaXNBcnJheShlcnJvci5lcnJvcnMpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlcnJvci5lcnJvcnMuc29tZShcbiAgICAoZ3JhcGhxbEVycm9yOiB1bmtub3duKSA9PlxuICAgICAgISFncmFwaHFsRXJyb3IgJiZcbiAgICAgIHR5cGVvZiBncmFwaHFsRXJyb3IgPT09ICdvYmplY3QnICYmXG4gICAgICAndHlwZScgaW4gZ3JhcGhxbEVycm9yICYmXG4gICAgICBbJ0ZPUkJJRERFTicsICdJTlNVRkZJQ0lFTlRfU0NPUEVTJywgJ05PVF9GT1VORCddLmluY2x1ZGVzKGdyYXBocWxFcnJvci50eXBlIGFzIHN0cmluZylcbiAgKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8vIFRoZSBgL3NyY2AgZW50cnkgKGEgZGVjbGFyZWQgZXhwb3J0KSBsZXRzIHRoaXMgd29ya3NwYWNlIGNvbnN1bWVyIHVzZSB0aGUgc291cmNlcyB3aXRob3V0XG4vLyBidWlsZGluZyBzaGFyZWQtbGliIGZpcnN0LCBhcyBldmVyeSBvdGhlciBpbXBvcnQgb2YgaXQgaW4gdGhpcyBwYWNrYWdlIGRvZXMuXG5pbXBvcnQge1xuICBCVUdfSVNTVUVfU0VDVElPTlMsXG4gIENIQU5HRV9JU1NVRV9TRUNUSU9OUyxcbiAgUFVMTF9SRVFVRVNUX1NFQ1RJT05TLFxuICByZW5kZXJTZWN0aW9uVGVtcGxhdGUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGdldERlZmF1bHRQcm9zZUxhbmd1YWdlLCBMQU5HVUFHRV9CT1VORF9URVhUX0VYQ0VQVElPTiB9IGZyb20gJy4uL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBydW5BbGxJblBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGdlbmVyYXRlVGVtcGxhdGVzID0gKHByTGFuZ3VhZ2VOb3RlOiBzdHJpbmcsIGlzc3VlTGFuZ3VhZ2VOb3RlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+ICh7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG48IS0tIFdyaXRlIGZvciBhIHJldmlld2VyIHdobyBoYXMgbm90IGZvbGxvd2VkIHRoZSB3b3JrLiR7cHJMYW5ndWFnZU5vdGV9IFNjYWxlIGVhY2ggc2VjdGlvbiB0byB0aGUgY2hhbmdlOiBhIHNlbnRlbmNlIGZvciBhIHNtYWxsIGNoYW5nZSwgbnVtYmVyZWQgc3Vic2VjdGlvbnMgZm9yIGEgbGFyZ2Ugb25lLiBEZWxldGUgdGhpcyBjb21tZW50IGFuZCB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYmVsb3cuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShQVUxMX1JFUVVFU1RfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9idWcubWQnOiBgXG4tLS1cbm5hbWU6IEJ1ZyAvIFByb2JsZW1cbmFib3V0OiBTb21ldGhpbmcgYmVoYXZlcyB3cm9uZ2x5XG50aXRsZTogJ2ZpeDogJ1xubGFiZWxzOiAndDogZml4IDpidWc6J1xuLS0tXG5cbjwhLS0gS2VlcCBQcm9ibGVtIGFuZCBQcm9wb3NhbDsgZGVsZXRlIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuJHtpc3N1ZUxhbmd1YWdlTm90ZX0gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoQlVHX0lTU1VFX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvY2hhbmdlLm1kJzogYFxuLS0tXG5uYW1lOiBDaGFuZ2UgLyBGZWF0dXJlXG5hYm91dDogUHJvcG9zZSBhIGNoYW5nZSB0aGF0IGEgdGhpcmQgcGFydHkgY291bGQgaW1wbGVtZW50IHdpdGhvdXQgYXNraW5nIGEgcXVlc3Rpb25cbnRpdGxlOiAnZmVhdDogJ1xubGFiZWxzOiAndDogZmVhdCA6c3BhcmtsZXM6J1xuLS0tXG5cbjwhLS0gS2VlcCB0aGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgZm9yIGFueSBjaGFuZ2UgYW5kIGFkZCB0aGUgb3RoZXJzIGFzIHRoZSBjaGFuZ2UgZ3Jvd3M7IGEgbGFyZ2UgY2hhbmdlIGZpbGxzIGFsbCBvZiB0aGVtIChzcGVjLWJvb3N0ZXIgcmV2aWV3cyBhZ2FpbnN0IHRoaXMgbGlzdCkuJHtpc3N1ZUxhbmd1YWdlTm90ZX0gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoQ0hBTkdFX0lTU1VFX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvY29uZmlnLnltbCc6ICdibGFua19pc3N1ZXNfZW5hYmxlZDogdHJ1ZScsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRlbXBsYXRlcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBmaWxlcywgc28gYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3QgY3JlYXRlIHRoZW0uXG4gICAgaWYgKCFjb25maWcuaXNSb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgW3ByTGFuZ3VhZ2VOb3RlLCBpc3N1ZUxhbmd1YWdlTm90ZV0gPVxuICAgICAgZ2V0RGVmYXVsdFByb3NlTGFuZ3VhZ2UoY29uZmlnKSA9PT0gJ0phcGFuZXNlJ1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIGAgV3JpdGUgdGhlIHRpdGxlIGluIEVuZ2xpc2ggYW5kIHRoZSBib2R5IGluIEphcGFuZXNlLCAke0xBTkdVQUdFX0JPVU5EX1RFWFRfRVhDRVBUSU9OfSwga2VlcGluZyB0aGUgaGVhZGluZ3MgYXMgdGhleSBhcmUuYCxcbiAgICAgICAgICAgIGAgV3JpdGUgaW4gSmFwYW5lc2UsICR7TEFOR1VBR0VfQk9VTkRfVEVYVF9FWENFUFRJT059LCBrZWVwaW5nIHRoZSBoZWFkaW5ncyBhcyB0aGV5IGFyZS5gLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXG4gICAgICAgICAgICBgIFdyaXRlIGluIEVuZ2xpc2gsICR7TEFOR1VBR0VfQk9VTkRfVEVYVF9FWENFUFRJT059LmAsXG4gICAgICAgICAgICBgIFdyaXRlIGluIEVuZ2xpc2gsICR7TEFOR1VBR0VfQk9VTkRfVEVYVF9FWENFUFRJT059LmAsXG4gICAgICAgICAgXTtcbiAgICBhd2FpdCBydW5BbGxJblBvb2woXG4gICAgICBPYmplY3QuZW50cmllcyhnZW5lcmF0ZVRlbXBsYXRlcyhwckxhbmd1YWdlTm90ZSwgaXNzdWVMYW5ndWFnZU5vdGUpKS5tYXAoKFtmaWxlTmFtZSwgY29udGVudF0pID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yLCBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeENoYWtyYVRvYXN0ZXIgfSBmcm9tICcuL2ZpeGVycy9jaGFrcmFUb2FzdGVyLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHtcbiAgZ2VuZXJhdGVCdW5maWdUb21sLFxuICBoYXNDdXJyZW50QnVuUmVsZWFzZUFnZUV4Y2x1ZGVzLFxuICByZWFkQnVuR2xvYmFsU3RvcmUsXG4gIHJlc29sdmVCdW5HbG9iYWxTdG9yZSxcbn0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRm5veFRvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvZm5veFRvbWwuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcywgcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nbG9iYWxSZWxlYXNlQWdlR2F0ZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2sgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiwgZ2V0V29ya3NwYWNlUGFja2FnZURpcnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGZtdENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGZtdENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94bGludENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGxpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UmFpbHdheWlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lLCByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVXNlckFnZW50Q29uZmlncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy91c2VyQWdlbnRDb25maWdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZW5zdXJlV2JFbnZEZWZpbml0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93YkVudi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU1pc2VUb21sLCBtaW5pbXVtQnVuVmVyc2lvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9taXNlVG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9ucG1yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlVHlwZVNjcmlwdEFwaSB9IGZyb20gJy4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBnZXRXYmZ5VmVyc2lvbiwgZ2V0V2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyB9IGZyb20gJy4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbi8qKlxuICogQXBwbGllcyBvbmx5IHRoZSBnbG9iYWwgcmVsZWFzZS1hZ2UgZ2F0ZSwgd2l0aG91dCB0b3VjaGluZyBhbnkgcmVwb3NpdG9yeS4gU3BlbGxlZCBvdXQgaW4gZnVsbFxuICogcmF0aGVyIHRoYW4gc2hvcnRlbmVkIChlLmcuIGBnYXRlYCkgYmVjYXVzZSB0aGUgZGVmYXVsdCBjb21tYW5kIHRha2VzIHBvc2l0aW9uYWwgcGF0aHM6IGEgc2hvcnRcbiAqIG5hbWUgd291bGQgc3dhbGxvdyBhIGRpcmVjdG9yeSB0aGF0IGhhcHBlbnMgdG8gc2hhcmUgaXQuXG4gKi9cbmNvbnN0IGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kID0gJ2FwcGx5LXJlbGVhc2UtYWdlLWdhdGUnO1xuLyoqIFNhbWUgbmFtaW5nIHJhdGlvbmFsZSBhcyBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZC4gKi9cbmNvbnN0IGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQgPSAnZ2VuZXJhdGUtdXNlci1hZ2VudC1jb25maWdzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZChcbiAgICAgIGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kLFxuICAgICAgXCJBcHBseSBvbmx5IHRoZSBvcmdhbml6YXRpb24ncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGlzIG1hY2hpbmUncyBnbG9iYWwgcGFja2FnZS1tYW5hZ2VyIGNvbmZpZ3NcIlxuICAgIClcbiAgICAuY29tbWFuZChcbiAgICAgIGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQsXG4gICAgICBcIk92ZXJ3cml0ZSB0aGlzIHVzZXIncyBhZ2VudCBpbnN0cnVjdGlvbiBmaWxlcyAofi8uY29kZXgvQUdFTlRTLm1kLCB+Ly5jbGF1ZGUvQ0xBVURFLm1kLCB+Ly5nZW1pbmkvR0VNSU5JLm1kKSB3aXRoIHRoZSBvcmdhbml6YXRpb24ncyBmaXhlZCBjb250ZW50IGFuZCBtZXJnZSB0aGUgb3JnYW5pemF0aW9uJ3Mgc2V0dGluZ3MgaW50byB+Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbiBhbmQgfi8uZ2VtaW5pL3NldHRpbmdzLmpzb25cIlxuICAgIClcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZm9yY2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdBcHBseSB3YmZ5IGV2ZW4gd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IHJlY29yZHMgdGhpcyB3YmZ5IHZlcnNpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2YnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdTa2lwIGFkZGluZyBtYW5hZ2VkIGRlcGVuZGVuY2llcyBhbmQgdGhlIGxpbmtlciBwcm9iZSAodGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVmcmVzaGluZyB0aGUgbG9ja2ZpbGUgc3RpbGwgcnVucyknLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRXYmZ5VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcblxuICAvLyBEZWxpYmVyYXRlbHkgYmVmb3JlIHRoZSBCdW4gY2hlY2sgaW4gd2lsbGJvb3N0ZXJpZnlQYXRocygpOiB0aGUgZ2F0ZSBtdXN0IGJlIGFwcGxpYWJsZSBvbiBhXG4gIC8vIG1hY2hpbmUgd2hvc2UgQnVuIGlzIG91dGRhdGVkLCB3aGljaCBpcyBleGFjdGx5IGEgbWFjaGluZSB0aGF0IHN0aWxsIG5lZWRzIGdhdGluZy5cbiAgaWYgKGFyZ3YuX1swXSA9PT0gYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQpIHtcbiAgICBpZiAoIWVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpKSBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFyZ3YuX1swXSA9PT0gZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzQ29tbWFuZCkge1xuICAgIGlmICghKGF3YWl0IGdlbmVyYXRlVXNlckFnZW50Q29uZmlncygpKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBhd2FpdCB3aWxsYm9vc3RlcmlmeVBhdGhzKGFyZ3YucGF0aHMgYXMgc3RyaW5nW10sIGFyZ3Yuc2tpcERlcHMsIGFyZ3YuZm9yY2UpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIHNlcnZlciBzcGF3bmVkIGZvciBBU1QgcGFyc2luZyBrZWVwcyBhbiBvcGVuIElQQ1xuICAgIC8vIGNoYW5uZWwgdGhhdCB3b3VsZCBvdGhlcndpc2UgcHJldmVudCB0aGUgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgICBhd2FpdCBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpbGxib29zdGVyaWZ5UGF0aHMocGF0aHM6IHN0cmluZ1tdLCBza2lwRGVwczogYm9vbGVhbiwgZm9yY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gQmVmb3JlIGFueXRoaW5nIGVsc2Ug4oCUIGV2ZW4gdGhlIEJ1biBjaGVjayBiZWxvdzogdGhlIGRldmVsb3BlciBtYWNoaW5lJ3MgZ2xvYmFsXG4gIC8vIHBhY2thZ2UtbWFuYWdlciBjb25maWdzIG11c3QgcmVjZWl2ZSB0aGUgb3JnJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgb24gRVZFUlkgcnVuLFxuICAvLyBiZWNhdXNlIHRoZXkgYXJlIHdoYXQgZ3VhcmRzIGJyYW5kLW5ldyBsb2NhbCBwcm9qZWN0cyB0aGF0IGhhdmUgbm8gd2JmeS1nZW5lcmF0ZWQgcmVwb3NpdG9yeVxuICAvLyBjb25maWcgeWV0LCBhbmQgdGhhdCBwcm90ZWN0aW9uIG11c3Qgd29yayBiZWZvcmUgdGhlIHN1cHBvcnRlZC12ZXJzaW9uIGNoZWNrLlxuICBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKTtcblxuICAvLyB3YmZ5IG1hbmFnZXMgcmVwb3NpdG9yaWVzIHRocm91Z2ggQnVuICsgbWlzZSBhbmQgdXNlcyBCdW4gMS40IHJ1bnRpbWUgQVBJcy4gVGhlIHZlcnNpb24gZmxvb3JcbiAgLy8gYWxzbyBlbnN1cmVzIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgb3B0aW9ucyBwcm9kdWNlIHRoZSBpbnN0YWxsIGxheW91dCB3YmZ5IHZhbGlkYXRlcy4gSXRcbiAgLy8gc3RheXMgdW5jb25kaXRpb25hbCBldmVuIHRob3VnaCB0aGUgYWxyZWFkeS1hcHBsaWVkIGNoZWNrIGJlbG93IGNhbiBtYWtlIGEgcnVuIGEgbm8tb3A6IGFuXG4gIC8vIG91dGRhdGVkIEJ1biBpcyBhIGJyb2tlbiBlbnZpcm9ubWVudCB3YmZ5IG11c3QgcmVwb3J0LCBhbmQgaGlkaW5nIGl0IHdoZW5ldmVyIGV2ZXJ5IHBhdGhcbiAgLy8gaGFwcGVucyB0byBiZSBza2lwcGVkIHdvdWxkIHN1cmZhY2UgaXQgb25seSBsYXRlci5cbiAgY29uc3QgYnVuVmVyc2lvbiA9IEJ1bi52ZXJzaW9uO1xuICBpZiAoQnVuLnNlbXZlci5vcmRlcihidW5WZXJzaW9uLCBtaW5pbXVtQnVuVmVyc2lvbikgPCAwKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2JmeSByZXF1aXJlcyBCdW4gPj0gJHttaW5pbXVtQnVuVmVyc2lvbn0gKGZvdW5kICR7YnVuVmVyc2lvbn0pLiBVcGdyYWRlIEJ1biBhbmQgcmUtcnVuLmApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQSBgLWRpcnR5LWxvY2FsYCBsYWJlbCBpZGVudGlmaWVzIGFuIGVkaXRlZCBjaGVja291dCwgd2hvc2UgbmV4dCBidWlsZCBwcm9kdWNlcyBkaWZmZXJlbnQgZmlsZXNcbiAgLy8gdW5kZXIgdGhlIHNhbWUgbGFiZWwsIHNvIHN1Y2ggYSBydW4gaXMgbmV2ZXIgdHJlYXRlZCBhcyBhbHJlYWR5IGFwcGxpZWQuXG4gIGNvbnN0IHZlcnNpb25MYWJlbCA9IGdldFdiZnlWZXJzaW9uTGFiZWwoKTtcbiAgY29uc3Qgc2tpcHBhYmxlVmVyc2lvbkxhYmVsID1cbiAgICAhZm9yY2UgJiYgdmVyc2lvbkxhYmVsICYmICF2ZXJzaW9uTGFiZWwuZW5kc1dpdGgoJy1kaXJ0eS1sb2NhbCcpID8gdmVyc2lvbkxhYmVsIDogdW5kZWZpbmVkO1xuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGlucHV0RGlyUGF0aCBvZiBwYXRocykge1xuICAgIC8vIE5vcm1hbGl6ZSBvbmNlIGF0IHRoZSBDTEkgYm91bmRhcnkuIEdlbmVyYXRvcnMgdXNlIGRpclBhdGggZm9yIGN3ZCBhbmQgYmFzZW5hbWUgZGVjaXNpb25zO1xuICAgIC8vIGxlYXZpbmcgdGhlIHN1cHBvcnRlZCBkZWZhdWx0IGAuYCB1bnJlc29sdmVkIHdvdWxkIGdlbmVyYXRlIGFuIGludmFsaWQgcGFja2FnZSBuYW1lIG9mIGAuYC5cbiAgICBjb25zdCByb290RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShpbnB1dERpclBhdGgpO1xuICAgIC8vIENvbmZpbmUgZXZlcnkgZ2VuZXJhdGVkIGZpbGUgdG8gdGhpcyByZXBvc2l0b3J5IChzZWUgZnNVdGlsLmdlbmVyYXRlRmlsZSkuIFNldCBCRUZPUkUgYW55XG4gICAgLy8gZml4ZXIgd3JpdGVzLCBhbmQgcmVzZXQgb24gZXZlcnkgaXRlcmF0aW9uIHNvIGEgbXVsdGktcGF0aCBydW4gbmV2ZXIga2VlcHMgdGhlIHByZXZpb3VzIHJvb3QuXG4gICAgZnNVdGlsLnNldFJvb3REaXJQYXRoKGZzLmV4aXN0c1N5bmMocm9vdERpclBhdGgpID8gcm9vdERpclBhdGggOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gVGhlIGJhZGdlIHJlY29yZHMgdGhlIGJ1aWxkIHRoYXQgZ2VuZXJhdGVkIHRoZSByZXBvc2l0b3J5J3MgY29uZmlndXJhdGlvbiwgc28gdGhlIHNhbWUgYnVpbGRcbiAgICAvLyB3b3VsZCBvbmx5IHJld3JpdGUgd2hhdCBpcyBhbHJlYWR5IHRoZXJlLiBTa2lwcGluZyBpcyBhIGRlbGliZXJhdGUgdHJhZGU6IHRoZSBwYXJ0cyBvZiBhIHJ1blxuICAgIC8vIHRoYXQgZGVwZW5kIG9uIHN0YXRlIE9VVFNJREUgdGhlIHJlcG9zaXRvcnkgKEdpdEh1YiBzZXR0aW5ncywgZGVwZW5kZW5jeSB1cGRhdGVzLCB0aGUgZmV0Y2hlZFxuICAgIC8vIC5naXRpZ25vcmUpIGRvIGdldCBza2lwcGVkIHRvbywgd2hpY2ggaXMgd2hhdCAtLWZvcmNlIGlzIGZvci4gVGhlIHJlbGVhc2UtYWdlIGV4ZW1wdGlvbnMgYXJlXG4gICAgLy8gdGhlIGV4Y2VwdGlvbjogdGhleSBleHBpcmUgYnkgZGF0ZSwgYW5kIHJlc3RvcmluZyB0aGUgZ2F0ZSBtdXN0IG5vdCB3YWl0IGZvciBhIG5ldyBidWlsZC5cbiAgICBpZiAoXG4gICAgICBza2lwcGFibGVWZXJzaW9uTGFiZWwgJiZcbiAgICAgIChhd2FpdCByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwocm9vdERpclBhdGgpKSA9PT0gc2tpcHBhYmxlVmVyc2lvbkxhYmVsICYmXG4gICAgICBoYXNDdXJyZW50QnVuUmVsZWFzZUFnZUV4Y2x1ZGVzKHJvb3REaXJQYXRoKVxuICAgICkge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwICR7cm9vdERpclBhdGh9OiB3YmZ5ICR7c2tpcHBhYmxlVmVyc2lvbkxhYmVsfSBpcyBhbHJlYWR5IGFwcGxpZWQuIFBhc3MgLS1mb3JjZSB0byByZS1hcHBseS5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3QgcGFja2FnZXNTdWJEaXJQYXRocyA9IGRpcmVudHNcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSlcbiAgICAgIC5tYXAoKGQpID0+IHBhdGgucmVzb2x2ZShwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuICAgIC8vIEFsc28gY292ZXIgd29ya3NwYWNlcyBkZWNsYXJlZCBvdXRzaWRlIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdGhleSByZWNlaXZlIHRoZSBzYW1lXG4gICAgLy8gbWFuYWdlZCBjb25maWdzICh0c2NvbmZpZy5qc29uLCBwYWNrYWdlLmpzb24gY29udmVudGlvbnMsIOKApikgYXMgcGFja2FnZXMvKiBjaGlsZHJlbi5cbiAgICBjb25zdCByb290UGFja2FnZUpzb24gPVxuICAgICAgaWdub3JlRXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ11cbiAgICAgICkgPz8ge307XG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoOiByb290RGlyUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uOiByb290UGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogcGFja2FnZXNTdWJEaXJQYXRocy5zb21lKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgICApLFxuICAgIH0pO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gWy4uLm5ldyBTZXQoWy4uLnBhY2thZ2VzU3ViRGlyUGF0aHMsIC4uLndvcmtzcGFjZVN1YkRpclBhdGhzXSldLmZpbHRlcihcbiAgICAgIChzdWJEaXJQYXRoKSA9PiBzdWJEaXJQYXRoICE9PSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpXG4gICAgKTtcblxuICAgIC8vIFJlZnVzZWQgd3JpdGVzIG9uIGNvcmUgbWFuYWdlZCBmaWxlcyB3b3VsZCBsZWF2ZSB0aGUgcmVwb3NpdG9yeSBwYXJ0aWFsbHkgdXBkYXRlZCwgc28gc2tpcFxuICAgIC8vIGl0IEJFRk9SRSBhbnkgbXV0YXRpb24gd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgICBjb25zdCBtYW5hZ2VkRmlsZVBhdGhzID0gW1xuICAgICAgLi4uWycuZ2l0YXR0cmlidXRlcycsICdidW5maWcudG9tbCcsICdsZWZ0aG9vay55bWwnLCAncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgbmFtZSlcbiAgICAgICksXG4gICAgICAuLi5zdWJEaXJQYXRocy5mbGF0TWFwKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBbJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PiBwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgbmFtZSkpXG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3Qgd3JpdGFibGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtYW5hZ2VkRmlsZVBhdGhzLm1hcCgoZmlsZVBhdGgpID0+IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSlcbiAgICApO1xuICAgIGlmICh3cml0YWJsZVJlc3VsdHMuaW5jbHVkZXMoZmFsc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiBhIG1hbmFnZWQgY29uZmlnIGZpbGUgaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmbGlnaHRFcnJvcnMgPSBbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXS5mbGF0TWFwKChkaXJQYXRoKSA9PiB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddO1xuICAgICAgICBjb25zdCBlcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoeyBwYWNrYWdlSnNvbiB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9yID8gW2Ake2RpclBhdGh9OiAke2Vycm9yfWBdIDogW107XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtgJHtwYWNrYWdlSnNvblBhdGh9IGlzIGludmFsaWRgXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocHJlZmxpZ2h0RXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06XFxuJHtwcmVmbGlnaHRFcnJvcnMuam9pbignXFxuJyl9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBMZXQgZ2V0UGFja2FnZUNvbmZpZyBkZXJpdmUgaXNSb290IGZvciB0aGUgZW50cnkgcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBpcyBhXG4gICAgLy8gc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgdGFyZ2V0IG11c3Qga2VlcCBpdHMgY2hpbGQgY2xhc3NpZmljYXRpb24sIHNvIGZvcmNpbmdcbiAgICAvLyBgaXNSb290OiB0cnVlYCBoZXJlIHdvdWxkIGFwcGx5IHJvb3Qtb25seSBwcm9jZXNzaW5nIChsZWZ0aG9vayBpbnN0YWxsLCByb290IHRzY29uZmlnLFxuICAgIC8vIEFHRU5UUy5tZCwg4oCmKSB0byBhIHN1YnBhY2thZ2UuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gRXZlcnkgZGlzY292ZXJlZCB3b3Jrc3BhY2UgKGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKSBpcyBhIGNoaWxkXG4gICAgLy8gcGFja2FnZTsgdGhlIHBhY2thZ2VzLyogaGV1cmlzdGljIGluc2lkZSBnZXRQYWNrYWdlQ29uZmlnIHdvdWxkIG1pc2NsYXNzaWZ5IGFwcHMvKiBhcyByb290cy5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgeyBpc1Jvb3Q6IGZhbHNlIH0pKVxuICAgICk7XG4gICAgY29uc3QgaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoID0gc3ViRGlyUGF0aHMuZmluZChcbiAgICAgIChzdWJEaXJQYXRoLCBpbmRleCkgPT4gIW51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3NbaW5kZXhdICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICApO1xuICAgIGlmIChpbnZhbGlkU3ViUGFja2FnZURpclBhdGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06ICR7aW52YWxpZFN1YlBhY2thZ2VEaXJQYXRofS9wYWNrYWdlLmpzb24gaXMgaW52YWxpZC5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG4gICAgLy8gVGhlIG1hbmFnZWQgaWdub3JlIHJ1bGUgaXMgdW5hbmNob3JlZCwgc28gYSBuZXN0ZWQgY29weSAoZS5nLiB3b3JrZXJzL2FwaS8uZW52LmNsb3VkZmxhcmUpIGlzXG4gICAgLy8gYXMgbXVjaCBhIGxlYWsgYXMgYSByb290IG9uZTsgdGhlIHdpbGRjYXJkIHBhdGhzcGVjIGNvdmVycyBldmVyeSBkZXB0aCBpbiBvbmUgcXVlcnkuXG4gICAgY29uc3QgdHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocyA9IGFsbFBhY2thZ2VDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmlzQ2xvdWRmbGFyZSlcbiAgICAgID8gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICAgICAgICdnaXQnLFxuICAgICAgICAgIFsnLWMnLCAnY29yZS5xdW90ZVBhdGg9ZmFsc2UnLCAnbHMtZmlsZXMnLCAnLS0nLCAnLmVudi5jbG91ZGZsYXJlJywgJyovLmVudi5jbG91ZGZsYXJlJ10sXG4gICAgICAgICAgcm9vdENvbmZpZy5kaXJQYXRoXG4gICAgICAgIClcbiAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCkpXG4gICAgICA6IFtdO1xuICAgIGlmICh0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBTRUNVUklUWSBFUlJPUjogQ2xvdWRmbGFyZSBjcmVkZW50aWFscyBtdXN0IGJlIHVudHJhY2tlZC4gUmVtb3ZlICR7dHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5qb2luKFxuICAgICAgICAgICcsICdcbiAgICAgICAgKX0gZnJvbSBHaXQsIHB1cmdlIHRoZSB0b2tlbiBmcm9tIGhpc3RvcnksIGFuZCByb3RhdGUgQ0xPVURGTEFSRV9BUElfVE9LRU4gYmVmb3JlIHJlcnVubmluZyB3YmZ5LmBcbiAgICAgICk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZml4VHlwb3NQcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBhd2FpdCBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMoYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIC8vIE1hbmFnZWQgcmVwb3NpdG9yaWVzIHVzZSBCdW4gd2l0aCBtaXNlIChhbmQgb3B0aW9uYWxseSBmbm94KS5cbiAgICBjb25zdCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlID0gcmVhZEJ1bkdsb2JhbFN0b3JlKHJvb3REaXJQYXRoKTtcbiAgICAvLyBSb290LWxldmVsIGluc3RhbGwgbGF5b3V0IG11c3QgY292ZXIgd29ya3NwYWNlIGFwcHMgdG9vOiBOZXh0LmpzIGNvbW1vbmx5IGxpdmVzIHVuZGVyXG4gICAgLy8gcGFja2FnZXMvKiBvciBhcHBzLyogd2hpbGUgYnVuZmlnLnRvbWwgZXhpc3RzIG9ubHkgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdC5cbiAgICBjb25zdCB1c2VHbG9iYWxTdG9yZSA9IHJlc29sdmVCdW5HbG9iYWxTdG9yZShhbGxQYWNrYWdlQ29uZmlncywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgc2tpcERlcHMpO1xuICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnLCB1c2VHbG9iYWxTdG9yZSk7XG4gICAgYXdhaXQgZ2VuZXJhdGVNaXNlVG9tbChyb290Q29uZmlnKTtcbiAgICBhd2FpdCBnZW5lcmF0ZUZub3hUb21sKHJvb3RDb25maWcpO1xuICAgIC8vIFJ1biBhZnRlciBnZW5lcmF0ZUZub3hUb21sIHNvIGl0cyB0cmFuc2FjdGlvbmFsIHJlY2lwaWVudCBzeW5jIGNhbm5vdCByZXN0b3JlIGEgc25hcHNob3RcbiAgICAvLyBvdmVyIGRlZmluaXRpb25zIGluc2VydGVkIGhlcmUuXG4gICAgYXdhaXQgZW5zdXJlV2JFbnZEZWZpbml0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICAvLyBUaGUgbGF5b3V0IG11c3QgYmUgdmVyaWZpZWQgaW5zdGFsbGFibGUgQkVGT1JFIGFueSBgYnVuIGFkZGAgbXV0YXRlcyBwYWNrYWdlLmpzb24gZmlsZXM6XG4gICAgLy8gcGVyLXBhY2thZ2UgaW5zdGFsbHMgdG9sZXJhdGUgZmFpbHVyZXMgKHNwYXduU3luYyBkaXNjYXJkcyB0aGVpciBzdGF0dXMpLCBzbyBhIGxheW91dCB0aGF0XG4gICAgLy8gY2Fubm90IGluc3RhbGwgd291bGQgc2lsZW50bHkgZHJvcCBldmVyeSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLlxuICAgIC8vIEEgZG9jcy1vbmx5IHJlcG9zaXRvcnkgaGFzIG5vIG1hbmlmZXN0IHRvIHByb2JlIG9uIGl0cyBmaXJzdCBydW47IGdlbmVyYXRlUGFja2FnZUpzb24gYmVsb3dcbiAgICAvLyBjcmVhdGVzIGl0IGJlZm9yZSB0aGUgYXV0aG9yaXRhdGl2ZSByZWZyZXNoQnVuTG9jayBjaGVjay5cbiAgICBpZiAoXG4gICAgICAhc2tpcERlcHMgJiZcbiAgICAgIHJvb3RDb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJlxuICAgICAgIXByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKHJvb3REaXJQYXRoLCByb290Q29uZmlnLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCB1c2VHbG9iYWxTdG9yZSlcbiAgICApIHtcbiAgICAgIC8vIHJlZnJlc2hCdW5Mb2NrIGJlbG93IGlzIHRoZSBhdXRob3JpdHkgb24gd2hldGhlciB0aGUgZmluYWwgaW5zdGFsbCBmYWlsZWQuXG4gICAgICBjb25zb2xlLndhcm4oYGJ1biBpbnN0YWxsIGN1cnJlbnRseSBmYWlscyBpbiAke3Jvb3REaXJQYXRofSB1bmRlciB0aGUgaXNvbGF0ZWQgbGlua2VyLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICAvLyBPdGhlciBvd25lcnMgY2Fubm90IGNhbGwgdGhlIG9yZ2FuaXphdGlvbidzIHJldXNhYmxlIHdvcmtmbG93cyAodGhlaXIgc2VjcmV0cyBhbmQgcnVubmVyc1xuICAgIC8vIGRvIG5vdCBleGlzdCB0aGVyZSksIHNvIGFueSBvdGhlciBHaXRIdWItaG9zdGVkIE5vZGUuanMgcmVwb3NpdG9yeSBnZXRzIHNlbGYtY29udGFpbmVkXG4gICAgLy8gd29ya2Zsb3dzIGluc3RlYWQg4oCUIGtleWVkIG9uIHJlcG9zaXRvcnkgc3RhdGUsIG5ldmVyIG9uIHRoZSBvd25lcidzIGlkZW50aXR5LlxuICAgIC8vIHJvb3RDb25maWcuaXNSb290OiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiAoYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCkga2VlcHNcbiAgICAvLyBpc1Jvb3QgZmFsc2UsIGFuZCBHaXRIdWIgaWdub3JlcyB3b3JrZmxvdyBmaWxlcyBuZXN0ZWQgdW5kZXIgYSBwYWNrYWdlIGRpcmVjdG9yeS5cbiAgICBjb25zdCBzaG91bGRSdW5TZWxmQ29udGFpbmVkV29ya2Zsb3dzID1cbiAgICAgICFzaG91bGRSdW5Xb3JrZmxvd3MgJiZcbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAhIXJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOicpICYmXG4gICAgICByb290Q29uZmlnLmlzUm9vdDtcbiAgICAvLyBmaXhUeXBvcyByZWFkLW1vZGlmeS13cml0ZXMgdGhlIE1hcmtkb3duIGFuZCBZQU1MIGZpbGVzIHRoYXQgdGhlIGdlbmVyYXRvcnMgYmVsb3cgcmV3cml0ZS5cbiAgICBhd2FpdCBmaXhUeXBvc1Byb21pc2U7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGZpeFJhaWx3YXlpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbmMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgLi4uKHNob3VsZFJ1blNlbGZDb250YWluZWRXb3JrZmxvd3MgPyBbZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIC8vIEdpdCBob29rcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBzdGF0ZTogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3Qgd3JpdGUgYVxuICAgICAgLy8gY2hpbGQgbGVmdGhvb2sueW1sIG9yIHJlcGxhY2UgdGhlIGVuY2xvc2luZyByZXBvc2l0b3J5J3MgaG9vayBpbnN0YWxsYXRpb24uXG4gICAgICAuLi4ocm9vdENvbmZpZy5pc1Jvb3QgPyBbZ2VuZXJhdGVMZWZ0aG9vayhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyldIDogW10pLFxuICAgIF0pO1xuICAgIC8vIEFmdGVyIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgKGFuZCBpdHMgcG9vbGVkIHdyaXRlcykgc28gdGhlIGluc3RydWN0aW9uIGZpbGVzIGRlc2NyaWJlIHRoZVxuICAgIC8vIGZpbmFsaXplZCB3b3JrZmxvdyBmaWxlcyBpbnN0ZWFkIG9mIGxhZ2dpbmcgb25lIHJ1biBiZWhpbmQuXG4gICAgYXdhaXQgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmNoYWtyYSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkphdmEoY29uZmlnKSkgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIHNraXBEZXBzKTtcblxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiYgZG9lc0NvbnRhaW5Kc09yVHMocm9vdENvbmZpZykpIHtcbiAgICAgICAgLy8gTW9ub3JlcG8gdmVyaWZpY2F0aW9uIGNhbiBpbnZva2Ugb3hsaW50IGZyb20gZXZlcnkgd29ya3NwYWNlLiBHaXZlXG4gICAgICAgIC8vIG5vbi1jb2RlIHBhY2thZ2VzIGEgbG9jYWwgY29uZmlnIHNvIG94bGludCBkb2VzIG5vdCBjbGltYiB0byB0aGVcbiAgICAgICAgLy8gcm9vdCBjb25maWcgYW5kIHJlamVjdCByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIGZyb20gYSBwYWNrYWdlIGN3ZC5cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgLy8gUnVuIGFmdGVyIGV2ZXJ5IHBvb2xlZCBnZW5lcmF0b3Igd3JpdGUgc28gbm9ybWFsaXphdGlvbiBjYW5ub3Qgb3ZlcndyaXRlIGEgY29uY3VycmVudFxuICAgIC8vIHVwZGF0ZSwgYW5kIGJlZm9yZSBjbGVhbnVwIHNvIGZvcm1hdHRlciBtZXRhZGF0YSBjYWNoZXMgb2JzZXJ2ZSB0aGUgY2hhbmdlZCBmaWxlcy5cbiAgICByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMocm9vdERpclBhdGgpO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIHRyeSB7XG4gICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgZmFpbGVkIGluc3RhbGwgbXVzdCBmYWlsIHRoZSBDTEk6IGV4aXRpbmcgMCB3aXRoIGEgc3RhbGUgb3IgbWlzc2luZyBCdW4gbG9ja2ZpbGUgd291bGRcbiAgICAgIC8vIGhpZGUgYSBicm9rZW4gbWFuYWdlZCBjb25maWd1cmF0aW9uLlxuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlZnJlc2ggdGhlIEJ1biBsb2NrZmlsZTonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJ1biB3cml0ZXMgYnVuLmxvY2sgYmVmb3JlIGxpZmVjeWNsZSBzY3JpcHRzLCBzbyBhIGZhaWxlZCBpbnN0YWxsIGNhbiBzdGlsbCBsZWF2ZSBHdWFyZFxuICAgICAgLy8gVVJMcyBiZWhpbmQuIE5vcm1hbGl6ZSBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgb3V0cHV0IHdpdGhvdXQgcmVwbGFjaW5nIHRoZSBpbnN0YWxsIGVycm9yLlxuICAgICAgY29uc3Qgbm9ybWFsaXplZExvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgICAgIGlmIChub3JtYWxpemVkTG9ja2ZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICR7bm9ybWFsaXplZExvY2tmaWxlUGF0aH0gdG8ga2VlcCBpdCByZWdpc3RyeS1hZ25vc3RpYy5gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIG5vcm1hbGl6ZSB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICBzcGF3blN5bmMoJ2J1bicsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnO1xufVxuXG4vKipcbiAqIFByb2JlcyBgYnVuIGluc3RhbGxgIHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuIEFuIGluY29tcGF0aWJpbGl0eSBtdXN0IGJlIGZpeGVkIGluIHRoZVxuICogcmVwb3NpdG9yeSBvciBpbiB3YmZ5J3MgbWFuYWdlZCBsaXN0cywgbmV2ZXIgYnkgc3dpdGNoaW5nIHRoZSBsaW5rZXIuIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVcbiAqIGluc3RhbGwgZmFpbHMuXG4gKi9cbmZ1bmN0aW9uIHByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICB1c2VHbG9iYWxTdG9yZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIC8vIEEgbGF5b3V0IHN3aXRjaCBtdXN0IHByb2JlIGZyb20gYSBjbGVhbiB0cmVlIGJlY2F1c2UgQnVuIGRvZXMgbm90IHJlbW92ZSB0aGUgcHJldmlvdXMgbGF5b3V0J3MgbGVmdG92ZXJzLlxuICBpZiAocHJldmlvdXNHbG9iYWxTdG9yZSAhPT0gdXNlR2xvYmFsU3RvcmUpIHtcbiAgICByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aCwgcm9vdENvbmZpZyk7XG4gIH1cbiAgLy8gUmV0cnkgb25jZSBzbyBhIHRyYW5zaWVudCBmYWlsdXJlIChyZWdpc3RyeSBoaWNjdXAsIGZsYWt5IGxpZmVjeWNsZSBzY3JpcHQpIGRvZXMgbm90XG4gIC8vIG1hc3F1ZXJhZGUgYXMgYSBsYXlvdXQgaW5jb21wYXRpYmlsaXR5LlxuICBpZiAoc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBDbGVhbiB1cCB0aGUgZmFpbGVkIGF0dGVtcHQgc28gbGF0ZXIgaW5zdGFsbHMgZG8gbm90IHJ1biBvbiBhIHBvbGx1dGVkIHRyZWUuXG4gIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aDogc3RyaW5nLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIENvdmVyIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZTogbGVmdG92ZXJzIGNhbiBrZWVwIHBoYW50b20gZGVwZW5kZW5jaWVzIHJlc29sdmFibGUuXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aHMgPSBbXG4gICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJyksXG4gICAgLi4uWy4uLmdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLnZhbHVlcygpXS5tYXAoKHdvcmtzcGFjZURpcikgPT5cbiAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgd29ya3NwYWNlRGlyLCAnbm9kZV9tb2R1bGVzJylcbiAgICApLFxuICBdO1xuICAvLyBOZXZlciBkZWxldGUgdGhyb3VnaCBhIHdvcmtzcGFjZSBzeW1saW5rIHRoYXQgZXNjYXBlcyB0aGlzIHJlcG9zaXRvcnkuXG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNQYXRoIG9mIG5vZGVNb2R1bGVzUGF0aHMpIHtcbiAgICBjb25zdCByZWFsUGFyZW50RGlyUGF0aCA9IGlnbm9yZUVycm9yKCgpID0+IGZzLnJlYWxwYXRoU3luYyhwYXRoLmRpcm5hbWUobm9kZU1vZHVsZXNQYXRoKSkpO1xuICAgIGlmIChcbiAgICAgICFyZWFsUGFyZW50RGlyUGF0aCB8fFxuICAgICAgKHJlYWxQYXJlbnREaXJQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiYgIXJlYWxQYXJlbnREaXJQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoLCAxKTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzQ5LDUwLDUxLDUyLDUzLDU0XSwibWFwcGluZ3MiOiJvL0JBV0EsTUFBYSxHQUFvRCxDQUMvRCxDQUNFLFFBQVMsTUFDVCxZQUFhLHNHQUNmLEVBQ0EsQ0FDRSxRQUFTLGVBQ1QsWUFDRSxxbkJBQ0osRUFDQSxDQUNFLFFBQVMsbUJBQ1QsWUFDRSw0R0FDSixFQUNBLENBQ0UsUUFBUyxvQkFDVCxZQUNFLHlLQUNKLEVBQ0EsQ0FDRSxRQUFTLFVBQ1QsWUFBYSwrREFDZixFQUNBLENBQ0UsUUFBUyxRQUNULFlBQWEsc0dBQ2YsQ0FDRixFQW9DYSxHQUFpRCxDQUM1RCxDQUFFLFFBQVMsVUFBVyxZQUFhLDhDQUErQyxFQUNsRixDQUFFLFFBQVMsV0FBWSxZQUFhLDZDQUE4QyxFQUNsRixDQUFFLFFBQVMsU0FBVSxZQUFhLHdDQUF5QyxFQUMzRSxDQUFFLFFBQVMsV0FBWSxZQUFhLHVEQUF3RCxDQUM5RixFQVFhLEdBQW9ELENBQy9ELENBQ0UsUUFBUyxzQkFDVCxZQUFhLHdFQUNmLEVBQ0EsQ0FDRSxRQUFTLFdBQ1QsWUFDRSxrTkFDSixFQUNBLENBQ0UsUUFBUyxzQkFDVCxZQUNFLHdHQUNKLEVBQ0EsQ0FDRSxRQUFTLHNCQUNULFlBQWEsbUdBQ2YsRUFDQSxDQUNFLFFBQVMscUJBQ1QsWUFDRSwwT0FDSixFQUNBLENBQ0UsUUFBUyw4QkFDVCxZQUFhLG1HQUNmLEVBQ0EsQ0FDRSxRQUFTLGVBQ1QsWUFBYSxnRkFDZixFQUNBLENBQ0UsUUFBUyxpQkFDVCxZQUFhLHdGQUNmLENBQ0YsRUFRQSxTQUFnQixHQUFzQixFQUE4QyxDQUNsRixPQUFPLEVBQ0osSUFD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
|