wbfy 5.7.19 → 5.7.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs/promises";import{PromisePool as a}from"minimal-promise-pool";import c from"deepmerge";import l from"typescript";import d from"fast-glob";import p from"js-yaml";import u from"lodash.clonedeep";import m from"node:os";import f from"node:child_process";import{Octokit as g}from"@octokit/core";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{isVerbose=!1;doesUploadEnvVars=!1};const x=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function _(e){return x.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const j={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},S=new a;async function P(n){return x.functionIgnoringException("fixNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await S.run(()=>j.generateFile(s,i))})}const $=e=>({kind:"literal",value:e}),C=e=>({kind:"object",value:e}),E={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:$("process.env.NEXT_PUBLIC_BASE_URL"),trace:$("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:$("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:$("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:$("'yarn start-test-server'"),url:$("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:$("!!process.env.CI"),timeout:$("300_000"),stdout:$("'pipe'"),stderr:$("'pipe'"),env:$("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:$("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function F(n){return x.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),r=o?.[1];if(!r)return;const a=function(e){const t=l.createSourceFile("playwright-config.ts",`const config = ${e};`,l.ScriptTarget.Latest,!0,l.ScriptKind.TS),n=t.statements[0];if(!n||!l.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!l.isObjectLiteralExpression(s.initializer))return;return B(s.initializer,t)}(r);if(!a)return;const d=c.all([E,a]);Boolean(n.packageJson?.scripts?.["start-test-server"])||delete d.webServer;const p=await async function(n){const s=[t.resolve(n,".env"),t.resolve(n,"mise.toml")];for(const t of s)try{const n=await e.promises.readFile(t,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(n))return!0}catch{}return!1}(n.dirPath);if(!p){const e=d.use;"object"===e?.kind&&delete e.value.baseURL}const u=I(d,0),m=i.replace(r,u);await S.run(()=>j.generateFile(s,m))})}function B(e,t){const n={};for(const s of e.properties){if(!l.isPropertyAssignment(s)||!l.isIdentifier(s.name)&&!l.isStringLiteral(s.name))return;const e=O(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function O(e,t){if(l.isObjectLiteralExpression(e)){const n=B(e,t);return n?C(n):$(e.getText(t))}if(l.isArrayLiteralExpression(e)){const n=e.elements.map(e=>O(e,t));return n.some(e=>void 0===e)?$(e.getText(t)):{kind:"array",value:n}}return $(e.getText(t))}function A(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=A(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:I(e.value,t)}function I(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=A(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const T=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function R(e){return x.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await d.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:T});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await r.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await r.writeFile(n,i)}})}async function D(n){return x.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const o=t.join(n,i);try{await e.promises.rename(o,s);const r=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=r.replaceAll(i,"test");if(r===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function W(e,s){return x.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>r.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const d=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?d?(await r.mkdir(t.join(i,a)),await S.run(()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):o&&(await r.mkdir(o,{recursive:!0}),await S.run(()=>r.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!d&&(await r.mkdir(o,{recursive:!0}),await S.run(()=>n(()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function N(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=c(e[i],o,n):e.includes(o)||s.push(o);return s}function J(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&J(s);return e}const G={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},U={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},z={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function q(n){const s=["add-focused-issue-to-project.yml","add-issue-to-project.yml","add-ready-issue-to-project.yml","notify-ready.yml","wbfy.yml","wbfy-merge.yml"];return x.functionIgnoringException("generateWorkflow",async()=>{if(M(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const o=t.resolve(n.dirPath,".github","semantic.yml");await S.run(()=>e.promises.rm(o,{force:!0,recursive:!0}));const r=await e.promises.readdir(i,{withFileTypes:!0}),a=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&a.add("release.yml"),a.delete("add-issue-to-project.yml"),a.delete("add-ready-issue-to-project.yml"),a.delete("notify-ready.yml");for(const e of a){const s=t.basename(e,".yml");await S.run(()=>H(n,i,s))}for(const n of s)await S.run(()=>e.promises.rm(t.join(i,n),{force:!0,recursive:!0}))})}function M(e){return e?.endsWith("/reusable-workflows")??!1}async function H(n,s,i){const o=t.join(s,`${i}.yml`),r=e.existsSync(t.join(s,"deploy-production.yml"));if("autofix"===i)return void await K(function(e){if(!e.isPublicRepo)return u(U);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=u(G),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),o);let a=u(i in z?z[i]:{});if(!("jobs"in a))return;try{const t=await e.promises.readFile(o,"utf8"),n=p.load(t);a=c.all([a,n,a],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&r&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let l=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Y(n,e,i),l=!0);if(l){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(function(e){delete e.jobs["add-to-project"]}(a),await K(a,o),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await K(a,t.join(s,"sync-force.yml"))}}}function Y(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.label,delete e.with.labelOperator,e.with.ci_size&&(e.with.ci_label=e.with.ci_size,delete e.with.ci_size)}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?J(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=J(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function K(t,n){const s=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function V(n){return x.functionIgnoringException("fixTypos",async()=>{if(M(n.repository))return;const s=n.dirPath,i=await d.glob("**/*.md",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await S.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=X(t);s=Z(s,n,"doc"),t!==s&&await j.generateFile(i,s)})}const o=await d.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=Q(r);a=Z(a,n,"ts"),r!==a&&await j.generateFile(o,a)}const r=await d.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=X(r);a=Z(a,n,"text"),r!==a&&await j.generateFile(o,a)}await S.promiseAll()})}function X(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Q(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function Z(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}async function ee(e,n){return x.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await j.readFileIgnoringError(s);for(const[s,o]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const r=te(e,n,o,i),a=t.resolve(e.dirPath,s);await S.run(()=>j.generateFile(a,r))}const o=t.resolve(e.dirPath,".cursor/rules/general.mdc"),r=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=te(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>j.generateFile(o,r))})}function te(e,t,n,s){const i=e.isBun?"bun":"yarn",o=`\n## Project Information\n\n- Name: ${e.packageJson?.name}\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i} on zsh\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Do not write tests unless explicitly requested.\n- When fixing tests, gather debug information through logging and screenshots before modifying the code.\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (takes up to 1 hour), or run \`${i} check-for-ai\` for type checking and linting only (takes up to 10 minutes).\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit them to a non-main branch using the \`--no-verify\` option and push to the current branch.\n - Follow conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTest)?`- Use \`${i} run start-test\` to launch a web server for debugging or testing.`:""}\n\n${ne(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();return s?o+"\n"+s.trimEnd():o}function ne(e){return`\n## Coding Style\n\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- When adding new functions or classes, define them below any functions or classes that call them to maintain a clear top-down call order.\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n${e.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}async function se(n){return x.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const ie='env = false\ntelemetry = false\n\n[install]\nexact = true\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@exercode/problem-utils",\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/shared-lib",\n "@willbooster/wb",\n "next",\n "@next/*",\n "react",\n "react-dom"\n]\n',oe=ie.replace("exact = true","exact = false");async function re(n){return x.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?oe:ie;await S.run(()=>j.generateFile(s,i))})}const ae="# Project-specific settings",ce=/# Project-specific settings[^\n]*\n/gm,le="# Generated by wbfy",de=`${ae} (head)\n\n\n${le}\n`,pe=`\n${ae} (tail)\n`,ue={separator:le,separatorPrefix:"# Generated by ",defaultHeadUserContent:de,defaultTailUserContent:pe,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=me(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(ce,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(ce,`${ae} (head)\n`):de},getTailUserContent(e){const t=me(e);return t>0?e.slice(t-1):pe},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function me(e){const t=e.indexOf(ae),n=e.lastIndexOf(ae);return n>t?n:-1}async function fe(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await j.readFileIgnoringError(s)??"",t=ue.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ue.getTailUserContent(e);await S.run(()=>j.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const ge={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},he=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${we(ge.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${we(ge.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${we(ge.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function ye(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>j.generateFile(n,he))})}function we(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function be(n){return x.functionIgnoringException("generateEslintrc",async()=>{await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0}));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await S.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await S.run(()=>j.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const ve={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 ke(n,s){return x.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),o=t.resolve(i,"config.yml"),r=t.resolve(i,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let l=u(ve);try{const t=await e.promises.readFile(o,"utf8"),n=p.load(t);l=c.all([l,n,l],{arrayMerge:L})}catch{}const d=p.dump(l,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),m=await j.readFileIgnoringError(a),f=`以下のコーディング規約を踏まえて、日本語でレビューしてください。\n\n${ne(s)}${m?`\n\n${m.trimEnd()}`:""}`,g=[S.run(()=>j.generateFile(o,d))];e.existsSync(r)||g.push(S.run(()=>j.generateFile(r,f))),await Promise.all(g)})}async function xe(n){return x.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const _e=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ge.codeWith2IndentSize,...ge.codeWith4IndentSize,...ge.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function je(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>j.generateFile(n,_e))})}const Se=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pe(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await j.readFileIgnoringError(s)??"";let o=ue.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const r=ue.getTailUserContent(i),a=[...Se];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(o+="*.sqlite3*\n"),e.depending.playwrightTest&&(o+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Ee(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run(()=>Ce(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ue.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run(()=>j.generateFile(s,l))})}const $e=t.join(m.homedir(),".cache","wbfy","gitignore");async function Ce(n,s){await e.promises.mkdir($e,{recursive:!0}),await e.promises.writeFile(t.join($e,n),s)}async function Ee(n){try{const s=await e.promises.stat(t.join($e,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join($e,n),"utf8")}catch{}}function Fe(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const Be=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ge.prettier.map(e=>Fe("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Oe=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ge.prettier.map(e=>Fe("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function Ae(n){return x.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?S.run(()=>j.generateFile(i,n.isBun?Oe:Be)):S.run(()=>e.promises.rm(i,{force:!0})))}})}function Ie(e,t,n,s=0){do{const[s,i,o]=Re(e,t,n);if(0===f.spawnSync(s,i,o).status)break}while(--s>=0)}function Te(e,t,n){const[s,i,o]=Re(e,t,n);o.stdio="pipe";const r=f.spawnSync(s,i,o),a=r.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();r.error?console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] failed with: ${r.error.message}`):c&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=r.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Re(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),[e,t,{cwd:n,env:s,encoding:"utf8",shell:!1,stdio:"inherit"}]}function De(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=Te("git",["ls-remote",n,"HEAD"],process.cwd()).split(/\s+/)[0];if(!s)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(s)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const We={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""};const Le=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Ne=new Map;function Je(e){const t=e??"",n=Ne.get(t);if(n)return n;const s=new g({auth:Ue(e)||void 0});return Ne.set(t,s),s}function Ge(e){return!!Ue(e)}function Ue(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}const ze=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],qe=[...ze,"typescript-eslint","eslint-import-resolver-typescript"],Me=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],He={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...ze],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...ze,...Me],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...qe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...qe,...Me],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...qe,...Me]};async function Ye(n,s,i){return x.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),a=JSON.parse(r);a.scripts=a.scripts??{},a.dependencies=a.dependencies??{},a.devDependencies=a.devDependencies??{},a.peerDependencies=a.peerDependencies??{};const l=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await S.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(a);for(const[e,t]of Object.entries(a.scripts))t.includes("git clone")||(a.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));a.scripts=c(a.scripts,Ve(n,a.scripts)),"check-for-ai"in a.scripts&&("gen-code"in a.scripts&&(a.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${a.scripts["check-for-ai"]}`),a.scripts["check-for-ai"]=`${l} install > /dev/null && ${a.scripts["check-for-ai"]}`);n.isBun?delete a.scripts.prettify:a.scripts.prettify=(a.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(ue.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return`${r.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(a.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(a.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(a.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete a.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(delete a.devDependencies.husky,delete a.devDependencies.pinst,delete a.scripts.postinstall,delete a.scripts.postpublish,delete a.scripts.prepublishOnly,delete a.scripts.prepack,delete a.scripts.postpack,a.scripts.prepare="lefthook install || true",u.push("lefthook"),n.depending.semanticRelease&&(a.devDependencies["semantic-release"]||a.devDependencies["multi-semantic-release"]||a.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),a.version="0.0.0-semantically-released"),n.depending.playwrightTest){a.dependencies.artillery||a.devDependencies.artillery||a.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete a.dependencies["@playwright/test"]),delete a.dependencies.playwright,delete a.devDependencies.playwright}n.doesContainSubPackageJsons?a.workspaces=Array.isArray(a.workspaces)?c.all([a.workspaces,["packages/*"]],{arrayMerge:N}):["packages/*"]:Array.isArray(a.workspaces)&&(a.workspaces=a.workspaces.filter(e=>d.globSync(e,{dot:!0,cwd:n.dirPath,ignore:T}).length>0),0===a.workspaces.length&&delete a.workspaces)}if(n.depending.wb||n.isBun){a.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(a.scripts))a.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete a.devDependencies.eslint,delete a.devDependencies.micromatch,delete a.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...He[n.eslintBase]);n.isWillBoosterConfigs&&(p=p.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));a.name||(a.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(a.private=!0);a.license||(a.license="UNLICENSED");!a.private&&"UNLICENSED"!==a.license&&s.isPublicRepo&&(a.publishConfig??={},a.publishConfig.access??="public");const[f]=Le.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(a.author="WillBooster Inc.");n.isRoot||!a.private||a.main||(a.main="./src");if(delete a.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)a.scripts["lint-fix"]=(a.scripts["lint-fix"]??"")+We.getLintFixSuffix(n);else{delete a.scripts.lint,delete a.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=a.scripts[e];t&&(a.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){a.scripts.lint="flutter analyze",a.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(a.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,a.scripts.format=(a.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===a.scripts.postinstall&&delete a.scripts.postinstall;const e=await d.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:T}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");a.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,a.scripts.lint?a.scripts.lint=`poetry run flake8 ${e} && ${a.scripts.lint}`:(a.scripts.lint=`poetry run flake8 ${e}`,a.scripts["lint-fix"]="yarn lint"),a.scripts.format=(a.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(a.repository=n.repository)}n.depending.blitz?a.scripts["gen-code"]?.startsWith("blitz codegen")?a.scripts["gen-code"].includes("blitz prisma generate")||(a.scripts["gen-code"]=a.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):a.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!a.scripts["gen-code"]?.startsWith("prisma generate")&&(a.scripts["gen-code"]="prisma generate");a.dependencies.prettier||delete a.devDependencies["@types/prettier"];0===Object.keys(a.dependencies).length&&delete a.dependencies;0===Object.keys(a.devDependencies).length&&delete a.devDependencies;0===Object.keys(a.peerDependencies).length&&delete a.peerDependencies;await async function(e){e.dependencies=e.dependencies??{},e.devDependencies=e.devDependencies??{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Xe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await De("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Xe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await De("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Xe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await De("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!Xe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await De("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Xe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await De("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(a),n.isBun&&delete a.packageManager;let g=JSON.stringify(a);if(g=await async function(n,s,i){const o=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&e.includes(":")&&o.push([e,e.replaceAll(":","-")]);if(0===o.length)return s;for(const[e,t]of o)s=s.replaceAll(e,t);const r=await d.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:T});for(const n of r)await S.run(async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)});return await S.promiseAll(),s}(a.scripts,g,n),await e.promises.writeFile(o,g),!i){if(p=p.filter(e=>!a.devDependencies?.[e]),p.length>0){const e=[...new Set(p)].map(Ke);n.isBun?(Ie(l,["remove",...new Set(p)],n.dirPath),Ie(l,["add","--exact",...e],n.dirPath)):Ie(l,["add",...e],n.dirPath)}if(u=u.filter(e=>!a.dependencies?.[e]),u.length>0){const e=[...new Set(u)].map(Ke);n.isBun?(Ie(l,["remove",...new Set(u)],n.dirPath),Ie(l,["add","-D","--exact",...e],n.dirPath)):Ie(l,["add","-D",...e],n.dirPath)}m.length>0&&Ie("poetry",["add","--group","dev",...new Set(m)],n.dirPath)}}(n,s,i)})}function Ke(e){return"eslint"===e?"eslint@^9":e}function Ve(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test --silent","check-for-ai":"bun run cleanup"+(t?" && bun run typecheck":""),cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":`yarn format > /dev/null 2> /dev/null || true${n?" && yarn typecheck":""} && yarn lint-fix --quiet`,cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ge.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit"};return e.doesContainSubPackageJsons?i=c({...i},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ge.prettier.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}):e.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s,i["check-all-for-ai"]=(i["check-all-for-ai"]??"")+" --silent"),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}function Xe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Qe={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Ze={commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:""},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},et='\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim();async function tt(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),i=t.resolve(n.dirPath,".husky"),o=e.existsSync(i),{typecheck:r}=Ve(n,{}),a={...Qe,"pre-commit":{...Ze,commands:{...Ze.commands,cleanup:{...Ze.commands.cleanup,run:nt(n)}}}};r||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),o&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Ie("git",["config","--unset","core.hooksPath"],n.dirPath));if(r){const i=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb typecheck":"bun run typecheck":e.depending.wb?"yarn wb typecheck":"yarn run typecheck";if(e.repository?.startsWith("github:WillBoosterLab/"))return`\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don't push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\n${t}\n`.trim();return t}(n);e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const c=`${et}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),c,{mode:493}))}(n)})}function nt(e){return e.isBun&&e.depending.wb?"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}":e.isBun?"bun run cleanup && git add {staged_files}":"yarn run cleanup && git add {staged_files}"}const st={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function it(n){return x.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainJavaScript||n.doesContainTypeScript){const e=`\n '${ot(n)}': [${JSON.stringify(`${i}eslint --fix${We.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${ge.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainJavaScript||e.doesContainTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${ot(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`echo '!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.'\`,\n 'false',\n ];\n }\n }\n return [];\n},`),n.doesContainPubspecYaml&&o.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`dart format ${filteredFiles.join(' ')}`];\n },");n.doesContainPoetryLock&&o.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainJavaScript||n.doesContainTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await S.run(()=>j.generateFile(s,a))}(n)})}function ot(e){const t=function(e){return e.depending.blitz?st.blitz:st.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${ge.eslint.join(",")}}`}async function rt(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await j.readFileIgnoringError(n)??"",i=ue.getHeadUserContent(s),o=ue.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await ue.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run(()=>j.generateFile(n,l))})}const at={venvPath:".",venv:".venv"};async function ct(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(at);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}async function lt(n){return x.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=dt(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;if(r=(r[0]||"").toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," "),!o)continue;const a=`[![${r}](https://github.com/${o}/actions/workflows/${s}/badge.svg)](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=dt(i,a))}await S.run(()=>j.generateFile(s,i))})}function dt(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function pt(n){return x.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i.plugins??[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e]?.[0]:o[e],n=Array.isArray(o[e])&&o[e]?.[1]||{};if("@semantic-release/commit-analyzer"===t)o[e]=["@semantic-release/commit-analyzer",c.all([n,{preset:"conventionalcommits"}],{arrayMerge:L})];else if("@semantic-release/github"===t){const{failComment:t,successComment:s,...i}=n;o[e]=["@semantic-release/github",c.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:L})]}}const r=JSON.stringify(i);await S.run(()=>j.generateFile(s,r))})}const ut={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function mt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(ut);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames?.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const ft={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},gt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function ht(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?ft:gt);n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends;const r="bundler"===(o.compilerOptions?.moduleResolution??"").toLowerCase();delete s.compilerOptions?.target,n.isEsmPackage&&!r||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=c.all([s,o,s],{arrayMerge:N}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}J(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await S.run(()=>j.generateFile(i,o))})}const yt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function wt(n){return x.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of yt)o=c.all([o,bt(e)]);n.doesContainPoetryLock&&(o=c.all([o,bt("**/.venv/**")])),n.depending.next&&(o=c.all([o,bt("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],J(o);const r=JSON.stringify(o,void 0,2);await S.run(()=>j.generateFile(s,r))}catch{}})}function bt(e){return{"files.watcherExclude":{[e]:!0}}}async function vt(n){return x.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run(()=>e.promises.rm(s,{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=Te("yarn",["--version"],n.dirPath),o=function(e,t){const n=Te("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);kt(i)<=kt(o)&&i!==o&&Ie("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await S.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await S.run(()=>e.promises.rm(a,{force:!0}));const c=p.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/problem-utils","@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/prettier-config","@willbooster/shared-lib","@willbooster/wb","next","@next/*","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await S.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,p.dump(c,{lineWidth:-1})),Ie("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function kt(e){const[t]=e.split(".");return Number(t)}async function xt(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const s=Je(t);try{await _t(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await _t(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await _t(s,t,n,"d3: medium :ox:","C4B5FD"),await _t(s,t,n,"d4: hard :squid:","A78BFA"),await _t(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await _t(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await _t(s,t,n,"p2: urgent :fire::fire:","F87171"),await _t(s,t,n,"p3: important :fire:","FCA5A5"),await _t(s,t,n,"p4: nice to have :droplet:","FECACA"),await _t(s,t,n,"r: blitz","5300bc"),await _t(s,t,n,"r: firebase","ffca28"),await _t(s,t,n,"r: prisma","0c344b"),await _t(s,t,n,"r: react","61dafb"),await _t(s,t,n,"r: svelte","ff3e00"),await _t(s,t,n,"r: semantic-release","494949"),await _t(s,t,n,"ready :rocket:","22C55E"),await _t(s,t,n,"review requested :mag:","FBCA04"),await _t(s,t,n,"released :bookmark:","6366F1"),await _t(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await _t(s,t,n,"s: 1h :clock1:","E5E7EB"),await _t(s,t,n,"s: 2h :clock2:","D1D5DB"),await _t(s,t,n,"s: 3h :clock3:","9CA3AF"),await _t(s,t,n,"s: 5h :clock5:","6B7280"),await _t(s,t,n,"s: 8h :clock8:","4B5563"),await _t(s,t,n,"s: 13h :clock1:","374151"),await _t(s,t,n,"t: build :hammer:","BFDBFE"),await _t(s,t,n,"t: chore :broom:","BFDBFE"),await _t(s,t,n,"t: ci :construction_worker:","BFDBFE"),await _t(s,t,n,"t: docs :memo:","BFDBFE"),await _t(s,t,n,"t: feat :sparkles:","BFDBFE"),await _t(s,t,n,"t: fix :bug:","BFDBFE"),await _t(s,t,n,"t: perf :zap:","BFDBFE"),await _t(s,t,n,"t: refactor :recycle:","BFDBFE"),await _t(s,t,n,"t: style :lipstick:","BFDBFE"),await _t(s,t,n,"t: test :test_tube:","BFDBFE"),await _t(s,t,n,"project","24292F"),await _t(s,t,n,"focused :dart:","22C55E"),await _t(s,t,n,"gen-pr-all :robot:","00B4D8"),await _t(s,t,n,"gen-pr-claude :robot:","00B4D8"),await _t(s,t,n,"gen-pr-codex :robot:","00B4D8"),await _t(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await jt(s,t,n,"bug"),await jt(s,t,n,"documentation"),await jt(s,t,n,"duplicate"),await jt(s,t,n,"enhancement"),await jt(s,t,n,"good first issue"),await jt(s,t,n,"help wanted"),await jt(s,t,n,"invalid"),await jt(s,t,n,"question"),await jt(s,t,n,"wontfix"),await jt(s,t,n,"ready"),await jt(s,t,n,"review requested"),await jt(s,t,n,"released"),await jt(s,t,n,"semantic-release"),await jt(s,t,n,"llm-pr :robot:"),await jt(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function _t(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function jt(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const St=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Pt(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!Ge(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=Je(t);try{for(const e of St)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=e.data;await y.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),d=y.to_base64(l,y.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:d,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function $t(e){const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const i=Je(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Ct="__PM_RUN__",Et={"pull_request_template.md":`\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \`All checks have passed\` on this page.\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \`WIP:\`.\n - The test command (e.g., \`${Ct} test\`) passed.\n - The lint command (e.g., \`${Ct} lint\`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I've reviewed my changes on the GitHub diff view.\n- [ ] I've written the steps to test my changes.\n- [ ] I've added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn't modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language \`C\`.\n3. Write the following code:\n \`\`\`c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n \`\`\`\n4. Push \`Submit\` button.\n5. ...\n--\x3e\n`.trim()};async function Ft(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Et)){const o=Bt(i,n),r=t.resolve(n.dirPath,".github",s);if(e.existsSync(r)){const t=await e.promises.readFile(r,"utf8");if(w(t,o)>o.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run(()=>j.generateFile(r,o))}})}function Bt(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Ct,n)}const Ot=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function At(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},d=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},d="module"===l.type}let p=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));p=s?.branches??[],u=s?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs.fetch??s?.refs.push;if("string"==typeof i){const e=await Tt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Tt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const s=t.resolve(n);return e.existsSync(t.join(s,"mise.toml"))||e.existsSync(t.join(s,".mise.toml"))||e.existsSync(t.join(s,".tool-versions"))}(n);for(const s of["java","node","python"])if(e.existsSync(t.resolve(n,`.${s}-version`))){g=!0;break}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await r.readFile(y,"utf8");w=Ot.parse(JSON.parse(e))}catch{}const v="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(v){const e=v.split("/");e.length>=2&&(k=e[0],x=e[1])}const _=v?`github:${v}`:void 0,j={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:_,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(_?.startsWith("github:WillBooster/")||_?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:d,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainSubPackageJsons:It("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:It("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:It("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:It("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:It("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:It("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:It("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTest:!!l.scripts?.["start-test"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||p.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:p,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:g,packageJson:l,wbfyJson:w};if(j.isBun||(j.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(j)),j.doesContainGemfile||j.doesContainGoMod||j.doesContainPackageJson||j.doesContainPoetryLock||j.doesContainPomXml||j.doesContainPubspecYaml||j.doesContainTemplateYaml)return j}catch{}}function It(e,t){return d.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Tt(e){const[t,n]=Le.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await Je().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const s=t?.headers?.location;if("string"!=typeof s)return;const[i,o]=Le.getOrgAndName(s);if(!i||!o)return;return`${i}/${o}`}(e);t&&(s.full_name=t)}return s}function Rt(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}await async function(){const n=await o(process.argv.slice(2)).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({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await D([s,...r]);const a=await At(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=V(a),l=(await Promise.all(r.map(e=>At(e,a)))).filter(e=>!!e),d=[a,...l];if(k.isVerbose)for(const e of d)console.info(e);await vt(a),a.isBun&&await re(a);const p=!M(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([_(a),R(a),c.then(()=>lt(a)),ee(a,d),fe(a),ye(a),ke(a,d),xe(a),je(a),Ft(a),Ae(a),mt(a),pt(a),...p?[q(a)]:[],xt(a),Pt(a),$t(a),tt(a),it(a)]),await S.promiseAll();const u=[];for(const e of d)Rt(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(W(e,e.isRoot?d:[e])),e.depending.playwrightTest&&u.push(F(e)),e.depending.next&&u.push(P(e)),await Pe(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await rt(e),await Ye(e,a,n.skipDeps),u.push(it(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(wt(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(ht(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(se(e)),a.isWillBoosterConfigs||u.push(be(e))),e.depending.pyright&&u.push(ct(e))));await Promise.all(u),await S.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),Ie(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),Ie(m,["install","--no-immutable"],s)),Ie(m,["cleanup"],s),a.isBun||Ie(m,["install","--no-immutable"],s)}}();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9iaW9tZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhEb2NrZXJmaWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeERvY2tlcmZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG5cbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdEb2NrZXJmaWxlJyksIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgUGFyc2VkT2JqZWN0ID0gUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAodmFsdWU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZSB9KTtcblxuY29uc3QgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0ID0ge1xuICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICB1c2U6IGFzT2JqZWN0KHtcbiAgICBiYXNlVVJMOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbmx5LW9uLWZhaWx1cmUnXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAncmV0YWluLW9uLWZhaWx1cmUnIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSksXG4gIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgIGNvbW1hbmQ6IGxpdGVyYWwoXCIneWFybiBzdGFydC10ZXN0LXNlcnZlcidcIiksXG4gICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gIH0pLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gL2RlZmluZUNvbmZpZ1xccypcXChcXHMqKFxce1tcXHNcXFNdKj99KVxccypcXCk7Py8uZXhlYyhvbGRDb250ZW50KTtcbiAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gbWF0Y2g/LlsxXTtcbiAgICBpZiAoIW9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbChvYmplY3RMaXRlcmFsKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gS2VlcCBmaWxsaW5nIG1pc3NpbmcgZGVmYXVsdHMsIGJ1dCBkb24ndCBvdmVyd3JpdGUgbG9jYWwgYWRqdXN0bWVudHMgb24gZXZlcnkgcmVnZW5lcmF0aW9uLlxuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlLmFsbDxQYXJzZWRPYmplY3Q+KFtkZWZhdWx0Q29uZmlnLCBwYXJzZWRdKTtcbiAgICBjb25zdCBoYXNTdGFydFRlc3RTZXJ2ZXIgPSBCb29sZWFuKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddKTtcbiAgICBpZiAoIWhhc1N0YXJ0VGVzdFNlcnZlcikge1xuICAgICAgZGVsZXRlIG1lcmdlZC53ZWJTZXJ2ZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQmFzZVVybCA9IGF3YWl0IGhhc05leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoIWhhc0Jhc2VVcmwpIHtcbiAgICAgIGNvbnN0IHVzZUNvbmZpZyA9IG1lcmdlZC51c2U7XG4gICAgICBpZiAodXNlQ29uZmlnPy5raW5kID09PSAnb2JqZWN0Jykge1xuICAgICAgICBkZWxldGUgdXNlQ29uZmlnLnZhbHVlLmJhc2VVUkw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeU9iamVjdChtZXJnZWQsIDApO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2Uob2JqZWN0TGl0ZXJhbCwgbmV3T2JqZWN0TGl0ZXJhbCk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzTmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGVudkZpbGVQYXRocyA9IFtwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5lbnYnKSwgcGF0aC5yZXNvbHZlKGRpclBhdGgsICdtaXNlLnRvbWwnKV07XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZW52RmlsZVBhdGhzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWwob2JqZWN0TGl0ZXJhbDogc3RyaW5nKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICAncGxheXdyaWdodC1jb25maWcudHMnLFxuICAgIGBjb25zdCBjb25maWcgPSAke29iamVjdExpdGVyYWx9O2AsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICAgIHRzLlNjcmlwdEtpbmQuVFNcbiAgKTtcbiAgY29uc3Qgc3RhdGVtZW50ID0gc291cmNlLnN0YXRlbWVudHNbMF07XG4gIGlmICghc3RhdGVtZW50IHx8ICF0cy5pc1ZhcmlhYmxlU3RhdGVtZW50KHN0YXRlbWVudCkpIHJldHVybjtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBzdGF0ZW1lbnQuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1swXTtcbiAgaWYgKCFkZWNsYXJhdGlvbj8uaW5pdGlhbGl6ZXIgfHwgIXRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIpKSByZXR1cm47XG4gIHJldHVybiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyLCBzb3VyY2UpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8ICghdHMuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICF0cy5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgcGFyc2VkW3Byb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uLCBzb3VyY2U6IHRzLlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyBhc09iamVjdChwYXJzZWRPYmplY3QpIDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKHRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIHJldHVybiBzdHJpbmdpZnlBcnJheSh2YWx1ZS52YWx1ZSwgbGV2ZWwpO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgcmV0dXJuIHN0cmluZ2lmeU9iamVjdCh2YWx1ZS52YWx1ZSwgbGV2ZWwpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBcnJheSh2YWx1ZXM6IFBhcnNlZFZhbHVlW10sIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICB9KTtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdChvYmplY3Q6IFBhcnNlZE9iamVjdCwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUodmFsdWUsIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICB9XG4gICAgfVxuICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL0RBVEFCQVNFX1VSTD1cIj8oLitcXC5zcWxpdGUzKVwiP1tcXG4kXS8sXG4gICAgICAgICdEQVRBQkFTRV9VUkw9XCIkMT9jb25uZWN0aW9uX2xpbWl0PTFcIlxcbidcbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSkpO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogb2JqZWN0W10sIHNvdXJjZTogb2JqZWN0W10sIG9wdGlvbnM6IGFueSk6IG9iamVjdFtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0gYXMgb2JqZWN0LCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvcnQgdGhlIGtleXMgb2YgdGhlIG9iamVjdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZT86IHN0cmluZztcbiAgb24/OiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8c3RyaW5nLCBKb2I+O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnYXV0b2ZpeC5jaScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIHB1c2g6IHtcbiAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICB9LFxuICB9LFxuICBwZXJtaXNzaW9uczoge1xuICAgIGNvbnRlbnRzOiAncmVhZCcsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICdhdXRvZml4LSR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDogeyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9LFxuICB9LFxufTtcblxuY29uc3QgcHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnRml4IGNvZGUgYXV0b21hdGljYWxseScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7XG4gICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2F1dG9maXgueW1sQG1haW4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBsaW50ZXIgZml4XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNsYXVkZSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDbGF1ZGUgQ29kZScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jbGF1ZGUnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY2xhdWRlLWNvZGUnLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiAnJHt7IHNlY3JldHMuQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4gfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNvZGV4Jzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENvZGV4IENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jb2RleCcpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjb2RleC1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIE9QRU5BSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuT1BFTkFJX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWdlbWluaSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBHZW1pbmkgQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWdlbWluaScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdnZW1pbmktY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHRU1JTklfQVBJX0tFWTogJyR7eyBzZWNyZXRzLkdFTUlOSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlTmFtZXNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYWRkLWZvY3VzZWQtaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICdub3RpZnktcmVhZHkueW1sJyxcbiAgICAnd2JmeS55bWwnLFxuICAgICd3YmZ5LW1lcmdlLnltbCcsXG4gIF07XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnZ2VuLXByLWNsYXVkZS55bWwnLFxuICAgICAgJ2dlbi1wci1jb2RleC55bWwnLFxuICAgICAgJ2dlbi1wci1nZW1pbmkueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhZGQtaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICBmaWxlTmFtZVNldC5kZWxldGUoJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0LnltbCcpO1xuICAgIGZpbGVOYW1lU2V0LmRlbGV0ZSgnbm90aWZ5LXJlYWR5LnltbCcpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwcmVjYXRlZEZpbGVOYW1lIG9mIGZpbGVOYW1lc1RvQmVSZW1vdmVkKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGRlcHJlY2F0ZWRGaWxlTmFtZSksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVwb3NpdG9yeT8uZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKTtcblxuICBpZiAoa2luZCA9PT0gJ2F1dG9maXgnKSB7XG4gICAgYXdhaXQgd3JpdGVZYW1sKGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZyksIGZpbGVQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcbiAgLy8gU2tpcCBhIGJyb2tlbiB3b3JrZmxvd1xuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnICYmIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZSAmJiBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMpIHtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMuYWN0aW9ucyA9ICd3cml0ZSc7XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGggPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoLnRyaWdnZXJfZGVwbG95X3dvcmtmbG93ID0gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCc7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHVzZSByZWxlYXNlLnltbCBpZiByZWxlYXNlIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAncmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9uc1snaWQtdG9rZW4nXSA9ICd3cml0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LlsnaWQtdG9rZW4nXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBTZXQgdGVzdC1jb21tYW5kIGZvciBnZW4tcHIgd29ya2Zsb3dzIGJhc2VkIG9uIHBhY2thZ2UgbWFuYWdlclxuICBpZiAoa2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8IGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8IGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJykge1xuICAgIGpvYi53aXRoWyd0ZXN0LWNvbW1hbmQnXSA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuIGNoZWNrLWFsbC1mb3ItYWknIDogJ3lhcm4gY2hlY2stYWxsLWZvci1haSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG4gIC8vIFJlbW92ZSBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgbWlncmF0ZUpvYihqb2IpO1xuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gY2xvbmVEZWVwKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYxJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IGNsb25lRGVlcChwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub25fc2VsZl9ob3N0ZWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub3RpZnlfZGlzY29yZDtcbiAgZGVsZXRlIGpvYi53aXRoLnJlcXVpcmVfZmx5O1xuICBkZWxldGUgam9iLndpdGgucmVxdWlyZV9nY2xvdWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5sYWJlbDtcbiAgZGVsZXRlIGpvYi53aXRoLmxhYmVsT3BlcmF0b3I7XG4gIC8vIEFkZGVkIDIwMjUtMDgtMDZcbiAgaWYgKGpvYi53aXRoLmNpX3NpemUpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9IGpvYi53aXRoLmNpX3NpemU7XG4gICAgZGVsZXRlIGpvYi53aXRoLmNpX3NpemU7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZX1cbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn0gb24genNoXG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gQ3JlYXRlIGEgbmV3IGJyYW5jaCBpZiB0aGUgY3VycmVudCBicmFuY2ggaXMgXFxgbWFpblxcYC5cbi0gRG8gbm90IHdyaXRlIHRlc3RzIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbi0gV2hlbiBmaXhpbmcgdGVzdHMsIGdhdGhlciBkZWJ1ZyBpbmZvcm1hdGlvbiB0aHJvdWdoIGxvZ2dpbmcgYW5kIHNjcmVlbnNob3RzIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGNvZGUuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1hbGwtZm9yLWFpXFxgIHRvIGV4ZWN1dGUgYWxsIHRlc3RzICh0YWtlcyB1cCB0byAxIGhvdXIpLCBvciBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stZm9yLWFpXFxgIGZvciB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nIG9ubHkgKHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYGNoZWNrLWZvci1haVxcYC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCB0aGVtIHRvIGEgbm9uLW1haW4gYnJhbmNoIHVzaW5nIHRoZSBcXGAtLW5vLXZlcmlmeVxcYCBvcHRpb24gYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAtIEZvbGxvdyBjb252ZW50aW9uYWwgY29tbWl0czsgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIElmIG5vdCBzcGVjaWZpZWQsIG1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmhhc1N0YXJ0VGVzdClcbiAgICA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gc3RhcnQtdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJ1xufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIHJldHVybiBleHRyYUNvbnRlbnQgPyBiYXNlQ29udGVudCArICdcXG4nICsgZXh0cmFDb250ZW50LnRyaW1FbmQoKSA6IGJhc2VDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucyBvciBjbGFzc2VzLCBkZWZpbmUgdGhlbSBiZWxvdyBhbnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMgdGhhdCBjYWxsIHRoZW0gdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBjYWxsIG9yZGVyLlxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBpbnRyb2R1Y2luZyBuZXcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIFxcYGkxOG5cXGAgZGlyZWN0b3J5IChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApLiBSZWZlcmVuY2UgdGhlc2Ugc3RyaW5ncyB1c2luZyB0aGUgXFxgaTE4blxcYCB1dGlsaXR5LiBGb3IgZXhhbXBsZSwgdXNlIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGAuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGAtIFByZWZlciBcXGB1c2VJbW1lclxcYCBmb3Igc3RvcmluZyBhbiBhcnJheSBvciBhbiBvYmplY3QgdG8gXFxgdXNlU3RhdGVcXGAuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGBcbi0gU2luY2UgdGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIFxcYHVzZUNhbGxiYWNrXFxgIG9yIFxcYHVzZU1lbW9cXGAgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbi0gQXNzdW1lIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLlxuYFxuICAgIDogJydcbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJpb21lSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSB7XG4gICAgICByb290OiBjb25maWcuaXNSb290LFxuICAgICAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICAgICAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG4gICAgfTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlID0gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG5baW5zdGFsbF1cbmV4YWN0ID0gdHJ1ZVxubGlua2VyID0gXCJob2lzdGVkXCJcbm1pbmltdW1SZWxlYXNlQWdlID0gNDMyMDAwICMgNSBkYXlzXG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuICAgIFwiQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3RcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHRcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdFwiLFxuICAgIFwiQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZ1wiLFxuICAgIFwiQHdpbGxib29zdGVyL3NoYXJlZC1saWJcIixcbiAgICBcIkB3aWxsYm9vc3Rlci93YlwiLFxuICAgIFwibmV4dFwiLFxuICAgIFwiQG5leHQvKlwiLFxuICAgIFwicmVhY3RcIixcbiAgICBcInJlYWN0LWRvbVwiXG5dXG5gO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UgPSBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZS5yZXBsYWNlKCdleGFjdCA9IHRydWUnLCAnZXhhY3QgPSBmYWxzZScpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykuaW5jbHVkZXMoJ2V4YWN0ID0gZmFsc2UnKVxuICAgICAgICA/IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZVxuICAgICAgICA6IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIGVzbGludDogWydjanMnLCAnbWpzJywgJ2pzJywgJ2N0cycsICdtdHMnLCAndHMnLCAndHN4JywgJ2pzeCddLnRvU29ydGVkKCksXG4gIHByZXR0aWVyOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2phdmEnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgLy8gY2YuIGh0dHBzOi8vYmlvbWVqcy5kZXYvaW50ZXJuYWxzL2xhbmd1YWdlLXN1cHBvcnQvXG4gIGJpb21lOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICd2dWUnLFxuICAgICdzdmVsdGUnLFxuICAgICdhc3RybycsXG4gICAgJ2NzcycsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdncWwnLFxuICBdLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRyYycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBmaWxlc1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludGlnbm9yZScpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5tanMnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmVzbGludEJhc2UpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoIW9sZENvbnRlbnQuaW5jbHVkZXMoJ2V4cG9ydCB7IGRlZmF1bHQgfScpKSByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnJHtjb25maWcuZXNsaW50QmFzZX0nO2ApKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBjbG9uZURlZXAoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYOS7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAglxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfSR7XG4gICAgICBleHRyYUNvbnRlbnQgPyBgXFxuXFxuJHtleHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSldO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzdHlsZWd1aWRlRmlsZVBhdGgpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4uc2VyZW5hL1xuLnRtcC9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3QgcHJldHRpZXJDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5jb25zdCBiaW9tZUNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdidW4nLCAnLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vYmlvbWUgY2hlY2sgLS1maXggLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tc2tpcC1wYXJzZS1lcnJvcnMnLCAnQmlvbWUnLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Hb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICBjb25zdCBrZXkgPSBvd25lciA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVI7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5jb25zdCBqc0NvbW1vbkRlcHMgPSBbXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJywgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz4pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSk7XG5cbiAgaWYgKCdjaGVjay1mb3ItYWknIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgIGlmICgnZ2VuLWNvZGUnIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgICB9XG4gICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID0gKGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKFxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICB9IGVsc2Uge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsaW50LXN0YWdlZCcpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC93YlxccytkYi8sICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuZXNsaW50O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLm1pY3JvbWF0Y2g7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3R5cGVzY3JpcHQnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmVzbGludERlcHNbY29uZmlnLmVzbGludEJhc2VdKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnLCAnY2hlY2stZm9yLWFpJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gKGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAnJykgKyBFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgvWy9cXFxcXS8pO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmIHBvZXRyeSBydW4gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5KSB7XG4gICAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3SnNvblRleHQpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXZEZXBlbmRlbmNpZXMuXG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0ubWFwKGdldERlcGVuZGVuY3lTcGVjaWZpZXIpO1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgb21pdCB2ZXJzaW9ucyB0byB1cGRhdGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnMgd2l0aCBZYXJuLlxuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGV2RGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXS5tYXAoZ2V0RGVwZW5kZW5jeVNwZWNpZmllcik7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAnLS1leGFjdCcsIC4uLmRldkRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBvbWl0IHZlcnNpb25zIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyB3aXRoIFlhcm4uXG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5kZXZEZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKCdsZXJuYS5qc29uJywgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgLy8gTWlncmF0ZSBmcm9tIEVTTGludCBsZWdhY3kgY29uZmlncyB0byBmbGF0IGNvbmZpZ3MsXG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1pbXBvcnQnXTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBlc2xpbnQgdjEwIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFdpbGxCb29zdGVyIEVTTGludCBjb25maWcgc3RhY2sgeWV0LlxuICBpZiAoZGVwZW5kZW5jeSA9PT0gJ2VzbGludCcpIHJldHVybiAnZXNsaW50QF45JztcbiAgcmV0dXJuIGRlcGVuZGVuY3k7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICdidW4gcnVuIGNoZWNrLWZvci1haSAmJiBidW4gcnVuIHRlc3QgLS1zaWxlbnQnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGBidW4gcnVuIGNsZWFudXAke2hhc1R5cGVjaGVjayA/ICcgJiYgYnVuIHJ1biB0eXBlY2hlY2snIDogJyd9YCxcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ3lhcm4gY2hlY2stZm9yLWFpICYmIHlhcm4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYHlhcm4gZm9ybWF0ID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlJHtcbiAgICAgICAgaGFzVHlwZWNoZWNrID8gJyAmJiB5YXJuIHR5cGVjaGVjaycgOiAnJ1xuICAgICAgfSAmJiB5YXJuIGxpbnQtZml4IC0tcXVpZXRgLFxuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeWAsXG4gICAgICBsaW50OiBgZXNsaW50IC0tY29sb3JgLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImAsXG4gICAgICB0eXBlY2hlY2s6ICd0c2MgLS1ub0VtaXQnLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnkgJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oXG4gICAgICAgICAgICAnLCdcbiAgICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guXG4gICAgICAgICAgLy8gRk9SQ0VfQ09MT1I9MyBtYWtlIHdiIGVuYWJsZSBjb2xvciBvdXRwdXQuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgRk9SQ0VfQ09MT1I9MyB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG4gICAgaWYgKG9sZFRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgICAvLyBgd2JgIHN1cHBvcnRzIGAtLXNpbGVudGAgb3B0aW9uXG4gICAgICBzY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ10gPSAoc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddID8/ICcnKSArICcgLS1zaWxlbnQnO1xuICAgIH1cblxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4U2NyaXB0TmFtZXMoXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5ld0pzb25UZXh0OiBzdHJpbmcsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5rZXlzKHNjcmlwdHMpKSB7XG4gICAgaWYgKGtleSAmJiAha2V5LnN0YXJ0c1dpdGgoJzonKSAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBjb21tYW5kczoge1xuICAgICAgY2xlYW51cDoge1xuICAgICAgICBnbG9iOiBzdHJpbmc7XG4gICAgICAgIHJ1bjogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiBzdHJpbmc7XG4gICAgICAgIHJ1bjogc3RyaW5nO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBjb21tYW5kczoge1xuICAgIGNsZWFudXA6IHtcbiAgICAgIGdsb2I6ICcqLntjanMsY3NzLGN0cyxodG0saHRtbCxqcyxqc29uLGpzb241LGpzb25jLGpzeCxtZCxtanMsbXRzLHNjc3MsdHMsdHN4LHZ1ZSx5YW1sLHltbH0nLFxuICAgICAgcnVuOiAnJyxcbiAgICB9LFxuICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5pZiBncmVwIC1xICdXYXJuaW5nczonIHtzdGFnZWRfZmlsZXN9OyB0aGVuXG4gIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGVzICh7c3RhZ2VkX2ZpbGVzfSkgY29udGFpbiB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gIGV4aXQgMVxuZmlcbmAudHJpbSgpLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IGh1c2t5RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBjb25zdCBoYXNIdXNreURpciA9IGZzLmV4aXN0c1N5bmMoaHVza3lEaXJQYXRoKTtcbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgLi4ucHJlQ29tbWl0U2V0dGluZ3MsXG4gICAgICBjb21tYW5kczoge1xuICAgICAgICAuLi5wcmVDb21taXRTZXR0aW5ncy5jb21tYW5kcyxcbiAgICAgICAgY2xlYW51cDoge1xuICAgICAgICAgIC4uLnByZUNvbW1pdFNldHRpbmdzLmNvbW1hbmRzLmNsZWFudXAsXG4gICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuICBpZiAoIXR5cGVjaGVjaykge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoaGFzSHVza3lEaXIpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5wcm9taXNlcy5ybShodXNreURpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGxldCB0eXBlY2hlY2tDb21tYW5kOiBzdHJpbmc7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlY2hlY2tDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyA6ICdidW4gcnVuIHR5cGVjaGVjayc7XG4gIH0gZWxzZSB7XG4gICAgdHlwZWNoZWNrQ29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAneWFybiB3YiB0eXBlY2hlY2snIDogJ3lhcm4gcnVuIHR5cGVjaGVjayc7XG4gIH1cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7dHlwZWNoZWNrQ29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiB0eXBlY2hlY2tDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzQnVuICYmIGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICByZXR1cm4gJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ2J1biBydW4gY2xlYW51cCAmJiBnaXQgYWRkIHtzdGFnZWRfZmlsZXN9JztcbiAgfVxuICByZXR1cm4gJ3lhcm4gcnVuIGNsZWFudXAgJiYgZ2l0IGFkZCB7c3RhZ2VkX2ZpbGVzfSc7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSAmJiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykke3BhY2thZ2VzRmlsdGVyfSk7JHtnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWcpfVxuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xcYCR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnJHtwYWNrYWdlUHJlZml4fXNvcnQtcGFja2FnZS1qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfSxcbiAgJy4vKiovbWlncmF0aW9uLnNxbCc6IChmaWxlcykgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdXYXJuaW5nczonKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXFxgZWNobyAnISEhIE1pZ3JhdGlvbiBTUUwgZmlsZSAoXFwke3BhdGgucmVsYXRpdmUoJycsIGZpbGUpfSkgY29udGFpbnMgd2FybmluZ3MgISEhIFNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLidcXGAsXG4gICAgICAgICdmYWxzZScsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4ve2xpYix0ZXN0LHRlc3RfZHJpdmVyfS8qKi8qLmRhcnQnOiBmaWxlcyA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCdnZW5lcmF0ZWQnKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5lbmRzV2l0aCgnLmZyZWV6ZWQuZGFydCcpICYmICFmaWxlLmVuZHNXaXRoKCcuZy5kYXJ0JykpO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXFxgZGFydCBmb3JtYXQgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gIH0sYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCA/IFwiY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcXG5cIiA6ICcnfVxubW9kdWxlLmV4cG9ydHMgPSB7JHtsaW5lcy5qb2luKCcnKX1cbn07XG5gO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5tYXAoKGRpcikgPT4gYCR7ZGlyfS8qKi9gKTtcbiAgcmV0dXJuIGB7LCR7ZGlycy5qb2luKCcsJyl9fSoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV0/LlswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldPy5bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgc3VjY2Vzc0NvbW1lbnQgYW5kIGZhaWxDb21tZW50IHByb3BlcnRpZXMgZnJvbSBvbGRDb25maWdcbiAgICAgICAgY29uc3QgeyBmYWlsQ29tbWVudDogXzEsIHN1Y2Nlc3NDb21tZW50OiBfMiwgLi4uY2xlYW5PbGRDb25maWcgfSA9IG9sZENvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGNsZWFuT2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgZXJhc2FibGVTeW50YXhPbmx5OiB0cnVlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuLi8uLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4uLy4uL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogWydzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIFByZXNlcnZlIEJ1bmRsZXIgcmVzb2x1dGlvbiBzbyB0b29saW5nIHN0YXlzIGFsaWduZWQgd2l0aCBwYWNrYWdlIHNldHRpbmdzLlxuICAgICAgY29uc3Qgc2hvdWxkUHJlc2VydmVCdW5kbGVyUmVzb2x1dGlvbiA9XG4gICAgICAgIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb24gPz8gJycpLnRvTG93ZXJDYXNlKCkgPT09ICdidW5kbGVyJztcbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSB8fCBzaG91bGRQcmVzZXJ2ZUJ1bmRsZXJSZXNvbHV0aW9uKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlUmVzb2x1dGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICAgICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICAgICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInLFxuICAgICAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICAgICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgICAgICduZXh0JyxcbiAgICAgICdAbmV4dC8qJyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgcGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciA9ICdfX1BNX1JVTl9fJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50LCBjb25maWcpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIGNvbnRlbnQpID4gY29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2VBbGwocGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciwgcGFja2FnZU1hbmFnZXJDb21tYW5kKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICAvLyBzb3VyY2UgY29kZSBmaWxlc1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgaGFzU3RhcnRUZXN0OiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBlc2xpbnRCYXNlPzogRXNsaW50RXh0ZW5zaW9uQmFzZTtcbiAgaGFzVmVyc2lvblNldHRpbmdzOiBib29sZWFuO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuZmlnLnRvbWwnKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgaGFzU3RhcnRUZXN0OiAhIXBhY2thZ2VKc29uLnNjcmlwdHM/Llsnc3RhcnQtdGVzdCddLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgcmV0LmZ1bGxfbmFtZSA9IHJlZGlyZWN0ZWRGdWxsTmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBFU0xJTlRfQ09ORklHX1BSRUZJWCA9ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy0nO1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKEVTTElOVF9DT05GSUdfUFJFRklYKSA9PT0gdHJ1ZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB5YXJuIGJlcnJ5XG4gICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZml4RG9ja2VyZmlsZShyb290Q29uZmlnKSxcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4VHlwZURlZmluaXRpb25zKGNvbmZpZywgY29uZmlnLmlzUm9vdCA/IGFsbFBhY2thZ2VDb25maWdzIDogW2NvbmZpZ10pKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIGFyZ3Yuc2tpcERlcHMpO1xuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgICAvLyAneWFybiBpbnN0YWxsJyBzaG91bGQgYmUgYWZ0ZXIgYHlhcm4gY2xlYW51cGAgYmVjYXVzZSB5YXJuIGJlcnJ5IGdlbmVyYXRlcyB5YXJuLmxvY2tcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50cyBvZiBkZXBlbmRhbnQgc3ViLXBhY2thZ2UgaW4gbW9ub3JlcG9cbiAgICBpZiAoIXJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sIm5hbWVzIjpbIm9wdGlvbnMiLCJpc1ZlcmJvc2UiLCJkb2VzVXBsb2FkRW52VmFycyIsImxvZ2dlciIsImZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24iLCJuYW1lIiwiZnVuYyIsImNvbnNvbGUiLCJpbmZvIiwiZXJyb3IiLCJFcnJvciIsInN0YWNrIiwiU3RyaW5nIiwiYXN5bmMiLCJmaXhEb2NrZXJmaWxlIiwiY29uZmlnIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwib2xkQ29udGVudCIsImRvY2tlcmZpbGUiLCJuZXdDb250ZW50IiwiZnMiLCJ3cml0ZUZpbGUiLCJwYXRoIiwiam9pbiIsImRpclBhdGgiLCJmc1V0aWwiLCJyZWFkRmlsZUlnbm9yaW5nRXJyb3IiLCJmaWxlUGF0aCIsInByb21pc2VzIiwicmVhZEZpbGUiLCJnZW5lcmF0ZUZpbGUiLCJjb250ZW50IiwibWtkaXIiLCJkaXJuYW1lIiwicmVjdXJzaXZlIiwibm9ybWFsaXplZENvbnRlbnQiLCJyZXBsYWNlQWxsIiwidHJpbSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhOZXh0Q29uZmlnSnNvbiIsIm1hcCIsImV4dCIsInJlc29sdmUiLCJmaW5kIiwicCIsImV4aXN0c1N5bmMiLCJyZXBsYWNlIiwiXyIsInNldHRpbmdzVGV4dCIsImluY2x1ZGVzIiwicnVuIiwibGl0ZXJhbCIsInZhbHVlIiwia2luZCIsImFzT2JqZWN0IiwiZGVmYXVsdENvbmZpZyIsImZvcmJpZE9ubHkiLCJyZXRyaWVzIiwidXNlIiwiYmFzZVVSTCIsInRyYWNlIiwic2NyZWVuc2hvdCIsInZpZGVvIiwid2ViU2VydmVyIiwiY29tbWFuZCIsInVybCIsInJldXNlRXhpc3RpbmdTZXJ2ZXIiLCJ0aW1lb3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwiZW52IiwiZ3JhY2VmdWxTaHV0ZG93biIsImZpeFBsYXl3cmlnaHRDb25maWciLCJtYXRjaCIsImV4ZWMiLCJvYmplY3RMaXRlcmFsIiwicGFyc2VkIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIlRTIiwic3RhdGVtZW50Iiwic3RhdGVtZW50cyIsImlzVmFyaWFibGVTdGF0ZW1lbnQiLCJkZWNsYXJhdGlvbiIsImRlY2xhcmF0aW9uTGlzdCIsImRlY2xhcmF0aW9ucyIsImluaXRpYWxpemVyIiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJwYXJzZU9iamVjdExpdGVyYWwiLCJtZXJnZWQiLCJtZXJnZSIsImFsbCIsIkJvb2xlYW4iLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJoYXNCYXNlVXJsIiwiZW52RmlsZVBhdGhzIiwiZW52RmlsZVBhdGgiLCJ0ZXN0IiwiaGFzTmV4dFB1YmxpY0Jhc2VVcmwiLCJ1c2VDb25maWciLCJuZXdPYmplY3RMaXRlcmFsIiwic3RyaW5naWZ5T2JqZWN0IiwicHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJwYXJzZUV4cHJlc3Npb24iLCJ1bmRlZmluZWQiLCJnZXRUZXh0IiwiZXhwcmVzc2lvbiIsInBhcnNlZE9iamVjdCIsImlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiIsImVsZW1lbnRzIiwiZWxlbWVudCIsInNvbWUiLCJzdHJpbmdpZnlWYWx1ZSIsImxldmVsIiwidmFsdWVzIiwibGVuZ3RoIiwiaW5kZW50IiwicmVwZWF0IiwibGluZXMiLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiYXQiLCJpbmRleCIsImNsb3NpbmdJbmRlbnQiLCJzdHJpbmdpZnlBcnJheSIsIm9iamVjdCIsIk9iamVjdCIsImVudHJpZXMiLCJrZXkiLCJnbG9iSWdub3JlIiwiZml4UHJpc21hRW52RmlsZXMiLCJlbnZGaWxlcyIsImZnIiwiZ2xvYiIsImRvdCIsImN3ZCIsImlnbm9yZSIsImVudkZpbGUiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiUHJvbWlzZSIsIm5ld1Rlc3REaXJQYXRoIiwicGFja2FnZURpclBhdGgiLCJvbGRUZXN0RGlyTmFtZSIsIm9sZFRlc3REaXJQYXRoIiwicmVuYW1lIiwiZml4VHlwZURlZmluaXRpb25zIiwiY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuIiwibGliVHlwZURpclBhdGgiLCJzcmNUeXBlRGlyUGF0aCIsImlzUm9vdCIsImRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImlzRmlsZSIsImlzRGlyZWN0b3J5Iiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwicHVzaCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93Iiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsInBlcm1pc3Npb25zIiwiY29udGVudHMiLCJjb25jdXJyZW5jeSIsImdyb3VwIiwiam9icyIsImF1dG9maXgiLCJwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyIsInVzZXMiLCJ3b3JrZmxvd3MiLCJyZWxlYXNlIiwicHVsbF9yZXF1ZXN0X3RhcmdldCIsInR5cGVzIiwic3luYyIsImlzc3VlcyIsImlmIiwid2l0aCIsInNlY3JldHMiLCJDTEFVREVfQ09ERV9PQVVUSF9UT0tFTiIsIk9QRU5BSV9BUElfS0VZIiwiR0VNSU5JX0FQSV9LRVkiLCJnZW5lcmF0ZVdvcmtmbG93cyIsInJvb3RDb25maWciLCJmaWxlTmFtZXNUb0JlUmVtb3ZlZCIsImlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIiwicmVwb3NpdG9yeSIsIndvcmtmbG93c1BhdGgiLCJzZW1hbnRpY1ltbFBhdGgiLCJybSIsImZvcmNlIiwiZmlsZU5hbWVTZXQiLCJTZXQiLCJmaWx0ZXIiLCJkZXBlbmRpbmciLCJzZW1hbnRpY1JlbGVhc2UiLCJhZGQiLCJkZWxldGUiLCJmaWxlTmFtZSIsImJhc2VuYW1lIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJkZXByZWNhdGVkRmlsZU5hbWUiLCJkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMiLCJ3cml0ZVlhbWwiLCJpc1B1YmxpY1JlcG8iLCJjbG9uZURlZXAiLCJwYWNrYWdlTWFuYWdlciIsImlzQnVuIiwic3RlcHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJzdGFydHNXaXRoIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJtaWdyYXRlV29ya2Zsb3ciLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJub25fc2VsZl9ob3N0ZWQiLCJub3RpZnlfZGlzY29yZCIsInJlcXVpcmVfZmx5IiwicmVxdWlyZV9nY2xvdWQiLCJsYWJlbCIsImxhYmVsT3BlcmF0b3IiLCJjaV9zaXplIiwiY2lfbGFiZWwiLCJtaWdyYXRlSm9iIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJrZXlzIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJmaXhUeXBvc0luQ29kZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiYyIsImhhc1N0YXJ0VGVzdCIsImdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSIsInRyaW1FbmQiLCJnZW5JMThuVHMiLCJyZWFjdCIsIm5leHQiLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJyb290IiwiJHNjaGVtYSIsImV4dGVuZHMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZSIsIm5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZSIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInJlYWRGaWxlU3luYyIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsInRoaXMiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiYmlvbWUiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50cmMiLCJlc2xpbnRCYXNlIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJzdHlsZWd1aWRlQ29udGVudCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJuYW1lcyIsImRvZXNDb250YWluR2VtZmlsZSIsImRvZXNDb250YWluR29Nb2QiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJibGl0eiIsImZpcmViYXNlIiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJyZXNwb25zZSIsImZldGNoIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiYXJncyIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJzcGF3blN5bmMiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInRvU3RyaW5nIiwicyIsIm1lc3NhZ2UiLCJwcm9jZXNzIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsIm9yZ2FuaXphdGlvbiIsInJlcG8iLCJyZXBvVXJsIiwiY29tbWl0SGFzaCIsInJlamVjdCIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsIm9jdG9raXRDYWNoZSIsIk1hcCIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsImdldCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwic2V0IiwiaGFzR2l0SHViVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIiwiR0lUSFVCX1RPS0VOIiwianNDb21tb25EZXBzIiwidHNDb21tb25EZXBzIiwicmVhY3RDb21tb25EZXBzIiwiZXNsaW50RGVwcyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25UZXh0IiwianNvbk9iaiIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImxpbmUiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJ2ZXJzaW9uIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIndiIiwibWljcm9tYXRjaCIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwiZGVwIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsInNjcmlwdE5hbWUiLCJzY3JpcHQiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwic2l6ZSIsImRpck5hbWVzU3RyIiwicGFja2FnZU5hbWVzIiwiaGFzIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiZ2V0RGVwZW5kZW5jeVNwZWNpZmllciIsImRldkRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiY29yZSIsImRlcGVuZGVuY3kiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsIm9sZFRlc3QiLCJweXJpZ2h0IiwiYmFzZVNldHRpbmdzIiwicHJlQ29tbWl0U2V0dGluZ3MiLCJjb21tYW5kcyIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwiaHVza3lEaXJQYXRoIiwiaGFzSHVza3lEaXIiLCJzZXR0aW5ncyIsImdldENsZWFudXBDb21tYW5kIiwicHJlUHVzaCIsInR5cGVjaGVja0NvbW1hbmQiLCJnZXRQcmVQdXNoU2NyaXB0IiwibWtkaXJTeW5jIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJwb3N0TWVyZ2VDb21tYW5kcyIsImhhc1ZlcnNpb25TZXR0aW5ncyIsInRvb2xzQ2hhbmdlZFBhdHRlcm4iLCJyYXciLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJzcmNEaXJlY3RvcmllcyIsIm5vZGUiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsInBhY2thZ2VQcmVmaXgiLCJnZXRFc2xpbnRLZXkiLCJwYWNrYWdlc0ZpbHRlciIsImdldEVzbGludEZpbHRlckZvclByZXR0aWVyIiwiZ2V0U3JjRGlycyIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsImJhZGdlIiwicmVhZG1lIiwiaSIsImdlbmVyYXRlUmVsZWFzZXJjIiwicGx1Z2lucyIsInBsdWdpbiIsInByZXNldCIsImZhaWxDb21tZW50IiwiXzEiLCJzdWNjZXNzQ29tbWVudCIsIl8yIiwiY2xlYW5PbGRDb25maWciLCJzdWNjZXNzQ29tbWVudENvbmRpdGlvbiIsImZhaWxDb21tZW50Q29uZGl0aW9uIiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsIm1vZHVsZSIsIm1vZHVsZVJlc29sdXRpb24iLCJqc3giLCJhbHdheXNTdHJpY3QiLCJzdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJza2lwTGliQ2hlY2siLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJzb3VyY2VNYXAiLCJpbXBvcnRIZWxwZXJzIiwiZXJhc2FibGVTeW50YXhPbmx5Iiwib3V0RGlyIiwidHlwZVJvb3RzIiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwiaXNFc21QYWNrYWdlIiwic2hvdWxkUHJlc2VydmVCdW5kbGVyUmVzb2x1dGlvbiIsInRvTG93ZXJDYXNlIiwic29ydCIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwiY3VycmVudFZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwidmVyc2lvbnNKc29uIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldE1ham9yTnVtYmVyIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsIm5vZGVMaW5rZXIiLCJubU1vZGUiLCJucG1NaW5pbWFsQWdlR2F0ZSIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwibWFqb3IiLCJOdW1iZXIiLCJzZXR1cExhYmVscyIsInNldHVwTGFiZWwiLCJkZWxldGVMYWJlbCIsIndhcm4iLCJjb2xvciIsInJlcXVlc3QiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInNldHVwU2VjcmV0cyIsImRvdGVudiIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwiZGF0YSIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfYXV0b19tZXJnZSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImFsbG93X3VwZGF0ZV9icmFuY2giLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUiLCJkaXN0YW5jZSIsInRlbXBsYXRlIiwicGFja2FnZU1hbmFnZXJDb21tYW5kIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwicGFja2FnZUpzb25QYXRoIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInR5cGUiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwianNvbiIsImZzcCIsImZsYXQiLCJyZXBvSW5mbyIsImdpdCIsInNpbXBsZUdpdCIsIm9yaWdpbiIsImdldFJlbW90ZXMiLCJyIiwicmVtb3RlVXJsIiwicmVmcyIsInJlcXVlc3RSZXBvSW5mbyIsImZldGNoUmVwb0luZm8iLCJjdXJyZW50IiwiaGFzVmVyc2lvblNldHRpbmdzRmlsZSIsInByZWZpeCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJucG0iLCJnZXRFc2xpbnRFeHRlbnNpb25CYXNlIiwicGF0dGVybiIsIm9yZyIsInJldCIsImFzc2lnbiIsInJlZGlyZWN0ZWRGdWxsTmFtZSIsImxvY2F0aW9uIiwiZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZSIsInNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIiwiYXJndiIsInlhcmdzIiwicG9zaXRpb25hbCIsImRlc2NyaWJlIiwiYXJyYXkiLCJkZWZhdWx0IiwiYWxpYXMiLCJza2lwRGVwcyIsInZlcmJvc2UiLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsInJvb3REaXJQYXRoIiwicGF0aHMiLCJwYWNrYWdlc0RpclBhdGgiLCJzdWJEaXJQYXRocyIsImlnbm9yZUVycm9yQXN5bmMiLCJkIiwiYWJicmV2aWF0aW9uUHJvbWlzZSIsInN1YlBhY2thZ2VDb25maWdzIiwic3ViRGlyUGF0aCIsImFsbFBhY2thZ2VDb25maWdzIiwic2hvdWxkUnVuV29ya2Zsb3dzIiwidGhlbiIsInJtU3luYyJdLCJtYXBwaW5ncyI6Im1vQkFLTyxNQUFNQSxFQUFVLElBTHZCLE1BQ0VDLFdBQVksRUFDWkMsbUJBQW9CLEdDZ0JmLE1BQU1DLEVBQVMsSUFoQnRCLE1BQ0UsK0JBQU1DLENBQTBCQyxFQUFjQyxHQUN4Q04sRUFBUUMsV0FDVk0sUUFBUUMsS0FBSyxhQUFhSCxxQkFFNUIsVUFDUUMsR0FDUixDQUFFLE1BQU9H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
1
+ import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"yargs";import r from"node:fs/promises";import{PromisePool as a}from"minimal-promise-pool";import c from"deepmerge";import l from"typescript";import d from"fast-glob";import p from"js-yaml";import u from"lodash.clonedeep";import m from"node:os";import f from"node:child_process";import{Octokit as g}from"@octokit/core";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{isVerbose=!1;doesUploadEnvVars=!1};const x=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function _(e){return x.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await r.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const j={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},S=new a;async function P(n){return x.functionIgnoringException("fixNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await S.run(()=>j.generateFile(s,i))})}const $=e=>({kind:"literal",value:e}),C=e=>({kind:"object",value:e}),E={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:$("process.env.NEXT_PUBLIC_BASE_URL"),trace:$("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:$("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:$("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:$("'yarn start-test-server'"),url:$("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:$("!!process.env.CI"),timeout:$("300_000"),stdout:$("'pipe'"),stderr:$("'pipe'"),env:$("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:$("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function F(n){return x.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),r=o?.[1];if(!r)return;const a=function(e){const t=l.createSourceFile("playwright-config.ts",`const config = ${e};`,l.ScriptTarget.Latest,!0,l.ScriptKind.TS),n=t.statements[0];if(!n||!l.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!l.isObjectLiteralExpression(s.initializer))return;return B(s.initializer,t)}(r);if(!a)return;const d=c.all([E,a]);Boolean(n.packageJson?.scripts?.["start-test-server"])||delete d.webServer;const p=await async function(n){const s=[t.resolve(n,".env"),t.resolve(n,"mise.toml")];for(const t of s)try{const n=await e.promises.readFile(t,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(n))return!0}catch{}return!1}(n.dirPath);if(!p){const e=d.use;"object"===e?.kind&&delete e.value.baseURL}const u=I(d,0),m=i.replace(r,u);await S.run(()=>j.generateFile(s,m))})}function B(e,t){const n={};for(const s of e.properties){if(!l.isPropertyAssignment(s)||!l.isIdentifier(s.name)&&!l.isStringLiteral(s.name))return;const e=O(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function O(e,t){if(l.isObjectLiteralExpression(e)){const n=B(e,t);return n?C(n):$(e.getText(t))}if(l.isArrayLiteralExpression(e)){const n=e.elements.map(e=>O(e,t));return n.some(e=>void 0===e)?$(e.getText(t)):{kind:"array",value:n}}return $(e.getText(t))}function A(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=A(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:I(e.value,t)}function I(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=A(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const T=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function R(e){return x.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await d.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:T});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await r.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await r.writeFile(n,i)}})}async function D(n){return x.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const o=t.join(n,i);try{await e.promises.rename(o,s);const r=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=r.replaceAll(i,"test");if(r===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function W(e,s){return x.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),a=await n(()=>r.readdir(i,{withFileTypes:!0}));if(a)for(const e of a){const a=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?a:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const d=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?d?(await r.mkdir(t.join(i,a)),await S.run(()=>r.rename(t.join(i,e.name),t.join(i,a,"index.d.ts")))):o&&(await r.mkdir(o,{recursive:!0}),await S.run(()=>r.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!d&&(await r.mkdir(o,{recursive:!0}),await S.run(()=>n(()=>r.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function N(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=c(e[i],o,n):e.includes(o)||s.push(o);return s}function J(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&J(s);return e}const G={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},U={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},z={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function q(n){const s=["add-focused-issue-to-project.yml","add-issue-to-project.yml","add-ready-issue-to-project.yml","notify-ready.yml","wbfy.yml","wbfy-merge.yml"];return x.functionIgnoringException("generateWorkflow",async()=>{if(M(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const o=t.resolve(n.dirPath,".github","semantic.yml");await S.run(()=>e.promises.rm(o,{force:!0,recursive:!0}));const r=await e.promises.readdir(i,{withFileTypes:!0}),a=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&a.add("release.yml"),a.delete("add-issue-to-project.yml"),a.delete("add-ready-issue-to-project.yml"),a.delete("notify-ready.yml");for(const e of a){const s=t.basename(e,".yml");await S.run(()=>H(n,i,s))}for(const n of s)await S.run(()=>e.promises.rm(t.join(i,n),{force:!0,recursive:!0}))})}function M(e){return e?.endsWith("/reusable-workflows")??!1}async function H(n,s,i){const o=t.join(s,`${i}.yml`),r=e.existsSync(t.join(s,"deploy-production.yml"));if("autofix"===i)return void await K(function(e){if(!e.isPublicRepo)return u(U);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=u(G),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),o);let a=u(i in z?z[i]:{});if(!("jobs"in a))return;try{const t=await e.promises.readFile(o,"utf8"),n=p.load(t);a=c.all([a,n,a],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===i&&a.jobs.release&&r&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let l=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Y(n,e,i),l=!0);if(l){switch(i){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(function(e){delete e.jobs["add-to-project"]}(a),await K(a,o),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await K(a,t.join(s,"sync-force.yml"))}}}function Y(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.label,delete e.with.labelOperator,e.with.ci_size&&(e.with.ci_label=e.with.ci_size,delete e.with.ci_size)}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?J(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=J(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function K(t,n){const s=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function V(n){return x.functionIgnoringException("fixTypos",async()=>{if(M(n.repository))return;const s=n.dirPath,i=await d.glob("**/*.md",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await S.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=X(t);s=Z(s,n,"doc"),t!==s&&await j.generateFile(i,s)})}const o=await d.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${o.length} TypeScript files in ${s}`);for(const i of o){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=Q(r);a=Z(a,n,"ts"),r!==a&&await j.generateFile(o,a)}const r=await d.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${r.length} text-based files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=X(r);a=Z(a,n,"text"),r!==a&&await j.generateFile(o,a)}await S.promiseAll()})}function X(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Q(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function Z(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}async function ee(e,n){return x.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await j.readFileIgnoringError(s);for(const[s,o]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const r=te(e,n,o,i),a=t.resolve(e.dirPath,s);await S.run(()=>j.generateFile(a,r))}const o=t.resolve(e.dirPath,".cursor/rules/general.mdc"),r=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=te(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>j.generateFile(o,r))})}function te(e,t,n,s){const i=e.isBun?"bun":"yarn",o=`\n## Project Information\n\n- Name: ${e.packageJson?.name}\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i} on zsh\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Write tests ONLY if explicitly requested.\n - Make sure to continue to modify the tests and code until the tests pass.\n- When fixing tests, gather debug information through logging and screenshots before modifying the code.\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (takes up to 1 hour), or run \`${i} check-for-ai\` for type checking and linting only (takes up to 10 minutes).\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit and push them to the current (non-main) branch then create a PR via \`gh\`.\n - Follow conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTest)?`- Use \`${i} run start-test\` to launch a web server for debugging or testing.`:""}\n\n${ne(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();return s?o+"\n"+s.trimEnd():o}function ne(e){return`\n## Coding Style\n\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- When adding new functions or classes, define them below any functions or classes that call them to maintain a clear top-down call order.\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n${e.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}async function se(n){return x.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const ie='env = false\ntelemetry = false\n\n[install]\nexact = true\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@exercode/problem-utils",\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/shared-lib",\n "@willbooster/wb",\n "next",\n "@next/*",\n "react",\n "react-dom"\n]\n',oe=ie.replace("exact = true","exact = false");async function re(n){return x.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?oe:ie;await S.run(()=>j.generateFile(s,i))})}const ae="# Project-specific settings",ce=/# Project-specific settings[^\n]*\n/gm,le="# Generated by wbfy",de=`${ae} (head)\n\n\n${le}\n`,pe=`\n${ae} (tail)\n`,ue={separator:le,separatorPrefix:"# Generated by ",defaultHeadUserContent:de,defaultTailUserContent:pe,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=me(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(ce,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(ce,`${ae} (head)\n`):de},getTailUserContent(e){const t=me(e);return t>0?e.slice(t-1):pe},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function me(e){const t=e.indexOf(ae),n=e.lastIndexOf(ae);return n>t?n:-1}async function fe(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await j.readFileIgnoringError(s)??"",t=ue.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ue.getTailUserContent(e);await S.run(()=>j.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const ge={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},he=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${we(ge.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${we(ge.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${we(ge.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function ye(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>j.generateFile(n,he))})}function we(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function be(n){return x.functionIgnoringException("generateEslintrc",async()=>{await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0}));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await S.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await S.run(()=>j.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const ve={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 ke(n,s){return x.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),o=t.resolve(i,"config.yml"),r=t.resolve(i,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let l=u(ve);try{const t=await e.promises.readFile(o,"utf8"),n=p.load(t);l=c.all([l,n,l],{arrayMerge:L})}catch{}const d=p.dump(l,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),m=await j.readFileIgnoringError(a),f=`以下のコーディング規約を踏まえて、日本語でレビューしてください。\n\n${ne(s)}${m?`\n\n${m.trimEnd()}`:""}`,g=[S.run(()=>j.generateFile(o,d))];e.existsSync(r)||g.push(S.run(()=>j.generateFile(r,f))),await Promise.all(g)})}async function xe(n){return x.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const _e=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ge.codeWith2IndentSize,...ge.codeWith4IndentSize,...ge.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function je(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>j.generateFile(n,_e))})}const Se=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pe(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await j.readFileIgnoringError(s)??"";let o=ue.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const r=ue.getTailUserContent(i),a=[...Se];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(o+="*.sqlite3*\n"),e.depending.playwrightTest&&(o+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Ee(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run(()=>Ce(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ue.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run(()=>j.generateFile(s,l))})}const $e=t.join(m.homedir(),".cache","wbfy","gitignore");async function Ce(n,s){await e.promises.mkdir($e,{recursive:!0}),await e.promises.writeFile(t.join($e,n),s)}async function Ee(n){try{const s=await e.promises.stat(t.join($e,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join($e,n),"utf8")}catch{}}function Fe(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const Be=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ge.prettier.map(e=>Fe("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Oe=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${ge.prettier.map(e=>Fe("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function Ae(n){return x.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?S.run(()=>j.generateFile(i,n.isBun?Oe:Be)):S.run(()=>e.promises.rm(i,{force:!0})))}})}function Ie(e,t,n,s=0){do{const[s,i,o]=Re(e,t,n);if(0===f.spawnSync(s,i,o).status)break}while(--s>=0)}function Te(e,t,n){const[s,i,o]=Re(e,t,n);o.stdio="pipe";const r=f.spawnSync(s,i,o),a=r.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();r.error?console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] failed with: ${r.error.message}`):c&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=r.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Re(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),[e,t,{cwd:n,env:s,encoding:"utf8",shell:!1,stdio:"inherit"}]}function De(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=Te("git",["ls-remote",n,"HEAD"],process.cwd()).split(/\s+/)[0];if(!s)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(s)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const We={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""};const Le=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Ne=new Map;function Je(e){const t=e??"",n=Ne.get(t);if(n)return n;const s=new g({auth:Ue(e)||void 0});return Ne.set(t,s),s}function Ge(e){return!!Ue(e)}function Ue(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}const ze=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],qe=[...ze,"typescript-eslint","eslint-import-resolver-typescript"],Me=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],He={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...ze],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...ze,...Me],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...qe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...qe,...Me],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...qe,...Me]};async function Ye(n,s,i){return x.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const o=t.resolve(n.dirPath,"package.json"),r=await e.promises.readFile(o,"utf8"),a=JSON.parse(r);a.scripts=a.scripts??{},a.dependencies=a.dependencies??{},a.devDependencies=a.devDependencies??{},a.peerDependencies=a.peerDependencies??{};const l=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await S.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(a);for(const[e,t]of Object.entries(a.scripts))t.includes("git clone")||(a.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));a.scripts=c(a.scripts,Ve(n,a.scripts)),"check-for-ai"in a.scripts&&("gen-code"in a.scripts&&(a.scripts["check-for-ai"]=`${l} gen-code > /dev/null && ${a.scripts["check-for-ai"]}`),a.scripts["check-for-ai"]=`${l} install > /dev/null && ${a.scripts["check-for-ai"]}`);n.isBun?delete a.scripts.prettify:a.scripts.prettify=(a.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(ue.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return`${r.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(a.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(a.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(a.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete a.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(delete a.devDependencies.husky,delete a.devDependencies.pinst,delete a.scripts.postinstall,delete a.scripts.postpublish,delete a.scripts.prepublishOnly,delete a.scripts.prepack,delete a.scripts.postpack,a.scripts.prepare="lefthook install || true",u.push("lefthook"),n.depending.semanticRelease&&(a.devDependencies["semantic-release"]||a.devDependencies["multi-semantic-release"]||a.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),a.version="0.0.0-semantically-released"),n.depending.playwrightTest){a.dependencies.artillery||a.devDependencies.artillery||a.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete a.dependencies["@playwright/test"]),delete a.dependencies.playwright,delete a.devDependencies.playwright}n.doesContainSubPackageJsons?a.workspaces=Array.isArray(a.workspaces)?c.all([a.workspaces,["packages/*"]],{arrayMerge:N}):["packages/*"]:Array.isArray(a.workspaces)&&(a.workspaces=a.workspaces.filter(e=>d.globSync(e,{dot:!0,cwd:n.dirPath,ignore:T}).length>0),0===a.workspaces.length&&delete a.workspaces)}if(n.depending.wb||n.isBun){a.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):u.push("@willbooster/wb");for(const[e,t]of Object.entries(a.scripts))a.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete a.devDependencies.eslint,delete a.devDependencies.micromatch,delete a.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...He[n.eslintBase]);n.isWillBoosterConfigs&&(p=p.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));a.name||(a.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(a.private=!0);a.license||(a.license="UNLICENSED");!a.private&&"UNLICENSED"!==a.license&&s.isPublicRepo&&(a.publishConfig??={},a.publishConfig.access??="public");const[f]=Le.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(a.author="WillBooster Inc.");n.isRoot||!a.private||a.main||(a.main="./src");if(delete a.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)a.scripts["lint-fix"]=(a.scripts["lint-fix"]??"")+We.getLintFixSuffix(n);else{delete a.scripts.lint,delete a.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=a.scripts[e];t&&(a.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){a.scripts.lint="flutter analyze",a.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(a.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,a.scripts.format=(a.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===a.scripts.postinstall&&delete a.scripts.postinstall;const e=await d.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:T}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");a.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,a.scripts.lint?a.scripts.lint=`poetry run flake8 ${e} && ${a.scripts.lint}`:(a.scripts.lint=`poetry run flake8 ${e}`,a.scripts["lint-fix"]="yarn lint"),a.scripts.format=(a.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(a.repository=n.repository)}n.depending.blitz?a.scripts["gen-code"]?.startsWith("blitz codegen")?a.scripts["gen-code"].includes("blitz prisma generate")||(a.scripts["gen-code"]=a.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):a.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!a.scripts["gen-code"]?.startsWith("prisma generate")&&(a.scripts["gen-code"]="prisma generate");a.dependencies.prettier||delete a.devDependencies["@types/prettier"];0===Object.keys(a.dependencies).length&&delete a.dependencies;0===Object.keys(a.devDependencies).length&&delete a.devDependencies;0===Object.keys(a.peerDependencies).length&&delete a.peerDependencies;await async function(e){e.dependencies=e.dependencies??{},e.devDependencies=e.devDependencies??{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Xe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await De("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Xe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await De("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Xe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await De("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!Xe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await De("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Xe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await De("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(a),n.isBun&&delete a.packageManager;let g=JSON.stringify(a);if(g=await async function(n,s,i){const o=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&e.includes(":")&&o.push([e,e.replaceAll(":","-")]);if(0===o.length)return s;for(const[e,t]of o)s=s.replaceAll(e,t);const r=await d.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:T});for(const n of r)await S.run(async()=>{const s=t.join(i.dirPath,n),r=await e.promises.readFile(s,"utf8");let a=r;for(const[e,t]of o)a=a.replaceAll(e,t);a!==r&&await e.promises.writeFile(s,a)});return await S.promiseAll(),s}(a.scripts,g,n),await e.promises.writeFile(o,g),!i){if(p=p.filter(e=>!a.devDependencies?.[e]),p.length>0){const e=[...new Set(p)].map(Ke);n.isBun?(Ie(l,["remove",...new Set(p)],n.dirPath),Ie(l,["add","--exact",...e],n.dirPath)):Ie(l,["add",...e],n.dirPath)}if(u=u.filter(e=>!a.dependencies?.[e]),u.length>0){const e=[...new Set(u)].map(Ke);n.isBun?(Ie(l,["remove",...new Set(u)],n.dirPath),Ie(l,["add","-D","--exact",...e],n.dirPath)):Ie(l,["add","-D",...e],n.dirPath)}m.length>0&&Ie("poetry",["add","--group","dev",...new Set(m)],n.dirPath)}}(n,s,i)})}function Ke(e){return"eslint"===e?"eslint@^9":e}function Ve(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test --silent","check-for-ai":"bun run cleanup"+(t?" && bun run typecheck":""),cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":`yarn format > /dev/null 2> /dev/null || true${n?" && yarn typecheck":""} && yarn lint-fix --quiet`,cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ge.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit"};return e.doesContainSubPackageJsons?i=c({...i},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${ge.prettier.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}):e.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s,i["check-all-for-ai"]=(i["check-all-for-ai"]??"")+" --silent"),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}function Xe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Qe={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Ze={commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:""},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},et='\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim();async function tt(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),i=t.resolve(n.dirPath,".husky"),o=e.existsSync(i),{typecheck:r}=Ve(n,{}),a={...Qe,"pre-commit":{...Ze,commands:{...Ze.commands,cleanup:{...Ze.commands.cleanup,run:nt(n)}}}};r||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),o&&(await Promise.all([e.promises.rm(i,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Ie("git",["config","--unset","core.hooksPath"],n.dirPath));if(r){const i=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb typecheck":"bun run typecheck":e.depending.wb?"yarn wb typecheck":"yarn run typecheck";if(e.repository?.startsWith("github:WillBoosterLab/"))return`\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don't push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\n${t}\n`.trim();return t}(n);e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const c=`${et}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),c,{mode:493}))}(n)})}function nt(e){return e.isBun&&e.depending.wb?"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}":e.isBun?"bun run cleanup && git add {staged_files}":"yarn run cleanup && git add {staged_files}"}const st={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function it(n){return x.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainJavaScript||n.doesContainTypeScript){const e=`\n '${ot(n)}': [${JSON.stringify(`${i}eslint --fix${We.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${ge.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainJavaScript||e.doesContainTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${ot(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`echo '!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.'\`,\n 'false',\n ];\n }\n }\n return [];\n},`),n.doesContainPubspecYaml&&o.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`dart format ${filteredFiles.join(' ')}`];\n },");n.doesContainPoetryLock&&o.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainJavaScript||n.doesContainTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await S.run(()=>j.generateFile(s,a))}(n)})}function ot(e){const t=function(e){return e.depending.blitz?st.blitz:st.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${ge.eslint.join(",")}}`}async function rt(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await j.readFileIgnoringError(n)??"",i=ue.getHeadUserContent(s),o=ue.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await ue.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run(()=>j.generateFile(n,l))})}const at={venvPath:".",venv:".venv"};async function ct(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(at);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}async function lt(n){return x.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=dt(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;if(r=(r[0]||"").toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," "),!o)continue;const a=`[![${r}](https://github.com/${o}/actions/workflows/${s}/badge.svg)](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=dt(i,a))}await S.run(()=>j.generateFile(s,i))})}function dt(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function pt(n){return x.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i.plugins??[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e]?.[0]:o[e],n=Array.isArray(o[e])&&o[e]?.[1]||{};if("@semantic-release/commit-analyzer"===t)o[e]=["@semantic-release/commit-analyzer",c.all([n,{preset:"conventionalcommits"}],{arrayMerge:L})];else if("@semantic-release/github"===t){const{failComment:t,successComment:s,...i}=n;o[e]=["@semantic-release/github",c.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:L})]}}const r=JSON.stringify(i);await S.run(()=>j.generateFile(s,r))})}const ut={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function mt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(ut);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=c.all([s,n,s],{arrayMerge:L}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames?.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const ft={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},gt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function ht(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?ft:gt);n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends;const r="bundler"===(o.compilerOptions?.moduleResolution??"").toLowerCase();delete s.compilerOptions?.target,n.isEsmPackage&&!r||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=c.all([s,o,s],{arrayMerge:N}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}J(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await S.run(()=>j.generateFile(i,o))})}const yt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function wt(n){return x.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of yt)o=c.all([o,bt(e)]);n.doesContainPoetryLock&&(o=c.all([o,bt("**/.venv/**")])),n.depending.next&&(o=c.all([o,bt("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],J(o);const r=JSON.stringify(o,void 0,2);await S.run(()=>j.generateFile(s,r))}catch{}})}function bt(e){return{"files.watcherExclude":{[e]:!0}}}async function vt(n){return x.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run(()=>e.promises.rm(s,{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=Te("yarn",["--version"],n.dirPath),o=function(e,t){const n=Te("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);kt(i)<=kt(o)&&i!==o&&Ie("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await S.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await S.run(()=>e.promises.rm(a,{force:!0}));const c=p.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/problem-utils","@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/prettier-config","@willbooster/shared-lib","@willbooster/wb","next","@next/*","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await S.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,p.dump(c,{lineWidth:-1})),Ie("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function kt(e){const[t]=e.split(".");return Number(t)}async function xt(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const s=Je(t);try{await _t(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await _t(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await _t(s,t,n,"d3: medium :ox:","C4B5FD"),await _t(s,t,n,"d4: hard :squid:","A78BFA"),await _t(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await _t(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await _t(s,t,n,"p2: urgent :fire::fire:","F87171"),await _t(s,t,n,"p3: important :fire:","FCA5A5"),await _t(s,t,n,"p4: nice to have :droplet:","FECACA"),await _t(s,t,n,"r: blitz","5300bc"),await _t(s,t,n,"r: firebase","ffca28"),await _t(s,t,n,"r: prisma","0c344b"),await _t(s,t,n,"r: react","61dafb"),await _t(s,t,n,"r: svelte","ff3e00"),await _t(s,t,n,"r: semantic-release","494949"),await _t(s,t,n,"ready :rocket:","22C55E"),await _t(s,t,n,"review requested :mag:","FBCA04"),await _t(s,t,n,"released :bookmark:","6366F1"),await _t(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await _t(s,t,n,"s: 1h :clock1:","E5E7EB"),await _t(s,t,n,"s: 2h :clock2:","D1D5DB"),await _t(s,t,n,"s: 3h :clock3:","9CA3AF"),await _t(s,t,n,"s: 5h :clock5:","6B7280"),await _t(s,t,n,"s: 8h :clock8:","4B5563"),await _t(s,t,n,"s: 13h :clock1:","374151"),await _t(s,t,n,"t: build :hammer:","BFDBFE"),await _t(s,t,n,"t: chore :broom:","BFDBFE"),await _t(s,t,n,"t: ci :construction_worker:","BFDBFE"),await _t(s,t,n,"t: docs :memo:","BFDBFE"),await _t(s,t,n,"t: feat :sparkles:","BFDBFE"),await _t(s,t,n,"t: fix :bug:","BFDBFE"),await _t(s,t,n,"t: perf :zap:","BFDBFE"),await _t(s,t,n,"t: refactor :recycle:","BFDBFE"),await _t(s,t,n,"t: style :lipstick:","BFDBFE"),await _t(s,t,n,"t: test :test_tube:","BFDBFE"),await _t(s,t,n,"project","24292F"),await _t(s,t,n,"focused :dart:","22C55E"),await _t(s,t,n,"gen-pr-all :robot:","00B4D8"),await _t(s,t,n,"gen-pr-claude :robot:","00B4D8"),await _t(s,t,n,"gen-pr-codex :robot:","00B4D8"),await _t(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await jt(s,t,n,"bug"),await jt(s,t,n,"documentation"),await jt(s,t,n,"duplicate"),await jt(s,t,n,"enhancement"),await jt(s,t,n,"good first issue"),await jt(s,t,n,"help wanted"),await jt(s,t,n,"invalid"),await jt(s,t,n,"question"),await jt(s,t,n,"wontfix"),await jt(s,t,n,"ready"),await jt(s,t,n,"review requested"),await jt(s,t,n,"released"),await jt(s,t,n,"semantic-release"),await jt(s,t,n,"llm-pr :robot:"),await jt(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function _t(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function jt(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const St=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Pt(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!Ge(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=Je(t);try{for(const e of St)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=e.data;await y.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),d=y.to_base64(l,y.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:d,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function $t(e){const[t,n]=Le.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ge(t))return;const i=Je(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Ct="__PM_RUN__",Et={"pull_request_template.md":`\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I've confirmed \`All checks have passed\` on this page.\n - PR title follows [Angular's commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn't have \`WIP:\`.\n - The test command (e.g., \`${Ct} test\`) passed.\n - The lint command (e.g., \`${Ct} lint\`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I've reviewed my changes on the GitHub diff view.\n- [ ] I've written the steps to test my changes.\n- [ ] I've added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn't modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language \`C\`.\n3. Write the following code:\n \`\`\`c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n \`\`\`\n4. Push \`Submit\` button.\n5. ...\n--\x3e\n`.trim()};async function Ft(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Et)){const o=Bt(i,n),r=t.resolve(n.dirPath,".github",s);if(e.existsSync(r)){const t=await e.promises.readFile(r,"utf8");if(w(t,o)>o.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run(()=>j.generateFile(r,o))}})}function Bt(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Ct,n)}const Ot=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function At(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let a={},c={},l={},d=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},d="module"===l.type}let p=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await r.readFile(e,"utf8"));p=s?.branches??[],u=s?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs.fetch??s?.refs.push;if("string"==typeof i){const e=await Tt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Tt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const s=t.resolve(n);return e.existsSync(t.join(s,"mise.toml"))||e.existsSync(t.join(s,".mise.toml"))||e.existsSync(t.join(s,".tool-versions"))}(n);for(const s of["java","node","python"])if(e.existsSync(t.resolve(n,`.${s}-version`))){g=!0;break}let h="";try{h=await r.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await r.readFile(y,"utf8");w=Ot.parse(JSON.parse(e))}catch{}const v="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(v){const e=v.split("/");e.length>=2&&(k=e[0],x=e[1])}const _=v?`github:${v}`:void 0,j={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:_,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(_?.startsWith("github:WillBooster/")||_?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:d,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainSubPackageJsons:It("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:It("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:It("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:It("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:It("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:It("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:It("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTest:!!l.scripts?.["start-test"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||p.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:p,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:g,packageJson:l,wbfyJson:w};if(j.isBun||(j.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(j)),j.doesContainGemfile||j.doesContainGoMod||j.doesContainPackageJson||j.doesContainPoetryLock||j.doesContainPomXml||j.doesContainPubspecYaml||j.doesContainTemplateYaml)return j}catch{}}function It(e,t){return d.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Tt(e){const[t,n]=Le.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await Je().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const s=t?.headers?.location;if("string"!=typeof s)return;const[i,o]=Le.getOrgAndName(s);if(!i||!o)return;return`${i}/${o}`}(e);t&&(s.full_name=t)}return s}function Rt(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}await async function(){const n=await o(process.argv.slice(2)).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({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await D([s,...r]);const a=await At(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=V(a),l=(await Promise.all(r.map(e=>At(e,a)))).filter(e=>!!e),d=[a,...l];if(k.isVerbose)for(const e of d)console.info(e);await vt(a),a.isBun&&await re(a);const p=!M(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([_(a),R(a),c.then(()=>lt(a)),ee(a,d),fe(a),ye(a),ke(a,d),xe(a),je(a),Ft(a),Ae(a),mt(a),pt(a),...p?[q(a)]:[],xt(a),Pt(a),$t(a),tt(a),it(a)]),await S.promiseAll();const u=[];for(const e of d)Rt(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(W(e,e.isRoot?d:[e])),e.depending.playwrightTest&&u.push(F(e)),e.depending.next&&u.push(P(e)),await Pe(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await rt(e),await Ye(e,a,n.skipDeps),u.push(it(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(wt(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(ht(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(se(e)),a.isWillBoosterConfigs||u.push(be(e))),e.depending.pyright&&u.push(ct(e))));await Promise.all(u),await S.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),Ie(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),Ie(m,["install","--no-immutable"],s)),Ie(m,["cleanup"],s),a.isBun||Ie(m,["install","--no-immutable"],s)}}();
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9iaW9tZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhEb2NrZXJmaWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeERvY2tlcmZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG5cbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdEb2NrZXJmaWxlJyksIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgUGFyc2VkT2JqZWN0ID0gUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAodmFsdWU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZSB9KTtcblxuY29uc3QgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0ID0ge1xuICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICB1c2U6IGFzT2JqZWN0KHtcbiAgICBiYXNlVVJMOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbmx5LW9uLWZhaWx1cmUnXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAncmV0YWluLW9uLWZhaWx1cmUnIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSksXG4gIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgIGNvbW1hbmQ6IGxpdGVyYWwoXCIneWFybiBzdGFydC10ZXN0LXNlcnZlcidcIiksXG4gICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gIH0pLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gL2RlZmluZUNvbmZpZ1xccypcXChcXHMqKFxce1tcXHNcXFNdKj99KVxccypcXCk7Py8uZXhlYyhvbGRDb250ZW50KTtcbiAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gbWF0Y2g/LlsxXTtcbiAgICBpZiAoIW9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbChvYmplY3RMaXRlcmFsKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gS2VlcCBmaWxsaW5nIG1pc3NpbmcgZGVmYXVsdHMsIGJ1dCBkb24ndCBvdmVyd3JpdGUgbG9jYWwgYWRqdXN0bWVudHMgb24gZXZlcnkgcmVnZW5lcmF0aW9uLlxuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlLmFsbDxQYXJzZWRPYmplY3Q+KFtkZWZhdWx0Q29uZmlnLCBwYXJzZWRdKTtcbiAgICBjb25zdCBoYXNTdGFydFRlc3RTZXJ2ZXIgPSBCb29sZWFuKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddKTtcbiAgICBpZiAoIWhhc1N0YXJ0VGVzdFNlcnZlcikge1xuICAgICAgZGVsZXRlIG1lcmdlZC53ZWJTZXJ2ZXI7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQmFzZVVybCA9IGF3YWl0IGhhc05leHRQdWJsaWNCYXNlVXJsKGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoIWhhc0Jhc2VVcmwpIHtcbiAgICAgIGNvbnN0IHVzZUNvbmZpZyA9IG1lcmdlZC51c2U7XG4gICAgICBpZiAodXNlQ29uZmlnPy5raW5kID09PSAnb2JqZWN0Jykge1xuICAgICAgICBkZWxldGUgdXNlQ29uZmlnLnZhbHVlLmJhc2VVUkw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeU9iamVjdChtZXJnZWQsIDApO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2Uob2JqZWN0TGl0ZXJhbCwgbmV3T2JqZWN0TGl0ZXJhbCk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzTmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGVudkZpbGVQYXRocyA9IFtwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5lbnYnKSwgcGF0aC5yZXNvbHZlKGRpclBhdGgsICdtaXNlLnRvbWwnKV07XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZW52RmlsZVBhdGhzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWwob2JqZWN0TGl0ZXJhbDogc3RyaW5nKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICAncGxheXdyaWdodC1jb25maWcudHMnLFxuICAgIGBjb25zdCBjb25maWcgPSAke29iamVjdExpdGVyYWx9O2AsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICAgIHRzLlNjcmlwdEtpbmQuVFNcbiAgKTtcbiAgY29uc3Qgc3RhdGVtZW50ID0gc291cmNlLnN0YXRlbWVudHNbMF07XG4gIGlmICghc3RhdGVtZW50IHx8ICF0cy5pc1ZhcmlhYmxlU3RhdGVtZW50KHN0YXRlbWVudCkpIHJldHVybjtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBzdGF0ZW1lbnQuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1swXTtcbiAgaWYgKCFkZWNsYXJhdGlvbj8uaW5pdGlhbGl6ZXIgfHwgIXRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIpKSByZXR1cm47XG4gIHJldHVybiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyLCBzb3VyY2UpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8ICghdHMuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICF0cy5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgcGFyc2VkW3Byb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uLCBzb3VyY2U6IHRzLlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyBhc09iamVjdChwYXJzZWRPYmplY3QpIDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKHRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIHJldHVybiBzdHJpbmdpZnlBcnJheSh2YWx1ZS52YWx1ZSwgbGV2ZWwpO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgcmV0dXJuIHN0cmluZ2lmeU9iamVjdCh2YWx1ZS52YWx1ZSwgbGV2ZWwpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBcnJheSh2YWx1ZXM6IFBhcnNlZFZhbHVlW10sIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICB9KTtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdChvYmplY3Q6IFBhcnNlZE9iamVjdCwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUodmFsdWUsIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICB9XG4gICAgfVxuICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL0RBVEFCQVNFX1VSTD1cIj8oLitcXC5zcWxpdGUzKVwiP1tcXG4kXS8sXG4gICAgICAgICdEQVRBQkFTRV9VUkw9XCIkMT9jb25uZWN0aW9uX2xpbWl0PTFcIlxcbidcbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSkpO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogb2JqZWN0W10sIHNvdXJjZTogb2JqZWN0W10sIG9wdGlvbnM6IGFueSk6IG9iamVjdFtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0gYXMgb2JqZWN0LCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvcnQgdGhlIGtleXMgb2YgdGhlIG9iamVjdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZT86IHN0cmluZztcbiAgb24/OiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8c3RyaW5nLCBKb2I+O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnYXV0b2ZpeC5jaScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIHB1c2g6IHtcbiAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICB9LFxuICB9LFxuICBwZXJtaXNzaW9uczoge1xuICAgIGNvbnRlbnRzOiAncmVhZCcsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICdhdXRvZml4LSR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDogeyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9LFxuICB9LFxufTtcblxuY29uc3QgcHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnRml4IGNvZGUgYXV0b21hdGljYWxseScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7XG4gICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2F1dG9maXgueW1sQG1haW4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBsaW50ZXIgZml4XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNsYXVkZSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDbGF1ZGUgQ29kZScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jbGF1ZGUnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY2xhdWRlLWNvZGUnLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiAnJHt7IHNlY3JldHMuQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4gfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNvZGV4Jzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENvZGV4IENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jb2RleCcpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjb2RleC1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIE9QRU5BSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuT1BFTkFJX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWdlbWluaSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBHZW1pbmkgQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWdlbWluaScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdnZW1pbmktY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHRU1JTklfQVBJX0tFWTogJyR7eyBzZWNyZXRzLkdFTUlOSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlTmFtZXNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYWRkLWZvY3VzZWQtaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICdub3RpZnktcmVhZHkueW1sJyxcbiAgICAnd2JmeS55bWwnLFxuICAgICd3YmZ5LW1lcmdlLnltbCcsXG4gIF07XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnZ2VuLXByLWNsYXVkZS55bWwnLFxuICAgICAgJ2dlbi1wci1jb2RleC55bWwnLFxuICAgICAgJ2dlbi1wci1nZW1pbmkueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhZGQtaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICBmaWxlTmFtZVNldC5kZWxldGUoJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0LnltbCcpO1xuICAgIGZpbGVOYW1lU2V0LmRlbGV0ZSgnbm90aWZ5LXJlYWR5LnltbCcpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwcmVjYXRlZEZpbGVOYW1lIG9mIGZpbGVOYW1lc1RvQmVSZW1vdmVkKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGRlcHJlY2F0ZWRGaWxlTmFtZSksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVwb3NpdG9yeT8uZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKTtcblxuICBpZiAoa2luZCA9PT0gJ2F1dG9maXgnKSB7XG4gICAgYXdhaXQgd3JpdGVZYW1sKGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZyksIGZpbGVQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcbiAgLy8gU2tpcCBhIGJyb2tlbiB3b3JrZmxvd1xuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnICYmIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZSAmJiBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMpIHtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMuYWN0aW9ucyA9ICd3cml0ZSc7XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGggPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoLnRyaWdnZXJfZGVwbG95X3dvcmtmbG93ID0gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCc7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHVzZSByZWxlYXNlLnltbCBpZiByZWxlYXNlIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAncmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9uc1snaWQtdG9rZW4nXSA9ICd3cml0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LlsnaWQtdG9rZW4nXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBTZXQgdGVzdC1jb21tYW5kIGZvciBnZW4tcHIgd29ya2Zsb3dzIGJhc2VkIG9uIHBhY2thZ2UgbWFuYWdlclxuICBpZiAoa2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8IGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8IGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJykge1xuICAgIGpvYi53aXRoWyd0ZXN0LWNvbW1hbmQnXSA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuIGNoZWNrLWFsbC1mb3ItYWknIDogJ3lhcm4gY2hlY2stYWxsLWZvci1haSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG4gIC8vIFJlbW92ZSBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgbWlncmF0ZUpvYihqb2IpO1xuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gY2xvbmVEZWVwKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYxJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IGNsb25lRGVlcChwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub25fc2VsZl9ob3N0ZWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub3RpZnlfZGlzY29yZDtcbiAgZGVsZXRlIGpvYi53aXRoLnJlcXVpcmVfZmx5O1xuICBkZWxldGUgam9iLndpdGgucmVxdWlyZV9nY2xvdWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5sYWJlbDtcbiAgZGVsZXRlIGpvYi53aXRoLmxhYmVsT3BlcmF0b3I7XG4gIC8vIEFkZGVkIDIwMjUtMDgtMDZcbiAgaWYgKGpvYi53aXRoLmNpX3NpemUpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9IGpvYi53aXRoLmNpX3NpemU7XG4gICAgZGVsZXRlIGpvYi53aXRoLmNpX3NpemU7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZX1cbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn0gb24genNoXG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gQ3JlYXRlIGEgbmV3IGJyYW5jaCBpZiB0aGUgY3VycmVudCBicmFuY2ggaXMgXFxgbWFpblxcYC5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBNYWtlIHN1cmUgdG8gY29udGludWUgdG8gbW9kaWZ5IHRoZSB0ZXN0cyBhbmQgY29kZSB1bnRpbCB0aGUgdGVzdHMgcGFzcy5cbi0gV2hlbiBmaXhpbmcgdGVzdHMsIGdhdGhlciBkZWJ1ZyBpbmZvcm1hdGlvbiB0aHJvdWdoIGxvZ2dpbmcgYW5kIHNjcmVlbnNob3RzIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGNvZGUuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1hbGwtZm9yLWFpXFxgIHRvIGV4ZWN1dGUgYWxsIHRlc3RzICh0YWtlcyB1cCB0byAxIGhvdXIpLCBvciBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stZm9yLWFpXFxgIGZvciB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nIG9ubHkgKHRha2VzIHVwIHRvIDEwIG1pbnV0ZXMpLlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYGNoZWNrLWZvci1haVxcYC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCBhbmQgcHVzaCB0aGVtIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoIHRoZW4gY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgLlxuICAtIEZvbGxvdyBjb252ZW50aW9uYWwgY29tbWl0czsgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIElmIG5vdCBzcGVjaWZpZWQsIG1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmhhc1N0YXJ0VGVzdClcbiAgICA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gc3RhcnQtdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJ1xufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIHJldHVybiBleHRyYUNvbnRlbnQgPyBiYXNlQ29udGVudCArICdcXG4nICsgZXh0cmFDb250ZW50LnRyaW1FbmQoKSA6IGJhc2VDb250ZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucyBvciBjbGFzc2VzLCBkZWZpbmUgdGhlbSBiZWxvdyBhbnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMgdGhhdCBjYWxsIHRoZW0gdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBjYWxsIG9yZGVyLlxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBQcmVmZXIgXFxgdW5kZWZpbmVkXFxgIG92ZXIgXFxgbnVsbFxcYCB1bmxlc3MgZXhwbGljaXRseSByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBpbnRyb2R1Y2luZyBuZXcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIFxcYGkxOG5cXGAgZGlyZWN0b3J5IChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApLiBSZWZlcmVuY2UgdGhlc2Ugc3RyaW5ncyB1c2luZyB0aGUgXFxgaTE4blxcYCB1dGlsaXR5LiBGb3IgZXhhbXBsZSwgdXNlIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGAuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGAtIFByZWZlciBcXGB1c2VJbW1lclxcYCBmb3Igc3RvcmluZyBhbiBhcnJheSBvciBhbiBvYmplY3QgdG8gXFxgdXNlU3RhdGVcXGAuYFxuICAgIDogJydcbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGBcbi0gU2luY2UgdGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIFxcYHVzZUNhbGxiYWNrXFxgIG9yIFxcYHVzZU1lbW9cXGAgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbi0gQXNzdW1lIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLlxuYFxuICAgIDogJydcbn1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJpb21lSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSB7XG4gICAgICByb290OiBjb25maWcuaXNSb290LFxuICAgICAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICAgICAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG4gICAgfTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlID0gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG5baW5zdGFsbF1cbmV4YWN0ID0gdHJ1ZVxubGlua2VyID0gXCJob2lzdGVkXCJcbm1pbmltdW1SZWxlYXNlQWdlID0gNDMyMDAwICMgNSBkYXlzXG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuICAgIFwiQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3RcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHRcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdFwiLFxuICAgIFwiQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZ1wiLFxuICAgIFwiQHdpbGxib29zdGVyL3NoYXJlZC1saWJcIixcbiAgICBcIkB3aWxsYm9vc3Rlci93YlwiLFxuICAgIFwibmV4dFwiLFxuICAgIFwiQG5leHQvKlwiLFxuICAgIFwicmVhY3RcIixcbiAgICBcInJlYWN0LWRvbVwiXG5dXG5gO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UgPSBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZS5yZXBsYWNlKCdleGFjdCA9IHRydWUnLCAnZXhhY3QgPSBmYWxzZScpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykuaW5jbHVkZXMoJ2V4YWN0ID0gZmFsc2UnKVxuICAgICAgICA/IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZVxuICAgICAgICA6IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIGVzbGludDogWydjanMnLCAnbWpzJywgJ2pzJywgJ2N0cycsICdtdHMnLCAndHMnLCAndHN4JywgJ2pzeCddLnRvU29ydGVkKCksXG4gIHByZXR0aWVyOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2phdmEnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgLy8gY2YuIGh0dHBzOi8vYmlvbWVqcy5kZXYvaW50ZXJuYWxzL2xhbmd1YWdlLXN1cHBvcnQvXG4gIGJpb21lOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICd2dWUnLFxuICAgICdzdmVsdGUnLFxuICAgICdhc3RybycsXG4gICAgJ2NzcycsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdncWwnLFxuICBdLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRyYycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBmaWxlc1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludGlnbm9yZScpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5tanMnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmVzbGludEJhc2UpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoIW9sZENvbnRlbnQuaW5jbHVkZXMoJ2V4cG9ydCB7IGRlZmF1bHQgfScpKSByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnJHtjb25maWcuZXNsaW50QmFzZX0nO2ApKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBjbG9uZURlZXAoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYOS7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAglxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfSR7XG4gICAgICBleHRyYUNvbnRlbnQgPyBgXFxuXFxuJHtleHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSldO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzdHlsZWd1aWRlRmlsZVBhdGgpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4uc2VyZW5hL1xuLnRtcC9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3QgcHJldHRpZXJDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5jb25zdCBiaW9tZUNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdidW4nLCAnLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vYmlvbWUgY2hlY2sgLS1maXggLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tc2tpcC1wYXJzZS1lcnJvcnMnLCAnQmlvbWUnLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Hb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICBjb25zdCBrZXkgPSBvd25lciA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVI7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5jb25zdCBqc0NvbW1vbkRlcHMgPSBbXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJywgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz4pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSk7XG5cbiAgaWYgKCdjaGVjay1mb3ItYWknIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgIGlmICgnZ2VuLWNvZGUnIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgICB9XG4gICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID0gKGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKFxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICB9IGVsc2Uge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsaW50LXN0YWdlZCcpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC93YlxccytkYi8sICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuZXNsaW50O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLm1pY3JvbWF0Y2g7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3R5cGVzY3JpcHQnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmVzbGludERlcHNbY29uZmlnLmVzbGludEJhc2VdKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnLCAnY2hlY2stZm9yLWFpJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gKGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAnJykgKyBFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgvWy9cXFxcXS8pO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmIHBvZXRyeSBydW4gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5KSB7XG4gICAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3SnNvblRleHQpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXZEZXBlbmRlbmNpZXMuXG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0ubWFwKGdldERlcGVuZGVuY3lTcGVjaWZpZXIpO1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgb21pdCB2ZXJzaW9ucyB0byB1cGRhdGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnMgd2l0aCBZYXJuLlxuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGV2RGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXS5tYXAoZ2V0RGVwZW5kZW5jeVNwZWNpZmllcik7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAnLS1leGFjdCcsIC4uLmRldkRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBvbWl0IHZlcnNpb25zIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyB3aXRoIFlhcm4uXG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5kZXZEZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKCdsZXJuYS5qc29uJywgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgLy8gTWlncmF0ZSBmcm9tIEVTTGludCBsZWdhY3kgY29uZmlncyB0byBmbGF0IGNvbmZpZ3MsXG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1pbXBvcnQnXTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBlc2xpbnQgdjEwIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFdpbGxCb29zdGVyIEVTTGludCBjb25maWcgc3RhY2sgeWV0LlxuICBpZiAoZGVwZW5kZW5jeSA9PT0gJ2VzbGludCcpIHJldHVybiAnZXNsaW50QF45JztcbiAgcmV0dXJuIGRlcGVuZGVuY3k7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICdidW4gcnVuIGNoZWNrLWZvci1haSAmJiBidW4gcnVuIHRlc3QgLS1zaWxlbnQnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGBidW4gcnVuIGNsZWFudXAke2hhc1R5cGVjaGVjayA/ICcgJiYgYnVuIHJ1biB0eXBlY2hlY2snIDogJyd9YCxcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ3lhcm4gY2hlY2stZm9yLWFpICYmIHlhcm4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYHlhcm4gZm9ybWF0ID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlJHtcbiAgICAgICAgaGFzVHlwZWNoZWNrID8gJyAmJiB5YXJuIHR5cGVjaGVjaycgOiAnJ1xuICAgICAgfSAmJiB5YXJuIGxpbnQtZml4IC0tcXVpZXRgLFxuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeWAsXG4gICAgICBsaW50OiBgZXNsaW50IC0tY29sb3JgLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImAsXG4gICAgICB0eXBlY2hlY2s6ICd0c2MgLS1ub0VtaXQnLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnkgJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oXG4gICAgICAgICAgICAnLCdcbiAgICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guXG4gICAgICAgICAgLy8gRk9SQ0VfQ09MT1I9MyBtYWtlIHdiIGVuYWJsZSBjb2xvciBvdXRwdXQuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgRk9SQ0VfQ09MT1I9MyB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG4gICAgaWYgKG9sZFRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgICAvLyBgd2JgIHN1cHBvcnRzIGAtLXNpbGVudGAgb3B0aW9uXG4gICAgICBzY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ10gPSAoc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddID8/ICcnKSArICcgLS1zaWxlbnQnO1xuICAgIH1cblxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4U2NyaXB0TmFtZXMoXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5ld0pzb25UZXh0OiBzdHJpbmcsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5rZXlzKHNjcmlwdHMpKSB7XG4gICAgaWYgKGtleSAmJiAha2V5LnN0YXJ0c1dpdGgoJzonKSAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBjb21tYW5kczoge1xuICAgICAgY2xlYW51cDoge1xuICAgICAgICBnbG9iOiBzdHJpbmc7XG4gICAgICAgIHJ1bjogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiBzdHJpbmc7XG4gICAgICAgIHJ1bjogc3RyaW5nO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBwcmVDb21taXRTZXR0aW5nczogTGVmdGhvb2tTZXR0aW5nc1sncHJlLWNvbW1pdCddID0ge1xuICBjb21tYW5kczoge1xuICAgIGNsZWFudXA6IHtcbiAgICAgIGdsb2I6ICcqLntjanMsY3NzLGN0cyxodG0saHRtbCxqcyxqc29uLGpzb241LGpzb25jLGpzeCxtZCxtanMsbXRzLHNjc3MsdHMsdHN4LHZ1ZSx5YW1sLHltbH0nLFxuICAgICAgcnVuOiAnJyxcbiAgICB9LFxuICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5pZiBncmVwIC1xICdXYXJuaW5nczonIHtzdGFnZWRfZmlsZXN9OyB0aGVuXG4gIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGVzICh7c3RhZ2VkX2ZpbGVzfSkgY29udGFpbiB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gIGV4aXQgMVxuZmlcbmAudHJpbSgpLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IGh1c2t5RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBjb25zdCBoYXNIdXNreURpciA9IGZzLmV4aXN0c1N5bmMoaHVza3lEaXJQYXRoKTtcbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgLi4ucHJlQ29tbWl0U2V0dGluZ3MsXG4gICAgICBjb21tYW5kczoge1xuICAgICAgICAuLi5wcmVDb21taXRTZXR0aW5ncy5jb21tYW5kcyxcbiAgICAgICAgY2xlYW51cDoge1xuICAgICAgICAgIC4uLnByZUNvbW1pdFNldHRpbmdzLmNvbW1hbmRzLmNsZWFudXAsXG4gICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuICBpZiAoIXR5cGVjaGVjaykge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoaGFzSHVza3lEaXIpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5wcm9taXNlcy5ybShodXNreURpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGxldCB0eXBlY2hlY2tDb21tYW5kOiBzdHJpbmc7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlY2hlY2tDb21tYW5kID0gY29uZmlnLmRlcGVuZGluZy53YiA/ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyA6ICdidW4gcnVuIHR5cGVjaGVjayc7XG4gIH0gZWxzZSB7XG4gICAgdHlwZWNoZWNrQ29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAneWFybiB3YiB0eXBlY2hlY2snIDogJ3lhcm4gcnVuIHR5cGVjaGVjayc7XG4gIH1cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICByZXR1cm4gYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbiR7dHlwZWNoZWNrQ29tbWFuZH1cbmAudHJpbSgpO1xuICB9XG4gIHJldHVybiB0eXBlY2hlY2tDb21tYW5kO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzQnVuICYmIGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICByZXR1cm4gJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ2J1biBydW4gY2xlYW51cCAmJiBnaXQgYWRkIHtzdGFnZWRfZmlsZXN9JztcbiAgfVxuICByZXR1cm4gJ3lhcm4gcnVuIGNsZWFudXAgJiYgZ2l0IGFkZCB7c3RhZ2VkX2ZpbGVzfSc7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5oYXNWZXJzaW9uU2V0dGluZ3MpIHtcbiAgICBjb25zdCB0b29sc0NoYW5nZWRQYXR0ZXJuID0gU3RyaW5nLnJhd2AobWlzZVxcLnRvbWx8XFwubWlzZVxcLnRvbWx8XFwudG9vbC12ZXJzaW9uc3xcXC4uKy12ZXJzaW9uKWA7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiJHt0b29sc0NoYW5nZWRQYXR0ZXJufVwiIFwibWlzZSBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSAmJiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykke3BhY2thZ2VzRmlsdGVyfSk7JHtnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWcpfVxuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xcYCR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnJHtwYWNrYWdlUHJlZml4fXNvcnQtcGFja2FnZS1qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfSxcbiAgJy4vKiovbWlncmF0aW9uLnNxbCc6IChmaWxlcykgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdXYXJuaW5nczonKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXFxgZWNobyAnISEhIE1pZ3JhdGlvbiBTUUwgZmlsZSAoXFwke3BhdGgucmVsYXRpdmUoJycsIGZpbGUpfSkgY29udGFpbnMgd2FybmluZ3MgISEhIFNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLidcXGAsXG4gICAgICAgICdmYWxzZScsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4ve2xpYix0ZXN0LHRlc3RfZHJpdmVyfS8qKi8qLmRhcnQnOiBmaWxlcyA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCdnZW5lcmF0ZWQnKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5lbmRzV2l0aCgnLmZyZWV6ZWQuZGFydCcpICYmICFmaWxlLmVuZHNXaXRoKCcuZy5kYXJ0JykpO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXFxgZGFydCBmb3JtYXQgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gIH0sYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCA/IFwiY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcXG5cIiA6ICcnfVxubW9kdWxlLmV4cG9ydHMgPSB7JHtsaW5lcy5qb2luKCcnKX1cbn07XG5gO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5tYXAoKGRpcikgPT4gYCR7ZGlyfS8qKi9gKTtcbiAgcmV0dXJuIGB7LCR7ZGlycy5qb2luKCcsJyl9fSoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV0/LlswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldPy5bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgc3VjY2Vzc0NvbW1lbnQgYW5kIGZhaWxDb21tZW50IHByb3BlcnRpZXMgZnJvbSBvbGRDb25maWdcbiAgICAgICAgY29uc3QgeyBmYWlsQ29tbWVudDogXzEsIHN1Y2Nlc3NDb21tZW50OiBfMiwgLi4uY2xlYW5PbGRDb25maWcgfSA9IG9sZENvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGNsZWFuT2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgZXJhc2FibGVTeW50YXhPbmx5OiB0cnVlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuLi8uLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4uLy4uL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogWydzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIFByZXNlcnZlIEJ1bmRsZXIgcmVzb2x1dGlvbiBzbyB0b29saW5nIHN0YXlzIGFsaWduZWQgd2l0aCBwYWNrYWdlIHNldHRpbmdzLlxuICAgICAgY29uc3Qgc2hvdWxkUHJlc2VydmVCdW5kbGVyUmVzb2x1dGlvbiA9XG4gICAgICAgIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb24gPz8gJycpLnRvTG93ZXJDYXNlKCkgPT09ICdidW5kbGVyJztcbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSB8fCBzaG91bGRQcmVzZXJ2ZUJ1bmRsZXJSZXNvbHV0aW9uKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlUmVzb2x1dGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICAgICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICAgICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInLFxuICAgICAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICAgICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgICAgICduZXh0JyxcbiAgICAgICdAbmV4dC8qJyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgcGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciA9ICdfX1BNX1JVTl9fJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50LCBjb25maWcpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIGNvbnRlbnQpID4gY29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2VBbGwocGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciwgcGFja2FnZU1hbmFnZXJDb21tYW5kKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICAvLyBzb3VyY2UgY29kZSBmaWxlc1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgaGFzU3RhcnRUZXN0OiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBlc2xpbnRCYXNlPzogRXNsaW50RXh0ZW5zaW9uQmFzZTtcbiAgaGFzVmVyc2lvblNldHRpbmdzOiBib29sZWFuO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuZmlnLnRvbWwnKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgaGFzU3RhcnRUZXN0OiAhIXBhY2thZ2VKc29uLnNjcmlwdHM/Llsnc3RhcnQtdGVzdCddLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgcmV0LmZ1bGxfbmFtZSA9IHJlZGlyZWN0ZWRGdWxsTmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBFU0xJTlRfQ09ORklHX1BSRUZJWCA9ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy0nO1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lPy5zdGFydHNXaXRoKEVTTElOVF9DT05GSUdfUFJFRklYKSA9PT0gdHJ1ZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB5YXJuIGJlcnJ5XG4gICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZml4RG9ja2VyZmlsZShyb290Q29uZmlnKSxcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoc2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UoY29uZmlnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4VHlwZURlZmluaXRpb25zKGNvbmZpZywgY29uZmlnLmlzUm9vdCA/IGFsbFBhY2thZ2VDb25maWdzIDogW2NvbmZpZ10pKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIGFyZ3Yuc2tpcERlcHMpO1xuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludHJjKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgICAvLyAneWFybiBpbnN0YWxsJyBzaG91bGQgYmUgYWZ0ZXIgYHlhcm4gY2xlYW51cGAgYmVjYXVzZSB5YXJuIGJlcnJ5IGdlbmVyYXRlcyB5YXJuLmxvY2tcbiAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50cyBvZiBkZXBlbmRhbnQgc3ViLXBhY2thZ2UgaW4gbW9ub3JlcG9cbiAgICBpZiAoIXJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sIm5hbWVzIjpbIm9wdGlvbnMiLCJpc1ZlcmJvc2UiLCJkb2VzVXBsb2FkRW52VmFycyIsImxvZ2dlciIsImZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24iLCJuYW1lIiwiZnVuYyIsImNvbnNvbGUiLCJpbmZvIiwiZXJyb3IiLCJFcnJvciIsInN0YWNrIiwiU3RyaW5nIiwiYXN5bmMiLCJmaXhEb2NrZXJmaWxlIiwiY29uZmlnIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwib2xkQ29udGVudCIsImRvY2tlcmZpbGUiLCJuZXdDb250ZW50IiwiZnMiLCJ3cml0ZUZpbGUiLCJwYXRoIiwiam9pbiIsImRpclBhdGgiLCJmc1V0aWwiLCJyZWFkRmlsZUlnbm9yaW5nRXJyb3IiLCJmaWxlUGF0aCIsInByb21pc2VzIiwicmVhZEZpbGUiLCJnZW5lcmF0ZUZpbGUiLCJjb250ZW50IiwibWtkaXIiLCJkaXJuYW1lIiwicmVjdXJzaXZlIiwibm9ybWFsaXplZENvbnRlbnQiLCJyZXBsYWNlQWxsIiwidHJpbSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhOZXh0Q29uZmlnSnNvbiIsIm1hcCIsImV4dCIsInJlc29sdmUiLCJmaW5kIiwicCIsImV4aXN0c1N5bmMiLCJyZXBsYWNlIiwiXyIsInNldHRpbmdzVGV4dCIsImluY2x1ZGVzIiwicnVuIiwibGl0ZXJhbCIsInZhbHVlIiwia2luZCIsImFzT2JqZWN0IiwiZGVmYXVsdENvbmZpZyIsImZvcmJpZE9ubHkiLCJyZXRyaWVzIiwidXNlIiwiYmFzZVVSTCIsInRyYWNlIiwic2NyZWVuc2hvdCIsInZpZGVvIiwid2ViU2VydmVyIiwiY29tbWFuZCIsInVybCIsInJldXNlRXhpc3RpbmdTZXJ2ZXIiLCJ0aW1lb3V0Iiwic3Rkb3V0Iiwic3RkZXJyIiwiZW52IiwiZ3JhY2VmdWxTaHV0ZG93biIsImZpeFBsYXl3cmlnaHRDb25maWciLCJtYXRjaCIsImV4ZWMiLCJvYmplY3RMaXRlcmFsIiwicGFyc2VkIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIlRTIiwic3RhdGVtZW50Iiwic3RhdGVtZW50cyIsImlzVmFyaWFibGVTdGF0ZW1lbnQiLCJkZWNsYXJhdGlvbiIsImRlY2xhcmF0aW9uTGlzdCIsImRlY2xhcmF0aW9ucyIsImluaXRpYWxpemVyIiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJwYXJzZU9iamVjdExpdGVyYWwiLCJtZXJnZWQiLCJtZXJnZSIsImFsbCIsIkJvb2xlYW4iLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJoYXNCYXNlVXJsIiwiZW52RmlsZVBhdGhzIiwiZW52RmlsZVBhdGgiLCJ0ZXN0IiwiaGFzTmV4dFB1YmxpY0Jhc2VVcmwiLCJ1c2VDb25maWciLCJuZXdPYmplY3RMaXRlcmFsIiwic3RyaW5naWZ5T2JqZWN0IiwicHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJwYXJzZUV4cHJlc3Npb24iLCJ1bmRlZmluZWQiLCJnZXRUZXh0IiwiZXhwcmVzc2lvbiIsInBhcnNlZE9iamVjdCIsImlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiIsImVsZW1lbnRzIiwiZWxlbWVudCIsInNvbWUiLCJzdHJpbmdpZnlWYWx1ZSIsImxldmVsIiwidmFsdWVzIiwibGVuZ3RoIiwiaW5kZW50IiwicmVwZWF0IiwibGluZXMiLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiYXQiLCJpbmRleCIsImNsb3NpbmdJbmRlbnQiLCJzdHJpbmdpZnlBcnJheSIsIm9iamVjdCIsIk9iamVjdCIsImVudHJpZXMiLCJrZXkiLCJnbG9iSWdub3JlIiwiZml4UHJpc21hRW52RmlsZXMiLCJlbnZGaWxlcyIsImZnIiwiZ2xvYiIsImRvdCIsImN3ZCIsImlnbm9yZSIsImVudkZpbGUiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiUHJvbWlzZSIsIm5ld1Rlc3REaXJQYXRoIiwicGFja2FnZURpclBhdGgiLCJvbGRUZXN0RGlyTmFtZSIsIm9sZFRlc3REaXJQYXRoIiwicmVuYW1lIiwiZml4VHlwZURlZmluaXRpb25zIiwiY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuIiwibGliVHlwZURpclBhdGgiLCJzcmNUeXBlRGlyUGF0aCIsImlzUm9vdCIsImRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImlzRmlsZSIsImlzRGlyZWN0b3J5Iiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwicHVzaCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93Iiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsInBlcm1pc3Npb25zIiwiY29udGVudHMiLCJjb25jdXJyZW5jeSIsImdyb3VwIiwiam9icyIsImF1dG9maXgiLCJwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyIsInVzZXMiLCJ3b3JrZmxvd3MiLCJyZWxlYXNlIiwicHVsbF9yZXF1ZXN0X3RhcmdldCIsInR5cGVzIiwic3luYyIsImlzc3VlcyIsImlmIiwid2l0aCIsInNlY3JldHMiLCJDTEFVREVfQ09ERV9PQVVUSF9UT0tFTiIsIk9QRU5BSV9BUElfS0VZIiwiR0VNSU5JX0FQSV9LRVkiLCJnZW5lcmF0ZVdvcmtmbG93cyIsInJvb3RDb25maWciLCJmaWxlTmFtZXNUb0JlUmVtb3ZlZCIsImlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIiwicmVwb3NpdG9yeSIsIndvcmtmbG93c1BhdGgiLCJzZW1hbnRpY1ltbFBhdGgiLCJybSIsImZvcmNlIiwiZmlsZU5hbWVTZXQiLCJTZXQiLCJmaWx0ZXIiLCJkZXBlbmRpbmciLCJzZW1hbnRpY1JlbGVhc2UiLCJhZGQiLCJkZWxldGUiLCJmaWxlTmFtZSIsImJhc2VuYW1lIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJkZXByZWNhdGVkRmlsZU5hbWUiLCJkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMiLCJ3cml0ZVlhbWwiLCJpc1B1YmxpY1JlcG8iLCJjbG9uZURlZXAiLCJwYWNrYWdlTWFuYWdlciIsImlzQnVuIiwic3RlcHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImF1dG9maXhKb2IiLCJnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyIsIm5ld1NldHRpbmdzIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJzdGFydHNXaXRoIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJtaWdyYXRlV29ya2Zsb3ciLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJub25fc2VsZl9ob3N0ZWQiLCJub3RpZnlfZGlzY29yZCIsInJlcXVpcmVfZmx5IiwicmVxdWlyZV9nY2xvdWQiLCJsYWJlbCIsImxhYmVsT3BlcmF0b3IiLCJjaV9zaXplIiwiY2lfbGFiZWwiLCJtaWdyYXRlSm9iIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJrZXlzIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJmaXhUeXBvc0luQ29kZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiYyIsImhhc1N0YXJ0VGVzdCIsImdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSIsInRyaW1FbmQiLCJnZW5JMThuVHMiLCJyZWFjdCIsIm5leHQiLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJyb290IiwiJHNjaGVtYSIsImV4dGVuZHMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZSIsIm5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZSIsImdlbmVyYXRlQnVuZmlnVG9tbCIsInJlYWRGaWxlU3luYyIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwiaW5kZXhPZiIsInRoaXMiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiYmlvbWUiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50cmMiLCJlc2xpbnRCYXNlIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJzdHlsZWd1aWRlQ29udGVudCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJuYW1lcyIsImRvZXNDb250YWluR2VtZmlsZSIsImRvZXNDb250YWluR29Nb2QiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJibGl0eiIsImZpcmViYXNlIiwicHJpc21hIiwicGxheXdyaWdodFRlc3QiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJyZXNwb25zZSIsImZldGNoIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiYXJncyIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJzcGF3blN5bmMiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInRvU3RyaW5nIiwicyIsIm1lc3NhZ2UiLCJwcm9jZXNzIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsIm9yZ2FuaXphdGlvbiIsInJlcG8iLCJyZXBvVXJsIiwiY29tbWl0SGFzaCIsInJlamVjdCIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsIm9jdG9raXRDYWNoZSIsIk1hcCIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsImdldCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwic2V0IiwiaGFzR2l0SHViVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIiwiR0lUSFVCX1RPS0VOIiwianNDb21tb25EZXBzIiwidHNDb21tb25EZXBzIiwicmVhY3RDb21tb25EZXBzIiwiZXNsaW50RGVwcyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25UZXh0IiwianNvbk9iaiIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImxpbmUiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJ2ZXJzaW9uIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIndiIiwibWljcm9tYXRjaCIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwiZGVwIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsInNjcmlwdE5hbWUiLCJzY3JpcHQiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwic2l6ZSIsImRpck5hbWVzU3RyIiwicGFja2FnZU5hbWVzIiwiaGFzIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiZ2V0RGVwZW5kZW5jeVNwZWNpZmllciIsImRldkRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiY29yZSIsImRlcGVuZGVuY3kiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsIm9sZFRlc3QiLCJweXJpZ2h0IiwiYmFzZVNldHRpbmdzIiwicHJlQ29tbWl0U2V0dGluZ3MiLCJjb21tYW5kcyIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwiaHVza3lEaXJQYXRoIiwiaGFzSHVza3lEaXIiLCJzZXR0aW5ncyIsImdldENsZWFudXBDb21tYW5kIiwicHJlUHVzaCIsInR5cGVjaGVja0NvbW1hbmQiLCJnZXRQcmVQdXNoU2NyaXB0IiwibWtkaXJTeW5jIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJwb3N0TWVyZ2VDb21tYW5kcyIsImhhc1ZlcnNpb25TZXR0aW5ncyIsInRvb2xzQ2hhbmdlZFBhdHRlcm4iLCJyYXciLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJzcmNEaXJlY3RvcmllcyIsIm5vZGUiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsInBhY2thZ2VQcmVmaXgiLCJnZXRFc2xpbnRLZXkiLCJwYWNrYWdlc0ZpbHRlciIsImdldEVzbGludEZpbHRlckZvclByZXR0aWVyIiwiZ2V0U3JjRGlycyIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsImJhZGdlIiwicmVhZG1lIiwiaSIsImdlbmVyYXRlUmVsZWFzZXJjIiwicGx1Z2lucyIsInBsdWdpbiIsInByZXNldCIsImZhaWxDb21tZW50IiwiXzEiLCJzdWNjZXNzQ29tbWVudCIsIl8yIiwiY2xlYW5PbGRDb25maWciLCJzdWNjZXNzQ29tbWVudENvbmRpdGlvbiIsImZhaWxDb21tZW50Q29uZGl0aW9uIiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsIm1vZHVsZSIsIm1vZHVsZVJlc29sdXRpb24iLCJqc3giLCJhbHdheXNTdHJpY3QiLCJzdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJza2lwTGliQ2hlY2siLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJzb3VyY2VNYXAiLCJpbXBvcnRIZWxwZXJzIiwiZXJhc2FibGVTeW50YXhPbmx5Iiwib3V0RGlyIiwidHlwZVJvb3RzIiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwiaXNFc21QYWNrYWdlIiwic2hvdWxkUHJlc2VydmVCdW5kbGVyUmVzb2x1dGlvbiIsInRvTG93ZXJDYXNlIiwic29ydCIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwiY3VycmVudFZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwidmVyc2lvbnNKc29uIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldE1ham9yTnVtYmVyIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsIm5vZGVMaW5rZXIiLCJubU1vZGUiLCJucG1NaW5pbWFsQWdlR2F0ZSIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwibWFqb3IiLCJOdW1iZXIiLCJzZXR1cExhYmVscyIsInNldHVwTGFiZWwiLCJkZWxldGVMYWJlbCIsIndhcm4iLCJjb2xvciIsInJlcXVlc3QiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInNldHVwU2VjcmV0cyIsImRvdGVudiIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwiZGF0YSIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfYXV0b19tZXJnZSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImFsbG93X3VwZGF0ZV9icmFuY2giLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUiLCJkaXN0YW5jZSIsInRlbXBsYXRlIiwicGFja2FnZU1hbmFnZXJDb21tYW5kIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwicGFja2FnZUpzb25QYXRoIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInR5cGUiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwianNvbiIsImZzcCIsImZsYXQiLCJyZXBvSW5mbyIsImdpdCIsInNpbXBsZUdpdCIsIm9yaWdpbiIsImdldFJlbW90ZXMiLCJyIiwicmVtb3RlVXJsIiwicmVmcyIsInJlcXVlc3RSZXBvSW5mbyIsImZldGNoUmVwb0luZm8iLCJjdXJyZW50IiwiaGFzVmVyc2lvblNldHRpbmdzRmlsZSIsInByZWZpeCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJucG0iLCJnZXRFc2xpbnRFeHRlbnNpb25CYXNlIiwicGF0dGVybiIsIm9yZyIsInJldCIsImFzc2lnbiIsInJlZGlyZWN0ZWRGdWxsTmFtZSIsImxvY2F0aW9uIiwiZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZSIsInNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIiwiYXJndiIsInlhcmdzIiwicG9zaXRpb25hbCIsImRlc2NyaWJlIiwiYXJyYXkiLCJkZWZhdWx0IiwiYWxpYXMiLCJza2lwRGVwcyIsInZlcmJvc2UiLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsInJvb3REaXJQYXRoIiwicGF0aHMiLCJwYWNrYWdlc0RpclBhdGgiLCJzdWJEaXJQYXRocyIsImlnbm9yZUVycm9yQXN5bmMiLCJkIiwiYWJicmV2aWF0aW9uUHJvbWlzZSIsInN1YlBhY2thZ2VDb25maWdzIiwic3ViRGlyUGF0aCIsImFsbFBhY2thZ2VDb25maWdzIiwic2hvdWxkUnVuV29ya2Zsb3dzIiwidGhlbiIsInJtU3luYyJdLCJtYXBwaW5ncyI6Im1vQkFLTyxNQUFNQSxFQUFVLElBTHZCLE1BQ0VDLFdBQVksRUFDWkMsbUJBQW9CLEdDZ0JmLE1BQU1DLEVBQVMsSUFoQnRCLE1BQ0UsK0JBQU1DLENBQTBCQyxFQUFjQyxHQUN4Q04s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