build-ts 13.2.3 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readAndApplyEnvironmentVariables as e,yargsOptionsBuilderForEnv as o,removeNpmAndYarnEnvironmentVariables as n}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import t from"node:fs";import r from"node:path";import c from"chalk";import a from"date-time";import p from"pretty-ms";import{rollup as l,watch as d}from"rollup";import{onExit as u}from"signal-exit";import m from"node:url";import{babel as f}from"@rollup/plugin-babel";import y from"@rollup/plugin-commonjs";import g from"@rollup/plugin-json";import b from"@rollup/plugin-node-resolve";import h from"@rollup/plugin-replace";import j from"@rollup/plugin-terser";import v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import k from"rollup-plugin-preserve-directives";import{string as S}from"rollup-plugin-string";import $ from"node:process";import E from"typescript";import*as D from"node:child_process";let O;function T(o,n){return O||(O=e(o,n),o.verbose&&console.info("Loaded env vars:",Object.keys(O))),O}function F(e,o){const n={},s=new Set([...(e.inline??[]).flatMap((e=>e.toString().split(","))),...Object.keys(T(e,o))]);for(const e of s)void 0!==process.env[e]&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(n)),n}const _=["app","functions","lib"];async function N(e){const o=r.join(e,"package.json");try{const e=await t.promises.readFile(o,"utf8");return[JSON.parse(e),o]}catch{}return[void 0,o]}const B={...o,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},R={...B,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"},bundleBuiltins:{description:"Module names same with builtins (e.g., undici) to be bundled.",type:"array"}},C={...R,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},L={...C,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},A={...R,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function I(e,o,n,s,i,c){const a=[...e.external??[]].map((e=>e.toString()));if(n.dependencies?.["@prisma/client"]&&a.push("prisma-client"),a.push(...Object.keys(n.dependencies??{}),...Object.keys(n.peerDependencies??{}),...Object.keys(n.optionalDependencies??{})),t.existsSync(r.join("..","..","package.json"))){const e=t.readdirSync(r.join(".."),{withFileTypes:!0});for(const o of e){if(!o.isDirectory())continue;const e=r.join("..",o.name,"package.json");if(!t.existsSync(e))continue;const s=JSON.parse(t.readFileSync(e,"utf8"));n.dependencies?.[s.name??""]&&a.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=r.join(m.fileURLToPath(r.dirname(r.dirname(import.meta.url))),"babel.config.mjs"),d=[h({delimiters:["",""],preventAssignment:!0,values:F(e,i)}),g(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:a.map((e=>new RegExp(`^${e}(?:\\/.+)?`))),exclude:s&&new RegExp(`^@?${s}(?:\\/.+)?`)}),b({extensions:p,preferBuiltins:o=>!e.bundleBuiltins?.includes(o)}),y(),w({moduleNames:[...e.keepImport?.map((e=>e.toString()))??[],"undici"]})],u="app-node"===o||"functions"===o||!a.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=u?"":"1",d.push(f({configFile:l,extensions:p,babelHelpers:u?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...c.some((e=>e.preserveModules))?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),e.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(e,o){const n=E.findConfigFile(o,E.sys.fileExists);if(!n)throw new Error(`Failed to find tsconfig.json in ${o}.`);e.verbose&&console.info("Found tsconfig.json:",n);const s=[];let i=r.join("dist",r.basename(o),"src");if(t.existsSync(i)){const e=r.dirname(o),n=await t.promises.readdir(e,{withFileTypes:!0});o=r.resolve(o);for(const i of n){if(!i.isDirectory())continue;const n=r.resolve(e,i.name);if(n===o)continue;const c=E.findConfigFile(n,E.sys.fileExists),a=r.join("dist",i.name,"src");c&&t.existsSync(a)&&s.push([n,c,a])}}else i="dist";s.push([o,n,i]);let c=!0;for(const[n,i,t]of s)c&&=U(e,n,i,r.join(o,t));return c}function U(e,o,n,s){e.verbose&&console.info("runTypeScriptCompiler()",o,n,s);const{config:i}=E.readConfigFile(n,E.sys.readFile);i.compilerOptions={...i.compilerOptions,declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:s},i.include=["src/**/*"];const{errors:t,fileNames:r,options:c}=E.parseJsonConfigFileContent(i,E.sys,o),a=E.createProgram({options:c,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=a.emit(),d=[...E.getPreEmitDiagnostics(a),...p,...t];if(d.length>0){const e={getCanonicalFileName:e=>e,getCurrentDirectory:E.sys.getCurrentDirectory,getNewLine:()=>E.sys.newLine},o=E.formatDiagnostics(d,e);console.warn(o)}return!l}const W={command:"app [package]",describe:"Build an app",builder:C,handler:async e=>G(e,"app")},J={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:L,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const o=r.resolve(e.package?.toString()??"."),[n,s]=await N(o);n||(console.error(`Failed to parse package.json (${s}).`),process.exit(1)),await H(o,n,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:A,handler:async e=>G(e,"lib")};async function G(e,o){process.env.NODE_ENV||="production";const n=!e.silent&&e.verbose,s=process.cwd(),i=r.resolve(e.package?.toString()??"."),[m,f]=await N(i);m||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),T(e,i);const y=function(e,o,n){if(e.input&&e.input.length>0)return e.input.map((e=>r.join(o,e.toString())));const s=r.join(n,"src");for(const e of["ts","tsx","cts","mts"]){const o=r.join(s,`index.${e}`);if(t.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(e,s,i),g=function(e,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return o.some((e=>e.endsWith(".tsx")))?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,y);n&&(console.info("argv:",e),console.info("packageJsonPath:",f),console.info("Target (Category):",`${g} (${o})`));const[b]=function(e){const o=e.name?.toString()||"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n||[];return[s,i]}(m),h="module"===m.type;e["core-js"]?process.env.BUILD_TS_COREJS="1":e["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),n&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=g;const j=function(e,o,n,s){const i=r.join(n,"dist");if("app-node"===o||"functions"===o)return[{dir:i,format:V(s,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const t=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&!s?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===c||"both"===c||"either"===c&&s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&s?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return t}(e,g,i,h);n&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await t.promises.rm(r.join(i,"dist"),{recursive:!0,force:!0}),"functions"===g&&await H(i,m,e.moduleType);const v={input:"functions"===g?Object.fromEntries(y.map(((e,o)=>[0===o?"index":r.basename(e,r.extname(e)),e]))):y,plugins:I(e,g,m,b,i,j),watch:e.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map((e=>r.relative(i,e)));if(e.watch)!function(e,o,n,s,i,t){const r=d({...s,output:i}),l=async e=>{process.removeListener("uncaughtException",l),process.stdin.removeListener("end",l),r&&await r.close(),e&&process.exit(e)};u(l),process.on("uncaughtException",l),process.stdin.isTTY||(process.stdin.on("end",l),process.stdin.resume());r.on("event",(async s=>{switch(s.code){case"ERROR":!function(e,o=!1){const n=e.name||e.cause?.name,s=n?`${n}: `:"",i=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,t=[c.bold(c.red(`[!] ${c.bold(i.toString())}`))];e.url&&t.push(c.cyan(e.url)),e.loc?t.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&t.push(e.id),e.frame&&t.push(c.dim(e.frame)),e.stack&&t.push(c.dim(e.stack?.replace(`${s}${e.message}\n`,""))),t.push("",""),console.error(t.join("\n")),o||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const o=s.input,i=[];"string"==typeof o?i.push(o):i.push(...Array.isArray(o)?o:Object.values(o)),console.info(c.cyan(`Bundles ${c.bold(t(i).join(", "))} → ${c.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(t(s.output).join(", "))} in ${c.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()}))}(e,g,i,v,j,w);else{let o;e.silent||console.info(c.cyan(`Bundles ${c.bold(w(y).join(", "))} → ${c.bold(w(j.map((e=>e.file||e.dir||""))).join(", "))}\non ${i} ...`));let n=!1;try{const n=Date.now(),s=await l(v);o=s,await Promise.all(j.map((e=>s.write(e)))),e.silent||console.info(c.green(`Created ${w(j.map((e=>e.file||e.dir||""))).join(", ")} in ${c.bold(p(Date.now()-n))}`))}catch(e){n=!0,console.error("Failed to build due to:",e)}await(o?.close()),n&&process.exit(1),"app-node"===g||"functions"===g||await P(e,i)||process.exit(1)}}async function H(e,o,n){o.name+="-dist";const s="module"===o.type,i=V(s,n);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await t.promises.mkdir(r.join(e,"dist"),{recursive:!0}),await t.promises.writeFile(r.join(e,"dist","package.json"),JSON.stringify(o))}function V(e,o){return"esm"===o||(!o||"either"===o)&&e}const Y={command:"run <file>",describe:"Run script",builder:{...B,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){T(e,process.cwd());const o=e.file?.toString()||"",n=process.versions.bun,s=n?"bun":"node",i=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&i.push("--watch"),i.push(o);const[,...t]=e._,r=[...i,...t.map((e=>e.toString()))];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const c=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};n(process.env),await s(i(process.argv)).scriptName("build-ts").options(B).command(W).command(J).command(M).command(Y).demandCommand().strict().help().argv;
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi5PYmplY3Qua2V5cyhsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgY3dkKSksXG4gIF0pO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbbmFtZV0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBlbnZWYXJzRGVmW2Bwcm9jZXNzLmVudi4ke25hbWV9YF0gPSBKU09OLnN0cmluZ2lmeShwcm9jZXNzLmVudltuYW1lXSk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnSW5saW5lIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnNEZWYpKTtcbiAgfVxuICByZXR1cm4gZW52VmFyc0RlZjtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzLCBPcHRpb25zIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0Q2F0ZWdvcmllcyA9IFsnYXBwJywgJ2Z1bmN0aW9ucycsICdsaWInXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0Q2F0ZWdvcnkgPSAodHlwZW9mIGFsbFRhcmdldENhdGVnb3JpZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBhbGxUYXJnZXREZXRhaWxzID0gWydhcHAtbm9kZScsICdmdW5jdGlvbnMnLCAnbGliJywgJ2xpYi1yZWFjdCddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYXJnZXREZXRhaWwgPSAodHlwZW9mIGFsbFRhcmdldERldGFpbHMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIEFyZ3VtZW50c1R5cGU8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogT3B0aW9ucyB9PiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPFQ+PjtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdXJsIGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxbUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHN0cmluZ10+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgcmV0dXJuIFtKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF07XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgcGFja2FnZUpzb25QYXRoXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkVHNSb290UGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gdXJsLmZpbGVVUkxUb1BhdGgocGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShpbXBvcnQubWV0YS51cmwpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZF0ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VKc29uLm5hbWU/LnRvU3RyaW5nKCkgfHwgJyc7XG4gIGNvbnN0IG1hdGNoID0gL0AoW14vXSspXFwvKC4rKS8uZXhlYyhwYWNrYWdlTmFtZSk7XG4gIGNvbnN0IFssIG5hbWVzcGFjZSwgbmFtZV0gPSBtYXRjaCB8fCBbXTtcbiAgcmV0dXJuIFtuYW1lc3BhY2UsIG5hbWVdO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdzJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBpbnB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGhzIG9mIHNvdXJjZSBjb2RlIGZpbGVzIHRvIGJlIGJ1aWx0LiBUaGUgZmlyc3QgZmlsZSBpcyBtYWluLiBJZiBubyBvcHRpb24gaXMgZ2l2ZW4sIFwic3JjL2luZGV4Lnt0cyx0c3h9XCIgZnJvbSBwYWNrYWdlIGRpcmVjdG9yeSBpcyB0YXJnZXRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdpJyxcbiAgfSxcbiAgJ2NvcmUtanMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICAnY29yZS1qcy1wcm9wb3NhbHMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIHdpdGggcHJvcG9zYWxzIHN1cHBvcnQgaXMgZW1wbG95ZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIG1pbmlmeToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgbWluaWZpY2F0aW9uIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgc291cmNlbWFwOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBzb3VyY2VtYXAgaXMgZW5hYmxlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBleHRlcm5hbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBleHRlcm5hbCBkZXBlbmRlbmNpZXMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBpbmxpbmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Vudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmxpbmVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gIGtlZXBJbXBvcnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lkZW50aWZpZXJzIHRvIGJlIGtlcHQgYXMgaW1wb3J0IHN0YXRlbWVudHMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBidW5kbGVCdWlsdGluczoge1xuICAgIGRlc2NyaXB0aW9uOiAnTW9kdWxlIG5hbWVzIHNhbWUgd2l0aCBidWlsdGlucyAoZS5nLiwgdW5kaWNpKSB0byBiZSBidW5kbGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBhcHBCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgb3IgZWl0aGVyIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zQnVpbGRlciA9IHtcbiAgLi4uYXBwQnVpbGRlcixcbiAgb25seVBhY2thZ2VKc29uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIGdlbmVyYXRlIG9ubHkgcGFja2FnZS5qc29uLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGxpYkJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG1vZHVsZVR5cGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2VzbSwgY2pzLCBlaXRoZXIsIG9yIGJvdGggKGRlZmF1bHQpLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgLy8gLmpzIGZpbGVzIGluIGEgcGFja2FnZSB3aXRoIGBcInR5cGVcIjogXCJtb2R1bGVcImAgYXJlIHRyZWF0ZWQgYXMgZXNtLlxuICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIHRyZWF0IHRoZW0gYXMgY2pzIGluIHRoZSBjYXNlIHdoZXJlIGEgY2pzIHByb2plY3QgaW1wb3J0cyBhbiBlc20gcGFja2FnZS5cbiAgLy8gVG8gZGVhbCB3aXRoIHRoZSBjYXNlLCB3ZSB1c2UgLmNqcyBhbmQgLm1qcyBleHRlbnNpb25zIGluc3RlYWQgb2YgLmpzIGV4dGVuc2lvbi5cbiAganNFeHRlbnNpb246IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gdXNlIC5qcyBpbiBjanMgYW5kL29yIGVzbTogZWl0aGVyIChkZWZhdWx0KSwgYm90aCwgb3Igbm9uZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnaicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBbnlCdWlsZGVyVHlwZSA9IHR5cGVvZiBhcHBCdWlsZGVyIHwgdHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXIgfCB0eXBlb2YgbGliQnVpbGRlcjtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGJhYmVsIH0gZnJvbSAnQHJvbGx1cC9wbHVnaW4tYmFiZWwnO1xuaW1wb3J0IGNvbW1vbmpzIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWNvbW1vbmpzJztcbmltcG9ydCBqc29uIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWpzb24nO1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnQHJvbGx1cC9wbHVnaW4tbm9kZS1yZXNvbHZlJztcbmltcG9ydCByZXBsYWNlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXJlcGxhY2UnO1xuaW1wb3J0IHRlcnNlciBmcm9tICdAcm9sbHVwL3BsdWdpbi10ZXJzZXInO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRPcHRpb25zLCBQbHVnaW4gfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IGFuYWx5emUgZnJvbSAncm9sbHVwLXBsdWdpbi1hbmFseXplcic7XG5pbXBvcnQgeyBrZWVwSW1wb3J0IH0gZnJvbSAncm9sbHVwLXBsdWdpbi1rZWVwLWltcG9ydCc7XG5pbXBvcnQgeyBub2RlRXh0ZXJuYWxzIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1ub2RlLWV4dGVybmFscyc7XG5pbXBvcnQgcHJlc2VydmVEaXJlY3RpdmVzIGZyb20gJ3JvbGx1cC1wbHVnaW4tcHJlc2VydmUtZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICdyb2xsdXAtcGx1Z2luLXN0cmluZyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRUc1Jvb3RQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQbHVnaW5zKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW11cbik6IFBsdWdpbltdIHtcbiAgY29uc3QgZXh0ZXJuYWxEZXBzID0gWy4uLihhcmd2LmV4dGVybmFsID8/IFtdKV0ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpO1xuICBpZiAocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ0BwcmlzbWEvY2xpZW50J10pIHtcbiAgICBleHRlcm5hbERlcHMucHVzaCgncHJpc21hLWNsaWVudCcpO1xuICB9XG4gIC8vIFNpbmNlIGBkZXBzOiB0cnVlYCBkb2VzIG5vdCB3b3JrIGZvciBgaW1wb3J0IGNodW5rIGZyb20gJ2xvZGFzaC5jaHVuay9pbmRleC5qcyc7YFxuICBleHRlcm5hbERlcHMucHVzaChcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9KVxuICApO1xuICAvLyBBZGQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZyb20gc2libGluZyBwYWNrYWdlc1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXJzID0gZnMucmVhZGRpclN5bmMocGF0aC5qb2luKCcuLicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlRGlyIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgICBpZiAoIXBhY2thZ2VEaXIuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbignLi4nLCBwYWNrYWdlRGlyLm5hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgb3RoZXJQYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW290aGVyUGFja2FnZUpzb24ubmFtZSA/PyAnJ10pIHtcbiAgICAgICAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBleHRlbnNpb25zID0gWycuY2pzJywgJy5tanMnLCAnLmpzJywgJy5qc3gnLCAnLmpzb24nLCAnLmN0cycsICcubXRzJywgJy50cycsICcudHN4J107XG4gIGNvbnN0IGJhYmVsQ29uZmlnUGF0aCA9IHBhdGguam9pbihnZXRCdWlsZFRzUm9vdFBhdGgoKSwgJ2JhYmVsLmNvbmZpZy5tanMnKTtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSBbXG4gICAgcmVwbGFjZSh7XG4gICAgICAvLyBJZ25vcmUgd29yZCBib3VuZGFyaWVzIGFuZCByZXBsYWNlIGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBzdHJpbmcuXG4gICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL3RyZWUvbWFzdGVyL3BhY2thZ2VzL3JlcGxhY2Ujd29yZC1ib3VuZGFyaWVzXG4gICAgICBkZWxpbWl0ZXJzOiBbJycsICcnXSxcbiAgICAgIHByZXZlbnRBc3NpZ25tZW50OiB0cnVlLFxuICAgICAgdmFsdWVzOiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIH0pLFxuICAgIGpzb24oKSxcbiAgICBub2RlRXh0ZXJuYWxzKHtcbiAgICAgIGRlcHM6IHRydWUsXG4gICAgICBkZXZEZXBzOiBmYWxzZSxcbiAgICAgIHBlZXJEZXBzOiB0cnVlLFxuICAgICAgb3B0RGVwczogdHJ1ZSxcbiAgICAgIGluY2x1ZGU6IGV4dGVybmFsRGVwcy5tYXAoKG5hbWUpID0+IG5ldyBSZWdFeHAoYF4ke25hbWV9KD86XFxcXC8uKyk/YCkpLFxuICAgICAgZXhjbHVkZTogbmFtZXNwYWNlICYmIG5ldyBSZWdFeHAoYF5APyR7bmFtZXNwYWNlfSg/OlxcXFwvLispP2ApLFxuICAgIH0pLFxuICAgIHJlc29sdmUoe1xuICAgICAgZXh0ZW5zaW9ucyxcbiAgICAgIHByZWZlckJ1aWx0aW5zOiAoaWQ6IHN0cmluZykgPT4gIWFyZ3YuYnVuZGxlQnVpbHRpbnM/LmluY2x1ZGVzKGlkKSxcbiAgICB9KSxcbiAgICBjb21tb25qcygpLFxuICAgIGtlZXBJbXBvcnQoeyBtb2R1bGVOYW1lczogWy4uLihhcmd2LmtlZXBJbXBvcnQ/Lm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKSA/PyBbXSksICd1bmRpY2knXSB9KSxcbiAgXTtcbiAgY29uc3QgaXNCYWJlbEhlbHBlcnNCdW5kbGVkID1cbiAgICB0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJyB8fCAhZXh0ZXJuYWxEZXBzLmluY2x1ZGVzKCdAYmFiZWwvcnVudGltZScpO1xuICBwcm9jZXNzLmVudi5CVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FID0gaXNCYWJlbEhlbHBlcnNCdW5kbGVkID8gJycgOiAnMSc7XG4gIHBsdWdpbnMucHVzaChcbiAgICBiYWJlbCh7XG4gICAgICBjb25maWdGaWxlOiBiYWJlbENvbmZpZ1BhdGgsXG4gICAgICBleHRlbnNpb25zLFxuICAgICAgLy8gV2UgbmVlZCBgcnVudGltZSBzaW5jZSBgYnVuZGxlZGAgbWF5IGJyZWFrIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYnkgY3JlYXRpbmcgX3ZpcnR1YWwgZGlyZWN0b3J5LlxuICAgICAgYmFiZWxIZWxwZXJzOiBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnYnVuZGxlZCcgOiAncnVudGltZScsXG4gICAgICBleGNsdWRlOiAvXiguK1xcLyk/bm9kZV9tb2R1bGVzXFwvLiskLyxcbiAgICB9KSxcbiAgICAuLi4ob3V0cHV0T3B0aW9uc0xpc3Quc29tZSgob3B0cykgPT4gb3B0cy5wcmVzZXJ2ZU1vZHVsZXMpID8gW3ByZXNlcnZlRGlyZWN0aXZlcygpXSA6IFtdKSxcbiAgICBzdHJpbmcoeyBpbmNsdWRlOiBbJyoqLyouY3N2JywgJyoqLyoudHh0J10gfSlcbiAgKTtcbiAgaWYgKGFyZ3YubWluaWZ5KSB7XG4gICAgcGx1Z2lucy5wdXNoKHRlcnNlcih7IGNvbXByZXNzOiB7IGRpcmVjdGl2ZXM6IGZhbHNlIH0gfSkpO1xuICB9XG4gIHBsdWdpbnMucHVzaChhbmFseXplKHsgc3VtbWFyeU9ubHk6IHRydWUgfSkpO1xuICByZXR1cm4gcGx1Z2lucztcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG4vLyBXZSBjYW5ub3QgdXNlIG5hbWVkIGltcG9ydHMgZnJvbSAndHlwZXNjcmlwdCcgYmVjYXVzZSBvZiBidWlsZCBlcnJvcnMuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gIGlmICghY29yZUNvbmZpZ0ZpbGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgdHNjb25maWcuanNvbiBpbiAke2NvcmVQcm9qZWN0RGlyUGF0aH0uYCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0ZvdW5kIHRzY29uZmlnLmpzb246JywgY29yZUNvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGxldCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBwYXRoLmJhc2VuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCksICdzcmMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29yZVByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChwcm9qZWN0RGlyUGF0aCA9PT0gY29yZVByb2plY3REaXJQYXRoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHRzLmZpbmRDb25maWdGaWxlKHByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gICAgICBjb25zdCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBkaXJlbnQubmFtZSwgJ3NyYycpO1xuICAgICAgaWYgKGNvbmZpZ0ZpbGUgJiYgZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgICAgIHByb2plY3RzLnB1c2goW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0RGlyID0gJ2Rpc3QnO1xuICB9XG4gIHByb2plY3RzLnB1c2goW2NvcmVQcm9qZWN0RGlyUGF0aCwgY29yZUNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuXG4gIGxldCBhbGxTdWNjZWVkZWQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyXSBvZiBwcm9qZWN0cykge1xuICAgIGFsbFN1Y2NlZWRlZCAmJj0gcnVuVHlwZVNjcmlwdENvbXBpbGVyKGFyZ3YsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBwYXRoLmpvaW4oY29yZVByb2plY3REaXJQYXRoLCBvdXREaXIpKTtcbiAgfVxuICByZXR1cm4gYWxsU3VjY2VlZGVkO1xufVxuXG5mdW5jdGlvbiBydW5UeXBlU2NyaXB0Q29tcGlsZXIoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHlwZVNjcmlwdENvbXBpbGVyKCknLCBwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyKTtcbiAgfVxuXG4gIGNvbnN0IHsgY29uZmlnIH0gPSB0cy5yZWFkQ29uZmlnRmlsZShjb25maWdGaWxlLCB0cy5zeXMucmVhZEZpbGUpO1xuICBjb25maWcuY29tcGlsZXJPcHRpb25zID0ge1xuICAgIC4uLmNvbmZpZy5jb21waWxlck9wdGlvbnMsXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG5vRW1pdE9uRXJyb3I6IHRydWUsXG4gICAgb3V0RGlyLFxuICB9O1xuICBjb25maWcuaW5jbHVkZSA9IFsnc3JjLyoqLyonXTtcbiAgY29uc3QgeyBlcnJvcnMsIGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gdHMucGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQoY29uZmlnLCB0cy5zeXMsIHByb2plY3REaXJQYXRoKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbSh7IG9wdGlvbnMsIHJvb3ROYW1lczogZmlsZU5hbWVzLCBjb25maWdGaWxlUGFyc2luZ0RpYWdub3N0aWNzOiBlcnJvcnMgfSk7XG4gIGNvbnN0IHsgZGlhZ25vc3RpY3MsIGVtaXRTa2lwcGVkIH0gPSBwcm9ncmFtLmVtaXQoKTtcblxuICBjb25zdCBhbGxEaWFnbm9zdGljcyA9IFsuLi50cy5nZXRQcmVFbWl0RGlhZ25vc3RpY3MocHJvZ3JhbSksIC4uLmRpYWdub3N0aWNzLCAuLi5lcnJvcnNdO1xuICBpZiAoYWxsRGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZvcm1hdEhvc3Q6IHRzLkZvcm1hdERpYWdub3N0aWNzSG9zdCA9IHtcbiAgICAgIGdldENhbm9uaWNhbEZpbGVOYW1lOiAocGF0aCkgPT4gcGF0aCxcbiAgICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6IHRzLnN5cy5nZXRDdXJyZW50RGlyZWN0b3J5LFxuICAgICAgZ2V0TmV3TGluZTogKCkgPT4gdHMuc3lzLm5ld0xpbmUsXG4gICAgfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdHMuZm9ybWF0RGlhZ25vc3RpY3MoYWxsRGlhZ25vc3RpY3MsIGZvcm1hdEhvc3QpO1xuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gIWVtaXRTa2lwcGVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBkYXRlVGltZSBmcm9tICdkYXRlLXRpbWUnO1xuaW1wb3J0IG1zIGZyb20gJ3ByZXR0eS1tcyc7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFJvbGx1cEJ1aWxkLCBSb2xsdXBPcHRpb25zIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCB7IHJvbGx1cCwgd2F0Y2ggfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyIH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHsgb25FeGl0IH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldENhdGVnb3J5LCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbGxUYXJnZXRDYXRlZ29yaWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmFtZXNwYWNlQW5kTmFtZSwgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlLCBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGFwcEJ1aWxkZXIsIGZ1bmN0aW9uc0J1aWxkZXIsIGxpYkJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgc2V0dXBQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW4uanMnO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tICcuL3JvbGx1cExvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMgfSBmcm9tICcuL3R5cGVTY3JpcHQuanMnO1xuXG5leHBvcnQgY29uc3QgYXBwOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGFwcEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2FwcCBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGFuIGFwcCcsXG4gIGJ1aWxkZXI6IGFwcEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnYXBwJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2Z1bmN0aW9ucyBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgR0NQL0ZpcmViYXNlIGZ1bmN0aW9ucyBhcHAnLFxuICBidWlsZGVyOiBmdW5jdGlvbnNCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5vbmx5UGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICAgICAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgIGlmICghcGFja2FnZUpzb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWlsZChhcmd2LCAnZnVuY3Rpb25zJyk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxpYjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBsaWJCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaWIgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIE5vZGUuanMgLyBSZWFjdCBsaWJyYXJ5JyxcbiAgYnVpbGRlcjogbGliQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdsaWInKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgdGFyZ2V0Q2F0ZWdvcnk6IFRhcmdldENhdGVnb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8PSAncHJvZHVjdGlvbic7XG5cbiAgLy8gYHNpbGVudGAgaXMgc3Ryb25nZXIgdGhhbiBgdmVyYm9zZWAuXG4gIGNvbnN0IHZlcmJvc2UgPSAhYXJndi5zaWxlbnQgJiYgYXJndi52ZXJib3NlO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcGFja2FnZURpclBhdGgpO1xuXG4gIGNvbnN0IGlucHV0cyA9IHZlcmlmeUlucHV0KGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCB0YXJnZXREZXRhaWwgPSBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnksIGlucHV0cyk7XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ2FyZ3Y6JywgYXJndik7XG4gICAgY29uc29sZS5pbmZvKCdwYWNrYWdlSnNvblBhdGg6JywgcGFja2FnZUpzb25QYXRoKTtcbiAgICBjb25zb2xlLmluZm8oJ1RhcmdldCAoQ2F0ZWdvcnkpOicsIGAke3RhcmdldERldGFpbH0gKCR7dGFyZ2V0Q2F0ZWdvcnl9KWApO1xuICB9XG5cbiAgY29uc3QgW25hbWVzcGFjZV0gPSBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uKTtcbiAgY29uc3QgaXNFc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG5cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKUyA9ICcxJztcbiAgfSBlbHNlIGlmIChhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTID0gJzEnO1xuICB9XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19WRVJCT1NFID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSA9IHRhcmdldENhdGVnb3J5O1xuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfREVUQUlMID0gdGFyZ2V0RGV0YWlsO1xuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0ID0gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlRGlyUGF0aCwgaXNFc21QYWNrYWdlKTtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ091dHB1dE9wdGlvbnM6Jywgb3V0cHV0T3B0aW9uc0xpc3QpO1xuICB9XG4gIGlmIChvdXRwdXRPcHRpb25zTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IG91dHB1dCBmaWxlcy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmNoZGlyKHBhY2thZ2VEaXJQYXRoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBSb2xsdXBPcHRpb25zID0ge1xuICAgIGlucHV0OlxuICAgICAgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJ1xuICAgICAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIGlucHV0cy5tYXAoKGlucHV0LCBpbmRleCkgPT4gW2luZGV4ID09PSAwID8gJ2luZGV4JyA6IHBhdGguYmFzZW5hbWUoaW5wdXQsIHBhdGguZXh0bmFtZShpbnB1dCkpLCBpbnB1dF0pXG4gICAgICAgICAgKVxuICAgICAgICA6IGlucHV0cyxcbiAgICBwbHVnaW5zOiBzZXR1cFBsdWdpbnMoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgbmFtZXNwYWNlLCBwYWNrYWdlRGlyUGF0aCwgb3V0cHV0T3B0aW9uc0xpc3QpLFxuICAgIHdhdGNoOiBhcmd2LndhdGNoID8geyBjbGVhclNjcmVlbjogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBjb25zdCBwYXRoVG9SZWxhdGl2ZVBhdGggPSAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHN0cmluZ1tdID0+XG4gICAgKEFycmF5LmlzQXJyYXkocGF0aHMpID8gcGF0aHMgOiBbcGF0aHNdKS5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHApKTtcbiAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICB3YXRjaFJvbGx1cChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBvcHRpb25zLCBvdXRwdXRPcHRpb25zTGlzdCwgcGF0aFRvUmVsYXRpdmVQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dHMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbignLCAnKVxuICAgICAgICAgICl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBidW5kbGU6IFJvbGx1cEJ1aWxkIHwgdW5kZWZpbmVkO1xuICAgIGxldCBidWlsZEZhaWxlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgX2J1bmRsZSA9IGF3YWl0IHJvbGx1cChvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke3BhdGhUb1JlbGF0aXZlUGF0aChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IG9wdHMuZmlsZSB8fCBvcHRzLmRpciB8fCAnJykpLmpvaW4oXG4gICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICl9IGluICR7Y2hhbGsuYm9sZChtcyhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJlxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJlxuICAgICAgIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpKVxuICAgICkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXRjaFJvbGx1cChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSb2xsdXBPcHRpb25zLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdLFxuICBwYXRoVG9SZWxhdGl2ZVBhdGg6IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaCh7IC4uLm9wdGlvbnMsIG91dHB1dDogb3V0cHV0T3B0aW9uc0xpc3QgfSk7XG5cbiAgY29uc3QgY2xvc2UgPSBhc3luYyAoY29kZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsb3NlKTtcbiAgICBpZiAod2F0Y2hlcikgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgIGlmIChjb2RlKSBwcm9jZXNzLmV4aXQoY29kZSk7XG4gIH07XG4gIG9uRXhpdChjbG9zZSBhcyB1bmtub3duIGFzIEhhbmRsZXIpO1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlKTtcbiAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gIH1cblxuICB3YXRjaGVyLm9uKCdldmVudCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGV2ZW50LmVycm9yLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCVU5ETEVfU1RBUlQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc3QgZXZlbnRJbnB1dCA9IGV2ZW50LmlucHV0O1xuICAgICAgICBjb25zdCBpbnB1dEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50SW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKGV2ZW50SW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlucHV0RmlsZXMucHVzaChcbiAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGV2ZW50SW5wdXQpID8gZXZlbnRJbnB1dCA6IE9iamVjdC52YWx1ZXMoZXZlbnRJbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dEZpbGVzKS5qb2luKCcsICcpKX0g4oaSICR7Y2hhbGsuYm9sZChcbiAgICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKVxuICAgICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9FTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgYENyZWF0ZWQgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChldmVudC5vdXRwdXQpLmpvaW4oJywgJykpfSBpbiAke2NoYWxrLmJvbGQobXMoZXZlbnQuZHVyYXRpb24pKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiYgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJykge1xuICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG5bJHtkYXRlVGltZSgpfV0gd2FpdGluZyBmb3IgY2hhbmdlcy4uLmApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ3Jlc3VsdCcgaW4gZXZlbnQgJiYgZXZlbnQucmVzdWx0KSB7XG4gICAgICB2b2lkIGV2ZW50LnJlc3VsdC5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUlucHV0KGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBjd2Q6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3YuaW5wdXQgJiYgYXJndi5pbnB1dC5sZW5ndGggPiAwKSByZXR1cm4gYXJndi5pbnB1dC5tYXAoKHApID0+IHBhdGguam9pbihjd2QsIHAudG9TdHJpbmcoKSkpO1xuXG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgZm9yIChjb25zdCBleHQgb2YgWyd0cycsICd0c3gnLCAnY3RzJywgJ210cyddKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwYXRoLmpvaW4oc3JjRGlyUGF0aCwgYGluZGV4LiR7ZXh0fWApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGlucHV0KSkgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IGlucHV0IGZpbGUuJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5OiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10pOiBUYXJnZXREZXRhaWwge1xuICBzd2l0Y2ggKHRhcmdldENhdGVnb3J5KSB7XG4gICAgY2FzZSAnYXBwJzoge1xuICAgICAgcmV0dXJuICdhcHAtbm9kZSc7XG4gICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9ucyc6IHtcbiAgICAgIHJldHVybiAnZnVuY3Rpb25zJztcbiAgICB9XG4gICAgY2FzZSAnbGliJzoge1xuICAgICAgaWYgKGlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuZW5kc1dpdGgoJy50c3gnKSkpIHtcbiAgICAgICAgcmV0dXJuICdsaWItcmVhY3QnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdsaWInO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0YXJnZXQgb3B0aW9uIG11c3QgYmUgb25lIG9mOiAnICsgYWxsVGFyZ2V0Q2F0ZWdvcmllcy5qb2luKCcsICcpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBwYWNrYWdlSnNvbi5uYW1lICs9ICctZGlzdCc7XG4gIGNvbnN0IGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoZXNtUGFja2FnZSwgbW9kdWxlVHlwZSk7XG4gIHBhY2thZ2VKc29uLm1haW4gPSBlc21QYWNrYWdlID09PSBlc21PdXRwdXQgPyAnaW5kZXguanMnIDogZXNtT3V0cHV0ID8gJ2luZGV4Lm1qcycgOiAnaW5kZXguY2pzJztcblxuICAvLyBQcmV2ZW50IEZpcmViYXNlIEZ1bmN0aW9ucyBmcm9tIHJ1bm5pbmcgYGJ1aWxkYCBzY3JpcHQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIC8vIGRldkRlcGVuZGVuY2llcyBhcmUgbm90IHJlcXVpcmVkIHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSk7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dE9wdGlvbnNMaXN0KFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIGlzRXNtUGFja2FnZTogYm9vbGVhblxuKTogT3V0cHV0T3B0aW9uc1tdIHtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgICBmb3JtYXQ6IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKSA/ICdtb2R1bGUnIDogJ2NvbW1vbmpzJyxcbiAgICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCAmJiAnaW5saW5lJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wb3J0IHN0YXRlbWVudCBpbiBhbiBlc20gbW9kdWxlIGNhdXNlcyB0aGUgZm9sbG93aW5nIGVycm9yOlxuICAvLyBTdGF0ZW1lbnQ6XG4gIC8vICAgaW1wb3J0IHsgdXNlUHJldmlvdXMgfSBmcm9tICdyZWFjdC11c2UnO1xuICAvLyBFcnJvcjpcbiAgLy8gICBOYW1lZCBleHBvcnQgJ3VzZVByZXZpb3VzJyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICdyZWFjdC11c2UnIGlzIGEgQ29tbW9uSlMgbW9kdWxlLFxuICAvLyAgIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbiAgLy8gV2UgbmVlZCBjanMgbW9kdWxlcyBmb3Igd2ViIGFwcHMgdG8gYXZvaWQgdGhlIGVycm9yLlxuICAvLyBBbHNvLCBzcGxpdHRpbmcgYSBsaWJyYXJ5IGlzIHVzZWZ1bCBpbiBib3RoIG1vZHVsZXMsIHNvIHByZXNlcnZlTW9kdWxlcyBzaG91bGQgYmUgdHJ1ZS5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSA9IFtdO1xuICBjb25zdCBtb2R1bGVUeXBlID0gYXJndi5tb2R1bGVUeXBlIHx8ICdib3RoJztcbiAgY29uc3QganNFeHQgPSBhcmd2LmpzRXh0ZW5zaW9uIHx8ICdlaXRoZXInO1xuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2NqcycgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5janMnLFxuICAgICAgZm9ybWF0OiAnY29tbW9uanMnLFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0ubWpzJyxcbiAgICAgIGZvcm1hdDogJ21vZHVsZScsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXRwdXRPcHRpb25zTGlzdDtcbn1cblxuZnVuY3Rpb24gaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlOiBib29sZWFuLCBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1vZHVsZVR5cGUgPT09ICdlc20nIHx8ICgoIW1vZHVsZVR5cGUgfHwgbW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicpICYmIGlzRXNtUGFja2FnZSk7XG59XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBSb2xsdXBFcnJvciB9IGZyb20gJ3JvbGx1cCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogUm9sbHVwRXJyb3IsIHJlY292ZXIgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCAoZXJyb3IuY2F1c2UgYXMgRXJyb3IpPy5uYW1lO1xuICBjb25zdCBuYW1lU2VjdGlvbiA9IG5hbWUgPyBgJHtuYW1lfTogYCA6ICcnO1xuICBjb25zdCBwbHVnaW5TZWN0aW9uID0gZXJyb3IucGx1Z2luID8gYChwbHVnaW4gJHtlcnJvci5wbHVnaW59KSBgIDogJyc7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtwbHVnaW5TZWN0aW9ufSR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfWA7XG5cbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBbY2hhbGsuYm9sZChjaGFsay5yZWQoYFshXSAke2NoYWxrLmJvbGQobWVzc2FnZS50b1N0cmluZygpKX1gKSldO1xuXG4gIGlmIChlcnJvci51cmwpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmN5YW4oZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLmZyYW1lKSk7XG4gIH1cblxuICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmRpbShlcnJvci5zdGFjaz8ucmVwbGFjZShgJHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9XFxuYCwgJycpKSk7XG4gIH1cblxuICBvdXRwdXRMaW5lcy5wdXNoKCcnLCAnJyk7XG4gIGNvbnNvbGUuZXJyb3Iob3V0cHV0TGluZXMuam9pbignXFxuJykpO1xuXG4gIGlmICghcmVjb3ZlcikgcHJvY2Vzcy5leGl0KDEpO1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uL2Vudi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIG1vZHVsZToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtb2R1bGUgdHlwZTogY2pzIG9yIGVzbScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcnVuOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3J1biA8ZmlsZT4nLFxuICBkZXNjcmliZTogJ1J1biBzY3JpcHQnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcHJvY2Vzcy5jd2QoKSk7XG5cbiAgICBjb25zdCBmaWxlID0gYXJndi5maWxlPy50b1N0cmluZygpIHx8ICcnO1xuXG4gICAgLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgICBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MudmVyc2lvbnMuYnVuO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ25vZGUnO1xuICAgIGNvbnN0IGFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/IFsnLS1idW4nXSA6IFsnLS1uby13YXJuaW5ncycsICctLWltcG9ydCcsICd0c3gnXTtcbiAgICBpZiAoYXJndi53YXRjaCkge1xuICAgICAgYXJncy5wdXNoKCctLXdhdGNoJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChmaWxlKTtcbiAgICBjb25zdCBbLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzXSA9IGFyZ3YuXztcbiAgICBjb25zdCBydW50aW1lQXJncyA9IFsuLi5hcmdzLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzLm1hcCgoYXJnKSA9PiBhcmcudG9TdHJpbmcoKSldO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyAnJHtydW50aW1lfSAke3J1bnRpbWVBcmdzLmpvaW4oJyAnKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHJ1bnRpbWUsIHJ1bnRpbWVBcmdzLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52IH0sXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMgPz8gMSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBhcHAsIGZ1bmN0aW9ucywgbGliIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZC9idWlsZC5qcyc7XG5pbXBvcnQgeyBydW4gfSBmcm9tICcuL2NvbW1hbmRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5yZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCdidWlsZC10cycpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAuY29tbWFuZChhcHApXG4gIC5jb21tYW5kKGZ1bmN0aW9ucylcbiAgLmNvbW1hbmQobGliKVxuICAuY29tbWFuZChydW4pXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC5oZWxwKCkuYXJndjtcbiJdLCJuYW1lcyI6WyJlbnZWYXJzIiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIiwiYXJndiIsImN3ZCIsInJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwiT2JqZWN0Iiwia2V5cyIsImNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiIsImVudlZhcnNEZWYiLCJuYW1lcyIsIlNldCIsImlubGluZSIsImZsYXRNYXAiLCJlIiwidG9TdHJpbmciLCJzcGxpdCIsIm5hbWUiLCJ1bmRlZmluZWQiLCJwcm9jZXNzIiwiZW52IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbFRhcmdldENhdGVnb3JpZXMiLCJhc3luYyIsInJlYWRQYWNrYWdlSnNvbiIsImRpclBhdGgiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwiam9pbiIsInBhY2thZ2VKc29uVGV4dCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInBhcnNlIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Iiwic2lsZW50IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJidWlsZGVyIiwiaW5wdXQiLCJkZWZhdWx0IiwibWluaWZ5Iiwic291cmNlbWFwIiwiZXh0ZXJuYWwiLCJ3YXRjaCIsImtlZXBJbXBvcnQiLCJidW5kbGVCdWlsdGlucyIsImFwcEJ1aWxkZXIiLCJtb2R1bGVUeXBlIiwiZnVuY3Rpb25zQnVpbGRlciIsIm9ubHlQYWNrYWdlSnNvbiIsImxpYkJ1aWxkZXIiLCJqc0V4dGVuc2lvbiIsInNldHVwUGx1Z2lucyIsInRhcmdldERldGFpbCIsInBhY2thZ2VKc29uIiwibmFtZXNwYWNlIiwicGFja2FnZURpclBhdGgiLCJvdXRwdXRPcHRpb25zTGlzdCIsImV4dGVybmFsRGVwcyIsIm1hcCIsIml0ZW0iLCJkZXBlbmRlbmNpZXMiLCJwdXNoIiwicGVlckRlcGVuZGVuY2llcyIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VEaXJzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicGFja2FnZURpciIsImlzRGlyZWN0b3J5Iiwib3RoZXJQYWNrYWdlSnNvbiIsInJlYWRGaWxlU3luYyIsImV4dGVuc2lvbnMiLCJiYWJlbENvbmZpZ1BhdGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZGlybmFtZSIsInBsdWdpbnMiLCJyZXBsYWNlIiwiZGVsaW1pdGVycyIsInByZXZlbnRBc3NpZ25tZW50IiwidmFsdWVzIiwianNvbiIsIm5vZGVFeHRlcm5hbHMiLCJkZXBzIiwiZGV2RGVwcyIsInBlZXJEZXBzIiwib3B0RGVwcyIsImluY2x1ZGUiLCJSZWdFeHAiLCJleGNsdWRlIiwicmVzb2x2ZSIsInByZWZlckJ1aWx0aW5zIiwiaWQiLCJpbmNsdWRlcyIsImNvbW1vbmpzIiwibW9kdWxlTmFtZXMiLCJpc0JhYmVsSGVscGVyc0J1bmRsZWQiLCJCVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FIiwiYmFiZWwiLCJjb25maWdGaWxlIiwiYmFiZWxIZWxwZXJzIiwic29tZSIsIm9wdHMiLCJwcmVzZXJ2ZU1vZHVsZXMiLCJwcmVzZXJ2ZURpcmVjdGl2ZXMiLCJzdHJpbmciLCJ0ZXJzZXIiLCJjb21wcmVzcyIsImRpcmVjdGl2ZXMiLCJhbmFseXplIiwic3VtbWFyeU9ubHkiLCJnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMiLCJjb3JlUHJvamVjdERpclBhdGgiLCJjb3JlQ29uZmlnRmlsZSIsInRzIiwiZmluZENvbmZpZ0ZpbGUiLCJzeXMiLCJmaWxlRXhpc3RzIiwiRXJyb3IiLCJwcm9qZWN0cyIsIm91dERpciIsImJhc2VuYW1lIiwicGFyZW50RGlyUGF0aCIsImRpcmVudHMiLCJyZWFkZGlyIiwiZGlyZW50IiwicHJvamVjdERpclBhdGgiLCJhbGxTdWNjZWVkZWQiLCJydW5UeXBlU2NyaXB0Q29tcGlsZXIiLCJjb25maWciLCJyZWFkQ29uZmlnRmlsZSIsImNvbXBpbGVyT3B0aW9ucyIsImRlY2xhcmF0aW9uIiwiZW1pdERlY2xhcmF0aW9uT25seSIsIm5vRW1pdCIsIm5vRW1pdE9uRXJyb3IiLCJlcnJvcnMiLCJmaWxlTmFtZXMiLCJvcHRpb25zIiwicGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQiLCJwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsInJvb3ROYW1lcyIsImNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3MiLCJkaWFnbm9zdGljcyIsImVtaXRTa2lwcGVkIiwiZW1pdCIsImFsbERpYWdub3N0aWNzIiwiZ2V0UHJlRW1pdERpYWdub3N0aWNzIiwibGVuZ3RoIiwiZm9ybWF0SG9zdCIsImdldENhbm9uaWNhbEZpbGVOYW1lIiwiZ2V0Q3VycmVudERpcmVjdG9yeSIsImdldE5ld0xpbmUiLCJuZXdMaW5lIiwibWVzc2FnZSIsImZvcm1hdERpYWdub3N0aWNzIiwid2FybiIsImFwcCIsImNvbW1hbmQiLCJkZXNjcmliZSIsImhhbmRsZXIiLCJidWlsZCIsImZ1bmN0aW9ucyIsInBhY2thZ2UiLCJlcnJvciIsImV4aXQiLCJnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zIiwibGliIiwidGFyZ2V0Q2F0ZWdvcnkiLCJOT0RFX0VOViIsImlucHV0cyIsInAiLCJzcmNEaXJQYXRoIiwiZXh0IiwidmVyaWZ5SW5wdXQiLCJlbmRzV2l0aCIsImRldGVjdFRhcmdldERldGFpbCIsInBhY2thZ2VOYW1lIiwibWF0Y2giLCJleGVjIiwiZ2V0TmFtZXNwYWNlQW5kTmFtZSIsImlzRXNtUGFja2FnZSIsIkJVSUxEX1RTX0NPUkVKUyIsIkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyIsIkJVSUxEX1RTX1ZFUkJPU0UiLCJCVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkiLCJCVUlMRF9UU19UQVJHRVRfREVUQUlMIiwib3V0RGlyUGF0aCIsImRpciIsImZvcm1hdCIsImlzRXNtT3V0cHV0IiwianNFeHQiLCJlbnRyeUZpbGVOYW1lcyIsImdldE91dHB1dE9wdGlvbnNMaXN0IiwiY2hkaXIiLCJybSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwiZnJvbUVudHJpZXMiLCJpbmRleCIsImV4dG5hbWUiLCJjbGVhclNjcmVlbiIsInBhdGhUb1JlbGF0aXZlUGF0aCIsInBhdGhzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVsYXRpdmUiLCJ3YXRjaGVyIiwib3V0cHV0IiwiY2xvc2UiLCJyZW1vdmVMaXN0ZW5lciIsInN0ZGluIiwiY29kZSIsIm9uRXhpdCIsIm9uIiwiaXNUVFkiLCJyZXN1bWUiLCJldmVudCIsInJlY292ZXIiLCJjYXVzZSIsIm5hbWVTZWN0aW9uIiwicGx1Z2luIiwib3V0cHV0TGluZXMiLCJjaGFsayIsImJvbGQiLCJyZWQiLCJjeWFuIiwibG9jIiwiZmlsZSIsImxpbmUiLCJjb2x1bW4iLCJmcmFtZSIsImRpbSIsInN0YWNrIiwiaGFuZGxlRXJyb3IiLCJldmVudElucHV0IiwiaW5wdXRGaWxlcyIsImdyZWVuIiwibXMiLCJkdXJhdGlvbiIsImRhdGVUaW1lIiwicmVzdWx0Iiwid2F0Y2hSb2xsdXAiLCJidW5kbGUiLCJidWlsZEZhaWxlZCIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJfYnVuZGxlIiwicm9sbHVwIiwiUHJvbWlzZSIsImFsbCIsIndyaXRlIiwiZXNtUGFja2FnZSIsImVzbU91dHB1dCIsIm1haW4iLCJzY3JpcHRzIiwiZGV2RGVwZW5kZW5jaWVzIiwibWtkaXIiLCJ3cml0ZUZpbGUiLCJydW4iLCJtb2R1bGUiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwicnVudGltZSIsImFyZ3MiLCJhZGRpdGlvbmFsQXJndW1lbnRzIiwiXyIsInJ1bnRpbWVBcmdzIiwiYXJnIiwicmV0IiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luYyIsInN0ZGlvIiwic3RhdHVzIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwieWFyZ3MiLCJoaWRlQmluIiwic2Ny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
|
|
1
|
+
import{readAndApplyEnvironmentVariables as e,yargsOptionsBuilderForEnv as o,removeNpmAndYarnEnvironmentVariables as n}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import t from"node:fs";import r from"node:path";import c from"chalk";import a from"date-time";import p from"pretty-ms";import{rollup as l,watch as d}from"rollup";import{onExit as m}from"signal-exit";import u from"node:url";import{babel as f}from"@rollup/plugin-babel";import y from"@rollup/plugin-commonjs";import g from"@rollup/plugin-json";import b from"@rollup/plugin-node-resolve";import h from"@rollup/plugin-replace";import j from"@rollup/plugin-terser";import v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import k from"rollup-plugin-preserve-directives";import{string as S}from"rollup-plugin-string";import $ from"node:process";import E from"typescript";import*as D from"node:child_process";let T;function O(o,n){return T||(T=e(o,n),o.verbose&&console.info("Loaded env vars:",Object.keys(T))),T}function F(e){const o={},n=new Set((e.inline??[]).flatMap((e=>e.toString().split(","))));for(const e of n)void 0!==process.env[e]&&(o[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(o)),o}const _=["app","functions","lib"];async function N(e){const o=r.join(e,"package.json");try{const e=await t.promises.readFile(o,"utf8");return[JSON.parse(e),o]}catch{}return[void 0,o]}const B={...o,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},R={...B,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"},bundleBuiltins:{description:"Module names same with builtins (e.g., undici) to be bundled.",type:"array"}},C={...R,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},L={...C,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},A={...R,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function I(e,o,n,s,i,c){const a=[...e.external??[]].map((e=>e.toString()));if(n.dependencies?.["@prisma/client"]&&a.push("prisma-client"),a.push(...Object.keys(n.dependencies??{}),...Object.keys(n.peerDependencies??{}),...Object.keys(n.optionalDependencies??{})),t.existsSync(r.join("..","..","package.json"))){const e=t.readdirSync(r.join(".."),{withFileTypes:!0});for(const o of e){if(!o.isDirectory())continue;const e=r.join("..",o.name,"package.json");if(!t.existsSync(e))continue;const s=JSON.parse(t.readFileSync(e,"utf8"));n.dependencies?.[s.name??""]&&a.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=r.join(u.fileURLToPath(r.dirname(r.dirname(import.meta.url))),"babel.config.mjs"),d=[h({delimiters:["",""],preventAssignment:!0,values:F(e)}),g(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:a.map((e=>new RegExp(`^${e}(?:\\/.+)?`))),exclude:s&&new RegExp(`^@?${s}(?:\\/.+)?`)}),b({extensions:p,preferBuiltins:o=>!e.bundleBuiltins?.includes(o)}),y(),w({moduleNames:e.keepImport?.map((e=>e.toString()))??[]})],m="app-node"===o||"functions"===o||!a.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=m?"":"1",d.push(f({configFile:l,extensions:p,babelHelpers:m?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...c.some((e=>e.preserveModules))?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),e.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(e,o){const n=E.findConfigFile(o,E.sys.fileExists);if(!n)throw new Error(`Failed to find tsconfig.json in ${o}.`);e.verbose&&console.info("Found tsconfig.json:",n);const s=[];let i=r.join("dist",r.basename(o),"src");if(t.existsSync(i)){const e=r.dirname(o),n=await t.promises.readdir(e,{withFileTypes:!0});o=r.resolve(o);for(const i of n){if(!i.isDirectory())continue;const n=r.resolve(e,i.name);if(n===o)continue;const c=E.findConfigFile(n,E.sys.fileExists),a=r.join("dist",i.name,"src");c&&t.existsSync(a)&&s.push([n,c,a])}}else i="dist";s.push([o,n,i]);let c=!0;for(const[n,i,t]of s)c&&=U(e,n,i,r.join(o,t));return c}function U(e,o,n,s){e.verbose&&console.info("runTypeScriptCompiler()",o,n,s);const{config:i}=E.readConfigFile(n,E.sys.readFile);i.compilerOptions={...i.compilerOptions,declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:s},i.include=["src/**/*"];const{errors:t,fileNames:r,options:c}=E.parseJsonConfigFileContent(i,E.sys,o),a=E.createProgram({options:c,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=a.emit(),d=[...E.getPreEmitDiagnostics(a),...p,...t];if(d.length>0){const e={getCanonicalFileName:e=>e,getCurrentDirectory:E.sys.getCurrentDirectory,getNewLine:()=>E.sys.newLine},o=E.formatDiagnostics(d,e);console.warn(o)}return!l}const W={command:"app [package]",describe:"Build an app",builder:C,handler:async e=>G(e,"app")},J={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:L,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const o=r.resolve(e.package?.toString()??"."),[n,s]=await N(o);n||(console.error(`Failed to parse package.json (${s}).`),process.exit(1)),await H(o,n,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:A,handler:async e=>G(e,"lib")};async function G(e,o){process.env.NODE_ENV||="production";const n=!e.silent&&e.verbose,s=process.cwd(),i=r.resolve(e.package?.toString()??"."),[u,f]=await N(i);u||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),O(e,i);const y=function(e,o,n){if(e.input&&e.input.length>0)return e.input.map((e=>r.join(o,e.toString())));const s=r.join(n,"src");for(const e of["ts","tsx","cts","mts"]){const o=r.join(s,`index.${e}`);if(t.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(e,s,i),g=function(e,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return o.some((e=>e.endsWith(".tsx")))?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,y);n&&(console.info("argv:",e),console.info("packageJsonPath:",f),console.info("Target (Category):",`${g} (${o})`));const[b]=function(e){const o=e.name?.toString()||"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n||[];return[s,i]}(u),h="module"===u.type;e["core-js"]?process.env.BUILD_TS_COREJS="1":e["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),n&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=g;const j=function(e,o,n,s){const i=r.join(n,"dist");if("app-node"===o||"functions"===o)return[{dir:i,format:V(s,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const t=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&!s?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===c||"both"===c||"either"===c&&s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&s?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return t}(e,g,i,h);n&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await t.promises.rm(r.join(i,"dist"),{recursive:!0,force:!0}),"functions"===g&&await H(i,u,e.moduleType);const v={input:"functions"===g?Object.fromEntries(y.map(((e,o)=>[0===o?"index":r.basename(e,r.extname(e)),e]))):y,plugins:I(e,g,u,b,0,j),watch:e.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map((e=>r.relative(i,e)));if(e.watch)!function(e,o,n,s,i,t){const r=d({...s,output:i}),l=async e=>{process.removeListener("uncaughtException",l),process.stdin.removeListener("end",l),r&&await r.close(),e&&process.exit(e)};m(l),process.on("uncaughtException",l),process.stdin.isTTY||(process.stdin.on("end",l),process.stdin.resume());r.on("event",(async s=>{switch(s.code){case"ERROR":!function(e,o=!1){const n=e.name||e.cause?.name,s=n?`${n}: `:"",i=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,t=[c.bold(c.red(`[!] ${c.bold(i.toString())}`))];e.url&&t.push(c.cyan(e.url)),e.loc?t.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&t.push(e.id),e.frame&&t.push(c.dim(e.frame)),e.stack&&t.push(c.dim(e.stack?.replace(`${s}${e.message}\n`,""))),t.push("",""),console.error(t.join("\n")),o||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const o=s.input,i=[];"string"==typeof o?i.push(o):i.push(...Array.isArray(o)?o:Object.values(o)),console.info(c.cyan(`Bundles ${c.bold(t(i).join(", "))} → ${c.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(t(s.output).join(", "))} in ${c.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()}))}(e,g,i,v,j,w);else{let o;e.silent||console.info(c.cyan(`Bundles ${c.bold(w(y).join(", "))} → ${c.bold(w(j.map((e=>e.file||e.dir||""))).join(", "))}\non ${i} ...`));let n=!1;try{const n=Date.now(),s=await l(v);o=s,await Promise.all(j.map((e=>s.write(e)))),e.silent||console.info(c.green(`Created ${w(j.map((e=>e.file||e.dir||""))).join(", ")} in ${c.bold(p(Date.now()-n))}`))}catch(e){n=!0,console.error("Failed to build due to:",e)}await(o?.close()),n&&process.exit(1),"app-node"===g||"functions"===g||await P(e,i)||process.exit(1)}}async function H(e,o,n){o.name+="-dist";const s="module"===o.type,i=V(s,n);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await t.promises.mkdir(r.join(e,"dist"),{recursive:!0}),await t.promises.writeFile(r.join(e,"dist","package.json"),JSON.stringify(o))}function V(e,o){return"esm"===o||(!o||"either"===o)&&e}const Y={command:"run <file>",describe:"Run script",builder:{...B,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){O(e,process.cwd());const o=e.file?.toString()||"",n=process.versions.bun,s=n?"bun":"node",i=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&i.push("--watch"),i.push(o);const[,...t]=e._,r=[...i,...t.map((e=>e.toString()))];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const c=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};n(process.env),await s(i(process.argv)).scriptName("build-ts").options(B).command(W).command(J).command(M).command(Y).demandCommand().strict().help().argv;
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW52VmFyc0RlZjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBlbnZWYXJOYW1lcyA9IG5ldyBTZXQoKGFyZ3YuaW5saW5lID8/IFtdKS5mbGF0TWFwKChlKSA9PiBlLnRvU3RyaW5nKCkuc3BsaXQoJywnKSkpO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgZW52VmFyTmFtZXMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbbmFtZV0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBlbnZWYXJzRGVmW2Bwcm9jZXNzLmVudi4ke25hbWV9YF0gPSBKU09OLnN0cmluZ2lmeShwcm9jZXNzLmVudltuYW1lXSk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnSW5saW5lIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnNEZWYpKTtcbiAgfVxuICByZXR1cm4gZW52VmFyc0RlZjtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzLCBPcHRpb25zIH0gZnJvbSAneWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0Q2F0ZWdvcmllcyA9IFsnYXBwJywgJ2Z1bmN0aW9ucycsICdsaWInXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0Q2F0ZWdvcnkgPSAodHlwZW9mIGFsbFRhcmdldENhdGVnb3JpZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBhbGxUYXJnZXREZXRhaWxzID0gWydhcHAtbm9kZScsICdmdW5jdGlvbnMnLCAnbGliJywgJ2xpYi1yZWFjdCddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYXJnZXREZXRhaWwgPSAodHlwZW9mIGFsbFRhcmdldERldGFpbHMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIEFyZ3VtZW50c1R5cGU8VCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogT3B0aW9ucyB9PiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPFQ+PjtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdXJsIGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxbUGFja2FnZUpzb24gfCB1bmRlZmluZWQsIHN0cmluZ10+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgcmV0dXJuIFtKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF07XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgcGFja2FnZUpzb25QYXRoXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkVHNSb290UGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gdXJsLmZpbGVVUkxUb1BhdGgocGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShpbXBvcnQubWV0YS51cmwpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZyB8IHVuZGVmaW5lZF0ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VKc29uLm5hbWU/LnRvU3RyaW5nKCkgfHwgJyc7XG4gIGNvbnN0IG1hdGNoID0gL0AoW14vXSspXFwvKC4rKS8uZXhlYyhwYWNrYWdlTmFtZSk7XG4gIGNvbnN0IFssIG5hbWVzcGFjZSwgbmFtZV0gPSBtYXRjaCB8fCBbXTtcbiAgcmV0dXJuIFtuYW1lc3BhY2UsIG5hbWVdO1xufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuXG5leHBvcnQgY29uc3Qgc2hhcmVkT3B0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLnlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYsXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdzJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBpbnB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGhzIG9mIHNvdXJjZSBjb2RlIGZpbGVzIHRvIGJlIGJ1aWx0LiBUaGUgZmlyc3QgZmlsZSBpcyBtYWluLiBJZiBubyBvcHRpb24gaXMgZ2l2ZW4sIFwic3JjL2luZGV4Lnt0cyx0c3h9XCIgZnJvbSBwYWNrYWdlIGRpcmVjdG9yeSBpcyB0YXJnZXRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdpJyxcbiAgfSxcbiAgJ2NvcmUtanMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICAnY29yZS1qcy1wcm9wb3NhbHMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIHdpdGggcHJvcG9zYWxzIHN1cHBvcnQgaXMgZW1wbG95ZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIG1pbmlmeToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgbWluaWZpY2F0aW9uIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgc291cmNlbWFwOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBzb3VyY2VtYXAgaXMgZW5hYmxlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBleHRlcm5hbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBleHRlcm5hbCBkZXBlbmRlbmNpZXMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBpbmxpbmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Vudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmxpbmVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gIGtlZXBJbXBvcnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lkZW50aWZpZXJzIHRvIGJlIGtlcHQgYXMgaW1wb3J0IHN0YXRlbWVudHMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBidW5kbGVCdWlsdGluczoge1xuICAgIGRlc2NyaXB0aW9uOiAnTW9kdWxlIG5hbWVzIHNhbWUgd2l0aCBidWlsdGlucyAoZS5nLiwgdW5kaWNpKSB0byBiZSBidW5kbGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBhcHBCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgb3IgZWl0aGVyIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zQnVpbGRlciA9IHtcbiAgLi4uYXBwQnVpbGRlcixcbiAgb25seVBhY2thZ2VKc29uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIGdlbmVyYXRlIG9ubHkgcGFja2FnZS5qc29uLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGxpYkJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG1vZHVsZVR5cGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2VzbSwgY2pzLCBlaXRoZXIsIG9yIGJvdGggKGRlZmF1bHQpLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgLy8gLmpzIGZpbGVzIGluIGEgcGFja2FnZSB3aXRoIGBcInR5cGVcIjogXCJtb2R1bGVcImAgYXJlIHRyZWF0ZWQgYXMgZXNtLlxuICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIHRyZWF0IHRoZW0gYXMgY2pzIGluIHRoZSBjYXNlIHdoZXJlIGEgY2pzIHByb2plY3QgaW1wb3J0cyBhbiBlc20gcGFja2FnZS5cbiAgLy8gVG8gZGVhbCB3aXRoIHRoZSBjYXNlLCB3ZSB1c2UgLmNqcyBhbmQgLm1qcyBleHRlbnNpb25zIGluc3RlYWQgb2YgLmpzIGV4dGVuc2lvbi5cbiAganNFeHRlbnNpb246IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gdXNlIC5qcyBpbiBjanMgYW5kL29yIGVzbTogZWl0aGVyIChkZWZhdWx0KSwgYm90aCwgb3Igbm9uZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnaicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBbnlCdWlsZGVyVHlwZSA9IHR5cGVvZiBhcHBCdWlsZGVyIHwgdHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXIgfCB0eXBlb2YgbGliQnVpbGRlcjtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGJhYmVsIH0gZnJvbSAnQHJvbGx1cC9wbHVnaW4tYmFiZWwnO1xuaW1wb3J0IGNvbW1vbmpzIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWNvbW1vbmpzJztcbmltcG9ydCBqc29uIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWpzb24nO1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnQHJvbGx1cC9wbHVnaW4tbm9kZS1yZXNvbHZlJztcbmltcG9ydCByZXBsYWNlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXJlcGxhY2UnO1xuaW1wb3J0IHRlcnNlciBmcm9tICdAcm9sbHVwL3BsdWdpbi10ZXJzZXInO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRPcHRpb25zLCBQbHVnaW4gfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IGFuYWx5emUgZnJvbSAncm9sbHVwLXBsdWdpbi1hbmFseXplcic7XG5pbXBvcnQgeyBrZWVwSW1wb3J0IH0gZnJvbSAncm9sbHVwLXBsdWdpbi1rZWVwLWltcG9ydCc7XG5pbXBvcnQgeyBub2RlRXh0ZXJuYWxzIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1ub2RlLWV4dGVybmFscyc7XG5pbXBvcnQgcHJlc2VydmVEaXJlY3RpdmVzIGZyb20gJ3JvbGx1cC1wbHVnaW4tcHJlc2VydmUtZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICdyb2xsdXAtcGx1Z2luLXN0cmluZyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRUc1Jvb3RQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQbHVnaW5zKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW11cbik6IFBsdWdpbltdIHtcbiAgY29uc3QgZXh0ZXJuYWxEZXBzID0gWy4uLihhcmd2LmV4dGVybmFsID8/IFtdKV0ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpO1xuICBpZiAocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ0BwcmlzbWEvY2xpZW50J10pIHtcbiAgICBleHRlcm5hbERlcHMucHVzaCgncHJpc21hLWNsaWVudCcpO1xuICB9XG4gIC8vIFNpbmNlIGBkZXBzOiB0cnVlYCBkb2VzIG5vdCB3b3JrIGZvciBgaW1wb3J0IGNodW5rIGZyb20gJ2xvZGFzaC5jaHVuay9pbmRleC5qcyc7YFxuICBleHRlcm5hbERlcHMucHVzaChcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9KVxuICApO1xuICAvLyBBZGQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZyb20gc2libGluZyBwYWNrYWdlc1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXJzID0gZnMucmVhZGRpclN5bmMocGF0aC5qb2luKCcuLicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlRGlyIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgICBpZiAoIXBhY2thZ2VEaXIuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbignLi4nLCBwYWNrYWdlRGlyLm5hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgb3RoZXJQYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW290aGVyUGFja2FnZUpzb24ubmFtZSA/PyAnJ10pIHtcbiAgICAgICAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBleHRlbnNpb25zID0gWycuY2pzJywgJy5tanMnLCAnLmpzJywgJy5qc3gnLCAnLmpzb24nLCAnLmN0cycsICcubXRzJywgJy50cycsICcudHN4J107XG4gIGNvbnN0IGJhYmVsQ29uZmlnUGF0aCA9IHBhdGguam9pbihnZXRCdWlsZFRzUm9vdFBhdGgoKSwgJ2JhYmVsLmNvbmZpZy5tanMnKTtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSBbXG4gICAgcmVwbGFjZSh7XG4gICAgICAvLyBJZ25vcmUgd29yZCBib3VuZGFyaWVzIGFuZCByZXBsYWNlIGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBzdHJpbmcuXG4gICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL3RyZWUvbWFzdGVyL3BhY2thZ2VzL3JlcGxhY2Ujd29yZC1ib3VuZGFyaWVzXG4gICAgICBkZWxpbWl0ZXJzOiBbJycsICcnXSxcbiAgICAgIHByZXZlbnRBc3NpZ25tZW50OiB0cnVlLFxuICAgICAgdmFsdWVzOiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oYXJndiksXG4gICAgfSksXG4gICAganNvbigpLFxuICAgIG5vZGVFeHRlcm5hbHMoe1xuICAgICAgZGVwczogdHJ1ZSxcbiAgICAgIGRldkRlcHM6IGZhbHNlLFxuICAgICAgcGVlckRlcHM6IHRydWUsXG4gICAgICBvcHREZXBzOiB0cnVlLFxuICAgICAgaW5jbHVkZTogZXh0ZXJuYWxEZXBzLm1hcCgobmFtZSkgPT4gbmV3IFJlZ0V4cChgXiR7bmFtZX0oPzpcXFxcLy4rKT9gKSksXG4gICAgICBleGNsdWRlOiBuYW1lc3BhY2UgJiYgbmV3IFJlZ0V4cChgXkA/JHtuYW1lc3BhY2V9KD86XFxcXC8uKyk/YCksXG4gICAgfSksXG4gICAgcmVzb2x2ZSh7XG4gICAgICBleHRlbnNpb25zLFxuICAgICAgcHJlZmVyQnVpbHRpbnM6IChpZDogc3RyaW5nKSA9PiAhYXJndi5idW5kbGVCdWlsdGlucz8uaW5jbHVkZXMoaWQpLFxuICAgIH0pLFxuICAgIGNvbW1vbmpzKCksXG4gICAga2VlcEltcG9ydCh7IG1vZHVsZU5hbWVzOiBhcmd2LmtlZXBJbXBvcnQ/Lm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKSA/PyBbXSB9KSxcbiAgXTtcbiAgY29uc3QgaXNCYWJlbEhlbHBlcnNCdW5kbGVkID1cbiAgICB0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJyB8fCAhZXh0ZXJuYWxEZXBzLmluY2x1ZGVzKCdAYmFiZWwvcnVudGltZScpO1xuICBwcm9jZXNzLmVudi5CVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FID0gaXNCYWJlbEhlbHBlcnNCdW5kbGVkID8gJycgOiAnMSc7XG4gIHBsdWdpbnMucHVzaChcbiAgICBiYWJlbCh7XG4gICAgICBjb25maWdGaWxlOiBiYWJlbENvbmZpZ1BhdGgsXG4gICAgICBleHRlbnNpb25zLFxuICAgICAgLy8gV2UgbmVlZCBgcnVudGltZSBzaW5jZSBgYnVuZGxlZGAgbWF5IGJyZWFrIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYnkgY3JlYXRpbmcgX3ZpcnR1YWwgZGlyZWN0b3J5LlxuICAgICAgYmFiZWxIZWxwZXJzOiBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnYnVuZGxlZCcgOiAncnVudGltZScsXG4gICAgICBleGNsdWRlOiAvXiguK1xcLyk/bm9kZV9tb2R1bGVzXFwvLiskLyxcbiAgICB9KSxcbiAgICAuLi4ob3V0cHV0T3B0aW9uc0xpc3Quc29tZSgob3B0cykgPT4gb3B0cy5wcmVzZXJ2ZU1vZHVsZXMpID8gW3ByZXNlcnZlRGlyZWN0aXZlcygpXSA6IFtdKSxcbiAgICBzdHJpbmcoeyBpbmNsdWRlOiBbJyoqLyouY3N2JywgJyoqLyoudHh0J10gfSlcbiAgKTtcbiAgaWYgKGFyZ3YubWluaWZ5KSB7XG4gICAgcGx1Z2lucy5wdXNoKHRlcnNlcih7IGNvbXByZXNzOiB7IGRpcmVjdGl2ZXM6IGZhbHNlIH0gfSkpO1xuICB9XG4gIHBsdWdpbnMucHVzaChhbmFseXplKHsgc3VtbWFyeU9ubHk6IHRydWUgfSkpO1xuICByZXR1cm4gcGx1Z2lucztcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG4vLyBXZSBjYW5ub3QgdXNlIG5hbWVkIGltcG9ydHMgZnJvbSAndHlwZXNjcmlwdCcgYmVjYXVzZSBvZiBidWlsZCBlcnJvcnMuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gIGlmICghY29yZUNvbmZpZ0ZpbGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgdHNjb25maWcuanNvbiBpbiAke2NvcmVQcm9qZWN0RGlyUGF0aH0uYCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0ZvdW5kIHRzY29uZmlnLmpzb246JywgY29yZUNvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGxldCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBwYXRoLmJhc2VuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCksICdzcmMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29yZVByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChwcm9qZWN0RGlyUGF0aCA9PT0gY29yZVByb2plY3REaXJQYXRoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHRzLmZpbmRDb25maWdGaWxlKHByb2plY3REaXJQYXRoLCB0cy5zeXMuZmlsZUV4aXN0cyk7XG4gICAgICBjb25zdCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBkaXJlbnQubmFtZSwgJ3NyYycpO1xuICAgICAgaWYgKGNvbmZpZ0ZpbGUgJiYgZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgICAgIHByb2plY3RzLnB1c2goW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0RGlyID0gJ2Rpc3QnO1xuICB9XG4gIHByb2plY3RzLnB1c2goW2NvcmVQcm9qZWN0RGlyUGF0aCwgY29yZUNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuXG4gIGxldCBhbGxTdWNjZWVkZWQgPSB0cnVlO1xuICBmb3IgKGNvbnN0IFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyXSBvZiBwcm9qZWN0cykge1xuICAgIGFsbFN1Y2NlZWRlZCAmJj0gcnVuVHlwZVNjcmlwdENvbXBpbGVyKGFyZ3YsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBwYXRoLmpvaW4oY29yZVByb2plY3REaXJQYXRoLCBvdXREaXIpKTtcbiAgfVxuICByZXR1cm4gYWxsU3VjY2VlZGVkO1xufVxuXG5mdW5jdGlvbiBydW5UeXBlU2NyaXB0Q29tcGlsZXIoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHlwZVNjcmlwdENvbXBpbGVyKCknLCBwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyKTtcbiAgfVxuXG4gIGNvbnN0IHsgY29uZmlnIH0gPSB0cy5yZWFkQ29uZmlnRmlsZShjb25maWdGaWxlLCB0cy5zeXMucmVhZEZpbGUpO1xuICBjb25maWcuY29tcGlsZXJPcHRpb25zID0ge1xuICAgIC4uLmNvbmZpZy5jb21waWxlck9wdGlvbnMsXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG5vRW1pdE9uRXJyb3I6IHRydWUsXG4gICAgb3V0RGlyLFxuICB9O1xuICBjb25maWcuaW5jbHVkZSA9IFsnc3JjLyoqLyonXTtcbiAgY29uc3QgeyBlcnJvcnMsIGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gdHMucGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQoY29uZmlnLCB0cy5zeXMsIHByb2plY3REaXJQYXRoKTtcblxuICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbSh7IG9wdGlvbnMsIHJvb3ROYW1lczogZmlsZU5hbWVzLCBjb25maWdGaWxlUGFyc2luZ0RpYWdub3N0aWNzOiBlcnJvcnMgfSk7XG4gIGNvbnN0IHsgZGlhZ25vc3RpY3MsIGVtaXRTa2lwcGVkIH0gPSBwcm9ncmFtLmVtaXQoKTtcblxuICBjb25zdCBhbGxEaWFnbm9zdGljcyA9IFsuLi50cy5nZXRQcmVFbWl0RGlhZ25vc3RpY3MocHJvZ3JhbSksIC4uLmRpYWdub3N0aWNzLCAuLi5lcnJvcnNdO1xuICBpZiAoYWxsRGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZvcm1hdEhvc3Q6IHRzLkZvcm1hdERpYWdub3N0aWNzSG9zdCA9IHtcbiAgICAgIGdldENhbm9uaWNhbEZpbGVOYW1lOiAocGF0aCkgPT4gcGF0aCxcbiAgICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6IHRzLnN5cy5nZXRDdXJyZW50RGlyZWN0b3J5LFxuICAgICAgZ2V0TmV3TGluZTogKCkgPT4gdHMuc3lzLm5ld0xpbmUsXG4gICAgfTtcbiAgICBjb25zdCBtZXNzYWdlID0gdHMuZm9ybWF0RGlhZ25vc3RpY3MoYWxsRGlhZ25vc3RpY3MsIGZvcm1hdEhvc3QpO1xuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gIWVtaXRTa2lwcGVkO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBkYXRlVGltZSBmcm9tICdkYXRlLXRpbWUnO1xuaW1wb3J0IG1zIGZyb20gJ3ByZXR0eS1tcyc7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFJvbGx1cEJ1aWxkLCBSb2xsdXBPcHRpb25zIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCB7IHJvbGx1cCwgd2F0Y2ggfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyIH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHsgb25FeGl0IH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldENhdGVnb3J5LCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbGxUYXJnZXRDYXRlZ29yaWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmFtZXNwYWNlQW5kTmFtZSwgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlLCBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGFwcEJ1aWxkZXIsIGZ1bmN0aW9uc0J1aWxkZXIsIGxpYkJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgc2V0dXBQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW4uanMnO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tICcuL3JvbGx1cExvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMgfSBmcm9tICcuL3R5cGVTY3JpcHQuanMnO1xuXG5leHBvcnQgY29uc3QgYXBwOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGFwcEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2FwcCBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGFuIGFwcCcsXG4gIGJ1aWxkZXI6IGFwcEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnYXBwJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2Z1bmN0aW9ucyBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgR0NQL0ZpcmViYXNlIGZ1bmN0aW9ucyBhcHAnLFxuICBidWlsZGVyOiBmdW5jdGlvbnNCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5vbmx5UGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICAgICAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgIGlmICghcGFja2FnZUpzb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWlsZChhcmd2LCAnZnVuY3Rpb25zJyk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxpYjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBsaWJCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaWIgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIE5vZGUuanMgLyBSZWFjdCBsaWJyYXJ5JyxcbiAgYnVpbGRlcjogbGliQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdsaWInKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgdGFyZ2V0Q2F0ZWdvcnk6IFRhcmdldENhdGVnb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8PSAncHJvZHVjdGlvbic7XG5cbiAgLy8gYHNpbGVudGAgaXMgc3Ryb25nZXIgdGhhbiBgdmVyYm9zZWAuXG4gIGNvbnN0IHZlcmJvc2UgPSAhYXJndi5zaWxlbnQgJiYgYXJndi52ZXJib3NlO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcGFja2FnZURpclBhdGgpO1xuXG4gIGNvbnN0IGlucHV0cyA9IHZlcmlmeUlucHV0KGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCB0YXJnZXREZXRhaWwgPSBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnksIGlucHV0cyk7XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ2FyZ3Y6JywgYXJndik7XG4gICAgY29uc29sZS5pbmZvKCdwYWNrYWdlSnNvblBhdGg6JywgcGFja2FnZUpzb25QYXRoKTtcbiAgICBjb25zb2xlLmluZm8oJ1RhcmdldCAoQ2F0ZWdvcnkpOicsIGAke3RhcmdldERldGFpbH0gKCR7dGFyZ2V0Q2F0ZWdvcnl9KWApO1xuICB9XG5cbiAgY29uc3QgW25hbWVzcGFjZV0gPSBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uKTtcbiAgY29uc3QgaXNFc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG5cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKUyA9ICcxJztcbiAgfSBlbHNlIGlmIChhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTID0gJzEnO1xuICB9XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19WRVJCT1NFID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSA9IHRhcmdldENhdGVnb3J5O1xuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfREVUQUlMID0gdGFyZ2V0RGV0YWlsO1xuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0ID0gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlRGlyUGF0aCwgaXNFc21QYWNrYWdlKTtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ091dHB1dE9wdGlvbnM6Jywgb3V0cHV0T3B0aW9uc0xpc3QpO1xuICB9XG4gIGlmIChvdXRwdXRPcHRpb25zTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IG91dHB1dCBmaWxlcy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmNoZGlyKHBhY2thZ2VEaXJQYXRoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBSb2xsdXBPcHRpb25zID0ge1xuICAgIGlucHV0OlxuICAgICAgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJ1xuICAgICAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIGlucHV0cy5tYXAoKGlucHV0LCBpbmRleCkgPT4gW2luZGV4ID09PSAwID8gJ2luZGV4JyA6IHBhdGguYmFzZW5hbWUoaW5wdXQsIHBhdGguZXh0bmFtZShpbnB1dCkpLCBpbnB1dF0pXG4gICAgICAgICAgKVxuICAgICAgICA6IGlucHV0cyxcbiAgICBwbHVnaW5zOiBzZXR1cFBsdWdpbnMoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgbmFtZXNwYWNlLCBwYWNrYWdlRGlyUGF0aCwgb3V0cHV0T3B0aW9uc0xpc3QpLFxuICAgIHdhdGNoOiBhcmd2LndhdGNoID8geyBjbGVhclNjcmVlbjogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBjb25zdCBwYXRoVG9SZWxhdGl2ZVBhdGggPSAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHN0cmluZ1tdID0+XG4gICAgKEFycmF5LmlzQXJyYXkocGF0aHMpID8gcGF0aHMgOiBbcGF0aHNdKS5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHApKTtcbiAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICB3YXRjaFJvbGx1cChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBvcHRpb25zLCBvdXRwdXRPcHRpb25zTGlzdCwgcGF0aFRvUmVsYXRpdmVQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dHMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbignLCAnKVxuICAgICAgICAgICl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBidW5kbGU6IFJvbGx1cEJ1aWxkIHwgdW5kZWZpbmVkO1xuICAgIGxldCBidWlsZEZhaWxlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgX2J1bmRsZSA9IGF3YWl0IHJvbGx1cChvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke3BhdGhUb1JlbGF0aXZlUGF0aChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IG9wdHMuZmlsZSB8fCBvcHRzLmRpciB8fCAnJykpLmpvaW4oXG4gICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICl9IGluICR7Y2hhbGsuYm9sZChtcyhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJlxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJlxuICAgICAgIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpKVxuICAgICkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXRjaFJvbGx1cChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSb2xsdXBPcHRpb25zLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdLFxuICBwYXRoVG9SZWxhdGl2ZVBhdGg6IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaCh7IC4uLm9wdGlvbnMsIG91dHB1dDogb3V0cHV0T3B0aW9uc0xpc3QgfSk7XG5cbiAgY29uc3QgY2xvc2UgPSBhc3luYyAoY29kZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsb3NlKTtcbiAgICBpZiAod2F0Y2hlcikgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgIGlmIChjb2RlKSBwcm9jZXNzLmV4aXQoY29kZSk7XG4gIH07XG4gIG9uRXhpdChjbG9zZSBhcyB1bmtub3duIGFzIEhhbmRsZXIpO1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlKTtcbiAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gIH1cblxuICB3YXRjaGVyLm9uKCdldmVudCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGV2ZW50LmVycm9yLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCVU5ETEVfU1RBUlQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc3QgZXZlbnRJbnB1dCA9IGV2ZW50LmlucHV0O1xuICAgICAgICBjb25zdCBpbnB1dEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGV2ZW50SW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKGV2ZW50SW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlucHV0RmlsZXMucHVzaChcbiAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGV2ZW50SW5wdXQpID8gZXZlbnRJbnB1dCA6IE9iamVjdC52YWx1ZXMoZXZlbnRJbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dEZpbGVzKS5qb2luKCcsICcpKX0g4oaSICR7Y2hhbGsuYm9sZChcbiAgICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKVxuICAgICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9FTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgYENyZWF0ZWQgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChldmVudC5vdXRwdXQpLmpvaW4oJywgJykpfSBpbiAke2NoYWxrLmJvbGQobXMoZXZlbnQuZHVyYXRpb24pKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiYgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJykge1xuICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFTkQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG5bJHtkYXRlVGltZSgpfV0gd2FpdGluZyBmb3IgY2hhbmdlcy4uLmApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ3Jlc3VsdCcgaW4gZXZlbnQgJiYgZXZlbnQucmVzdWx0KSB7XG4gICAgICB2b2lkIGV2ZW50LnJlc3VsdC5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUlucHV0KGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBjd2Q6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3YuaW5wdXQgJiYgYXJndi5pbnB1dC5sZW5ndGggPiAwKSByZXR1cm4gYXJndi5pbnB1dC5tYXAoKHApID0+IHBhdGguam9pbihjd2QsIHAudG9TdHJpbmcoKSkpO1xuXG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgZm9yIChjb25zdCBleHQgb2YgWyd0cycsICd0c3gnLCAnY3RzJywgJ210cyddKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwYXRoLmpvaW4oc3JjRGlyUGF0aCwgYGluZGV4LiR7ZXh0fWApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGlucHV0KSkgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IGlucHV0IGZpbGUuJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5OiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10pOiBUYXJnZXREZXRhaWwge1xuICBzd2l0Y2ggKHRhcmdldENhdGVnb3J5KSB7XG4gICAgY2FzZSAnYXBwJzoge1xuICAgICAgcmV0dXJuICdhcHAtbm9kZSc7XG4gICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9ucyc6IHtcbiAgICAgIHJldHVybiAnZnVuY3Rpb25zJztcbiAgICB9XG4gICAgY2FzZSAnbGliJzoge1xuICAgICAgaWYgKGlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuZW5kc1dpdGgoJy50c3gnKSkpIHtcbiAgICAgICAgcmV0dXJuICdsaWItcmVhY3QnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdsaWInO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0YXJnZXQgb3B0aW9uIG11c3QgYmUgb25lIG9mOiAnICsgYWxsVGFyZ2V0Q2F0ZWdvcmllcy5qb2luKCcsICcpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBwYWNrYWdlSnNvbi5uYW1lICs9ICctZGlzdCc7XG4gIGNvbnN0IGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoZXNtUGFja2FnZSwgbW9kdWxlVHlwZSk7XG4gIHBhY2thZ2VKc29uLm1haW4gPSBlc21QYWNrYWdlID09PSBlc21PdXRwdXQgPyAnaW5kZXguanMnIDogZXNtT3V0cHV0ID8gJ2luZGV4Lm1qcycgOiAnaW5kZXguY2pzJztcblxuICAvLyBQcmV2ZW50IEZpcmViYXNlIEZ1bmN0aW9ucyBmcm9tIHJ1bm5pbmcgYGJ1aWxkYCBzY3JpcHQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIC8vIGRldkRlcGVuZGVuY2llcyBhcmUgbm90IHJlcXVpcmVkIHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSk7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dE9wdGlvbnNMaXN0KFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIGlzRXNtUGFja2FnZTogYm9vbGVhblxuKTogT3V0cHV0T3B0aW9uc1tdIHtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgICBmb3JtYXQ6IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKSA/ICdtb2R1bGUnIDogJ2NvbW1vbmpzJyxcbiAgICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCAmJiAnaW5saW5lJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wb3J0IHN0YXRlbWVudCBpbiBhbiBlc20gbW9kdWxlIGNhdXNlcyB0aGUgZm9sbG93aW5nIGVycm9yOlxuICAvLyBTdGF0ZW1lbnQ6XG4gIC8vICAgaW1wb3J0IHsgdXNlUHJldmlvdXMgfSBmcm9tICdyZWFjdC11c2UnO1xuICAvLyBFcnJvcjpcbiAgLy8gICBOYW1lZCBleHBvcnQgJ3VzZVByZXZpb3VzJyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICdyZWFjdC11c2UnIGlzIGEgQ29tbW9uSlMgbW9kdWxlLFxuICAvLyAgIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbiAgLy8gV2UgbmVlZCBjanMgbW9kdWxlcyBmb3Igd2ViIGFwcHMgdG8gYXZvaWQgdGhlIGVycm9yLlxuICAvLyBBbHNvLCBzcGxpdHRpbmcgYSBsaWJyYXJ5IGlzIHVzZWZ1bCBpbiBib3RoIG1vZHVsZXMsIHNvIHByZXNlcnZlTW9kdWxlcyBzaG91bGQgYmUgdHJ1ZS5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSA9IFtdO1xuICBjb25zdCBtb2R1bGVUeXBlID0gYXJndi5tb2R1bGVUeXBlIHx8ICdib3RoJztcbiAgY29uc3QganNFeHQgPSBhcmd2LmpzRXh0ZW5zaW9uIHx8ICdlaXRoZXInO1xuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2NqcycgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5janMnLFxuICAgICAgZm9ybWF0OiAnY29tbW9uanMnLFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0ubWpzJyxcbiAgICAgIGZvcm1hdDogJ21vZHVsZScsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXRwdXRPcHRpb25zTGlzdDtcbn1cblxuZnVuY3Rpb24gaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlOiBib29sZWFuLCBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1vZHVsZVR5cGUgPT09ICdlc20nIHx8ICgoIW1vZHVsZVR5cGUgfHwgbW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicpICYmIGlzRXNtUGFja2FnZSk7XG59XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBSb2xsdXBFcnJvciB9IGZyb20gJ3JvbGx1cCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogUm9sbHVwRXJyb3IsIHJlY292ZXIgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCAoZXJyb3IuY2F1c2UgYXMgRXJyb3IpPy5uYW1lO1xuICBjb25zdCBuYW1lU2VjdGlvbiA9IG5hbWUgPyBgJHtuYW1lfTogYCA6ICcnO1xuICBjb25zdCBwbHVnaW5TZWN0aW9uID0gZXJyb3IucGx1Z2luID8gYChwbHVnaW4gJHtlcnJvci5wbHVnaW59KSBgIDogJyc7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtwbHVnaW5TZWN0aW9ufSR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfWA7XG5cbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBbY2hhbGsuYm9sZChjaGFsay5yZWQoYFshXSAke2NoYWxrLmJvbGQobWVzc2FnZS50b1N0cmluZygpKX1gKSldO1xuXG4gIGlmIChlcnJvci51cmwpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmN5YW4oZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLmZyYW1lKSk7XG4gIH1cblxuICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmRpbShlcnJvci5zdGFjaz8ucmVwbGFjZShgJHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9XFxuYCwgJycpKSk7XG4gIH1cblxuICBvdXRwdXRMaW5lcy5wdXNoKCcnLCAnJyk7XG4gIGNvbnNvbGUuZXJyb3Iob3V0cHV0TGluZXMuam9pbignXFxuJykpO1xuXG4gIGlmICghcmVjb3ZlcikgcHJvY2Vzcy5leGl0KDEpO1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uL2Vudi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIG1vZHVsZToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtb2R1bGUgdHlwZTogY2pzIG9yIGVzbScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcnVuOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3J1biA8ZmlsZT4nLFxuICBkZXNjcmliZTogJ1J1biBzY3JpcHQnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcHJvY2Vzcy5jd2QoKSk7XG5cbiAgICBjb25zdCBmaWxlID0gYXJndi5maWxlPy50b1N0cmluZygpIHx8ICcnO1xuXG4gICAgLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgICBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MudmVyc2lvbnMuYnVuO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ25vZGUnO1xuICAgIGNvbnN0IGFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/IFsnLS1idW4nXSA6IFsnLS1uby13YXJuaW5ncycsICctLWltcG9ydCcsICd0c3gnXTtcbiAgICBpZiAoYXJndi53YXRjaCkge1xuICAgICAgYXJncy5wdXNoKCctLXdhdGNoJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChmaWxlKTtcbiAgICBjb25zdCBbLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzXSA9IGFyZ3YuXztcbiAgICBjb25zdCBydW50aW1lQXJncyA9IFsuLi5hcmdzLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzLm1hcCgoYXJnKSA9PiBhcmcudG9TdHJpbmcoKSldO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyAnJHtydW50aW1lfSAke3J1bnRpbWVBcmdzLmpvaW4oJyAnKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHJ1bnRpbWUsIHJ1bnRpbWVBcmdzLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52IH0sXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMgPz8gMSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBhcHAsIGZ1bmN0aW9ucywgbGliIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZC9idWlsZC5qcyc7XG5pbXBvcnQgeyBydW4gfSBmcm9tICcuL2NvbW1hbmRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5yZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCdidWlsZC10cycpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAuY29tbWFuZChhcHApXG4gIC5jb21tYW5kKGZ1bmN0aW9ucylcbiAgLmNvbW1hbmQobGliKVxuICAuY29tbWFuZChydW4pXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC5oZWxwKCkuYXJndjtcbiJdLCJuYW1lcyI6WyJlbnZWYXJzIiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIiwiYXJndiIsImN3ZCIsInJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwiT2JqZWN0Iiwia2V5cyIsImNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiIsImVudlZhcnNEZWYiLCJlbnZWYXJOYW1lcyIsIlNldCIsImlubGluZSIsImZsYXRNYXAiLCJlIiwidG9TdHJpbmciLCJzcGxpdCIsIm5hbWUiLCJ1bmRlZmluZWQiLCJwcm9jZXNzIiwiZW52IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbFRhcmdldENhdGVnb3JpZXMiLCJhc3luYyIsInJlYWRQYWNrYWdlSnNvbiIsImRpclBhdGgiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwiam9pbiIsInBhY2thZ2VKc29uVGV4dCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInBhcnNlIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Iiwic2lsZW50IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJidWlsZGVyIiwiaW5wdXQiLCJkZWZhdWx0IiwibWluaWZ5Iiwic291cmNlbWFwIiwiZXh0ZXJuYWwiLCJ3YXRjaCIsImtlZXBJbXBvcnQiLCJidW5kbGVCdWlsdGlucyIsImFwcEJ1aWxkZXIiLCJtb2R1bGVUeXBlIiwiZnVuY3Rpb25zQnVpbGRlciIsIm9ubHlQYWNrYWdlSnNvbiIsImxpYkJ1aWxkZXIiLCJqc0V4dGVuc2lvbiIsInNldHVwUGx1Z2lucyIsInRhcmdldERldGFpbCIsInBhY2thZ2VKc29uIiwibmFtZXNwYWNlIiwicGFja2FnZURpclBhdGgiLCJvdXRwdXRPcHRpb25zTGlzdCIsImV4dGVybmFsRGVwcyIsIm1hcCIsIml0ZW0iLCJkZXBlbmRlbmNpZXMiLCJwdXNoIiwicGVlckRlcGVuZGVuY2llcyIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VEaXJzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicGFja2FnZURpciIsImlzRGlyZWN0b3J5Iiwib3RoZXJQYWNrYWdlSnNvbiIsInJlYWRGaWxlU3luYyIsImV4dGVuc2lvbnMiLCJiYWJlbENvbmZpZ1BhdGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZGlybmFtZSIsInBsdWdpbnMiLCJyZXBsYWNlIiwiZGVsaW1pdGVycyIsInByZXZlbnRBc3NpZ25tZW50IiwidmFsdWVzIiwianNvbiIsIm5vZGVFeHRlcm5hbHMiLCJkZXBzIiwiZGV2RGVwcyIsInBlZXJEZXBzIiwib3B0RGVwcyIsImluY2x1ZGUiLCJSZWdFeHAiLCJleGNsdWRlIiwicmVzb2x2ZSIsInByZWZlckJ1aWx0aW5zIiwiaWQiLCJpbmNsdWRlcyIsImNvbW1vbmpzIiwibW9kdWxlTmFtZXMiLCJpc0JhYmVsSGVscGVyc0J1bmRsZWQiLCJCVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FIiwiYmFiZWwiLCJjb25maWdGaWxlIiwiYmFiZWxIZWxwZXJzIiwic29tZSIsIm9wdHMiLCJwcmVzZXJ2ZU1vZHVsZXMiLCJwcmVzZXJ2ZURpcmVjdGl2ZXMiLCJzdHJpbmciLCJ0ZXJzZXIiLCJjb21wcmVzcyIsImRpcmVjdGl2ZXMiLCJhbmFseXplIiwic3VtbWFyeU9ubHkiLCJnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMiLCJjb3JlUHJvamVjdERpclBhdGgiLCJjb3JlQ29uZmlnRmlsZSIsInRzIiwiZmluZENvbmZpZ0ZpbGUiLCJzeXMiLCJmaWxlRXhpc3RzIiwiRXJyb3IiLCJwcm9qZWN0cyIsIm91dERpciIsImJhc2VuYW1lIiwicGFyZW50RGlyUGF0aCIsImRpcmVudHMiLCJyZWFkZGlyIiwiZGlyZW50IiwicHJvamVjdERpclBhdGgiLCJhbGxTdWNjZWVkZWQiLCJydW5UeXBlU2NyaXB0Q29tcGlsZXIiLCJjb25maWciLCJyZWFkQ29uZmlnRmlsZSIsImNvbXBpbGVyT3B0aW9ucyIsImRlY2xhcmF0aW9uIiwiZW1pdERlY2xhcmF0aW9uT25seSIsIm5vRW1pdCIsIm5vRW1pdE9uRXJyb3IiLCJlcnJvcnMiLCJmaWxlTmFtZXMiLCJvcHRpb25zIiwicGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQiLCJwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsInJvb3ROYW1lcyIsImNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3MiLCJkaWFnbm9zdGljcyIsImVtaXRTa2lwcGVkIiwiZW1pdCIsImFsbERpYWdub3N0aWNzIiwiZ2V0UHJlRW1pdERpYWdub3N0aWNzIiwibGVuZ3RoIiwiZm9ybWF0SG9zdCIsImdldENhbm9uaWNhbEZpbGVOYW1lIiwiZ2V0Q3VycmVudERpcmVjdG9yeSIsImdldE5ld0xpbmUiLCJuZXdMaW5lIiwibWVzc2FnZSIsImZvcm1hdERpYWdub3N0aWNzIiwid2FybiIsImFwcCIsImNvbW1hbmQiLCJkZXNjcmliZSIsImhhbmRsZXIiLCJidWlsZCIsImZ1bmN0aW9ucyIsInBhY2thZ2UiLCJlcnJvciIsImV4aXQiLCJnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zIiwibGliIiwidGFyZ2V0Q2F0ZWdvcnkiLCJOT0RFX0VOViIsImlucHV0cyIsInAiLCJzcmNEaXJQYXRoIiwiZXh0IiwidmVyaWZ5SW5wdXQiLCJlbmRzV2l0aCIsImRldGVjdFRhcmdldERldGFpbCIsInBhY2thZ2VOYW1lIiwibWF0Y2giLCJleGVjIiwiZ2V0TmFtZXNwYWNlQW5kTmFtZSIsImlzRXNtUGFja2FnZSIsIkJVSUxEX1RTX0NPUkVKUyIsIkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyIsIkJVSUxEX1RTX1ZFUkJPU0UiLCJCVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkiLCJCVUlMRF9UU19UQVJHRVRfREVUQUlMIiwib3V0RGlyUGF0aCIsImRpciIsImZvcm1hdCIsImlzRXNtT3V0cHV0IiwianNFeHQiLCJlbnRyeUZpbGVOYW1lcyIsImdldE91dHB1dE9wdGlvbnNMaXN0IiwiY2hkaXIiLCJybSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwiZnJvbUVudHJpZXMiLCJpbmRleCIsImV4dG5hbWUiLCJjbGVhclNjcmVlbiIsInBhdGhUb1JlbGF0aXZlUGF0aCIsInBhdGhzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVsYXRpdmUiLCJ3YXRjaGVyIiwib3V0cHV0IiwiY2xvc2UiLCJyZW1vdmVMaXN0ZW5lciIsInN0ZGluIiwiY29kZSIsIm9uRXhpdCIsIm9uIiwiaXNUVFkiLCJyZXN1bWUiLCJldmVudCIsInJlY292ZXIiLCJjYXVzZSIsIm5hbWVTZWN0aW9uIiwicGx1Z2luIiwib3V0cHV0TGluZXMiLCJjaGFsayIsImJvbGQiLCJyZWQiLCJjeWFuIiwibG9jIiwiZmlsZSIsImxpbmUiLCJjb2x1bW4iLCJmcmFtZSIsImRpbSIsInN0YWNrIiwiaGFuZGxlRXJyb3IiLCJldmVudElucHV0IiwiaW5wdXRGaWxlcyIsImdyZWVuIiwibXMiLCJkdXJhdGlvbiIsImRhdGVUaW1lIiwicmVzdWx0Iiwid2F0Y2hSb2xsdXAiLCJidW5kbGUiLCJidWlsZEZhaWxlZCIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJfYnVuZGxlIiwicm9sbHVwIiwiUHJvbWlzZSIsImFsbCIsIndyaXRlIiwiZXNtUGFja2FnZSIsImVzbU91dHB1dCIsIm1haW4iLCJzY3JpcHRzIiwiZGV2RGVwZW5kZW5jaWVzIiwibWtkaXIiLCJ3cml0ZUZpbGUiLCJydW4iLCJtb2R1bGUiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwicnVudGltZSIsImFyZ3MiLCJhZGRpdGlvbmFsQXJndW1lbnRzIiwiXyIsInJ1bnRpbWVBcmdzIiwiYXJnIiwicmV0IiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luYyIsInN0ZGlvIiwic3RhdHVzIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwieWFyZ3MiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJoZWxwIl0sIm1hcHBpbmdzIjoicy9CQU1BLElBQUlBLEVBS0csU0FBU0MsRUFDZEMsRUFDQUMsR0FRQSxPQU5LSCxJQUNIQSxFQUFVSSxFQUFpQ0Ys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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "build-ts",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "14.0.0",
|
|
4
4
|
"repository": "github:WillBooster/build-ts",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "WillBooster Inc.",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"@willbooster/prettier-config": "10.0.0",
|
|
80
80
|
"@willbooster/wb": "8.1.1",
|
|
81
81
|
"conventional-changelog-conventionalcommits": "8.0.0",
|
|
82
|
-
"eslint": "9.
|
|
82
|
+
"eslint": "9.26.0",
|
|
83
83
|
"eslint-config-flat-gitignore": "2.1.0",
|
|
84
84
|
"eslint-config-prettier": "10.1.2",
|
|
85
85
|
"eslint-import-resolver-typescript": "4.3.4",
|