wbfy 2.26.2 → 2.26.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
import e from"node:fs/promises";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";import{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import{Octokit as p}from"@octokit/core";import d from"node:child_process";import u from"deepmerge";import m from"lodash.clonedeep";import f from"node:os";import g from"js-yaml";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{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=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:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(n){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!n.doesContainsDockerfile)return;const s=n.dockerfile,i=s;s!==i&&await e.writeFile(t.join(n.dirPath,"Dockerfile"),i)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const n=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(n))return;const s=await r.promises.readFile(n,"utf8"),i=s.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");s!==i&&await r.promises.writeFile(n,i)}))}async function P(n){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const s=await a(["*.env","*.env.*"],{dot:!0,cwd:n.dirPath});for(const i of s){const s=t.resolve(n.dirPath,i),o=(await e.readFile(s,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(s,o)}}))}async function $(e){return j.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",(async()=>{await Promise.all(e.map((async e=>{const n=t.join(e,"__tests__"),s=t.join(e,"tests");try{await r.promises.rename(n,s);const i=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=i.replaceAll("__tests__","tests");if(i===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const S=new l;async function F(s,i){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(s.dirPath,"@types"),r=s.isRoot&&s.doesContainsSubPackageJsons?void 0:t.resolve(s.dirPath,"src","types"),a=await n((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const s of a){const a=s.name.slice(0,-5),c=s.name.endsWith(".d.ts");let l=c?a:s.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=i.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));s.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await S.run((()=>e.rename(t.join(o,s.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await S.run((()=>e.rename(t.join(o,s.name),t.join(r,s.name))))):s.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await S.run((()=>n((()=>e.rename(t.join(o,s.name,"index.d.ts"),t.join(r,`${s.name}.d.ts`)))))))}}))}const C={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,n){await e.writeFile(t,n)}};async function E(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const n=e.dirPath,s=await a("**/*.md",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${s.length} markdown files in ${n}`);for(const i of s){const s=t.join(n,i);await S.run((async()=>{const t=await r.promises.readFile(s,"utf8");let n=B(t);n=O(n,e,"doc"),t!==n&&await C.generateFile(s,n)}))}const i=await a(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${n}`);for(const s of i){const i=t.join(n,s),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,e,"ts"),o!==a&&await C.generateFile(i,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${n}`);for(const s of o){const i=t.join(n,s),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,e,"text"),o!==a&&await C.generateFile(i,a)}await S.promiseAll()}))}function B(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function O(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}const D=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,I=!!D,T=new p({auth:D});const A=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function R(e,t,n,s=0){do{const[s,i,o]=J(e,t,n);if(0===d.spawnSync(s,i,o).status)break}while(--s>=0)}function W(e,t,n){const[s,i,o]=J(e,t,n);o.stdio="pipe";const r=d.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function J(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),s.ASDF_DIR&&(t=["-l","-c",`. ${s.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function L(e){const t=e.split(/[+.-]/).map(Number).filter((e=>!Number.isNaN(e)));let n=0,s=1;for(const e of t)n+=e*s,s/=1e3;return n}const N="3.9.19",z="zulu-11.74.15",G="2.0.4",U="14.2.5";async function H(e){return j.functionIgnoringException("generateToolVersions",(async()=>{await async function(e){if(!e.versionsText)return;const n=e.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${M.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())),s=[...new Set(n)];if(e.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&Y(s,"poetry",t?.info?.version),Y(s,"python",N,!0)}e.depending.firebase&&Y(s,"java",z,!0);if(e.doesContainsPackageJson)if(e.isBun){const e=await K("evilmartians","lefthook");e&&Y(s,"lefthook",e);const t=await K("oven-sh","bun");t&&Y(s,"bun",t)}else{const t=W("npm",["show","yarn","version"],e.dirPath);Y(s,"yarn",t)}for(const n of q){const s=t.resolve(e.dirPath,`.${n}-version`);r.promises.rm(s,{force:!0})}const i=t.resolve(e.dirPath,".tool-versions");await(s.length>0?S.run((()=>r.promises.writeFile(i,s.join("\n")+"\n"))):S.run((()=>r.promises.rm(i,{force:!0})))),await S.promiseAll(),R("asdf",["plugin","update","--all"],e.dirPath),R("asdf",["install"],e.dirPath)}(e)}))}const M=new Set(["java","nodejs","bun","python"]),q=["java","node","python"];function Y(e,t,n,s=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(-1===i)e.splice(s?0:e.length,0,o);else{const[,t]=e[i].split(/\s+/);L(n)>L(t)&&(e[i]=o)}}async function K(e,t){try{const n=(await T.request("GET /repos/{owner}/{repo}/releases/latest",{owner:e,repo:t})).data.tag_name,s=n.lastIndexOf("v"),i=-1===s?n:n.slice(s+1);return/^\d/.test(i)?i:void 0}catch(e){return void console.error("Failed to fetch Bun tags due to:",e)}}function V(e,t){return t}function X(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]=u(e[i],o,n):e.includes(o)||s.push(o);return s}const Q={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};async function Z(e){return j.functionIgnoringException("generateBiomeJsonc",(async()=>{let n=m(Q);const s=t.resolve(e.dirPath,"biome.jsonc");try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V})}catch{}const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}async function ee(e){return j.functionIgnoringException("generateBunfigToml",(async()=>{const n=t.resolve(e.dirPath,"bunfig.toml");await S.run((()=>C.generateFile(n,"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n\n")))}))}const te="# Project-specific settings",ne=/# Project-specific settings[^\n]*\n/gm,se="# Generated by wbfy",ie=`${te} (head)\n\n\n${se}\n`,oe=`\n${te} (tail)\n`,re={separator:se,separatorPrefix:"# Generated by ",defaultHeadUserContent:ie,defaultTailUserContent:oe,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const n=ae(t);return n>0&&(t=t.slice(0,n-1)),t.replaceAll(ne,"").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(ne,`${te} (head)\n`):ie},getTailUserContent(e){const t=ae(e);return t>0?e.slice(t-1):oe},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ae(e){const t=e.indexOf(te),n=e.lastIndexOf(te);return n>t?n:-1}async function ce(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const n=t.resolve(e.dirPath,".dockerignore");if(e.doesContainsDockerfile){const e=await C.readFileIgnoringError(n)??"",t=re.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+re.getTailUserContent(e);await S.run((()=>C.generateFile(n,t)))}else await r.promises.rm(n,{force:!0})}))}const le={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},pe=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${ue(le.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${ue(le.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${ue(le.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${ue(le.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function de(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run((()=>C.generateFile(n,pe)))}))}function ue(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function me(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const n=t.resolve(e.dirPath,".eslintignore");if(e.isBun)return void await S.run((()=>r.promises.rm(n,{force:!0})));const s=await C.readFileIgnoringError(n)??"",i=re.getHeadUserContent(s),o=re.getTailUserContent(s),a=t.resolve(e.dirPath,".gitignore"),c=i+"\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n"+(await re.readGitignoreWithoutSeparators(a)||"")+o;await S.run((()=>C.generateFile(n,c)))}))}async function fe(e,n){return j.functionIgnoringException("generateEslintrc",(async()=>{const s=t.resolve(e.dirPath,".eslintrc.json");if(e.isBun)return void await S.run((()=>r.promises.rm(s,{force:!0})));const i=[];e.eslintBase&&i.push(e.eslintBase),e!==n&&i.push("../../.eslintrc.json");let o={root:!0,extends:i};try{const t=await r.promises.readFile(s,"utf8"),n=JSON.parse(t);n.extends&&(n.extends=n.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===i.length&&(n.extends=[]);const a=o.extends;o.extends=n.extends,n.extends=a,o=u.all([o,n,o],{arrayMerge:X}),e.depending.blitz&&(o.extends=o.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(o);await S.run((()=>C.generateFile(s,a)))}))}const ge=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...le.codeWith2IndentSize,...le.codeWith4IndentSize,...le.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function he(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run((()=>C.generateFile(n,ge)))}))}const ye=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function we(e,n){return j.functionIgnoringException("generateGitignore",(async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(s)??"";let o=re.getHeadUserContent(i)+"\n!.keep\n.env.production\n*/mount/*.hash\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n";const r=re.getTailUserContent(i),a=[...ye];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(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*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-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 ke(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((()=>ve(e,t))),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await re.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(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.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run((()=>C.generateFile(s,l)))}))}const be=t.join(f.homedir(),".cache","wbfy","gitignore");async function ve(e,n){await r.promises.mkdir(be,{recursive:!0}),await r.promises.writeFile(t.join(be,e),n)}async function ke(e){try{const n=await r.promises.stat(t.join(be,e));if(Date.now()-n.mtimeMs>216e5)return;return await r.promises.readFile(t.join(be,e),"utf8")}catch{}}async function je(e,t){try{const{data:n}=await T.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(0===n.length)throw new Error(`No commits found for ${e}/${t}`);return n[0].sha}catch(n){throw new Error(`Failed to fetch commits for ${e}/${t}: ${n}`)}}const xe={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},_e={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function Pe(e){return e.depending.blitz?_e.blitz:_e.node}const $e=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],Se=[...$e,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Fe=["eslint-plugin-react","eslint-plugin-react-hooks"],Ce={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...$e],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...$e,...Fe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Se],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Se,...Fe],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...Se,...Fe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Se,...Fe]};async function Ee(e,n,s){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,n,s){const i=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(i,"utf8"),l=JSON.parse(o);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.peerDependencies||{},await async function(e,t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");if(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,!e.isWillBoosterConfigs)for(const e of Object.values(Ce))for(const n of e)delete t.devDependencies[n];await S.run((()=>r.promises.rm("lerna.json",{force:!0})))}(n,l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=u(l.scripts,Be(e)),e.isBun?delete l.scripts.prettify:l.scripts.prettify+=await async function(e){const n=t.resolve(e,".prettierignore"),s=await r.promises.readFile(n,"utf8"),i=s.indexOf(re.separatorPrefix);if(-1===i)return"";const o=s.slice(0,i);return o.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("")}(e.dirPath);for(const[e,t]of Object.entries(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],d=["prettier","sort-package-json","@willbooster/prettier-config"];const m=[];e.isBun?delete l.devDependencies["lint-staged"]:d.push("lint-staged");if(e.isRoot){if(e.isBun?(delete l.devDependencies.husky,delete l.devDependencies.pinst,l.scripts.prepare="lefthook install || true"):(d.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(e.isPublicRepo||e.isReferredByOtherRepo)&&(d.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable")),e.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";d.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||d.push("semantic-release"),l.version="0.0.0-semantically-released"}e.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(d.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),e.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?u.all([l.workspaces,["packages/*"]],{arrayMerge:X}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((t=>c(t,{dot:!0,cwd:e.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(e.depending.wb||e.isBun){l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):d.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(e.isBun?(d.push("@biomejs/biome","@willbooster/biome-config"),delete l.devDependencies.eslint,delete l.devDependencies.micromatch,delete l.devDependencies["@typescript-eslint/parser"]):(d.push("eslint@8.57.0","micromatch"),e.doesContainsTypeScriptInPackages&&d.push("@typescript-eslint/parser")));(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(d.push("typescript"),e.isBun&&d.push("@types/bun"));e.eslintBase&&d.push(...Ce[e.eslintBase]);e.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),d=d.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&n.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=A.getOrgAndName(e.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");e.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.doesContainsSubPackageJsons){if(e.isBun||(e.doesContainsJavaScript||e.doesContainsTypeScript?l.scripts["lint-fix"]+=xe.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix",""))),e.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const n=["lib","test","test_driver"].filter((n=>r.existsSync(t.resolve(e.dirPath,n))));n.length>0&&(l.scripts["format-code"]=`flutter format $(find ${n.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(e.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),n=new Set;for(const e of t){const[t,s]=e.split(/[/\\]/);s&&n.add(t)}if(n.size>0){const e=[...n].join(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}e.repository&&(l.repository=e.repository)}e.depending.blitz?(p.push(`blitz@${G}`,`@blitzjs/auth@${G}`,`@blitzjs/next@${G}`,`@blitzjs/rpc@${G}`,`next@${U}`),d=d.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");e.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.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")){delete e.devDependencies["@willbooster/auth"];const t=await je("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await je("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await je("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}if(t.has("@willbooster/judge")){delete e.dependencies["@willbooster/judge"];const t=await je("WillBoosterLab","judge");e.devDependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")){delete e.dependencies["@willbooster/llm-proxy"];const t=await je("WillBoosterLab","llm-proxy");e.devDependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#workspace=@llm-proxy/client&commit=${t}`}}(l);let g=JSON.stringify(l);if(g=await async function(e,n,s){const i=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&i.push([t,t.replaceAll(":","-")]);if(0===i.length)return n;for(const[e,t]of i)n=n.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:s.dirPath,dot:!0,gitignore:!0});for(const e of o)await S.run((async()=>{const n=t.join(s.dirPath,e),o=await r.promises.readFile(n,"utf8");let a=o;for(const[e,t]of i)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(n,a)}));return await S.promiseAll(),n}(l.scripts,g,e),await r.promises.writeFile(i,g),!s){p=p.filter((e=>!l.devDependencies?.[e]));const t=e.isBun?"bun":"yarn";p.length>0&&R(t,["add",...new Set(p)],e.dirPath),d=d.filter((e=>!l.dependencies?.[e])),d.length>0&&R(t,["add","-D",...new Set(d)],e.dirPath),m.length>0&&R("poetry",["add","--group","dev",...new Set(m)],e.dirPath)}}(e,n,s)}))}function Be(e){if(e.isBun){const t={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 e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${Pe(e)}}/**/*.{${le.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${le.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){const e=t.test;t=u({...t},{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 "**/{.*/,}*.{${le.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?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}}const Oe={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\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\nyarn typecheck\n'.trim(),postMerge:'\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 De(e){return j.functionIgnoringException("generateHuskyrcUpdatingPackageJson",(async()=>{await async function(e){const n=t.resolve(e.dirPath,"package.json"),s=await r.promises.readFile(n,"utf8"),i=JSON.parse(s);i.scripts||={},delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepare,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack;const o=t.resolve(e.dirPath,".husky");if(await Promise.all([r.promises.writeFile(n,JSON.stringify(i,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),e.isBun)return void R("git",["config","--unset","core.hooksPath"],e.dirPath);R("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await S.run((()=>r.promises.writeFile(a,Oe.preCommit+"\n")));const{typecheck:c}=Be(e);if(c){let n=e.repository?.startsWith("github:WillBoosterLab/")?Oe.prePushForLab:Oe.prePush;n=n.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await S.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),n+"\n",{mode:493})))}const l=`${Oe.postMerge}\n\n${Ie(e).join("\n")}\n`;await S.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),l,{mode:493})))}(e)}))}function Ie(e){const t=[];e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "awk '{print \$1}' .tool-versions | xargs -I{} asdf plugin add {}"`,String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`),e.versionsText?.includes("python ")&&t.push(String.raw`run_if_changed "\..+-version" "asdf install python"`),e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(`run_if_changed "package\\.json" "${n}${s}"`),e.doesContainsPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push('run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma migrate deploy"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma generate"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz codegen"'):e.depending.prisma&&t.push('run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"','run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"'),t}function Te(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 Ae=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map((e=>Te("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Re=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map((e=>Te("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e))).join("")}\n </component>\n</project>\n`;async function We(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const n=t.resolve(e.dirPath,".idea");if(r.existsSync(n)){const s=t.resolve(n,"watcherTasks.xml");await(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||e.doesContainsPackageJson&&!e.doesContainsPubspecYaml&&!e.doesContainsGemfile&&!e.doesContainsGoMod&&!e.doesContainsPomXml?S.run((()=>C.generateFile(s,e.isBun?Re:Ae))):S.run((()=>r.promises.rm(s,{force:!0}))))}}))}const Je={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-commit":{commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}"},"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()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Le={prePush:"bun --bun node_modules/.bin/wb typecheck",prePushForLab:'\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\nbun --bun node_modules/.bin/wb typecheck\n'.trim(),postMerge:'\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 Ne(e){return j.functionIgnoringException("generateLefthookUpdatingPackageJson",(async()=>{await async function(e){const n=t.resolve(e.dirPath,".lefthook");await Promise.all([r.promises.writeFile(t.join(e.dirPath,"lefthook.yml"),g.dump(Je,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),r.promises.rm(n,{force:!0,recursive:!0})]);const{typecheck:s}=Be(e);if(s){const s=e.repository?.startsWith("github:WillBoosterLab/")?Le.prePushForLab:Le.prePush;r.mkdirSync(t.join(n,"pre-push"),{recursive:!0}),await S.run((()=>r.promises.writeFile(t.join(n,"pre-push","check.sh"),s+"\n",{mode:493})))}const i=`${Le.postMerge}\n\n${Ie(e).join("\n")}\n`;r.mkdirSync(t.join(n,"post-merge"),{recursive:!0}),await S.run((()=>r.promises.writeFile(t.resolve(n,"post-merge","prepare.sh"),i,{mode:493})))}(e)}))}async function ze(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const n=t.resolve(e.dirPath,".lintstagedrc.cjs");if(e.isBun)return void await S.run((()=>r.promises.rm(n,{force:!0})));const s=e.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",i=[];if(e.doesContainsJavaScript||e.doesContainsTypeScript){const t=`\n '${Ge(e)}': [${JSON.stringify(`${s}eslint --fix${xe.getLintFixSuffix(e)}`)}, '${s}prettier --cache --write'],`;i.push(t)}const o=e.isRoot?" && !file.includes('/packages/')":"";i.push(`\n './**/*.{${le.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${o});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Ge(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(e)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${s}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${s}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 \`!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.\`,\n ];\n }\n }\n return [];\n},`),e.doesContainsPubspecYaml&&i.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 [`flutter format ${filteredFiles.join(' ')}`];\n },");e.doesContainsPoetryLock&&i.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${e.doesContainsJavaScript||e.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${i.join("")}\n};\n`;await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await S.run((()=>C.generateFile(n,a)))}(e)}))}function Ge(e){return`./{${Pe(e).join(",")}}/**/*.{${le.eslint.join(",")}}`}async function Ue(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const n=["js","mjs","cjs"].map((n=>t.resolve(e.dirPath,`next.config.${n}`))).find((e=>r.existsSync(e)));if(!n)return;const s=(await r.promises.readFile(n,"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((()=>C.generateFile(n,s)))}))}async function He(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await C.readFileIgnoringError(n)??"",i=re.getHeadUserContent(s),o=re.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await re.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run((()=>C.generateFile(n,l)))}))}const Me={venvPath:".",venv:".venv"};async function qe(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let n=m(Me);const s=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V})}catch{}const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}async function Ye(e){return j.functionIgnoringException("generateReadme",(async()=>{const n=t.resolve(e.dirPath,"README.md");let s=await r.promises.readFile(n,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(s=Ke(s,"[](https://github.com/semantic-release/semantic-release)"));const i=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const n of o){if(!n.startsWith("test")&&!n.startsWith("deploy"))continue;let o=n;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[](https://github.com/${i}/actions/workflows/${n})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${n}`))&&(s=Ke(s,a))}await S.run((()=>C.generateFile(n,s)))}))}function Ke(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 Ve(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const n=t.resolve(e.dirPath,".releaserc.json"),s=JSON.parse(await r.promises.readFile(n,"utf8")),i=s?.plugins||[];for(let e=0;e<i.length;e++){const t=Array.isArray(i[e])?i[e][0]:i[e],n=Array.isArray(i[e])&&i[e][1]||{};"@semantic-release/commit-analyzer"===t?i[e]=["@semantic-release/commit-analyzer",u.all([n,{preset:"conventionalcommits"}],{arrayMerge:V})]:"@semantic-release/github"===t&&(i[e]=["@semantic-release/github",u.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:V})])}const o=JSON.stringify(s);await S.run((()=>C.generateFile(n,o)))}))}const Xe={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Qe(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let n=m(Xe);const s=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${s}5`))return;try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V}),n.extends=n.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(n.packageRules??=[],n.packageRules.some((e=>e.packageNames.includes("next")))||n.packageRules.push({packageNames:["next"],enabled:!1})),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}function Ze(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&Ze(s);return e}const et={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},tt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function nt(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let n=m(e.isRoot?et:tt);e.doesContainsJsxOrTsx||e.doesContainsJsxOrTsxInPackages||delete n.compilerOptions?.jsx,e.isRoot&&!e.doesContainsSubPackageJsons&&(n.include=n.include?.filter((e=>!e.startsWith("packages/*/")))),e.isEsmPackage&&(n.compilerOptions={...n.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const s=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(s,"utf8"),i=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===i.extends&&delete i.extends,delete n.compilerOptions?.target,e.isEsmPackage||(delete n.compilerOptions?.module,delete n.compilerOptions?.moduleResolution),i.compilerOptions?.jsx&&delete n.compilerOptions?.jsx,n=u.all([n,i,n],{arrayMerge:X}),n.include=n.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Ze(n),n.include?.sort();const i=JSON.stringify(n);delete n.compilerOptions?.experimentalDecorators,await S.run((()=>C.generateFile(s,i)))}))}const st=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function it(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const n=t.resolve(e.dirPath,".vscode","settings.json"),s=await r.promises.readFile(n,"utf8");let i=JSON.parse(s);for(const e of st)i=u.all([i,ot(e)]);e.doesContainsPoetryLock&&(i=u.all([i,ot("**/.venv/**")])),e.depending.next&&(i=u.all([i,ot("**/.next/**")])),Ze(i??{});const o=JSON.stringify(i,void 0,2);await S.run((()=>C.generateFile(n,o)))}catch{}}))}function ot(e){return{"files.watcherExclude":{[e]:!0}}}const rt={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},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},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.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:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{labeled:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function at(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const n=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(n,{recursive:!0});const s=t.resolve(e.dirPath,".github","semantic.yml");await S.run((()=>r.promises.rm(s,{force:!0,recursive:!0})));const i=await r.promises.readdir(n,{withFileTypes:!0}),o=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...i.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.isPublicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const s of o){const i=t.basename(s,".yml");await S.run((()=>ct(e,n,i)))}await S.run((()=>r.promises.rm(t.join(n,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function ct(e,n,s){let i=m(rt[s]??{});const o=t.join(n,`${s}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=g.load(e);i=u.all([i,t,i],{arrayMerge:X})}catch{}s.startsWith("deploy")&&(i={...i,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},i.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(i,"jobs"),i.on?.push&&(i.on.push["paths-ignore"]=[...new Set([...i.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(i.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;lt(e,t,s)}switch(s){case"release":if(i.on?.schedule)delete i.on.push;else{if(!(i.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(n,"release.yml"),{force:!0});i.on.push.branches=e.release.branches}break;case"test":i.on?.push&&(i.on.push.branches=i.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":i.on&&pt(i,20,24);break;case"wbfy-merge":pt(i,1,4)}if(function(e){delete e.jobs["add-to-project"]}(i),await dt(i,o),"release"===s)await r.promises.rm(t.join(n,"semantic-release.yml"),{force:!0});else if("sync"===s){if(await r.promises.rm(t.join(n,"sync-init.yml"),{force:!0}),!i.jobs.sync||!i.jobs.sync.with)return;i.jobs["sync-force"]=i.jobs.sync;const e=i.jobs.sync.with.sync_params_without_dest;if(!e)return;i.jobs.sync.with.sync_params_without_dest=`--force ${e}`,i.name="Force to Sync",i.on={workflow_dispatch:null},delete i.jobs.sync,await dt(i,t.join(n,"sync-force.yml"))}}function lt(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),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;e&&(t.with.sync_params_without_dest=e.toString().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.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Ze(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ze(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function pt(e,t,n){const[s,i]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==s&&Number.isInteger(i)){const e=(i+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function dt(e,t){const n=g.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,n)}async function ut(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const n=t.resolve(e.dirPath,".yarnrc.yml");if(e.isBun)return await S.run((()=>r.promises.rm(n,{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".yarn"),{force:!0,recursive:!0}))),void await S.run((()=>r.promises.rm(t.resolve(e.dirPath,"yarn.lock"),{force:!0,recursive:!0})));const s=W("yarn",["--version"],e.dirPath),i=function(e,t){const n=W("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",e.dirPath);mt(s)<=mt(i)&&s!==i&&R("yarn",["set","version",i],e.dirPath,1);const o=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(o,{recursive:!0});for(const e of await r.promises.readdir(o))e.startsWith("yarn-")&&!e.startsWith(`yarn-${i}.`)&&await S.run((()=>r.promises.rm(t.join(o,e))));const a=t.resolve(e.dirPath,".yarnrc");await S.run((()=>r.promises.rm(a,{force:!0})));const c=g.load(await r.promises.readFile(n,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",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 n=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await S.run((()=>r.promises.rm(n,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(n,g.dump(c,{lineWidth:-1})),R("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function mt(e){const[t]=e.split(".");return Number(t)}async function ft(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!I)return;const[t,n]=A.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await gt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await gt(t,n,"d2: easy :rabbit2:","DDD6FE"),await gt(t,n,"d3: medium :ox:","C4B5FD"),await gt(t,n,"d4: hard :squid:","A78BFA"),await gt(t,n,"d5: x-hard :whale2:","8B5CF6"),await gt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await gt(t,n,"p2: urgent :fire::fire:","F87171"),await gt(t,n,"p3: important :fire:","FCA5A5"),await gt(t,n,"p4: nice to have :droplet:","FECACA"),await gt(t,n,"r: blitz","5300bc"),await gt(t,n,"r: firebase","ffca28"),await gt(t,n,"r: prisma","0c344b"),await gt(t,n,"r: react","61dafb"),await gt(t,n,"r: svelte","ff3e00"),await gt(t,n,"r: semantic-release","494949"),await gt(t,n,"ready :rocket:","22C55E"),await gt(t,n,"review requested :mag:","FBCA04"),await gt(t,n,"released :bookmark:","6366F1"),await gt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await gt(t,n,"s: 1h :clock1:","E5E7EB"),await gt(t,n,"s: 2h :clock2:","D1D5DB"),await gt(t,n,"s: 3h :clock3:","9CA3AF"),await gt(t,n,"s: 5h :clock5:","6B7280"),await gt(t,n,"s: 8h :clock8:","4B5563"),await gt(t,n,"s: 13h :clock1:","374151"),await gt(t,n,"t: build :hammer:","BFDBFE"),await gt(t,n,"t: chore :broom:","BFDBFE"),await gt(t,n,"t: ci :construction_worker:","BFDBFE"),await gt(t,n,"t: docs :memo:","BFDBFE"),await gt(t,n,"t: feat :sparkles:","BFDBFE"),await gt(t,n,"t: fix :bug:","BFDBFE"),await gt(t,n,"t: perf :zap:","BFDBFE"),await gt(t,n,"t: refactor :recycle:","BFDBFE"),await gt(t,n,"t: style :lipstick:","BFDBFE"),await gt(t,n,"t: test :test_tube:","BFDBFE"),await gt(t,n,"project","24292F"),await gt(t,n,"focused :dart:","22C55E"),await ht(t,n,"bug"),await ht(t,n,"documentation"),await ht(t,n,"duplicate"),await ht(t,n,"enhancement"),await ht(t,n,"good first issue"),await ht(t,n,"help wanted"),await ht(t,n,"invalid"),await ht(t,n,"question"),await ht(t,n,"wontfix"),await ht(t,n,"ready"),await ht(t,n,"review requested"),await ht(t,n,"released"),await ht(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function gt(e,t,n,s){try{await T.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await T.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function ht(e,t,n){try{await T.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const yt=["READY_DISCORD_WEBHOOK_URL"];async function wt(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!I||!k.doesUploadEnvVars)return;const[t,n]=A.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=h.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of yt)try{await T.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await T.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await y.ready;for(const[i,a]of Object.entries(s)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await T.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function bt(e){const[t,n]=A.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s((()=>T.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,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 vt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page. (このページで `All checks have passed` が表示されていることを確認した。)\n - You may leave this box unchecked due to long workflows.\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 - All tests are passed.\n - Test command (e.g., `yarn test`) is passed.\n - Lint command (e.g., `yarn lint`) is passed.\n- [ ] I\'ve reviewed my changes on GitHub PR\'s diff view. (GitHub上で自分の変更内容を確認した。)\n- [ ] I\'ve written the steps to test your changes. (テスト手順を記載した。)\n- [ ] I\'ve added screenshots. (UIを変更した場合、スクリーンショットを追加した。)\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\n\x3c!-- 日本語で記述しても大丈夫です。 --\x3e\n'.trim()};async function kt(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[n,s]of Object.entries(vt)){const i=t.resolve(e.dirPath,".github",n);if(r.existsSync(i)){const e=await r.promises.readFile(i,"utf8");if(w(e,s)>s.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await S.run((()=>C.generateFile(i,s)))}}))}const jt=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function xt(n,s){const i=t.resolve(n,"package.json");try{const o=r.existsSync(i);let a={},c={},l={},p=!1;if(o){const e=r.readFileSync(i,"utf8");l=JSON.parse(e),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const s=t.resolve(n,".releaserc.json"),i=JSON.parse(await e.readFile(s,"utf8"));d=i?.branches||[],u=i?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!r.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 Pt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Pt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await e.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[s,i]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(n,`.${s}-version`),"utf8");g&&(g+="\n"),g+=i+" "+o.trim()}catch{}let h="";try{h=await e.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const t=await e.readFile(y,"utf8");w=jt.parse(JSON.parse(t))}catch{}const v={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f?.full_name}`:void 0,isBun:s?.isBun||r.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:_t("packages/**/package.json",n),doesContainsDockerfile:!!h||r.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:r.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:r.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:r.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:r.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:r.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:r.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:r.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:r.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:_t("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:_t("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:_t("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:_t("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:_t("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:_t("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],litestream:h.includes("install-litestream.sh"),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"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},versionsText:g,packageJson:l,wbfyJson:w};if(v.isBun||(v.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function _t(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function Pt(e){const[t,n]=A.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await T.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}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"}}).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.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await $([s,...r]);const a=await xt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>xt(e,a))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await H(a),await ut(a),await Promise.all([x(a),P(a),c.then((()=>Ye(a))),ce(a),de(a),he(a),kt(a),We(a),Qe(a),Ve(a),at(a),ft(a),wt(a),bt(a),...a.isBun?[ee(a),De(a).then((()=>Ne(a)))]:[De(a)],ze(a)]),await S.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(F(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(Ue(e)),await we(e,a),await S.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await He(e),await Ee(e,a,n.skipDeps),d.push(ze(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(it(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(nt(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Z(e)),a.isWillBoosterConfigs||d.push(fe(e,a)),d.push(me(e))),e.depending.pyright&&d.push(qe(e)));await Promise.all(d),await S.promiseAll();const u=a.isBun?"bun":"yarn";R(u,["cleanup"],s),a.isBun?R(u,["update"],s):R(u,["install"],s)}}();
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL2VzbGludFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3JjRGlyZWN0b3JpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2h1c2t5cmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVyYy50cyIsIi4uL3NyYy91dGlscy9vYmplY3RVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlOiBib29sZWFuO1xuICBkb2VzVXBsb2FkRW52VmFyczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzVmVyYm9zZSA9IGZhbHNlO1xuICAgIHRoaXMuZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBlcnJvcn19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeERvY2tlcmZpbGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4RG9ja2VyZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG5cbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdEb2NrZXJmaWxlJyksIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvcmV0cmllczouKywvLCAncmV0cmllczogcHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxLCcpO1xuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZ2xvYmJ5KFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ19fdGVzdHNfXycpO1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3RzJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwoJ19fdGVzdHNfXycsICd0ZXN0cycpO1xuICAgICAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzcC53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhBYmJyZXZpYXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBnaXRpZ25vcmU6IHRydWUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeEFiYnJldmlhdGlvbnNJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBnbG9iYnkoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBnaXRpZ25vcmU6IHRydWUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZ2xvYmJ5KCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBnaXRpZ25vcmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gb2xkQ29udGVudFxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWNcXC5mXFwuL2csICcvLyQxY2YuJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWllXFwuL2csICcvLyQxaS5lLicpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSBjb250aW51ZTtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhBYmJyZXZpYXRpb25zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jb25zdCB0b2tlbiA9XG4gIHByb2Nlc3MuZW52LkdIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuUFVCTElDX0dIX0JPVF9QQVQgfHwgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHwgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOO1xuZXhwb3J0IGNvbnN0IGhhc0dpdEh1YlRva2VuID0gISF0b2tlbjtcbmV4cG9ydCBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICBhdXRoOiB0b2tlbixcbn0pO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtvcHRpb25zLmN3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGlmIChyZXQuc3RhdHVzID09PSAwKSBicmVhaztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIGNvbnN0IGVycm9yID0gcHJvYy5zdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCl9XSBjYXVzZWQgdGhlIGZvbGxvd2luZyBlcnJvcjpcXG4gJHtlcnJvcn1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXQudG9TdHJpbmcoKS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAvLyBSZW1vdmUgYmVycnkgZnJvbSBQQVRIXG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEgucmVwbGFjZShgJHtlbnYuQkVSUllfQklOX0ZPTERFUn06YCwgJycpO1xuICB9XG5cbiAgaWYgKGVudi5BU0RGX0RJUikge1xuICAgIGFyZ3MgPSBbJy1sJywgJy1jJywgYC4gJHtlbnYuQVNERl9ESVJ9L2FzZGYuc2ggJiYgJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWBdO1xuICAgIGNvbW1hbmQgPSAnYmFzaCc7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBlLmcuIGphdmEgYWRvcHRvcGVuamRrLTExLjAuMTcrOFxuICBjb25zdCBudW1iZXJzID0gdmVyc2lvblxuICAgIC5zcGxpdCgvWysuLV0vKVxuICAgIC5tYXAoTnVtYmVyKVxuICAgIC5maWx0ZXIoKG51bSkgPT4gIU51bWJlci5pc05hTihudW0pKTtcbiAgbGV0IHZlcnNpb25OdW1iZXIgPSAwO1xuICBsZXQgZGl2aXNvciA9IDE7XG4gIGZvciAoY29uc3QgbnVtIG9mIG51bWJlcnMpIHtcbiAgICB2ZXJzaW9uTnVtYmVyICs9IG51bSAqIGRpdmlzb3I7XG4gICAgZGl2aXNvciAvPSAxMDAwO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uTnVtYmVyO1xufVxuIiwiZXhwb3J0IGNvbnN0IFBZVEhPTl9WRVJTSU9OID0gJzMuOS4xOSc7XG5leHBvcnQgY29uc3QgSkFWQV9WRVJTSU9OID0gJ3p1bHUtMTEuNzQuMTUnO1xuLy8gQmVjYXVzZSBXZWJLaXQgY2Fubm90IGxvZy1pbiBvbiBCbGl0eiB2Mi4wLjUrXG5leHBvcnQgY29uc3QgQkxJVFpfVkVSU0lPTiA9ICcyLjAuNCc7XG5leHBvcnQgY29uc3QgTkVYVF9WRVJTSU9OID0gJzE0LjIuNSc7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IEpBVkFfVkVSU0lPTiwgUFlUSE9OX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy92ZXJzaW9uQ29uc3RhbnRzLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVG9vbFZlcnNpb25zKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVG9vbFZlcnNpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmNvbnN0IENPUkVfVE9PTFMgPSBuZXcgU2V0KFsnamF2YScsICdub2RlanMnLCAnYnVuJywgJ3B5dGhvbiddKTtcbmNvbnN0IERFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUyA9IFsnamF2YScsICdub2RlJywgJ3B5dGhvbiddO1xuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbmZpZy52ZXJzaW9uc1RleHQpIHJldHVybjtcblxuICBjb25zdCBkdXBsaWNhdGFibGVMaW5lcyA9IGNvbmZpZy52ZXJzaW9uc1RleHRcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IFtuYW1lLCB2ZXJzaW9uXSA9IGxpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAvLyBUbyBtb3ZlIHRoZSB0b3Agb2YgdGhlIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSkgPyAnICcgOiAnJ30ke25hbWV9ICR7dmVyc2lvbn1gO1xuICAgIH0pXG4gICAgLnNvcnQoKVxuICAgIC8vIFJlbW92ZSBhZGRlZCBzcGFjZXMuXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5uZXcgU2V0KGR1cGxpY2F0YWJsZUxpbmVzKV07XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9weXBpLm9yZy9weXBpL3BvZXRyeS9qc29uJyk7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBjb25zdCBwb2V0cnlWZXJzaW9uID0ganNvbj8uaW5mbz8udmVyc2lvbjtcbiAgICBpZiAocG9ldHJ5VmVyc2lvbikge1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3BvZXRyeScsIGpzb24/LmluZm8/LnZlcnNpb24pO1xuICAgIH1cbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncHl0aG9uJywgUFlUSE9OX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2phdmEnLCBKQVZBX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBsZWZ0aG9va1ZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKCdldmlsbWFydGlhbnMnLCAnbGVmdGhvb2snKTtcbiAgICAgIGlmIChsZWZ0aG9va1ZlcnNpb24pIHVwZGF0ZVZlcnNpb24obGluZXMsICdsZWZ0aG9vaycsIGxlZnRob29rVmVyc2lvbik7XG5cbiAgICAgIGNvbnN0IGJ1blZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKCdvdmVuLXNoJywgJ2J1bicpO1xuICAgICAgaWYgKGJ1blZlcnNpb24pIHVwZGF0ZVZlcnNpb24obGluZXMsICdidW4nLCBidW5WZXJzaW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ25wbScsIFsnc2hvdycsICd5YXJuJywgJ3ZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3lhcm4nLCB2ZXJzaW9uKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMpIHtcbiAgICBjb25zdCB2ZXJzaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApO1xuICAgIHZvaWQgZnMucHJvbWlzZXMucm0odmVyc2lvblBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0b29sVmVyc2lvbnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKTtcbiAgYXdhaXQgKGxpbmVzLmxlbmd0aCA+IDBcbiAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUodG9vbFZlcnNpb25zUGF0aCwgbGluZXMuam9pbignXFxuJykgKyAnXFxuJykpXG4gICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0odG9vbFZlcnNpb25zUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsncGx1Z2luJywgJ3VwZGF0ZScsICctLWFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsnaW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24obGluZXM6IHN0cmluZ1tdLCB0b29sTmFtZTogc3RyaW5nLCBuZXdWZXJzaW9uOiBzdHJpbmcsIGhlYWQgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBpbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC5zcGxpdCgvXFxzKy8pWzBdID09PSB0b29sTmFtZSk7XG4gIGNvbnN0IG5ld0xpbmUgPSBgJHt0b29sTmFtZX0gJHtuZXdWZXJzaW9ufWA7XG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBsaW5lcy5zcGxpY2UoaGVhZCA/IDAgOiBsaW5lcy5sZW5ndGgsIDAsIG5ld0xpbmUpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFssIHZlcnNpb25dID0gbGluZXNbaW5kZXhdLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKGNvbnZlcnRWZXJzaW9uSW50b051bWJlcihuZXdWZXJzaW9uKSA+IGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uKSkge1xuICAgICAgbGluZXNbaW5kZXhdID0gbmV3TGluZTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yihvcmdhbml6YXRpb246IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCB0aGUgbGF0ZXN0IHJlbGVhc2UgZnJvbSB0aGUgcmVwb3NpdG9yeVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2xhdGVzdCcsIHtcbiAgICAgIG93bmVyOiBvcmdhbml6YXRpb24sXG4gICAgICByZXBvOiByZXBvc2l0b3J5LFxuICAgIH0pO1xuICAgIGNvbnN0IHZlcnNpb24gPSByZXNwb25zZS5kYXRhLnRhZ19uYW1lO1xuICAgIGNvbnN0IGluZGV4ID0gdmVyc2lvbi5sYXN0SW5kZXhPZigndicpO1xuICAgIGNvbnN0IHZlcnNpb25OdW1iZXJUZXh0ID0gaW5kZXggPT09IC0xID8gdmVyc2lvbiA6IHZlcnNpb24uc2xpY2UoaW5kZXggKyAxKTtcbiAgICAvLyBDaGVjayB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgbnVtYmVyXG4gICAgcmV0dXJuIC9eXFxkLy50ZXN0KHZlcnNpb25OdW1iZXJUZXh0KSA/IHZlcnNpb25OdW1iZXJUZXh0IDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBCdW4gdGFncyBkdWUgdG86JywgZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogYW55W10sIHNvdXJjZTogYW55W10sIG9wdGlvbnM6IGFueSk6IGFueVtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IHVua25vd24gPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgdGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IHRydWVcblxuW3J1bl1cbmJ1biA9IHRydWVcblxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS5zb3J0KCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ3B5J10uc29ydCgpLFxuICBjb2RlV2l0aDhJbmRlbnRTaXplOiBbJ3NoJ10uc29ydCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS5zb3J0KCksXG4gIGVzbGludDogWydjanMnLCAnbWpzJywgJ2pzJywgJ2N0cycsICdtdHMnLCAndHMnLCAndHN4JywgJ2pzeCddLnNvcnQoKSxcbiAgcHJldHRpZXI6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3NzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ21kJyxcbiAgICAnc2NzcycsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnNvcnQoKSxcbiAgLy8gY2YuIGh0dHBzOi8vYmlvbWVqcy5kZXYvaW50ZXJuYWxzL2xhbmd1YWdlLXN1cHBvcnQvXG4gIGJpb21lOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICd2dWUnLFxuICAgICdzdmVsdGUnLFxuICAgICdhc3RybycsXG4gICAgJ2NzcycsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdncWwnLFxuICBdLnNvcnQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoOEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA4XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5AdHlwZXMvXG5fX2dlbmVyYXRlZF9fL1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG4qLmNvbmZpZy4qanNcbiouZC50c1xuKi5taW4uKmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVzbGludGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZXMgPSBbXTtcbiAgICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICAgIGJhc2VzLnB1c2goY29uZmlnLmVzbGludEJhc2UpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnICE9PSByb290Q29uZmlnKSB7XG4gICAgICBiYXNlcy5wdXNoKCcuLi8uLi8uZXNsaW50cmMuanNvbicpO1xuICAgIH1cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSB7IHJvb3Q6IHRydWUsIGV4dGVuZHM6IGJhc2VzIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgaWYgKG9sZFNldHRpbmdzLmV4dGVuZHMpIHtcbiAgICAgICAgb2xkU2V0dGluZ3MuZXh0ZW5kcyA9IG9sZFNldHRpbmdzLmV4dGVuZHMuZmlsdGVyKFxuICAgICAgICAgIChleHQ6IHN0cmluZykgPT4gIWV4dC5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykgJiYgZXh0ICE9PSAnLi4vLi4vLmVzbGludHJjLmpzb24nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoYmFzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG9sZFNldHRpbmdzLmV4dGVuZHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0V4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBvbGRTZXR0aW5ncy5leHRlbmRzID0gbmV3RXh0ZW5kcztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KSBhcyB0eXBlb2YgbmV3U2V0dGluZ3M7XG4gICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBjb2RlIGFmdGVyIGFsbCBCbGl0ei5qcyBwcm9qZWN0cyBhcmUgdXBkYXRlZC5cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcihcbiAgICAgICAgICAoZXh0OiBzdHJpbmcpID0+IGV4dCAhPT0gJy4vbm9kZV9tb2R1bGVzL0BibGl0empzL25leHQvZXNsaW50J1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5kZXZjb250YWluZXIvXG5kaXN0L1xudGVtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0dvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuKi5zcWxpdGUzLWpvdXJuYWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBkYXRhOiBjb21taXRzIH0gPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cycsIHtcbiAgICAgIG93bmVyOiBvcmdhbml6YXRpb24sXG4gICAgICByZXBvLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKGNvbW1pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21taXRzWzBdLnNoYTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtlcnJvcn1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBFc2xpbnRVdGlsID0ge1xuICBnZXRMaW50Rml4U3VmZml4KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCA/ICcgLS1ydWxlIFwieyByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHM6IDAgfVwiJyA6ICcnO1xuICB9LFxufTtcbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBzcmNEaXJlY3RvcmllcyA9IHtcbiAgbm9kZTogWydzcmMnLCAndGVzdHMnLCAnc2NyaXB0cyddLnNvcnQoKSxcbiAgYmxpdHo6IFsnc3JjJywgJ3Rlc3RzJywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS5zb3J0KCksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3JjRGlycyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLmJsaXR6O1xuICB9XG4gIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ub2RlO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeyBnbG9iYnksIGdsb2JieVN5bmMgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuaW1wb3J0IHsgQkxJVFpfVkVSU0lPTiwgTkVYVF9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmNvbnN0IGpzQ29tbW9uRGVwcyA9IFtcbiAgJ2VzbGludEA4LjU3LjAnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydCcsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtY2xhc3MtbWVtYmVycycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtZGVzdHJ1Y3R1cmUta2V5cycsXG4gICdlc2xpbnQtcGx1Z2luLXVuaWNvcm4nLFxuXTtcblxuY29uc3QgdHNDb21tb25EZXBzID0gW1xuICAuLi5qc0NvbW1vbkRlcHMsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbicsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCcsXG5dO1xuXG5jb25zdCByZWFjdENvbW1vbkRlcHMgPSBbJ2VzbGludC1wbHVnaW4tcmVhY3QnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcyddO1xuXG5jb25zdCBlc2xpbnREZXBzOiBSZWNvcmQ8RXNsaW50RXh0ZW5zaW9uQmFzZSwgc3RyaW5nW10+ID0ge1xuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJywgLi4uanNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsIC4uLmpzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsIC4uLnRzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLCAuLi50c0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JzogW1xuICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JyxcbiAgICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAuLi50c0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgfHwge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgfHwge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyB8fCB7fTtcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqIGFzIFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuICApO1xuXG4gIGlmIChqc29uT2JqLm5hbWUgIT09ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJykge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcpKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ICs9IGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbicsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJ107XG4gIGNvbnN0IHBvZXRyeURldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICB9IGVsc2Uge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsaW50LXN0YWdlZCcpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2h1c2t5J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BpbnN0J107XG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgaHVza3lcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdodXNreScpO1xuICAgICAgLy8gJ3x8IHRydWUnIGF2b2lkcyBlcnJvcnMgd2hlbiBodXNreSBpcyBub3QgaW5zdGFsbGVkLlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciBub24teWFybiBwYWNrYWdlIG1hbmFnZXJzLlxuICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3IgeWFybi5cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8IGNvbmZpZy5pc1JlZmVycmVkQnlPdGhlclJlcG8pIHtcbiAgICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gICAgICAgIC8vIGh0dHBzOi8vdHlwaWNvZGUuZ2l0aHViLmlvL2h1c2t5LyMvP2lkPWluc3RhbGwtMVxuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncGluc3QnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhY2sgPSAncGluc3QgLS1kaXNhYmxlJztcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrID0gJ3BpbnN0IC0tZW5hYmxlJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID1cbiAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICAgICAgPyAvLyBUT0RPOiByZW1vdmUgdGhlIHZlcnNpb24gc3BlY2lmaWNhdGlvbiBhZnRlciBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIHN1cHBvcnRzIHZlcnNpb24gNytcbiAgICAgICAgICAgICdANi4xLjAnXG4gICAgICAgICAgOiAnJztcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGBjb252ZW50aW9uYWwtY2hhbmdlbG9nLWNvbnZlbnRpb25hbGNvbW1pdHMke3ZlcnNpb259YCk7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sncGxheXdyaWdodCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J107XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGdsb2JieVN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgZ2l0aWdub3JlOiB0cnVlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaCgnQHdpbGxib29zdGVyL3diJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3diXFxzK2RiLywgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludCddO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtaWNyb21hdGNoJ107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2VzbGludEA4LjU3LjAnLCAnbWljcm9tYXRjaCcpO1xuICAgICAgLy8gVE9ETzogbm90IG5lZWRlZCBhbnltb3JlP1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5lc2xpbnRCYXNlKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZXNsaW50RGVwc1tjb25maWcuZXNsaW50QmFzZV0pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIH1cblxuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5jbGVhbnVwID0ganNvbk9iai5zY3JpcHRzLmNsZWFudXA/LnJlcGxhY2UoJyAmJiB5YXJuIGxpbnQtZml4JywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddICs9IEVzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBmbHV0dGVyIGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgKz0gYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZ2xvYmJ5KCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBbJ3Rlc3QtZml4dHVyZXMnXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ICs9IGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlcG9zaXRvcnkpIHtcbiAgICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICBgYmxpdHpAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvYXV0aEAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9uZXh0QCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL3JwY0Ake0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBuZXh0QCR7TkVYVF9WRVJTSU9OfWBcbiAgICApO1xuICAgIC8vIFByZWZlciBlc2xpbnQtY29uZmlnLW5leHQncyBkZXBlbmRlbmNpZXNcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkKSA9PiBkICE9PSAnZXNsaW50LXBsdWdpbi1yZWFjdCcgJiYgZCAhPT0gJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnKTtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAvLyBUbyBwcmV2ZW50IG11bHRpcGxlIHZlcnNpb25zIG9mIEB0eXBlcy9yZWFjdCBmcm9tIG1peGluZy5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9yZWFjdCddO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcz8ucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuXG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3SnNvblRleHQpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXZEZXBlbmRlbmNpZXMuXG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXZEZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGVwZW5kZW5jaWVzLlxuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgICBpZiAocG9ldHJ5RGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5uZXcgU2V0KHBvZXRyeURldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzbGliJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLXByZXR0aWVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbGVybmEnXTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGluc3QnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3ByZXR0aWVyJ107XG4gIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGZvciAoY29uc3QgZGVwcyBvZiBPYmplY3QudmFsdWVzKGVzbGludERlcHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiBkZXBzKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oJ2xlcm5hLmpzb24nLCB7IGZvcmNlOiB0cnVlIH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5YCxcbiAgICAgIGxpbnQ6IGBlc2xpbnQgLS1jb2xvciBcIi4veyR7Z2V0U3JjRGlycyhjb25maWcpfX0vKiovKi57JHtleHRlbnNpb25zLmVzbGludC5qb2luKCcsJyl9fVwiYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3QtZml4dHVyZXMvKipcImAsXG4gICAgICB0eXBlY2hlY2s6ICd0c2MgLS1ub0VtaXQgLS1QcmV0dHknLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIGNvbnN0IG9sZFRlc3QgPSBzY3JpcHRzLnRlc3Q7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeSAmJiB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gZm9ybWF0YCxcbiAgICAgICAgICBsaW50OiBgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnRgLFxuICAgICAgICAgICdsaW50LWZpeCc6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludC1maXgnLFxuICAgICAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbihcbiAgICAgICAgICAgICcsJ1xuICAgICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdC1maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGxpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4U2NyaXB0TmFtZXMoXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5ld0pzb25UZXh0OiBzdHJpbmcsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5rZXlzKHNjcmlwdHMpKSB7XG4gICAgaWYgKGtleVswXSAhPT0gJzonICYmIGtleS5pbmNsdWRlcygnOicpKSB7XG4gICAgICBvbGRBbmROZXdTY3JpcHROYW1lcy5wdXNoKFtrZXksIGtleS5yZXBsYWNlQWxsKCc6JywgJy0nKV0pO1xuICAgIH1cbiAgfVxuICBpZiAob2xkQW5kTmV3U2NyaXB0TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3SnNvblRleHQ7XG5cbiAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICBuZXdKc29uVGV4dCA9IG5ld0pzb25UZXh0LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gIH1cbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBnbG9iYnkoWycqKi8qLnttZCxjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLCAnKiovRG9ja2VyZmlsZSddLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgZ2l0aWdub3JlOiB0cnVlLFxuICB9KTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcbiAgICAgIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgcmV0dXJuIG5ld0pzb25UZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9hdXRoJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2F1dGgnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9hdXRoLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQGRpc2NvcmQtYm90L3NoYXJlZCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2Rpc2NvcmQtYm90Jyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9kaXNjb3JkLWJvdC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cblxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnY29kZS1hbmFseXplcicpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddID1cbiAgICAgIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9jb2RlLWFuYWx5emVyLmdpdCN3b3Jrc3BhY2U9QGNvZGUtYW5hbHl6ZXIvY2xpZW50JmNvbW1pdD0ke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdqdWRnZScpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9qdWRnZS5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdsbG0tcHJveHknKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddID1cbiAgICAgIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9sbG0tcHJveHkuZ2l0I3dvcmtzcGFjZT1AbGxtLXByb3h5L2NsaWVudCZjb21taXQ9JHtjb21taXRIYXNofWA7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZUNvbW1pdDogJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vbGludC1zdGFnZWQnLFxuICBwcmVQdXNoOiBgeWFybiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpO1xuICBwYWNrYWdlSnNvbi5zY3JpcHRzIHx8PSB7fTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RpbnN0YWxsJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwb3N0cHVibGlzaCddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcGFyZSddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcHVibGlzaE9ubHknXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3ByZXBhY2snXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RwYWNrJ107XG5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMikpLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ2h1c2t5LWluaXQnLCAnLS15YXJuMiddLCBjb25maWcuZGlyUGF0aCk7XG5cbiAgY29uc3QgcHJlQ29tbWl0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3ByZS1jb21taXQnKTtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLndyaXRlRmlsZShwcmVDb21taXRGaWxlUGF0aCwgc2NyaXB0cy5wcmVDb21taXQgKyAnXFxuJykpO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGxldCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBwcmVQdXNoID0gcHJlUHVzaC5yZXBsYWNlKFxuICAgICAgJ3lhcm4gdHlwZWNoZWNrJyxcbiAgICAgIHR5cGVjaGVja1xuICAgICAgICAucmVwbGFjZSgndHNjICcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3RzYyAnKVxuICAgICAgICAucmVwbGFjZSgnd2IgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vd2IgJylcbiAgICAgICAgLy8gcHlyaWdodCBoYXMgbm8gYXJndW1lbnRzXG4gICAgICAgIC5yZXBsYWNlKCdweXJpZ2h0JywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHlyaWdodCcpXG4gICAgKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXdrICd7cHJpbnQgXFwkMX0nIC50b29sLXZlcnNpb25zIHwgeGFyZ3MgLUl7fSBhc2RmIHBsdWdpbiBhZGQge31cImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBwbHVnaW4gdXBkYXRlIC0tYWxsXCJgXG4gICAgKTtcbiAgfVxuICAvLyBQeXRob27jgYzjgarjgYTjgajjgqTjg7Pjgrnjg4jjg7zjg6vjgafjgY3jgarjgYTlh6bnkIbns7vjgYzlrZjlnKjjgZnjgovjgZ/jgoHjgIHlvLfliLbnmoTjgavmnIDliJ3jgavjgqTjg7Pjgrnjg4jjg7zjg6vjgZnjgovjgIJcbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQ/LmluY2x1ZGVzKCdweXRob24gJykpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIGluc3RhbGwgcHl0aG9uXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbFwiYCk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIGluc3RhbGwnIDogJ3lhcm4nO1xuICBjb25zdCBybU5leHREaXJlY3RvcnkgPSBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCA/ICcgJiYgcm0gLVJmIC5uZXh0JyA6ICcnO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKGBydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXFxcLmpzb25cIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcnl9XCJgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgICdydW5faWZfY2hhbmdlZCBcImRiL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCInLFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwiZGIvc2NoZW1hLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcIicsXG4gICAgICAncnVuX2lmX2NoYW5nZWQgXCJkYi9zY2hlbWEucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cIidcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgICdydW5faWZfY2hhbmdlZCBcInByaXNtYS9zY2hlbWEucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBtaWdyYXRlIGRlcGxveVwiJyxcbiAgICAgICdydW5faWZfY2hhbmdlZCBcInByaXNtYS9zY2hlbWEucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBnZW5lcmF0ZVwiJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3QgcHJldHRpZXJDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5jb25zdCBiaW9tZUNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdidW4nLCAnLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vYmlvbWUgY2hlY2sgLS1maXggLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tc2tpcC1lcnJvcnMnLCAnQmlvbWUnLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluc0dvTW9kICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMgfSBmcm9tICcuL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IG5ld1NldHRpbmdzID0ge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGNvbW1hbmRzOiB7XG4gICAgICBjbGVhbnVwOiB7XG4gICAgICAgIGdsb2I6ICcqLntjanMsY3NzLGN0cyxodG0saHRtbCxqcyxqc29uLGpzb241LGpzb25jLGpzeCxtZCxtanMsbXRzLHNjc3MsdHMsdHN4LHZ1ZSx5YW1sLHltbH0nLFxuICAgICAgICBydW46ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCB7c3RhZ2VkX2ZpbGVzfSAmJiBnaXQgYWRkIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIH0sXG4gICAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgICBydW46IGBcbmlmIGdyZXAgLXEgJ1dhcm5pbmdzOicge3N0YWdlZF9maWxlc307IHRoZW5cbiAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZXMgKHtzdGFnZWRfZmlsZXN9KSBjb250YWluIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgZXhpdCAxXG5maVxuYC50cmltKCksXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlUHVzaDogYGJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcblxuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZyk7XG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBjb25zdCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmNqcycpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWNrYWdlUHJlZml4ID0gY29uZmlnLmlzUm9vdCA/ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluLycgOiAnbm9kZSAuLi8uLi9ub2RlX21vZHVsZXMvLmJpbi8nO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSR7cGFja2FnZXNGaWx0ZXJ9KTske2dldEVzbGludEZpbHRlckZvclByZXR0aWVyKGNvbmZpZyl9XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgY29tbWFuZHMgPSBbXFxgJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5zb21lKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgncGFja2FnZS5qc29uJykpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCcke3BhY2thZ2VQcmVmaXh9c29ydC1wYWNrYWdlLWpzb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9LFxuICAnLi8qKi9taWdyYXRpb24uc3FsJzogKGZpbGVzKSA9PiB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04Jyk7XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ1dhcm5pbmdzOicpKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcXGAhISEgTWlncmF0aW9uIFNRTCBmaWxlIChcXCR7cGF0aC5yZWxhdGl2ZSgnJywgZmlsZSl9KSBjb250YWlucyB3YXJuaW5ncyAhISEgU29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXFxgLFxuICAgICAgXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufSxgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi97bGliLHRlc3QsdGVzdF9kcml2ZXJ9LyoqLyouZGFydCc6IGZpbGVzID0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJ2dlbmVyYXRlZCcpKVxuICAgICAgLmZpbHRlcihmaWxlID0+ICFmaWxlLmVuZHNXaXRoKCcuZnJlZXplZC5kYXJ0JykgJiYgIWZpbGUuZW5kc1dpdGgoJy5nLmRhcnQnKSk7XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcXGBmbHV0dGVyIGZvcm1hdCBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgfSxgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0ID8gXCJjb25zdCBtaWNyb21hdGNoID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xcblwiIDogJyd9XG5tb2R1bGUuZXhwb3J0cyA9IHske2xpbmVzLmpvaW4oJycpfVxufTtcbmA7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGdldEVzbGludEtleShjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBkaXJzID0gZ2V0U3JjRGlycyhjb25maWcpO1xuICByZXR1cm4gYC4veyR7ZGlycy5qb2luKCcsJyl9fS8qKi8qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IHVua25vd24gPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnk/LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKGAke2NvbmZpZy5kaXJQYXRofS8uZ2l0aHViL3dvcmtmbG93c2ApO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWVbMF0udG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpO1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncz8ucGx1Z2lucyB8fCBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgPyBwbHVnaW5zW2ldWzBdIDogcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pICYmIHBsdWdpbnNbaV1bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM6IHsgcGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKCFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBwYWNrYWdlTmFtZXM6IHN0cmluZ1tdIH0pID0+IHJ1bGUucGFja2FnZU5hbWVzLmluY2x1ZGVzKCduZXh0JykpKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgcGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikuc29ydCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvcnQgdGhlIGtleXMgb2YgdGhlIG9iamVjdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGluY2x1ZGU6IFtcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0cy8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4uLy4uL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi4vLi4vQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGluY2x1ZGU6IFsnc3JjLyoqLyonLCAndGVzdHMvKiovKicsICdzY3JpcHRzLyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0ge1xuICAgICAgICAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsXG4gICAgICAgIG1vZHVsZTogJ05vZGVOZXh0JyxcbiAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGVOZXh0JyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgaWYgKG9sZFNldHRpbmdzLmV4dGVuZHMgPT09ICcuL25vZGVfbW9kdWxlcy9Ad2lsbGJvb3N0ZXIvdHNjb25maWcvdHNjb25maWcuanNvbicpIHtcbiAgICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBtb2RpZnkgXCJ0YXJnZXRcIiwgXCJtb2R1bGVcIiBhbmQgXCJtb2R1bGVSZXNvbHV0aW9uXCIuXG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50YXJnZXQ7XG4gICAgICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlO1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGVSZXNvbHV0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIH1cbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXycpXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KTtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICBzb3J0S2V5cyhzZXR0aW5ncyA/PyB7fSk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogdW5rbm93biB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lOiBzdHJpbmc7XG4gIG9uOiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgam9iczogeyBba2V5OiBzdHJpbmddOiBKb2IgfTtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gIHVzZXM6IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSxcbiAgICAgIH0sXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgICAncGF0aHMtaWdub3JlJzogWycqKi5tZCcsICcqKi9kb2NzLyoqJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgd2JmeToge1xuICAgIG5hbWU6ICdXaWxsYm9vc3RlcmlmeScsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgd2JmeToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3diZnkueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnd2JmeS1tZXJnZSc6IHtcbiAgICBuYW1lOiAnTWVyZ2Ugd2JmeScsXG4gICAgb246IHtcbiAgICAgIHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3diZnktbWVyZ2UnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvd2JmeS1tZXJnZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdub3RpZnktcmVhZHknOiB7XG4gICAgbmFtZTogJ05vdGlmeSByZWFkeScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ25vdGlmeS1yZWFkeSc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9ub3RpZnktcmVhZHkueW1sQG1haW4nLFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgRElTQ09SRF9XRUJIT09LX1VSTDogJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFQURZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnYWRkLWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgbmFtZTogJ0FkZCBpc3N1ZSB0byBHaXRIdWIgcHJvamVjdCcsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbEBtYWluJyxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdIX1BST0pFQ1RfVVJMOiAnJHt7IHNlY3JldHMuR0hfUFJPSkVDVF9VUkwgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QnOiB7XG4gICAgbmFtZTogJ0FkZCByZWFkeSBpc3N1ZSB0byBHaXRIdWIgcHJvamVjdCcsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIGxhYmVsZWQ6ICdyZWFkeSA6cm9ja2V0OicsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHSF9QUk9KRUNUX1VSTDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL1dpbGxCb29zdGVyTGFiL3Byb2plY3RzLzUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnd2JmeS55bWwnLFxuICAgICAgJ3diZnktbWVyZ2UueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICAgLi4uZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykpLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gfHwgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QueW1sJyk7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ25vdGlmeS1yZWFkeS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdhZGQtZm9jdXNlZC1pc3N1ZS10by1wcm9qZWN0LnltbCcpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAod29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gPz8ge30pIGFzIFdvcmtmbG93O1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgaWYgKG5ld1NldHRpbmdzLmpvYnMpIHtcbiAgICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICB9XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldDxzdHJpbmc+KFsuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pLCAnKioubWQnLCAnKiovZG9jcy8qKiddKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXM/LignL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgcmV0dXJuO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgfVxuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHVzZSByZWxlYXNlLnltbCBpZiByZWxlYXNlIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAncmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnd2JmeSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbikgc2V0U2NoZWR1bGUobmV3U2V0dGluZ3MsIDIwLCAyNCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnd2JmeS1tZXJnZSc6IHtcbiAgICAgIHNldFNjaGVkdWxlKG5ld1NldHRpbmdzLCAxLCA0KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzKTtcbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc2VtYW50aWMtcmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBlbHNlIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYyB8fCAhbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGgpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKCFwYXJhbXMpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoIHx8PSB7fTtcbiAgam9iLnNlY3JldHMgfHw9IHt9O1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnd2JmeScgfHxcbiAgICBraW5kID09PSAnd2JmeS1tZXJnZScgfHxcbiAgICBraW5kID09PSAnYWRkLWlzc3VlLXRvLXByb2plY3QnIHx8XG4gICAga2luZCA9PT0gJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0J1xuICApIHtcbiAgICBqb2Iuc2VjcmV0c1snR0hfVE9LRU4nXSA9IGNvbmZpZy5pc1B1YmxpY1JlcG8gPyAnJHt7IHNlY3JldHMuUFVCTElDX0dIX0JPVF9QQVQgfX0nIDogJyR7eyBzZWNyZXRzLkdIX0JPVF9QQVQgfX0nO1xuICB9XG4gIGlmIChjb25maWcucmVsZWFzZS5ucG0gJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcpKSB7XG4gICAgam9iLnNlY3JldHNbJ05QTV9UT0tFTiddID0gJyR7eyBzZWNyZXRzLk5QTV9UT0tFTiB9fSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzWydGSVJFQkFTRV9UT0tFTiddKSB7XG4gICAgam9iLnNlY3JldHNbJ0dDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UnXSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHNbJ0ZJUkVCQVNFX1RPS0VOJ107XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0c1snRElTQ09SRF9XRUJIT09LX1VSTCddICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHNbJ0RJU0NPUkRfV0VCSE9PS19VUkwnXSA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aD8uc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy50b1N0cmluZygpLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXMucmVwbGFjZSgnV2lsbEJvb3N0ZXIvJywgJ1dpbGxCb29zdGVyTGFiLycpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXJzXG4gIGlmIChqb2Iud2l0aFsnZG90X2Vudl9wYXRoJ10gPT09ICcuZW52Jykge1xuICAgIGRlbGV0ZSBqb2Iud2l0aFsnZG90X2Vudl9wYXRoJ107XG4gIH1cbiAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgcGFyYW1ldGVyc1xuICBtaWdyYXRlSm9iKGpvYik7XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzWydGTFlfQVBJX1RPS0VOJ10gJiYgam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10pIHtcbiAgICBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXSA9IGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHtcbiAgICBpZiAoam9iLndpdGhbJ2NpX3NpemUnXSAhPT0gJ2V4dHJhLWxhcmdlJyAmJiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSB8fCBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkpIHtcbiAgICAgIGpvYi53aXRoWydjaV9zaXplJ10gPSAnbGFyZ2UnO1xuICAgIH1cbiAgICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgICAgam9iLndpdGhbJ2NwdV9hcmNoJ10gPSAnWDY0JztcbiAgICB9XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3diZnknIHx8IGtpbmQgPT09ICd3YmZ5LW1lcmdlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoWydnaXRodWJfaG9zdGVkX3J1bm5lciddID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoWydnaXRodWJfaG9zdGVkX3J1bm5lciddO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFNjaGVkdWxlKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgaW5jbHVzaXZlTWluSG91ckpzdDogbnVtYmVyLCBleGNsdXNpdmVNYXhIb3VySnN0OiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgW21pbnV0ZVV0YywgaG91clV0Y10gPSAoKG5ld1NldHRpbmdzLm9uLnNjaGVkdWxlPy5bMF0/LmNyb24gYXMgc3RyaW5nKSA/PyAnJykuc3BsaXQoJyAnKS5tYXAoTnVtYmVyKTtcbiAgaWYgKG1pbnV0ZVV0YyAhPT0gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGhvdXJVdGMpKSB7XG4gICAgY29uc3QgaG91ckpzdCA9IChob3VyVXRjICsgOSkgJSAyNDtcbiAgICBjb25zdCBpblJhbmdlID1cbiAgICAgIGluY2x1c2l2ZU1pbkhvdXJKc3QgPCBleGNsdXNpdmVNYXhIb3VySnN0XG4gICAgICAgID8gaW5jbHVzaXZlTWluSG91ckpzdCA8PSBob3VySnN0ICYmIGhvdXJKc3QgPCBleGNsdXNpdmVNYXhIb3VySnN0XG4gICAgICAgIDogaW5jbHVzaXZlTWluSG91ckpzdCA8PSBob3VySnN0IHx8IGhvdXJKc3QgPCBleGNsdXNpdmVNYXhIb3VySnN0O1xuICAgIGlmIChpblJhbmdlKSByZXR1cm47XG4gIH1cblxuICBjb25zdCBtaW5Kc3QgPSAxICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNTkpO1xuICBjb25zdCBob3VySnN0ID0gaW5jbHVzaXZlTWluSG91ckpzdCArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChleGNsdXNpdmVNYXhIb3VySnN0IC0gaW5jbHVzaXZlTWluSG91ckpzdCkpO1xuICBjb25zdCBjcm9uID0gYCR7bWluSnN0fSAkeyhob3VySnN0IC0gOSArIDI0KSAlIDI0fSAqICogKmA7XG4gIG5ld1NldHRpbmdzLm9uLnNjaGVkdWxlID0gW3sgY3JvbiB9XTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywge1xuICAgIGxpbmVXaWR0aDogLTEsXG4gICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgIHN0eWxlczoge1xuICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgfSxcbiAgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm9uX3NlbGZfaG9zdGVkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbm90aWZ5X2Rpc2NvcmQnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydyZXF1aXJlX2ZseSddO1xuICBkZWxldGUgam9iLndpdGhbJ3JlcXVpcmVfZ2Nsb3VkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnY3B1X2FyY2gnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydsYWJlbCddO1xuICBkZWxldGUgam9iLndpdGhbJ2xhYmVsT3BlcmF0b3InXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgU2V0dGluZ3MgZXh0ZW5kcyBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD4ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmVyc2lvbnNKc29uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvcik/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4sIG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgZGVwcmVjYXRlZFNlY3JldE5hbWVzID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4gfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgfHwge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIGRlcHJlY2F0ZWRTZWNyZXROYW1lcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdQVUJMSUNfR0hfQk9UX1BBVCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuIO+8iOOBk+OBruODmuODvOOCuOOBpyBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIOOBjOihqOekuuOBleOCjOOBpuOBhOOCi+OBk+OBqOOCkueiuuiqjeOBl+OBn+OAgu+8iVxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gICAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBBbGwgdGVzdHMgYXJlIHBhc3NlZC5cbiAgICAtIFRlc3QgY29tbWFuZCAoZS5nLiwgXFxgeWFybiB0ZXN0XFxgKSBpcyBwYXNzZWQuXG4gICAgLSBMaW50IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gbGludFxcYCkgaXMgcGFzc2VkLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIEdpdEh1YiBQUidzIGRpZmYgdmlldy4g77yIR2l0SHVi5LiK44Gn6Ieq5YiG44Gu5aSJ5pu05YaF5a6544KS56K66KqN44GX44Gf44CC77yJXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLiDvvIjjg4bjgrnjg4jmiYvpoIbjgpLoqJjovInjgZfjgZ/jgILvvIlcbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMuIO+8iFVJ44KS5aSJ5pu044GX44Gf5aC05ZCI44CB44K544Kv44Oq44O844Oz44K344On44OD44OI44KS6L+95Yqg44GX44Gf44CC77yJXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5cbjwhLS0g5pel5pys6Kqe44Gn6KiY6L+w44GX44Gm44KC5aSn5LiI5aSr44Gn44GZ44CCIC0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBuZXdDb250ZW50KSA+IG5ld0NvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5U3luYyB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdpdEh1YlV0aWwsIG9jdG9raXQgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1BhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1B1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcblxuICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICB2ZXJzaW9uc1RleHQ/OiBzdHJpbmc7XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluc1BhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgfHwgW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSB8fCBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgdmVyc2lvbnNUZXh0ID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpO1xuICAgICAgdmVyc2lvbnNUZXh0ICs9IGNvbnRlbnQudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcmVmaXgsIG5hbWVdIG9mIFtcbiAgICAgIFsnamF2YScsICdqYXZhJ10sXG4gICAgICBbJ25vZGUnLCAnbm9kZWpzJ10sXG4gICAgICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgICBdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBub2RlVmVyc2lvbkNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKHZlcnNpb25zVGV4dCkge1xuICAgICAgICAgIHZlcnNpb25zVGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uc1RleHQgKz0gbmFtZSArICcgJyArIG5vZGVWZXJzaW9uQ29udGVudC50cmltKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9JbmZvPy5mdWxsX25hbWUgPyBgZ2l0aHViOiR7cmVwb0luZm8/LmZ1bGxfbmFtZX1gIDogdW5kZWZpbmVkLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW5maWcudG9tbCcpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoYCR7cGF0aC5zZXB9d2lsbGJvb3N0ZXItY29uZmlnc2ApLFxuICAgICAgZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNEb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluc0dlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5zR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluc1BvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluc1BvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNQdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluc1RlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNKc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzfS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueShcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsXG4gICAgICAgIGRpclBhdGhcbiAgICAgICksXG4gICAgICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICBkaXJQYXRoXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHN9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llc1snYmxpdHonXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXNbJ25leHQnXSxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1sncGxheXdyaWdodCddLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydwcmlzbWEnXSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXNbJ3B5cmlnaHQnXSxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIHZlcnNpb25zVGV4dCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgY29uZmlnLmVzbGludEJhc2UgPSBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1RlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2xvYmJ5U3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1ibGl0ei1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCA/ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcgOiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnO1xuICB9IGVsc2Uge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzPy5mZXRjaCA/PyBvcmlnaW4/LnJlZnM/LnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeERvY2tlcmZpbGUgfSBmcm9tICcuL2ZpeGVycy9kb2NrZXJmaWxlLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUb29sVmVyc2lvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYXNkZi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKSBhcyBQYWNrYWdlQ29uZmlnW107XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIHRvb2xzIHZpYSBhc2RmIGF0IGZpcnN0XG4gICAgYXdhaXQgZ2VuZXJhdGVUb29sVmVyc2lvbnMocm9vdENvbmZpZyk7XG4gICAgLy8gSW5zdGFsbCB5YXJuIGJlcnJ5XG4gICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZml4RG9ja2VyZmlsZShyb290Q29uZmlnKSxcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFNlY3JldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHJvb3RDb25maWcuaXNCdW5cbiAgICAgICAgPyBbXG4gICAgICAgICAgICBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyksXG4gICAgICAgICAgICBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLnRoZW4oKCkgPT4gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykpLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKV0pLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4VHlwZURlZmluaXRpb25zKGNvbmZpZywgY29uZmlnLmlzUm9vdCA/IGFsbFBhY2thZ2VDb25maWdzIDogW2NvbmZpZ10pKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIGFyZ3Yuc2tpcERlcHMpO1xuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzXG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50cmMoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludGlnbm9yZShjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICAgIC8vICd5YXJuIGluc3RhbGwnIHNob3VsZCBiZSBhZnRlciBgeWFybiBjbGVhbnVwYCBiZWNhdXNlIHlhcm4gYmVycnkgZ2VuZXJhdGVzIHlhcm4ubG9ja1xuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIGRlcGVuZGFudCBzdWItcGFja2FnZSBpbiBtb25vcmVwb1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsndXBkYXRlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImNvbnN0cnVjdG9yIiwidGhpcyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbnNEb2NrZXJmaWxlIiwib2xkQ29udGVudCIsImRvY2tlcmZpbGUiLCJuZXdDb250ZW50IiwiZnMiLCJ3cml0ZUZpbGUiLCJwYXRoIiwiam9pbiIsImRpclBhdGgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZmlsZVBhdGgiLCJleGlzdHNTeW5jIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInJlcGxhY2UiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZ2xvYmJ5IiwiZG90IiwiY3dkIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwicmVzb2x2ZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwib2xkVGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwicmVuYW1lIiwicmVwbGFjZUFsbCIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zIiwidW5kZWZpbmVkIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJoYXNMaWJyYXJ5Iiwic29tZSIsInBhY2thZ2VKc29uIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwibWtkaXIiLCJydW4iLCJyZWN1cnNpdmUiLCJpc0RpcmVjdG9yeSIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZzcCIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImdpdGlnbm9yZSIsImxlbmd0aCIsIm1kRmlsZSIsImZpeEFiYnJldmlhdGlvbnNJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIk9iamVjdCIsImVudHJpZXMiLCJ3YmZ5SnNvbiIsInR5cG9zIiwidG9rZW4iLCJwcm9jZXNzIiwiZW52IiwiR0hfQk9UX1BBVCIsIlBVQkxJQ19HSF9CT1RfUEFUIiwiR0hfVE9LRU4iLCJHSVRIVUJfVE9LRU4iLCJoYXNHaXRIdWJUb2tlbiIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsInNwbGl0IiwiYXQiLCJuYW1lcyIsInNwYXduU3luYyIsImNvbW1hbmQiLCJhcmdzIiwicmV0cnkiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsImNoaWxkX3Byb2Nlc3MiLCJzdGF0dXMiLCJzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0Iiwic3RkaW8iLCJwcm9jIiwic3RkZXJyIiwidG9TdHJpbmciLCJ0cmltIiwicyIsInN0ZG91dCIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiQVNERl9ESVIiLCJzaGVsbCIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwiZmlsdGVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiQkxJVFpfVkVSU0lPTiIsIk5FWFRfVkVSU0lPTiIsImdlbmVyYXRlVG9vbFZlcnNpb25zIiwidmVyc2lvbnNUZXh0IiwiZHVwbGljYXRhYmxlTGluZXMiLCJsaW5lIiwiQ09SRV9UT09MUyIsImhhcyIsInNvcnQiLCJsaW5lcyIsIlNldCIsImRvZXNDb250YWluc1BvZXRyeUxvY2siLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsInBvZXRyeVZlcnNpb24iLCJ1cGRhdGVWZXJzaW9uIiwiZGVwZW5kaW5nIiwiZmlyZWJhc2UiLCJkb2VzQ29udGFpbnNQYWNrYWdlSnNvbiIsImlzQnVuIiwibGVmdGhvb2tWZXJzaW9uIiwiZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1YiIsImJ1blZlcnNpb24iLCJwcmVmaXgiLCJERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMiLCJ2ZXJzaW9uUGF0aCIsInJtIiwiZm9yY2UiLCJ0b29sVmVyc2lvbnNQYXRoIiwiY29yZSIsInRvb2xOYW1lIiwibmV3VmVyc2lvbiIsImhlYWQiLCJpbmRleCIsImZpbmRJbmRleCIsImwiLCJuZXdMaW5lIiwic3BsaWNlIiwib3JnYW5pemF0aW9uIiwicmVwb3NpdG9yeSIsInJlcXVlc3QiLCJvd25lciIsInJlcG8iLCJkYXRhIiwidGFnX25hbWUiLCJsYXN0SW5kZXhPZiIsInZlcnNpb25OdW1iZXJUZXh0IiwidGVzdCIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0Iiwic291cmNlIiwiZGVzdGluYXRpb24iLCJpdGVtIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsIm1lcmdlIiwicHVzaCIsImpzb25PYmoiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsImdlbmVyYXRlQmlvbWVKc29uYyIsIm5ld1NldHRpbmdzIiwiY2xvbmVEZWVwIiwib2xkU2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJhcnJheU1lcmdlIiwic3RyaW5naWZ5IiwiZ2VuZXJhdGVCdW5maWdUb21sIiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJpbmRleE9mIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwiY29kZVdpdGg4SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiYmlvbWUiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnZW5lcmF0ZUVzbGludHJjIiwicm9vdENvbmZpZyIsImJhc2VzIiwiZXNsaW50QmFzZSIsInJvb3QiLCJleHQiLCJzdGFydHNXaXRoIiwibmV3RXh0ZW5kcyIsImJsaXR6IiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJkb2VzQ29udGFpbnNHZW1maWxlIiwiZG9lc0NvbnRhaW5zR29Nb2QiLCJiYXNlbmFtZSIsImRvZXNDb250YWluc1BvbVhtbCIsImRvZXNDb250YWluc1B1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sIiwibmV4dCIsInByaXNtYSIsInBsYXl3cmlnaHRUZXN0IiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwidXJsIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImdldExhdGVzdENvbW1pdEhhc2giLCJjb21taXRzIiwicGVyX3BhZ2UiLCJzaGEiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluc0pzeE9yVHN4Iiwic3JjRGlyZWN0b3JpZXMiLCJub2RlIiwiZ2V0U3JjRGlycyIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsInNjcmlwdHMiLCJwZWVyRGVwZW5kZW5jaWVzIiwiYXV0aG9yIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJkZXBzIiwidmFsdWVzIiwiZGVwIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwia2V5IiwidmFsdWUiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJwcmVwYXJlIiwicG9zdGluc3RhbGwiLCJpc1B1YmxpY1JlcG8iLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJwcmVwYWNrIiwicG9zdHBhY2siLCJzZW1hbnRpY1JlbGVhc2UiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYmJ5U3luYyIsIndiIiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCIsImRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCIsImRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImNsZWFudXAiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJpZ25vcmUiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiYWRkIiwic2l6ZSIsImRpck5hbWVzU3RyIiwiZCIsImtleXMiLCJwYWNrYWdlTmFtZXMiLCJjb21taXRIYXNoIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsInBhY2thZ2VNYW5hZ2VyIiwidHlwZWNoZWNrIiwib2xkVGVzdCIsInB5cmlnaHQiLCJwcmVDb21taXQiLCJwcmVQdXNoIiwicHJlUHVzaEZvckxhYiIsInBvc3RNZXJnZSIsImdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlSnNvblBhdGgiLCJwcmVDb21taXRGaWxlUGF0aCIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInBvc3RNZXJnZUNvbW1hbmRzIiwiU3RyaW5nIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY29tbWFuZHMiLCJnbG9iIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJ5YW1sIiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZW5lcmF0ZU5leHRDb25maWdKc29uIiwiZmluZCIsInAiLCJfIiwic2V0dGluZ3NUZXh0IiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJmaWxlTmFtZSIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJzZXR0aW5ncyIsInBsdWdpbnMiLCJwbHVnaW4iLCJvbGRDb25maWciLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudCIsImZhaWxDb21tZW50IiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJlbmFibGVkIiwic29ydEtleXMiLCJvYmoiLCJrZXlBbmRWYWx1ZXMiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsIm1vZHVsZSIsIm1vZHVsZVJlc29sdXRpb24iLCJqc3giLCJhbHdheXNTdHJpY3QiLCJzdHJpY3QiLCJza2lwTGliQ2hlY2siLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJkZWNsYXJhdGlvbiIsInNvdXJjZU1hcCIsImltcG9ydEhlbHBlcnMiLCJvdXREaXIiLCJ0eXBlUm9vdHMiLCJpbmNsdWRlIiwic3ViSnNvbk9iaiIsImdlbmVyYXRlVHNjb25maWciLCJkb2VzQ29udGFpbnNKc3hPclRzeEluUGFja2FnZXMiLCJpc0VzbVBhY2thZ2UiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsIndvcmtmbG93cyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJjb25jdXJyZW5jeSIsImdyb3VwIiwiam9icyIsInVzZXMiLCJyZWxlYXNlIiwid2JmeSIsIndvcmtmbG93X2Rpc3BhdGNoIiwicHVsbF9yZXF1ZXN0X3RhcmdldCIsInR5cGVzIiwic3luYyIsImlzc3VlcyIsInNlY3JldHMiLCJESVNDT1JEX1dFQkhPT0tfVVJMIiwiR0hfUFJPSkVDVF9VUkwiLCJ3aXRoIiwibGFiZWxlZCIsImdlbmVyYXRlV29ya2Zsb3dzIiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsImZpbGVOYW1lU2V0Iiwia2luZCIsIndyaXRlV29ya2Zsb3dZYW1sIiwibG9hZCIsIm1vdmVUb0JvdHRvbSIsImpvYiIsIm5vcm1hbGl6ZUpvYiIsInNjaGVkdWxlIiwiYnJhbmNoIiwic2V0U2NoZWR1bGUiLCJtaWdyYXRlV29ya2Zsb3ciLCJ3cml0ZVlhbWwiLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJucG0iLCJzZXJ2ZXJfdXJsIiwibWlncmF0ZUpvYiIsIm5ld1NlY3JldHMiLCJpbmNsdXNpdmVNaW5Ib3VySnN0IiwiZXhjbHVzaXZlTWF4SG91ckpzdCIsIm1pbnV0ZVV0YyIsImhvdXJVdGMiLCJjcm9uIiwiaXNJbnRlZ2VyIiwiaG91ckpzdCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInlhbWxUZXh0IiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwiY3VycmVudFZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwidmVyc2lvbnNKc29uIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldE1ham9yTnVtYmVyIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsIm5vZGVMaW5rZXIiLCJubU1vZGUiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwibWFqb3IiLCJzZXR1cExhYmVscyIsInNldHVwTGFiZWwiLCJkZWxldGVMYWJlbCIsIndhcm4iLCJjb2xvciIsImRlcHJlY2F0ZWRTZWNyZXROYW1lcyIsInNldHVwU2VjcmV0cyIsInBhcnNlZCIsImRvdGVudiIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJ3aXRoUmV0cnkiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJhbGxvd19hdXRvX21lcmdlIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJkaXN0YW5jZSIsIndiZnlKc29uU2NoZW1hIiwieiIsIm9iamVjdCIsInJlY29yZCIsInN0cmluZyIsIm9wdGlvbmFsIiwiZG9jIiwidHMiLCJnZXRQYWNrYWdlQ29uZmlnIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInJlYWRGaWxlU3luYyIsInR5cGUiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwibWVzc2FnZSIsImZldGNoUmVwb0luZm8iLCJub2RlVmVyc2lvbkNvbnRlbnQiLCJ3YmZ5SnNvblBhdGgiLCJ3YmZ5SnNvblRleHQiLCJmdWxsX25hbWUiLCJzZXAiLCJjb250YWluc0FueSIsImRvZXNDb250YWluc1ZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsImdldEVzbGludEV4dGVuc2lvbkJhc2UiLCJwYXR0ZXJuIiwib3JnIiwicmV0IiwiYXNzaWduIiwiYXJndiIsInlhcmdzIiwicG9zaXRpb25hbCIsImRlc2NyaWJlIiwiYXJyYXkiLCJkZWZhdWx0IiwiZGVzY3JpcHRpb24iLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInJvb3REaXJQYXRoIiwicGF0aHMiLCJwYWNrYWdlc0RpclBhdGgiLCJzdWJEaXJQYXRocyIsImlnbm9yZUVycm9yQXN5bmMiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJ0aGVuIl0sIm1hcHBpbmdzIjoiZ29CQVVPLE1BQU1BLEVBQVUsSUFWdkIsTUFJRUMsV0FBQUEsR0FDRUMsS0FBS0MsV0FBWSxFQUNqQkQsS0FBS0UsbUJBQW9CLENBQzNCLEdDV0ssTUFBTUMs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
|
1
|
+
import e from"node:fs/promises";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";import{globby as a,globbySync as c}from"globby";import{PromisePool as l}from"minimal-promise-pool";import{Octokit as p}from"@octokit/core";import d from"node:child_process";import u from"deepmerge";import m from"lodash.clonedeep";import f from"node:os";import g from"js-yaml";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{constructor(){this.isVerbose=!1,this.doesUploadEnvVars=!1}};const j=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:t}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function x(n){return j.functionIgnoringException("fixDockerfile",(async()=>{if(!n.doesContainsDockerfile)return;const s=n.dockerfile,i=s;s!==i&&await e.writeFile(t.join(n.dirPath,"Dockerfile"),i)}))}async function _(e){return j.functionIgnoringException("fixPlaywrightConfig",(async()=>{const n=t.join(e.dirPath,"playwright.config.ts");if(!r.existsSync(n))return;const s=await r.promises.readFile(n,"utf8"),i=s.replace(/retries:.+,/,"retries: process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1,");s!==i&&await r.promises.writeFile(n,i)}))}async function P(n){return j.functionIgnoringException("fixPrismaEnvFiles",(async()=>{const s=await a(["*.env","*.env.*"],{dot:!0,cwd:n.dirPath});for(const i of s){const s=t.resolve(n.dirPath,i),o=(await e.readFile(s,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await e.writeFile(s,o)}}))}async function $(e){return j.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",(async()=>{await Promise.all(e.map((async e=>{const n=t.join(e,"__tests__"),s=t.join(e,"tests");try{await r.promises.rename(n,s);const i=await r.promises.readFile(t.join(e,"package.json"),"utf8"),o=i.replaceAll("__tests__","tests");if(i===o)return;await r.promises.writeFile(t.join(e,"package.json"),o)}catch{}})))}))}const S=new l;async function F(s,i){return j.functionIgnoringException("fixTypeDefinitions",(async()=>{const o=t.resolve(s.dirPath,"@types"),r=s.isRoot&&s.doesContainsSubPackageJsons?void 0:t.resolve(s.dirPath,"src","types"),a=await n((()=>e.readdir(o,{withFileTypes:!0})));if(a)for(const s of a){const a=s.name.slice(0,-5),c=s.name.endsWith(".d.ts");let l=c?a:s.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=i.some((e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]));s.isFile()&&c?p?(await e.mkdir(t.join(o,a)),await S.run((()=>e.rename(t.join(o,s.name),t.join(o,a,"index.d.ts"))))):r&&(await e.mkdir(r,{recursive:!0}),await S.run((()=>e.rename(t.join(o,s.name),t.join(r,s.name))))):s.isDirectory()&&r&&!p&&(await e.mkdir(r,{recursive:!0}),await S.run((()=>n((()=>e.rename(t.join(o,s.name,"index.d.ts"),t.join(r,`${s.name}.d.ts`)))))))}}))}const C={async readFileIgnoringError(t){try{return await e.readFile(t,"utf8")}catch{}},async generateFile(t,n){await e.writeFile(t,n)}};async function E(e){return j.functionIgnoringException("fixAbbreviations",(async()=>{const n=e.dirPath,s=await a("**/*.md",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${s.length} markdown files in ${n}`);for(const i of s){const s=t.join(n,i);await S.run((async()=>{const t=await r.promises.readFile(s,"utf8");let n=B(t);n=O(n,e,"doc"),t!==n&&await C.generateFile(s,n)}))}const i=await a(["{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${n}`);for(const s of i){const i=t.join(n,s),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,e,"ts"),o!==a&&await C.generateFile(i,a)}const o=await a("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:n,gitignore:!0});k.isVerbose&&console.info(`Found ${o.length} text-based files in ${n}`);for(const s of o){const i=t.join(n,s),o=await r.promises.readFile(i,"utf8");let a=o.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.");a=O(a,e,"text"),o!==a&&await C.generateFile(i,a)}await S.promiseAll()}))}function B(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function O(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}const D=process.env.GH_BOT_PAT||process.env.PUBLIC_GH_BOT_PAT||process.env.GH_TOKEN||process.env.GITHUB_TOKEN,I=!!D,T=new p({auth:D});const A=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}};function R(e,t,n,s=0){do{const[s,i,o]=J(e,t,n);if(0===d.spawnSync(s,i,o).status)break}while(--s>=0)}function W(e,t,n){const[s,i,o]=J(e,t,n);o.stdio="pipe";const r=d.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map((e=>`"${e}"`))}] caused the following error:\n ${a}`),r.stdout.toString().trim()}function J(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),s.ASDF_DIR&&(t=["-l","-c",`. ${s.ASDF_DIR}/asdf.sh && ${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function L(e){const t=e.split(/[+.-]/).map(Number).filter((e=>!Number.isNaN(e)));let n=0,s=1;for(const e of t)n+=e*s,s/=1e3;return n}const N="3.9.19",z="zulu-11.74.15",G="2.0.4",U="14.2.5";async function H(e){return j.functionIgnoringException("generateToolVersions",(async()=>{await async function(e){if(!e.versionsText)return;const n=e.versionsText.trim().split("\n").map((e=>{const[t,n]=e.trim().split(/\s+/);return`${M.has(t)?" ":""}${t} ${n}`})).sort().map((e=>e.trim())),s=[...new Set(n)];if(e.doesContainsPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&Y(s,"poetry",t?.info?.version),Y(s,"python",N,!0)}e.depending.firebase&&Y(s,"java",z,!0);if(e.doesContainsPackageJson)if(e.isBun){const e=await K("evilmartians","lefthook");e&&Y(s,"lefthook",e);const t=await K("oven-sh","bun");t&&Y(s,"bun",t)}else{const t=W("npm",["show","yarn","version"],e.dirPath);Y(s,"yarn",t)}for(const n of q){const s=t.resolve(e.dirPath,`.${n}-version`);r.promises.rm(s,{force:!0})}const i=t.resolve(e.dirPath,".tool-versions");await(s.length>0?S.run((()=>r.promises.writeFile(i,s.join("\n")+"\n"))):S.run((()=>r.promises.rm(i,{force:!0})))),await S.promiseAll(),R("asdf",["plugin","update","--all"],e.dirPath),R("asdf",["install"],e.dirPath)}(e)}))}const M=new Set(["java","nodejs","bun","python"]),q=["java","node","python"];function Y(e,t,n,s=!1){const i=e.findIndex((e=>e.split(/\s+/)[0]===t)),o=`${t} ${n}`;if(-1===i)e.splice(s?0:e.length,0,o);else{const[,t]=e[i].split(/\s+/);L(n)>L(t)&&(e[i]=o)}}async function K(e,t){try{const n=(await T.request("GET /repos/{owner}/{repo}/releases/latest",{owner:e,repo:t})).data.tag_name,s=n.lastIndexOf("v"),i=-1===s?n:n.slice(s+1);return/^\d/.test(i)?i:void 0}catch(e){return void console.error("Failed to fetch Bun tags due to:",e)}}function V(e,t){return t}function X(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]=u(e[i],o,n):e.includes(o)||s.push(o);return s}const Q={$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};async function Z(e){return j.functionIgnoringException("generateBiomeJsonc",(async()=>{let n=m(Q);const s=t.resolve(e.dirPath,"biome.jsonc");try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V})}catch{}const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}async function ee(e){return j.functionIgnoringException("generateBunfigToml",(async()=>{const n=t.resolve(e.dirPath,"bunfig.toml");await S.run((()=>C.generateFile(n,"telemetry = false\n\n[install]\nexact = true\n\n[run]\nbun = true\n\n")))}))}const te="# Project-specific settings",ne=/# Project-specific settings[^\n]*\n/gm,se="# Generated by wbfy",ie=`${te} (head)\n\n\n${se}\n`,oe=`\n${te} (tail)\n`,re={separator:se,separatorPrefix:"# Generated by ",defaultHeadUserContent:ie,defaultTailUserContent:oe,async readGitignoreWithoutSeparators(e){try{let t=await r.promises.readFile(e,"utf8");const n=ae(t);return n>0&&(t=t.slice(0,n-1)),t.replaceAll(ne,"").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(ne,`${te} (head)\n`):ie},getTailUserContent(e){const t=ae(e);return t>0?e.slice(t-1):oe},async isBerryZeroInstallEnabled(e){try{return(await r.promises.readFile(e,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ae(e){const t=e.indexOf(te),n=e.lastIndexOf(te);return n>t?n:-1}async function ce(e){return j.functionIgnoringException("generateDockerignore",(async()=>{const n=t.resolve(e.dirPath,".dockerignore");if(e.doesContainsDockerfile){const e=await C.readFileIgnoringError(n)??"",t=re.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+re.getTailUserContent(e);await S.run((()=>C.generateFile(n,t)))}else await r.promises.rm(n,{force:!0})}))}const le={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml"].sort(),codeWith4IndentSize:["go","gradle","py"].sort(),codeWith8IndentSize:["sh"].sort(),markdownLike:["md"].sort(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].sort(),prettier:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].sort(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].sort()},pe=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${ue(le.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${ue(le.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${ue(le.codeWith8IndentSize)}\nindent_size = 8\nindent_style = space\n\n${ue(le.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function de(e){return j.functionIgnoringException("generateEditorconfig",(async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run((()=>C.generateFile(n,pe)))}))}function ue(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function me(e){return j.functionIgnoringException("generateEslintignore",(async()=>{const n=t.resolve(e.dirPath,".eslintignore");if(e.isBun)return void await S.run((()=>r.promises.rm(n,{force:!0})));const s=await C.readFileIgnoringError(n)??"",i=re.getHeadUserContent(s),o=re.getTailUserContent(s),a=t.resolve(e.dirPath,".gitignore"),c=i+"\n3rd-party/\n@types/\n__generated__/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.config.*js\n*.d.ts\n*.min.*js\n.yarn/\n.pnp.js\n"+(await re.readGitignoreWithoutSeparators(a)||"")+o;await S.run((()=>C.generateFile(n,c)))}))}async function fe(e,n){return j.functionIgnoringException("generateEslintrc",(async()=>{const s=t.resolve(e.dirPath,".eslintrc.json");if(e.isBun)return void await S.run((()=>r.promises.rm(s,{force:!0})));const i=[];e.eslintBase&&i.push(e.eslintBase),e!==n&&i.push("../../.eslintrc.json");let o={root:!0,extends:i};try{const t=await r.promises.readFile(s,"utf8"),n=JSON.parse(t);n.extends&&(n.extends=n.extends.filter((e=>!e.startsWith("@willbooster/")&&"../../.eslintrc.json"!==e))),0===i.length&&(n.extends=[]);const a=o.extends;o.extends=n.extends,n.extends=a,o=u.all([o,n,o],{arrayMerge:X}),e.depending.blitz&&(o.extends=o.extends.filter((e=>"./node_modules/@blitzjs/next/eslint"!==e)))}catch{}const a=JSON.stringify(o);await S.run((()=>C.generateFile(s,a)))}))}const ge=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...le.codeWith2IndentSize,...le.codeWith4IndentSize,...le.markdownLike].map((e=>`*.${e} text eol=lf`)).join("\n")}\n\ndist/** linguist-generated=true\n`;async function he(e){return j.functionIgnoringException("generateGitattributes",(async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run((()=>C.generateFile(n,ge)))}))}const ye=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function we(e,n){return j.functionIgnoringException("generateGitignore",(async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await C.readFileIgnoringError(s)??"";let o=re.getHeadUserContent(i)+"\n!.keep\n.env.production\n*/mount/*.hash\n.idea/copilot/chatSessions/\n.devcontainer/\ndist/\ntemp/\n";const r=re.getTailUserContent(i),a=[...ye];e.doesContainsGemfile&&a.push("ruby"),e.doesContainsGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainsPackageJson&&a.push("node"),e.doesContainsPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainsPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainsTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainsPoetryLock&&(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*.sqlite3-journal\n"),e.depending.playwrightTest&&(o+="test-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 ke(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((()=>ve(e,t))),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await re.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainsPomXml||e.doesContainsPubspecYaml)&&(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.doesContainsPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainsPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run((()=>C.generateFile(s,l)))}))}const be=t.join(f.homedir(),".cache","wbfy","gitignore");async function ve(e,n){await r.promises.mkdir(be,{recursive:!0}),await r.promises.writeFile(t.join(be,e),n)}async function ke(e){try{const n=await r.promises.stat(t.join(be,e));if(Date.now()-n.mtimeMs>216e5)return;return await r.promises.readFile(t.join(be,e),"utf8")}catch{}}async function je(e,t){try{const{data:n}=await T.request("GET /repos/{owner}/{repo}/commits",{owner:e,repo:t,per_page:1});if(0===n.length)throw new Error(`No commits found for ${e}/${t}`);return n[0].sha}catch(n){throw new Error(`Failed to fetch commits for ${e}/${t}: ${n}`)}}const xe={getLintFixSuffix:e=>e.doesContainsJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},_e={node:["src","tests","scripts"].sort(),blitz:["src","tests","scripts","db","integrations","mailers"].sort()};function Pe(e){return e.depending.blitz?_e.blitz:_e.node}const $e=["eslint@8.57.0","eslint-config-prettier","eslint-plugin-import","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn"],Se=[...$e,"@typescript-eslint/eslint-plugin","@typescript-eslint/parser","eslint-import-resolver-typescript"],Fe=["eslint-plugin-react","eslint-plugin-react-hooks"],Ce={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...$e],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...$e,...Fe],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Se],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Se,...Fe],"@willbooster/eslint-config-blitz-next":["@willbooster/eslint-config-blitz-next","eslint-config-next",...Se,...Fe],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...Se,...Fe]};async function Ee(e,n,s){return j.functionIgnoringException("generatePackageJson",(async()=>{await async function(e,n,s){const i=t.resolve(e.dirPath,"package.json"),o=await r.promises.readFile(i,"utf8"),l=JSON.parse(o);l.scripts=l.scripts||{},l.dependencies=l.dependencies||{},l.devDependencies=l.devDependencies||{},l.peerDependencies=l.peerDependencies||{},await async function(e,t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");if(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,!e.isWillBoosterConfigs)for(const e of Object.values(Ce))for(const n of e)delete t.devDependencies[n];await S.run((()=>r.promises.rm("lerna.json",{force:!0})))}(n,l),"@willbooster/prettier-config"!==l.name&&(l.prettier="@willbooster/prettier-config");for(const[e,t]of Object.entries(l.scripts))t.includes("git clone")||(l.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));l.scripts=u(l.scripts,Be(e)),e.isBun?delete l.scripts.prettify:l.scripts.prettify+=await async function(e){const n=t.resolve(e,".prettierignore"),s=await r.promises.readFile(n,"utf8"),i=s.indexOf(re.separatorPrefix);if(-1===i)return"";const o=s.slice(0,i);return o.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("")}(e.dirPath);for(const[e,t]of Object.entries(l.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(l.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let p=[],d=["prettier","sort-package-json","@willbooster/prettier-config"];const m=[];e.isBun?delete l.devDependencies["lint-staged"]:d.push("lint-staged");if(e.isRoot){if(e.isBun?(delete l.devDependencies.husky,delete l.devDependencies.pinst,l.scripts.prepare="lefthook install || true"):(d.push("husky"),l.scripts.prepare="husky || true",l.scripts.postinstall="husky || true",(e.isPublicRepo||e.isReferredByOtherRepo)&&(d.push("pinst"),l.scripts.prepack="pinst --disable",l.scripts.postpack="pinst --enable")),e.depending.semanticRelease){const e=l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]?"@6.1.0":"";d.push(`conventional-changelog-conventionalcommits${e}`),l.devDependencies["semantic-release"]||l.devDependencies["multi-semantic-release"]||l.devDependencies["@qiwi/multi-semantic-release"]||d.push("semantic-release"),l.version="0.0.0-semantically-released"}e.depending.playwrightTest&&(l.dependencies["@playwright/test"]||(d.push("@playwright/test"),delete l.dependencies["@playwright/test"]),delete l.dependencies.playwright,delete l.devDependencies.playwright),e.doesContainsSubPackageJsons?l.workspaces=Array.isArray(l.workspaces)?u.all([l.workspaces,["packages/*"]],{arrayMerge:X}):["packages/*"]:Array.isArray(l.workspaces)&&(l.workspaces=l.workspaces.filter((t=>c(t,{dot:!0,cwd:e.dirPath,gitignore:!0}).length>0)),0===l.workspaces.length&&delete l.workspaces)}if(e.depending.wb||e.isBun){l.dependencies["@willbooster/wb"]?p.push("@willbooster/wb"):d.push("@willbooster/wb");for(const[e,t]of Object.entries(l.scripts))l.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(e.isBun?(d.push("@biomejs/biome","@willbooster/biome-config"),delete l.devDependencies.eslint,delete l.devDependencies.micromatch,delete l.devDependencies["@typescript-eslint/parser"]):(d.push("eslint@8.57.0","micromatch"),e.doesContainsTypeScriptInPackages&&d.push("@typescript-eslint/parser")));(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(d.push("typescript"),e.isBun&&d.push("@types/bun"));e.eslintBase&&d.push(...Ce[e.eslintBase]);e.isWillBoosterConfigs&&(p=p.filter((e=>!e.includes("@willbooster/"))),d=d.filter((e=>!e.includes("@willbooster/"))));l.name||(l.name=t.basename(e.dirPath));e.doesContainsSubPackageJsons&&(l.private=!0);l.license||(l.license="UNLICENSED");!l.private&&"UNLICENSED"!==l.license&&n.isPublicRepo&&(l.publishConfig??={},l.publishConfig.access??="public");const[f]=A.getOrgAndName(e.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(l.author="WillBooster Inc.");e.isRoot||!l.private||l.main||(l.main="./src");if(delete l.resolutions?.["npm/chalk"],!e.doesContainsSubPackageJsons){if(e.isBun||(e.doesContainsJavaScript||e.doesContainsTypeScript?l.scripts["lint-fix"]+=xe.getLintFixSuffix(e):(delete l.scripts.lint,delete l.scripts["lint-fix"],l.scripts.cleanup=l.scripts.cleanup?.replace(" && yarn lint-fix",""))),e.doesContainsPubspecYaml){l.scripts.lint="flutter analyze",l.scripts["lint-fix"]="yarn lint";const n=["lib","test","test_driver"].filter((n=>r.existsSync(t.resolve(e.dirPath,n))));n.length>0&&(l.scripts["format-code"]=`flutter format $(find ${n.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,l.scripts.format+=" && yarn format-code")}if(e.doesContainsPoetryLock){"poetry install"===l.scripts.postinstall&&delete l.scripts.postinstall;const t=await a("**/*.py",{cwd:e.dirPath,dot:!0,gitignore:!0,ignore:["test-fixtures"]}),n=new Set;for(const e of t){const[t,s]=e.split(/[/\\]/);s&&n.add(t)}if(n.size>0){const e=[...n].join(" ");l.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,l.scripts.lint?l.scripts.lint=`poetry run flake8 ${e} && ${l.scripts.lint}`:(l.scripts.lint=`poetry run flake8 ${e}`,l.scripts["lint-fix"]="yarn lint"),l.scripts.format+=" && yarn format-code",m.push("black","isort","flake8")}}e.repository&&(l.repository=e.repository)}e.depending.blitz?(p.push(`blitz@${G}`,`@blitzjs/auth@${G}`,`@blitzjs/next@${G}`,`@blitzjs/rpc@${G}`,`next@${U}`),d=d.filter((e=>"eslint-plugin-react"!==e&&"eslint-plugin-react-hooks"!==e)),l.scripts["gen-code"]?.startsWith("blitz codegen")?l.scripts["gen-code"].includes("blitz prisma generate")||(l.scripts["gen-code"]=l.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):l.scripts["gen-code"]="blitz codegen"):e.depending.prisma&&!l.scripts["gen-code"]?.startsWith("prisma generate")&&(l.scripts["gen-code"]="prisma generate");e.depending.next&&delete l.devDependencies["@types/react"];l.dependencies?.prettier||delete l.devDependencies["@types/prettier"];0===Object.keys(l.dependencies).length&&delete l.dependencies;0===Object.keys(l.devDependencies).length&&delete l.devDependencies;0===Object.keys(l.peerDependencies).length&&delete l.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")){delete e.devDependencies["@willbooster/auth"];const t=await je("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await je("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await je("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#workspace=@code-analyzer/client&commit=${t}`}if(t.has("@willbooster/judge")){delete e.dependencies["@willbooster/judge"];const t=await je("WillBoosterLab","judge");e.devDependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")){delete e.dependencies["@willbooster/llm-proxy"];const t=await je("WillBoosterLab","llm-proxy");e.devDependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#workspace=@llm-proxy/client&commit=${t}`}}(l);let g=JSON.stringify(l);if(g=await async function(e,n,s){const i=[];for(const[t]of Object.keys(e))":"!==t[0]&&t.includes(":")&&i.push([t,t.replaceAll(":","-")]);if(0===i.length)return n;for(const[e,t]of i)n=n.replaceAll(e,t);const o=await a(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:s.dirPath,dot:!0,gitignore:!0});for(const e of o)await S.run((async()=>{const n=t.join(s.dirPath,e),o=await r.promises.readFile(n,"utf8");let a=o;for(const[e,t]of i)a=a.replaceAll(e,t);a!==o&&await r.promises.writeFile(n,a)}));return await S.promiseAll(),n}(l.scripts,g,e),await r.promises.writeFile(i,g),!s){p=p.filter((e=>!l.devDependencies?.[e]));const t=e.isBun?"bun":"yarn";p.length>0&&R(t,["add",...new Set(p)],e.dirPath),d=d.filter((e=>!l.dependencies?.[e])),d.length>0&&R(t,["add","-D",...new Set(d)],e.dirPath),m.length>0&&R("poetry",["add","--group","dev",...new Set(m)],e.dirPath)}}(e,n,s)}))}function Be(e){if(e.isBun){const t={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 e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||delete t.typecheck,t}{let t={cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:`eslint --color "./{${Pe(e)}}/**/*.{${le.eslint.join(",")}}"`,"lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${le.prettier.join(",")}}" "!**/test-fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};if(e.doesContainsSubPackageJsons){const e=t.test;t=u({...t},{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 "**/{.*/,}*.{${le.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?.includes("wb test")&&(t.test=e)}else e.depending.pyright&&(t.typecheck=t.typecheck?`${t.typecheck} && `:"",t.typecheck+="pyright");return e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages?e.depending.wb&&(t.typecheck="wb typecheck"):delete t.typecheck,t}}const Oe={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\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\nyarn typecheck\n'.trim(),postMerge:'\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 De(e){return j.functionIgnoringException("generateHuskyrcUpdatingPackageJson",(async()=>{await async function(e){const n=t.resolve(e.dirPath,"package.json"),s=await r.promises.readFile(n,"utf8"),i=JSON.parse(s);i.scripts||={},delete i.scripts.postinstall,delete i.scripts.postpublish,delete i.scripts.prepare,delete i.scripts.prepublishOnly,delete i.scripts.prepack,delete i.scripts.postpack;const o=t.resolve(e.dirPath,".husky");if(await Promise.all([r.promises.writeFile(n,JSON.stringify(i,void 0,2)),r.promises.rm(o,{force:!0,recursive:!0})]),e.isBun)return void R("git",["config","--unset","core.hooksPath"],e.dirPath);R("yarn",["dlx","husky-init","--yarn2"],e.dirPath);const a=t.resolve(o,"pre-commit");await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".huskyrc.json"),{force:!0}))),await S.run((()=>r.promises.writeFile(a,Oe.preCommit+"\n")));const{typecheck:c}=Be(e);if(c){let n=e.repository?.startsWith("github:WillBoosterLab/")?Oe.prePushForLab:Oe.prePush;n=n.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await S.run((()=>r.promises.writeFile(t.resolve(o,"pre-push"),n+"\n",{mode:493})))}const l=`${Oe.postMerge}\n\n${Ie(e).join("\n")}\n`;await S.run((()=>r.promises.writeFile(t.resolve(o,"post-merge"),l,{mode:493})))}(e)}))}function Ie(e){const t=[];e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "awk '{print \$1}' .tool-versions | xargs -I{} asdf plugin add {}"`,String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`),e.versionsText?.includes("python ")&&t.push(String.raw`run_if_changed "\..+-version" "asdf install python"`),e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(`run_if_changed "package\\.json" "${n}${s}"`),e.doesContainsPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push('run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma migrate deploy"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz prisma generate"','run_if_changed "db/schema.prisma" "node node_modules/.bin/blitz codegen"'):e.depending.prisma&&t.push('run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"','run_if_changed "prisma/schema.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"'),t}function Te(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 Ae=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map((e=>Te("node","node_modules/.bin/prettier --cache --write","Prettier",e))).join("")}\n </component>\n</project>\n`,Re=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${le.prettier.map((e=>Te("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-errors","Biome",e))).join("")}\n </component>\n</project>\n`;async function We(e){return j.functionIgnoringException("generateIdeaSettings",(async()=>{const n=t.resolve(e.dirPath,".idea");if(r.existsSync(n)){const s=t.resolve(n,"watcherTasks.xml");await(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages||e.doesContainsPackageJson&&!e.doesContainsPubspecYaml&&!e.doesContainsGemfile&&!e.doesContainsGoMod&&!e.doesContainsPomXml?S.run((()=>C.generateFile(s,e.isBun?Re:Ae))):S.run((()=>r.promises.rm(s,{force:!0}))))}}))}const Je={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-commit":{commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}"},"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()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},Le={prePush:"bun --bun node_modules/.bin/wb typecheck",prePushForLab:'\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\nbun --bun node_modules/.bin/wb typecheck\n'.trim(),postMerge:'\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 Ne(e){return j.functionIgnoringException("generateLefthookUpdatingPackageJson",(async()=>{await async function(e){const n=t.resolve(e.dirPath,".lefthook");await Promise.all([r.promises.writeFile(t.join(e.dirPath,"lefthook.yml"),g.dump(Je,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),r.promises.rm(n,{force:!0,recursive:!0})]);const{typecheck:s}=Be(e);if(s){const s=e.repository?.startsWith("github:WillBoosterLab/")?Le.prePushForLab:Le.prePush;r.mkdirSync(t.join(n,"pre-push"),{recursive:!0}),await S.run((()=>r.promises.writeFile(t.join(n,"pre-push","check.sh"),s+"\n",{mode:493})))}const i=`${Le.postMerge}\n\n${Ie(e).join("\n")}\n`;r.mkdirSync(t.join(n,"post-merge"),{recursive:!0}),await S.run((()=>r.promises.writeFile(t.resolve(n,"post-merge","prepare.sh"),i,{mode:493})))}(e)}))}async function ze(e){return j.functionIgnoringException("generateLintstagedrc",(async()=>{await async function(e){const n=t.resolve(e.dirPath,".lintstagedrc.cjs");if(e.isBun)return void await S.run((()=>r.promises.rm(n,{force:!0})));const s=e.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",i=[];if(e.doesContainsJavaScript||e.doesContainsTypeScript){const t=`\n '${Ge(e)}': [${JSON.stringify(`${s}eslint --fix${xe.getLintFixSuffix(e)}`)}, '${s}prettier --cache --write'],`;i.push(t)}const o=e.isRoot?" && !file.includes('/packages/')":"";i.push(`\n './**/*.{${le.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/')${o});${function(e){return e.doesContainsJavaScript||e.doesContainsTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${Ge(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(e)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${s}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${s}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 \`!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.\`,\n ];\n }\n }\n return [];\n},`),e.doesContainsPubspecYaml&&i.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 [`flutter format ${filteredFiles.join(' ')}`];\n },");e.doesContainsPoetryLock&&i.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${e.doesContainsJavaScript||e.doesContainsTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${i.join("")}\n};\n`;await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.js"),{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".lintstagedrc.json"),{force:!0}))),await S.run((()=>C.generateFile(n,a)))}(e)}))}function Ge(e){return`./{${Pe(e).join(",")}}/**/*.{${le.eslint.join(",")}}`}async function Ue(e){return j.functionIgnoringException("generateNextConfigJson",(async()=>{const n=["js","mjs","cjs"].map((n=>t.resolve(e.dirPath,`next.config.${n}`))).find((e=>r.existsSync(e)));if(!n)return;const s=(await r.promises.readFile(n,"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((()=>C.generateFile(n,s)))}))}async function He(e){return j.functionIgnoringException("generatePrettierignore",(async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await C.readFileIgnoringError(n)??"",i=re.getHeadUserContent(s),o=re.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await re.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainsPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run((()=>C.generateFile(n,l)))}))}const Me={venvPath:".",venv:".venv"};async function qe(e){return j.functionIgnoringException("generatePyrightConfigJson",(async()=>{let n=m(Me);const s=t.resolve(e.dirPath,"pyrightconfig.json");try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V})}catch{}const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}async function Ye(e){return j.functionIgnoringException("generateReadme",(async()=>{const n=t.resolve(e.dirPath,"README.md");let s=await r.promises.readFile(n,"utf8");r.existsSync(t.resolve(e.dirPath,".releaserc.json"))&&(s=Ke(s,"[](https://github.com/semantic-release/semantic-release)"));const i=e.repository?.slice(e.repository?.indexOf(":")+1),o=r.readdirSync(`${e.dirPath}/.github/workflows`);for(const n of o){if(!n.startsWith("test")&&!n.startsWith("deploy"))continue;let o=n;o=o[0].toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," ");const a=`[](https://github.com/${i}/actions/workflows/${n})`;r.existsSync(t.resolve(e.dirPath,`.github/workflows/${n}`))&&(s=Ke(s,a))}await S.run((()=>C.generateFile(n,s)))}))}function Ke(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 Ve(e){return j.functionIgnoringException("generateReleaserc",(async()=>{const n=t.resolve(e.dirPath,".releaserc.json"),s=JSON.parse(await r.promises.readFile(n,"utf8")),i=s?.plugins||[];for(let e=0;e<i.length;e++){const t=Array.isArray(i[e])?i[e][0]:i[e],n=Array.isArray(i[e])&&i[e][1]||{};"@semantic-release/commit-analyzer"===t?i[e]=["@semantic-release/commit-analyzer",u.all([n,{preset:"conventionalcommits"}],{arrayMerge:V})]:"@semantic-release/github"===t&&(i[e]=["@semantic-release/github",u.all([n,{successComment:!1,failComment:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:V})])}const o=JSON.stringify(s);await S.run((()=>C.generateFile(n,o)))}))}const Xe={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Qe(e){return j.functionIgnoringException("generateRenovateJson",(async()=>{let n=m(Xe);const s=t.resolve(e.dirPath,"renovate.json");if(r.existsSync(`${s}5`))return;try{const e=await r.promises.readFile(s,"utf8"),t=JSON.parse(e);n=u.all([n,t,n],{arrayMerge:V}),n.extends=n.extends.filter((e=>"@willbooster"!==e))}catch{}e.depending.blitz&&(n.packageRules??=[],n.packageRules.some((e=>e.matchPackageNames.includes("next")))||n.packageRules.push({matchPackageNames:["next"],enabled:!1})),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".dependabot"),{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".renovaterc.json"),{force:!0})));const i=JSON.stringify(n);await S.run((()=>C.generateFile(s,i)))}))}function Ze(e){const t=Object.entries(e).sort((([e],[t])=>e.localeCompare(t)));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&Ze(s);return e}const et={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*","packages/*/src/**/*","packages/*/tests/**/*","packages/*/scripts/**/*"]},tt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},include:["src/**/*","tests/**/*","scripts/**/*"]};async function nt(e){return j.functionIgnoringException("generateTsconfig",(async()=>{if(e.depending.blitz||e.depending.next)return;let n=m(e.isRoot?et:tt);e.doesContainsJsxOrTsx||e.doesContainsJsxOrTsxInPackages||delete n.compilerOptions?.jsx,e.isRoot&&!e.doesContainsSubPackageJsons&&(n.include=n.include?.filter((e=>!e.startsWith("packages/*/")))),e.isEsmPackage&&(n.compilerOptions={...n.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const s=t.resolve(e.dirPath,"tsconfig.json");try{const t=await r.promises.readFile(s,"utf8"),i=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===i.extends&&delete i.extends,delete n.compilerOptions?.target,e.isEsmPackage||(delete n.compilerOptions?.module,delete n.compilerOptions?.moduleResolution),i.compilerOptions?.jsx&&delete n.compilerOptions?.jsx,n=u.all([n,i,n],{arrayMerge:X}),n.include=n.include?.filter((e=>!e.includes("@types")&&!e.includes("__tests__")))}catch{}Ze(n),n.include?.sort();const i=JSON.stringify(n);delete n.compilerOptions?.experimentalDecorators,await S.run((()=>C.generateFile(s,i)))}))}const st=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function it(e){return j.functionIgnoringException("generateVscodeSettings",(async()=>{try{const n=t.resolve(e.dirPath,".vscode","settings.json"),s=await r.promises.readFile(n,"utf8");let i=JSON.parse(s);for(const e of st)i=u.all([i,ot(e)]);e.doesContainsPoetryLock&&(i=u.all([i,ot("**/.venv/**")])),e.depending.next&&(i=u.all([i,ot("**/.next/**")])),Ze(i??{});const o=JSON.stringify(i,void 0,2);await S.run((()=>C.generateFile(n,o)))}catch{}}))}function ot(e){return{"files.watcherExclude":{[e]:!0}}}const rt={test:{name:"Test",on:{pull_request:{"paths-ignore":["**.md","**/docs/**"]},push:{branches:["main","wbfy"],"paths-ignore":["**.md","**/docs/**"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},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},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},wbfy:{name:"Willboosterify",on:{workflow_dispatch:null},jobs:{wbfy:{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy.yml@main"}}},"wbfy-merge":{name:"Merge wbfy",on:{workflow_dispatch:null},jobs:{"wbfy-merge":{uses:"WillBooster/reusable-workflows/.github/workflows/wbfy-merge.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:{},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"notify-ready":{name:"Notify ready",on:{issues:{types:["labeled"]}},jobs:{"notify-ready":{uses:"WillBooster/reusable-workflows/.github/workflows/notify-ready.yml@main",secrets:{DISCORD_WEBHOOK_URL:"${{ secrets.DISCORD_WEBHOOK_URL_FOR_READY }}"}}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"add-issue-to-project":{name:"Add issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",secrets:{GH_PROJECT_URL:"${{ secrets.GH_PROJECT_URL }}"}}}},"add-ready-issue-to-project":{name:"Add ready issue to GitHub project",on:{issues:{types:["labeled"]}},jobs:{"add-ready-issue-to-project":{uses:"WillBooster/reusable-workflows/.github/workflows/add-issue-to-project.yml@main",with:{labeled:"ready :rocket:"},secrets:{GH_PROJECT_URL:"https://github.com/orgs/WillBoosterLab/projects/5"}}}}};async function at(e){return j.functionIgnoringException("generateWorkflow",(async()=>{const n=t.resolve(e.dirPath,".github","workflows");await r.promises.mkdir(n,{recursive:!0});const s=t.resolve(e.dirPath,".github","semantic.yml");await S.run((()=>r.promises.rm(s,{force:!0,recursive:!0})));const i=await r.promises.readdir(n,{withFileTypes:!0}),o=new Set(["test.yml","wbfy.yml","wbfy-merge.yml","semantic-pr.yml","close-comment.yml","add-issue-to-project.yml",...i.filter((e=>e.isFile()&&e.name.endsWith(".yml"))).map((e=>e.name))]);e.depending.semanticRelease&&o.add("release.yml"),(e.isPublicRepo||e.repository?.startsWith("github:WillBoosterLab/"))&&(o.add("add-ready-issue-to-project.yml"),o.add("notify-ready.yml"));for(const s of o){const i=t.basename(s,".yml");await S.run((()=>ct(e,n,i)))}await S.run((()=>r.promises.rm(t.join(n,"add-focused-issue-to-project.yml"),{force:!0,recursive:!0})))}))}async function ct(e,n,s){let i=m(rt[s]??{});const o=t.join(n,`${s}.yml`);try{const e=await r.promises.readFile(o,"utf8"),t=g.load(e);i=u.all([i,t,i],{arrayMerge:X})}catch{}s.startsWith("deploy")&&(i={...i,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},i.jobs&&function(e,t){const n=e[t];delete e[t],e[t]=n}(i,"jobs"),i.on?.push&&(i.on.push["paths-ignore"]=[...new Set([...i.on.push["paths-ignore"]??[],"**.md","**/docs/**"])]));for(const t of Object.values(i.jobs)){if(!t.uses?.includes?.("/reusable-workflows/"))return;lt(e,t,s)}switch(s){case"release":if(i.on?.schedule)delete i.on.push;else{if(!(i.on?.push&&e.release.branches.length>0))return void await r.promises.rm(t.join(n,"release.yml"),{force:!0});i.on.push.branches=e.release.branches}break;case"test":i.on?.push&&(i.on.push.branches=i.on.push.branches.filter((e=>"renovate/**"!==e)));break;case"wbfy":i.on&&pt(i,20,24);break;case"wbfy-merge":pt(i,1,4)}if(function(e){delete e.jobs["add-to-project"]}(i),await dt(i,o),"release"===s)await r.promises.rm(t.join(n,"semantic-release.yml"),{force:!0});else if("sync"===s){if(await r.promises.rm(t.join(n,"sync-init.yml"),{force:!0}),!i.jobs.sync||!i.jobs.sync.with)return;i.jobs["sync-force"]=i.jobs.sync;const e=i.jobs.sync.with.sync_params_without_dest;if(!e)return;i.jobs.sync.with.sync_params_without_dest=`--force ${e}`,i.name="Force to Sync",i.on={workflow_dispatch:null},delete i.jobs.sync,await dt(i,t.join(n,"sync-force.yml"))}}function lt(e,t,n){if(t.with||={},t.secrets||={},"test"!==n&&"release"!==n&&"wbfy"!==n&&"wbfy-merge"!==n&&"add-issue-to-project"!==n&&"add-ready-issue-to-project"!==n||(t.secrets.GH_TOKEN=e.isPublicRepo?"${{ secrets.PUBLIC_GH_BOT_PAT }}":"${{ secrets.GH_BOT_PAT }}"),!e.release.npm||"release"!==n&&"test"!==n||(t.secrets.NPM_TOKEN="${{ secrets.NPM_TOKEN }}"),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;e&&(t.with.sync_params_without_dest=e.toString().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.cpu_arch,delete e.with.label,delete e.with.labelOperator}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.toString().replace(/\s+--json/,"")),e.doesContainsDockerfile&&("extra-large"!==t.with.ci_size&&(n.startsWith("deploy")||n.startsWith("test"))&&(t.with.ci_size="large"),n.startsWith("deploy")&&(t.with.cpu_arch="X64")),"release"===n||"test"===n||"wbfy"===n||"wbfy-merge"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?Ze(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ze(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}function pt(e,t,n){const[s,i]=(e.on.schedule?.[0]?.cron??"").split(" ").map(Number);if(0!==s&&Number.isInteger(i)){const e=(i+9)%24;if(t<n?t<=e&&e<n:t<=e||e<n)return}const o=`${1+Math.floor(59*Math.random())} ${(t+Math.floor(Math.random()*(n-t))-9+24)%24} * * *`;e.on.schedule=[{cron:o}]}async function dt(e,t){const n=g.dump(e,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await r.promises.writeFile(t,n)}async function ut(e){return j.functionIgnoringException("generateYarnrcYml",(async()=>{const n=t.resolve(e.dirPath,".yarnrc.yml");if(e.isBun)return await S.run((()=>r.promises.rm(n,{force:!0}))),await S.run((()=>r.promises.rm(t.resolve(e.dirPath,".yarn"),{force:!0,recursive:!0}))),void await S.run((()=>r.promises.rm(t.resolve(e.dirPath,"yarn.lock"),{force:!0,recursive:!0})));const s=W("yarn",["--version"],e.dirPath),i=function(e,t){const n=W("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",e.dirPath);mt(s)<=mt(i)&&s!==i&&R("yarn",["set","version",i],e.dirPath,1);const o=t.join(e.dirPath,".yarn","releases");await r.promises.mkdir(o,{recursive:!0});for(const e of await r.promises.readdir(o))e.startsWith("yarn-")&&!e.startsWith(`yarn-${i}.`)&&await S.run((()=>r.promises.rm(t.join(o,e))));const a=t.resolve(e.dirPath,".yarnrc");await S.run((()=>r.promises.rm(a,{force:!0})));const c=g.load(await r.promises.readFile(n,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",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 n=t.resolve(e.dirPath,".yarnrc","undefined.cjs");await S.run((()=>r.promises.rm(n,{force:!0})))}0===c.plugins.length&&delete c.plugins,await r.promises.writeFile(n,g.dump(c,{lineWidth:-1})),R("yarn",["dlx","yarn-plugin-auto-install"],e.dirPath)}))}function mt(e){const[t]=e.split(".");return Number(t)}async function ft(e){return j.functionIgnoringException("setupLabels",(async()=>{if(!I)return;const[t,n]=A.getOrgAndName(e.repository??"");if(t&&n&&("WillBooster"===t||"WillBoosterLab"===t))try{await gt(t,n,"d1: x-easy :hedgehog:","EDE9FE"),await gt(t,n,"d2: easy :rabbit2:","DDD6FE"),await gt(t,n,"d3: medium :ox:","C4B5FD"),await gt(t,n,"d4: hard :squid:","A78BFA"),await gt(t,n,"d5: x-hard :whale2:","8B5CF6"),await gt(t,n,"p1: critical :fire::fire::fire:","EF4444"),await gt(t,n,"p2: urgent :fire::fire:","F87171"),await gt(t,n,"p3: important :fire:","FCA5A5"),await gt(t,n,"p4: nice to have :droplet:","FECACA"),await gt(t,n,"r: blitz","5300bc"),await gt(t,n,"r: firebase","ffca28"),await gt(t,n,"r: prisma","0c344b"),await gt(t,n,"r: react","61dafb"),await gt(t,n,"r: svelte","ff3e00"),await gt(t,n,"r: semantic-release","494949"),await gt(t,n,"ready :rocket:","22C55E"),await gt(t,n,"review requested :mag:","FBCA04"),await gt(t,n,"released :bookmark:","6366F1"),await gt(t,n,"s: 0.5h :clock1230:","F3F4F6"),await gt(t,n,"s: 1h :clock1:","E5E7EB"),await gt(t,n,"s: 2h :clock2:","D1D5DB"),await gt(t,n,"s: 3h :clock3:","9CA3AF"),await gt(t,n,"s: 5h :clock5:","6B7280"),await gt(t,n,"s: 8h :clock8:","4B5563"),await gt(t,n,"s: 13h :clock1:","374151"),await gt(t,n,"t: build :hammer:","BFDBFE"),await gt(t,n,"t: chore :broom:","BFDBFE"),await gt(t,n,"t: ci :construction_worker:","BFDBFE"),await gt(t,n,"t: docs :memo:","BFDBFE"),await gt(t,n,"t: feat :sparkles:","BFDBFE"),await gt(t,n,"t: fix :bug:","BFDBFE"),await gt(t,n,"t: perf :zap:","BFDBFE"),await gt(t,n,"t: refactor :recycle:","BFDBFE"),await gt(t,n,"t: style :lipstick:","BFDBFE"),await gt(t,n,"t: test :test_tube:","BFDBFE"),await gt(t,n,"project","24292F"),await gt(t,n,"focused :dart:","22C55E"),await ht(t,n,"bug"),await ht(t,n,"documentation"),await ht(t,n,"duplicate"),await ht(t,n,"enhancement"),await ht(t,n,"good first issue"),await ht(t,n,"help wanted"),await ht(t,n,"invalid"),await ht(t,n,"question"),await ht(t,n,"wontfix"),await ht(t,n,"ready"),await ht(t,n,"review requested"),await ht(t,n,"released"),await ht(t,n,"semantic-release")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}}))}async function gt(e,t,n,s){try{await T.request("POST /repos/{owner}/{repo}/labels",{owner:e,repo:t,name:n,color:s})}catch{await T.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n,color:s})}}async function ht(e,t,n){try{await T.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:e,repo:t,name:n})}catch{}}const yt=["READY_DISCORD_WEBHOOK_URL"];async function wt(e){return j.functionIgnoringException("setupSecrets",(async()=>{if(!I||!k.doesUploadEnvVars)return;const[t,n]=A.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;const s=h.config().parsed||{};if(0!==Object.keys(s).length)try{for(const e of yt)try{await T.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const i=await T.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=i.data;await y.ready;for(const[i,a]of Object.entries(s)){if(e.isPublicRepo&&"GH_BOT_PAT"===i)continue;if(!e.isPublicRepo&&"PUBLIC_GH_BOT_PAT"===i)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await T.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:i,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}}))}async function bt(e){const[t,n]=A.getOrgAndName(e.repository??"");t&&n&&("WillBooster"!==t&&"WillBoosterLab"!==t||await s((()=>T.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,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 vt={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page. (このページで `All checks have passed` が表示されていることを確認した。)\n - You may leave this box unchecked due to long workflows.\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 - All tests are passed.\n - Test command (e.g., `yarn test`) is passed.\n - Lint command (e.g., `yarn lint`) is passed.\n- [ ] I\'ve reviewed my changes on GitHub PR\'s diff view. (GitHub上で自分の変更内容を確認した。)\n- [ ] I\'ve written the steps to test your changes. (テスト手順を記載した。)\n- [ ] I\'ve added screenshots. (UIを変更した場合、スクリーンショットを追加した。)\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\n\x3c!-- 日本語で記述しても大丈夫です。 --\x3e\n'.trim()};async function kt(e){return j.functionIgnoringException("generateGitHubTemplates",(async()=>{for(const[n,s]of Object.entries(vt)){const i=t.resolve(e.dirPath,".github",n);if(r.existsSync(i)){const e=await r.promises.readFile(i,"utf8");if(w(e,s)>s.length/2)continue}await r.promises.mkdir(t.resolve(e.dirPath,".github"),{recursive:!0}),await S.run((()=>C.generateFile(i,s)))}}))}const jt=v.object({typos:v.object({all:v.record(v.string()).optional(),doc:v.record(v.string()).optional(),ts:v.record(v.string()).optional(),text:v.record(v.string()).optional()}).optional()});async function xt(n,s){const i=t.resolve(n,"package.json");try{const o=r.existsSync(i);let a={},c={},l={},p=!1;if(o){const e=r.readFileSync(i,"utf8");l=JSON.parse(e),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const s=t.resolve(n,".releaserc.json"),i=JSON.parse(await e.readFile(s,"utf8"));d=i?.branches||[],u=i?.plugins?.flat()||[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!r.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 Pt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Pt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await e.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[s,i]of[["java","java"],["node","nodejs"],["python","python"]])try{const o=await e.readFile(t.resolve(n,`.${s}-version`),"utf8");g&&(g+="\n"),g+=i+" "+o.trim()}catch{}let h="";try{h=await e.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const t=await e.readFile(y,"utf8");w=jt.parse(JSON.parse(t))}catch{}const v={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f?.full_name}`:void 0,isBun:s?.isBun||r.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainsSubPackageJsons:_t("packages/**/package.json",n),doesContainsDockerfile:!!h||r.existsSync(t.resolve(n,"docker-compose.yml")),doesContainsGemfile:r.existsSync(t.resolve(n,"Gemfile")),doesContainsGoMod:r.existsSync(t.resolve(n,"go.mod")),doesContainsPackageJson:r.existsSync(t.resolve(n,"package.json")),doesContainsPoetryLock:r.existsSync(t.resolve(n,"poetry.lock")),doesContainsPomXml:r.existsSync(t.resolve(n,"pom.xml")),doesContainsPubspecYaml:r.existsSync(t.resolve(n,"pubspec.yaml")),doesContainsTemplateYaml:r.existsSync(t.resolve(n,"template.yaml")),doesContainsVscodeSettingsJson:r.existsSync(t.resolve(n,".vscode","settings.json")),doesContainsJavaScript:_t("{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScript:_t("{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsx:_t("{app,src,tests}/**/*.{t,j}sx",n),doesContainsJavaScriptInPackages:_t("packages/**/{app,src,tests,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainsTypeScriptInPackages:_t("packages/**/{app,src,tests,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainsJsxOrTsxInPackages:_t("packages/**/{app,src,tests}/**/*.{t,j}sx",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],litestream:h.includes("install-litestream.sh"),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"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},versionsText:g,packageJson:l,wbfyJson:w};if(v.isBun||(v.eslintBase=function(e){if(e.depending.blitz)return"@willbooster/eslint-config-blitz-next";if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainsTypeScript)return e.doesContainsJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainsJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainsJavaScript)return"@willbooster/eslint-config-js"}(v)),v.doesContainsGemfile||v.doesContainsGoMod||v.doesContainsPackageJson||v.doesContainsPoetryLock||v.doesContainsPomXml||v.doesContainsPubspecYaml||v.doesContainsTemplateYaml)return v}catch{}}function _t(e,t){return c(e,{dot:!0,cwd:t}).length>0}async function Pt(e){const[t,n]=A.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await T.request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}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"}}).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.readdir(o,{withFileTypes:!0})))??[]).filter((e=>e.isDirectory())).map((e=>t.join(o,e.name)));await $([s,...r]);const a=await xt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=E(a),l=(await Promise.all(r.map((e=>xt(e,a))))).filter((e=>!!e)),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await H(a),await ut(a),await Promise.all([x(a),P(a),c.then((()=>Ye(a))),ce(a),de(a),he(a),kt(a),We(a),Qe(a),Ve(a),at(a),ft(a),wt(a),bt(a),...a.isBun?[ee(a),De(a).then((()=>Ne(a)))]:[De(a)],ze(a)]),await S.promiseAll();const d=[];for(const e of p)(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(F(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(_(e)),e.depending.next&&d.push(Ue(e)),await we(e,a),await S.promiseAll(),(e.isRoot||e.doesContainsPackageJson)&&(await He(e),await Ee(e,a,n.skipDeps),d.push(ze(e)),e.doesContainsVscodeSettingsJson&&e.doesContainsPackageJson&&d.push(it(e)),(e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&d.push(nt(e)),(e.doesContainsJavaScript||e.doesContainsJavaScriptInPackages||e.doesContainsTypeScript||e.doesContainsTypeScriptInPackages)&&(a.isBun&&d.push(Z(e)),a.isWillBoosterConfigs||d.push(fe(e,a)),d.push(me(e))),e.depending.pyright&&d.push(qe(e)));await Promise.all(d),await S.promiseAll();const u=a.isBun?"bun":"yarn";R(u,["cleanup"],s),a.isBun?R(u,["update"],s):R(u,["install"],s)}}();
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy9maXhlcnMvcGxheXdyaWdodENvbmZpZy50cyIsIi4uL3NyYy9maXhlcnMvcHJpc21hLnRzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3R5cG9zLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbkNvbnN0YW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FzZGYudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYmlvbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VzbGludHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL3V0aWxzL2VzbGludFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvc3JjRGlyZWN0b3JpZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2h1c2t5cmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9pZGVhLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9uZXh0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvd29ya2Zsb3cudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2U6IGJvb2xlYW47XG4gIGRvZXNVcGxvYWRFbnZWYXJzOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaXNWZXJib3NlID0gZmFsc2U7XG4gICAgdGhpcy5kb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IGVycm9yfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0RvY2tlcmZpbGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBjb25maWcuZG9ja2VyZmlsZTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcblxuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9yZXRyaWVzOi4rLC8sICdyZXRyaWVzOiBwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEsJyk7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBnbG9iYnkoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL0RBVEFCQVNFX1VSTD1cIj8oLitcXC5zcWxpdGUzKVwiP1tcXG4kXS8sXG4gICAgICAgICdEQVRBQkFTRV9VUkw9XCIkMT9jb25uZWN0aW9uX2xpbWl0PTFcIlxcbidcbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnX190ZXN0c19fJyk7XG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdHMnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZUFsbCgnX190ZXN0c19fJywgJ3Rlc3RzJyk7XG4gICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgbmV3Q29udGVudCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnNwLndyaXRlRmlsZShmaWxlUGF0aCwgY29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeEFiYnJldmlhdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGdsb2JieSgnKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGdpdGlnbm9yZTogdHJ1ZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4QWJicmV2aWF0aW9uc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGdsb2JieShcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgXSxcbiAgICAgIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGdpdGlnbm9yZTogdHJ1ZSB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopZWdcXC4vZywgJy8vJDFlLmcuJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKilpZVxcLi9nLCAnLy8kMWkuZS4nKTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGdpdGlnbm9yZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopY1xcLmZcXC4vZywgJy8vJDFjZi4nKVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeEFiYnJldmlhdGlvbnNJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oW14kXSkvZywgJ2NmLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oW14kXSkvZywgJ2UuZy4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKFteJF0pL2csICdpLmUuJDEnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNvbnN0IHRva2VuID1cbiAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVCB8fCBwcm9jZXNzLmVudi5QVUJMSUNfR0hfQk9UX1BBVCB8fCBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fCBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG5leHBvcnQgY29uc3QgaGFzR2l0SHViVG9rZW4gPSAhIXRva2VuO1xuZXhwb3J0IGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gIGF1dGg6IHRva2VuLFxufSk7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke29wdGlvbnMuY3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgaWYgKHJldC5zdGF0dXMgPT09IDApIGJyZWFrO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgY29uc3QgZXJyb3IgPSBwcm9jLnN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKX1dIGNhdXNlZCB0aGUgZm9sbG93aW5nIGVycm9yOlxcbiAke2Vycm9yfWApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cblxuICBpZiAoZW52LkFTREZfRElSKSB7XG4gICAgYXJncyA9IFsnLWwnLCAnLWMnLCBgLiAke2Vudi5BU0RGX0RJUn0vYXNkZi5zaCAmJiAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YF07XG4gICAgY29tbWFuZCA9ICdiYXNoJztcbiAgfVxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIGUuZy4gamF2YSBhZG9wdG9wZW5qZGstMTEuMC4xNys4XG4gIGNvbnN0IG51bWJlcnMgPSB2ZXJzaW9uXG4gICAgLnNwbGl0KC9bKy4tXS8pXG4gICAgLm1hcChOdW1iZXIpXG4gICAgLmZpbHRlcigobnVtKSA9PiAhTnVtYmVyLmlzTmFOKG51bSkpO1xuICBsZXQgdmVyc2lvbk51bWJlciA9IDA7XG4gIGxldCBkaXZpc29yID0gMTtcbiAgZm9yIChjb25zdCBudW0gb2YgbnVtYmVycykge1xuICAgIHZlcnNpb25OdW1iZXIgKz0gbnVtICogZGl2aXNvcjtcbiAgICBkaXZpc29yIC89IDEwMDA7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb25OdW1iZXI7XG59XG4iLCJleHBvcnQgY29uc3QgUFlUSE9OX1ZFUlNJT04gPSAnMy45LjE5JztcbmV4cG9ydCBjb25zdCBKQVZBX1ZFUlNJT04gPSAnenVsdS0xMS43NC4xNSc7XG4vLyBCZWNhdXNlIFdlYktpdCBjYW5ub3QgbG9nLWluIG9uIEJsaXR6IHYyLjAuNStcbmV4cG9ydCBjb25zdCBCTElUWl9WRVJTSU9OID0gJzIuMC40JztcbmV4cG9ydCBjb25zdCBORVhUX1ZFUlNJT04gPSAnMTQuMi41JztcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IG9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGNvbnZlcnRWZXJzaW9uSW50b051bWJlciB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgSkFWQV9WRVJTSU9OLCBQWVRIT05fVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUb29sVmVyc2lvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUb29sVmVyc2lvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuY29uc3QgQ09SRV9UT09MUyA9IG5ldyBTZXQoWydqYXZhJywgJ25vZGVqcycsICdidW4nLCAncHl0aG9uJ10pO1xuY29uc3QgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTID0gWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ107XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnZlcnNpb25zVGV4dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGR1cGxpY2F0YWJsZUxpbmVzID0gY29uZmlnLnZlcnNpb25zVGV4dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIC8vIFRvIG1vdmUgdGhlIHRvcCBvZiB0aGUgbGlzdCwgd2UgbmVlZCB0byBhZGQgYSBzcGFjZS5cbiAgICAgIHJldHVybiBgJHtDT1JFX1RPT0xTLmhhcyhuYW1lKSA/ICcgJyA6ICcnfSR7bmFtZX0gJHt2ZXJzaW9ufWA7XG4gICAgfSlcbiAgICAuc29ydCgpXG4gICAgLy8gUmVtb3ZlIGFkZGVkIHNwYWNlcy5cbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XG4gIGNvbnN0IGxpbmVzID0gWy4uLm5ldyBTZXQoZHVwbGljYXRhYmxlTGluZXMpXTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL3B5cGkub3JnL3B5cGkvcG9ldHJ5L2pzb24nKTtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGNvbnN0IHBvZXRyeVZlcnNpb24gPSBqc29uPy5pbmZvPy52ZXJzaW9uO1xuICAgIGlmIChwb2V0cnlWZXJzaW9uKSB7XG4gICAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncG9ldHJ5JywganNvbj8uaW5mbz8udmVyc2lvbik7XG4gICAgfVxuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdweXRob24nLCBQWVRIT05fVkVSU0lPTiwgdHJ1ZSk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnamF2YScsIEpBVkFfVkVSU0lPTiwgdHJ1ZSk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQYWNrYWdlSnNvbikge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbnN0IGxlZnRob29rVmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIoJ2V2aWxtYXJ0aWFucycsICdsZWZ0aG9vaycpO1xuICAgICAgaWYgKGxlZnRob29rVmVyc2lvbikgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2xlZnRob29rJywgbGVmdGhvb2tWZXJzaW9uKTtcblxuICAgICAgY29uc3QgYnVuVmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIoJ292ZW4tc2gnLCAnYnVuJyk7XG4gICAgICBpZiAoYnVuVmVyc2lvbikgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2J1bicsIGJ1blZlcnNpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgJ3lhcm4nLCAndmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAneWFybicsIHZlcnNpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJlZml4IG9mIERFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUykge1xuICAgIGNvbnN0IHZlcnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCk7XG4gICAgdm9pZCBmcy5wcm9taXNlcy5ybSh2ZXJzaW9uUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHRvb2xWZXJzaW9uc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpO1xuICBhd2FpdCAobGluZXMubGVuZ3RoID4gMFxuICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLndyaXRlRmlsZSh0b29sVmVyc2lvbnNQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKSlcbiAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh0b29sVmVyc2lvbnNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydwbHVnaW4nLCAndXBkYXRlJywgJy0tYWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydpbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVmVyc2lvbihsaW5lczogc3RyaW5nW10sIHRvb2xOYW1lOiBzdHJpbmcsIG5ld1ZlcnNpb246IHN0cmluZywgaGVhZCA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IGluZGV4ID0gbGluZXMuZmluZEluZGV4KChsKSA9PiBsLnNwbGl0KC9cXHMrLylbMF0gPT09IHRvb2xOYW1lKTtcbiAgY29uc3QgbmV3TGluZSA9IGAke3Rvb2xOYW1lfSAke25ld1ZlcnNpb259YDtcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIGxpbmVzLnNwbGljZShoZWFkID8gMCA6IGxpbmVzLmxlbmd0aCwgMCwgbmV3TGluZSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgWywgdmVyc2lvbl0gPSBsaW5lc1tpbmRleF0uc3BsaXQoL1xccysvKTtcbiAgICBpZiAoY29udmVydFZlcnNpb25JbnRvTnVtYmVyKG5ld1ZlcnNpb24pID4gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb24pKSB7XG4gICAgICBsaW5lc1tpbmRleF0gPSBuZXdMaW5lO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIC8vIEZldGNoIHRoZSBsYXRlc3QgcmVsZWFzZSBmcm9tIHRoZSByZXBvc2l0b3J5XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0Jywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG86IHJlcG9zaXRvcnksXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlc3BvbnNlLmRhdGEudGFnX25hbWU7XG4gICAgY29uc3QgaW5kZXggPSB2ZXJzaW9uLmxhc3RJbmRleE9mKCd2Jyk7XG4gICAgY29uc3QgdmVyc2lvbk51bWJlclRleHQgPSBpbmRleCA9PT0gLTEgPyB2ZXJzaW9uIDogdmVyc2lvbi5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIENoZWNrIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBudW1iZXJcbiAgICByZXR1cm4gL15cXGQvLnRlc3QodmVyc2lvbk51bWJlclRleHQpID8gdmVyc2lvbk51bWJlclRleHQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIEJ1biB0YWdzIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiBhbnlbXSwgc291cmNlOiBhbnlbXSwgb3B0aW9uczogYW55KTogYW55W10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdChpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCaW9tZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogdW5rbm93biA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KTtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGB0ZWxlbWV0cnkgPSBmYWxzZVxuXG5baW5zdGFsbF1cbmV4YWN0ID0gdHJ1ZVxuXG5bcnVuXVxuYnVuID0gdHJ1ZVxuXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnNvcnQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAncHknXS5zb3J0KCksXG4gIGNvZGVXaXRoOEluZGVudFNpemU6IFsnc2gnXS5zb3J0KCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnNvcnQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10uc29ydCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0uc29ydCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0uc29ydCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg4SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDhcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbkB0eXBlcy9cbl9fZ2VuZXJhdGVkX18vXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbiouY29uZmlnLipqc1xuKi5kLnRzXG4qLm1pbi4qanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludGlnbm9yZScpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qc29uJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlcyA9IFtdO1xuICAgIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgICAgYmFzZXMucHVzaChjb25maWcuZXNsaW50QmFzZSk7XG4gICAgfVxuICAgIGlmIChjb25maWcgIT09IHJvb3RDb25maWcpIHtcbiAgICAgIGJhc2VzLnB1c2goJy4uLy4uLy5lc2xpbnRyYy5qc29uJyk7XG4gICAgfVxuICAgIGxldCBuZXdTZXR0aW5ncyA9IHsgcm9vdDogdHJ1ZSwgZXh0ZW5kczogYmFzZXMgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcykge1xuICAgICAgICBvbGRTZXR0aW5ncy5leHRlbmRzID0gb2xkU2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoXG4gICAgICAgICAgKGV4dDogc3RyaW5nKSA9PiAhZXh0LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSAmJiBleHQgIT09ICcuLi8uLi8uZXNsaW50cmMuanNvbidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChiYXNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgb2xkU2V0dGluZ3MuZXh0ZW5kcyA9IFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3RXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHM7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIG9sZFNldHRpbmdzLmV4dGVuZHMgPSBuZXdFeHRlbmRzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgIH0pIGFzIHR5cGVvZiBuZXdTZXR0aW5ncztcbiAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIGNvZGUgYWZ0ZXIgYWxsIEJsaXR6LmpzIHByb2plY3RzIGFyZSB1cGRhdGVkLlxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKFxuICAgICAgICAgIChleHQ6IHN0cmluZykgPT4gZXh0ICE9PSAnLi9ub2RlX21vZHVsZXMvQGJsaXR6anMvbmV4dC9lc2xpbnQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLmRldmNvbnRhaW5lci9cbmRpc3QvXG50ZW1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG4qLnNxbGl0ZTMtam91cm5hbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgdGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IGRhdGE6IGNvbW1pdHMgfSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzJywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG8sXG4gICAgICBwZXJfcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1pdHNbMF0uc2hhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke2Vycm9yfWApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHNyY0RpcmVjdG9yaWVzID0ge1xuICBub2RlOiBbJ3NyYycsICd0ZXN0cycsICdzY3JpcHRzJ10uc29ydCgpLFxuICBibGl0ejogWydzcmMnLCAndGVzdHMnLCAnc2NyaXB0cycsICdkYicsICdpbnRlZ3JhdGlvbnMnLCAnbWFpbGVycyddLnNvcnQoKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcmNEaXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICByZXR1cm4gc3JjRGlyZWN0b3JpZXMuYmxpdHo7XG4gIH1cbiAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLm5vZGU7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7IGdsb2JieSwgZ2xvYmJ5U3luYyB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVzbGludEV4dGVuc2lvbkJhc2UsIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5pbXBvcnQgeyBCTElUWl9WRVJTSU9OLCBORVhUX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy92ZXJzaW9uQ29uc3RhbnRzLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnZXNsaW50QDguNTcuMCcsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbXG4gIC4uLmpzQ29tbW9uRGVwcyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0Jyxcbl07XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAuLi5qc0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JywgLi4uanNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgLi4udHNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsIC4uLnRzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JzogW1xuICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAuLi50c0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyB8fCB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyB8fCB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyB8fCB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzIHx8IHt9O1xuXG4gIGF3YWl0IHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmogYXMgU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4gICk7XG5cbiAgaWYgKGpzb25PYmoubmFtZSAhPT0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZykpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgKz0gYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCk7XG4gIH1cbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLWFsbCcpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1yZWN1cnNpdmUnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tc2luY2UnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0td29ya3RyZWUnKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnLCAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnKTtcbiAgfVxuXG4gIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snaHVza3knXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sncGluc3QnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBodXNreVxuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2h1c2t5Jyk7XG4gICAgICAvLyAnfHwgdHJ1ZScgYXZvaWRzIGVycm9ycyB3aGVuIGh1c2t5IGlzIG5vdCBpbnN0YWxsZWQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIG5vbi15YXJuIHBhY2thZ2UgbWFuYWdlcnMuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciB5YXJuLlxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gfHwgY29uZmlnLmlzUmVmZXJyZWRCeU90aGVyUmVwbykge1xuICAgICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgICAgICAgLy8gaHR0cHM6Ly90eXBpY29kZS5naXRodWIuaW8vaHVza3kvIy8/aWQ9aW5zdGFsbC0xXG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwaW5zdCcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFjayA9ICdwaW5zdCAtLWRpc2FibGUnO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2sgPSAncGluc3QgLS1lbmFibGUnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPVxuICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddIHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICAgICA/IC8vIFRPRE86IHJlbW92ZSB0aGUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGFmdGVyIG11bHRpLXNlbWFudGljLXJlbGVhc2Ugc3VwcG9ydHMgdmVyc2lvbiA3K1xuICAgICAgICAgICAgJ0A2LjEuMCdcbiAgICAgICAgICA6ICcnO1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYGNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29udmVudGlvbmFsY29tbWl0cyR7dmVyc2lvbn1gKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydwbGF5d3JpZ2h0J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZ2xvYmJ5U3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBnaXRpZ25vcmU6IHRydWUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BiaW9tZWpzL2Jpb21lJywgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50J107XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ21pY3JvbWF0Y2gnXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnZXNsaW50QDguNTcuMCcsICdtaWNyb21hdGNoJyk7XG4gICAgICAvLyBUT0RPOiBub3QgbmVlZGVkIGFueW1vcmU/XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBgXCJyZXNvbHV0aW9uc1wiOiB7IFwibnBtL2NoYWxrXCI6IFwiXjQuMS4yXCIgfSxgIGNhdXNlcyBcIkludmFsaWQgbnBtIHRva2VuXCJcbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmNsZWFudXAgPSBqc29uT2JqLnNjcmlwdHMuY2xlYW51cD8ucmVwbGFjZSgnICYmIHlhcm4gbGludC1maXgnLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gKz0gRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGZsdXR0ZXIgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCArPSBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBnbG9iYnkoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgZ2l0aWdub3JlOiB0cnVlLFxuICAgICAgICBpZ25vcmU6IFsndGVzdC1maXh0dXJlcyddLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgvWy9cXFxcXS8pO1xuICAgICAgICBpZiAoc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmIHBvZXRyeSBydW4gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgKz0gYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgICAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcucmVwb3NpdG9yeSkge1xuICAgICAganNvbk9iai5yZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBkZXBlbmRlbmNpZXMucHVzaChcbiAgICAgIGBibGl0ekAke0JMSVRaX1ZFUlNJT059YCxcbiAgICAgIGBAYmxpdHpqcy9hdXRoQCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYEBibGl0empzL25leHRAJHtCTElUWl9WRVJTSU9OfWAsXG4gICAgICBgQGJsaXR6anMvcnBjQCR7QkxJVFpfVkVSU0lPTn1gLFxuICAgICAgYG5leHRAJHtORVhUX1ZFUlNJT059YFxuICAgICk7XG4gICAgLy8gUHJlZmVyIGVzbGludC1jb25maWctbmV4dCdzIGRlcGVuZGVuY2llc1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGQpID0+IGQgIT09ICdlc2xpbnQtcGx1Z2luLXJlYWN0JyAmJiBkICE9PSAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycpO1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIC8vIFRvIHByZXZlbnQgbXVsdGlwbGUgdmVyc2lvbnMgb2YgQHR5cGVzL3JlYWN0IGZyb20gbWl4aW5nLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3JlYWN0J107XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzPy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgbGV0IG5ld0pzb25UZXh0ID0gSlNPTi5zdHJpbmdpZnkoanNvbk9iaik7XG4gIG5ld0pzb25UZXh0ID0gYXdhaXQgZml4U2NyaXB0TmFtZXMoanNvbk9iai5zY3JpcHRzLCBuZXdKc29uVGV4dCwgY29uZmlnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdKc29uVGV4dCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRldkRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXBlbmRlbmNpZXMuXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1sndHNsaWInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsZXJuYSddO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydwaW5zdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHJldHRpZXInXTtcbiAgaWYgKCFyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZm9yIChjb25zdCBkZXBzIG9mIE9iamVjdC52YWx1ZXMoZXNsaW50RGVwcykpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYGVzbGludCAtLWNvbG9yIFwiLi97JHtnZXRTcmNEaXJzKGNvbmZpZyl9fS8qKi8qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19XCJgLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdC1maXh0dXJlcy8qKlwiYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCAtLVByZXR0eScsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgY29uc3Qgb2xkVGVzdCA9IHNjcmlwdHMudGVzdDtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0LWZpeHR1cmVzLyoqXCJgLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guXG4gICAgICAgICAgLy8gRk9SQ0VfQ09MT1I9MyBtYWtlIHdiIGVuYWJsZSBjb2xvciBvdXRwdXQuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgRk9SQ0VfQ09MT1I9MyB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKG9sZFRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gbGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXhTY3JpcHROYW1lcyhcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmV3SnNvblRleHQ6IHN0cmluZyxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBvbGRBbmROZXdTY3JpcHROYW1lczogW3N0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGZvciAoY29uc3QgW2tleV0gb2YgT2JqZWN0LmtleXMoc2NyaXB0cykpIHtcbiAgICBpZiAoa2V5WzBdICE9PSAnOicgJiYga2V5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIG9sZEFuZE5ld1NjcmlwdE5hbWVzLnB1c2goW2tleSwga2V5LnJlcGxhY2VBbGwoJzonLCAnLScpXSk7XG4gICAgfVxuICB9XG4gIGlmIChvbGRBbmROZXdTY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBuZXdKc29uVGV4dDtcblxuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgIG5ld0pzb25UZXh0ID0gbmV3SnNvblRleHQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JieShbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBnaXRpZ25vcmU6IHRydWUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzIHx8IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzIHx8IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnYXV0aCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2F1dGguZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdjb2RlLWFuYWx5emVyJyk7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ10gPVxuICAgICAgYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2NvZGUtYW5hbHl6ZXIuZ2l0I3dvcmtzcGFjZT1AY29kZS1hbmFseXplci9jbGllbnQmY29tbWl0PSR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2p1ZGdlJyk7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2p1ZGdlLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPVxuICAgICAgYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2xsbS1wcm94eS5naXQjd29ya3NwYWNlPUBsbG0tcHJveHkvY2xpZW50JmNvbW1pdD0ke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlQ29tbWl0OiAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9saW50LXN0YWdlZCcsXG4gIHByZVB1c2g6IGB5YXJuIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG55YXJuIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gIHBhY2thZ2VKc29uLnNjcmlwdHMgfHw9IHt9O1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdGluc3RhbGwnXTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHNbJ3Bvc3RwdWJsaXNoJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwYXJlJ107XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzWydwcmVwdWJsaXNoT25seSddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncHJlcGFjayddO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0c1sncG9zdHBhY2snXTtcblxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAnaHVza3ktaW5pdCcsICctLXlhcm4yJ10sIGNvbmZpZy5kaXJQYXRoKTtcblxuICBjb25zdCBwcmVDb21taXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLWNvbW1pdCcpO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHByZUNvbW1pdEZpbGVQYXRoLCBzY3JpcHRzLnByZUNvbW1pdCArICdcXG4nKSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcpO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgbGV0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIHByZVB1c2ggPSBwcmVQdXNoLnJlcGxhY2UoXG4gICAgICAneWFybiB0eXBlY2hlY2snLFxuICAgICAgdHlwZWNoZWNrXG4gICAgICAgIC5yZXBsYWNlKCd0c2MgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vdHNjICcpXG4gICAgICAgIC5yZXBsYWNlKCd3YiAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiAnKVxuICAgICAgICAvLyBweXJpZ2h0IGhhcyBubyBhcmd1bWVudHNcbiAgICAgICAgLnJlcGxhY2UoJ3B5cmlnaHQnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9weXJpZ2h0JylcbiAgICApO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLXB1c2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhd2sgJ3twcmludCBcXCQxfScgLnRvb2wtdmVyc2lvbnMgfCB4YXJncyAtSXt9IGFzZGYgcGx1Z2luIGFkZCB7fVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIHBsdWdpbiB1cGRhdGUgLS1hbGxcImBcbiAgICApO1xuICB9XG4gIC8vIFB5dGhvbuOBjOOBquOBhOOBqOOCpOODs+OCueODiOODvOODq+OBp+OBjeOBquOBhOWHpueQhuezu+OBjOWtmOWcqOOBmeOCi+OBn+OCgeOAgeW8t+WItueahOOBq+acgOWIneOBq+OCpOODs+OCueODiOODvOODq+OBmeOCi+OAglxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dD8uaW5jbHVkZXMoJ3B5dGhvbiAnKSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbCBweXRob25cImApO1xuICB9XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goYHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1BvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwiZGIvc2NoZW1hLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcIicsXG4gICAgICAncnVuX2lmX2NoYW5nZWQgXCJkYi9zY2hlbWEucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiJyxcbiAgICAgICdydW5faWZfY2hhbmdlZCBcImRiL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiJ1xuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwicHJpc21hL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCInLFxuICAgICAgJ3J1bl9pZl9jaGFuZ2VkIFwicHJpc21hL3NjaGVtYS5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCInXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNHZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5zR29Nb2QgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbnNQb21YbWwpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbmZpZy5pc0J1biA/IGJpb21lQ29udGVudCA6IHByZXR0aWVyQ29udGVudCkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyB9IGZyb20gJy4vaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogJyoue2Nqcyxjc3MsY3RzLGh0bSxodG1sLGpzLGpzb24sanNvbjUsanNvbmMsanN4LG1kLG1qcyxtdHMsc2Nzcyx0cyx0c3gsdnVlLHlhbWwseW1sfScsXG4gICAgICAgIHJ1bjogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nLFxuICAgICAgfSxcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVQdXNoOiBgYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG5idW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnKTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQpIHtcbiAgICBjb25zdCBlc2xpbnQgPSBgXG4gICcke2dldEVzbGludEtleShjb25maWcpfSc6IFske0pTT04uc3RyaW5naWZ5KFxuICAgIGAke3BhY2thZ2VQcmVmaXh9ZXNsaW50IC0tZml4JHtFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKX1gXG4gICl9LCAnJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSddLGA7XG4gICAgbGluZXMucHVzaChlc2xpbnQpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VzRmlsdGVyID0gY29uZmlnLmlzUm9vdCA/IFwiICYmICFmaWxlLmluY2x1ZGVzKCcvcGFja2FnZXMvJylcIiA6ICcnO1xuICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19JzogZmlsZXMgPT4ge1xuICAgIGxldCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpJHtwYWNrYWdlc0ZpbHRlcn0pOyR7Z2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnKX1cbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBjb21tYW5kcyA9IFtcXGAke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLnNvbWUoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJyR7cGFja2FnZVByZWZpeH1zb3J0LXBhY2thZ2UtanNvbicpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH0sXG4gICcuLyoqL21pZ3JhdGlvbi5zcWwnOiAoZmlsZXMpID0+IHtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcygnV2FybmluZ3M6JykpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFxcYCEhISBNaWdyYXRpb24gU1FMIGZpbGUgKFxcJHtwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKX0pIGNvbnRhaW5zIHdhcm5pbmdzICEhISBTb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cXGAsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluc1B1YnNwZWNZYW1sKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuL3tsaWIsdGVzdCx0ZXN0X2RyaXZlcn0vKiovKi5kYXJ0JzogZmlsZXMgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnZ2VuZXJhdGVkJykpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gIWZpbGUuZW5kc1dpdGgoJy5mcmVlemVkLmRhcnQnKSAmJiAhZmlsZS5lbmRzV2l0aCgnLmcuZGFydCcpKTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xcYGZsdXR0ZXIgZm9ybWF0IFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICB9LGApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5zUG9ldHJ5TG9jaykge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnB5JzogW1xuICAgICdwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcycsXG4gICAgJ3BvZXRyeSBydW4gYmxhY2snLFxuICAgICdwb2V0cnkgcnVuIGZsYWtlOCdcbiAgXSxgKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiR7Y29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgPyBcImNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XFxuXCIgOiAnJ31cbm1vZHVsZS5leHBvcnRzID0geyR7bGluZXMuam9pbignJyl9XG59O1xuYDtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50S2V5KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpcnMgPSBnZXRTcmNEaXJzKGNvbmZpZyk7XG4gIHJldHVybiBgLi97JHtkaXJzLmpvaW4oJywnKX19LyoqLyoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluc0phdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRcbiAgICA/IGBcXG5cbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUoJycsIGZpbGUpKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gbWljcm9tYXRjaC5ub3QoZmlsdGVyZWRGaWxlcywgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9Jyk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUoZmlsZSkpO2BcbiAgICA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIC8vIFJlcGxhY2UgdGhlIEpTT04gb2JqZWN0IGZyb20gdGhlIGZpbGVcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC89XFxzKnsoW1xcU1xcc10qKX07LywgKF8sIHNldHRpbmdzVGV4dCkgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogdW5rbm93biA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeT8uaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZVswXS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzPy5wbHVnaW5zIHx8IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV1bMF0gOiBwbHVnaW5zW2ldO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgJiYgcGx1Z2luc1tpXVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlczogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCk7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXMuaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnNvcnQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBpbmNsdWRlOiBbXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdHMvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3RzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuLi8uLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4uLy4uL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBpbmNsdWRlOiBbJ3NyYy8qKi8qJywgJ3Rlc3RzLyoqLyonLCAnc2NyaXB0cy8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbnNKc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1N1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLFxuICAgICAgICBtb2R1bGU6ICdOb2RlTmV4dCcsXG4gICAgICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlTmV4dCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGlmIChvbGRTZXR0aW5ncy5leHRlbmRzID09PSAnLi9ub2RlX21vZHVsZXMvQHdpbGxib29zdGVyL3RzY29uZmlnL3RzY29uZmlnLmpzb24nKSB7XG4gICAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgbW9kaWZ5IFwidGFyZ2V0XCIsIFwibW9kdWxlXCIgYW5kIFwibW9kdWxlUmVzb2x1dGlvblwiLlxuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udGFyZ2V0O1xuICAgICAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlUmVzb2x1dGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18nKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCk7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoc2V0dGluZ3MgPz8ge30pO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IHVua25vd24ge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBvbjogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIGpvYnM6IHsgW2tleTogc3RyaW5nXTogSm9iIH07XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICBpc3N1ZXM/OiBUeXBlcztcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3Q7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcztcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICB1c2VzOiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICAncGF0aHMtaWdub3JlJzogWycqKi5tZCcsICcqKi9kb2NzLyoqJ10sXG4gICAgICB9LFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgICAgJ3BhdGhzLWlnbm9yZSc6IFsnKioubWQnLCAnKiovZG9jcy8qKiddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHdiZnk6IHtcbiAgICBuYW1lOiAnV2lsbGJvb3N0ZXJpZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHdiZnk6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy93YmZ5LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3diZnktbWVyZ2UnOiB7XG4gICAgbmFtZTogJ01lcmdlIHdiZnknLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICd3YmZ5LW1lcmdlJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3diZnktbWVyZ2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnbm90aWZ5LXJlYWR5Jzoge1xuICAgIG5hbWU6ICdOb3RpZnkgcmVhZHknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdub3RpZnktcmVhZHknOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvbm90aWZ5LXJlYWR5LnltbEBtYWluJyxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIERJU0NPUkRfV0VCSE9PS19VUkw6ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUFEWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHSF9QUk9KRUNUX1VSTDogJyR7eyBzZWNyZXRzLkdIX1BST0pFQ1RfVVJMIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0Jzoge1xuICAgIG5hbWU6ICdBZGQgcmVhZHkgaXNzdWUgdG8gR2l0SHViIHByb2plY3QnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hZGQtaXNzdWUtdG8tcHJvamVjdC55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBsYWJlbGVkOiAncmVhZHkgOnJvY2tldDonLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0hfUFJPSkVDVF9VUkw6ICdodHRwczovL2dpdGh1Yi5jb20vb3Jncy9XaWxsQm9vc3RlckxhYi9wcm9qZWN0cy81JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ3diZnkueW1sJyxcbiAgICAgICd3YmZ5LW1lcmdlLnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuaXNQdWJsaWNSZXBvIHx8IHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0LnltbCcpO1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdub3RpZnktcmVhZHkueW1sJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnYWRkLWZvY3VzZWQtaXNzdWUtdG8tcHJvamVjdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdID8/IHt9KSBhcyBXb3JrZmxvdztcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIGlmIChuZXdTZXR0aW5ncy5qb2JzKSB7XG4gICAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgfVxuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQ8c3RyaW5nPihbLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKSwgJyoqLm1kJywgJyoqL2RvY3MvKionXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzPy4oJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIHJldHVybjtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3diZnknOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24pIHNldFNjaGVkdWxlKG5ld1NldHRpbmdzLCAyMCwgMjQpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3diZnktbWVyZ2UnOiB7XG4gICAgICBzZXRTY2hlZHVsZShuZXdTZXR0aW5ncywgMSwgNCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIG1pZ3JhdGVXb3JrZmxvdyhuZXdTZXR0aW5ncyk7XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3NlbWFudGljLXJlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0gZWxzZSBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWluaXQueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmMgfHwgIW5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICghcGFyYW1zKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCB8fD0ge307XG4gIGpvYi5zZWNyZXRzIHx8PSB7fTtcblxuICBpZiAoXG4gICAga2luZCA9PT0gJ3Rlc3QnIHx8XG4gICAga2luZCA9PT0gJ3JlbGVhc2UnIHx8XG4gICAga2luZCA9PT0gJ3diZnknIHx8XG4gICAga2luZCA9PT0gJ3diZnktbWVyZ2UnIHx8XG4gICAga2luZCA9PT0gJ2FkZC1pc3N1ZS10by1wcm9qZWN0JyB8fFxuICAgIGtpbmQgPT09ICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdCdcbiAgKSB7XG4gICAgam9iLnNlY3JldHNbJ0dIX1RPS0VOJ10gPSBjb25maWcuaXNQdWJsaWNSZXBvID8gJyR7eyBzZWNyZXRzLlBVQkxJQ19HSF9CT1RfUEFUIH19JyA6ICcke3sgc2VjcmV0cy5HSF9CT1RfUEFUIH19JztcbiAgfVxuICBpZiAoY29uZmlnLnJlbGVhc2UubnBtICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnKSkge1xuICAgIGpvYi5zZWNyZXRzWydOUE1fVE9LRU4nXSA9ICcke3sgc2VjcmV0cy5OUE1fVE9LRU4gfX0nO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0c1snRklSRUJBU0VfVE9LRU4nXSkge1xuICAgIGpvYi5zZWNyZXRzWydHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFJ10gPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzWydGSVJFQkFTRV9UT0tFTiddO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHNbJ0RJU0NPUkRfV0VCSE9PS19VUkwnXSAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzWydESVNDT1JEX1dFQkhPT0tfVVJMJ10gPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGg/LnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMudG9TdHJpbmcoKS5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXMucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzLnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGhbJ2RvdF9lbnZfcGF0aCddO1xuICB9XG4gIC8vIFJlbW92ZSBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgbWlncmF0ZUpvYihqb2IpO1xuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0c1snRkxZX0FQSV9UT0tFTiddICYmIGpvYi53aXRoWydkZXBsb3lfY29tbWFuZCddKSB7XG4gICAgam9iLndpdGhbJ2RlcGxveV9jb21tYW5kJ10gPSBqb2Iud2l0aFsnZGVwbG95X2NvbW1hbmQnXS50b1N0cmluZygpLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNEb2NrZXJmaWxlKSB7XG4gICAgaWYgKGpvYi53aXRoWydjaV9zaXplJ10gIT09ICdleHRyYS1sYXJnZScgJiYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpKSB7XG4gICAgICBqb2Iud2l0aFsnY2lfc2l6ZSddID0gJ2xhcmdlJztcbiAgICB9XG4gICAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICAgIGpvYi53aXRoWydjcHVfYXJjaCddID0gJ1g2NCc7XG4gICAgfVxuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICd3YmZ5JyB8fCBraW5kID09PSAnd2JmeS1tZXJnZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aFsnZ2l0aHViX2hvc3RlZF9ydW5uZXInXSA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aFsnZ2l0aHViX2hvc3RlZF9ydW5uZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRTY2hlZHVsZShuZXdTZXR0aW5nczogV29ya2Zsb3csIGluY2x1c2l2ZU1pbkhvdXJKc3Q6IG51bWJlciwgZXhjbHVzaXZlTWF4SG91ckpzdDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IFttaW51dGVVdGMsIGhvdXJVdGNdID0gKChuZXdTZXR0aW5ncy5vbi5zY2hlZHVsZT8uWzBdPy5jcm9uIGFzIHN0cmluZykgPz8gJycpLnNwbGl0KCcgJykubWFwKE51bWJlcik7XG4gIGlmIChtaW51dGVVdGMgIT09IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihob3VyVXRjKSkge1xuICAgIGNvbnN0IGhvdXJKc3QgPSAoaG91clV0YyArIDkpICUgMjQ7XG4gICAgY29uc3QgaW5SYW5nZSA9XG4gICAgICBpbmNsdXNpdmVNaW5Ib3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdFxuICAgICAgICA/IGluY2x1c2l2ZU1pbkhvdXJKc3QgPD0gaG91ckpzdCAmJiBob3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdFxuICAgICAgICA6IGluY2x1c2l2ZU1pbkhvdXJKc3QgPD0gaG91ckpzdCB8fCBob3VySnN0IDwgZXhjbHVzaXZlTWF4SG91ckpzdDtcbiAgICBpZiAoaW5SYW5nZSkgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbWluSnN0ID0gMSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDU5KTtcbiAgY29uc3QgaG91ckpzdCA9IGluY2x1c2l2ZU1pbkhvdXJKc3QgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoZXhjbHVzaXZlTWF4SG91ckpzdCAtIGluY2x1c2l2ZU1pbkhvdXJKc3QpKTtcbiAgY29uc3QgY3JvbiA9IGAke21pbkpzdH0gJHsoaG91ckpzdCAtIDkgKyAyNCkgJSAyNH0gKiAqICpgO1xuICBuZXdTZXR0aW5ncy5vbi5zY2hlZHVsZSA9IFt7IGNyb24gfV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHtcbiAgICBsaW5lV2lkdGg6IC0xLFxuICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICBzdHlsZXM6IHtcbiAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgIH0sXG4gIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzOiBXb3JrZmxvdyk6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzWydhZGQtdG8tcHJvamVjdCddO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlSm9iKGpvYjogSm9iKTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgaWYgKCFqb2Iud2l0aCkgcmV0dXJuO1xuICBkZWxldGUgam9iLndpdGhbJ25vbl9zZWxmX2hvc3RlZCddO1xuICBkZWxldGUgam9iLndpdGhbJ25vdGlmeV9kaXNjb3JkJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsncmVxdWlyZV9mbHknXTtcbiAgZGVsZXRlIGpvYi53aXRoWydyZXF1aXJlX2djbG91ZCddO1xuICBkZWxldGUgam9iLndpdGhbJ2NwdV9hcmNoJ107XG4gIGRlbGV0ZSBqb2Iud2l0aFsnbGFiZWwnXTtcbiAgZGVsZXRlIGpvYi53aXRoWydsYWJlbE9wZXJhdG9yJ107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW50ZXJmYWNlIFNldHRpbmdzIGV4dGVuZHMgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+IHtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChnZXRNYWpvck51bWJlcihjdXJyZW50VmVyc2lvbikgPD0gZ2V0TWFqb3JOdW1iZXIobGF0ZXN0VmVyc2lvbikgJiYgY3VycmVudFZlcnNpb24gIT09IGxhdGVzdFZlcnNpb24pIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncztcbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbnMnLCAnLS1qc29uJ10sIGRpclBhdGgpO1xuICBjb25zdCB2ZXJzaW9ucyA9IEpTT04ucGFyc2UodmVyc2lvbnNKc29uKSBhcyBzdHJpbmdbXTtcbiAgcmV0dXJuIHZlcnNpb25zLmF0KC0xKSBhcyBzdHJpbmc7XG59XG5mdW5jdGlvbiBnZXRNYWpvck51bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3JdID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICByZXR1cm4gTnVtYmVyKG1ham9yKTtcbn1cbiIsImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuLCBvY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IGRlcHJlY2F0ZWRTZWNyZXROYW1lcyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCddO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkIHx8IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBkZXByZWNhdGVkU2VjcmV0TmFtZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvICYmIG5hbWUgPT09ICdHSF9CT1RfUEFUJykgY29udGludWU7XG4gICAgICAgIGlmICghY29uZmlnLmlzUHVibGljUmVwbyAmJiBuYW1lID09PSAnUFVCTElDX0dIX0JPVF9QQVQnKSBjb250aW51ZTtcblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCwgb2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgYXdhaXQgd2l0aFJldHJ5KCgpID0+XG4gICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLiDvvIjjgZPjga7jg5rjg7zjgrjjgacgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCDjgYzooajnpLrjgZXjgozjgabjgYTjgovjgZPjgajjgpLnorroqo3jgZfjgZ/jgILvvIlcbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAgIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gQWxsIHRlc3RzIGFyZSBwYXNzZWQuXG4gICAgLSBUZXN0IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gdGVzdFxcYCkgaXMgcGFzc2VkLlxuICAgIC0gTGludCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIGxpbnRcXGApIGlzIHBhc3NlZC5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiBHaXRIdWIgUFIncyBkaWZmIHZpZXcuIO+8iEdpdEh1YuS4iuOBp+iHquWIhuOBruWkieabtOWGheWuueOCkueiuuiqjeOBl+OBn+OAgu+8iVxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy4g77yI44OG44K544OI5omL6aCG44KS6KiY6LyJ44GX44Gf44CC77yJXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzLiDvvIhVSeOCkuWkieabtOOBl+OBn+WgtOWQiOOAgeOCueOCr+ODquODvOODs+OCt+ODp+ODg+ODiOOCkui/veWKoOOBl+OBn+OAgu+8iVxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuXG48IS0tIOaXpeacrOiqnuOBp+iomOi/sOOBl+OBpuOCguWkp+S4iOWkq+OBp+OBmeOAgiAtLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCkgPiBuZXdDb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JieVN5bmMgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnaXRIdWJVdGlsLCBvY3Rva2l0IH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNTdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0RvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0dlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0dvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNQdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG5cbiAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbnNUeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5zSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBlc2xpbnRCYXNlPzogRXNsaW50RXh0ZW5zaW9uQmFzZTtcbiAgdmVyc2lvbnNUZXh0Pzogc3RyaW5nO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpbnNQYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5zUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KTtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVsZWFzZXJjSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY0pzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzIHx8IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgfHwgW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb25zVGV4dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKTtcbiAgICAgIHZlcnNpb25zVGV4dCArPSBjb250ZW50LnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJlZml4LCBuYW1lXSBvZiBbXG4gICAgICBbJ2phdmEnLCAnamF2YSddLFxuICAgICAgWydub2RlJywgJ25vZGVqcyddLFxuICAgICAgWydweXRob24nLCAncHl0aG9uJ10sXG4gICAgXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgbm9kZVZlcnNpb25Db250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCksICd1dGY4Jyk7XG4gICAgICAgIGlmICh2ZXJzaW9uc1RleHQpIHtcbiAgICAgICAgICB2ZXJzaW9uc1RleHQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgdmVyc2lvbnNUZXh0ICs9IG5hbWUgKyAnICcgKyBub2RlVmVyc2lvbkNvbnRlbnQudHJpbSgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5OiByZXBvSW5mbz8uZnVsbF9uYW1lID8gYGdpdGh1Yjoke3JlcG9JbmZvPy5mdWxsX25hbWV9YCA6IHVuZGVmaW5lZCxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuZmlnLnRvbWwnKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKSxcbiAgICAgIGRvZXNDb250YWluc1N1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNHZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluc0dvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbnNQb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpbnNQb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5zSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3RzLHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5zSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0c30vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbnNKYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0cyxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLFxuICAgICAgICBkaXJQYXRoXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdHMsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgZGlyUGF0aFxuICAgICAgKSxcbiAgICAgIGRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3RzfS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXNbJ2JsaXR6J10sXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzWyduZXh0J10sXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHxcbiAgICAgICAgICAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8XG4gICAgICAgICAgISFkZXZEZXBlbmRlbmNpZXNbJ3BsYXl3cmlnaHQnXSxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llc1sncHJpc21hJ10sXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzWydweXJpZ2h0J10sXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9uc1RleHQsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluc0dvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNQb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5zUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbnNUZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdsb2JieVN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCc7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCkge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5zSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc0pzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNKYXZhU2NyaXB0KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJztcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcz8uZmV0Y2ggPz8gb3JpZ2luPy5yZWZzPy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVG9vbFZlcnNpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FzZGYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCaW9tZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Jpb21lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lc2xpbnRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lc2xpbnRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbmV4dGNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Y29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKSBhcyBQYWNrYWdlQ29uZmlnW107XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIHRvb2xzIHZpYSBhc2RmIGF0IGZpcnN0XG4gICAgYXdhaXQgZ2VuZXJhdGVUb29sVmVyc2lvbnMocm9vdENvbmZpZyk7XG4gICAgLy8gSW5zdGFsbCB5YXJuIGJlcnJ5XG4gICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZml4RG9ja2VyZmlsZShyb290Q29uZmlnKSxcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFNlY3JldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHJvb3RDb25maWcuaXNCdW5cbiAgICAgICAgPyBbXG4gICAgICAgICAgICBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyksXG4gICAgICAgICAgICBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLnRoZW4oKCkgPT4gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykpLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKV0pLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4VHlwZURlZmluaXRpb25zKGNvbmZpZywgY29uZmlnLmlzUm9vdCA/IGFsbFBhY2thZ2VDb25maWdzIDogW2NvbmZpZ10pKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIGFyZ3Yuc2tpcERlcHMpO1xuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbnNWc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluc1BhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5zVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5zSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzXG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50cmMoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUVzbGludGlnbm9yZShjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICAgIC8vICd5YXJuIGluc3RhbGwnIHNob3VsZCBiZSBhZnRlciBgeWFybiBjbGVhbnVwYCBiZWNhdXNlIHlhcm4gYmVycnkgZ2VuZXJhdGVzIHlhcm4ubG9ja1xuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIGRlcGVuZGFudCBzdWItcGFja2FnZSBpbiBtb25vcmVwb1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsndXBkYXRlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImNvbnN0cnVjdG9yIiwidGhpcyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbnNEb2NrZXJmaWxlIiwib2xkQ29udGVudCIsImRvY2tlcmZpbGUiLCJuZXdDb250ZW50IiwiZnMiLCJ3cml0ZUZpbGUiLCJwYXRoIiwiam9pbiIsImRpclBhdGgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZmlsZVBhdGgiLCJleGlzdHNTeW5jIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInJlcGxhY2UiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZ2xvYmJ5IiwiZG90IiwiY3dkIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwicmVzb2x2ZSIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwib2xkVGVzdERpclBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwicmVuYW1lIiwicmVwbGFjZUFsbCIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5zU3ViUGFja2FnZUpzb25zIiwidW5kZWZpbmVkIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJoYXNMaWJyYXJ5Iiwic29tZSIsInBhY2thZ2VKc29uIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwibWtkaXIiLCJydW4iLCJyZWN1cnNpdmUiLCJpc0RpcmVjdG9yeSIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZzcCIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsImdpdGlnbm9yZSIsImxlbmd0aCIsIm1kRmlsZSIsImZpeEFiYnJldmlhdGlvbnNJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIk9iamVjdCIsImVudHJpZXMiLCJ3YmZ5SnNvbiIsInR5cG9zIiwidG9rZW4iLCJwcm9jZXNzIiwiZW52IiwiR0hfQk9UX1BBVCIsIlBVQkxJQ19HSF9CT1RfUEFUIiwiR0hfVE9LRU4iLCJHSVRIVUJfVE9LRU4iLCJoYXNHaXRIdWJUb2tlbiIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsInNwbGl0IiwiYXQiLCJuYW1lcyIsInNwYXduU3luYyIsImNvbW1hbmQiLCJhcmdzIiwicmV0cnkiLCJuZXdDbWQiLCJuZXdBcmdzIiwiZ2V0U3Bhd25TeW5jQXJncyIsImNoaWxkX3Byb2Nlc3MiLCJzdGF0dXMiLCJzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0Iiwic3RkaW8iLCJwcm9jIiwic3RkZXJyIiwidG9TdHJpbmciLCJ0cmltIiwicyIsInN0ZG91dCIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiQVNERl9ESVIiLCJzaGVsbCIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwiZmlsdGVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiQkxJVFpfVkVSU0lPTiIsIk5FWFRfVkVSU0lPTiIsImdlbmVyYXRlVG9vbFZlcnNpb25zIiwidmVyc2lvbnNUZXh0IiwiZHVwbGljYXRhYmxlTGluZXMiLCJsaW5lIiwiQ09SRV9UT09MUyIsImhhcyIsInNvcnQiLCJsaW5lcyIsIlNldCIsImRvZXNDb250YWluc1BvZXRyeUxvY2siLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsInBvZXRyeVZlcnNpb24iLCJ1cGRhdGVWZXJzaW9uIiwiZGVwZW5kaW5nIiwiZmlyZWJhc2UiLCJkb2VzQ29udGFpbnNQYWNrYWdlSnNvbiIsImlzQnVuIiwibGVmdGhvb2tWZXJzaW9uIiwiZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1YiIsImJ1blZlcnNpb24iLCJwcmVmaXgiLCJERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMiLCJ2ZXJzaW9uUGF0aCIsInJtIiwiZm9yY2UiLCJ0b29sVmVyc2lvbnNQYXRoIiwiY29yZSIsInRvb2xOYW1lIiwibmV3VmVyc2lvbiIsImhlYWQiLCJpbmRleCIsImZpbmRJbmRleCIsImwiLCJuZXdMaW5lIiwic3BsaWNlIiwib3JnYW5pemF0aW9uIiwicmVwb3NpdG9yeSIsInJlcXVlc3QiLCJvd25lciIsInJlcG8iLCJkYXRhIiwidGFnX25hbWUiLCJsYXN0SW5kZXhPZiIsInZlcnNpb25OdW1iZXJUZXh0IiwidGVzdCIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0Iiwic291cmNlIiwiZGVzdGluYXRpb24iLCJpdGVtIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsIm1lcmdlIiwicHVzaCIsImpzb25PYmoiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsImdlbmVyYXRlQmlvbWVKc29uYyIsIm5ld1NldHRpbmdzIiwiY2xvbmVEZWVwIiwib2xkU2V0dGluZ3MiLCJKU09OIiwicGFyc2UiLCJhcnJheU1lcmdlIiwic3RyaW5naWZ5IiwiZ2VuZXJhdGVCdW5maWdUb21sIiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJpbmRleE9mIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwiY29kZVdpdGg4SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiYmlvbWUiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnZW5lcmF0ZUVzbGludHJjIiwicm9vdENvbmZpZyIsImJhc2VzIiwiZXNsaW50QmFzZSIsInJvb3QiLCJleHQiLCJzdGFydHNXaXRoIiwibmV3RXh0ZW5kcyIsImJsaXR6IiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJkb2VzQ29udGFpbnNHZW1maWxlIiwiZG9lc0NvbnRhaW5zR29Nb2QiLCJiYXNlbmFtZSIsImRvZXNDb250YWluc1BvbVhtbCIsImRvZXNDb250YWluc1B1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5zVGVtcGxhdGVZYW1sIiwibmV4dCIsInByaXNtYSIsInBsYXl3cmlnaHRUZXN0IiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwidXJsIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImdldExhdGVzdENvbW1pdEhhc2giLCJjb21taXRzIiwicGVyX3BhZ2UiLCJzaGEiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluc0pzeE9yVHN4Iiwic3JjRGlyZWN0b3JpZXMiLCJub2RlIiwiZ2V0U3JjRGlycyIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsInNjcmlwdHMiLCJwZWVyRGVwZW5kZW5jaWVzIiwiYXV0aG9yIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJkZXBzIiwidmFsdWVzIiwiZGVwIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwia2V5IiwidmFsdWUiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJwcmVwYXJlIiwicG9zdGluc3RhbGwiLCJpc1B1YmxpY1JlcG8iLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJwcmVwYWNrIiwicG9zdHBhY2siLCJzZW1hbnRpY1JlbGVhc2UiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYmJ5U3luYyIsIndiIiwiZG9lc0NvbnRhaW5zSmF2YVNjcmlwdCIsImRvZXNDb250YWluc0phdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5zVHlwZVNjcmlwdCIsImRvZXNDb250YWluc1R5cGVTY3JpcHRJblBhY2thZ2VzIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImNsZWFudXAiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJpZ25vcmUiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiYWRkIiwic2l6ZSIsImRpck5hbWVzU3RyIiwiZCIsImtleXMiLCJwYWNrYWdlTmFtZXMiLCJjb21taXRIYXNoIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsInBhY2thZ2VNYW5hZ2VyIiwidHlwZWNoZWNrIiwib2xkVGVzdCIsInB5cmlnaHQiLCJwcmVDb21taXQiLCJwcmVQdXNoIiwicHJlUHVzaEZvckxhYiIsInBvc3RNZXJnZSIsImdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlSnNvblBhdGgiLCJwcmVDb21taXRGaWxlUGF0aCIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInBvc3RNZXJnZUNvbW1hbmRzIiwiU3RyaW5nIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY29tbWFuZHMiLCJnbG9iIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJ5YW1sIiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsIm1rZGlyU3luYyIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZW5lcmF0ZU5leHRDb25maWdKc29uIiwiZmluZCIsInAiLCJfIiwic2V0dGluZ3NUZXh0IiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJmaWxlTmFtZSIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJzZXR0aW5ncyIsInBsdWdpbnMiLCJwbHVnaW4iLCJvbGRDb25maWciLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudCIsImZhaWxDb21tZW50IiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImRlY2xhcmF0aW9uIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsIm91dERpciIsInR5cGVSb290cyIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluc0pzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwid29ya2Zsb3dzIiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwidXNlcyIsInJlbGVhc2UiLCJ3YmZ5Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwic2VjcmV0cyIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJHSF9QUk9KRUNUX1VSTCIsIndpdGgiLCJsYWJlbGVkIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZmlsZU5hbWVTZXQiLCJraW5kIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJsb2FkIiwibW92ZVRvQm90dG9tIiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzZXRTY2hlZHVsZSIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIm5wbSIsInNlcnZlcl91cmwiLCJtaWdyYXRlSm9iIiwibmV3U2VjcmV0cyIsImluY2x1c2l2ZU1pbkhvdXJKc3QiLCJleGNsdXNpdmVNYXhIb3VySnN0IiwibWludXRlVXRjIiwiaG91clV0YyIsImNyb24iLCJpc0ludGVnZXIiLCJob3VySnN0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwieWFtbFRleHQiLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiZGVwcmVjYXRlZFNlY3JldE5hbWVzIiwic2V0dXBTZWNyZXRzIiwicGFyc2VkIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImFsbG93X2F1dG9fbWVyZ2UiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6Iiwib2JqZWN0IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJ0cyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwicmVhZEZpbGVTeW5jIiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5zVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInRoZW4iXSwibWFwcGluZ3MiOiJnb0JBVU8s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
|