build-ts 17.3.0 → 18.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/README.md CHANGED
@@ -10,9 +10,9 @@ An opinionated, low-config build tool for Node.js applications and libraries wri
10
10
  ## Highlights
11
11
 
12
12
  - **No build-ts-specific config** — point it at a package and it bundles `src/index.{ts,tsx,cts,mts}` into `dist/` with sensible defaults (minification, sourcemaps, and tree-shaking enabled).
13
- - **Fast by design** — bundling is handled by Rolldown, declaration files are generated by `tsgo` ([TypeScript native preview](https://github.com/microsoft/typescript-go)), and console removal uses [Oxc](https://oxc.rs/) parsing. Babel is used only for features that require it, such as `core-js` polyfill injection and decorator transforms.
13
+ - **Fast by design** — bundling is handled by Rolldown, declaration files are generated by `tsgo` ([TypeScript native preview](https://github.com/microsoft/typescript-go)), and console removal uses [Oxc](https://oxc.rs/) parsing. Babel is used only for decorator transforms.
14
14
  - **Multiple targets** — Node.js apps, GCP/Firebase Functions, and Node.js / browser / React libraries.
15
- - **Dual-format libraries** — emits CommonJS and ES modules side by side, with configurable file extensions (`.js` / `.cjs` / `.mjs`).
15
+ - **Dual-format libraries** — emits CommonJS and ES modules side by side; the format matching `package.json`'s `type` uses `.js`, the other uses `.cjs` / `.mjs`.
16
16
  - **TypeScript runner** — executes TypeScript files directly via [tsx](https://tsx.is/) (or Bun when running on Bun).
17
17
 
18
18
  ## Requirements
@@ -82,15 +82,11 @@ npx build-ts run src/main.ts -- --foo bar
82
82
  | `--sourcemap` / `--no-sourcemap` | | `true` | Enable/disable sourcemaps. |
83
83
  | `--watch` | `-w` | `false` | Rebuild on file changes. |
84
84
  | `--external` | | | Additional dependencies to keep external (not bundled). |
85
- | `--core-js` | | `false` | Inject `core-js` polyfills via Babel. |
86
- | `--core-js-proposals` | | `false` | Inject `core-js` polyfills including proposals via Babel. |
87
85
  | `--inline` | | | Names of environment variables to inline into the bundle. |
88
86
  | `--auto-inline` | | `false` | Inline all environment variables defined in `.env` files. |
89
- | `--keep-import` | | | Identifiers to keep as import statements. |
90
- | `--bundle-builtins` | | | Module names that shadow Node.js builtins (e.g., `undici`) to be bundled. |
91
87
  | `--silent` | `-s` | `false` | Suppress non-error output. |
92
88
 
93
- Glob patterns in `--input` are expanded with matches sorted alphabetically, and a path that names an existing file is always taken literally. Two caveats: in watch mode, patterns are expanded only once at startup, so files created later are not picked up until a restart; and for the `functions` target, the main entry (`index`) is the first match, so prefer listing the main entry explicitly (entry-name conflicts fail the build).
89
+ An `--input` value containing glob syntax (`*`, `?`, `[...]`, or `{a,b}`) is expanded with matches sorted alphabetically; any other value is treated as a file path. Two caveats: in watch mode, patterns are expanded only once at startup, so files created later are not picked up until a restart; and for the `functions` target, the main entry (`index`) is the first match, so prefer listing the main entry explicitly (entry-name conflicts fail the build).
94
90
 
95
91
  ### `functions`-specific options
96
92
 
@@ -100,10 +96,9 @@ Glob patterns in `--input` are expanded with matches sorted alphabetically, and
100
96
 
101
97
  ### `lib`-specific options
102
98
 
103
- | Option | Alias | Default | Description |
104
- | -------------------- | ----- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
105
- | `--js-extension` | `-j` | `either` | Which format uses the `.js` extension: `either`, `both`, or `none`. Other formats use `.cjs` / `.mjs`. Avoid `both` together with `--module-type both`, since the two formats would write the same `.js` files. |
106
- | `--declaration-only` | | `false` | Emit only declaration (`.d.ts`) files without bundling JavaScript. |
99
+ | Option | Alias | Default | Description |
100
+ | -------------------- | ----- | ------- | ------------------------------------------------------------------ |
101
+ | `--declaration-only` | | `false` | Emit only declaration (`.d.ts`) files without bundling JavaScript. |
107
102
 
108
103
  When `--input` is given explicitly, declaration files are generated only for the entry files and the files they (transitively) import, matching the bundled JavaScript. Without `--input`, declarations cover all files under `src/`. Ambient declaration files (`src/**/*.d.{ts,mts,cts}`) always participate in type checking, so files they import may also emit declarations.
109
104
 
@@ -118,7 +113,7 @@ Run `npx build-ts <command> --help` for the full list of options, including envi
118
113
  - When `NODE_ENV` is `production`, `console.log`, `console.debug`, and other non-excluded global console methods are removed; `console.error`, `console.info`, and `console.warn` are preserved.
119
114
  - When `NODE_ENV` is `test`, `console.log` and other non-excluded methods are removed; `console.debug`, `console.error`, `console.info`, and `console.warn` are preserved.
120
115
  - When `NODE_ENV` is any other value, console removal is disabled.
121
- - Local bindings named `console` (function parameters, imports, `let`/`const`/`var` declarations, classes, and other shadowing forms) are always preserved.
116
+ - Local bindings named `console` (function parameters, imports, `let`/`const`/`var` declarations, and class/function declarations) are always preserved. A binding whose name comes from the declaring construct itself (`namespace console`, `enum console`, `import console = ...`) or one declared in a `case` clause is not detected.
122
117
 
123
118
  Console removal is controlled solely by `NODE_ENV`; there is no `--drop-console` option.
124
119
 
package/babel.config.mjs CHANGED
@@ -1,13 +1,8 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import url from 'node:url';
4
-
5
1
  import pluginProposalDecorators from '@babel/plugin-proposal-decorators';
6
2
  import pluginTransformExplicitResourceManagement from '@babel/plugin-transform-explicit-resource-management';
7
3
  import presetEnv from '@babel/preset-env';
8
4
  import presetReact from '@babel/preset-react';
9
5
  import presetTypescript from '@babel/preset-typescript';
10
- import pluginPolyfillCorejs3 from 'babel-plugin-polyfill-corejs3';
11
6
 
12
7
  /** @type {import('@babel/core').InputOptions} */
13
8
  const config = {
@@ -39,23 +34,6 @@ const config = {
39
34
  ],
40
35
  };
41
36
 
42
- if (process.env.BUILD_TS_COREJS || process.env.BUILD_TS_COREJS_WITH_PROPOSALS) {
43
- const rootPath = url.fileURLToPath(path.dirname(import.meta.url));
44
- const packageJson = JSON.parse(fs.readFileSync(path.join(rootPath, 'package.json'), 'utf8'));
45
- const [major, minor] = packageJson.dependencies['core-js'].split('.');
46
- const proposals = process.env.BUILD_TS_COREJS_WITH_PROPOSALS ? { proposals: true } : {};
47
-
48
- if (process.env.BUILD_TS_TARGET_CATEGORY === 'app') {
49
- config.plugins.push([
50
- pluginPolyfillCorejs3,
51
- { method: 'usage-global', version: `${major}.${minor}`, ...proposals },
52
- ]);
53
- } else if (process.env.BUILD_TS_TARGET_CATEGORY === 'lib') {
54
- // cf. https://github.com/babel/babel-polyfills#injection-methods
55
- config.plugins.push([pluginPolyfillCorejs3, { method: 'usage-pure', version: `${major}.${minor}`, ...proposals }]);
56
- }
57
- }
58
-
59
37
  if (process.env.BUILD_TS_TARGET_DETAIL === 'lib-react') {
60
38
  config.presets.push([
61
39
  presetReact,
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- import e from"node:fs";import t from"node:path";import{readAndApplyEnvironmentVariables as n,removeNpmAndYarnEnvironmentVariables as r,yargsOptionsBuilderForEnv as i}from"@willbooster/shared-lib-node";import a from"yargs";import{hideBin as o}from"yargs/helpers";import{styleText as s}from"node:util";import{rolldown as c,watch as l}from"rolldown";import{onExit as u}from"signal-exit";import d from"node:url";import f from"node:process";import{builtinModules as p,createRequire as m}from"node:module";import h from"magic-string";import{parseSync as g,visitorKeys as _}from"oxc-parser";import*as v from"node:child_process";let y;function b(e,t){return y||(y=n(e,t),e.verbose&&console.info(`Loaded env vars:`,Object.keys(y))),y}function x(e,t){let n={},r=new Set([...(e.inline??[]).flatMap(e=>e.toString().split(`,`)),...e.autoInline?Object.keys(b(e,t)):[]]);for(let e of r)process.env[e]!==void 0&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info(`Inline env vars:`,Object.keys(n)),n}const S=[`app`,`functions`,`lib`];async function C(n){let r=t.join(n,`package.json`);try{let t=await e.promises.readFile(r,`utf8`);return[JSON.parse(t),r]}catch{}return[void 0,r]}function w(){return t.dirname(t.dirname(d.fileURLToPath(import.meta.url)))}function ee(e){let t=e.name?.toString()??``,[,n,r]=/@([^/]+)\/(.+)/.exec(t)??[];return[n,r]}function te(e){return`${e.getFullYear()}-${T(e.getMonth()+1)}-${T(e.getDate())} ${T(e.getHours())}:${T(e.getMinutes())}:${T(e.getSeconds())}`}function T(e){return String(e).padStart(2,`0`)}function E(e){if(e<1e3)return`${Math.round(e)}ms`;let t=e/1e3;if(t<60)return`${Number(t.toFixed(1))}s`;let n=Math.floor(t/60);return`${n}m ${Number((t-n*60).toFixed(1))}s`}const D={...i,silent:{description:`Whether to suppress non-error output or not`,type:`boolean`,alias:`s`}},ne={...D,input:{description:`Paths or glob patterns (e.g. "src/**/*.ts") of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx,cts,mts}" 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`},outDir:{description:`Output directory. Defaults to "dist" in the package directory.`,type:`string`,alias:`o`},inline:{description:`Environment variables to be inlined.`,type:`array`},"auto-inline":{description:`Inline environment variables defined at env files.`,type:`boolean`,default:!1},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`}},re={...ne,moduleType:{description:`esm, cjs, or either (default).`,type:`string`,alias:`m`}},ie={...re,onlyPackageJson:{description:`Whether to generate only package.json.`,type:`boolean`}},ae={...ne,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`},declarationOnly:{description:`Emit only declaration (.d.ts) files without bundling JavaScript.`,type:`boolean`,default:!1}};function oe(e,t=!1){let n=e.name||e.cause?.name,r=n?`${n}: `:``,i=[s([`bold`,`red`],`[!] ${`${e.plugin?`(plugin ${e.plugin}) `:``}${r}${e.message}`}`)];e.url&&i.push(s(`cyan`,e.url)),e.loc?i.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&i.push(e.id),e.frame&&i.push(s(`dim`,e.frame)),e.stack&&i.push(s(`dim`,e.stack.replace(`${r}${e.message}\n`,``))),i.push(``,``),console.error(i.join(`
2
- `)),t||f.exit(1)}const se=new Set(p);function ce(e,t,n,r,i){let a=de(e),o=new Set(ue(e,t,n,i,r,a));return e=>pe(e,a)?!1:he(e)||le(e,o)}function le(e,t){if(t.has(e))return!0;for(let n=e.indexOf(`/`);n!==-1;n=e.indexOf(`/`,n+1))if(t.has(e.slice(0,n)))return!0;return!1}function ue(n,r,i,a,o,s){let c=[...n.external??[]].map(e=>e.toString());i.dependencies?.[`@prisma/client`]&&c.push(`prisma-client`),c.push(...Object.keys(i.dependencies??{}),...Object.keys(i.peerDependencies??{}),...Object.keys(i.optionalDependencies??{}));let l=t.dirname(a);if(e.existsSync(t.join(t.dirname(l),`package.json`))){let n=e.readdirSync(l,{withFileTypes:!0});for(let r of n){if(!r.isDirectory())continue;let n=t.join(l,r.name,`package.json`);if(!e.existsSync(n))continue;let a=JSON.parse(e.readFileSync(n,`utf8`));i.dependencies?.[a.name??``]&&c.push(...Object.keys(a.dependencies??{}),...Object.keys(a.peerDependencies??{}),...Object.keys(a.optionalDependencies??{}))}}let u=fe(r)&&o?RegExp(`^@?${o}(?:/.+)?`):void 0;return c.filter(e=>!s.has(O(e))&&!u?.test(e))}function de(e){return new Set(e.bundleBuiltins?.map(e=>O(e.toString()))??[])}function fe(e){return e===`app-node`||e===`functions`}function pe(e,t){let n=O(e);for(let e of t)if(n===e||n.startsWith(`${e}/`))return e}function me(e,t){let n=O(e);return n===t?`.`:`./${n.slice(t.length+1)}`}function O(e){return e.startsWith(`node:`)?e.slice(5):e}function he(e){return e.startsWith(`node:`)||se.has(e)}function ge(e,n){let r=de(e),i=m(t.join(n,`package.json`));return{name:`bundle-builtins`,resolveId(e,t,a){let o=pe(e,r);if(o)return _e(i,o,n,ve(a.kind),me(e,o))}}}function _e(n,r,i,a,o){let s=Se(n,r,i),c=JSON.parse(e.readFileSync(s,`utf8`));if(!c.exports){let e=ye(n,r,t.dirname(s),o);if(e!==r&&!e.startsWith(`node:`))return e}let l=Ce(c,a,o);if(!l)throw Error(`Failed to resolve package export for ${r}`);return t.join(t.dirname(s),l)}function ve(e){let t=new Set([`node-addons`,`node`,`module-sync`,`default`]);return e===`require-call`?t.add(`require`):t.add(`import`),t}function ye(e,t,n,r){if(r===`.`)return e.resolve(t);let i=e.resolve(`${t}/${r.slice(2)}`);return he(i)?be(n,r):i}function be(e,n){let r=P(n);if(!r)throw Error(`Failed to resolve package subpath ${n}`);let i=t.join(e,r),a=k(i)??xe(i);if(a)return a;throw Error(`Failed to resolve package subpath ${n}`)}function k(n){return(t.extname(n)?[n]:[n,`${n}.js`,`${n}.json`,`${n}.node`]).find(t=>e.existsSync(t)&&e.statSync(t).isFile())}function xe(n){let r=t.join(n,`package.json`);if(e.existsSync(r)){let i=JSON.parse(e.readFileSync(r,`utf8`)),a=k(t.join(n,i.main??`index.js`));if(a)return a}return k(t.join(n,`index`))}function Se(n,r,i){let a=n.resolve.paths(r)??n.resolve.paths(`__build_ts_package_lookup__`)??[];for(let n of[t.join(i,`node_modules`),...a]){let i=t.join(n,r,`package.json`);if(e.existsSync(i))return e.realpathSync(i)}throw Error(`Failed to resolve package.json for ${r}`)}function Ce(e,t,n){if(e.exports){let r=A(e.exports,t,n);return r===null?void 0:P(r)}return n===`.`?e.main??`index.js`:P(n)}function A(e,t,n,r){if(typeof e==`string`)return n===`.`?M(e,r):void 0;if(e===null)return null;if(Array.isArray(e)){if(n!==`.`)return;for(let i of e){let e;try{e=A(i,t,n,r)}catch{continue}if(e)return e}return}if(typeof e!=`object`)return;let i=e;if(we(i)){if(Object.hasOwn(i,n))return A(i[n],t,`.`);let e=Te(i,n);return e===void 0?void 0:A(e.value,t,`.`)}if(n===`.`)for(let[e,a]of Object.entries(i)){if(!t.has(e))continue;let i=A(a,t,n,r);if(i!==void 0)return i}}function we(e){return Object.keys(e).some(e=>e===`.`||e.startsWith(`./`))}function Te(e,t){for(let[n,r]of Object.entries(e).sort(([e],[t])=>Ee(e,t))){let e=De(n,t);if(e!==void 0)return{value:j(r,e)}}}function Ee(e,t){let n=e.indexOf(`*`),r=t.indexOf(`*`);return n===-1&&r===-1?0:n===-1?1:r===-1?-1:r-n||t.length-e.length}function De(e,t){if(!e.startsWith(`./`)||!e.includes(`*`))return;let[n,r]=e.split(`*`,2);if(!(t===n||!t.startsWith(n)||!t.endsWith(r)||t.length<e.length))return t.slice(n.length,t.length-r.length)}function j(e,t){return typeof e==`string`?M(e,t):Array.isArray(e)?e.map(e=>j(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,j(n,t)]))}function M(e,t){return Oe(e),t===void 0?e:(ke(t),e.replaceAll(`*`,t))}function Oe(e){if(!e.startsWith(`./`))throw Error(`Invalid package export target: ${e}`);N(e.slice(2),e)}function ke(e){N(e,e)}function N(e,t){let n=Ae(e,t),r=new Set([``,`.`,`..`,`node_modules`]);for(let e of n.split(/[\\/]/u))if(r.has(e))throw Error(`Invalid package export path segment in ${t}`)}function Ae(e,t){try{return decodeURIComponent(e).toLowerCase()}catch{throw Error(`Invalid package export path segment in ${t}`)}}function P(e){return e?.replace(/^\.\//,``)}const je=[`.cjs`,`.mjs`,`.js`,`.jsx`,`.cts`,`.mts`,`.ts`,`.tsx`];function F(e){return je.some(t=>e.endsWith(t))&&!e.startsWith(`\0`)&&!Me(e)}function Me(e){return e.includes(`/node_modules/`)||e.includes(`\\node_modules\\`)}function Ne(e,t){let n=Fe(e),r=Ie(e),i=g(e,t,{lang:n,sourceType:r});if(!Pe(i))return i;if(e.endsWith(`.js`)&&r===`unambiguous`){let r=g(e,t,{lang:n,sourceType:`commonjs`});if(!Pe(r))return r}}function Pe(e){return e.errors.some(e=>e.severity===`Error`)}function Fe(e){return e.endsWith(`.tsx`)?`tsx`:e.endsWith(`.ts`)||e.endsWith(`.cts`)||e.endsWith(`.mts`)?`ts`:e.endsWith(`.jsx`)?`jsx`:`js`}function Ie(e){return e.endsWith(`.cjs`)||e.endsWith(`.cts`)?`commonjs`:`unambiguous`}function I(e){return(_[e.type]??[]).flatMap(t=>{let n=e[t];return Array.isArray(n)?n:[n]}).filter(e=>z(e))}function L(e,t){let n=e[t];return z(n)?n:void 0}function R(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>z(e)):[]}function z(e){return!!e&&typeof e==`object`&&typeof e.type==`string`}function Le(e,t=`file.ts`){if(!e.includes(`@`))return!1;let n=Ne(t,e);return!n||z(n.program)&&Re(n.program)}function Re(e){return e.type===`Decorator`||I(e).some(e=>Re(e))}function ze(){let{env:e}=process;if(e.NODE_ENV===`production`)return new Set([`error`,`info`,`warn`]);if(e.NODE_ENV===`test`)return new Set([`debug`,`error`,`info`,`warn`])}function Be(e){return{name:`remove-console`,transform(t,n){if(F(n)&&/console|\\u/.test(t))return Ve(t,n,e)}}}function Ve(e,t,n){let r=Ne(t,e);if(!r||!z(r.program))return;let i=new h(e),a=[];B(r.program,[],[],a,n);for(let e of ft(a))i.overwrite(e.start,e.end,e.value);if(i.hasChanged())return{code:i.toString(),map:i.generateMap({hires:!0})}}const He=`(function () {})`,Ue=`(void 0)`;function B(e,t,n,r,i){let a=We(e,t.at(-1));a&&n.push(a),!nt(n,e)&&e.type===`CallExpression`&&rt(e,t,r,i),!nt(n,e)&&e.type===`MemberExpression`&&it(e,t,r,i);let o=[...t,e];for(let t of I(e))B(t,o,n,r,i);a&&n.pop()}function We(e,t){if(e.type===`Program`)return{end:e.end,shadowsConsole:Ge(e),start:e.start};if(K(e))return{end:e.end,shadowsConsole:Ke(e),start:e.start};if(e.type===`BlockStatement`){let n=t?K(t):!1;return{end:e.end,shadowsConsole:qe(e,!1)||n&&V(e),start:e.start}}if(e.type===`CatchClause`)return{end:e.end,shadowsConsole:G(e.param),start:e.start};if(e.type===`ClassExpression`)return{end:e.end,shadowsConsole:G(e.id),start:e.start};if(e.type===`StaticBlock`||e.type===`TSModuleBlock`)return{end:e.end,shadowsConsole:qe(e,!1)||V(e)||e.type===`TSModuleBlock`&&et(t),start:e.start};if(e.type===`SwitchStatement`)return{end:e.end,shadowsConsole:Je(e),start:Ye(e)};if(e.type===`SwitchCase`){let n=t?.type===`SwitchStatement`&&Je(t);return{end:e.end,shadowsConsole:n||Xe(e),start:Ze(e)}}if(e.type===`ForStatement`||e.type===`ForInStatement`||e.type===`ForOfStatement`)return{end:e.end,shadowsConsole:Qe(e),start:e.start}}function Ge(e){for(let t of R(e,`body`))if(H(t,!0))return!0;return V(e)}function Ke(e){if(G(e.id))return!0;for(let t of R(e,`params`))if(G(t))return!0;return!1}function qe(e,t){for(let n of R(e,`body`))if(H(n,t))return!0;return!1}function Je(e){for(let t of R(e,`cases`))for(let e of R(t,`consequent`))if(H(e,!1))return!0;return!1}function Ye(e){for(let t of R(e,`cases`)){let e=Ze(t);if(e<t.end)return e}return e.end}function Xe(e){for(let t of R(e,`consequent`))if(H(t,!1))return!0;return!1}function Ze(e){let t=L(e,`test`);return t?t.start:R(e,`consequent`)[0]?.start??e.end}function Qe(e){let t=L(e,e.type===`ForStatement`?`init`:`left`);return!!t&&t.type===`VariableDeclaration`&&t.kind!==`var`&&W(t)}function V(e){if(!e)return!1;for(let t of I(e))if(!(t!==e&&(K(t)||t.type===`StaticBlock`||t.type===`TSModuleBlock`))&&(t.type===`VariableDeclaration`&&t.kind===`var`&&W(t)||V(t)))return!0;return!1}function $e(e){return e.importKind!==`type`&&R(e,`specifiers`).some(e=>e.importKind!==`type`&&G(e.local))}function H(e,t){let n=pt(e)??e;return n.declare===!0?!1:n.type===`ImportDeclaration`?$e(n):n.type===`FunctionDeclaration`||n.type===`ClassDeclaration`?G(n.id):n.type===`TSImportEqualsDeclaration`?n.importKind!==`type`&&G(n.id):n.type===`TSEnumDeclaration`||n.type===`TSModuleDeclaration`?tt(L(n,`id`)):n.type===`VariableDeclaration`&&(t||n.kind!==`var`)&&W(n)}function et(e){return e?.type===`TSModuleDeclaration`&&e.declare!==!0&&U(L(e,`id`))}function tt(e){return e?e.type===`Identifier`?e.name===`console`:e.type===`TSQualifiedName`&&tt(L(e,`left`)):!1}function U(e){return e?e.type===`Identifier`?e.name===`console`:e.type===`TSQualifiedName`&&(U(L(e,`left`))||U(L(e,`right`))):!1}function W(e){return R(e,`declarations`).some(e=>G(L(e,`id`)))}function G(e){return z(e)?e.type===`Identifier`&&e.name===`console`?!0:e.type===`AssignmentPattern`||e.type===`RestElement`?G(e.left??e.argument):e.type===`TSParameterProperty`?G(e.parameter):e.type===`TSQualifiedName`?G(e.left):e.type===`ArrayPattern`?R(e,`elements`).some(e=>G(e)):e.type===`ObjectPattern`&&R(e,`properties`).some(e=>G(e.value??e.argument)):!1}function K(e){return e.type===`FunctionDeclaration`||e.type===`FunctionExpression`||e.type===`ArrowFunctionExpression`}function nt(e,t){return e.some(e=>e.shadowsConsole&&e.start<=t.start&&t.end<=e.end)}function rt(e,t,n,r){let i=t.at(-1),a=L(e,`callee`);if(e.optional!==!0){if(!a||!lt(a,r)){a&&ut(a,r)&&n.push({kind:`replace`,start:e.start,end:e.end,value:q(e,t)});return}i?.type===`ExpressionStatement`?n.push({kind:`replace`,start:i.start,end:i.end,value:`;`}):n.push({kind:`replace`,start:e.start,end:e.end,value:at(e,t)})}}function it(e,t,n,r){let i=t.at(-1),a=t.at(-2);if(!(!lt(e,r)||i?.type===`MemberExpression`)&&!(i?.type===`CallExpression`&&i.callee===e&&i.optional!==!0)&&!ct(e,i,a)){if(i?.type===`AssignmentExpression`&&i.left===e){let e=L(i,`right`);e&&n.push({kind:`replace`,start:e.start,end:e.end,value:q(e,t)});return}n.push({kind:`replace`,start:e.start,end:e.end,value:q(e,t)})}}function at(e,t){return ot(e,t)?`;${Ue}`:Ue}function q(e,t){return ot(e,t)?`;${He}`:He}function ot(e,t){let n=t.findLastIndex(e=>e.type===`ExpressionStatement`);if(n<0)return!1;let r=t[n];if(!r)return!1;let i=t[n-1];return r.start===e.start&&st(i)}function st(e){return e?.type===`Program`||e?.type===`BlockStatement`||e?.type===`StaticBlock`||e?.type===`TSModuleBlock`||e?.type===`SwitchCase`}function ct(e,t,n){return t?.type===`UpdateExpression`&&t.argument===e||(t?.type===`ForInStatement`||t?.type===`ForOfStatement`)&&t.left===e||t?.type===`ArrayPattern`||t?.type===`AssignmentPattern`&&t.left===e||t?.type===`Property`&&t.value===e&&n?.type===`ObjectPattern`}function lt(e,t){if(e.type!==`MemberExpression`)return!1;let n=L(e,`object`),r=L(e,`property`);return e.optional===!0||!n||!r||dt(e,r,t)?!1:J(n)?!0:n.type===`MemberExpression`&&J(L(n,`object`))&&e.computed!==!0&&r.type===`Identifier`&&(r.name===`call`||r.name===`apply`)}function ut(e,t){if(e.type!==`MemberExpression`)return!1;let n=L(e,`object`),r=L(e,`property`);if(!n||!r||n.type!==`MemberExpression`||e.computed===!0||r.type!==`Identifier`||r.name!==`bind`||!J(L(n,`object`)))return!1;let i=L(n,`property`);return!!i&&!dt(n,i,t)}function dt(e,t,n){return e.computed!==!0&&t.type===`Identifier`&&n.has(t.name)}function J(e){return e?.type===`Identifier`&&e.name===`console`}function ft(e){let t=[];for(let n of e.toSorted((e,t)=>e.start-t.start||t.end-e.end))t.some(e=>e.start<=n.start&&n.end<=e.end)||t.push(n);return t.toSorted((e,t)=>t.start-e.start)}function pt(e){if(!(e.type!==`ExportNamedDeclaration`&&e.type!==`ExportDefaultDeclaration`))return L(e,`declaration`)}function mt(e,t,n){let r=[ge(e,n),ht(e.keepImport?.map(e=>e.toString())??[])],i=ze();return i&&r.push(Be(i)),e[`core-js`]||e[`core-js-proposals`]?(r.push(gt()),t.some(e=>e.preserveModules)||r.push(yt())):r.push(_t()),r.push(Ct()),r}function ht(e){return{name:`keep-import`,resolveDynamicImport(t){return!e.includes(t)&&void 0}}}function gt(){return vt(`babel-core-js`,()=>!0)}function _t(){return vt(`babel-decorators`,Le)}function vt(e,n){let r=t.join(w(),`babel.config.mjs`);return{name:e,async transform(e,t){if(!F(t)||!n(e,t))return;let{transformAsync:i}=await import(`@babel/core`),a=await i(e,{caller:{name:`build-ts`,supportsDynamicImport:!0,supportsExportNamespaceFrom:!0,supportsStaticESM:!0},configFile:r,filename:t,sourceMaps:!0});if(a?.code)return{code:a.code,map:a.map}}}}function yt(){return{name:`commonjs-runtime-prelude`,renderChunk(e,t,n){let r=bt(e,n.format);if(!r)return;let i=new h(e);return i.appendLeft(St(e),`${r}\n`),{code:i.toString(),map:i.generateMap({hires:!0})}}}}function bt(e,t){if(e.includes(`__commonJSMin`))return xt(t)?e.includes(`__toESM`)?`var __create=Object.create,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__commonJSMin=(moduleFactory,module)=>()=>(module||(module={exports:{}},moduleFactory(module.exports,module)),module.exports),__copyProps=(to,from,except,descriptor)=>{if(from&&"object"==typeof from||"function"==typeof from)for(var key,names=__getOwnPropNames(from),index=0,length=names.length;index<length;index++)key=names[index],__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:(key=>from[key]).bind(null,key),enumerable:!(descriptor=__getOwnPropDesc(from,key))||descriptor.enumerable});return to},__toESM=(mod,isNodeMode,target)=>(target=null!=mod?__create(__getProtoOf(mod)):{},__copyProps(!isNodeMode&&mod&&mod.__esModule?target:__defProp(target,"default",{value:mod,enumerable:!0}),mod));`:void 0:`var __commonJSMin=(moduleFactory,module)=>()=>(module||(module={exports:{}},moduleFactory(module.exports,module)),module.exports);`}function xt(e){return e===`cjs`||e===`commonjs`}function St(e){let t=0;if(e.startsWith(`#!`)){let n=e.indexOf(`
3
- `);if(n===-1)return e.length;t=n+1}let n=/(?:(?:"[^"\n]*"|'[^'\n]*');?\s*)/y;for(;;){if(n.lastIndex=t,!n.exec(e)?.[0])return t;t=n.lastIndex}}function Ct(){return{name:`text`,async load(t){if(!t.endsWith(`.csv`)&&!t.endsWith(`.txt`))return;let n=await e.promises.readFile(t,`utf8`);return{code:`export default ${JSON.stringify(n)};`,moduleType:`js`}}}}const wt=m(import.meta.url);async function Y(n,r,i,a){let o=Dt(r);if(!o)throw Error(`Failed to find tsconfig.json in ${r}.`);n.verbose&&console.info(`Found tsconfig.json:`,o);let s=[],c=t.join(i,t.basename(r),`src`);if(e.existsSync(c)){a=void 0;let n=t.dirname(r),o=await e.promises.readdir(n,{withFileTypes:!0});r=t.resolve(r);for(let a of o){if(!a.isDirectory())continue;let o=t.resolve(n,a.name);if(o===r)continue;let c=Dt(o),l=t.join(i,a.name,`src`);c&&e.existsSync(l)&&s.push([o,c,l,void 0])}}else c=i;s.push([r,o,c,a]);let l=!0;for(let[e,t,r,i]of s)l&&=await Tt(n,e,t,r,i);return l}async function Tt(n,r,i,a,o){n.verbose&&console.info(`runTsgo()`,r,i,a,o);let s=t.join(r,`.build-ts-tsgo.${process.pid}.${Date.now()}.json`);try{await e.promises.writeFile(s,JSON.stringify(await Et(r,i,a,o),void 0,2));let t=v.spawnSync(process.execPath,[Ot(),`-p`,s],{cwd:r,stdio:`inherit`});if(t.error)throw t.error;return t.status===0}finally{await e.promises.rm(s,{force:!0})}}async function Et(e,n,r,i){let a={composite:!1,declaration:!0,declarationDir:r,emitDeclarationOnly:!0,incremental:!1,noEmit:!1,noEmitOnError:!0,outDir:r,rootDir:`src`};if(await kt(t.join(e,`src`))){let t=At(e),n=t?await jt(t):[];n.includes(`node`)&&(a.types=n)}return{compilerOptions:a,extends:Mt(e,n),...i?.length?{exclude:[],files:i.map(n=>t.resolve(e,n).replaceAll(t.sep,`/`)),include:[`src/**/*.d.ts`,`src/**/*.d.mts`,`src/**/*.d.cts`]}:{include:[`src/**/*`]}}}function Dt(n){let r=t.resolve(n);for(;;){let n=t.join(r,`tsconfig.json`);if(e.existsSync(n))return n;let i=t.dirname(r);if(i===r)return;r=i}}function Ot(){let e=wt.resolve(`typescript/package.json`);return t.join(t.dirname(e),`lib`,`tsc.js`)}async function kt(n){try{let r=await e.promises.readdir(n,{withFileTypes:!0});for(let i of r){let r=t.join(n,i.name);if(i.isDirectory()){if(await kt(r))return!0}else if(/\.[cm]?tsx?$/.test(i.name)&&(await e.promises.readFile(r,`utf8`)).includes(`node:`))return!0}}catch{return!1}return!1}function At(n){let r=t.resolve(n);for(;;){let n=t.join(r,`node_modules`,`@types`);if(e.existsSync(n))return n;let i=t.dirname(r);if(i===r)return;r=i}}async function jt(t){try{return(await e.promises.readdir(t,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}function Mt(e,n){let r=t.relative(e,n).replaceAll(t.sep,`/`);return r.startsWith(`.`)?r:`./${r}`}const Nt={command:`app [package]`,describe:`Build an app`,builder:re,async handler(e){return X(e,`app`)}},Pt={command:`functions [package]`,describe:`Build a GCP/Firebase functions app`,builder:ie,async handler(e){if(e.onlyPackageJson){let n=t.resolve(e.package?.toString()??`.`),[r,i]=await C(n);r||(console.error(`Failed to parse package.json (${i}).`),process.exit(1)),await Kt(Rt(e,process.cwd(),n,void 0,`functions`),r,e.moduleType)}else return X(e,`functions`)}},Ft={command:`lib [package]`,describe:`Build a Node.js / React library`,builder:ae,async handler(e){return X(e,`lib`)}};async function X(n,r){process.env.NODE_ENV||=`production`;let i=!n.silent&&n.verbose,a=process.cwd(),o=t.resolve(n.package?.toString()??`.`),[l,u]=await C(o);l||(console.error(`Failed to parse package.json (${u}).`),process.exit(1)),b(n,o);let d=Ht(n,a,o),f=Ut(r,d,o),p=Rt(n,a,o,d,r),m=n.input?.length?d:void 0;i&&(console.info(`argv:`,n),console.info(`packageJsonPath:`,u),console.info(`Target (Category):`,`${f} (${r})`));let[h]=ee(l),g=l.type===`module`;n[`core-js`]?process.env.BUILD_TS_COREJS=`1`:n[`core-js-proposals`]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS=`1`),i&&(process.env.BUILD_TS_VERBOSE=`1`),process.env.BUILD_TS_TARGET_CATEGORY=r,process.env.BUILD_TS_TARGET_DETAIL=f;let _=`declarationOnly`in n&&n.declarationOnly;_&&n.watch&&(console.error(`--declaration-only cannot be used with --watch.`),process.exit(1));let v=qt(n,f,p,g,o);if(i&&console.info(`OutputOptions:`,v),v.length===0&&(console.error(`Failed to detect output files.`),process.exit(1)),process.chdir(o),await e.promises.rm(p,{recursive:!0,force:!0}),f===`functions`&&await Kt(p,l,n.moduleType),_){n.silent||console.info(s(`cyan`,`Generates declaration files → ${s(`bold`,t.relative(o,p))}\non ${o} ...`)),await Y(n,o,p,m)||process.exit(1);return}let y={checks:{preferBuiltinFeature:!1},external:ce(n,f,l,h,o),input:f===`functions`?Bt(d):d,plugins:mt(n,v,o),resolve:{extensionAlias:{".cjs":[`.cjs`,`.cts`],".js":[`.js`,`.ts`,`.tsx`],".mjs":[`.mjs`,`.mts`]},extensions:[`.cts`,`.mts`,`.ts`,`.tsx`,`.cjs`,`.mjs`,`.js`,`.jsx`,`.json`]},treeshake:n[`core-js`]||n[`core-js-proposals`]?!1:void 0,transform:It(n,o),watch:n.watch?{clearScreen:!1}:void 0},x=e=>(Array.isArray(e)?e:[e]).map(e=>t.relative(o,e)),S=e=>{let t=x(v.map(e=>e.file||e.dir||``));console.info(s(`cyan`,`Bundles ${s(`bold`,x(e).join(`, `))} → ${s(`bold`,t.join(`, `))}\non ${o} ...`))};if(n.watch)Lt(n,f,o,p,m,y,v,x,S);else{n.silent||S(d);let e,t=!1;try{let t=Date.now(),r=await c(y);e=r,await Promise.all(v.map(e=>r.write(e))),n.silent||console.info(s(`green`,`Created ${x(v.map(e=>e.file||e.dir||``)).join(`, `)} in ${s(`bold`,E(Date.now()-t))}`))}catch(e){t=!0,console.error(`Failed to build due to:`,e)}await e?.close(),t&&process.exit(1),f!==`app-node`&&f!==`functions`&&!await Y(n,o,p,m)&&process.exit(1)}}function It(e,t){return{define:x(e,t),jsx:`react-jsx`,target:`es2022`}}function Lt(e,t,n,r,i,a,o,c,d){let f=l({...a,output:o}),p=async e=>{process.removeListener(`uncaughtException`,m),process.stdin.removeListener(`end`,h),await f.close(),e&&process.exit(e)},m=e=>{console.error(e),p(1)},h=()=>{p()};u(e=>void p(e)),process.on(`uncaughtException`,m),process.stdin.isTTY||(process.stdin.on(`end`,h),process.stdin.resume()),f.on(`event`,async o=>{try{switch(o.code){case`ERROR`:oe(o.error,!0);break;case`BUNDLE_START`:if(e.silent)break;d(Vt(a.input));break;case`BUNDLE_END`:e.silent||console.info(s(`green`,`Created ${s(`bold`,c(o.output).join(`, `))} in ${s(`bold`,E(o.duration))}`)),t!==`app-node`&&t!==`functions`&&await Y(e,n,r,i);break;case`END`:if(e.silent)break;console.info(`\n[${te(new Date)}] waiting for changes...`);break}}catch(e){console.error(`Failed to handle watch event due to:`,e)}finally{`result`in o&&o.result&&o.result.close()}})}function Rt(n,r,i,a,o){Array.isArray(n.outDir)&&(console.error(`Multiple --out-dir options are not allowed.`),process.exit(1));let s=typeof n.outDir==`string`?n.outDir:void 0;s===``&&(console.error(`--out-dir must not be empty.`),process.exit(1));let c=t.resolve(r,s??t.join(i,`dist`)),l=Z(c),u=a?.find(e=>Q(l,Z(e))||Q(c,e));if(u&&(console.error(`The output directory (${l}) must not contain the input file (${u}).`),process.exit(1)),!s)return c;let d=Z(i);(Q(l,d)||Q(c,i))&&(console.error(`--out-dir (${l}) must not contain the package directory (${d}).`),process.exit(1));let f=Z(t.join(d,`src`));return(Q(f,l)||Q(t.join(i,`src`),c))&&(console.error(`--out-dir (${l}) must not be inside the source directory (${f}).`),process.exit(1)),o!==`functions`&&e.existsSync(t.join(l,`package.json`))&&(console.error(`--out-dir (${l}) contains a package.json, so it looks like a package directory.`),process.exit(1)),c}function Z(n){let r=[],i=n;for(;!e.existsSync(i);){r.unshift(t.basename(i));let e=t.dirname(i);if(e===i)break;i=e}try{i=e.realpathSync(i)}catch{}return t.join(i,...r)}function Q(e,n){let r=t.relative(e,n);return r===``||!t.isAbsolute(r)&&r!==`..`&&!r.startsWith(`..${t.sep}`)}function zt(n){let r=t.extname(n),i={".cjs":[`.cts`],".js":[`.ts`,`.tsx`],".mjs":[`.mts`]}[r]??[];return[...[`.cts`,`.mts`,`.ts`,`.tsx`,`.cjs`,`.mjs`,`.js`,`.jsx`,`.json`].map(e=>n+e),...i.map(e=>n.slice(0,-r.length)+e)].some(t=>e.statSync(t,{throwIfNoEntry:!1})?.isFile())}function Bt(e){let n=Object.create(null);for(let[r,i]of e.entries()){let e=r===0?`index`:t.basename(i,t.extname(i));n[e]&&(console.error(`Entry names conflict in the functions build: "${e}" (${n[e]} vs ${i}). List --input files explicitly with unique base names, keeping the main entry first.`),process.exit(1)),n[e]=i}return n}function Vt(e){return e?typeof e==`string`?[e]:Array.isArray(e)?e:Object.values(e):[]}function Ht(n,r,i){if(n.input&&n.input.length>0){let i=n.input.flatMap(n=>{let i=n.toString(),a=t.resolve(r,i),o=e.statSync(a,{throwIfNoEntry:!1});if(o?.isFile())return[a];let s=i.split(t.sep).join(`/`),c=e.globSync(s,{cwd:r}).filter(n=>!/\.d\.[cm]?ts$/.test(n)&&e.statSync(t.resolve(r,n),{throwIfNoEntry:!1})?.isFile()).sort().map(e=>t.resolve(r,e));return c.length>0?c:(o?.isDirectory()||zt(a)||/[*?]|[@!+]\(|\[.*\]|\{[^}]*(,|\.\.)[^}]*\}/.test(i)&&(console.error(`No files matched the input pattern: ${i}`),process.exit(1)),[a])});return[...new Set(i)]}let a=t.join(i,`src`);for(let n of[`ts`,`tsx`,`cts`,`mts`]){let r=t.join(a,`index.${n}`);if(e.existsSync(r))return[r]}console.error(`Failed to detect input file.`),process.exit(1)}function Ut(e,t,n){switch(e){case`app`:return`app-node`;case`functions`:return`functions`;case`lib`:return t.some(e=>e.endsWith(`.tsx`))||Wt(n)?`lib-react`:`lib`;default:console.error(`target option must be one of: `+S.join(`, `)),process.exit(1)}}function Wt(e){return Gt(t.join(e,`src`))}function Gt(n){try{return e.readdirSync(n,{withFileTypes:!0}).some(e=>{let r=t.join(n,e.name);return e.isDirectory()?Gt(r):e.isFile()&&e.name.endsWith(`.tsx`)})}catch{return!1}}async function Kt(n,r,i){r.name+=`-dist`;let a=r.type===`module`,o=$(a,i);r.main=a===o?`index.js`:o?`index.mjs`:`index.cjs`,delete r.scripts,delete r.devDependencies,await e.promises.mkdir(n,{recursive:!0}),await e.promises.writeFile(t.join(n,`package.json`),JSON.stringify(r))}function qt(e,n,r,i,a){if(n===`app-node`||n===`functions`){let t=$(i,e.moduleType);return[{dir:r,format:t?`module`:`commonjs`,minify:e.minify,sourcemap:e.sourcemap&&`inline`,strict:!t}]}let o=[],s=e.moduleType||`both`,c=e.jsExtension||`either`;return(s===`cjs`||s===`both`||s===`either`&&!i)&&o.push({dir:r,entryFileNames:c===`both`||c===`either`&&!i?`[name].js`:`[name].cjs`,format:`commonjs`,minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(a,`src`),sourcemap:e.sourcemap,strict:!0}),(s===`esm`||s===`both`||s===`either`&&i)&&o.push({dir:r,entryFileNames:c===`both`||c===`either`&&i?`[name].js`:`[name].mjs`,format:`module`,minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(a,`src`),sourcemap:e.sourcemap}),o}function $(e,t){return t===`esm`||(!t||t===`either`)&&e}const Jt={command:`run <file>`,describe:`Run script`,builder:{...D,watch:{description:`Whether watch mode is enabled or not`,type:`boolean`,alias:`w`}},handler(e){b(e,process.cwd());let t=e.file?.toString()??``,n=process.versions.bun,r=n?`bun`:`node`,i=n?[`--bun`]:[`--no-warnings`,`--import`,`tsx`];e.watch&&i.push(`--watch`),i.push(t);let[,...a]=e._,o=[...i,...a.map(e=>e.toString())];e.verbose&&console.info(`Running '${r} ${o.join(` `)}'`);let s=v.spawnSync(r,o,{stdio:`inherit`,env:{...process.env}});process.exit(s.status??1)}};r(process.env),await a(o(process.argv)).scriptName(`build-ts`).options(D).command(Nt).command(Pt).command(Ft).command(Jt).demandCommand().strict().version(Yt()).help().argv;function Yt(){return JSON.parse(e.readFileSync(t.join(w(),`package.json`),`utf8`)).version}
4
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJidWlsZGVyIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Vudi50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1bmRsZXJMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvZXh0ZXJuYWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1bmRsZUJ1aWx0aW5zUGx1Z2luLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3RyYW5zZm9ybVV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2RlY29yYXRvckRldGVjdGlvbi50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yZW1vdmVDb25zb2xlUGx1Z2luLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3BsdWdpbi50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC90eXBlU2NyaXB0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1aWxkLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3J1bi50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmxldCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbG9hZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPixcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIWVudlZhcnMpIHtcbiAgICBlbnZWYXJzID0gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ0xvYWRlZCBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGRlZmluaXRpb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSBidWlsZC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBlbnZWYXJzRGVmOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGVudlZhck5hbWVzID0gbmV3IFNldChbXG4gICAgLi4uKGFyZ3YuaW5saW5lID8/IFtdKS5mbGF0TWFwKChlKSA9PiBlLnRvU3RyaW5nKCkuc3BsaXQoJywnKSksXG4gICAgLi4uKGFyZ3YuYXV0b0lubGluZSA/IE9iamVjdC5rZXlzKGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBjd2QpKSA6IFtdKSxcbiAgXSk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBlbnZWYXJOYW1lcykge1xuICAgIGlmIChwcm9jZXNzLmVudltuYW1lXSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGVudlZhcnNEZWZbYHByb2Nlc3MuZW52LiR7bmFtZX1gXSA9IEpTT04uc3RyaW5naWZ5KHByb2Nlc3MuZW52W25hbWVdKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdJbmxpbmUgZW52IHZhcnM6JywgT2JqZWN0LmtleXMoZW52VmFyc0RlZikpO1xuICB9XG4gIHJldHVybiBlbnZWYXJzRGVmO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMsIE9wdGlvbnMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBhbGxUYXJnZXRDYXRlZ29yaWVzID0gWydhcHAnLCAnZnVuY3Rpb25zJywgJ2xpYiddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYXJnZXRDYXRlZ29yeSA9ICh0eXBlb2YgYWxsVGFyZ2V0Q2F0ZWdvcmllcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldERldGFpbHMgPSBbJ2FwcC1ub2RlJywgJ2Z1bmN0aW9ucycsICdsaWInLCAnbGliLXJlYWN0J10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldERldGFpbCA9ICh0eXBlb2YgYWxsVGFyZ2V0RGV0YWlscylbbnVtYmVyXTtcblxuZXhwb3J0IHR5cGUgQXJndW1lbnRzVHlwZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgT3B0aW9ucz4+ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8VD4+O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFtQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgc3RyaW5nXT4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICByZXR1cm4gW0pTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCBwYWNrYWdlSnNvblBhdGhdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVpbGRUc1Jvb3RQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmRpcm5hbWUocGF0aC5kaXJuYW1lKHVybC5maWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVzcGFjZUFuZE5hbWUocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogW3N0cmluZyB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgdW5kZWZpbmVkXSB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gcGFja2FnZUpzb24ubmFtZT8udG9TdHJpbmcoKSA/PyAnJztcbiAgY29uc3QgbWF0Y2ggPSAvQChbXi9dKylcXC8oLispLy5leGVjKHBhY2thZ2VOYW1lKTtcbiAgY29uc3QgWywgbmFtZXNwYWNlLCBuYW1lXSA9IG1hdGNoID8/IFtdO1xuICByZXR1cm4gW25hbWVzcGFjZSwgbmFtZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtwYWQoZGF0ZS5nZXRNb250aCgpICsgMSl9LSR7cGFkKGRhdGUuZ2V0RGF0ZSgpKX0gJHtwYWQoZGF0ZS5nZXRIb3VycygpKX06JHtwYWQoXG4gICAgZGF0ZS5nZXRNaW51dGVzKClcbiAgKX06JHtwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpfWA7XG59XG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG1pbGxpc2Vjb25kcyA8IDEwMDApIHJldHVybiBgJHtNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyl9bXNgO1xuXG4gIGNvbnN0IHNlY29uZHMgPSBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICBpZiAoc2Vjb25kcyA8IDYwKSByZXR1cm4gYCR7TnVtYmVyKHNlY29uZHMudG9GaXhlZCgxKSl9c2A7XG5cbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgcmV0dXJuIGAke21pbnV0ZXN9bSAke051bWJlcigoc2Vjb25kcyAtIG1pbnV0ZXMgKiA2MCkudG9GaXhlZCgxKSl9c2A7XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHN1cHByZXNzIG5vbi1lcnJvciBvdXRwdXQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdzJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBpbnB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGhzIG9yIGdsb2IgcGF0dGVybnMgKGUuZy4gXCJzcmMvKiovKi50c1wiKSBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4LGN0cyxtdHN9XCIgZnJvbSBwYWNrYWdlIGRpcmVjdG9yeSBpcyB0YXJnZXRlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgYWxpYXM6ICdpJyxcbiAgfSxcbiAgJ2NvcmUtanMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICAnY29yZS1qcy1wcm9wb3NhbHMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBjb3JlLWpzIHdpdGggcHJvcG9zYWxzIHN1cHBvcnQgaXMgZW1wbG95ZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIG1pbmlmeToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgbWluaWZpY2F0aW9uIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgc291cmNlbWFwOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBzb3VyY2VtYXAgaXMgZW5hYmxlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBleHRlcm5hbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBleHRlcm5hbCBkZXBlbmRlbmNpZXMuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICBvdXREaXI6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBkaXJlY3RvcnkuIERlZmF1bHRzIHRvIFwiZGlzdFwiIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG4gIGlubGluZToge1xuICAgIGRlc2NyaXB0aW9uOiAnRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGJlIGlubGluZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnYXV0by1pbmxpbmUnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmxpbmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRlZmluZWQgYXQgZW52IGZpbGVzLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAga2VlcEltcG9ydDoge1xuICAgIGRlc2NyaXB0aW9uOiAnSWRlbnRpZmllcnMgdG8gYmUga2VwdCBhcyBpbXBvcnQgc3RhdGVtZW50cy4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gIGJ1bmRsZUJ1aWx0aW5zOiB7XG4gICAgZGVzY3JpcHRpb246ICdNb2R1bGUgbmFtZXMgc2FtZSB3aXRoIGJ1aWx0aW5zIChlLmcuLCB1bmRpY2kpIHRvIGJlIGJ1bmRsZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGFwcEJ1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIG1vZHVsZVR5cGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2VzbSwgY2pzLCBvciBlaXRoZXIgKGRlZmF1bHQpLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnNCdWlsZGVyID0ge1xuICAuLi5hcHBCdWlsZGVyLFxuICBvbmx5UGFja2FnZUpzb246IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gZ2VuZXJhdGUgb25seSBwYWNrYWdlLmpzb24uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgbGliQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIGVpdGhlciwgb3IgYm90aCAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICAvLyAuanMgZmlsZXMgaW4gYSBwYWNrYWdlIHdpdGggYFwidHlwZVwiOiBcIm1vZHVsZVwiYCBhcmUgdHJlYXRlZCBhcyBlc20uXG4gIC8vIEhvd2V2ZXIsIHdlIHdhbnQgdG8gdHJlYXQgdGhlbSBhcyBjanMgaW4gdGhlIGNhc2Ugd2hlcmUgYSBjanMgcHJvamVjdCBpbXBvcnRzIGFuIGVzbSBwYWNrYWdlLlxuICAvLyBUbyBkZWFsIHdpdGggdGhlIGNhc2UsIHdlIHVzZSAuY2pzIGFuZCAubWpzIGV4dGVuc2lvbnMgaW5zdGVhZCBvZiAuanMgZXh0ZW5zaW9uLlxuICBqc0V4dGVuc2lvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB1c2UgLmpzIGluIGNqcyBhbmQvb3IgZXNtOiBlaXRoZXIgKGRlZmF1bHQpLCBib3RoLCBvciBub25lLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdqJyxcbiAgfSxcbiAgZGVjbGFyYXRpb25Pbmx5OiB7XG4gICAgZGVzY3JpcHRpb246ICdFbWl0IG9ubHkgZGVjbGFyYXRpb24gKC5kLnRzKSBmaWxlcyB3aXRob3V0IGJ1bmRsaW5nIEphdmFTY3JpcHQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBBbnlCdWlsZGVyVHlwZSA9IHR5cGVvZiBhcHBCdWlsZGVyIHwgdHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXIgfCB0eXBlb2YgbGliQnVpbGRlcjtcbiIsImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBzdHlsZVRleHQgfSBmcm9tICdub2RlOnV0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3I6IEJ1aWxkRXJyb3IsIHJlY292ZXIgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCAoZXJyb3IuY2F1c2UgYXMgRXJyb3IpPy5uYW1lO1xuICBjb25zdCBuYW1lU2VjdGlvbiA9IG5hbWUgPyBgJHtuYW1lfTogYCA6ICcnO1xuICBjb25zdCBwbHVnaW5TZWN0aW9uID0gZXJyb3IucGx1Z2luID8gYChwbHVnaW4gJHtlcnJvci5wbHVnaW59KSBgIDogJyc7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtwbHVnaW5TZWN0aW9ufSR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfWA7XG5cbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBbc3R5bGVUZXh0KFsnYm9sZCcsICdyZWQnXSwgYFshXSAke21lc3NhZ2V9YCldO1xuXG4gIGlmIChlcnJvci51cmwpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKHN0eWxlVGV4dCgnY3lhbicsIGVycm9yLnVybCkpO1xuICB9XG5cbiAgaWYgKGVycm9yLmxvYykge1xuICAgIG91dHB1dExpbmVzLnB1c2goYCR7ZXJyb3IubG9jLmZpbGUgfHwgZXJyb3IuaWR9ICgke2Vycm9yLmxvYy5saW5lfToke2Vycm9yLmxvYy5jb2x1bW59KWApO1xuICB9IGVsc2UgaWYgKGVycm9yLmlkKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChlcnJvci5pZCk7XG4gIH1cblxuICBpZiAoZXJyb3IuZnJhbWUpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKHN0eWxlVGV4dCgnZGltJywgZXJyb3IuZnJhbWUpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5zdGFjaykge1xuICAgIG91dHB1dExpbmVzLnB1c2goc3R5bGVUZXh0KCdkaW0nLCBlcnJvci5zdGFjay5yZXBsYWNlKGAke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1cXG5gLCAnJykpKTtcbiAgfVxuXG4gIG91dHB1dExpbmVzLnB1c2goJycsICcnKTtcbiAgY29uc29sZS5lcnJvcihvdXRwdXRMaW5lcy5qb2luKCdcXG4nKSk7XG5cbiAgaWYgKCFyZWNvdmVyKSBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmludGVyZmFjZSBCdWlsZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjYXVzZT86IHVua25vd247XG4gIGZyYW1lPzogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgbG9jPzoge1xuICAgIGNvbHVtbjogbnVtYmVyO1xuICAgIGZpbGU/OiBzdHJpbmc7XG4gICAgbGluZTogbnVtYmVyO1xuICB9O1xuICBwbHVnaW4/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGJ1aWx0aW5Nb2R1bGVzIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5jb25zdCBub2RlQnVpbHRpbk1vZHVsZXMgPSBuZXcgU2V0KGJ1aWx0aW5Nb2R1bGVzKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4dGVybmFsTWF0Y2hlcihcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nXG4pOiAoaWQ6IHN0cmluZykgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IGJ1bmRsZWRCdWlsdGluTmFtZXMgPSBnZXRCdW5kbGVkQnVpbHRpbk5hbWVzKGFyZ3YpO1xuICBjb25zdCBleHRlcm5hbERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoXG4gICAgY29sbGVjdEV4dGVybmFsRGVwZW5kZW5jaWVzKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZUpzb24sIHBhY2thZ2VEaXJQYXRoLCBuYW1lc3BhY2UsIGJ1bmRsZWRCdWlsdGluTmFtZXMpXG4gICk7XG4gIHJldHVybiAoaWQpID0+IHtcbiAgICBpZiAoZ2V0QnVuZGxlZEJ1aWx0aW5QYWNrYWdlTmFtZShpZCwgYnVuZGxlZEJ1aWx0aW5OYW1lcykpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaXNOb2RlQnVpbHRpbihpZCkgfHwgbWF0Y2hlc01vZHVsZU9yU3VicGF0aChpZCwgZXh0ZXJuYWxEZXBlbmRlbmN5TmFtZXMpO1xuICB9O1xufVxuXG4vKiogQ2hlY2tzIHdoZXRoZXIgYGlkYCBlcXVhbHMgYSBuYW1lIGluIGBuYW1lc2Agb3IgaXMgYSBzdWJwYXRoIG9mIGl0IChlLmcuIGBsb2Rhc2guY2h1bmsvaW5kZXguanNgKS4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNNb2R1bGVPclN1YnBhdGgoaWQ6IHN0cmluZywgbmFtZXM6IFNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGlmIChuYW1lcy5oYXMoaWQpKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChsZXQgc2xhc2hJbmRleCA9IGlkLmluZGV4T2YoJy8nKTsgc2xhc2hJbmRleCAhPT0gLTE7IHNsYXNoSW5kZXggPSBpZC5pbmRleE9mKCcvJywgc2xhc2hJbmRleCArIDEpKSB7XG4gICAgaWYgKG5hbWVzLmhhcyhpZC5zbGljZSgwLCBzbGFzaEluZGV4KSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEV4dGVybmFsRGVwZW5kZW5jaWVzKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGJ1bmRsZWRCdWlsdGluTmFtZXM6IFNldDxzdHJpbmc+XG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBgZGVwczogdHJ1ZWAgZGlkIG5vdCBoYW5kbGUgaW1wb3J0cyBzdWNoIGFzIGBsb2Rhc2guY2h1bmsvaW5kZXguanNgLlxuICBleHRlcm5hbERlcHMucHVzaChcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9KVxuICApO1xuICAvLyBBZGQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZyb20gc2libGluZyBwYWNrYWdlc1xuICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VEaXJQYXRoKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZShwYXJlbnREaXJQYXRoKSwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXJzID0gZnMucmVhZGRpclN5bmMocGFyZW50RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4ocGFyZW50RGlyUGF0aCwgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVuZGxlZE5hbWVzcGFjZVBhdHRlcm4gPVxuICAgIHNob3VsZEJ1bmRsZVNhbWVOYW1lc3BhY2VEZXBlbmRlbmNpZXModGFyZ2V0RGV0YWlsKSAmJiBuYW1lc3BhY2UgPyBuZXcgUmVnRXhwKGBeQD8ke25hbWVzcGFjZX0oPzovLispP2ApIDogdW5kZWZpbmVkO1xuICByZXR1cm4gZXh0ZXJuYWxEZXBzLmZpbHRlcigoZGVwZW5kZW5jeU5hbWUpID0+IHtcbiAgICBpZiAoYnVuZGxlZEJ1aWx0aW5OYW1lcy5oYXMobm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGRlcGVuZGVuY3lOYW1lKSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIWJ1bmRsZWROYW1lc3BhY2VQYXR0ZXJuPy50ZXN0KGRlcGVuZGVuY3lOYW1lKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdW5kbGVkQnVpbHRpbk5hbWVzKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+KTogU2V0PHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFNldChhcmd2LmJ1bmRsZUJ1aWx0aW5zPy5tYXAoKGl0ZW0pID0+IG5vcm1hbGl6ZU5vZGVCdWlsdGluTmFtZShpdGVtLnRvU3RyaW5nKCkpKSA/PyBbXSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEJ1bmRsZVNhbWVOYW1lc3BhY2VEZXBlbmRlbmNpZXModGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVuZGxlZEJ1aWx0aW5QYWNrYWdlTmFtZShpZDogc3RyaW5nLCBidW5kbGVkQnVpbHRpbk5hbWVzOiBTZXQ8c3RyaW5nPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IG5vcm1hbGl6ZU5vZGVCdWlsdGluTmFtZShpZCk7XG4gIGZvciAoY29uc3QgcGFja2FnZU5hbWUgb2YgYnVuZGxlZEJ1aWx0aW5OYW1lcykge1xuICAgIGlmIChub3JtYWxpemVkSWQgPT09IHBhY2thZ2VOYW1lIHx8IG5vcm1hbGl6ZWRJZC5zdGFydHNXaXRoKGAke3BhY2thZ2VOYW1lfS9gKSkgcmV0dXJuIHBhY2thZ2VOYW1lO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlU3VicGF0aChpZDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGlkKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRJZCA9PT0gcGFja2FnZU5hbWUgPyAnLicgOiBgLi8ke25vcm1hbGl6ZWRJZC5zbGljZShwYWNrYWdlTmFtZS5sZW5ndGggKyAxKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaWQuc3RhcnRzV2l0aCgnbm9kZTonKSA/IGlkLnNsaWNlKCdub2RlOicubGVuZ3RoKSA6IGlkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlQnVpbHRpbihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpZC5zdGFydHNXaXRoKCdub2RlOicpIHx8IG5vZGVCdWlsdGluTW9kdWxlcy5oYXMoaWQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgSW1wb3J0S2luZCwgUGx1Z2luIH0gZnJvbSAncm9sbGRvd24nO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGdldEJ1bmRsZWRCdWlsdGluTmFtZXMsIGdldEJ1bmRsZWRCdWlsdGluUGFja2FnZU5hbWUsIGdldFBhY2thZ2VTdWJwYXRoLCBpc05vZGVCdWlsdGluIH0gZnJvbSAnLi9leHRlcm5hbHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVuZGxlQnVpbHRpbnNQbHVnaW4oYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBQbHVnaW4ge1xuICBjb25zdCBidW5kbGVkQnVpbHRpbk5hbWVzID0gZ2V0QnVuZGxlZEJ1aWx0aW5OYW1lcyhhcmd2KTtcbiAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdidW5kbGUtYnVpbHRpbnMnLFxuICAgIHJlc29sdmVJZChzb3VyY2UsIF9pbXBvcnRlciwgZXh0cmFPcHRpb25zKSB7XG4gICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGdldEJ1bmRsZWRCdWlsdGluUGFja2FnZU5hbWUoc291cmNlLCBidW5kbGVkQnVpbHRpbk5hbWVzKTtcbiAgICAgIGlmICghcGFja2FnZU5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiByZXNvbHZlUGFja2FnZUVudHJ5KFxuICAgICAgICByZXF1aXJlLFxuICAgICAgICBwYWNrYWdlTmFtZSxcbiAgICAgICAgcGFja2FnZURpclBhdGgsXG4gICAgICAgIGdldFBhY2thZ2VFeHBvcnRDb25kaXRpb25zKGV4dHJhT3B0aW9ucy5raW5kKSxcbiAgICAgICAgZ2V0UGFja2FnZVN1YnBhdGgoc291cmNlLCBwYWNrYWdlTmFtZSlcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeShcbiAgcmVxdWlyZTogTm9kZUpTLlJlcXVpcmUsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmRpdGlvbnM6IFNldDxzdHJpbmc+LFxuICBzdWJwYXRoOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGZpbmRQYWNrYWdlSnNvblBhdGgocmVxdWlyZSwgcGFja2FnZU5hbWUsIHBhY2thZ2VEaXJQYXRoKTtcbiAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgaWYgKCFwYWNrYWdlSnNvbi5leHBvcnRzKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZVBhY2thZ2VXaXRob3V0RXhwb3J0cyhyZXF1aXJlLCBwYWNrYWdlTmFtZSwgcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksIHN1YnBhdGgpO1xuICAgIGlmIChyZXNvbHZlZFBhdGggIT09IHBhY2thZ2VOYW1lICYmICFyZXNvbHZlZFBhdGguc3RhcnRzV2l0aCgnbm9kZTonKSkgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGVudHJ5UGF0aCA9IGdldFBhY2thZ2VFbnRyeVBhdGgocGFja2FnZUpzb24sIGNvbmRpdGlvbnMsIHN1YnBhdGgpO1xuICBpZiAoIWVudHJ5UGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgcGFja2FnZSBleHBvcnQgZm9yICR7cGFja2FnZU5hbWV9YCk7XG4gIH1cbiAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgZW50cnlQYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2FnZUV4cG9ydENvbmRpdGlvbnMoaW1wb3J0S2luZDogSW1wb3J0S2luZCk6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgY29uZGl0aW9ucyA9IG5ldyBTZXQoWydub2RlLWFkZG9ucycsICdub2RlJywgJ21vZHVsZS1zeW5jJywgJ2RlZmF1bHQnXSk7XG4gIGlmIChpbXBvcnRLaW5kID09PSAncmVxdWlyZS1jYWxsJykge1xuICAgIGNvbmRpdGlvbnMuYWRkKCdyZXF1aXJlJyk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5hZGQoJ2ltcG9ydCcpO1xuICB9XG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZVdpdGhvdXRFeHBvcnRzKFxuICByZXF1aXJlOiBOb2RlSlMuUmVxdWlyZSxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgc3VicGF0aDogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBpZiAoc3VicGF0aCA9PT0gJy4nKSByZXR1cm4gcmVxdWlyZS5yZXNvbHZlKHBhY2thZ2VOYW1lKTtcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVxdWlyZS5yZXNvbHZlKGAke3BhY2thZ2VOYW1lfS8ke3N1YnBhdGguc2xpY2UoJy4vJy5sZW5ndGgpfWApO1xuICByZXR1cm4gaXNOb2RlQnVpbHRpbihyZXNvbHZlZFBhdGgpID8gcmVzb2x2ZVBhY2thZ2VTdWJwYXRoRnJvbURpcihwYWNrYWdlRGlyUGF0aCwgc3VicGF0aCkgOiByZXNvbHZlZFBhdGg7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlU3VicGF0aEZyb21EaXIocGFja2FnZURpclBhdGg6IHN0cmluZywgc3VicGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VicGF0aEVudHJ5UGF0aCA9IG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoc3VicGF0aCk7XG4gIGlmICghc3VicGF0aEVudHJ5UGF0aCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlIHN1YnBhdGggJHtzdWJwYXRofWApO1xuXG4gIGNvbnN0IGVudHJ5UGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgc3VicGF0aEVudHJ5UGF0aCk7XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVGaWxlUGF0aChlbnRyeVBhdGgpID8/IHJlc29sdmVEaXJlY3RvcnlQYXRoKGVudHJ5UGF0aCk7XG4gIGlmIChyZXNvbHZlZFBhdGgpIHJldHVybiByZXNvbHZlZFBhdGg7XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgcGFja2FnZSBzdWJwYXRoICR7c3VicGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpbGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmaWxlUGF0aHMgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpID8gW2ZpbGVQYXRoXSA6IFtmaWxlUGF0aCwgYCR7ZmlsZVBhdGh9LmpzYCwgYCR7ZmlsZVBhdGh9Lmpzb25gLCBgJHtmaWxlUGF0aH0ubm9kZWBdO1xuICByZXR1cm4gZmlsZVBhdGhzLmZpbmQoKGNhbmRpZGF0ZVBhdGgpID0+IGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCkgJiYgZnMuc3RhdFN5bmMoY2FuZGlkYXRlUGF0aCkuaXNGaWxlKCkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0b3J5UGF0aChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICBjb25zdCBtYWluUGF0aCA9IHJlc29sdmVGaWxlUGF0aChwYXRoLmpvaW4oZGlyUGF0aCwgcGFja2FnZUpzb24ubWFpbiA/PyAnaW5kZXguanMnKSk7XG4gICAgaWYgKG1haW5QYXRoKSByZXR1cm4gbWFpblBhdGg7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVGaWxlUGF0aChwYXRoLmpvaW4oZGlyUGF0aCwgJ2luZGV4JykpO1xufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb25QYXRoKHJlcXVpcmU6IE5vZGVKUy5SZXF1aXJlLCBwYWNrYWdlTmFtZTogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbW9kdWxlUGF0aHMgPSByZXF1aXJlLnJlc29sdmUucGF0aHMocGFja2FnZU5hbWUpID8/IHJlcXVpcmUucmVzb2x2ZS5wYXRocygnX19idWlsZF90c19wYWNrYWdlX2xvb2t1cF9fJykgPz8gW107XG4gIGZvciAoY29uc3QgbW9kdWxlUGF0aCBvZiBbcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnbm9kZV9tb2R1bGVzJyksIC4uLm1vZHVsZVBhdGhzXSkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihtb2R1bGVQYXRoLCBwYWNrYWdlTmFtZSwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmcy5yZWFscGF0aFN5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIHBhY2thZ2UuanNvbiBmb3IgJHtwYWNrYWdlTmFtZX1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2FnZUVudHJ5UGF0aChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIGNvbmRpdGlvbnM6IFNldDxzdHJpbmc+LCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocGFja2FnZUpzb24uZXhwb3J0cykge1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGdldEV4cG9ydEVudHJ5UGF0aChwYWNrYWdlSnNvbi5leHBvcnRzLCBjb25kaXRpb25zLCBzdWJwYXRoKTtcbiAgICByZXR1cm4gZW50cnlQYXRoID09PSBudWxsID8gdW5kZWZpbmVkIDogbm9ybWFsaXplUGFja2FnZUVudHJ5UGF0aChlbnRyeVBhdGgpO1xuICB9XG4gIGlmIChzdWJwYXRoID09PSAnLicpIHJldHVybiBwYWNrYWdlSnNvbi5tYWluID8/ICdpbmRleC5qcyc7XG4gIHJldHVybiBub3JtYWxpemVQYWNrYWdlRW50cnlQYXRoKHN1YnBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRFbnRyeVBhdGgoXG4gIGV4cG9ydHNGaWVsZDogdW5rbm93bixcbiAgY29uZGl0aW9uczogU2V0PHN0cmluZz4sXG4gIHN1YnBhdGg6IHN0cmluZyxcbiAgcGF0dGVybk1hdGNoPzogc3RyaW5nXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRzRmllbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN1YnBhdGggPT09ICcuJyA/IHJlc29sdmVFeHBvcnRUYXJnZXQoZXhwb3J0c0ZpZWxkLCBwYXR0ZXJuTWF0Y2gpIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmIChleHBvcnRzRmllbGQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAoQXJyYXkuaXNBcnJheShleHBvcnRzRmllbGQpKSB7XG4gICAgaWYgKHN1YnBhdGggIT09ICcuJykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgZXhwb3J0RW50cnkgb2YgZXhwb3J0c0ZpZWxkKSB7XG4gICAgICBsZXQgZW50cnlQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW50cnlQYXRoID0gZ2V0RXhwb3J0RW50cnlQYXRoKGV4cG9ydEVudHJ5LCBjb25kaXRpb25zLCBzdWJwYXRoLCBwYXR0ZXJuTWF0Y2gpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5UGF0aCkgcmV0dXJuIGVudHJ5UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZW9mIGV4cG9ydHNGaWVsZCAhPT0gJ29iamVjdCcpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgZXhwb3J0UmVjb3JkID0gZXhwb3J0c0ZpZWxkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAoaGFzRXhwb3J0U3VicGF0aHMoZXhwb3J0UmVjb3JkKSkge1xuICAgIGlmIChPYmplY3QuaGFzT3duKGV4cG9ydFJlY29yZCwgc3VicGF0aCkpIHJldHVybiBnZXRFeHBvcnRFbnRyeVBhdGgoZXhwb3J0UmVjb3JkW3N1YnBhdGhdLCBjb25kaXRpb25zLCAnLicpO1xuXG4gICAgY29uc3Qgc3VicGF0aEV4cG9ydCA9IGZpbmRFeHBvcnRTdWJwYXRoUGF0dGVybihleHBvcnRSZWNvcmQsIHN1YnBhdGgpO1xuICAgIHJldHVybiBzdWJwYXRoRXhwb3J0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBnZXRFeHBvcnRFbnRyeVBhdGgoc3VicGF0aEV4cG9ydC52YWx1ZSwgY29uZGl0aW9ucywgJy4nKTtcbiAgfVxuICBpZiAoc3VicGF0aCAhPT0gJy4nKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgW2NvbmRpdGlvbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4cG9ydFJlY29yZCkpIHtcbiAgICBpZiAoIWNvbmRpdGlvbnMuaGFzKGNvbmRpdGlvbikpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZW50cnlQYXRoID0gZ2V0RXhwb3J0RW50cnlQYXRoKHZhbHVlLCBjb25kaXRpb25zLCBzdWJwYXRoLCBwYXR0ZXJuTWF0Y2gpO1xuICAgIGlmIChlbnRyeVBhdGggIT09IHVuZGVmaW5lZCkgcmV0dXJuIGVudHJ5UGF0aDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNFeHBvcnRTdWJwYXRocyhleHBvcnRSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhleHBvcnRSZWNvcmQpLnNvbWUoKGtleSkgPT4ga2V5ID09PSAnLicgfHwga2V5LnN0YXJ0c1dpdGgoJy4vJykpO1xufVxuXG5mdW5jdGlvbiBmaW5kRXhwb3J0U3VicGF0aFBhdHRlcm4oZXhwb3J0UmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc3VicGF0aDogc3RyaW5nKTogeyB2YWx1ZTogdW5rbm93biB9IHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwb3J0UmVjb3JkKS5zb3J0KChba2V5QV0sIFtrZXlCXSkgPT4gY29tcGFyZUV4cG9ydFBhdHRlcm5LZXlzKGtleUEsIGtleUIpKSkge1xuICAgIGNvbnN0IHBhdHRlcm5NYXRjaCA9IGdldEV4cG9ydFBhdHRlcm5NYXRjaChrZXksIHN1YnBhdGgpO1xuICAgIGlmIChwYXR0ZXJuTWF0Y2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlcGxhY2VFeHBvcnRQYXR0ZXJuKHZhbHVlLCBwYXR0ZXJuTWF0Y2gpIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVFeHBvcnRQYXR0ZXJuS2V5cyhrZXlBOiBzdHJpbmcsIGtleUI6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGJhc2VMZW5ndGhBID0ga2V5QS5pbmRleE9mKCcqJyk7XG4gIGNvbnN0IGJhc2VMZW5ndGhCID0ga2V5Qi5pbmRleE9mKCcqJyk7XG4gIGlmIChiYXNlTGVuZ3RoQSA9PT0gLTEgJiYgYmFzZUxlbmd0aEIgPT09IC0xKSByZXR1cm4gMDtcbiAgaWYgKGJhc2VMZW5ndGhBID09PSAtMSkgcmV0dXJuIDE7XG4gIGlmIChiYXNlTGVuZ3RoQiA9PT0gLTEpIHJldHVybiAtMTtcbiAgcmV0dXJuIGJhc2VMZW5ndGhCIC0gYmFzZUxlbmd0aEEgfHwga2V5Qi5sZW5ndGggLSBrZXlBLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwb3J0UGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgc3VicGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwYXR0ZXJuLnN0YXJ0c1dpdGgoJy4vJykgfHwgIXBhdHRlcm4uaW5jbHVkZXMoJyonKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gcGF0dGVybi5zcGxpdCgnKicsIDIpIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmIChzdWJwYXRoID09PSBwcmVmaXggfHwgIXN1YnBhdGguc3RhcnRzV2l0aChwcmVmaXgpIHx8ICFzdWJwYXRoLmVuZHNXaXRoKHN1ZmZpeCkgfHwgc3VicGF0aC5sZW5ndGggPCBwYXR0ZXJuLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHN1YnBhdGguc2xpY2UocHJlZml4Lmxlbmd0aCwgc3VicGF0aC5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUV4cG9ydFBhdHRlcm4odmFsdWU6IHVua25vd24sIHBhdHRlcm5NYXRjaDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzb2x2ZUV4cG9ydFRhcmdldCh2YWx1ZSwgcGF0dGVybk1hdGNoKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiByZXBsYWNlRXhwb3J0UGF0dGVybihpdGVtLCBwYXR0ZXJuTWF0Y2gpKTtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikubWFwKChba2V5LCBpdGVtXSkgPT4gW2tleSwgcmVwbGFjZUV4cG9ydFBhdHRlcm4oaXRlbSwgcGF0dGVybk1hdGNoKV0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRUYXJnZXQodGFyZ2V0OiBzdHJpbmcsIHBhdHRlcm5NYXRjaDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgdmFsaWRhdGVFeHBvcnRUYXJnZXQodGFyZ2V0KTtcbiAgaWYgKHBhdHRlcm5NYXRjaCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGFyZ2V0O1xuXG4gIHZhbGlkYXRlRXhwb3J0UGF0dGVybk1hdGNoKHBhdHRlcm5NYXRjaCk7XG4gIHJldHVybiB0YXJnZXQucmVwbGFjZUFsbCgnKicsIHBhdHRlcm5NYXRjaCk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwb3J0VGFyZ2V0KHRhcmdldDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghdGFyZ2V0LnN0YXJ0c1dpdGgoJy4vJykpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrYWdlIGV4cG9ydCB0YXJnZXQ6ICR7dGFyZ2V0fWApO1xuXG4gIHZhbGlkYXRlUGF0aFNlZ21lbnRzKHRhcmdldC5zbGljZSgnLi8nLmxlbmd0aCksIHRhcmdldCk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwb3J0UGF0dGVybk1hdGNoKHBhdHRlcm5NYXRjaDogc3RyaW5nKTogdm9pZCB7XG4gIHZhbGlkYXRlUGF0aFNlZ21lbnRzKHBhdHRlcm5NYXRjaCwgcGF0dGVybk1hdGNoKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXRoU2VnbWVudHMocGF0aFZhbHVlOiBzdHJpbmcsIHNvdXJjZVZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZGVjb2RlZFBhdGggPSBkZWNvZGVQYXRoVmFsdWUocGF0aFZhbHVlLCBzb3VyY2VWYWx1ZSk7XG4gIGNvbnN0IGludmFsaWRTZWdtZW50cyA9IG5ldyBTZXQoWycnLCAnLicsICcuLicsICdub2RlX21vZHVsZXMnXSk7XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBkZWNvZGVkUGF0aC5zcGxpdCgvW1xcXFwvXS91KSkge1xuICAgIGlmIChpbnZhbGlkU2VnbWVudHMuaGFzKHNlZ21lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBleHBvcnQgcGF0aCBzZWdtZW50IGluICR7c291cmNlVmFsdWV9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlY29kZVBhdGhWYWx1ZShwYXRoVmFsdWU6IHN0cmluZywgc291cmNlVmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwYXRoVmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrYWdlIGV4cG9ydCBwYXRoIHNlZ21lbnQgaW4gJHtzb3VyY2VWYWx1ZX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlRW50cnlQYXRoKGVudHJ5UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGVudHJ5UGF0aD8ucmVwbGFjZSgvXlxcLlxcLy8sICcnKTtcbn1cbiIsImltcG9ydCB7IHBhcnNlU3luYywgdmlzaXRvcktleXMgfSBmcm9tICdveGMtcGFyc2VyJztcblxuY29uc3Qgc291cmNlRmlsZUV4dGVuc2lvbnMgPSBbJy5janMnLCAnLm1qcycsICcuanMnLCAnLmpzeCcsICcuY3RzJywgJy5tdHMnLCAnLnRzJywgJy50c3gnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNmb3JtVGFyZ2V0RmlsZShpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgc291cmNlRmlsZUV4dGVuc2lvbnMuc29tZSgoZXh0ZW5zaW9uKSA9PiBpZC5lbmRzV2l0aChleHRlbnNpb24pKSAmJiAhaWQuc3RhcnRzV2l0aCgnXFwwJykgJiYgIWlzTm9kZU1vZHVsZXNQYXRoKGlkKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc05vZGVNb2R1bGVzUGF0aChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpZC5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSB8fCBpZC5pbmNsdWRlcygnXFxcXG5vZGVfbW9kdWxlc1xcXFwnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShpZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBSZXR1cm5UeXBlPHR5cGVvZiBwYXJzZVN5bmM+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbGFuZyA9IGdldFBhcnNlckxhbmcoaWQpO1xuICBjb25zdCBzb3VyY2VUeXBlID0gZ2V0UGFyc2VyU291cmNlVHlwZShpZCk7XG4gIGNvbnN0IGFzdCA9IHBhcnNlU3luYyhpZCwgY29kZSwgeyBsYW5nLCBzb3VyY2VUeXBlIH0pO1xuICBpZiAoIWhhc1BhcnNlRXJyb3IoYXN0KSkgcmV0dXJuIGFzdDtcbiAgaWYgKGlkLmVuZHNXaXRoKCcuanMnKSAmJiBzb3VyY2VUeXBlID09PSAndW5hbWJpZ3VvdXMnKSB7XG4gICAgY29uc3QgY29tbW9uSnNBc3QgPSBwYXJzZVN5bmMoaWQsIGNvZGUsIHsgbGFuZywgc291cmNlVHlwZTogJ2NvbW1vbmpzJyB9KTtcbiAgICBpZiAoIWhhc1BhcnNlRXJyb3IoY29tbW9uSnNBc3QpKSByZXR1cm4gY29tbW9uSnNBc3Q7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzUGFyc2VFcnJvcihhc3Q6IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlU3luYz4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGFzdC5lcnJvcnMuc29tZSgoZXJyb3IpID0+IGVycm9yLnNldmVyaXR5ID09PSAnRXJyb3InKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VyTGFuZyhpZDogc3RyaW5nKTogJ2pzJyB8ICdqc3gnIHwgJ3RzJyB8ICd0c3gnIHtcbiAgaWYgKGlkLmVuZHNXaXRoKCcudHN4JykpIHJldHVybiAndHN4JztcbiAgaWYgKGlkLmVuZHNXaXRoKCcudHMnKSB8fCBpZC5lbmRzV2l0aCgnLmN0cycpIHx8IGlkLmVuZHNXaXRoKCcubXRzJykpIHJldHVybiAndHMnO1xuICBpZiAoaWQuZW5kc1dpdGgoJy5qc3gnKSkgcmV0dXJuICdqc3gnO1xuICByZXR1cm4gJ2pzJztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VyU291cmNlVHlwZShpZDogc3RyaW5nKTogJ2NvbW1vbmpzJyB8ICd1bmFtYmlndW91cycge1xuICByZXR1cm4gaWQuZW5kc1dpdGgoJy5janMnKSB8fCBpZC5lbmRzV2l0aCgnLmN0cycpID8gJ2NvbW1vbmpzJyA6ICd1bmFtYmlndW91cyc7XG59XG5cbmV4cG9ydCB0eXBlIEFzdE5vZGUgPSB7XG4gIHR5cGU6IHN0cmluZztcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXN0Tm9kZUNoaWxkcmVuKG5vZGU6IEFzdE5vZGUpOiBBc3ROb2RlW10ge1xuICByZXR1cm4gKHZpc2l0b3JLZXlzW25vZGUudHlwZV0gPz8gW10pXG4gICAgLmZsYXRNYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBub2RlW2tleV07XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfSlcbiAgICAuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIEFzdE5vZGUgPT4gaXNBc3ROb2RlKHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBc3ROb2RlUHJvcGVydHkobm9kZTogQXN0Tm9kZSwga2V5OiBzdHJpbmcpOiBBc3ROb2RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBub2RlW2tleV07XG4gIHJldHVybiBpc0FzdE5vZGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBc3RBcnJheVByb3BlcnR5KG5vZGU6IEFzdE5vZGUsIGtleTogc3RyaW5nKTogQXN0Tm9kZVtdIHtcbiAgY29uc3QgdmFsdWUgPSBub2RlW2tleV07XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQXN0Tm9kZSA9PiBpc0FzdE5vZGUoaXRlbSkpIDogW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FzdE5vZGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBc3ROb2RlIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKHZhbHVlIGFzIEFzdE5vZGUpLnR5cGUgPT09ICdzdHJpbmcnO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBc3ROb2RlIH0gZnJvbSAnLi90cmFuc2Zvcm1VdGlscy5qcyc7XG5pbXBvcnQgeyBnZXRBc3ROb2RlQ2hpbGRyZW4sIGlzQXN0Tm9kZSwgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi90cmFuc2Zvcm1VdGlscy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGNvZGUgY29udGFpbnMgYSBkZWNvcmF0b3IsIGlnbm9yaW5nIGBAYCBpbiBjb21tZW50cywgc3RyaW5ncywgYW5kIHJlZ2V4ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc0RlY29yYXRvcihjb2RlOiBzdHJpbmcsIGlkID0gJ2ZpbGUudHMnKTogYm9vbGVhbiB7XG4gIC8vIEEgZGVjb3JhdG9yIHJlcXVpcmVzIGEgbGl0ZXJhbCBgQGAgZXZlbiB3aGVuIGl0cyBpZGVudGlmaWVyIHVzZXMgZXNjYXBlcyBzdWNoIGFzIGBcXHUwMDYzdXN0b21gLlxuICBpZiAoIWNvZGUuaW5jbHVkZXMoJ0AnKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGFzdCA9IHBhcnNlU291cmNlRmlsZShpZCwgY29kZSk7XG4gIC8vIElmIHRoZSBjb2RlIGZhaWxzIHRvIHBhcnNlLCBsZXQgQmFiZWwgdHJhbnNmb3JtIGl0IGFuZCByZXBvcnQgYSBwcm9wZXIgc3ludGF4IGVycm9yLlxuICBpZiAoIWFzdCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBpc0FzdE5vZGUoYXN0LnByb2dyYW0pICYmIGhhc0RlY29yYXRvck5vZGUoYXN0LnByb2dyYW0pO1xufVxuXG5mdW5jdGlvbiBoYXNEZWNvcmF0b3JOb2RlKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0RlY29yYXRvcicpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZ2V0QXN0Tm9kZUNoaWxkcmVuKG5vZGUpLnNvbWUoKGNoaWxkKSA9PiBoYXNEZWNvcmF0b3JOb2RlKGNoaWxkKSk7XG59XG4iLCJpbXBvcnQgTWFnaWNTdHJpbmcgZnJvbSAnbWFnaWMtc3RyaW5nJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luLCBTb3VyY2VNYXBJbnB1dCB9IGZyb20gJ3JvbGxkb3duJztcblxuaW1wb3J0IHR5cGUgeyBBc3ROb2RlIH0gZnJvbSAnLi90cmFuc2Zvcm1VdGlscy5qcyc7XG5pbXBvcnQge1xuICBnZXRBc3RBcnJheVByb3BlcnR5LFxuICBnZXRBc3ROb2RlQ2hpbGRyZW4sXG4gIGdldEFzdE5vZGVQcm9wZXJ0eSxcbiAgaXNBc3ROb2RlLFxuICBpc1RyYW5zZm9ybVRhcmdldEZpbGUsXG4gIHBhcnNlU291cmNlRmlsZSxcbn0gZnJvbSAnLi90cmFuc2Zvcm1VdGlscy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25zb2xlUmVtb3ZhbEV4Y2x1ZGVkTWV0aG9kcygpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgZW52IH0gPSBwcm9jZXNzO1xuICBpZiAoZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHJldHVybiBuZXcgU2V0KFsnZXJyb3InLCAnaW5mbycsICd3YXJuJ10pO1xuICBpZiAoZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHJldHVybiBuZXcgU2V0KFsnZGVidWcnLCAnZXJyb3InLCAnaW5mbycsICd3YXJuJ10pO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQ29uc29sZVBsdWdpbihleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+KTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAncmVtb3ZlLWNvbnNvbGUnLFxuICAgIHRyYW5zZm9ybShjb2RlLCBpZCkge1xuICAgICAgaWYgKCFpc1RyYW5zZm9ybVRhcmdldEZpbGUoaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgLy8gRXNjYXBlZCBpZGVudGlmaWVycyBzdWNoIGFzIGBcXHUwMDYzb25zb2xlYCBtdXN0IHN0aWxsIGJlIGhhbmRsZWQsIHNvIGFsc28gbWF0Y2ggYFxcdWAgZXNjYXBlcy5cbiAgICAgIGlmICghL2NvbnNvbGV8XFxcXHUvLnRlc3QoY29kZSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiByZW1vdmVDb25zb2xlKGNvZGUsIGlkLCBleGNsdWRlZE1ldGhvZHMpO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNvbnNvbGUoY29kZTogc3RyaW5nLCBpZDogc3RyaW5nLCBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+KTogeyBjb2RlOiBzdHJpbmc7IG1hcDogU291cmNlTWFwSW5wdXQgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFzdCA9IHBhcnNlU291cmNlRmlsZShpZCwgY29kZSk7XG4gIGlmICghYXN0IHx8ICFpc0FzdE5vZGUoYXN0LnByb2dyYW0pKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG1hZ2ljU3RyaW5nID0gbmV3IE1hZ2ljU3RyaW5nKGNvZGUpO1xuICBjb25zdCByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdID0gW107XG4gIGNvbnN0IHNjb3BlczogQ29uc29sZVNjb3BlW10gPSBbXTtcbiAgY29sbGVjdENvbnNvbGVSZXBsYWNlbWVudHMoYXN0LnByb2dyYW0sIFtdLCBzY29wZXMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgZm9yIChjb25zdCByZXBsYWNlbWVudCBvZiBzZWxlY3RDb25zb2xlUmVwbGFjZW1lbnRzKHJlcGxhY2VtZW50cykpIHtcbiAgICBtYWdpY1N0cmluZy5vdmVyd3JpdGUocmVwbGFjZW1lbnQuc3RhcnQsIHJlcGxhY2VtZW50LmVuZCwgcmVwbGFjZW1lbnQudmFsdWUpO1xuICB9XG5cbiAgaWYgKCFtYWdpY1N0cmluZy5oYXNDaGFuZ2VkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgY29kZTogbWFnaWNTdHJpbmcudG9TdHJpbmcoKSxcbiAgICBtYXA6IG1hZ2ljU3RyaW5nLmdlbmVyYXRlTWFwKHsgaGlyZXM6IHRydWUgfSkgYXMgU291cmNlTWFwSW5wdXQsXG4gIH07XG59XG5cbnR5cGUgQ29uc29sZVJlcGxhY2VtZW50ID0ge1xuICBraW5kOiAncmVwbGFjZSc7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICB2YWx1ZTogc3RyaW5nO1xufTtcblxudHlwZSBDb25zb2xlU2NvcGUgPSB7XG4gIGVuZDogbnVtYmVyO1xuICBzaGFkb3dzQ29uc29sZTogYm9vbGVhbjtcbiAgc3RhcnQ6IG51bWJlcjtcbn07XG5cbmNvbnN0IG5vb3BGdW5jdGlvbkV4cHJlc3Npb24gPSAnKGZ1bmN0aW9uICgpIHt9KSc7XG5jb25zdCB1bmRlZmluZWRFeHByZXNzaW9uID0gJyh2b2lkIDApJztcblxuZnVuY3Rpb24gY29sbGVjdENvbnNvbGVSZXBsYWNlbWVudHMoXG4gIG5vZGU6IEFzdE5vZGUsXG4gIGFuY2VzdG9yczogQXN0Tm9kZVtdLFxuICBzY29wZXM6IENvbnNvbGVTY29wZVtdLFxuICByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdLFxuICBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0xKTtcbiAgY29uc3Qgc2NvcGUgPSBnZXRDb25zb2xlU2NvcGUobm9kZSwgcGFyZW50KTtcbiAgaWYgKHNjb3BlKSBzY29wZXMucHVzaChzY29wZSk7XG5cbiAgaWYgKCFpc0NvbnNvbGVTaGFkb3dlZChzY29wZXMsIG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJykge1xuICAgIGNvbGxlY3RDb25zb2xlQ2FsbFJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycywgcmVwbGFjZW1lbnRzLCBleGNsdWRlZE1ldGhvZHMpO1xuICB9XG4gIGlmICghaXNDb25zb2xlU2hhZG93ZWQoc2NvcGVzLCBub2RlKSAmJiBub2RlLnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgIGNvbGxlY3RDb25zb2xlTWVtYmVyUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIH1cblxuICBjb25zdCBjaGlsZEFuY2VzdG9ycyA9IFsuLi5hbmNlc3RvcnMsIG5vZGVdO1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGdldEFzdE5vZGVDaGlsZHJlbihub2RlKSkge1xuICAgIGNvbGxlY3RDb25zb2xlUmVwbGFjZW1lbnRzKGNoaWxkLCBjaGlsZEFuY2VzdG9ycywgc2NvcGVzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIH1cblxuICBpZiAoc2NvcGUpIHNjb3Blcy5wb3AoKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uc29sZVNjb3BlKG5vZGU6IEFzdE5vZGUsIHBhcmVudDogQXN0Tm9kZSB8IHVuZGVmaW5lZCk6IENvbnNvbGVTY29wZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgPT09ICdQcm9ncmFtJykge1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNQcm9ncmFtQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgaWYgKGlzQ29uc29sZUZ1bmN0aW9uU2NvcGVOb2RlKG5vZGUpKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0Z1bmN0aW9uQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50Jykge1xuICAgIGNvbnN0IGlzRnVuY3Rpb25Cb2R5ID0gcGFyZW50ID8gaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUocGFyZW50KSA6IGZhbHNlO1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNCbG9ja0NvbnNvbGVCaW5kaW5nKG5vZGUsIGZhbHNlKSB8fCAoaXNGdW5jdGlvbkJvZHkgJiYgaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKG5vZGUpKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnQ2F0Y2hDbGF1c2UnKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihub2RlLnBhcmFtKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnQ2xhc3NFeHByZXNzaW9uJykge1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4obm9kZS5pZCksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N0YXRpY0Jsb2NrJyB8fCBub2RlLnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJykge1xuICAgIHJldHVybiB7XG4gICAgICBlbmQ6IG5vZGUuZW5kLFxuICAgICAgc2hhZG93c0NvbnNvbGU6XG4gICAgICAgIGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZSwgZmFsc2UpIHx8XG4gICAgICAgIGhhc0hvaXN0ZWRWYXJDb25zb2xlQmluZGluZyhub2RlKSB8fFxuICAgICAgICAobm9kZS50eXBlID09PSAnVFNNb2R1bGVCbG9jaycgJiYgaGFzTmFtZXNwYWNlQ29uc29sZUJpbmRpbmcocGFyZW50KSksXG4gICAgICBzdGFydDogbm9kZS5zdGFydCxcbiAgICB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdTd2l0Y2hTdGF0ZW1lbnQnKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc1N3aXRjaENvbnNvbGVCaW5kaW5nKG5vZGUpLCBzdGFydDogZ2V0U3dpdGNoU2NvcGVTdGFydChub2RlKSB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdTd2l0Y2hDYXNlJykge1xuICAgIGNvbnN0IHN3aXRjaFNoYWRvd3NDb25zb2xlID0gcGFyZW50Py50eXBlID09PSAnU3dpdGNoU3RhdGVtZW50JyAmJiBoYXNTd2l0Y2hDb25zb2xlQmluZGluZyhwYXJlbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBlbmQ6IG5vZGUuZW5kLFxuICAgICAgc2hhZG93c0NvbnNvbGU6IHN3aXRjaFNoYWRvd3NDb25zb2xlIHx8IGhhc1N3aXRjaENhc2VDb25zb2xlQmluZGluZyhub2RlKSxcbiAgICAgIHN0YXJ0OiBnZXRTd2l0Y2hDYXNlU2NvcGVTdGFydChub2RlKSxcbiAgICB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdGb3JTdGF0ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ0ZvckluU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdGb3JPZlN0YXRlbWVudCcpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzTG9vcENvbnNvbGVCaW5kaW5nKG5vZGUpLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1Byb2dyYW1Db25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2JvZHknKSkge1xuICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgdHJ1ZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcobm9kZSk7XG59XG5cbmZ1bmN0aW9uIGhhc0Z1bmN0aW9uQ29uc29sZUJpbmRpbmcobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICBpZiAoaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKG5vZGUuaWQpKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChjb25zdCBwYXJhbSBvZiBnZXRBc3RBcnJheVByb3BlcnR5KG5vZGUsICdwYXJhbXMnKSkge1xuICAgIGlmIChoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4ocGFyYW0pKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZTogQXN0Tm9kZSwgaW5jbHVkZVZhcjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZXRBc3RBcnJheVByb3BlcnR5KG5vZGUsICdib2R5JykpIHtcbiAgICBpZiAoaGFzRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhzdGF0ZW1lbnQsIGluY2x1ZGVWYXIpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc1N3aXRjaENvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzd2l0Y2hDYXNlIG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2Nhc2VzJykpIHtcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZXRBc3RBcnJheVByb3BlcnR5KHN3aXRjaENhc2UsICdjb25zZXF1ZW50JykpIHtcbiAgICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgZmFsc2UpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTd2l0Y2hTY29wZVN0YXJ0KG5vZGU6IEFzdE5vZGUpOiBudW1iZXIge1xuICBmb3IgKGNvbnN0IHN3aXRjaENhc2Ugb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY2FzZXMnKSkge1xuICAgIGNvbnN0IHN0YXJ0ID0gZ2V0U3dpdGNoQ2FzZVNjb3BlU3RhcnQoc3dpdGNoQ2FzZSk7XG4gICAgaWYgKHN0YXJ0IDwgc3dpdGNoQ2FzZS5lbmQpIHJldHVybiBzdGFydDtcbiAgfVxuICByZXR1cm4gbm9kZS5lbmQ7XG59XG5cbmZ1bmN0aW9uIGhhc1N3aXRjaENhc2VDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2NvbnNlcXVlbnQnKSkge1xuICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgZmFsc2UpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFN3aXRjaENhc2VTY29wZVN0YXJ0KG5vZGU6IEFzdE5vZGUpOiBudW1iZXIge1xuICBjb25zdCB0ZXN0ID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICd0ZXN0Jyk7XG4gIGlmICh0ZXN0KSByZXR1cm4gdGVzdC5zdGFydDtcbiAgcmV0dXJuIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2NvbnNlcXVlbnQnKVswXT8uc3RhcnQgPz8gbm9kZS5lbmQ7XG59XG5cbmZ1bmN0aW9uIGhhc0xvb3BDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsIG5vZGUudHlwZSA9PT0gJ0ZvclN0YXRlbWVudCcgPyAnaW5pdCcgOiAnbGVmdCcpO1xuICByZXR1cm4gISFkZWNsYXJhdGlvbiAmJiBkZWNsYXJhdGlvbi50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbicgJiYgZGVjbGFyYXRpb24ua2luZCAhPT0gJ3ZhcicgJiYgaGFzVmFyaWFibGVEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKGRlY2xhcmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKHJvb3Q6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFyb290KSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBnZXRBc3ROb2RlQ2hpbGRyZW4ocm9vdCkpIHtcbiAgICBpZiAoY2hpbGQgIT09IHJvb3QgJiYgKGlzQ29uc29sZUZ1bmN0aW9uU2NvcGVOb2RlKGNoaWxkKSB8fCBjaGlsZC50eXBlID09PSAnU3RhdGljQmxvY2snIHx8IGNoaWxkLnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjaGlsZC50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbicgJiZcbiAgICAgIGNoaWxkLmtpbmQgPT09ICd2YXInICYmXG4gICAgICBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoY2hpbGQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGhhc0hvaXN0ZWRWYXJDb25zb2xlQmluZGluZyhjaGlsZCkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzSW1wb3J0Q29uc29sZUJpbmRpbmcobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICBpZiAobm9kZS5pbXBvcnRLaW5kID09PSAndHlwZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ3NwZWNpZmllcnMnKS5zb21lKFxuICAgIChzcGVjaWZpZXIpID0+IHNwZWNpZmllci5pbXBvcnRLaW5kICE9PSAndHlwZScgJiYgaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHNwZWNpZmllci5sb2NhbClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlLCBpbmNsdWRlVmFyOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gZ2V0RXhwb3J0RGVjbGFyYXRpb24obm9kZSkgPz8gbm9kZTtcbiAgaWYgKGRlY2xhcmF0aW9uLmRlY2xhcmUgPT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09ICdJbXBvcnREZWNsYXJhdGlvbicpIHJldHVybiBoYXNJbXBvcnRDb25zb2xlQmluZGluZyhkZWNsYXJhdGlvbik7XG4gIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbicgfHwgZGVjbGFyYXRpb24udHlwZSA9PT0gJ0NsYXNzRGVjbGFyYXRpb24nKSB7XG4gICAgcmV0dXJuIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihkZWNsYXJhdGlvbi5pZCk7XG4gIH1cbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09ICdUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uJykge1xuICAgIHJldHVybiBkZWNsYXJhdGlvbi5pbXBvcnRLaW5kICE9PSAndHlwZScgJiYgaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGRlY2xhcmF0aW9uLmlkKTtcbiAgfVxuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ1RTRW51bURlY2xhcmF0aW9uJyB8fCBkZWNsYXJhdGlvbi50eXBlID09PSAnVFNNb2R1bGVEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gaGFzTGVmdG1vc3RNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldEFzdE5vZGVQcm9wZXJ0eShkZWNsYXJhdGlvbiwgJ2lkJykpO1xuICB9XG4gIHJldHVybiAoXG4gICAgZGVjbGFyYXRpb24udHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nICYmXG4gICAgKGluY2x1ZGVWYXIgfHwgZGVjbGFyYXRpb24ua2luZCAhPT0gJ3ZhcicpICYmXG4gICAgaGFzVmFyaWFibGVEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKGRlY2xhcmF0aW9uKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNOYW1lc3BhY2VDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBub2RlPy50eXBlID09PSAnVFNNb2R1bGVEZWNsYXJhdGlvbicgJiYgbm9kZS5kZWNsYXJlICE9PSB0cnVlICYmIGhhc01vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdpZCcpKTtcbn1cblxuZnVuY3Rpb24gaGFzTGVmdG1vc3RNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGlkOiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghaWQpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlkLnR5cGUgPT09ICdJZGVudGlmaWVyJykgcmV0dXJuIGlkLm5hbWUgPT09ICdjb25zb2xlJztcbiAgcmV0dXJuIGlkLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnICYmIGhhc0xlZnRtb3N0TW9kdWxlSWRDb25zb2xlQmluZGluZyhnZXRBc3ROb2RlUHJvcGVydHkoaWQsICdsZWZ0JykpO1xufVxuXG5mdW5jdGlvbiBoYXNNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGlkOiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghaWQpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlkLnR5cGUgPT09ICdJZGVudGlmaWVyJykgcmV0dXJuIGlkLm5hbWUgPT09ICdjb25zb2xlJztcbiAgcmV0dXJuIChcbiAgICBpZC50eXBlID09PSAnVFNRdWFsaWZpZWROYW1lJyAmJlxuICAgIChoYXNNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldEFzdE5vZGVQcm9wZXJ0eShpZCwgJ2xlZnQnKSkgfHwgaGFzTW9kdWxlSWRDb25zb2xlQmluZGluZyhnZXRBc3ROb2RlUHJvcGVydHkoaWQsICdyaWdodCcpKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzVmFyaWFibGVEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2RlY2xhcmF0aW9ucycpLnNvbWUoKGRlY2xhcmF0aW9uKSA9PlxuICAgIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihnZXRBc3ROb2RlUHJvcGVydHkoZGVjbGFyYXRpb24sICdpZCcpKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFpc0FzdE5vZGUodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJiB2YWx1ZS5uYW1lID09PSAnY29uc29sZScpIHJldHVybiB0cnVlO1xuICBpZiAodmFsdWUudHlwZSA9PT0gJ0Fzc2lnbm1lbnRQYXR0ZXJuJyB8fCB2YWx1ZS50eXBlID09PSAnUmVzdEVsZW1lbnQnKSB7XG4gICAgcmV0dXJuIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZS5sZWZ0ID8/IHZhbHVlLmFyZ3VtZW50KTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ1RTUGFyYW1ldGVyUHJvcGVydHknKSB7XG4gICAgcmV0dXJuIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZS5wYXJhbWV0ZXIpO1xuICB9XG4gIGlmICh2YWx1ZS50eXBlID09PSAnVFNRdWFsaWZpZWROYW1lJykge1xuICAgIHJldHVybiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4odmFsdWUubGVmdCk7XG4gIH1cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdBcnJheVBhdHRlcm4nKSB7XG4gICAgcmV0dXJuIGdldEFzdEFycmF5UHJvcGVydHkodmFsdWUsICdlbGVtZW50cycpLnNvbWUoKGVsZW1lbnQpID0+IGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihlbGVtZW50KSk7XG4gIH1cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJykge1xuICAgIHJldHVybiBnZXRBc3RBcnJheVByb3BlcnR5KHZhbHVlLCAncHJvcGVydGllcycpLnNvbWUoKHByb3BlcnR5KSA9PlxuICAgICAgaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHByb3BlcnR5LnZhbHVlID8/IHByb3BlcnR5LmFyZ3VtZW50KVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVGdW5jdGlvblNjb3BlTm9kZShub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyB8fCBub2RlLnR5cGUgPT09ICdGdW5jdGlvbkV4cHJlc3Npb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJztcbn1cblxuZnVuY3Rpb24gaXNDb25zb2xlU2hhZG93ZWQoc2NvcGVzOiBDb25zb2xlU2NvcGVbXSwgbm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2NvcGVzLnNvbWUoKHNjb3BlKSA9PiBzY29wZS5zaGFkb3dzQ29uc29sZSAmJiBzY29wZS5zdGFydCA8PSBub2RlLnN0YXJ0ICYmIG5vZGUuZW5kIDw9IHNjb3BlLmVuZCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDb25zb2xlQ2FsbFJlcGxhY2VtZW50KFxuICBub2RlOiBBc3ROb2RlLFxuICBhbmNlc3RvcnM6IEFzdE5vZGVbXSxcbiAgcmVwbGFjZW1lbnRzOiBDb25zb2xlUmVwbGFjZW1lbnRbXSxcbiAgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGNvbnN0IHBhcmVudCA9IGFuY2VzdG9ycy5hdCgtMSk7XG4gIGNvbnN0IGNhbGxlZSA9IGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAnY2FsbGVlJyk7XG4gIGlmIChub2RlLm9wdGlvbmFsID09PSB0cnVlKSByZXR1cm47XG4gIGlmICghY2FsbGVlIHx8ICFpc0luY2x1ZGVkQ29uc29sZU1lbWJlcihjYWxsZWUsIGV4Y2x1ZGVkTWV0aG9kcykpIHtcbiAgICBpZiAoY2FsbGVlICYmIGlzSW5jbHVkZWRDb25zb2xlQmluZE1lbWJlcihjYWxsZWUsIGV4Y2x1ZGVkTWV0aG9kcykpIHtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogbm9kZS5zdGFydCwgZW5kOiBub2RlLmVuZCwgdmFsdWU6IGdldE5vb3BGdW5jdGlvblJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycykgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50Jykge1xuICAgIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogcGFyZW50LnN0YXJ0LCBlbmQ6IHBhcmVudC5lbmQsIHZhbHVlOiAnOycgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBub2RlLnN0YXJ0LCBlbmQ6IG5vZGUuZW5kLCB2YWx1ZTogZ2V0VW5kZWZpbmVkRXhwcmVzc2lvblJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycykgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdENvbnNvbGVNZW1iZXJSZXBsYWNlbWVudChcbiAgbm9kZTogQXN0Tm9kZSxcbiAgYW5jZXN0b3JzOiBBc3ROb2RlW10sXG4gIHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10sXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBjb25zdCBwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTEpO1xuICBjb25zdCBncmFuZHBhcmVudCA9IGFuY2VzdG9ycy5hdCgtMik7XG4gIGlmICghaXNJbmNsdWRlZENvbnNvbGVNZW1iZXIobm9kZSwgZXhjbHVkZWRNZXRob2RzKSB8fCBwYXJlbnQ/LnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJykgcmV0dXJuO1xuICBpZiAocGFyZW50Py50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nICYmIHBhcmVudC5jYWxsZWUgPT09IG5vZGUgJiYgcGFyZW50Lm9wdGlvbmFsICE9PSB0cnVlKSByZXR1cm47XG4gIGlmIChpc0NvbnNvbGVBc3NpZ25tZW50VGFyZ2V0KG5vZGUsIHBhcmVudCwgZ3JhbmRwYXJlbnQpKSByZXR1cm47XG5cbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJyAmJiBwYXJlbnQubGVmdCA9PT0gbm9kZSkge1xuICAgIGNvbnN0IHJpZ2h0ID0gZ2V0QXN0Tm9kZVByb3BlcnR5KHBhcmVudCwgJ3JpZ2h0Jyk7XG4gICAgaWYgKHJpZ2h0KSB7XG4gICAgICByZXBsYWNlbWVudHMucHVzaCh7IGtpbmQ6ICdyZXBsYWNlJywgc3RhcnQ6IHJpZ2h0LnN0YXJ0LCBlbmQ6IHJpZ2h0LmVuZCwgdmFsdWU6IGdldE5vb3BGdW5jdGlvblJlcGxhY2VtZW50KHJpZ2h0LCBhbmNlc3RvcnMpIH0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICByZXBsYWNlbWVudHMucHVzaCh7IGtpbmQ6ICdyZXBsYWNlJywgc3RhcnQ6IG5vZGUuc3RhcnQsIGVuZDogbm9kZS5lbmQsIHZhbHVlOiBnZXROb29wRnVuY3Rpb25SZXBsYWNlbWVudChub2RlLCBhbmNlc3RvcnMpIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRVbmRlZmluZWRFeHByZXNzaW9uUmVwbGFjZW1lbnQobm9kZTogQXN0Tm9kZSwgYW5jZXN0b3JzOiBBc3ROb2RlW10pOiBzdHJpbmcge1xuICByZXR1cm4gbmVlZHNMZWFkaW5nU3RhdGVtZW50U2VtaWNvbG9uKG5vZGUsIGFuY2VzdG9ycykgPyBgOyR7dW5kZWZpbmVkRXhwcmVzc2lvbn1gIDogdW5kZWZpbmVkRXhwcmVzc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQobm9kZTogQXN0Tm9kZSwgYW5jZXN0b3JzOiBBc3ROb2RlW10pOiBzdHJpbmcge1xuICByZXR1cm4gbmVlZHNMZWFkaW5nU3RhdGVtZW50U2VtaWNvbG9uKG5vZGUsIGFuY2VzdG9ycykgPyBgOyR7bm9vcEZ1bmN0aW9uRXhwcmVzc2lvbn1gIDogbm9vcEZ1bmN0aW9uRXhwcmVzc2lvbjtcbn1cblxuZnVuY3Rpb24gbmVlZHNMZWFkaW5nU3RhdGVtZW50U2VtaWNvbG9uKG5vZGU6IEFzdE5vZGUsIGFuY2VzdG9yczogQXN0Tm9kZVtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHN0YXRlbWVudEluZGV4ID0gYW5jZXN0b3JzLmZpbmRMYXN0SW5kZXgoKGFuY2VzdG9yKSA9PiBhbmNlc3Rvci50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCcpO1xuICBpZiAoc3RhdGVtZW50SW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXRlbWVudCA9IGFuY2VzdG9yc1tzdGF0ZW1lbnRJbmRleF07XG4gIGlmICghc3RhdGVtZW50KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXRlbWVudFBhcmVudCA9IGFuY2VzdG9yc1tzdGF0ZW1lbnRJbmRleCAtIDFdO1xuICByZXR1cm4gc3RhdGVtZW50LnN0YXJ0ID09PSBub2RlLnN0YXJ0ICYmIGlzU3RhdGVtZW50TGlzdE5vZGUoc3RhdGVtZW50UGFyZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTdGF0ZW1lbnRMaXN0Tm9kZShub2RlOiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgbm9kZT8udHlwZSA9PT0gJ1Byb2dyYW0nIHx8XG4gICAgbm9kZT8udHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50JyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdTdGF0aWNCbG9jaycgfHxcbiAgICBub2RlPy50eXBlID09PSAnVFNNb2R1bGVCbG9jaycgfHxcbiAgICBub2RlPy50eXBlID09PSAnU3dpdGNoQ2FzZSdcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNDb25zb2xlQXNzaWdubWVudFRhcmdldChcbiAgbm9kZTogQXN0Tm9kZSxcbiAgcGFyZW50OiBBc3ROb2RlIHwgdW5kZWZpbmVkLFxuICBncmFuZHBhcmVudDogQXN0Tm9kZSB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdVcGRhdGVFeHByZXNzaW9uJyAmJiBwYXJlbnQuYXJndW1lbnQgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICBpZiAoKHBhcmVudD8udHlwZSA9PT0gJ0ZvckluU3RhdGVtZW50JyB8fCBwYXJlbnQ/LnR5cGUgPT09ICdGb3JPZlN0YXRlbWVudCcpICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0FycmF5UGF0dGVybicpIHJldHVybiB0cnVlO1xuICBpZiAocGFyZW50Py50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHBhcmVudD8udHlwZSA9PT0gJ1Byb3BlcnR5JyAmJiBwYXJlbnQudmFsdWUgPT09IG5vZGUgJiYgZ3JhbmRwYXJlbnQ/LnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJztcbn1cblxuZnVuY3Rpb24gaXNJbmNsdWRlZENvbnNvbGVNZW1iZXIobm9kZTogQXN0Tm9kZSwgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBvYmplY3QgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ29iamVjdCcpO1xuICBjb25zdCBwcm9wZXJ0eSA9IGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAncHJvcGVydHknKTtcbiAgaWYgKG5vZGUub3B0aW9uYWwgPT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFvYmplY3QgfHwgIXByb3BlcnR5IHx8IGlzRXhjbHVkZWRDb25zb2xlUHJvcGVydHkobm9kZSwgcHJvcGVydHksIGV4Y2x1ZGVkTWV0aG9kcykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIob2JqZWN0KSkgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIChcbiAgICBvYmplY3QudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmXG4gICAgaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihnZXRBc3ROb2RlUHJvcGVydHkob2JqZWN0LCAnb2JqZWN0JykpICYmXG4gICAgLy8gTWF0Y2hlcyBiYWJlbC1wbHVnaW4tdHJhbnNmb3JtLXJlbW92ZS1jb25zb2xlOiBjYWxsL2FwcGx5IGV4Y2x1c2lvbnMgYXJlIGNoZWNrZWQgb24gdGhlIG91dGVyIHByb3BlcnR5IG9ubHkuXG4gICAgbm9kZS5jb21wdXRlZCAhPT0gdHJ1ZSAmJlxuICAgIHByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJlxuICAgIChwcm9wZXJ0eS5uYW1lID09PSAnY2FsbCcgfHwgcHJvcGVydHkubmFtZSA9PT0gJ2FwcGx5JylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNJbmNsdWRlZENvbnNvbGVCaW5kTWVtYmVyKG5vZGU6IEFzdE5vZGUsIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgaWYgKG5vZGUudHlwZSAhPT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgb2JqZWN0ID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdvYmplY3QnKTtcbiAgY29uc3QgcHJvcGVydHkgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ3Byb3BlcnR5Jyk7XG4gIGlmICghb2JqZWN0IHx8ICFwcm9wZXJ0eSB8fCBvYmplY3QudHlwZSAhPT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm4gZmFsc2U7XG4gIGlmIChub2RlLmNvbXB1dGVkID09PSB0cnVlIHx8IHByb3BlcnR5LnR5cGUgIT09ICdJZGVudGlmaWVyJyB8fCBwcm9wZXJ0eS5uYW1lICE9PSAnYmluZCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFpc0dsb2JhbENvbnNvbGVJZGVudGlmaWVyKGdldEFzdE5vZGVQcm9wZXJ0eShvYmplY3QsICdvYmplY3QnKSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY29uc29sZU1ldGhvZCA9IGdldEFzdE5vZGVQcm9wZXJ0eShvYmplY3QsICdwcm9wZXJ0eScpO1xuICByZXR1cm4gISFjb25zb2xlTWV0aG9kICYmICFpc0V4Y2x1ZGVkQ29uc29sZVByb3BlcnR5KG9iamVjdCwgY29uc29sZU1ldGhvZCwgZXhjbHVkZWRNZXRob2RzKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZENvbnNvbGVQcm9wZXJ0eShcbiAgbWVtYmVyRXhwcmVzc2lvbjogQXN0Tm9kZSxcbiAgcHJvcGVydHk6IEFzdE5vZGUsXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IGJvb2xlYW4ge1xuICAvLyBUaGUgcmVzdG9yZWQgYmVoYXZpb3IgbWF0Y2hlcyBiYWJlbC1wbHVnaW4tdHJhbnNmb3JtLXJlbW92ZS1jb25zb2xlLCB3aG9zZSBleGNsdXNpb25zIG9ubHkgYXBwbHkgdG8gaWRlbnRpZmllciBwcm9wZXJ0aWVzLlxuICByZXR1cm4gbWVtYmVyRXhwcmVzc2lvbi5jb21wdXRlZCAhPT0gdHJ1ZSAmJiBwcm9wZXJ0eS50eXBlID09PSAnSWRlbnRpZmllcicgJiYgZXhjbHVkZWRNZXRob2RzLmhhcyhwcm9wZXJ0eS5uYW1lIGFzIHN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIGlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIobm9kZTogQXN0Tm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbm9kZT8udHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIG5vZGUubmFtZSA9PT0gJ2NvbnNvbGUnO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RDb25zb2xlUmVwbGFjZW1lbnRzKHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10pOiBDb25zb2xlUmVwbGFjZW1lbnRbXSB7XG4gIGNvbnN0IHNlbGVjdGVkOiBDb25zb2xlUmVwbGFjZW1lbnRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlcGxhY2VtZW50IG9mIHJlcGxhY2VtZW50cy50b1NvcnRlZCgoYSwgYikgPT4gYS5zdGFydCAtIGIuc3RhcnQgfHwgYi5lbmQgLSBhLmVuZCkpIHtcbiAgICBpZiAoc2VsZWN0ZWQuc29tZSgoaXRlbSkgPT4gaXRlbS5zdGFydCA8PSByZXBsYWNlbWVudC5zdGFydCAmJiByZXBsYWNlbWVudC5lbmQgPD0gaXRlbS5lbmQpKSBjb250aW51ZTtcbiAgICBzZWxlY3RlZC5wdXNoKHJlcGxhY2VtZW50KTtcbiAgfVxuICByZXR1cm4gc2VsZWN0ZWQudG9Tb3J0ZWQoKGEsIGIpID0+IGIuc3RhcnQgLSBhLnN0YXJ0KTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwb3J0RGVjbGFyYXRpb24obm9kZTogQXN0Tm9kZSk6IEFzdE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAobm9kZS50eXBlICE9PSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicgJiYgbm9kZS50eXBlICE9PSAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAnZGVjbGFyYXRpb24nKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgSW5wdXRPcHRpb25zIH0gZnJvbSAnQGJhYmVsL2NvcmUnO1xuaW1wb3J0IE1hZ2ljU3RyaW5nIGZyb20gJ21hZ2ljLXN0cmluZyc7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFBsdWdpbiwgUm9sbGRvd25QbHVnaW5PcHRpb24sIFNvdXJjZU1hcElucHV0IH0gZnJvbSAncm9sbGRvd24nO1xuXG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRCdWlsZFRzUm9vdFBhdGggfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidW5kbGVCdWlsdGluc1BsdWdpbiB9IGZyb20gJy4vYnVuZGxlQnVpbHRpbnNQbHVnaW4uanMnO1xuaW1wb3J0IHsgY29udGFpbnNEZWNvcmF0b3IgfSBmcm9tICcuL2RlY29yYXRvckRldGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRDb25zb2xlUmVtb3ZhbEV4Y2x1ZGVkTWV0aG9kcywgcmVtb3ZlQ29uc29sZVBsdWdpbiB9IGZyb20gJy4vcmVtb3ZlQ29uc29sZVBsdWdpbi5qcyc7XG5pbXBvcnQgeyBpc1RyYW5zZm9ybVRhcmdldEZpbGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2lucyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10sXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmdcbik6IFJvbGxkb3duUGx1Z2luT3B0aW9uW10ge1xuICBjb25zdCBwbHVnaW5zOiBSb2xsZG93blBsdWdpbk9wdGlvbltdID0gW1xuICAgIGJ1bmRsZUJ1aWx0aW5zUGx1Z2luKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICBrZWVwSW1wb3J0UGx1Z2luKGFyZ3Yua2VlcEltcG9ydD8ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpID8/IFtdKSxcbiAgXTtcbiAgY29uc3QgZXhjbHVkZWRDb25zb2xlTWV0aG9kcyA9IGdldENvbnNvbGVSZW1vdmFsRXhjbHVkZWRNZXRob2RzKCk7XG4gIGlmIChleGNsdWRlZENvbnNvbGVNZXRob2RzKSB7XG4gICAgcGx1Z2lucy5wdXNoKHJlbW92ZUNvbnNvbGVQbHVnaW4oZXhjbHVkZWRDb25zb2xlTWV0aG9kcykpO1xuICB9XG4gIGlmIChhcmd2Wydjb3JlLWpzJ10gfHwgYXJndlsnY29yZS1qcy1wcm9wb3NhbHMnXSkge1xuICAgIHBsdWdpbnMucHVzaChiYWJlbENvcmVKc1BsdWdpbigpKTtcbiAgICBpZiAoIW91dHB1dE9wdGlvbnNMaXN0LnNvbWUoKG9wdHMpID0+IG9wdHMucHJlc2VydmVNb2R1bGVzKSkge1xuICAgICAgcGx1Z2lucy5wdXNoKGNvbW1vbkpzUnVudGltZVByZWx1ZGVQbHVnaW4oKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBsdWdpbnMucHVzaChiYWJlbERlY29yYXRvcnNQbHVnaW4oKSk7XG4gIH1cbiAgcGx1Z2lucy5wdXNoKHRleHRQbHVnaW4oKSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuXG5mdW5jdGlvbiBrZWVwSW1wb3J0UGx1Z2luKG1vZHVsZU5hbWVzOiBzdHJpbmdbXSk6IFBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2tlZXAtaW1wb3J0JyxcbiAgICByZXNvbHZlRHluYW1pY0ltcG9ydChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBtb2R1bGVOYW1lcy5pbmNsdWRlcyhzb3VyY2UpID8gZmFsc2UgOiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFiZWxDb3JlSnNQbHVnaW4oKTogUGx1Z2luIHtcbiAgcmV0dXJuIGJhYmVsUGx1Z2luKCdiYWJlbC1jb3JlLWpzJywgKCkgPT4gdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGJhYmVsRGVjb3JhdG9yc1BsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4gYmFiZWxQbHVnaW4oJ2JhYmVsLWRlY29yYXRvcnMnLCBjb250YWluc0RlY29yYXRvcik7XG59XG5cbmZ1bmN0aW9uIGJhYmVsUGx1Z2luKG5hbWU6IHN0cmluZywgc2hvdWxkVHJhbnNmb3JtOiAoY29kZTogc3RyaW5nLCBpZDogc3RyaW5nKSA9PiBib29sZWFuKTogUGx1Z2luIHtcbiAgY29uc3QgYmFiZWxDb25maWdQYXRoID0gcGF0aC5qb2luKGdldEJ1aWxkVHNSb290UGF0aCgpLCAnYmFiZWwuY29uZmlnLm1qcycpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgYXN5bmMgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICBpZiAoIWlzVHJhbnNmb3JtVGFyZ2V0RmlsZShpZCkgfHwgIXNob3VsZFRyYW5zZm9ybShjb2RlLCBpZCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB0cmFuc2Zvcm1Bc3luYyB9ID0gYXdhaXQgaW1wb3J0KCdAYmFiZWwvY29yZScpO1xuICAgICAgY29uc3Qgb3B0aW9uczogSW5wdXRPcHRpb25zID0ge1xuICAgICAgICBjYWxsZXI6IHtcbiAgICAgICAgICBuYW1lOiAnYnVpbGQtdHMnLFxuICAgICAgICAgIHN1cHBvcnRzRHluYW1pY0ltcG9ydDogdHJ1ZSxcbiAgICAgICAgICBzdXBwb3J0c0V4cG9ydE5hbWVzcGFjZUZyb206IHRydWUsXG4gICAgICAgICAgc3VwcG9ydHNTdGF0aWNFU006IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgICAgZmlsZW5hbWU6IGlkLFxuICAgICAgICBzb3VyY2VNYXBzOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybUFzeW5jKGNvZGUsIG9wdGlvbnMpO1xuICAgICAgaWYgKCFyZXN1bHQ/LmNvZGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHJlc3VsdC5jb2RlLFxuICAgICAgICBtYXA6IHJlc3VsdC5tYXAgYXMgU291cmNlTWFwSW5wdXQsXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbW1vbkpzUnVudGltZVByZWx1ZGVQbHVnaW4oKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnY29tbW9uanMtcnVudGltZS1wcmVsdWRlJyxcbiAgICByZW5kZXJDaHVuayhjb2RlLCBfY2h1bmssIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHByZWx1ZGUgPSBnZXRDb21tb25Kc1J1bnRpbWVQcmVsdWRlKGNvZGUsIG9wdGlvbnMuZm9ybWF0KTtcbiAgICAgIGlmICghcHJlbHVkZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgbWFnaWNTdHJpbmcgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSk7XG4gICAgICBtYWdpY1N0cmluZy5hcHBlbmRMZWZ0KGdldFByZWx1ZGVJbnNlcnRpb25JbmRleChjb2RlKSwgYCR7cHJlbHVkZX1cXG5gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IG1hZ2ljU3RyaW5nLnRvU3RyaW5nKCksXG4gICAgICAgIG1hcDogbWFnaWNTdHJpbmcuZ2VuZXJhdGVNYXAoeyBoaXJlczogdHJ1ZSB9KSBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgY29tbW9uSnNSdW50aW1lUHJlbHVkZSA9IGB2YXIgX19jcmVhdGU9T2JqZWN0LmNyZWF0ZSxfX2RlZlByb3A9T2JqZWN0LmRlZmluZVByb3BlcnR5LF9fZ2V0T3duUHJvcERlc2M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixfX2dldE93blByb3BOYW1lcz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyxfX2dldFByb3RvT2Y9T2JqZWN0LmdldFByb3RvdHlwZU9mLF9faGFzT3duUHJvcD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LF9fY29tbW9uSlNNaW49KG1vZHVsZUZhY3RvcnksbW9kdWxlKT0+KCk9Pihtb2R1bGV8fChtb2R1bGU9e2V4cG9ydHM6e319LG1vZHVsZUZhY3RvcnkobW9kdWxlLmV4cG9ydHMsbW9kdWxlKSksbW9kdWxlLmV4cG9ydHMpLF9fY29weVByb3BzPSh0byxmcm9tLGV4Y2VwdCxkZXNjcmlwdG9yKT0+e2lmKGZyb20mJlwib2JqZWN0XCI9PXR5cGVvZiBmcm9tfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBmcm9tKWZvcih2YXIga2V5LG5hbWVzPV9fZ2V0T3duUHJvcE5hbWVzKGZyb20pLGluZGV4PTAsbGVuZ3RoPW5hbWVzLmxlbmd0aDtpbmRleDxsZW5ndGg7aW5kZXgrKylrZXk9bmFtZXNbaW5kZXhdLF9faGFzT3duUHJvcC5jYWxsKHRvLGtleSl8fGtleT09PWV4Y2VwdHx8X19kZWZQcm9wKHRvLGtleSx7Z2V0OihrZXk9PmZyb21ba2V5XSkuYmluZChudWxsLGtleSksZW51bWVyYWJsZTohKGRlc2NyaXB0b3I9X19nZXRPd25Qcm9wRGVzYyhmcm9tLGtleSkpfHxkZXNjcmlwdG9yLmVudW1lcmFibGV9KTtyZXR1cm4gdG99LF9fdG9FU009KG1vZCxpc05vZGVNb2RlLHRhcmdldCk9Pih0YXJnZXQ9bnVsbCE9bW9kP19fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKTp7fSxfX2NvcHlQcm9wcyghaXNOb2RlTW9kZSYmbW9kJiZtb2QuX19lc01vZHVsZT90YXJnZXQ6X19kZWZQcm9wKHRhcmdldCxcImRlZmF1bHRcIix7dmFsdWU6bW9kLGVudW1lcmFibGU6ITB9KSxtb2QpKTtgO1xuXG5mdW5jdGlvbiBnZXRDb21tb25Kc1J1bnRpbWVQcmVsdWRlKGNvZGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvZGUuaW5jbHVkZXMoJ19fY29tbW9uSlNNaW4nKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBSb2xsZG93biAxLjEuMiBjYW4gZW1pdCBoZWxwZXJzIGFmdGVyIGNvcmUtanMgd3JhcHBlcnMgdGhhdCBhbHJlYWR5IGNhbGwgdGhlbS5cbiAgLy8gU2VlZGluZyB0aGUgaGVscGVycyBmaXJzdCBwcmV2ZW50cyBtaW5pZmllZCBvdXRwdXQgZnJvbSBjYWxsaW5nIHVuaW5pdGlhbGl6ZWQgYWxpYXNlcy5cbiAgaWYgKGlzQ29tbW9uSnNGb3JtYXQoZm9ybWF0KSkgcmV0dXJuIGNvZGUuaW5jbHVkZXMoJ19fdG9FU00nKSA/IGNvbW1vbkpzUnVudGltZVByZWx1ZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBgdmFyIF9fY29tbW9uSlNNaW49KG1vZHVsZUZhY3RvcnksbW9kdWxlKT0+KCk9Pihtb2R1bGV8fChtb2R1bGU9e2V4cG9ydHM6e319LG1vZHVsZUZhY3RvcnkobW9kdWxlLmV4cG9ydHMsbW9kdWxlKSksbW9kdWxlLmV4cG9ydHMpO2A7XG59XG5cbmZ1bmN0aW9uIGlzQ29tbW9uSnNGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZvcm1hdCA9PT0gJ2NqcycgfHwgZm9ybWF0ID09PSAnY29tbW9uanMnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVsdWRlSW5zZXJ0aW9uSW5kZXgoY29kZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgaWYgKGNvZGUuc3RhcnRzV2l0aCgnIyEnKSkge1xuICAgIGNvbnN0IGZpcnN0TGluZUVuZCA9IGNvZGUuaW5kZXhPZignXFxuJyk7XG4gICAgaWYgKGZpcnN0TGluZUVuZCA9PT0gLTEpIHJldHVybiBjb2RlLmxlbmd0aDtcbiAgICBpbmRleCA9IGZpcnN0TGluZUVuZCArIDE7XG4gIH1cblxuICBjb25zdCBkaXJlY3RpdmVQYXR0ZXJuID0gLyg/Oig/OlwiW15cIlxcbl0qXCJ8J1teJ1xcbl0qJyk7P1xccyopL3k7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgZGlyZWN0aXZlUGF0dGVybi5sYXN0SW5kZXggPSBpbmRleDtcbiAgICBjb25zdCBtYXRjaCA9IGRpcmVjdGl2ZVBhdHRlcm4uZXhlYyhjb2RlKTtcbiAgICBpZiAoIW1hdGNoPy5bMF0pIHJldHVybiBpbmRleDtcbiAgICBpbmRleCA9IGRpcmVjdGl2ZVBhdHRlcm4ubGFzdEluZGV4O1xuICB9XG59XG5cbmZ1bmN0aW9uIHRleHRQbHVnaW4oKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAndGV4dCcsXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5lbmRzV2l0aCgnLmNzdicpICYmICFpZC5lbmRzV2l0aCgnLnR4dCcpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoaWQsICd1dGY4Jyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBgZXhwb3J0IGRlZmF1bHQgJHtKU09OLnN0cmluZ2lmeShjb250ZW50KX07YCxcbiAgICAgICAgbW9kdWxlVHlwZTogJ2pzJyxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgY29yZVByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgaW5wdXRzPzogc3RyaW5nW11cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb3JlQ29uZmlnRmlsZSA9IGZpbmRDb25maWdGaWxlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gIGlmICghY29yZUNvbmZpZ0ZpbGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgdHNjb25maWcuanNvbiBpbiAke2NvcmVQcm9qZWN0RGlyUGF0aH0uYCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0ZvdW5kIHRzY29uZmlnLmpzb246JywgY29yZUNvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmdbXSB8IHVuZGVmaW5lZF1bXSA9IFtdO1xuICBsZXQgY29yZU91dERpciA9IHBhdGguam9pbihvdXREaXJQYXRoLCBwYXRoLmJhc2VuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCksICdzcmMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoY29yZU91dERpcikpIHtcbiAgICAvLyBUaGUgYnVuZGxlciBlbWl0dGVkIHBlci1wcm9qZWN0IGRpcmVjdG9yaWVzIChtb25vcmVwbyBidWlsZCksIHNvIGVudHJ5LWJhc2VkIHJlc3RyaWN0aW9uIGlzIHVuc2FmZTpcbiAgICAvLyBlbnRyaWVzIG1heSBpbXBvcnQgZmlsZXMgb3V0c2lkZSBlYWNoIHByb2plY3QncyByb290RGlyLlxuICAgIGlucHV0cyA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocGFyZW50RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvcmVQcm9qZWN0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwcm9qZWN0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnREaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBpZiAocHJvamVjdERpclBhdGggPT09IGNvcmVQcm9qZWN0RGlyUGF0aCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBmaW5kQ29uZmlnRmlsZShwcm9qZWN0RGlyUGF0aCk7XG4gICAgICBjb25zdCBvdXREaXIgPSBwYXRoLmpvaW4ob3V0RGlyUGF0aCwgZGlyZW50Lm5hbWUsICdzcmMnKTtcbiAgICAgIGlmIChjb25maWdGaWxlICYmIGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgICAgICBwcm9qZWN0cy5wdXNoKFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyLCB1bmRlZmluZWRdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29yZU91dERpciA9IG91dERpclBhdGg7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgY29yZU91dERpciwgaW5wdXRzXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIsIHByb2plY3RJbnB1dHNdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBhd2FpdCBydW5Uc2dvKGFyZ3YsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIsIHByb2plY3RJbnB1dHMpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRzZ28oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nLFxuICBpbnB1dHM/OiBzdHJpbmdbXVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ3J1blRzZ28oKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIsIGlucHV0cyk7XG4gIH1cblxuICAvLyBUaGUgdGVtcG9yYXJ5IGNvbmZpZyBtdXN0IGxpdmUgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5IHNvIHRoYXQgaXRzIHJlbGF0aXZlIGByb290RGlyYCBhbmRcbiAgLy8gYGluY2x1ZGVgIHJlc29sdmUgYWdhaW5zdCB0aGUgcHJvamVjdCBldmVuIHdoZW4gdGhlIGV4dGVuZGVkIHRzY29uZmlnIGlzIGluIGFuIGFuY2VzdG9yIGRpcmVjdG9yeS5cbiAgY29uc3QgdGVtcENvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsIGAuYnVpbGQtdHMtdHNnby4ke3Byb2Nlc3MucGlkfS4ke0RhdGUubm93KCl9Lmpzb25gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICB0ZW1wQ29uZmlnRmlsZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KGF3YWl0IGNyZWF0ZVR5cGVTY3JpcHROYXRpdmVDb25maWcocHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciwgaW5wdXRzKSwgdW5kZWZpbmVkLCAyKVxuICAgICk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocHJvY2Vzcy5leGVjUGF0aCwgW2dldFRzZ29QYXRoKCksICctcCcsIHRlbXBDb25maWdGaWxlXSwge1xuICAgICAgY3dkOiBwcm9qZWN0RGlyUGF0aCxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5lcnJvcikgdGhyb3cgcmV0LmVycm9yO1xuICAgIHJldHVybiByZXQuc3RhdHVzID09PSAwO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRlbXBDb25maWdGaWxlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVR5cGVTY3JpcHROYXRpdmVDb25maWcoXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ0ZpbGU6IHN0cmluZyxcbiAgb3V0RGlyOiBzdHJpbmcsXG4gIGlucHV0cz86IHN0cmluZ1tdXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgLy8gQW4gaW5oZXJpdGVkIGBjb21wb3NpdGVgIHdvdWxkIHJlcXVpcmUgbGlzdGluZyBldmVyeSBpbXBvcnRlZCBmaWxlIGV4cGxpY2l0bHkgKFRTNjMwNykgYW5kLFxuICAgIC8vIGxpa2UgYGluY3JlbWVudGFsYCwgd291bGQgd3JpdGUgbmVlZGxlc3MgLnRzYnVpbGRpbmZvIGZpbGVzIGZvciB0aGlzIG9uZS1zaG90IGNvbXBpbGF0aW9uLlxuICAgIGNvbXBvc2l0ZTogZmFsc2UsXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgLy8gQW4gaW5oZXJpdGVkIGBkZWNsYXJhdGlvbkRpcmAgd291bGQgc2lsZW50bHkgcmVkaXJlY3QgdGhlIG91dHB1dCBhd2F5IGZyb20gYG91dERpcmAuXG4gICAgZGVjbGFyYXRpb25EaXI6IG91dERpcixcbiAgICBlbWl0RGVjbGFyYXRpb25Pbmx5OiB0cnVlLFxuICAgIGluY3JlbWVudGFsOiBmYWxzZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG5vRW1pdE9uRXJyb3I6IHRydWUsXG4gICAgb3V0RGlyLFxuICAgIC8vIFR5cGVTY3JpcHQgNyByZXF1aXJlcyBhbiBleHBsaWNpdCBgcm9vdERpcmAgKFRTNTAxMSkuIEVudHJpZXMgaW1wb3J0aW5nIGZpbGVzIG91dHNpZGUgc3JjL1xuICAgIC8vIChlLmcuIHNpYmxpbmcgcGFja2FnZXMgaW4gZGVjbGFyYXRpb24tb25seSBtb2RlKSBmYWlsIHdpdGggVFM2MDU5OyBzZWUgdGhlIFJFQURNRSBsaW1pdGF0aW9uLlxuICAgIHJvb3REaXI6ICdzcmMnLFxuICB9O1xuICBpZiAoYXdhaXQgdXNlc05vZGVQcm90b2NvbEltcG9ydChwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsICdzcmMnKSkpIHtcbiAgICBjb25zdCB0eXBlc0RpclBhdGggPSBmaW5kVHlwZXNEaXJQYXRoKHByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCB0eXBlcyA9IHR5cGVzRGlyUGF0aCA/IGF3YWl0IGNvbGxlY3RUeXBlUGFja2FnZXModHlwZXNEaXJQYXRoKSA6IFtdO1xuICAgIGlmICh0eXBlcy5pbmNsdWRlcygnbm9kZScpKSB7XG4gICAgICBjb21waWxlck9wdGlvbnMudHlwZXMgPSB0eXBlcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb21waWxlck9wdGlvbnMsXG4gICAgZXh0ZW5kczogdG9SZWxhdGl2ZUNvbmZpZ1BhdGgocHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUpLFxuICAgIC8vIFdpdGggYGZpbGVzYCwgdHNjIGFsc28gZW1pdHMgZGVjbGFyYXRpb25zIGZvciBmaWxlcyB0cmFuc2l0aXZlbHkgaW1wb3J0ZWQgZnJvbSB0aGUgZW50cmllcyxcbiAgICAvLyBzbyB0aGUgb3V0cHV0IGlzIHJlc3RyaWN0ZWQgdG8gd2hhdCB0aGUgYnVuZGxlZCBKYXZhU2NyaXB0IGFjdHVhbGx5IGNvbnRhaW5zLiBgaW5jbHVkZWAgbXVzdCBiZVxuICAgIC8vIG92ZXJyaWRkZW4gc2luY2UgYW4gaW5oZXJpdGVkIGBpbmNsdWRlYCB3b3VsZCBhZGQgZmlsZXMgYmFjayB0byB0aGUgcHJvZ3JhbTsgb25seSBhbWJpZW50XG4gICAgLy8gZGVjbGFyYXRpb24gZmlsZXMgYXJlIGtlcHQgYmVjYXVzZSBlbnRyaWVzIG1heSByZWx5IG9uIHRoZWlyIGdsb2JhbCB0eXBlcyB3aXRob3V0IGltcG9ydGluZyB0aGVtLlxuICAgIC4uLihpbnB1dHM/Lmxlbmd0aFxuICAgICAgPyB7XG4gICAgICAgICAgZXhjbHVkZTogW10sXG4gICAgICAgICAgZmlsZXM6IGlucHV0cy5tYXAoKGlucHV0KSA9PiBwYXRoLnJlc29sdmUocHJvamVjdERpclBhdGgsIGlucHV0KS5yZXBsYWNlQWxsKHBhdGguc2VwLCAnLycpKSxcbiAgICAgICAgICBpbmNsdWRlOiBbJ3NyYy8qKi8qLmQudHMnLCAnc3JjLyoqLyouZC5tdHMnLCAnc3JjLyoqLyouZC5jdHMnXSxcbiAgICAgICAgfVxuICAgICAgOiB7IGluY2x1ZGU6IFsnc3JjLyoqLyonXSB9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZENvbmZpZ0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHJldHVybiBjb25maWdGaWxlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUc2dvUGF0aCgpOiBzdHJpbmcge1xuICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciAoZm9ybWVybHkgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCkgYXNcbiAgLy8gdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCB3aG9zZSBgbGliL3RzYy5qc2Agd3JhcHBlciBzcGF3bnMgdGhlIHBsYXRmb3JtIGJpbmFyeS5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKCd0eXBlc2NyaXB0L3BhY2thZ2UuanNvbicpO1xuICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCAnbGliJywgJ3RzYy5qcycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1c2VzTm9kZVByb3RvY29sSW1wb3J0KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmIChhd2FpdCB1c2VzTm9kZVByb3RvY29sSW1wb3J0KGNoaWxkUGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICgvXFwuW2NtXT90c3g/JC8udGVzdChkaXJlbnQubmFtZSkgJiYgKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNoaWxkUGF0aCwgJ3V0ZjgnKSkuaW5jbHVkZXMoJ25vZGU6JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBmaW5kVHlwZXNEaXJQYXRoKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCB0eXBlc0RpclBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnQHR5cGVzJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModHlwZXNEaXJQYXRoKSkgcmV0dXJuIHR5cGVzRGlyUGF0aDtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50RGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFR5cGVQYWNrYWdlcyh0eXBlUm9vdHNEaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIodHlwZVJvb3RzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkaXJlbnRzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8vIGB0b0ZpbGVQYXRoYCBpcyBhbHdheXMgYSB0c2NvbmZpZyBpbiBgZnJvbURpclBhdGhgIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3IgZGlyZWN0b3JpZXMsIHNvIHRoZVxuLy8gcmVzdWx0IGlzIGFsd2F5cyByZWxhdGl2ZSAoYC4vYCBvciBgLi4vYCBjaGFpbnMpOyBhIGNyb3NzLWRyaXZlIGFic29sdXRlIHJlc3VsdCBpcyBpbXBvc3NpYmxlLlxuZnVuY3Rpb24gdG9SZWxhdGl2ZUNvbmZpZ1BhdGgoZnJvbURpclBhdGg6IHN0cmluZywgdG9GaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmcm9tRGlyUGF0aCwgdG9GaWxlUGF0aCkucmVwbGFjZUFsbChwYXRoLnNlcCwgJy8nKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHN0eWxlVGV4dCB9IGZyb20gJ25vZGU6dXRpbCc7XG5cbmltcG9ydCB7IHJvbGxkb3duLCB3YXRjaCB9IGZyb20gJ3JvbGxkb3duJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUm9sbGRvd25CdWlsZCwgUm9sbGRvd25PcHRpb25zIH0gZnJvbSAncm9sbGRvd24nO1xuaW1wb3J0IHsgb25FeGl0IH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiwgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0Q2F0ZWdvcnksIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGFsbFRhcmdldENhdGVnb3JpZXMgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBmb3JtYXREYXRlVGltZSwgZm9ybWF0RHVyYXRpb24sIGdldE5hbWVzcGFjZUFuZE5hbWUsIHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSwgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBhcHBCdWlsZGVyLCBmdW5jdGlvbnNCdWlsZGVyLCBsaWJCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGhhbmRsZUVycm9yIH0gZnJvbSAnLi9idW5kbGVyTG9nZ2VyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUV4dGVybmFsTWF0Y2hlciB9IGZyb20gJy4vZXh0ZXJuYWxzLmpzJztcbmltcG9ydCB7IHNldHVwUGx1Z2lucyB9IGZyb20gJy4vcGx1Z2luLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbmV4cG9ydCBjb25zdCBhcHA6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgYXBwQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYXBwIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYW4gYXBwJyxcbiAgYnVpbGRlcjogYXBwQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdhcHAnKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgZnVuY3Rpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZnVuY3Rpb25zIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBHQ1AvRmlyZWJhc2UgZnVuY3Rpb25zIGFwcCcsXG4gIGJ1aWxkZXI6IGZ1bmN0aW9uc0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2Lm9ubHlQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gICAgICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICAgICAgICByZXNvbHZlT3V0RGlyUGF0aChhcmd2LCBwcm9jZXNzLmN3ZCgpLCBwYWNrYWdlRGlyUGF0aCwgdW5kZWZpbmVkLCAnZnVuY3Rpb25zJyksXG4gICAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgICBhcmd2Lm1vZHVsZVR5cGVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWlsZChhcmd2LCAnZnVuY3Rpb25zJyk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxpYjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBsaWJCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaWIgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIE5vZGUuanMgLyBSZWFjdCBsaWJyYXJ5JyxcbiAgYnVpbGRlcjogbGliQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdsaWInKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgdGFyZ2V0Q2F0ZWdvcnk6IFRhcmdldENhdGVnb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8PSAncHJvZHVjdGlvbic7XG5cbiAgLy8gYHNpbGVudGAgaXMgc3Ryb25nZXIgdGhhbiBgdmVyYm9zZWAuXG4gIGNvbnN0IHZlcmJvc2UgPSAhYXJndi5zaWxlbnQgJiYgYXJndi52ZXJib3NlO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcGFja2FnZURpclBhdGgpO1xuXG4gIGNvbnN0IGlucHV0cyA9IHZlcmlmeUlucHV0KGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCB0YXJnZXREZXRhaWwgPSBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnksIGlucHV0cywgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCBvdXREaXJQYXRoID0gcmVzb2x2ZU91dERpclBhdGgoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCwgaW5wdXRzLCB0YXJnZXRDYXRlZ29yeSk7XG4gIC8vIFJlc3RyaWN0IGRlY2xhcmF0aW9uIGZpbGVzIHRvIHRoZSBlbnRyeSBmaWxlcyAoYW5kIHRoZWlyIGltcG9ydHMpIG9ubHkgd2hlbiBpbnB1dHMgYXJlIGV4cGxpY2l0LFxuICAvLyB0byBrZWVwIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGVtaXR0aW5nIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGZpbGVzIHVuZGVyIHNyYy8uXG4gIGNvbnN0IGRlY2xhcmF0aW9uSW5wdXRzID0gYXJndi5pbnB1dD8ubGVuZ3RoID8gaW5wdXRzIDogdW5kZWZpbmVkO1xuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdhcmd2OicsIGFyZ3YpO1xuICAgIGNvbnNvbGUuaW5mbygncGFja2FnZUpzb25QYXRoOicsIHBhY2thZ2VKc29uUGF0aCk7XG4gICAgY29uc29sZS5pbmZvKCdUYXJnZXQgKENhdGVnb3J5KTonLCBgJHt0YXJnZXREZXRhaWx9ICgke3RhcmdldENhdGVnb3J5fSlgKTtcbiAgfVxuXG4gIGNvbnN0IFtuYW1lc3BhY2VdID0gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbik7XG4gIGNvbnN0IGlzRXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuXG4gIGlmIChhcmd2Wydjb3JlLWpzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlMgPSAnMSc7XG4gIH0gZWxzZSBpZiAoYXJndlsnY29yZS1qcy1wcm9wb3NhbHMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyA9ICcxJztcbiAgfVxuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVkVSQk9TRSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkgPSB0YXJnZXRDYXRlZ29yeTtcbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0RFVEFJTCA9IHRhcmdldERldGFpbDtcblxuICBjb25zdCBkZWNsYXJhdGlvbk9ubHkgPSAnZGVjbGFyYXRpb25Pbmx5JyBpbiBhcmd2ICYmIGFyZ3YuZGVjbGFyYXRpb25Pbmx5O1xuICBpZiAoZGVjbGFyYXRpb25Pbmx5ICYmIGFyZ3Yud2F0Y2gpIHtcbiAgICBjb25zb2xlLmVycm9yKCctLWRlY2xhcmF0aW9uLW9ubHkgY2Fubm90IGJlIHVzZWQgd2l0aCAtLXdhdGNoLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0ID0gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoYXJndiwgdGFyZ2V0RGV0YWlsLCBvdXREaXJQYXRoLCBpc0VzbVBhY2thZ2UsIHBhY2thZ2VEaXJQYXRoKTtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ091dHB1dE9wdGlvbnM6Jywgb3V0cHV0T3B0aW9uc0xpc3QpO1xuICB9XG4gIGlmIChvdXRwdXRPcHRpb25zTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IG91dHB1dCBmaWxlcy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcm9jZXNzLmNoZGlyKHBhY2thZ2VEaXJQYXRoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMob3V0RGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gIH1cblxuICBpZiAoZGVjbGFyYXRpb25Pbmx5KSB7XG4gICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBzdHlsZVRleHQoXG4gICAgICAgICAgJ2N5YW4nLFxuICAgICAgICAgIGBHZW5lcmF0ZXMgZGVjbGFyYXRpb24gZmlsZXMg4oaSICR7c3R5bGVUZXh0KCdib2xkJywgcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgb3V0RGlyUGF0aCkpfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoLCBvdXREaXJQYXRoLCBkZWNsYXJhdGlvbklucHV0cykpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFJvbGxkb3duT3B0aW9ucyA9IHtcbiAgICBjaGVja3M6IHsgcHJlZmVyQnVpbHRpbkZlYXR1cmU6IGZhbHNlIH0sXG4gICAgZXh0ZXJuYWw6IGNyZWF0ZUV4dGVybmFsTWF0Y2hlcihhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICBpbnB1dDpcbiAgICAgIHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycgPyBjcmVhdGVGdW5jdGlvbnNJbnB1dEVudHJpZXMoaW5wdXRzKSA6IGlucHV0cyxcbiAgICBwbHVnaW5zOiBzZXR1cFBsdWdpbnMoYXJndiwgb3V0cHV0T3B0aW9uc0xpc3QsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICByZXNvbHZlOiB7XG4gICAgICBleHRlbnNpb25BbGlhczoge1xuICAgICAgICAnLmNqcyc6IFsnLmNqcycsICcuY3RzJ10sXG4gICAgICAgICcuanMnOiBbJy5qcycsICcudHMnLCAnLnRzeCddLFxuICAgICAgICAnLm1qcyc6IFsnLm1qcycsICcubXRzJ10sXG4gICAgICB9LFxuICAgICAgZXh0ZW5zaW9uczogWycuY3RzJywgJy5tdHMnLCAnLnRzJywgJy50c3gnLCAnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJ10sXG4gICAgfSxcbiAgICB0cmVlc2hha2U6IGFyZ3ZbJ2NvcmUtanMnXSB8fCBhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddID8gZmFsc2UgOiB1bmRlZmluZWQsXG4gICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm1PcHRpb25zKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB3YXRjaDogYXJndi53YXRjaCA/IHsgY2xlYXJTY3JlZW46IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgY29uc3QgcGF0aFRvUmVsYXRpdmVQYXRoID0gKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pOiBzdHJpbmdbXSA9PlxuICAgIChBcnJheS5pc0FycmF5KHBhdGhzKSA/IHBhdGhzIDogW3BhdGhzXSkubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwKSk7XG4gIGNvbnN0IHByaW50QnVuZGxpbmdNZXNzYWdlID0gKGlucHV0UGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gcGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSk7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAnY3lhbicsXG4gICAgICAgIGBCdW5kbGVzICR7c3R5bGVUZXh0KCdib2xkJywgcGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0UGF0aHMpLmpvaW4oJywgJykpfSDihpIgJHtzdHlsZVRleHQoXG4gICAgICAgICAgJ2JvbGQnLFxuICAgICAgICAgIG91dHB1dFBhdGhzLmpvaW4oJywgJylcbiAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICApXG4gICAgKTtcbiAgfTtcbiAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICB3YXRjaFJvbGxkb3duKFxuICAgICAgYXJndixcbiAgICAgIHRhcmdldERldGFpbCxcbiAgICAgIHBhY2thZ2VEaXJQYXRoLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIGRlY2xhcmF0aW9uSW5wdXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG91dHB1dE9wdGlvbnNMaXN0LFxuICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoLFxuICAgICAgcHJpbnRCdW5kbGluZ01lc3NhZ2VcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIHByaW50QnVuZGxpbmdNZXNzYWdlKGlucHV0cyk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbGRvd25CdWlsZCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnVpbGRGYWlsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IF9idW5kbGUgPSBhd2FpdCByb2xsZG93bihvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAgICAgJ2dyZWVuJyxcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtzdHlsZVRleHQoJ2JvbGQnLCBmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJlxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJlxuICAgICAgIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgsIG91dERpclBhdGgsIGRlY2xhcmF0aW9uSW5wdXRzKSlcbiAgICApIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtT3B0aW9ucyhhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFJvbGxkb3duT3B0aW9uc1sndHJhbnNmb3JtJ10ge1xuICByZXR1cm4ge1xuICAgIGRlZmluZTogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIHRhcmdldDogJ2VzMjAyMicsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbGRvd24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICBkZWNsYXJhdGlvbklucHV0czogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFJvbGxkb3duT3B0aW9ucyxcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSxcbiAgcGF0aFRvUmVsYXRpdmVQYXRoOiAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPikgPT4gc3RyaW5nW10sXG4gIHByaW50QnVuZGxpbmdNZXNzYWdlOiAoaW5wdXRQYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlPzogbnVtYmVyIHwgbnVsbCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2VPblVuY2F1Z2h0RXhjZXB0aW9uKTtcbiAgICBwcm9jZXNzLnN0ZGluLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbG9zZU9uU3RkaW5FbmQpO1xuICAgIGF3YWl0IHdhdGNoZXIuY2xvc2UoKTtcbiAgICBpZiAoY29kZSkgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICB9O1xuICBjb25zdCBjbG9zZU9uVW5jYXVnaHRFeGNlcHRpb24gPSAoZXJyb3I6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB2b2lkIGNsb3NlKDEpO1xuICB9O1xuICBjb25zdCBjbG9zZU9uU3RkaW5FbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgdm9pZCBjbG9zZSgpO1xuICB9O1xuICBvbkV4aXQoKGNvZGUpID0+IHZvaWQgY2xvc2UoY29kZSkpO1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlT25VbmNhdWdodEV4Y2VwdGlvbik7XG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHByb2Nlc3Muc3RkaW4ub24oJ2VuZCcsIGNsb3NlT25TdGRpbkVuZCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihldmVudC5lcnJvciwgdHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQlVORExFX1NUQVJUJzoge1xuICAgICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgICBwcmludEJ1bmRsaW5nTWVzc2FnZShnZXRJbnB1dEZpbGVzKG9wdGlvbnMuaW5wdXQpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCVU5ETEVfRU5EJzoge1xuICAgICAgICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAgICAgICAgICdncmVlbicsXG4gICAgICAgICAgICAgICAgYENyZWF0ZWQgJHtzdHlsZVRleHQoJ2JvbGQnLCBwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpKX0gaW4gJHtzdHlsZVRleHQoXG4gICAgICAgICAgICAgICAgICAnYm9sZCcsXG4gICAgICAgICAgICAgICAgICBmb3JtYXREdXJhdGlvbihldmVudC5kdXJhdGlvbilcbiAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycpIHtcbiAgICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCwgb3V0RGlyUGF0aCwgZGVjbGFyYXRpb25JbnB1dHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdFTkQnOiB7XG4gICAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuWyR7Zm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gS2VlcCB0aGUgd2F0Y2hlciBhbGl2ZSBldmVuIGlmIGhhbmRsaW5nIGFuIGV2ZW50IChlLmcuIGRlY2xhcmF0aW9uIGZpbGUgZ2VuZXJhdGlvbikgZmFpbHMuXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaGFuZGxlIHdhdGNoIGV2ZW50IGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgICAgdm9pZCBldmVudC5yZXN1bHQuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlT3V0RGlyUGF0aChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGN3ZDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBpbnB1dHM/OiBzdHJpbmdbXSxcbiAgdGFyZ2V0Q2F0ZWdvcnk/OiBUYXJnZXRDYXRlZ29yeVxuKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJndi5vdXREaXIpKSB7XG4gICAgY29uc29sZS5lcnJvcignTXVsdGlwbGUgLS1vdXQtZGlyIG9wdGlvbnMgYXJlIG5vdCBhbGxvd2VkLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyB5YXJncyBhbHNvIGFjY2VwdHMgYC0tbm8tb3V0LWRpcmAsIHdoaWNoIHlpZWxkcyBgZmFsc2VgIGRlc3BpdGUgdGhlIGRlY2xhcmVkIHN0cmluZyB0eXBlLlxuICBjb25zdCBvdXREaXJPcHRpb24gPSB0eXBlb2YgYXJndi5vdXREaXIgPT09ICdzdHJpbmcnID8gYXJndi5vdXREaXIgOiB1bmRlZmluZWQ7XG4gIGlmIChvdXREaXJPcHRpb24gPT09ICcnKSB7XG4gICAgY29uc29sZS5lcnJvcignLS1vdXQtZGlyIG11c3Qgbm90IGJlIGVtcHR5LicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIFRoZSBvdXRwdXQgZGlyZWN0b3J5IGlzIHJlbW92ZWQgYmVmb3JlIGJ1aWxkaW5nLCBzbyByZWZ1c2UgbG9jYXRpb25zIHRoYXQgd291bGQgZGVsZXRlIHNvdXJjZSBmaWxlcy5cbiAgLy8gQ29udGFpbm1lbnQgY2hlY2tzIGNvbXBhcmUgYm90aCB0aGUgbGV4aWNhbCBhbmQgdGhlIGNhbm9uaWNhbCAoc3ltbGluay1yZXNvbHZlZCkgZm9ybXM6IGNhbm9uaWNhbFxuICAvLyBvbmVzIGNhdGNoIHN5bWxpbmtlZCBwYXJlbnQgY29tcG9uZW50cyAoYGZzLnJtYCBmb2xsb3dzIHRoZW0pLCBhbmQgbGV4aWNhbCBvbmVzIGNhdGNoIGFuIG91dHB1dCBwYXRoXG4gIC8vIHRoYXQgaXMgaXRzZWxmIGEgc3ltbGluayBpbnNpZGUgYSBwcm90ZWN0ZWQgZGlyZWN0b3J5LiBUaGUgbGV4aWNhbCBwYXRoIGlzIHJldHVybmVkIHNvIHRoYXQgcmVtb3ZpbmdcbiAgLy8gYSBzeW1saW5rZWQgb3V0cHV0IGRpcmVjdG9yeSBkZWxldGVzIHRoZSBzeW1saW5rIGl0c2VsZiByYXRoZXIgdGhhbiBpdHMgdGFyZ2V0J3MgY29udGVudHMuXG4gIGNvbnN0IGxleGljYWxPdXREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgb3V0RGlyT3B0aW9uID8/IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKSk7XG4gIGNvbnN0IG91dERpclBhdGggPSB0b0Nhbm9uaWNhbFBhdGgobGV4aWNhbE91dERpclBhdGgpO1xuICBjb25zdCBjb250YWluZWRJbnB1dCA9IGlucHV0cz8uZmluZChcbiAgICAoaW5wdXQpID0+IGNvbnRhaW5zUGF0aChvdXREaXJQYXRoLCB0b0Nhbm9uaWNhbFBhdGgoaW5wdXQpKSB8fCBjb250YWluc1BhdGgobGV4aWNhbE91dERpclBhdGgsIGlucHV0KVxuICApO1xuICBpZiAoY29udGFpbmVkSW5wdXQpIHtcbiAgICBjb25zb2xlLmVycm9yKGBUaGUgb3V0cHV0IGRpcmVjdG9yeSAoJHtvdXREaXJQYXRofSkgbXVzdCBub3QgY29udGFpbiB0aGUgaW5wdXQgZmlsZSAoJHtjb250YWluZWRJbnB1dH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBpZiAoIW91dERpck9wdGlvbikgcmV0dXJuIGxleGljYWxPdXREaXJQYXRoO1xuXG4gIGNvbnN0IGNhbm9uaWNhbFBhY2thZ2VEaXJQYXRoID0gdG9DYW5vbmljYWxQYXRoKHBhY2thZ2VEaXJQYXRoKTtcbiAgaWYgKGNvbnRhaW5zUGF0aChvdXREaXJQYXRoLCBjYW5vbmljYWxQYWNrYWdlRGlyUGF0aCkgfHwgY29udGFpbnNQYXRoKGxleGljYWxPdXREaXJQYXRoLCBwYWNrYWdlRGlyUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGAtLW91dC1kaXIgKCR7b3V0RGlyUGF0aH0pIG11c3Qgbm90IGNvbnRhaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5ICgke2Nhbm9uaWNhbFBhY2thZ2VEaXJQYXRofSkuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIC8vIGBzcmNgIGl0c2VsZiBtYXkgYmUgYSBzeW1saW5rLCBzbyBpdCBuZWVkcyBpdHMgb3duIGNhbm9uaWNhbGl6YXRpb24uXG4gIGNvbnN0IHNyY0RpclBhdGggPSB0b0Nhbm9uaWNhbFBhdGgocGF0aC5qb2luKGNhbm9uaWNhbFBhY2thZ2VEaXJQYXRoLCAnc3JjJykpO1xuICBpZiAoY29udGFpbnNQYXRoKHNyY0RpclBhdGgsIG91dERpclBhdGgpIHx8IGNvbnRhaW5zUGF0aChwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKSwgbGV4aWNhbE91dERpclBhdGgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgLS1vdXQtZGlyICgke291dERpclBhdGh9KSBtdXN0IG5vdCBiZSBpbnNpZGUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgKCR7c3JjRGlyUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyBBIHBhY2thZ2UuanNvbiBhdCB0aGUgb3V0cHV0IGRpcmVjdG9yeSByb290IGluZGljYXRlcyBhbm90aGVyIHBhY2thZ2UncyBkaXJlY3RvcnkuIFRoZSBmdW5jdGlvbnNcbiAgLy8gdGFyZ2V0IGlzIGV4ZW1wdCBiZWNhdXNlIGl0IGdlbmVyYXRlcyBhIHBhY2thZ2UuanNvbiB0aGVyZSBpdHNlbGYuXG4gIGlmICh0YXJnZXRDYXRlZ29yeSAhPT0gJ2Z1bmN0aW9ucycgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ob3V0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYC0tb3V0LWRpciAoJHtvdXREaXJQYXRofSkgY29udGFpbnMgYSBwYWNrYWdlLmpzb24sIHNvIGl0IGxvb2tzIGxpa2UgYSBwYWNrYWdlIGRpcmVjdG9yeS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGxleGljYWxPdXREaXJQYXRoO1xufVxuXG4vLyBSZXNvbHZlcyBzeW1saW5rcyBpbiB0aGUgbG9uZ2VzdCBleGlzdGluZyBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gcGF0aCwga2VlcGluZyB0aGUgbm9uLWV4aXN0ZW50IHRhaWwuXG5mdW5jdGlvbiB0b0Nhbm9uaWNhbFBhdGgodGFyZ2V0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VmZml4ZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50UGF0aCA9IHRhcmdldFBhdGg7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhjdXJyZW50UGF0aCkpIHtcbiAgICBzdWZmaXhlcy51bnNoaWZ0KHBhdGguYmFzZW5hbWUoY3VycmVudFBhdGgpKTtcbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIGJyZWFrO1xuICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgfVxuICB0cnkge1xuICAgIGN1cnJlbnRQYXRoID0gZnMucmVhbHBhdGhTeW5jKGN1cnJlbnRQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gS2VlcCB0aGUgb3JpZ2luYWwgcGF0aCB3aGVuIGl0IGNhbm5vdCBiZSByZXNvbHZlZCAoZS5nLiByZW1vdmVkIGNvbmN1cnJlbnRseSkuXG4gIH1cbiAgcmV0dXJuIHBhdGguam9pbihjdXJyZW50UGF0aCwgLi4uc3VmZml4ZXMpO1xufVxuXG5mdW5jdGlvbiBjb250YWluc1BhdGgocGFyZW50UGF0aDogc3RyaW5nLCBjaGlsZFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhcmVudFBhdGgsIGNoaWxkUGF0aCk7XG4gIGlmIChyZWxhdGl2ZVBhdGggPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIC8vIE9ubHkgYW4gYWN0dWFsIGAuLmAgc2VnbWVudCBtZWFucyBcIm91dHNpZGVcIjsgYSBjaGlsZCBuYW1lIGxpa2UgYC4uZm9vYCBhbHNvIHN0YXJ0cyB3aXRoIGAuLmAuXG4gIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKGAuLiR7cGF0aC5zZXB9YCk7XG59XG5cbi8vIE1pcnJvcnMgdGhlIGJ1bmRsZXIncyBgcmVzb2x2ZS5leHRlbnNpb25zYCAvIGBleHRlbnNpb25BbGlhc2AgY29uZmlndXJhdGlvbiBhYm92ZS5cbmZ1bmN0aW9uIGlzQnVuZGxlclJlc29sdmFibGVQYXRoKGxpdGVyYWxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGxpdGVyYWxQYXRoKTtcbiAgY29uc3QgYWxpYXNlZEV4dGVuc2lvbnMgPSB7ICcuY2pzJzogWycuY3RzJ10sICcuanMnOiBbJy50cycsICcudHN4J10sICcubWpzJzogWycubXRzJ10gfVtleHRlbnNpb25dID8/IFtdO1xuICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgIC4uLlsnLmN0cycsICcubXRzJywgJy50cycsICcudHN4JywgJy5janMnLCAnLm1qcycsICcuanMnLCAnLmpzeCcsICcuanNvbiddLm1hcCgoZXh0KSA9PiBsaXRlcmFsUGF0aCArIGV4dCksXG4gICAgLi4uYWxpYXNlZEV4dGVuc2lvbnMubWFwKChleHQpID0+IGxpdGVyYWxQYXRoLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKSArIGV4dCksXG4gIF07XG4gIHJldHVybiBjYW5kaWRhdGVzLnNvbWUoKGNhbmRpZGF0ZSkgPT4gZnMuc3RhdFN5bmMoY2FuZGlkYXRlLCB7IHRocm93SWZOb0VudHJ5OiBmYWxzZSB9KT8uaXNGaWxlKCkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbnNJbnB1dEVudHJpZXMoaW5wdXRzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAvLyBBIG51bGwgcHJvdG90eXBlIGF2b2lkcyBmYWxzZSBjb25mbGljdHMgd2l0aCBpbmhlcml0ZWQgbWVtYmVycyAoZS5nLiBhbiBlbnRyeSBuYW1lZCBcInRvU3RyaW5nXCIpLlxuICBjb25zdCBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGlucHV0XSBvZiBpbnB1dHMuZW50cmllcygpKSB7XG4gICAgY29uc3QgbmFtZSA9IGluZGV4ID09PSAwID8gJ2luZGV4JyA6IHBhdGguYmFzZW5hbWUoaW5wdXQsIHBhdGguZXh0bmFtZShpbnB1dCkpO1xuICAgIGlmIChlbnRyaWVzW25hbWVdKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRW50cnkgbmFtZXMgY29uZmxpY3QgaW4gdGhlIGZ1bmN0aW9ucyBidWlsZDogXCIke25hbWV9XCIgKCR7ZW50cmllc1tuYW1lXX0gdnMgJHtpbnB1dH0pLiBMaXN0IC0taW5wdXQgZmlsZXMgZXhwbGljaXRseSB3aXRoIHVuaXF1ZSBiYXNlIG5hbWVzLCBrZWVwaW5nIHRoZSBtYWluIGVudHJ5IGZpcnN0LmBcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGVudHJpZXNbbmFtZV0gPSBpbnB1dDtcbiAgfVxuICByZXR1cm4gZW50cmllcztcbn1cblxuZnVuY3Rpb24gZ2V0SW5wdXRGaWxlcyhpbnB1dDogUm9sbGRvd25PcHRpb25zWydpbnB1dCddKTogc3RyaW5nW10ge1xuICBpZiAoIWlucHV0KSByZXR1cm4gW107XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSByZXR1cm4gW2lucHV0XTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBPYmplY3QudmFsdWVzKGlucHV0KTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5SW5wdXQoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sIGN3ZDogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5pbnB1dCAmJiBhcmd2LmlucHV0Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBpbnB1dHMgPSBhcmd2LmlucHV0LmZsYXRNYXAoKHApID0+IHtcbiAgICAgIGNvbnN0IHJhdyA9IHAudG9TdHJpbmcoKTtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIGZpbGUgYWx3YXlzIHdpbnMgb3ZlciBnbG9iIGludGVycHJldGF0aW9uIChlLmcuIFwic3JjL2VudHJ5WzFdLnRzXCIpLCBidXQgYVxuICAgICAgLy8gZGlyZWN0b3J5IG11c3Qgbm90LCBzbyB0aGF0IGEgZGlyZWN0b3J5IGxpdGVyYWxseSBuYW1lZCBsaWtlIGEgcGF0dGVybiBzdGlsbCBleHBhbmRzLlxuICAgICAgY29uc3QgbGl0ZXJhbFBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCByYXcpO1xuICAgICAgY29uc3QgbGl0ZXJhbFN0YXRzID0gZnMuc3RhdFN5bmMobGl0ZXJhbFBhdGgsIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pO1xuICAgICAgaWYgKGxpdGVyYWxTdGF0cz8uaXNGaWxlKCkpIHJldHVybiBbbGl0ZXJhbFBhdGhdO1xuXG4gICAgICAvLyBgZnMuZ2xvYlN5bmNgIHJlcXVpcmVzIFwiL1wiIGFzIHRoZSBzZXBhcmF0b3IgZXZlbiBvbiBXaW5kb3dzIChhIG5vLW9wIG9uIFBPU0lYKS5cbiAgICAgIGNvbnN0IHBhdHRlcm4gPSByYXcuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKTtcbiAgICAgIC8vIEFtYmllbnQgZGVjbGFyYXRpb24gZmlsZXMgYWx3YXlzIHBhcnRpY2lwYXRlIGluIHR5cGUgY2hlY2tpbmcsIHNvIHRoZXkgbXVzdCBub3QgYmVjb21lIGVudHJpZXMuXG4gICAgICAvLyBgdGhyb3dJZk5vRW50cnk6IGZhbHNlYCBza2lwcyBicm9rZW4gc3ltbGlua3MgaW5zdGVhZCBvZiBjcmFzaGluZy5cbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBmc1xuICAgICAgICAuZ2xvYlN5bmMocGF0dGVybiwgeyBjd2QgfSlcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobSkgPT4gIS9cXC5kXFwuW2NtXT90cyQvLnRlc3QobSkgJiYgZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGN3ZCwgbSksIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pPy5pc0ZpbGUoKVxuICAgICAgICApXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLm1hcCgobSkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgbSkpO1xuICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkgcmV0dXJuIG1hdGNoZXM7XG4gICAgICAvLyBPbmNlIG5vIGZpbGUgbWF0Y2hlZCwgYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGlzIGxlZnQgdG8gdGhlIGJ1bmRsZXIsIHdoaWNoIHJlc29sdmVzIGl0XG4gICAgICAvLyB0aHJvdWdoIGl0cyBcImluZGV4XCIgZmlsZSBvciBpdHMgcGFja2FnZS5qc29uIGVudHJ5IGZpZWxkcy5cbiAgICAgIGlmIChsaXRlcmFsU3RhdHM/LmlzRGlyZWN0b3J5KCkpIHJldHVybiBbbGl0ZXJhbFBhdGhdO1xuICAgICAgLy8gQSBub24tZXhpc3RpbmcgcGF0aCBtYXkgc3RpbGwgYmUgcmVzb2x2YWJsZSBieSB0aGUgYnVuZGxlciAoZS5nLiBhbiBleHRlbnNpb24tbGVzcyBwYXRoIG9yIGFcbiAgICAgIC8vIFwiLmpzXCIgc3BlY2lmaWVyIGFsaWFzZWQgdG8gXCIudHNcIiksIGV2ZW4gd2hlbiBpdCBjb250YWlucyBnbG9iIG1ldGFjaGFyYWN0ZXJzLlxuICAgICAgaWYgKGlzQnVuZGxlclJlc29sdmFibGVQYXRoKGxpdGVyYWxQYXRoKSkgcmV0dXJuIFtsaXRlcmFsUGF0aF07XG4gICAgICAvLyBFcnJvciBvbmx5IG9uIGFjdHVhbCBnbG9iIHN5bnRheCAoXCIqXCIsIFwiP1wiLCBcIlsuLi5dXCIsIGFsdGVybmF0aW9uL3JhbmdlIGJyYWNlcywgb3IgZXh0Z2xvYiBcIkAoLi4uKVwiIGV0Yy4pO1xuICAgICAgLy8gY2hhcmFjdGVycyBsaWtlIGEgYmFyZSBcIitcIiBvciBhIHNpbmdsZS1pdGVtIGJyYWNlIChcIntlbnRyeX1cIikgYXJlIG9yZGluYXJ5IGZpbGVuYW1lIGNoYXJhY3RlcnMuXG4gICAgICBpZiAoL1sqP118W0AhK11cXCh8XFxbLipcXF18XFx7W159XSooLHxcXC5cXC4pW159XSpcXH0vLnRlc3QocmF3KSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBObyBmaWxlcyBtYXRjaGVkIHRoZSBpbnB1dCBwYXR0ZXJuOiAke3Jhd31gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtsaXRlcmFsUGF0aF07XG4gICAgfSk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KGlucHV0cyldO1xuICB9XG5cbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICBmb3IgKGNvbnN0IGV4dCBvZiBbJ3RzJywgJ3RzeCcsICdjdHMnLCAnbXRzJ10pIHtcbiAgICBjb25zdCBpbnB1dCA9IHBhdGguam9pbihzcmNEaXJQYXRoLCBgaW5kZXguJHtleHR9YCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5wdXQpKSByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3QgaW5wdXQgZmlsZS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnk6IHN0cmluZywgaW5wdXRzOiBzdHJpbmdbXSwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFRhcmdldERldGFpbCB7XG4gIHN3aXRjaCAodGFyZ2V0Q2F0ZWdvcnkpIHtcbiAgICBjYXNlICdhcHAnOiB7XG4gICAgICByZXR1cm4gJ2FwcC1ub2RlJztcbiAgICB9XG4gICAgY2FzZSAnZnVuY3Rpb25zJzoge1xuICAgICAgcmV0dXJuICdmdW5jdGlvbnMnO1xuICAgIH1cbiAgICBjYXNlICdsaWInOiB7XG4gICAgICBpZiAoaW5wdXRzLnNvbWUoKGlucHV0KSA9PiBpbnB1dC5lbmRzV2l0aCgnLnRzeCcpKSB8fCBkb2VzU3JjQ29udGFpblRzeChwYWNrYWdlRGlyUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuICdsaWItcmVhY3QnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdsaWInO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0YXJnZXQgb3B0aW9uIG11c3QgYmUgb25lIG9mOiAnICsgYWxsVGFyZ2V0Q2F0ZWdvcmllcy5qb2luKCcsICcpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZG9lc1NyY0NvbnRhaW5Uc3gocGFja2FnZURpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzcmNEaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyk7XG4gIHJldHVybiBkb2VzRGlyZWN0b3J5Q29udGFpblRzeChzcmNEaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgZW50cnlQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHJldHVybiBkb2VzRGlyZWN0b3J5Q29udGFpblRzeChlbnRyeVBhdGgpO1xuICAgICAgcmV0dXJuIGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy50c3gnKTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMoXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBwYWNrYWdlSnNvbi5uYW1lICs9ICctZGlzdCc7XG4gIGNvbnN0IGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoZXNtUGFja2FnZSwgbW9kdWxlVHlwZSk7XG4gIHBhY2thZ2VKc29uLm1haW4gPSBlc21QYWNrYWdlID09PSBlc21PdXRwdXQgPyAnaW5kZXguanMnIDogZXNtT3V0cHV0ID8gJ2luZGV4Lm1qcycgOiAnaW5kZXguY2pzJztcblxuICAvLyBQcmV2ZW50IEZpcmViYXNlIEZ1bmN0aW9ucyBmcm9tIHJ1bm5pbmcgYGJ1aWxkYCBzY3JpcHQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIC8vIGRldkRlcGVuZGVuY2llcyBhcmUgbm90IHJlcXVpcmVkIHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIob3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ob3V0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbikpO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXRPcHRpb25zTGlzdChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbixcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZ1xuKTogT3V0cHV0T3B0aW9uc1tdIHtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlLCBhcmd2Lm1vZHVsZVR5cGUpO1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgICAgZm9ybWF0OiBlc21PdXRwdXQgPyAnbW9kdWxlJyA6ICdjb21tb25qcycsXG4gICAgICAgIG1pbmlmeTogYXJndi5taW5pZnksXG4gICAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAgJiYgJ2lubGluZScsXG4gICAgICAgIHN0cmljdDogIWVzbU91dHB1dCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wb3J0IHN0YXRlbWVudCBpbiBhbiBlc20gbW9kdWxlIGNhdXNlcyB0aGUgZm9sbG93aW5nIGVycm9yOlxuICAvLyBTdGF0ZW1lbnQ6XG4gIC8vICAgaW1wb3J0IHsgdXNlUHJldmlvdXMgfSBmcm9tICdyZWFjdC11c2UnO1xuICAvLyBFcnJvcjpcbiAgLy8gICBOYW1lZCBleHBvcnQgJ3VzZVByZXZpb3VzJyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICdyZWFjdC11c2UnIGlzIGEgQ29tbW9uSlMgbW9kdWxlLFxuICAvLyAgIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbiAgLy8gV2UgbmVlZCBjanMgbW9kdWxlcyBmb3Igd2ViIGFwcHMgdG8gYXZvaWQgdGhlIGVycm9yLlxuICAvLyBBbHNvLCBzcGxpdHRpbmcgYSBsaWJyYXJ5IGlzIHVzZWZ1bCBpbiBib3RoIG1vZHVsZXMsIHNvIHByZXNlcnZlTW9kdWxlcyBzaG91bGQgYmUgdHJ1ZS5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSA9IFtdO1xuICBjb25zdCBtb2R1bGVUeXBlID0gYXJndi5tb2R1bGVUeXBlIHx8ICdib3RoJztcbiAgY29uc3QganNFeHQgPSBhcmd2LmpzRXh0ZW5zaW9uIHx8ICdlaXRoZXInO1xuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2NqcycgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5janMnLFxuICAgICAgZm9ybWF0OiAnY29tbW9uanMnLFxuICAgICAgbWluaWZ5OiBhcmd2Lm1pbmlmeSxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0ubWpzJyxcbiAgICAgIGZvcm1hdDogJ21vZHVsZScsXG4gICAgICBtaW5pZnk6IGFyZ3YubWluaWZ5LFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgcHJlc2VydmVNb2R1bGVzUm9vdDogcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyksXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvdXRwdXRPcHRpb25zTGlzdDtcbn1cblxuZnVuY3Rpb24gaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlOiBib29sZWFuLCBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1vZHVsZVR5cGUgPT09ICdlc20nIHx8ICgoIW1vZHVsZVR5cGUgfHwgbW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicpICYmIGlzRXNtUGFja2FnZSk7XG59XG4iLCJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vZW52LmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcnVuOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3J1biA8ZmlsZT4nLFxuICBkZXNjcmliZTogJ1J1biBzY3JpcHQnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcHJvY2Vzcy5jd2QoKSk7XG5cbiAgICBjb25zdCBmaWxlID0gYXJndi5maWxlPy50b1N0cmluZygpID8/ICcnO1xuXG4gICAgLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgICBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MudmVyc2lvbnMuYnVuO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ25vZGUnO1xuICAgIGNvbnN0IGFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/IFsnLS1idW4nXSA6IFsnLS1uby13YXJuaW5ncycsICctLWltcG9ydCcsICd0c3gnXTtcbiAgICBpZiAoYXJndi53YXRjaCkge1xuICAgICAgYXJncy5wdXNoKCctLXdhdGNoJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChmaWxlKTtcbiAgICBjb25zdCBbLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzXSA9IGFyZ3YuXztcbiAgICBjb25zdCBydW50aW1lQXJncyA9IFsuLi5hcmdzLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzLm1hcCgoYXJnKSA9PiBhcmcudG9TdHJpbmcoKSldO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyAnJHtydW50aW1lfSAke3J1bnRpbWVBcmdzLmpvaW4oJyAnKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHJ1bnRpbWUsIHJ1bnRpbWVBcmdzLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52IH0sXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMgPz8gMSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBhcHAsIGZ1bmN0aW9ucywgbGliIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZC9idWlsZC5qcyc7XG5pbXBvcnQgeyBydW4gfSBmcm9tICcuL2NvbW1hbmRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRUc1Jvb3RQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbnJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ2J1aWxkLXRzJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5jb21tYW5kKGFwcClcbiAgLmNvbW1hbmQoZnVuY3Rpb25zKVxuICAuY29tbWFuZChsaWIpXG4gIC5jb21tYW5kKHJ1bilcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG4iXSwibWFwcGluZ3MiOiI2bUJBTUEsSUFBSSxFQUtKLFNBQWdCLEVBQ2QsRUFDQSxFQUNvQyxDQU9wQyxPQU5LLElBQ0gsRUFBVSxFQUFpQyxFQUFNLENBQUcsRUFDaEQsRUFBSyxTQUNQLFFBQVEsS0FBSyxtQkFBb0IsT0FBTyxLQUFLLENBQU8sQ0FBQyxHQUdsRCxDQUNULENBS0EsU0FBZ0IsRUFDZCxFQUNBLEVBQ3dCLENBQ3hCLElBQU0sRUFBcUMsQ0FBQyxFQUN0QyxFQUFjLElBQUksSUFBSSxDQUMxQixJQUFJLEVBQUssUUFBVSxDQUFDLEVBQUEsQ0FBRyxRQUFTLEdBQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM3RCxHQUFJLEVBQUssV0FBYSxPQUFPLEtB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
1
+ import e from"node:fs";import t from"node:path";import{readAndApplyEnvironmentVariables as n,removeNpmAndYarnEnvironmentVariables as r,yargsOptionsBuilderForEnv as i}from"@willbooster/shared-lib-node";import a from"yargs";import{hideBin as o}from"yargs/helpers";import{styleText as s}from"node:util";import{rolldown as c,watch as l}from"rolldown";import{onExit as u}from"signal-exit";import d from"node:url";import f from"node:process";import{builtinModules as p,createRequire as m}from"node:module";import{parseSync as h,visitorKeys as g}from"oxc-parser";import _ from"magic-string";import*as v from"node:child_process";let y;function b(e,t){return y||(y=n(e,t),e.verbose&&console.info(`Loaded env vars:`,Object.keys(y))),y}function x(e,t){let n={},r=new Set([...(e.inline??[]).flatMap(e=>e.toString().split(`,`)),...e.autoInline?Object.keys(b(e,t)):[]]);for(let e of r)process.env[e]!==void 0&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info(`Inline env vars:`,Object.keys(n)),n}const S=[`app`,`functions`,`lib`];async function C(n){let r=t.join(n,`package.json`);try{let t=await e.promises.readFile(r,`utf8`);return[JSON.parse(t),r]}catch{}return[void 0,r]}function w(){return t.dirname(t.dirname(d.fileURLToPath(import.meta.url)))}function ee(e){return/^@([^/]+)\//.exec(e.name??``)?.[1]}function te(e){return`${e.getFullYear()}-${T(e.getMonth()+1)}-${T(e.getDate())} ${T(e.getHours())}:${T(e.getMinutes())}:${T(e.getSeconds())}`}function T(e){return String(e).padStart(2,`0`)}function E(e){if(e<1e3)return`${Math.round(e)}ms`;let t=e/1e3;if(t<60)return`${Number(t.toFixed(1))}s`;let n=Math.floor(t/60);return`${n}m ${Number((t-n*60).toFixed(1))}s`}const D={...i,silent:{description:`Whether to suppress non-error output or not`,type:`boolean`,alias:`s`}},O={...D,input:{description:`Paths or glob patterns (e.g. "src/**/*.ts") of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx,cts,mts}" from package directory is targeted.`,type:`array`,alias:`i`},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`},outDir:{description:`Output directory. Defaults to "dist" in the package directory.`,type:`string`,alias:`o`},inline:{description:`Environment variables to be inlined.`,type:`array`},"auto-inline":{description:`Inline environment variables defined at env files.`,type:`boolean`,default:!1},watch:{description:`Whether watch mode is enabled or not`,type:`boolean`,alias:`w`}},k={...O,moduleType:{description:`esm, cjs, or either (default).`,type:`string`,alias:`m`}},ne={...k,onlyPackageJson:{description:`Whether to generate only package.json.`,type:`boolean`}},re={...O,moduleType:{description:`esm, cjs, either, or both (default).`,type:`string`,alias:`m`},declarationOnly:{description:`Emit only declaration (.d.ts) files without bundling JavaScript.`,type:`boolean`,default:!1}};function ie(e,t=!1){let n=e.name||e.cause?.name,r=n?`${n}: `:``,i=[s([`bold`,`red`],`[!] ${`${e.plugin?`(plugin ${e.plugin}) `:``}${r}${e.message}`}`)];e.url&&i.push(s(`cyan`,e.url)),e.loc?i.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&i.push(e.id),e.frame&&i.push(s(`dim`,e.frame)),e.stack&&i.push(s(`dim`,e.stack.replace(`${r}${e.message}\n`,``))),i.push(``,``),console.error(i.join(`
2
+ `)),t||f.exit(1)}const ae=new Set(p);function oe(e,t,n,r,i){let a=new Set(ce(e,t,n,i,r));return e=>le(e)||se(e,a)}function se(e,t){if(t.has(e))return!0;for(let n=e.indexOf(`/`);n!==-1;n=e.indexOf(`/`,n+1))if(t.has(e.slice(0,n)))return!0;return!1}function ce(n,r,i,a,o){let s=[...n.external??[]].map(e=>e.toString());i.dependencies?.[`@prisma/client`]&&s.push(`prisma-client`),s.push(...Object.keys(i.dependencies??{}),...Object.keys(i.peerDependencies??{}),...Object.keys(i.optionalDependencies??{}));let c=t.dirname(a);if(e.existsSync(t.join(t.dirname(c),`package.json`))){let n=e.readdirSync(c,{withFileTypes:!0});for(let r of n){if(!r.isDirectory())continue;let n=t.join(c,r.name,`package.json`);if(!e.existsSync(n))continue;let a=JSON.parse(e.readFileSync(n,`utf8`));i.dependencies?.[a.name??``]&&s.push(...Object.keys(a.dependencies??{}),...Object.keys(a.peerDependencies??{}),...Object.keys(a.optionalDependencies??{}))}}let l=(r===`app-node`||r===`functions`)&&o?`@${o}/`:void 0;return l?s.filter(e=>!e.startsWith(l)):s}function le(e){return e.startsWith(`node:`)||ae.has(e)}const ue=[`.cjs`,`.mjs`,`.js`,`.jsx`,`.cts`,`.mts`,`.ts`,`.tsx`];function A(e){return ue.some(t=>e.endsWith(t))&&!e.startsWith(`\0`)&&!de(e)}function de(e){return e.includes(`/node_modules/`)||e.includes(`\\node_modules\\`)}function j(e,t){let n=fe(e),r=pe(e),i=h(e,t,{lang:n,sourceType:r});if(!M(i))return i;if(e.endsWith(`.js`)&&r===`unambiguous`){let r=h(e,t,{lang:n,sourceType:`commonjs`});if(!M(r))return r}}function M(e){return e.errors.some(e=>e.severity===`Error`)}function fe(e){return e.endsWith(`.tsx`)?`tsx`:e.endsWith(`.ts`)||e.endsWith(`.cts`)||e.endsWith(`.mts`)?`ts`:e.endsWith(`.jsx`)?`jsx`:`js`}function pe(e){return e.endsWith(`.cjs`)||e.endsWith(`.cts`)?`commonjs`:`unambiguous`}function N(e){return(g[e.type]??[]).flatMap(t=>{let n=e[t];return Array.isArray(n)?n:[n]}).filter(e=>I(e))}function P(e,t){let n=e[t];return I(n)?n:void 0}function F(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>I(e)):[]}function I(e){return!!e&&typeof e==`object`&&typeof e.type==`string`}function me(e,t=`file.ts`){if(!e.includes(`@`))return!1;let n=j(t,e);return!n||I(n.program)&&he(n.program)}function he(e){return e.type===`Decorator`||N(e).some(e=>he(e))}function ge(){let{env:e}=process;if(e.NODE_ENV===`production`)return new Set([`error`,`info`,`warn`]);if(e.NODE_ENV===`test`)return new Set([`debug`,`error`,`info`,`warn`])}function _e(e){return{name:`remove-console`,transform(t,n){if(A(n)&&/console|\\u/.test(t))return ve(t,n,e)}}}function ve(e,t,n){let r=j(t,e);if(!r||!I(r.program))return;let i=new _(e),a=[];xe(r.program,[],[],a,n);for(let e of Ne(a))i.overwrite(e.start,e.end,e.value);if(i.hasChanged())return{code:i.toString(),map:i.generateMap({hires:!0})}}const ye=`(function () {})`,be=`(void 0)`;function xe(e,t,n,r,i){let a=Se(e,t.at(-1));a&&n.push(a),!U(n,e)&&e.type===`CallExpression`&&De(e,t,r,i),!U(n,e)&&e.type===`MemberExpression`&&Oe(e,t,r,i);let o=[...t,e];for(let t of N(e))xe(t,o,n,r,i);a&&n.pop()}function Se(e,t){if(e.type===`Program`)return{end:e.end,shadowsConsole:Ce(e),start:e.start};if(H(e))return{end:e.end,shadowsConsole:we(e),start:e.start};if(e.type===`BlockStatement`){let n=t?H(t):!1;return{end:e.end,shadowsConsole:L(e,!1)||n&&R(e),start:e.start}}if(e.type===`CatchClause`)return{end:e.end,shadowsConsole:V(e.param),start:e.start};if(e.type===`StaticBlock`||e.type===`TSModuleBlock`)return{end:e.end,shadowsConsole:L(e,!1)||R(e),start:e.start};if(e.type===`ForStatement`||e.type===`ForInStatement`||e.type===`ForOfStatement`)return{end:e.end,shadowsConsole:Te(e),start:e.start}}function Ce(e){for(let t of F(e,`body`))if(z(t,!0))return!0;return R(e)}function we(e){if(V(e.id))return!0;for(let t of F(e,`params`))if(V(t))return!0;return!1}function L(e,t){for(let n of F(e,`body`))if(z(n,t))return!0;return!1}function Te(e){let t=P(e,e.type===`ForStatement`?`init`:`left`);return!!t&&t.type===`VariableDeclaration`&&t.kind!==`var`&&B(t)}function R(e){if(!e)return!1;for(let t of N(e))if(!(t!==e&&(H(t)||t.type===`StaticBlock`||t.type===`TSModuleBlock`))&&(t.type===`VariableDeclaration`&&t.kind===`var`&&B(t)||R(t)))return!0;return!1}function Ee(e){return e.importKind!==`type`&&F(e,`specifiers`).some(e=>e.importKind!==`type`&&V(e.local))}function z(e,t){let n=Pe(e)??e;return n.declare===!0?!1:n.type===`ImportDeclaration`?Ee(n):n.type===`FunctionDeclaration`||n.type===`ClassDeclaration`?V(n.id):n.type===`VariableDeclaration`&&(t||n.kind!==`var`)&&B(n)}function B(e){return F(e,`declarations`).some(e=>V(P(e,`id`)))}function V(e){return I(e)?e.type===`Identifier`&&e.name===`console`?!0:e.type===`AssignmentPattern`||e.type===`RestElement`?V(e.left??e.argument):e.type===`TSParameterProperty`?V(e.parameter):e.type===`ArrayPattern`?F(e,`elements`).some(e=>V(e)):e.type===`ObjectPattern`&&F(e,`properties`).some(e=>V(e.value??e.argument)):!1}function H(e){return e.type===`FunctionDeclaration`||e.type===`FunctionExpression`||e.type===`ArrowFunctionExpression`}function U(e,t){return e.some(e=>e.shadowsConsole&&e.start<=t.start&&t.end<=e.end)}function De(e,t,n,r){let i=t.at(-1),a=P(e,`callee`);if(e.optional!==!0){if(!a||!K(a,r)){a&&Me(a,r)&&n.push({start:e.start,end:e.end,value:W(e,t)});return}i?.type===`ExpressionStatement`?n.push({start:i.start,end:i.end,value:`;`}):n.push({start:e.start,end:e.end,value:ke(e,t)})}}function Oe(e,t,n,r){let i=t.at(-1),a=t.at(-2);if(!(!K(e,r)||i?.type===`MemberExpression`)&&!(i?.type===`CallExpression`&&i.callee===e&&i.optional!==!0)&&!je(e,i,a)){if(i?.type===`AssignmentExpression`&&i.left===e){let e=P(i,`right`);e&&n.push({start:e.start,end:e.end,value:W(e,t)});return}n.push({start:e.start,end:e.end,value:W(e,t)})}}function ke(e,t){return G(e,t)?`;${be}`:be}function W(e,t){return G(e,t)?`;${ye}`:ye}function G(e,t){let n=t.findLastIndex(e=>e.type===`ExpressionStatement`);if(n<0)return!1;let r=t[n];if(!r)return!1;let i=t[n-1];return r.start===e.start&&Ae(i)}function Ae(e){return e?.type===`Program`||e?.type===`BlockStatement`||e?.type===`StaticBlock`||e?.type===`SwitchCase`||e?.type===`TSModuleBlock`}function je(e,t,n){return t?.type===`UpdateExpression`&&t.argument===e||(t?.type===`ForInStatement`||t?.type===`ForOfStatement`)&&t.left===e||t?.type===`ArrayPattern`||t?.type===`AssignmentPattern`&&t.left===e||t?.type===`Property`&&t.value===e&&n?.type===`ObjectPattern`}function K(e,t){if(e.type!==`MemberExpression`)return!1;let n=P(e,`object`),r=P(e,`property`);return e.optional===!0||!n||!r||q(e,r,t)?!1:J(n)?!0:n.type===`MemberExpression`&&J(P(n,`object`))&&e.computed!==!0&&r.type===`Identifier`&&(r.name===`call`||r.name===`apply`)}function Me(e,t){if(e.type!==`MemberExpression`)return!1;let n=P(e,`object`),r=P(e,`property`);if(!n||!r||n.type!==`MemberExpression`||e.computed===!0||r.type!==`Identifier`||r.name!==`bind`||!J(P(n,`object`)))return!1;let i=P(n,`property`);return!!i&&!q(n,i,t)}function q(e,t,n){return e.computed!==!0&&t.type===`Identifier`&&n.has(t.name)}function J(e){return e?.type===`Identifier`&&e.name===`console`}function Ne(e){let t=[];for(let n of e.toSorted((e,t)=>e.start-t.start||t.end-e.end))t.some(e=>e.start<=n.start&&n.end<=e.end)||t.push(n);return t.toSorted((e,t)=>t.start-e.start)}function Pe(e){if(!(e.type!==`ExportNamedDeclaration`&&e.type!==`ExportDefaultDeclaration`))return P(e,`declaration`)}function Fe(){let e=[],t=ge();return t&&e.push(_e(t)),e.push(Ie(),Le()),e}function Ie(){let e=t.join(w(),`babel.config.mjs`);return{name:`babel-decorators`,async transform(t,n){if(!A(n)||!me(t))return;let{transformAsync:r}=await import(`@babel/core`),i=await r(t,{caller:{name:`build-ts`,supportsDynamicImport:!0,supportsExportNamespaceFrom:!0,supportsStaticESM:!0},configFile:e,filename:n,sourceMaps:!0});if(i?.code)return{code:i.code,map:i.map}}}}function Le(){return{name:`text`,async load(t){if(!t.endsWith(`.csv`)&&!t.endsWith(`.txt`))return;let n=await e.promises.readFile(t,`utf8`);return{code:`export default ${JSON.stringify(n)};`,moduleType:`js`}}}}const Re=m(import.meta.url);async function Y(n,r,i,a){let o=X(r);if(!o)throw Error(`Failed to find tsconfig.json in ${r}.`);n.verbose&&console.info(`Found tsconfig.json:`,o);let s=[],c=t.join(i,t.basename(r),`src`);if(e.existsSync(c)){a=void 0;let n=t.dirname(r),o=await e.promises.readdir(n,{withFileTypes:!0});r=t.resolve(r);for(let a of o){if(!a.isDirectory())continue;let o=t.resolve(n,a.name);if(o===r)continue;let c=X(o),l=t.join(i,a.name,`src`);c&&e.existsSync(l)&&s.push([o,c,l,void 0])}}else c=i;s.push([r,o,c,a]);let l=!0;for(let[e,t,r,i]of s)l&&=await ze(n,e,t,r,i);return l}async function ze(n,r,i,a,o){n.verbose&&console.info(`runTsgo()`,r,i,a,o);let s=t.join(r,`.build-ts-tsgo.${process.pid}.json`);try{await e.promises.writeFile(s,JSON.stringify(await Be(r,i,a,o),void 0,2));let t=v.spawnSync(process.execPath,[Ve(),`-p`,s],{cwd:r,stdio:`inherit`});if(t.error)throw t.error;return t.status===0}finally{await e.promises.rm(s,{force:!0})}}async function Be(e,n,r,i){let a={composite:!1,declaration:!0,declarationDir:r,emitDeclarationOnly:!0,incremental:!1,noEmit:!1,noEmitOnError:!0,outDir:r,rootDir:`src`};if(await He(t.join(e,`src`))){let t=Ue(e),n=t?await We(t):[];n.includes(`node`)&&(a.types=n)}return{compilerOptions:a,extends:Ge(e,n),...i?.length?{exclude:[],files:i.map(n=>t.resolve(e,n).replaceAll(t.sep,`/`)),include:[`src/**/*.d.ts`,`src/**/*.d.mts`,`src/**/*.d.cts`]}:{include:[`src/**/*`]}}}function X(n){let r=t.resolve(n);for(;;){let n=t.join(r,`tsconfig.json`);if(e.existsSync(n))return n;let i=t.dirname(r);if(i===r)return;r=i}}function Ve(){let e=Re.resolve(`typescript/package.json`);return t.join(t.dirname(e),`lib`,`tsc.js`)}async function He(n){try{let r=await e.promises.readdir(n,{withFileTypes:!0});for(let i of r){let r=t.join(n,i.name);if(i.isDirectory()){if(await He(r))return!0}else if(/\.[cm]?tsx?$/.test(i.name)&&(await e.promises.readFile(r,`utf8`)).includes(`node:`))return!0}}catch{return!1}return!1}function Ue(n){let r=t.resolve(n);for(;;){let n=t.join(r,`node_modules`,`@types`);if(e.existsSync(n))return n;let i=t.dirname(r);if(i===r)return;r=i}}async function We(t){try{return(await e.promises.readdir(t,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}function Ge(e,n){let r=t.relative(e,n).replaceAll(t.sep,`/`);return r.startsWith(`.`)?r:`./${r}`}const Ke={extensionAlias:{".cjs":[`.cjs`,`.cts`],".js":[`.js`,`.ts`,`.tsx`],".jsx":[`.jsx`,`.ts`,`.tsx`],".mjs":[`.mjs`,`.mts`]},extensions:[`.cts`,`.mts`,`.ts`,`.tsx`,`.cjs`,`.mjs`,`.js`,`.jsx`,`.json`]},qe={command:`app [package]`,describe:`Build an app`,builder:k,async handler(e){return Z(e,`app`)}},Je={command:`functions [package]`,describe:`Build a GCP/Firebase functions app`,builder:ne,async handler(e){if(e.onlyPackageJson){let n=t.resolve(e.package?.toString()??`.`),[r,i]=await C(n);r||(console.error(`Failed to parse package.json (${i}).`),process.exit(1)),await ot(Qe(e,process.cwd(),n,void 0,`functions`),r,e.moduleType)}else return Z(e,`functions`)}},Ye={command:`lib [package]`,describe:`Build a Node.js / React library`,builder:re,async handler(e){return Z(e,`lib`)}};async function Z(n,r){process.env.NODE_ENV||=`production`;let i=!n.silent&&n.verbose,a=process.cwd(),o=t.resolve(n.package?.toString()??`.`),[l,u]=await C(o);l||(console.error(`Failed to parse package.json (${u}).`),process.exit(1)),b(n,o);let d=tt(n,a,o),f=rt(r,d,o),p=Qe(n,a,o,d,r);i&&(console.info(`argv:`,n),console.info(`packageJsonPath:`,u),console.info(`Target (Category):`,`${f} (${r})`));let m=ee(l),h=l.type===`module`;i&&(process.env.BUILD_TS_VERBOSE=`1`),process.env.BUILD_TS_TARGET_CATEGORY=r,process.env.BUILD_TS_TARGET_DETAIL=f;let g=`declarationOnly`in n&&n.declarationOnly;g&&n.watch&&(console.error(`--declaration-only cannot be used with --watch.`),process.exit(1));let _=st(n,f,p,h,o);i&&console.info(`OutputOptions:`,_),_.length===0&&(console.error(`Failed to detect output files.`),process.exit(1));let v=n.input?.length?d:void 0;if(process.chdir(o),await e.promises.rm(p,{recursive:!0,force:!0}),f===`functions`&&await ot(p,l,n.moduleType),g){n.silent||console.info(s(`cyan`,`Generates declaration files → ${s(`bold`,t.relative(o,p))}\non ${o} ...`)),await Y(n,o,p,v)||process.exit(1);return}let y={checks:{preferBuiltinFeature:!1},external:oe(n,f,l,m,o),input:f===`functions`?$e(d):d,plugins:Fe(),resolve:Ke,transform:Xe(n,o),watch:n.watch?{clearScreen:!1}:void 0},x=e=>(Array.isArray(e)?e:[e]).map(e=>t.relative(o,e)),S=e=>{let t=x(_.map(e=>e.file||e.dir||``));console.info(s(`cyan`,`Bundles ${s(`bold`,x(e).join(`, `))} → ${s(`bold`,t.join(`, `))}\non ${o} ...`))};if(n.watch)Ze(n,f,o,p,v,y,_,x,S);else{n.silent||S(d);let e,t=!1;try{let t=Date.now(),r=await c(y);e=r,await Promise.all(_.map(e=>r.write(e))),n.silent||console.info(s(`green`,`Created ${x(_.map(e=>e.file||e.dir||``)).join(`, `)} in ${s(`bold`,E(Date.now()-t))}`))}catch(e){t=!0,console.error(`Failed to build due to:`,e)}await e?.close(),t&&process.exit(1),f!==`app-node`&&f!==`functions`&&(await Y(n,o,p,v)||process.exit(1))}}function Xe(e,t){return{define:x(e,t),jsx:`react-jsx`,target:`es2022`}}function Ze(e,t,n,r,i,a,o,c,d){let f=l({...a,output:o}),p=async e=>{process.removeListener(`uncaughtException`,m),process.stdin.removeListener(`end`,h),await f.close(),e&&process.exit(e)},m=e=>{console.error(e),p(1)},h=()=>{p()};u(e=>void p(e)),process.on(`uncaughtException`,m),process.stdin.isTTY||(process.stdin.on(`end`,h),process.stdin.resume()),f.on(`event`,async o=>{try{switch(o.code){case`ERROR`:ie(o.error,!0);break;case`BUNDLE_START`:if(e.silent)break;d(et(a.input));break;case`BUNDLE_END`:e.silent||console.info(s(`green`,`Created ${s(`bold`,c(o.output).join(`, `))} in ${s(`bold`,E(o.duration))}`)),t!==`app-node`&&t!==`functions`&&await Y(e,n,r,i);break;case`END`:if(e.silent)break;console.info(`\n[${te(new Date)}] waiting for changes...`);break}}catch(e){console.error(`Failed to handle watch event due to:`,e)}finally{`result`in o&&o.result&&o.result.close()}})}function Qe(n,r,i,a,o){let s=n.outDir?.toString();s===``&&(console.error(`--out-dir must not be empty.`),process.exit(1));let c=s?t.resolve(r,s):t.join(i,`dist`),l=Q(c),u=a?.find(e=>$(l,Q(e))||$(c,e));if(u&&(console.error(`The output directory (${l}) must not contain the input file (${u}).`),process.exit(1)),!s)return c;let d=Q(i);($(l,d)||$(c,i))&&(console.error(`--out-dir (${l}) must not contain the package directory (${d}).`),process.exit(1));let f=Q(t.join(d,`src`));return($(f,l)||$(t.join(i,`src`),c))&&(console.error(`--out-dir (${l}) must not be inside the source directory (${f}).`),process.exit(1)),o!==`functions`&&e.existsSync(t.join(l,`package.json`))&&(console.error(`--out-dir (${l}) contains a package.json, so it looks like a package directory.`),process.exit(1)),c}function Q(n){let r=[],i=n;for(;!e.existsSync(i);){r.unshift(t.basename(i));let e=t.dirname(i);if(e===i)break;i=e}try{i=e.realpathSync.native(i)}catch{}return t.join(i,...r)}function $(e,n){let r=t.relative(e,n);return r===``||!t.isAbsolute(r)&&r!==`..`&&!r.startsWith(`..${t.sep}`)}function $e(e){let n=new Map;for(let[r,i]of e.entries()){let e=r===0?`index`:t.basename(i,t.extname(i)),a=n.get(e);a&&(console.error(`Entry names conflict in the functions build: "${e}" (${a} vs ${i}). List --input files explicitly with unique base names, keeping the main entry first.`),process.exit(1)),n.set(e,i)}return Object.fromEntries(n)}function et(e){return e?typeof e==`string`?[e]:Array.isArray(e)?e:Object.values(e):[]}function tt(n,r,i){if(n.input&&n.input.length>0){let i=n.input.flatMap(n=>{let i=n.toString();if(!nt(i))return[t.resolve(r,i)];let a=e.globSync(i.split(t.sep).join(`/`),{cwd:r}).filter(n=>!/\.d\.[cm]?ts$/.test(n)&&e.statSync(t.resolve(r,n),{throwIfNoEntry:!1})?.isFile()).sort().map(e=>t.resolve(r,e));return a.length===0&&(console.error(`No files matched the input pattern: ${i}`),process.exit(1)),a});return[...new Set(i)]}let a=t.join(i,`src`);for(let n of[`ts`,`tsx`,`cts`,`mts`]){let r=t.join(a,`index.${n}`);if(e.existsSync(r))return[r]}console.error(`Failed to detect input file.`),process.exit(1)}function nt(e){return/[*?]|\[[^\]]*\]|\{[^}]*,[^}]*\}/.test(e)}function rt(e,t,n){switch(e){case`app`:return`app-node`;case`functions`:return`functions`;case`lib`:return t.some(e=>e.endsWith(`.tsx`))||it(n)?`lib-react`:`lib`;default:console.error(`target option must be one of: `+S.join(`, `)),process.exit(1)}}function it(e){return at(t.join(e,`src`))}function at(n){try{return e.readdirSync(n,{withFileTypes:!0}).some(e=>{let r=t.join(n,e.name);return e.isDirectory()?at(r):e.isFile()&&e.name.endsWith(`.tsx`)})}catch{return!1}}async function ot(n,r,i){r.name+=`-dist`;let a=r.type===`module`,o=ct(a,i);r.main=a===o?`index.js`:o?`index.mjs`:`index.cjs`,delete r.scripts,delete r.devDependencies,await e.promises.mkdir(n,{recursive:!0}),await e.promises.writeFile(t.join(n,`package.json`),JSON.stringify(r))}function st(e,n,r,i,a){if(n===`app-node`||n===`functions`){let t=ct(i,e.moduleType);return[{dir:r,format:t?`module`:`commonjs`,minify:e.minify,sourcemap:e.sourcemap&&`inline`,strict:!t}]}let o=[],s=e.moduleType||`both`;return(s===`cjs`||s===`both`||s===`either`&&!i)&&o.push({dir:r,entryFileNames:i?`[name].cjs`:`[name].js`,format:`commonjs`,minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(a,`src`),sourcemap:e.sourcemap,strict:!0}),(s===`esm`||s===`both`||s===`either`&&i)&&o.push({dir:r,entryFileNames:i?`[name].js`:`[name].mjs`,format:`module`,minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(a,`src`),sourcemap:e.sourcemap}),o}function ct(e,t){return t===`esm`||(!t||t===`either`)&&e}const lt={command:`run <file>`,describe:`Run script`,builder:{...D,watch:{description:`Whether watch mode is enabled or not`,type:`boolean`,alias:`w`}},handler(e){b(e,process.cwd());let t=e.file?.toString()??``,n=process.versions.bun,r=n?`bun`:`node`,i=n?[`--bun`]:[`--no-warnings`,`--import`,`tsx`];e.watch&&i.push(`--watch`),i.push(t);let[,...a]=e._,o=[...i,...a.map(e=>e.toString())];e.verbose&&console.info(`Running '${r} ${o.join(` `)}'`);let s=v.spawnSync(r,o,{stdio:`inherit`,env:{...process.env}});process.exit(s.status??1)}};r(process.env),await a(o(process.argv)).scriptName(`build-ts`).options(D).command(qe).command(Je).command(Ye).command(lt).demandCommand().strict().version(ut()).help().argv;function ut(){return JSON.parse(e.readFileSync(t.join(w(),`package.json`),`utf8`)).version}
3
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJidWlsZGVyIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Vudi50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1bmRsZXJMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvZXh0ZXJuYWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3RyYW5zZm9ybVV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2RlY29yYXRvckRldGVjdGlvbi50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yZW1vdmVDb25zb2xlUGx1Z2luLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3BsdWdpbi50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC90eXBlU2NyaXB0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1aWxkLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3J1bi50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmxldCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbG9hZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gYC5lbnZgIGZpbGVzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPixcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIWVudlZhcnMpIHtcbiAgICBlbnZWYXJzID0gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoYXJndiwgY3dkKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ0xvYWRlZCBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGRlZmluaXRpb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSBidWlsZC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgY3dkOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBlbnZWYXJzRGVmOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGVudlZhck5hbWVzID0gbmV3IFNldChbXG4gICAgLi4uKGFyZ3YuaW5saW5lID8/IFtdKS5mbGF0TWFwKChlKSA9PiBlLnRvU3RyaW5nKCkuc3BsaXQoJywnKSksXG4gICAgLi4uKGFyZ3YuYXV0b0lubGluZSA/IE9iamVjdC5rZXlzKGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBjd2QpKSA6IFtdKSxcbiAgXSk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBlbnZWYXJOYW1lcykge1xuICAgIGlmIChwcm9jZXNzLmVudltuYW1lXSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGVudlZhcnNEZWZbYHByb2Nlc3MuZW52LiR7bmFtZX1gXSA9IEpTT04uc3RyaW5naWZ5KHByb2Nlc3MuZW52W25hbWVdKTtcbiAgfVxuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdJbmxpbmUgZW52IHZhcnM6JywgT2JqZWN0LmtleXMoZW52VmFyc0RlZikpO1xuICB9XG4gIHJldHVybiBlbnZWYXJzRGVmO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMsIE9wdGlvbnMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCBhbGxUYXJnZXRDYXRlZ29yaWVzID0gWydhcHAnLCAnZnVuY3Rpb25zJywgJ2xpYiddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBUYXJnZXRDYXRlZ29yeSA9ICh0eXBlb2YgYWxsVGFyZ2V0Q2F0ZWdvcmllcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldERldGFpbHMgPSBbJ2FwcC1ub2RlJywgJ2Z1bmN0aW9ucycsICdsaWInLCAnbGliLXJlYWN0J10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldERldGFpbCA9ICh0eXBlb2YgYWxsVGFyZ2V0RGV0YWlscylbbnVtYmVyXTtcblxuZXhwb3J0IHR5cGUgQXJndW1lbnRzVHlwZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgT3B0aW9ucz4+ID0gQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8VD4+O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFtQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgc3RyaW5nXT4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICByZXR1cm4gW0pTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCBwYWNrYWdlSnNvblBhdGhdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVpbGRUc1Jvb3RQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmRpcm5hbWUocGF0aC5kaXJuYW1lKHVybC5maWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpKTtcbn1cblxuLyoqIFJldHVybnMgdGhlIHNjb3BlIG9mIGEgcGFja2FnZSBuYW1lIChlLmcuIFwid2lsbGJvb3N0ZXJcIiBmb3IgXCJAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYlwiKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lc3BhY2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIC9eQChbXi9dKylcXC8vLmV4ZWMocGFja2FnZUpzb24ubmFtZSA/PyAnJyk/LlsxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke3BhZChkYXRlLmdldE1vbnRoKCkgKyAxKX0tJHtwYWQoZGF0ZS5nZXREYXRlKCkpfSAke3BhZChkYXRlLmdldEhvdXJzKCkpfToke3BhZChcbiAgICBkYXRlLmdldE1pbnV0ZXMoKVxuICApfToke3BhZChkYXRlLmdldFNlY29uZHMoKSl9YDtcbn1cblxuZnVuY3Rpb24gcGFkKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobWlsbGlzZWNvbmRzIDwgMTAwMCkgcmV0dXJuIGAke01hdGgucm91bmQobWlsbGlzZWNvbmRzKX1tc2A7XG5cbiAgY29uc3Qgc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gIGlmIChzZWNvbmRzIDwgNjApIHJldHVybiBgJHtOdW1iZXIoc2Vjb25kcy50b0ZpeGVkKDEpKX1zYDtcblxuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICByZXR1cm4gYCR7bWludXRlc31tICR7TnVtYmVyKChzZWNvbmRzIC0gbWludXRlcyAqIDYwKS50b0ZpeGVkKDEpKX1zYDtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc3VwcHJlc3Mgbm9uLWVycm9yIG91dHB1dCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3MnLFxuICB9LFxufSBhcyBjb25zdDtcbiIsImltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5leHBvcnQgY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIGlucHV0OiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aHMgb3IgZ2xvYiBwYXR0ZXJucyAoZS5nLiBcInNyYy8qKi8qLnRzXCIpIG9mIHNvdXJjZSBjb2RlIGZpbGVzIHRvIGJlIGJ1aWx0LiBUaGUgZmlyc3QgZmlsZSBpcyBtYWluLiBJZiBubyBvcHRpb24gaXMgZ2l2ZW4sIFwic3JjL2luZGV4Lnt0cyx0c3gsY3RzLG10c31cIiBmcm9tIHBhY2thZ2UgZGlyZWN0b3J5IGlzIHRhcmdldGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2knLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgb3V0RGlyOiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgZGlyZWN0b3J5LiBEZWZhdWx0cyB0byBcImRpc3RcIiBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxuICBpbmxpbmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Vudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmxpbmVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2F1dG8taW5saW5lJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5saW5lIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZWZpbmVkIGF0IGVudiBmaWxlcy4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIGRlY2xhcmF0aW9uT25seToge1xuICAgIGRlc2NyaXB0aW9uOiAnRW1pdCBvbmx5IGRlY2xhcmF0aW9uICguZC50cykgZmlsZXMgd2l0aG91dCBidW5kbGluZyBKYXZhU2NyaXB0LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc3R5bGVUZXh0IH0gZnJvbSAnbm9kZTp1dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiBCdWlsZEVycm9yLCByZWNvdmVyID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgbmFtZSA9IGVycm9yLm5hbWUgfHwgKGVycm9yLmNhdXNlIGFzIEVycm9yKT8ubmFtZTtcbiAgY29uc3QgbmFtZVNlY3Rpb24gPSBuYW1lID8gYCR7bmFtZX06IGAgOiAnJztcbiAgY29uc3QgcGx1Z2luU2VjdGlvbiA9IGVycm9yLnBsdWdpbiA/IGAocGx1Z2luICR7ZXJyb3IucGx1Z2lufSkgYCA6ICcnO1xuICBjb25zdCBtZXNzYWdlID0gYCR7cGx1Z2luU2VjdGlvbn0ke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1gO1xuXG4gIGNvbnN0IG91dHB1dExpbmVzID0gW3N0eWxlVGV4dChbJ2JvbGQnLCAncmVkJ10sIGBbIV0gJHttZXNzYWdlfWApXTtcblxuICBpZiAoZXJyb3IudXJsKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChzdHlsZVRleHQoJ2N5YW4nLCBlcnJvci51cmwpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5sb2MpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGAke2Vycm9yLmxvYy5maWxlIHx8IGVycm9yLmlkfSAoJHtlcnJvci5sb2MubGluZX06JHtlcnJvci5sb2MuY29sdW1ufSlgKTtcbiAgfSBlbHNlIGlmIChlcnJvci5pZCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goZXJyb3IuaWQpO1xuICB9XG5cbiAgaWYgKGVycm9yLmZyYW1lKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChzdHlsZVRleHQoJ2RpbScsIGVycm9yLmZyYW1lKSk7XG4gIH1cblxuICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKHN0eWxlVGV4dCgnZGltJywgZXJyb3Iuc3RhY2sucmVwbGFjZShgJHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9XFxuYCwgJycpKSk7XG4gIH1cblxuICBvdXRwdXRMaW5lcy5wdXNoKCcnLCAnJyk7XG4gIGNvbnNvbGUuZXJyb3Iob3V0cHV0TGluZXMuam9pbignXFxuJykpO1xuXG4gIGlmICghcmVjb3ZlcikgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY2F1c2U/OiB1bmtub3duO1xuICBmcmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGxvYz86IHtcbiAgICBjb2x1bW46IG51bWJlcjtcbiAgICBmaWxlPzogc3RyaW5nO1xuICAgIGxpbmU6IG51bWJlcjtcbiAgfTtcbiAgcGx1Z2luPzogc3RyaW5nO1xuICB1cmw/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBidWlsdGluTW9kdWxlcyB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuY29uc3Qgbm9kZUJ1aWx0aW5Nb2R1bGVzID0gbmV3IFNldChidWlsdGluTW9kdWxlcyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHRlcm5hbE1hdGNoZXIoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZ1xuKTogKGlkOiBzdHJpbmcpID0+IGJvb2xlYW4ge1xuICBjb25zdCBleHRlcm5hbERlcGVuZGVuY3lOYW1lcyA9IG5ldyBTZXQoXG4gICAgY29sbGVjdEV4dGVybmFsRGVwZW5kZW5jaWVzKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZUpzb24sIHBhY2thZ2VEaXJQYXRoLCBuYW1lc3BhY2UpXG4gICk7XG4gIHJldHVybiAoaWQpID0+IGlzTm9kZUJ1aWx0aW4oaWQpIHx8IG1hdGNoZXNNb2R1bGVPclN1YnBhdGgoaWQsIGV4dGVybmFsRGVwZW5kZW5jeU5hbWVzKTtcbn1cblxuLyoqIENoZWNrcyB3aGV0aGVyIGBpZGAgZXF1YWxzIGEgbmFtZSBpbiBgbmFtZXNgIG9yIGlzIGEgc3VicGF0aCBvZiBpdCAoZS5nLiBgbG9kYXNoLmNodW5rL2luZGV4LmpzYCkuICovXG5mdW5jdGlvbiBtYXRjaGVzTW9kdWxlT3JTdWJwYXRoKGlkOiBzdHJpbmcsIG5hbWVzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBpZiAobmFtZXMuaGFzKGlkKSkgcmV0dXJuIHRydWU7XG4gIGZvciAobGV0IHNsYXNoSW5kZXggPSBpZC5pbmRleE9mKCcvJyk7IHNsYXNoSW5kZXggIT09IC0xOyBzbGFzaEluZGV4ID0gaWQuaW5kZXhPZignLycsIHNsYXNoSW5kZXggKyAxKSkge1xuICAgIGlmIChuYW1lcy5oYXMoaWQuc2xpY2UoMCwgc2xhc2hJbmRleCkpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RFeHRlcm5hbERlcGVuZGVuY2llcyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBgZGVwczogdHJ1ZWAgZGlkIG5vdCBoYW5kbGUgaW1wb3J0cyBzdWNoIGFzIGBsb2Rhc2guY2h1bmsvaW5kZXguanNgLlxuICBleHRlcm5hbERlcHMucHVzaChcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9KVxuICApO1xuICAvLyBBZGQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZyb20gc2libGluZyBwYWNrYWdlc1xuICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VEaXJQYXRoKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhdGguZGlybmFtZShwYXJlbnREaXJQYXRoKSwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXJzID0gZnMucmVhZGRpclN5bmMocGFyZW50RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4ocGFyZW50RGlyUGF0aCwgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQW4gYXBwIGJ1bmRsZXMgaXRzIG93biBuYW1lc3BhY2UncyBwYWNrYWdlcyBpbnN0ZWFkIG9mIHRyZWF0aW5nIHRoZW0gYXMgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICBjb25zdCBidW5kbGVzT3duTmFtZXNwYWNlID0gdGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucyc7XG4gIGNvbnN0IGJ1bmRsZWRQcmVmaXggPSBidW5kbGVzT3duTmFtZXNwYWNlICYmIG5hbWVzcGFjZSA/IGBAJHtuYW1lc3BhY2V9L2AgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBidW5kbGVkUHJlZml4ID8gZXh0ZXJuYWxEZXBzLmZpbHRlcigobmFtZSkgPT4gIW5hbWUuc3RhcnRzV2l0aChidW5kbGVkUHJlZml4KSkgOiBleHRlcm5hbERlcHM7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZUJ1aWx0aW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaWQuc3RhcnRzV2l0aCgnbm9kZTonKSB8fCBub2RlQnVpbHRpbk1vZHVsZXMuaGFzKGlkKTtcbn1cbiIsImltcG9ydCB7IHBhcnNlU3luYywgdmlzaXRvcktleXMgfSBmcm9tICdveGMtcGFyc2VyJztcblxuY29uc3Qgc291cmNlRmlsZUV4dGVuc2lvbnMgPSBbJy5janMnLCAnLm1qcycsICcuanMnLCAnLmpzeCcsICcuY3RzJywgJy5tdHMnLCAnLnRzJywgJy50c3gnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNmb3JtVGFyZ2V0RmlsZShpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgc291cmNlRmlsZUV4dGVuc2lvbnMuc29tZSgoZXh0ZW5zaW9uKSA9PiBpZC5lbmRzV2l0aChleHRlbnNpb24pKSAmJiAhaWQuc3RhcnRzV2l0aCgnXFwwJykgJiYgIWlzTm9kZU1vZHVsZXNQYXRoKGlkKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc05vZGVNb2R1bGVzUGF0aChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpZC5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSB8fCBpZC5pbmNsdWRlcygnXFxcXG5vZGVfbW9kdWxlc1xcXFwnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU291cmNlRmlsZShpZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBSZXR1cm5UeXBlPHR5cGVvZiBwYXJzZVN5bmM+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbGFuZyA9IGdldFBhcnNlckxhbmcoaWQpO1xuICBjb25zdCBzb3VyY2VUeXBlID0gZ2V0UGFyc2VyU291cmNlVHlwZShpZCk7XG4gIGNvbnN0IGFzdCA9IHBhcnNlU3luYyhpZCwgY29kZSwgeyBsYW5nLCBzb3VyY2VUeXBlIH0pO1xuICBpZiAoIWhhc1BhcnNlRXJyb3IoYXN0KSkgcmV0dXJuIGFzdDtcbiAgaWYgKGlkLmVuZHNXaXRoKCcuanMnKSAmJiBzb3VyY2VUeXBlID09PSAndW5hbWJpZ3VvdXMnKSB7XG4gICAgY29uc3QgY29tbW9uSnNBc3QgPSBwYXJzZVN5bmMoaWQsIGNvZGUsIHsgbGFuZywgc291cmNlVHlwZTogJ2NvbW1vbmpzJyB9KTtcbiAgICBpZiAoIWhhc1BhcnNlRXJyb3IoY29tbW9uSnNBc3QpKSByZXR1cm4gY29tbW9uSnNBc3Q7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzUGFyc2VFcnJvcihhc3Q6IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlU3luYz4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGFzdC5lcnJvcnMuc29tZSgoZXJyb3IpID0+IGVycm9yLnNldmVyaXR5ID09PSAnRXJyb3InKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VyTGFuZyhpZDogc3RyaW5nKTogJ2pzJyB8ICdqc3gnIHwgJ3RzJyB8ICd0c3gnIHtcbiAgaWYgKGlkLmVuZHNXaXRoKCcudHN4JykpIHJldHVybiAndHN4JztcbiAgaWYgKGlkLmVuZHNXaXRoKCcudHMnKSB8fCBpZC5lbmRzV2l0aCgnLmN0cycpIHx8IGlkLmVuZHNXaXRoKCcubXRzJykpIHJldHVybiAndHMnO1xuICBpZiAoaWQuZW5kc1dpdGgoJy5qc3gnKSkgcmV0dXJuICdqc3gnO1xuICByZXR1cm4gJ2pzJztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VyU291cmNlVHlwZShpZDogc3RyaW5nKTogJ2NvbW1vbmpzJyB8ICd1bmFtYmlndW91cycge1xuICByZXR1cm4gaWQuZW5kc1dpdGgoJy5janMnKSB8fCBpZC5lbmRzV2l0aCgnLmN0cycpID8gJ2NvbW1vbmpzJyA6ICd1bmFtYmlndW91cyc7XG59XG5cbmV4cG9ydCB0eXBlIEFzdE5vZGUgPSB7XG4gIHR5cGU6IHN0cmluZztcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXN0Tm9kZUNoaWxkcmVuKG5vZGU6IEFzdE5vZGUpOiBBc3ROb2RlW10ge1xuICByZXR1cm4gKHZpc2l0b3JLZXlzW25vZGUudHlwZV0gPz8gW10pXG4gICAgLmZsYXRNYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBub2RlW2tleV07XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfSlcbiAgICAuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIEFzdE5vZGUgPT4gaXNBc3ROb2RlKHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBc3ROb2RlUHJvcGVydHkobm9kZTogQXN0Tm9kZSwga2V5OiBzdHJpbmcpOiBBc3ROb2RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBub2RlW2tleV07XG4gIHJldHVybiBpc0FzdE5vZGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBc3RBcnJheVByb3BlcnR5KG5vZGU6IEFzdE5vZGUsIGtleTogc3RyaW5nKTogQXN0Tm9kZVtdIHtcbiAgY29uc3QgdmFsdWUgPSBub2RlW2tleV07XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQXN0Tm9kZSA9PiBpc0FzdE5vZGUoaXRlbSkpIDogW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FzdE5vZGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBc3ROb2RlIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKHZhbHVlIGFzIEFzdE5vZGUpLnR5cGUgPT09ICdzdHJpbmcnO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBc3ROb2RlIH0gZnJvbSAnLi90cmFuc2Zvcm1VdGlscy5qcyc7XG5pbXBvcnQgeyBnZXRBc3ROb2RlQ2hpbGRyZW4sIGlzQXN0Tm9kZSwgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi90cmFuc2Zvcm1VdGlscy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGNvZGUgY29udGFpbnMgYSBkZWNvcmF0b3IsIGlnbm9yaW5nIGBAYCBpbiBjb21tZW50cywgc3RyaW5ncywgYW5kIHJlZ2V4ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc0RlY29yYXRvcihjb2RlOiBzdHJpbmcsIGlkID0gJ2ZpbGUudHMnKTogYm9vbGVhbiB7XG4gIC8vIEEgZGVjb3JhdG9yIHJlcXVpcmVzIGEgbGl0ZXJhbCBgQGAgZXZlbiB3aGVuIGl0cyBpZGVudGlmaWVyIHVzZXMgZXNjYXBlcyBzdWNoIGFzIGBcXHUwMDYzdXN0b21gLlxuICBpZiAoIWNvZGUuaW5jbHVkZXMoJ0AnKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGFzdCA9IHBhcnNlU291cmNlRmlsZShpZCwgY29kZSk7XG4gIC8vIElmIHRoZSBjb2RlIGZhaWxzIHRvIHBhcnNlLCBsZXQgQmFiZWwgdHJhbnNmb3JtIGl0IGFuZCByZXBvcnQgYSBwcm9wZXIgc3ludGF4IGVycm9yLlxuICBpZiAoIWFzdCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBpc0FzdE5vZGUoYXN0LnByb2dyYW0pICYmIGhhc0RlY29yYXRvck5vZGUoYXN0LnByb2dyYW0pO1xufVxuXG5mdW5jdGlvbiBoYXNEZWNvcmF0b3JOb2RlKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0RlY29yYXRvcicpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZ2V0QXN0Tm9kZUNoaWxkcmVuKG5vZGUpLnNvbWUoKGNoaWxkKSA9PiBoYXNEZWNvcmF0b3JOb2RlKGNoaWxkKSk7XG59XG4iLCJpbXBvcnQgTWFnaWNTdHJpbmcgZnJvbSAnbWFnaWMtc3RyaW5nJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luLCBTb3VyY2VNYXBJbnB1dCB9IGZyb20gJ3JvbGxkb3duJztcblxuaW1wb3J0IHR5cGUgeyBBc3ROb2RlIH0gZnJvbSAnLi90cmFuc2Zvcm1VdGlscy5qcyc7XG5pbXBvcnQge1xuICBnZXRBc3RBcnJheVByb3BlcnR5LFxuICBnZXRBc3ROb2RlQ2hpbGRyZW4sXG4gIGdldEFzdE5vZGVQcm9wZXJ0eSxcbiAgaXNBc3ROb2RlLFxuICBpc1RyYW5zZm9ybVRhcmdldEZpbGUsXG4gIHBhcnNlU291cmNlRmlsZSxcbn0gZnJvbSAnLi90cmFuc2Zvcm1VdGlscy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25zb2xlUmVtb3ZhbEV4Y2x1ZGVkTWV0aG9kcygpOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgZW52IH0gPSBwcm9jZXNzO1xuICBpZiAoZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHJldHVybiBuZXcgU2V0KFsnZXJyb3InLCAnaW5mbycsICd3YXJuJ10pO1xuICBpZiAoZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHJldHVybiBuZXcgU2V0KFsnZGVidWcnLCAnZXJyb3InLCAnaW5mbycsICd3YXJuJ10pO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQ29uc29sZVBsdWdpbihleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+KTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAncmVtb3ZlLWNvbnNvbGUnLFxuICAgIHRyYW5zZm9ybShjb2RlLCBpZCkge1xuICAgICAgaWYgKCFpc1RyYW5zZm9ybVRhcmdldEZpbGUoaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgLy8gQSBnbG9iYWwgYGNvbnNvbGVgIG1heSBiZSB3cml0dGVuIHdpdGggVW5pY29kZSBlc2NhcGVzIChgXFx1MDA2M29uc29sZWApLCB3aGljaCB0aGUgcGFyc2VyXG4gICAgICAvLyBub3JtYWxpemVzLCBzbyB0aGUgZmFzdCBwYXRoIG11c3QgbGV0IGVzY2FwZWQgaWRlbnRpZmllcnMgdGhyb3VnaCB0b28uXG4gICAgICBpZiAoIS9jb25zb2xlfFxcXFx1Ly50ZXN0KGNvZGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gcmVtb3ZlQ29uc29sZShjb2RlLCBpZCwgZXhjbHVkZWRNZXRob2RzKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiByZW1vdmVDb25zb2xlKGNvZGU6IHN0cmluZywgaWQ6IHN0cmluZywgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPik6IHsgY29kZTogc3RyaW5nOyBtYXA6IFNvdXJjZU1hcElucHV0IH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBhc3QgPSBwYXJzZVNvdXJjZUZpbGUoaWQsIGNvZGUpO1xuICBpZiAoIWFzdCB8fCAhaXNBc3ROb2RlKGFzdC5wcm9ncmFtKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBtYWdpY1N0cmluZyA9IG5ldyBNYWdpY1N0cmluZyhjb2RlKTtcbiAgY29uc3QgcmVwbGFjZW1lbnRzOiBDb25zb2xlUmVwbGFjZW1lbnRbXSA9IFtdO1xuICBjb25zdCBzY29wZXM6IENvbnNvbGVTY29wZVtdID0gW107XG4gIGNvbGxlY3RDb25zb2xlUmVwbGFjZW1lbnRzKGFzdC5wcm9ncmFtLCBbXSwgc2NvcGVzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2Ygc2VsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhyZXBsYWNlbWVudHMpKSB7XG4gICAgbWFnaWNTdHJpbmcub3ZlcndyaXRlKHJlcGxhY2VtZW50LnN0YXJ0LCByZXBsYWNlbWVudC5lbmQsIHJlcGxhY2VtZW50LnZhbHVlKTtcbiAgfVxuXG4gIGlmICghbWFnaWNTdHJpbmcuaGFzQ2hhbmdlZCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGNvZGU6IG1hZ2ljU3RyaW5nLnRvU3RyaW5nKCksXG4gICAgbWFwOiBtYWdpY1N0cmluZy5nZW5lcmF0ZU1hcCh7IGhpcmVzOiB0cnVlIH0pIGFzIFNvdXJjZU1hcElucHV0LFxuICB9O1xufVxuXG50eXBlIENvbnNvbGVSZXBsYWNlbWVudCA9IHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHZhbHVlOiBzdHJpbmc7XG59O1xuXG50eXBlIENvbnNvbGVTY29wZSA9IHtcbiAgZW5kOiBudW1iZXI7XG4gIHNoYWRvd3NDb25zb2xlOiBib29sZWFuO1xuICBzdGFydDogbnVtYmVyO1xufTtcblxuY29uc3Qgbm9vcEZ1bmN0aW9uRXhwcmVzc2lvbiA9ICcoZnVuY3Rpb24gKCkge30pJztcbmNvbnN0IHVuZGVmaW5lZEV4cHJlc3Npb24gPSAnKHZvaWQgMCknO1xuXG5mdW5jdGlvbiBjb2xsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhcbiAgbm9kZTogQXN0Tm9kZSxcbiAgYW5jZXN0b3JzOiBBc3ROb2RlW10sXG4gIHNjb3BlczogQ29uc29sZVNjb3BlW10sXG4gIHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10sXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBjb25zdCBwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTEpO1xuICBjb25zdCBzY29wZSA9IGdldENvbnNvbGVTY29wZShub2RlLCBwYXJlbnQpO1xuICBpZiAoc2NvcGUpIHNjb3Blcy5wdXNoKHNjb3BlKTtcblxuICBpZiAoIWlzQ29uc29sZVNoYWRvd2VkKHNjb3Blcywgbm9kZSkgJiYgbm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVDYWxsUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIH1cbiAgaWYgKCFpc0NvbnNvbGVTaGFkb3dlZChzY29wZXMsIG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVNZW1iZXJSZXBsYWNlbWVudChub2RlLCBhbmNlc3RvcnMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkQW5jZXN0b3JzID0gWy4uLmFuY2VzdG9ycywgbm9kZV07XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZ2V0QXN0Tm9kZUNoaWxkcmVuKG5vZGUpKSB7XG4gICAgY29sbGVjdENvbnNvbGVSZXBsYWNlbWVudHMoY2hpbGQsIGNoaWxkQW5jZXN0b3JzLCBzY29wZXMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgfVxuXG4gIGlmIChzY29wZSkgc2NvcGVzLnBvcCgpO1xufVxuXG5mdW5jdGlvbiBnZXRDb25zb2xlU2NvcGUobm9kZTogQXN0Tm9kZSwgcGFyZW50OiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogQ29uc29sZVNjb3BlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1Byb2dyYW0nKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc1Byb2dyYW1Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUobm9kZSkpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnKSB7XG4gICAgY29uc3QgaXNGdW5jdGlvbkJvZHkgPSBwYXJlbnQgPyBpc0NvbnNvbGVGdW5jdGlvblNjb3BlTm9kZShwYXJlbnQpIDogZmFsc2U7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZSwgZmFsc2UpIHx8IChpc0Z1bmN0aW9uQm9keSAmJiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcobm9kZSkpLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdDYXRjaENsYXVzZScpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKG5vZGUucGFyYW0pLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIC8vIEEgbmFtZXNwYWNlIGJvZHkgaG9sZHMgb3JkaW5hcnkgZGVjbGFyYXRpb25zIHRvbywgc28gaXQgc2NvcGVzIGEgYGNvbnNvbGVgIGJpbmRpbmcgbGlrZSBhIGJsb2NrLlxuICAvLyBPbmx5IHRoZSBuYW1lc3BhY2UncyBvd24gbmFtZSAoYG5hbWVzcGFjZSBjb25zb2xlIHt9YCkgaXMgZGVsaWJlcmF0ZWx5IG5vdCB0cmVhdGVkIGFzIGEgYmluZGluZy5cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N0YXRpY0Jsb2NrJyB8fCBub2RlLnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJykge1xuICAgIHJldHVybiB7XG4gICAgICBlbmQ6IG5vZGUuZW5kLFxuICAgICAgc2hhZG93c0NvbnNvbGU6IGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZSwgZmFsc2UpIHx8IGhhc0hvaXN0ZWRWYXJDb25zb2xlQmluZGluZyhub2RlKSxcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0LFxuICAgIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0ZvclN0YXRlbWVudCcgfHwgbm9kZS50eXBlID09PSAnRm9ySW5TdGF0ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50Jykge1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNMb29wQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzUHJvZ3JhbUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnYm9keScpKSB7XG4gICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCB0cnVlKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGhhc0hvaXN0ZWRWYXJDb25zb2xlQmluZGluZyhub2RlKTtcbn1cblxuZnVuY3Rpb24gaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGlmIChoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4obm9kZS5pZCkpIHJldHVybiB0cnVlO1xuICBmb3IgKGNvbnN0IHBhcmFtIG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ3BhcmFtcycpKSB7XG4gICAgaWYgKGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihwYXJhbSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzQmxvY2tDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlLCBpbmNsdWRlVmFyOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2JvZHknKSkge1xuICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgaW5jbHVkZVZhcikpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzTG9vcENvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgbm9kZS50eXBlID09PSAnRm9yU3RhdGVtZW50JyA/ICdpbml0JyA6ICdsZWZ0Jyk7XG4gIHJldHVybiAhIWRlY2xhcmF0aW9uICYmIGRlY2xhcmF0aW9uLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJiBkZWNsYXJhdGlvbi5raW5kICE9PSAndmFyJyAmJiBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pO1xufVxuXG5mdW5jdGlvbiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcocm9vdDogQXN0Tm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXJvb3QpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGdldEFzdE5vZGVDaGlsZHJlbihyb290KSkge1xuICAgIGlmIChcbiAgICAgIGNoaWxkICE9PSByb290ICYmXG4gICAgICAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09ICdTdGF0aWNCbG9jaycgfHwgY2hpbGQudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoaWxkLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJlxuICAgICAgY2hpbGQua2luZCA9PT0gJ3ZhcicgJiZcbiAgICAgIGhhc1ZhcmlhYmxlRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhjaGlsZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNJbXBvcnRDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGlmIChub2RlLmltcG9ydEtpbmQgPT09ICd0eXBlJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnc3BlY2lmaWVycycpLnNvbWUoXG4gICAgKHNwZWNpZmllcikgPT4gc3BlY2lmaWVyLmltcG9ydEtpbmQgIT09ICd0eXBlJyAmJiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oc3BlY2lmaWVyLmxvY2FsKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUsIGluY2x1ZGVWYXI6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRFeHBvcnREZWNsYXJhdGlvbihub2RlKSA/PyBub2RlO1xuICBpZiAoZGVjbGFyYXRpb24uZGVjbGFyZSA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJykgcmV0dXJuIGhhc0ltcG9ydENvbnNvbGVCaW5kaW5nKGRlY2xhcmF0aW9uKTtcbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyB8fCBkZWNsYXJhdGlvbi50eXBlID09PSAnQ2xhc3NEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGRlY2xhcmF0aW9uLmlkKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJlxuICAgIChpbmNsdWRlVmFyIHx8IGRlY2xhcmF0aW9uLmtpbmQgIT09ICd2YXInKSAmJlxuICAgIGhhc1ZhcmlhYmxlRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhkZWNsYXJhdGlvbilcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzVmFyaWFibGVEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2RlY2xhcmF0aW9ucycpLnNvbWUoKGRlY2xhcmF0aW9uKSA9PlxuICAgIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihnZXRBc3ROb2RlUHJvcGVydHkoZGVjbGFyYXRpb24sICdpZCcpKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFpc0FzdE5vZGUodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJiB2YWx1ZS5uYW1lID09PSAnY29uc29sZScpIHJldHVybiB0cnVlO1xuICBpZiAodmFsdWUudHlwZSA9PT0gJ0Fzc2lnbm1lbnRQYXR0ZXJuJyB8fCB2YWx1ZS50eXBlID09PSAnUmVzdEVsZW1lbnQnKSB7XG4gICAgcmV0dXJuIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZS5sZWZ0ID8/IHZhbHVlLmFyZ3VtZW50KTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ1RTUGFyYW1ldGVyUHJvcGVydHknKSB7XG4gICAgcmV0dXJuIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZS5wYXJhbWV0ZXIpO1xuICB9XG4gIGlmICh2YWx1ZS50eXBlID09PSAnQXJyYXlQYXR0ZXJuJykge1xuICAgIHJldHVybiBnZXRBc3RBcnJheVByb3BlcnR5KHZhbHVlLCAnZWxlbWVudHMnKS5zb21lKChlbGVtZW50KSA9PiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oZWxlbWVudCkpO1xuICB9XG4gIGlmICh2YWx1ZS50eXBlID09PSAnT2JqZWN0UGF0dGVybicpIHtcbiAgICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eSh2YWx1ZSwgJ3Byb3BlcnRpZXMnKS5zb21lKChwcm9wZXJ0eSkgPT5cbiAgICAgIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihwcm9wZXJ0eS52YWx1ZSA/PyBwcm9wZXJ0eS5hcmd1bWVudClcbiAgICApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbicgfHwgbm9kZS50eXBlID09PSAnRnVuY3Rpb25FeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbic7XG59XG5cbmZ1bmN0aW9uIGlzQ29uc29sZVNoYWRvd2VkKHNjb3BlczogQ29uc29sZVNjb3BlW10sIG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjb3Blcy5zb21lKChzY29wZSkgPT4gc2NvcGUuc2hhZG93c0NvbnNvbGUgJiYgc2NvcGUuc3RhcnQgPD0gbm9kZS5zdGFydCAmJiBub2RlLmVuZCA8PSBzY29wZS5lbmQpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0Q29uc29sZUNhbGxSZXBsYWNlbWVudChcbiAgbm9kZTogQXN0Tm9kZSxcbiAgYW5jZXN0b3JzOiBBc3ROb2RlW10sXG4gIHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10sXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBjb25zdCBwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTEpO1xuICBjb25zdCBjYWxsZWUgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ2NhbGxlZScpO1xuICBpZiAobm9kZS5vcHRpb25hbCA9PT0gdHJ1ZSkgcmV0dXJuO1xuICBpZiAoIWNhbGxlZSB8fCAhaXNJbmNsdWRlZENvbnNvbGVNZW1iZXIoY2FsbGVlLCBleGNsdWRlZE1ldGhvZHMpKSB7XG4gICAgaWYgKGNhbGxlZSAmJiBpc0luY2x1ZGVkQ29uc29sZUJpbmRNZW1iZXIoY2FsbGVlLCBleGNsdWRlZE1ldGhvZHMpKSB7XG4gICAgICByZXBsYWNlbWVudHMucHVzaCh7IHN0YXJ0OiBub2RlLnN0YXJ0LCBlbmQ6IG5vZGUuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKSB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyBzdGFydDogcGFyZW50LnN0YXJ0LCBlbmQ6IHBhcmVudC5lbmQsIHZhbHVlOiAnOycgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyBzdGFydDogbm9kZS5zdGFydCwgZW5kOiBub2RlLmVuZCwgdmFsdWU6IGdldFVuZGVmaW5lZEV4cHJlc3Npb25SZXBsYWNlbWVudChub2RlLCBhbmNlc3RvcnMpIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDb25zb2xlTWVtYmVyUmVwbGFjZW1lbnQoXG4gIG5vZGU6IEFzdE5vZGUsXG4gIGFuY2VzdG9yczogQXN0Tm9kZVtdLFxuICByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdLFxuICBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0xKTtcbiAgY29uc3QgZ3JhbmRwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTIpO1xuICBpZiAoIWlzSW5jbHVkZWRDb25zb2xlTWVtYmVyKG5vZGUsIGV4Y2x1ZGVkTWV0aG9kcykgfHwgcGFyZW50Py50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybjtcbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyAmJiBwYXJlbnQuY2FsbGVlID09PSBub2RlICYmIHBhcmVudC5vcHRpb25hbCAhPT0gdHJ1ZSkgcmV0dXJuO1xuICBpZiAoaXNDb25zb2xlQXNzaWdubWVudFRhcmdldChub2RlLCBwYXJlbnQsIGdyYW5kcGFyZW50KSkgcmV0dXJuO1xuXG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdBc3NpZ25tZW50RXhwcmVzc2lvbicgJiYgcGFyZW50LmxlZnQgPT09IG5vZGUpIHtcbiAgICBjb25zdCByaWdodCA9IGdldEFzdE5vZGVQcm9wZXJ0eShwYXJlbnQsICdyaWdodCcpO1xuICAgIGlmIChyaWdodCkge1xuICAgICAgcmVwbGFjZW1lbnRzLnB1c2goeyBzdGFydDogcmlnaHQuc3RhcnQsIGVuZDogcmlnaHQuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQocmlnaHQsIGFuY2VzdG9ycykgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlcGxhY2VtZW50cy5wdXNoKHsgc3RhcnQ6IG5vZGUuc3RhcnQsIGVuZDogbm9kZS5lbmQsIHZhbHVlOiBnZXROb29wRnVuY3Rpb25SZXBsYWNlbWVudChub2RlLCBhbmNlc3RvcnMpIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRVbmRlZmluZWRFeHByZXNzaW9uUmVwbGFjZW1lbnQobm9kZTogQXN0Tm9kZSwgYW5jZXN0b3JzOiBBc3ROb2RlW10pOiBzdHJpbmcge1xuICByZXR1cm4gbmVlZHNMZWFkaW5nU3RhdGVtZW50U2VtaWNvbG9uKG5vZGUsIGFuY2VzdG9ycykgPyBgOyR7dW5kZWZpbmVkRXhwcmVzc2lvbn1gIDogdW5kZWZpbmVkRXhwcmVzc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQobm9kZTogQXN0Tm9kZSwgYW5jZXN0b3JzOiBBc3ROb2RlW10pOiBzdHJpbmcge1xuICByZXR1cm4gbmVlZHNMZWFkaW5nU3RhdGVtZW50U2VtaWNvbG9uKG5vZGUsIGFuY2VzdG9ycykgPyBgOyR7bm9vcEZ1bmN0aW9uRXhwcmVzc2lvbn1gIDogbm9vcEZ1bmN0aW9uRXhwcmVzc2lvbjtcbn1cblxuZnVuY3Rpb24gbmVlZHNMZWFkaW5nU3RhdGVtZW50U2VtaWNvbG9uKG5vZGU6IEFzdE5vZGUsIGFuY2VzdG9yczogQXN0Tm9kZVtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHN0YXRlbWVudEluZGV4ID0gYW5jZXN0b3JzLmZpbmRMYXN0SW5kZXgoKGFuY2VzdG9yKSA9PiBhbmNlc3Rvci50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCcpO1xuICBpZiAoc3RhdGVtZW50SW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXRlbWVudCA9IGFuY2VzdG9yc1tzdGF0ZW1lbnRJbmRleF07XG4gIGlmICghc3RhdGVtZW50KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXRlbWVudFBhcmVudCA9IGFuY2VzdG9yc1tzdGF0ZW1lbnRJbmRleCAtIDFdO1xuICByZXR1cm4gc3RhdGVtZW50LnN0YXJ0ID09PSBub2RlLnN0YXJ0ICYmIGlzU3RhdGVtZW50TGlzdE5vZGUoc3RhdGVtZW50UGFyZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTdGF0ZW1lbnRMaXN0Tm9kZShub2RlOiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIC8vIEEgYGNhc2VgIGNsYXVzZSBhbmQgYSBuYW1lc3BhY2UgYm9keSBhcmUgc3RhdGVtZW50IGxpc3RzIHRvbzogYSByZXBsYWNlbWVudCBzdGFydGluZyBhIHN0YXRlbWVudFxuICAvLyB0aGVyZSBzdGlsbCBuZWVkcyB0aGUgbGVhZGluZyBzZW1pY29sb24gdGhhdCBrZWVwcyBpdCBmcm9tIGJpbmRpbmcgdG8gdGhlIHByZXZpb3VzIGV4cHJlc3Npb24uXG4gIHJldHVybiAoXG4gICAgbm9kZT8udHlwZSA9PT0gJ1Byb2dyYW0nIHx8XG4gICAgbm9kZT8udHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50JyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdTdGF0aWNCbG9jaycgfHxcbiAgICBub2RlPy50eXBlID09PSAnU3dpdGNoQ2FzZScgfHxcbiAgICBub2RlPy50eXBlID09PSAnVFNNb2R1bGVCbG9jaydcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNDb25zb2xlQXNzaWdubWVudFRhcmdldChcbiAgbm9kZTogQXN0Tm9kZSxcbiAgcGFyZW50OiBBc3ROb2RlIHwgdW5kZWZpbmVkLFxuICBncmFuZHBhcmVudDogQXN0Tm9kZSB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdVcGRhdGVFeHByZXNzaW9uJyAmJiBwYXJlbnQuYXJndW1lbnQgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICBpZiAoKHBhcmVudD8udHlwZSA9PT0gJ0ZvckluU3RhdGVtZW50JyB8fCBwYXJlbnQ/LnR5cGUgPT09ICdGb3JPZlN0YXRlbWVudCcpICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0FycmF5UGF0dGVybicpIHJldHVybiB0cnVlO1xuICBpZiAocGFyZW50Py50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHBhcmVudD8udHlwZSA9PT0gJ1Byb3BlcnR5JyAmJiBwYXJlbnQudmFsdWUgPT09IG5vZGUgJiYgZ3JhbmRwYXJlbnQ/LnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJztcbn1cblxuZnVuY3Rpb24gaXNJbmNsdWRlZENvbnNvbGVNZW1iZXIobm9kZTogQXN0Tm9kZSwgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBvYmplY3QgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ29iamVjdCcpO1xuICBjb25zdCBwcm9wZXJ0eSA9IGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAncHJvcGVydHknKTtcbiAgaWYgKG5vZGUub3B0aW9uYWwgPT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFvYmplY3QgfHwgIXByb3BlcnR5IHx8IGlzRXhjbHVkZWRDb25zb2xlUHJvcGVydHkobm9kZSwgcHJvcGVydHksIGV4Y2x1ZGVkTWV0aG9kcykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIob2JqZWN0KSkgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIChcbiAgICBvYmplY3QudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmXG4gICAgaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihnZXRBc3ROb2RlUHJvcGVydHkob2JqZWN0LCAnb2JqZWN0JykpICYmXG4gICAgLy8gTWF0Y2hlcyBiYWJlbC1wbHVnaW4tdHJhbnNmb3JtLXJlbW92ZS1jb25zb2xlOiBjYWxsL2FwcGx5IGV4Y2x1c2lvbnMgYXJlIGNoZWNrZWQgb24gdGhlIG91dGVyIHByb3BlcnR5IG9ubHkuXG4gICAgbm9kZS5jb21wdXRlZCAhPT0gdHJ1ZSAmJlxuICAgIHByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJlxuICAgIChwcm9wZXJ0eS5uYW1lID09PSAnY2FsbCcgfHwgcHJvcGVydHkubmFtZSA9PT0gJ2FwcGx5JylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNJbmNsdWRlZENvbnNvbGVCaW5kTWVtYmVyKG5vZGU6IEFzdE5vZGUsIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgaWYgKG5vZGUudHlwZSAhPT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgb2JqZWN0ID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdvYmplY3QnKTtcbiAgY29uc3QgcHJvcGVydHkgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ3Byb3BlcnR5Jyk7XG4gIGlmICghb2JqZWN0IHx8ICFwcm9wZXJ0eSB8fCBvYmplY3QudHlwZSAhPT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm4gZmFsc2U7XG4gIGlmIChub2RlLmNvbXB1dGVkID09PSB0cnVlIHx8IHByb3BlcnR5LnR5cGUgIT09ICdJZGVudGlmaWVyJyB8fCBwcm9wZXJ0eS5uYW1lICE9PSAnYmluZCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFpc0dsb2JhbENvbnNvbGVJZGVudGlmaWVyKGdldEFzdE5vZGVQcm9wZXJ0eShvYmplY3QsICdvYmplY3QnKSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY29uc29sZU1ldGhvZCA9IGdldEFzdE5vZGVQcm9wZXJ0eShvYmplY3QsICdwcm9wZXJ0eScpO1xuICByZXR1cm4gISFjb25zb2xlTWV0aG9kICYmICFpc0V4Y2x1ZGVkQ29uc29sZVByb3BlcnR5KG9iamVjdCwgY29uc29sZU1ldGhvZCwgZXhjbHVkZWRNZXRob2RzKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZENvbnNvbGVQcm9wZXJ0eShcbiAgbWVtYmVyRXhwcmVzc2lvbjogQXN0Tm9kZSxcbiAgcHJvcGVydHk6IEFzdE5vZGUsXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IGJvb2xlYW4ge1xuICAvLyBUaGUgcmVzdG9yZWQgYmVoYXZpb3IgbWF0Y2hlcyBiYWJlbC1wbHVnaW4tdHJhbnNmb3JtLXJlbW92ZS1jb25zb2xlLCB3aG9zZSBleGNsdXNpb25zIG9ubHkgYXBwbHkgdG8gaWRlbnRpZmllciBwcm9wZXJ0aWVzLlxuICByZXR1cm4gbWVtYmVyRXhwcmVzc2lvbi5jb21wdXRlZCAhPT0gdHJ1ZSAmJiBwcm9wZXJ0eS50eXBlID09PSAnSWRlbnRpZmllcicgJiYgZXhjbHVkZWRNZXRob2RzLmhhcyhwcm9wZXJ0eS5uYW1lIGFzIHN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIGlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIobm9kZTogQXN0Tm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbm9kZT8udHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIG5vZGUubmFtZSA9PT0gJ2NvbnNvbGUnO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RDb25zb2xlUmVwbGFjZW1lbnRzKHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10pOiBDb25zb2xlUmVwbGFjZW1lbnRbXSB7XG4gIGNvbnN0IHNlbGVjdGVkOiBDb25zb2xlUmVwbGFjZW1lbnRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlcGxhY2VtZW50IG9mIHJlcGxhY2VtZW50cy50b1NvcnRlZCgoYSwgYikgPT4gYS5zdGFydCAtIGIuc3RhcnQgfHwgYi5lbmQgLSBhLmVuZCkpIHtcbiAgICBpZiAoc2VsZWN0ZWQuc29tZSgoaXRlbSkgPT4gaXRlbS5zdGFydCA8PSByZXBsYWNlbWVudC5zdGFydCAmJiByZXBsYWNlbWVudC5lbmQgPD0gaXRlbS5lbmQpKSBjb250aW51ZTtcbiAgICBzZWxlY3RlZC5wdXNoKHJlcGxhY2VtZW50KTtcbiAgfVxuICByZXR1cm4gc2VsZWN0ZWQudG9Tb3J0ZWQoKGEsIGIpID0+IGIuc3RhcnQgLSBhLnN0YXJ0KTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwb3J0RGVjbGFyYXRpb24obm9kZTogQXN0Tm9kZSk6IEFzdE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAobm9kZS50eXBlICE9PSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicgJiYgbm9kZS50eXBlICE9PSAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAnZGVjbGFyYXRpb24nKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgSW5wdXRPcHRpb25zIH0gZnJvbSAnQGJhYmVsL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4sIFJvbGxkb3duUGx1Z2luT3B0aW9uLCBTb3VyY2VNYXBJbnB1dCB9IGZyb20gJ3JvbGxkb3duJztcblxuaW1wb3J0IHsgZ2V0QnVpbGRUc1Jvb3RQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgeyBjb250YWluc0RlY29yYXRvciB9IGZyb20gJy4vZGVjb3JhdG9yRGV0ZWN0aW9uLmpzJztcbmltcG9ydCB7IGdldENvbnNvbGVSZW1vdmFsRXhjbHVkZWRNZXRob2RzLCByZW1vdmVDb25zb2xlUGx1Z2luIH0gZnJvbSAnLi9yZW1vdmVDb25zb2xlUGx1Z2luLmpzJztcbmltcG9ydCB7IGlzVHJhbnNmb3JtVGFyZ2V0RmlsZSB9IGZyb20gJy4vdHJhbnNmb3JtVXRpbHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQbHVnaW5zKCk6IFJvbGxkb3duUGx1Z2luT3B0aW9uW10ge1xuICBjb25zdCBwbHVnaW5zOiBSb2xsZG93blBsdWdpbk9wdGlvbltdID0gW107XG4gIGNvbnN0IGV4Y2x1ZGVkQ29uc29sZU1ldGhvZHMgPSBnZXRDb25zb2xlUmVtb3ZhbEV4Y2x1ZGVkTWV0aG9kcygpO1xuICBpZiAoZXhjbHVkZWRDb25zb2xlTWV0aG9kcykge1xuICAgIHBsdWdpbnMucHVzaChyZW1vdmVDb25zb2xlUGx1Z2luKGV4Y2x1ZGVkQ29uc29sZU1ldGhvZHMpKTtcbiAgfVxuICBwbHVnaW5zLnB1c2goYmFiZWxEZWNvcmF0b3JzUGx1Z2luKCksIHRleHRQbHVnaW4oKSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuXG5mdW5jdGlvbiBiYWJlbERlY29yYXRvcnNQbHVnaW4oKTogUGx1Z2luIHtcbiAgY29uc3QgYmFiZWxDb25maWdQYXRoID0gcGF0aC5qb2luKGdldEJ1aWxkVHNSb290UGF0aCgpLCAnYmFiZWwuY29uZmlnLm1qcycpO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdiYWJlbC1kZWNvcmF0b3JzJyxcbiAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgIGlmICghaXNUcmFuc2Zvcm1UYXJnZXRGaWxlKGlkKSB8fCAhY29udGFpbnNEZWNvcmF0b3IoY29kZSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB0cmFuc2Zvcm1Bc3luYyB9ID0gYXdhaXQgaW1wb3J0KCdAYmFiZWwvY29yZScpO1xuICAgICAgY29uc3Qgb3B0aW9uczogSW5wdXRPcHRpb25zID0ge1xuICAgICAgICBjYWxsZXI6IHtcbiAgICAgICAgICBuYW1lOiAnYnVpbGQtdHMnLFxuICAgICAgICAgIHN1cHBvcnRzRHluYW1pY0ltcG9ydDogdHJ1ZSxcbiAgICAgICAgICBzdXBwb3J0c0V4cG9ydE5hbWVzcGFjZUZyb206IHRydWUsXG4gICAgICAgICAgc3VwcG9ydHNTdGF0aWNFU006IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgICAgZmlsZW5hbWU6IGlkLFxuICAgICAgICBzb3VyY2VNYXBzOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybUFzeW5jKGNvZGUsIG9wdGlvbnMpO1xuICAgICAgaWYgKCFyZXN1bHQ/LmNvZGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHJlc3VsdC5jb2RlLFxuICAgICAgICBtYXA6IHJlc3VsdC5tYXAgYXMgU291cmNlTWFwSW5wdXQsXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRQbHVnaW4oKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAndGV4dCcsXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5lbmRzV2l0aCgnLmNzdicpICYmICFpZC5lbmRzV2l0aCgnLnR4dCcpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoaWQsICd1dGY4Jyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBgZXhwb3J0IGRlZmF1bHQgJHtKU09OLnN0cmluZ2lmeShjb250ZW50KX07YCxcbiAgICAgICAgbW9kdWxlVHlwZTogJ2pzJyxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgY29yZVByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgaW5wdXRzPzogc3RyaW5nW11cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb3JlQ29uZmlnRmlsZSA9IGZpbmRDb25maWdGaWxlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gIGlmICghY29yZUNvbmZpZ0ZpbGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgdHNjb25maWcuanNvbiBpbiAke2NvcmVQcm9qZWN0RGlyUGF0aH0uYCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0ZvdW5kIHRzY29uZmlnLmpzb246JywgY29yZUNvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmdbXSB8IHVuZGVmaW5lZF1bXSA9IFtdO1xuICBsZXQgY29yZU91dERpciA9IHBhdGguam9pbihvdXREaXJQYXRoLCBwYXRoLmJhc2VuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCksICdzcmMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoY29yZU91dERpcikpIHtcbiAgICAvLyBUaGUgYnVuZGxlciBlbWl0dGVkIHBlci1wcm9qZWN0IGRpcmVjdG9yaWVzIChtb25vcmVwbyBidWlsZCksIHNvIGVudHJ5LWJhc2VkIHJlc3RyaWN0aW9uIGlzIHVuc2FmZTpcbiAgICAvLyBlbnRyaWVzIG1heSBpbXBvcnQgZmlsZXMgb3V0c2lkZSBlYWNoIHByb2plY3QncyByb290RGlyLlxuICAgIGlucHV0cyA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocGFyZW50RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvcmVQcm9qZWN0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwcm9qZWN0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnREaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBpZiAocHJvamVjdERpclBhdGggPT09IGNvcmVQcm9qZWN0RGlyUGF0aCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBmaW5kQ29uZmlnRmlsZShwcm9qZWN0RGlyUGF0aCk7XG4gICAgICBjb25zdCBvdXREaXIgPSBwYXRoLmpvaW4ob3V0RGlyUGF0aCwgZGlyZW50Lm5hbWUsICdzcmMnKTtcbiAgICAgIGlmIChjb25maWdGaWxlICYmIGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgICAgICBwcm9qZWN0cy5wdXNoKFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyLCB1bmRlZmluZWRdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29yZU91dERpciA9IG91dERpclBhdGg7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgY29yZU91dERpciwgaW5wdXRzXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIsIHByb2plY3RJbnB1dHNdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBhd2FpdCBydW5Uc2dvKGFyZ3YsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIsIHByb2plY3RJbnB1dHMpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRzZ28oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nLFxuICBpbnB1dHM/OiBzdHJpbmdbXVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ3J1blRzZ28oKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIsIGlucHV0cyk7XG4gIH1cblxuICAvLyBUaGUgdGVtcG9yYXJ5IGNvbmZpZyBtdXN0IGxpdmUgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5IHNvIHRoYXQgaXRzIHJlbGF0aXZlIGByb290RGlyYCBhbmRcbiAgLy8gYGluY2x1ZGVgIHJlc29sdmUgYWdhaW5zdCB0aGUgcHJvamVjdCBldmVuIHdoZW4gdGhlIGV4dGVuZGVkIHRzY29uZmlnIGlzIGluIGFuIGFuY2VzdG9yIGRpcmVjdG9yeS5cbiAgY29uc3QgdGVtcENvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsIGAuYnVpbGQtdHMtdHNnby4ke3Byb2Nlc3MucGlkfS5qc29uYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgdGVtcENvbmZpZ0ZpbGUsXG4gICAgICBKU09OLnN0cmluZ2lmeShhd2FpdCBjcmVhdGVUeXBlU2NyaXB0TmF0aXZlQ29uZmlnKHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIsIGlucHV0cyksIHVuZGVmaW5lZCwgMilcbiAgICApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHByb2Nlc3MuZXhlY1BhdGgsIFtnZXRUc2dvUGF0aCgpLCAnLXAnLCB0ZW1wQ29uZmlnRmlsZV0sIHtcbiAgICAgIGN3ZDogcHJvamVjdERpclBhdGgsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuZXJyb3IpIHRocm93IHJldC5lcnJvcjtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA9PT0gMDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0ZW1wQ29uZmlnRmlsZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUeXBlU2NyaXB0TmF0aXZlQ29uZmlnKFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nLFxuICBpbnB1dHM/OiBzdHJpbmdbXVxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBjb21waWxlck9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIC8vIEFuIGluaGVyaXRlZCBgY29tcG9zaXRlYCB3b3VsZCByZXF1aXJlIGxpc3RpbmcgZXZlcnkgaW1wb3J0ZWQgZmlsZSBleHBsaWNpdGx5IChUUzYzMDcpIGFuZCxcbiAgICAvLyBsaWtlIGBpbmNyZW1lbnRhbGAsIHdvdWxkIHdyaXRlIG5lZWRsZXNzIC50c2J1aWxkaW5mbyBmaWxlcyBmb3IgdGhpcyBvbmUtc2hvdCBjb21waWxhdGlvbi5cbiAgICBjb21wb3NpdGU6IGZhbHNlLFxuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIC8vIEFuIGluaGVyaXRlZCBgZGVjbGFyYXRpb25EaXJgIHdvdWxkIHNpbGVudGx5IHJlZGlyZWN0IHRoZSBvdXRwdXQgYXdheSBmcm9tIGBvdXREaXJgLlxuICAgIGRlY2xhcmF0aW9uRGlyOiBvdXREaXIsXG4gICAgZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcbiAgICBpbmNyZW1lbnRhbDogZmFsc2UsXG4gICAgbm9FbWl0OiBmYWxzZSxcbiAgICBub0VtaXRPbkVycm9yOiB0cnVlLFxuICAgIG91dERpcixcbiAgICAvLyBUeXBlU2NyaXB0IDcgcmVxdWlyZXMgYW4gZXhwbGljaXQgYHJvb3REaXJgIChUUzUwMTEpLiBFbnRyaWVzIGltcG9ydGluZyBmaWxlcyBvdXRzaWRlIHNyYy9cbiAgICAvLyAoZS5nLiBzaWJsaW5nIHBhY2thZ2VzIGluIGRlY2xhcmF0aW9uLW9ubHkgbW9kZSkgZmFpbCB3aXRoIFRTNjA1OTsgc2VlIHRoZSBSRUFETUUgbGltaXRhdGlvbi5cbiAgICByb290RGlyOiAnc3JjJyxcbiAgfTtcbiAgaWYgKGF3YWl0IHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQocGF0aC5qb2luKHByb2plY3REaXJQYXRoLCAnc3JjJykpKSB7XG4gICAgY29uc3QgdHlwZXNEaXJQYXRoID0gZmluZFR5cGVzRGlyUGF0aChwcm9qZWN0RGlyUGF0aCk7XG4gICAgY29uc3QgdHlwZXMgPSB0eXBlc0RpclBhdGggPyBhd2FpdCBjb2xsZWN0VHlwZVBhY2thZ2VzKHR5cGVzRGlyUGF0aCkgOiBbXTtcbiAgICBpZiAodHlwZXMuaW5jbHVkZXMoJ25vZGUnKSkge1xuICAgICAgY29tcGlsZXJPcHRpb25zLnR5cGVzID0gdHlwZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY29tcGlsZXJPcHRpb25zLFxuICAgIGV4dGVuZHM6IHRvUmVsYXRpdmVDb25maWdQYXRoKHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlKSxcbiAgICAvLyBXaXRoIGBmaWxlc2AsIHRzYyBhbHNvIGVtaXRzIGRlY2xhcmF0aW9ucyBmb3IgZmlsZXMgdHJhbnNpdGl2ZWx5IGltcG9ydGVkIGZyb20gdGhlIGVudHJpZXMsXG4gICAgLy8gc28gdGhlIG91dHB1dCBpcyByZXN0cmljdGVkIHRvIHdoYXQgdGhlIGJ1bmRsZWQgSmF2YVNjcmlwdCBhY3R1YWxseSBjb250YWlucy4gYGluY2x1ZGVgIG11c3QgYmVcbiAgICAvLyBvdmVycmlkZGVuIHNpbmNlIGFuIGluaGVyaXRlZCBgaW5jbHVkZWAgd291bGQgYWRkIGZpbGVzIGJhY2sgdG8gdGhlIHByb2dyYW07IG9ubHkgYW1iaWVudFxuICAgIC8vIGRlY2xhcmF0aW9uIGZpbGVzIGFyZSBrZXB0IGJlY2F1c2UgZW50cmllcyBtYXkgcmVseSBvbiB0aGVpciBnbG9iYWwgdHlwZXMgd2l0aG91dCBpbXBvcnRpbmcgdGhlbS5cbiAgICAuLi4oaW5wdXRzPy5sZW5ndGhcbiAgICAgID8ge1xuICAgICAgICAgIGV4Y2x1ZGU6IFtdLFxuICAgICAgICAgIGZpbGVzOiBpbnB1dHMubWFwKChpbnB1dCkgPT4gcGF0aC5yZXNvbHZlKHByb2plY3REaXJQYXRoLCBpbnB1dCkucmVwbGFjZUFsbChwYXRoLnNlcCwgJy8nKSksXG4gICAgICAgICAgaW5jbHVkZTogWydzcmMvKiovKi5kLnRzJywgJ3NyYy8qKi8qLmQubXRzJywgJ3NyYy8qKi8qLmQuY3RzJ10sXG4gICAgICAgIH1cbiAgICAgIDogeyBpbmNsdWRlOiBbJ3NyYy8qKi8qJ10gfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRDb25maWdGaWxlKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSByZXR1cm4gY29uZmlnRmlsZTtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50RGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHNnb1BhdGgoKTogc3RyaW5nIHtcbiAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgKGZvcm1lcmx5IGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2ApIGFzXG4gIC8vIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSwgd2hvc2UgYGxpYi90c2MuanNgIHdyYXBwZXIgc3Bhd25zIHRoZSBwbGF0Zm9ybSBiaW5hcnkuXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgndHlwZXNjcmlwdC9wYWNrYWdlLmpzb24nKTtcbiAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgJ2xpYicsICd0c2MuanMnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXNlc05vZGVQcm90b2NvbEltcG9ydChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBpZiAoYXdhaXQgdXNlc05vZGVQcm90b2NvbEltcG9ydChjaGlsZFBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoL1xcLltjbV0/dHN4PyQvLnRlc3QoZGlyZW50Lm5hbWUpICYmIChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjaGlsZFBhdGgsICd1dGY4JykpLmluY2x1ZGVzKCdub2RlOicpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZmluZFR5cGVzRGlyUGF0aChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgdHlwZXNEaXJQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ0B0eXBlcycpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHR5cGVzRGlyUGF0aCkpIHJldHVybiB0eXBlc0RpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3VycmVudERpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RUeXBlUGFja2FnZXModHlwZVJvb3RzRGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHR5cGVSb290c0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZGlyZW50cy5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRGlyZWN0b3J5KCkpLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vLyBgdG9GaWxlUGF0aGAgaXMgYWx3YXlzIGEgdHNjb25maWcgaW4gYGZyb21EaXJQYXRoYCBvciBvbmUgb2YgaXRzIGFuY2VzdG9yIGRpcmVjdG9yaWVzLCBzbyB0aGVcbi8vIHJlc3VsdCBpcyBhbHdheXMgcmVsYXRpdmUgKGAuL2Agb3IgYC4uL2AgY2hhaW5zKTsgYSBjcm9zcy1kcml2ZSBhYnNvbHV0ZSByZXN1bHQgaXMgaW1wb3NzaWJsZS5cbmZ1bmN0aW9uIHRvUmVsYXRpdmVDb25maWdQYXRoKGZyb21EaXJQYXRoOiBzdHJpbmcsIHRvRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZnJvbURpclBhdGgsIHRvRmlsZVBhdGgpLnJlcGxhY2VBbGwocGF0aC5zZXAsICcvJyk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzdHlsZVRleHQgfSBmcm9tICdub2RlOnV0aWwnO1xuXG5pbXBvcnQgeyByb2xsZG93biwgd2F0Y2ggfSBmcm9tICdyb2xsZG93bic7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFJvbGxkb3duQnVpbGQsIFJvbGxkb3duT3B0aW9ucyB9IGZyb20gJ3JvbGxkb3duJztcbmltcG9ydCB7IG9uRXhpdCB9IGZyb20gJ3NpZ25hbC1leGl0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24sIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldENhdGVnb3J5LCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbGxUYXJnZXRDYXRlZ29yaWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZVRpbWUsIGZvcm1hdER1cmF0aW9uLCBnZXROYW1lc3BhY2UsIHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSwgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBhcHBCdWlsZGVyLCBmdW5jdGlvbnNCdWlsZGVyLCBsaWJCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGhhbmRsZUVycm9yIH0gZnJvbSAnLi9idW5kbGVyTG9nZ2VyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUV4dGVybmFsTWF0Y2hlciB9IGZyb20gJy4vZXh0ZXJuYWxzLmpzJztcbmltcG9ydCB7IHNldHVwUGx1Z2lucyB9IGZyb20gJy4vcGx1Z2luLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbi8vIE9ubHkgdGhlIG9wdGlvbnMgdGhlIGJ1bmRsZXIgaXMgYWN0dWFsbHkgZ2l2ZW46IGl0cyByZW1haW5pbmcgZGVmYXVsdHMgYXJlIHBsYXRmb3JtLWRlcGVuZGVudCwgc29cbi8vIHBpbm5pbmcgdGhlbSBoZXJlIHdvdWxkIGNoYW5nZSB3aGljaCBzb3VyY2UgZ2V0cyBidW5kbGVkLlxuY29uc3QgYnVuZGxlclJlc29sdmVPcHRpb25zID0ge1xuICBleHRlbnNpb25BbGlhczoge1xuICAgICcuY2pzJzogWycuY2pzJywgJy5jdHMnXSxcbiAgICAnLmpzJzogWycuanMnLCAnLnRzJywgJy50c3gnXSxcbiAgICAnLmpzeCc6IFsnLmpzeCcsICcudHMnLCAnLnRzeCddLFxuICAgICcubWpzJzogWycubWpzJywgJy5tdHMnXSxcbiAgfSxcbiAgZXh0ZW5zaW9uczogWycuY3RzJywgJy5tdHMnLCAnLnRzJywgJy50c3gnLCAnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJ10sXG59O1xuXG5leHBvcnQgY29uc3QgYXBwOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGFwcEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2FwcCBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGFuIGFwcCcsXG4gIGJ1aWxkZXI6IGFwcEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnYXBwJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2Z1bmN0aW9ucyBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgR0NQL0ZpcmViYXNlIGZ1bmN0aW9ucyBhcHAnLFxuICBidWlsZGVyOiBmdW5jdGlvbnNCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5vbmx5UGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICAgICAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgIGlmICghcGFja2FnZUpzb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhcbiAgICAgICAgcmVzb2x2ZU91dERpclBhdGgoYXJndiwgcHJvY2Vzcy5jd2QoKSwgcGFja2FnZURpclBhdGgsIHVuZGVmaW5lZCwgJ2Z1bmN0aW9ucycpLFxuICAgICAgICBwYWNrYWdlSnNvbixcbiAgICAgICAgYXJndi5tb2R1bGVUeXBlXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2Z1bmN0aW9ucycpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBsaWI6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgbGliQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGliIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBOb2RlLmpzIC8gUmVhY3QgbGlicmFyeScsXG4gIGJ1aWxkZXI6IGxpYkJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnbGliJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGQoYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sIHRhcmdldENhdGVnb3J5OiBUYXJnZXRDYXRlZ29yeSk6IFByb21pc2U8dm9pZD4ge1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViB8fD0gJ3Byb2R1Y3Rpb24nO1xuXG4gIC8vIGBzaWxlbnRgIGlzIHN0cm9uZ2VyIHRoYW4gYHZlcmJvc2VgLlxuICBjb25zdCB2ZXJib3NlID0gIWFyZ3Yuc2lsZW50ICYmIGFyZ3YudmVyYm9zZTtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxuICBjb25zdCBwYWNrYWdlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShhcmd2LnBhY2thZ2U/LnRvU3RyaW5nKCkgPz8gJy4nKTtcbiAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBwYWNrYWdlLmpzb24gKCR7cGFja2FnZUpzb25QYXRofSkuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcblxuICBjb25zdCBpbnB1dHMgPSB2ZXJpZnlJbnB1dChhcmd2LCBjd2QsIHBhY2thZ2VEaXJQYXRoKTtcbiAgY29uc3QgdGFyZ2V0RGV0YWlsID0gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5LCBpbnB1dHMsIHBhY2thZ2VEaXJQYXRoKTtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHJlc29sdmVPdXREaXJQYXRoKGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgsIGlucHV0cywgdGFyZ2V0Q2F0ZWdvcnkpO1xuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdhcmd2OicsIGFyZ3YpO1xuICAgIGNvbnNvbGUuaW5mbygncGFja2FnZUpzb25QYXRoOicsIHBhY2thZ2VKc29uUGF0aCk7XG4gICAgY29uc29sZS5pbmZvKCdUYXJnZXQgKENhdGVnb3J5KTonLCBgJHt0YXJnZXREZXRhaWx9ICgke3RhcmdldENhdGVnb3J5fSlgKTtcbiAgfVxuXG4gIGNvbnN0IG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShwYWNrYWdlSnNvbik7XG4gIGNvbnN0IGlzRXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVkVSQk9TRSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkgPSB0YXJnZXRDYXRlZ29yeTtcbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0RFVEFJTCA9IHRhcmdldERldGFpbDtcblxuICBjb25zdCBkZWNsYXJhdGlvbk9ubHkgPSAnZGVjbGFyYXRpb25Pbmx5JyBpbiBhcmd2ICYmIGFyZ3YuZGVjbGFyYXRpb25Pbmx5O1xuICBpZiAoZGVjbGFyYXRpb25Pbmx5ICYmIGFyZ3Yud2F0Y2gpIHtcbiAgICBjb25zb2xlLmVycm9yKCctLWRlY2xhcmF0aW9uLW9ubHkgY2Fubm90IGJlIHVzZWQgd2l0aCAtLXdhdGNoLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0ID0gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoYXJndiwgdGFyZ2V0RGV0YWlsLCBvdXREaXJQYXRoLCBpc0VzbVBhY2thZ2UsIHBhY2thZ2VEaXJQYXRoKTtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ091dHB1dE9wdGlvbnM6Jywgb3V0cHV0T3B0aW9uc0xpc3QpO1xuICB9XG4gIGlmIChvdXRwdXRPcHRpb25zTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IG91dHB1dCBmaWxlcy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyBSZXN0cmljdHMgZGVjbGFyYXRpb25zIHRvIHRoZSBlbnRyeSBmaWxlcyAoYW5kIHRoZWlyIGltcG9ydHMpIG9ubHkgd2hlbiBpbnB1dHMgYXJlIGV4cGxpY2l0LCBzb1xuICAvLyB0aGF0IHRoZSBkZWZhdWx0IGtlZXBzIGVtaXR0aW5nIGRlY2xhcmF0aW9ucyBmb3IgZXZlcnkgZmlsZSB1bmRlciBzcmMvLlxuICBjb25zdCBkZWNsYXJhdGlvbklucHV0cyA9IGFyZ3YuaW5wdXQ/Lmxlbmd0aCA/IGlucHV0cyA6IHVuZGVmaW5lZDtcblxuICBwcm9jZXNzLmNoZGlyKHBhY2thZ2VEaXJQYXRoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMob3V0RGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gIH1cblxuICBpZiAoZGVjbGFyYXRpb25Pbmx5KSB7XG4gICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBzdHlsZVRleHQoXG4gICAgICAgICAgJ2N5YW4nLFxuICAgICAgICAgIGBHZW5lcmF0ZXMgZGVjbGFyYXRpb24gZmlsZXMg4oaSICR7c3R5bGVUZXh0KCdib2xkJywgcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgb3V0RGlyUGF0aCkpfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoLCBvdXREaXJQYXRoLCBkZWNsYXJhdGlvbklucHV0cykpKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFJvbGxkb3duT3B0aW9ucyA9IHtcbiAgICBjaGVja3M6IHsgcHJlZmVyQnVpbHRpbkZlYXR1cmU6IGZhbHNlIH0sXG4gICAgZXh0ZXJuYWw6IGNyZWF0ZUV4dGVybmFsTWF0Y2hlcihhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICBpbnB1dDpcbiAgICAgIHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycgPyBjcmVhdGVGdW5jdGlvbnNJbnB1dEVudHJpZXMoaW5wdXRzKSA6IGlucHV0cyxcbiAgICBwbHVnaW5zOiBzZXR1cFBsdWdpbnMoKSxcbiAgICByZXNvbHZlOiBidW5kbGVyUmVzb2x2ZU9wdGlvbnMsXG4gICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm1PcHRpb25zKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB3YXRjaDogYXJndi53YXRjaCA/IHsgY2xlYXJTY3JlZW46IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgY29uc3QgcGF0aFRvUmVsYXRpdmVQYXRoID0gKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pOiBzdHJpbmdbXSA9PlxuICAgIChBcnJheS5pc0FycmF5KHBhdGhzKSA/IHBhdGhzIDogW3BhdGhzXSkubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwKSk7XG4gIGNvbnN0IHByaW50QnVuZGxpbmdNZXNzYWdlID0gKGlucHV0UGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gcGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSk7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAnY3lhbicsXG4gICAgICAgIGBCdW5kbGVzICR7c3R5bGVUZXh0KCdib2xkJywgcGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0UGF0aHMpLmpvaW4oJywgJykpfSDihpIgJHtzdHlsZVRleHQoXG4gICAgICAgICAgJ2JvbGQnLFxuICAgICAgICAgIG91dHB1dFBhdGhzLmpvaW4oJywgJylcbiAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICApXG4gICAgKTtcbiAgfTtcbiAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICB3YXRjaFJvbGxkb3duKFxuICAgICAgYXJndixcbiAgICAgIHRhcmdldERldGFpbCxcbiAgICAgIHBhY2thZ2VEaXJQYXRoLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIGRlY2xhcmF0aW9uSW5wdXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG91dHB1dE9wdGlvbnNMaXN0LFxuICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoLFxuICAgICAgcHJpbnRCdW5kbGluZ01lc3NhZ2VcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIHByaW50QnVuZGxpbmdNZXNzYWdlKGlucHV0cyk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbGRvd25CdWlsZCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnVpbGRGYWlsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IF9idW5kbGUgPSBhd2FpdCByb2xsZG93bihvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAgICAgJ2dyZWVuJyxcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtzdHlsZVRleHQoJ2JvbGQnLCBmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmICh0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiYgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJykge1xuICAgICAgaWYgKCEoYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoLCBvdXREaXJQYXRoLCBkZWNsYXJhdGlvbklucHV0cykpKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtT3B0aW9ucyhhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFJvbGxkb3duT3B0aW9uc1sndHJhbnNmb3JtJ10ge1xuICByZXR1cm4ge1xuICAgIGRlZmluZTogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIHRhcmdldDogJ2VzMjAyMicsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbGRvd24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICBkZWNsYXJhdGlvbklucHV0czogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFJvbGxkb3duT3B0aW9ucyxcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSxcbiAgcGF0aFRvUmVsYXRpdmVQYXRoOiAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPikgPT4gc3RyaW5nW10sXG4gIHByaW50QnVuZGxpbmdNZXNzYWdlOiAoaW5wdXRQYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlPzogbnVtYmVyIHwgbnVsbCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2VPblVuY2F1Z2h0RXhjZXB0aW9uKTtcbiAgICBwcm9jZXNzLnN0ZGluLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbG9zZU9uU3RkaW5FbmQpO1xuICAgIGF3YWl0IHdhdGNoZXIuY2xvc2UoKTtcbiAgICBpZiAoY29kZSkgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICB9O1xuICBjb25zdCBjbG9zZU9uVW5jYXVnaHRFeGNlcHRpb24gPSAoZXJyb3I6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB2b2lkIGNsb3NlKDEpO1xuICB9O1xuICBjb25zdCBjbG9zZU9uU3RkaW5FbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgdm9pZCBjbG9zZSgpO1xuICB9O1xuICBvbkV4aXQoKGNvZGUpID0+IHZvaWQgY2xvc2UoY29kZSkpO1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlT25VbmNhdWdodEV4Y2VwdGlvbik7XG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHByb2Nlc3Muc3RkaW4ub24oJ2VuZCcsIGNsb3NlT25TdGRpbkVuZCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihldmVudC5lcnJvciwgdHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQlVORExFX1NUQVJUJzoge1xuICAgICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgICBwcmludEJ1bmRsaW5nTWVzc2FnZShnZXRJbnB1dEZpbGVzKG9wdGlvbnMuaW5wdXQpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCVU5ETEVfRU5EJzoge1xuICAgICAgICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAgICAgICAgICdncmVlbicsXG4gICAgICAgICAgICAgICAgYENyZWF0ZWQgJHtzdHlsZVRleHQoJ2JvbGQnLCBwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpKX0gaW4gJHtzdHlsZVRleHQoXG4gICAgICAgICAgICAgICAgICAnYm9sZCcsXG4gICAgICAgICAgICAgICAgICBmb3JtYXREdXJhdGlvbihldmVudC5kdXJhdGlvbilcbiAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycpIHtcbiAgICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCwgb3V0RGlyUGF0aCwgZGVjbGFyYXRpb25JbnB1dHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdFTkQnOiB7XG4gICAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuWyR7Zm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gS2VlcCB0aGUgd2F0Y2hlciBhbGl2ZSBldmVuIGlmIGhhbmRsaW5nIGFuIGV2ZW50IChlLmcuIGRlY2xhcmF0aW9uIGZpbGUgZ2VuZXJhdGlvbikgZmFpbHMuXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaGFuZGxlIHdhdGNoIGV2ZW50IGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgICAgdm9pZCBldmVudC5yZXN1bHQuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlT3V0RGlyUGF0aChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGN3ZDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBpbnB1dHM/OiBzdHJpbmdbXSxcbiAgdGFyZ2V0Q2F0ZWdvcnk/OiBUYXJnZXRDYXRlZ29yeVxuKTogc3RyaW5nIHtcbiAgY29uc3Qgb3V0RGlyT3B0aW9uID0gYXJndi5vdXREaXI/LnRvU3RyaW5nKCk7XG4gIGlmIChvdXREaXJPcHRpb24gPT09ICcnKSB7XG4gICAgY29uc29sZS5lcnJvcignLS1vdXQtZGlyIG11c3Qgbm90IGJlIGVtcHR5LicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIFRoZSBvdXRwdXQgZGlyZWN0b3J5IGlzIHJlbW92ZWQgYmVmb3JlIGJ1aWxkaW5nLCBzbyByZWZ1c2UgbG9jYXRpb25zIHRoYXQgd291bGQgZGVsZXRlIHNvdXJjZVxuICAvLyBmaWxlcy4gQ29udGFpbm1lbnQgaXMgY2hlY2tlZCBvbiBib3RoIHRoZSBsZXhpY2FsIGFuZCB0aGUgY2Fub25pY2FsIChzeW1saW5rLXJlc29sdmVkKSBmb3JtLCBhbmRcbiAgLy8gYm90aCBhcmUgbG9hZC1iZWFyaW5nOiB0aGUgY2Fub25pY2FsIG9uZSBjYXRjaGVzIGEgc3ltbGlua2VkIG9yIGNhc2UtdmFyaWFudCBwYXJlbnQgY29tcG9uZW50XG4gIC8vIChgZnMucm1gIGZvbGxvd3MgdGhvc2UpLCB3aGlsZSB0aGUgbGV4aWNhbCBvbmUgY2F0Y2hlcyBhbiBvdXRwdXQgcGF0aCB0aGF0IGlzIGl0c2VsZiBhIHN5bWxpbmtcbiAgLy8gc2l0dGluZyBpbnNpZGUgYSBwcm90ZWN0ZWQgZGlyZWN0b3J5LiBUaGUgbGV4aWNhbCBwYXRoIGlzIHJldHVybmVkIHNvIHRoYXQgcmVtb3ZpbmcgYSBzeW1saW5rZWRcbiAgLy8gb3V0cHV0IGRpcmVjdG9yeSBkZWxldGVzIHRoZSBsaW5rIGl0c2VsZiByYXRoZXIgdGhhbiBpdHMgdGFyZ2V0J3MgY29udGVudHMuXG4gIGNvbnN0IGxleGljYWxPdXREaXJQYXRoID0gb3V0RGlyT3B0aW9uID8gcGF0aC5yZXNvbHZlKGN3ZCwgb3V0RGlyT3B0aW9uKSA6IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKTtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHRvQ2Fub25pY2FsUGF0aChsZXhpY2FsT3V0RGlyUGF0aCk7XG4gIC8vIFRoZSBkZWZhdWx0IGBkaXN0YCBpcyBjaGVja2VkIHRvbywgc2luY2UgYW4gaW5wdXQgbWF5IGJlIGdpdmVuIGluc2lkZSBpdCwgYW5kIGFuIGlucHV0IG1heSBzaXRcbiAgLy8gb3V0c2lkZSBgc3JjYCAoZS5nLiBgLS1pbnB1dCBzY3JpcHRzL21haW4udHNgKS5cbiAgY29uc3QgY29udGFpbmVkSW5wdXQgPSBpbnB1dHM/LmZpbmQoXG4gICAgKGlucHV0KSA9PiBjb250YWluc1BhdGgob3V0RGlyUGF0aCwgdG9DYW5vbmljYWxQYXRoKGlucHV0KSkgfHwgY29udGFpbnNQYXRoKGxleGljYWxPdXREaXJQYXRoLCBpbnB1dClcbiAgKTtcbiAgaWYgKGNvbnRhaW5lZElucHV0KSB7XG4gICAgY29uc29sZS5lcnJvcihgVGhlIG91dHB1dCBkaXJlY3RvcnkgKCR7b3V0RGlyUGF0aH0pIG11c3Qgbm90IGNvbnRhaW4gdGhlIGlucHV0IGZpbGUgKCR7Y29udGFpbmVkSW5wdXR9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgaWYgKCFvdXREaXJPcHRpb24pIHJldHVybiBsZXhpY2FsT3V0RGlyUGF0aDtcblxuICBjb25zdCBjYW5vbmljYWxQYWNrYWdlRGlyUGF0aCA9IHRvQ2Fub25pY2FsUGF0aChwYWNrYWdlRGlyUGF0aCk7XG4gIGlmIChjb250YWluc1BhdGgob3V0RGlyUGF0aCwgY2Fub25pY2FsUGFja2FnZURpclBhdGgpIHx8IGNvbnRhaW5zUGF0aChsZXhpY2FsT3V0RGlyUGF0aCwgcGFja2FnZURpclBhdGgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgLS1vdXQtZGlyICgke291dERpclBhdGh9KSBtdXN0IG5vdCBjb250YWluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAoJHtjYW5vbmljYWxQYWNrYWdlRGlyUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyBgc3JjYCBpdHNlbGYgbWF5IGJlIGEgc3ltbGluaywgc28gaXQgbmVlZHMgaXRzIG93biBjYW5vbmljYWxpemF0aW9uLlxuICBjb25zdCBzcmNEaXJQYXRoID0gdG9DYW5vbmljYWxQYXRoKHBhdGguam9pbihjYW5vbmljYWxQYWNrYWdlRGlyUGF0aCwgJ3NyYycpKTtcbiAgaWYgKGNvbnRhaW5zUGF0aChzcmNEaXJQYXRoLCBvdXREaXJQYXRoKSB8fCBjb250YWluc1BhdGgocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyksIGxleGljYWxPdXREaXJQYXRoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYC0tb3V0LWRpciAoJHtvdXREaXJQYXRofSkgbXVzdCBub3QgYmUgaW5zaWRlIHRoZSBzb3VyY2UgZGlyZWN0b3J5ICgke3NyY0RpclBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgLy8gQSBwYWNrYWdlLmpzb24gYXQgdGhlIG91dHB1dCBkaXJlY3Rvcnkgcm9vdCBpbmRpY2F0ZXMgYW5vdGhlciBwYWNrYWdlJ3MgZGlyZWN0b3J5LiBUaGUgZnVuY3Rpb25zXG4gIC8vIHRhcmdldCBpcyBleGVtcHQgYmVjYXVzZSBpdCBnZW5lcmF0ZXMgYSBwYWNrYWdlLmpzb24gdGhlcmUgaXRzZWxmLlxuICBpZiAodGFyZ2V0Q2F0ZWdvcnkgIT09ICdmdW5jdGlvbnMnICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKG91dERpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zb2xlLmVycm9yKGAtLW91dC1kaXIgKCR7b3V0RGlyUGF0aH0pIGNvbnRhaW5zIGEgcGFja2FnZS5qc29uLCBzbyBpdCBsb29rcyBsaWtlIGEgcGFja2FnZSBkaXJlY3RvcnkuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBsZXhpY2FsT3V0RGlyUGF0aDtcbn1cblxuLy8gUmVzb2x2ZXMgc3ltbGlua3MgKGFuZCBjYXNlIHZhcmlhbnRzKSBpbiB0aGUgbG9uZ2VzdCBleGlzdGluZyBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gcGF0aCwga2VlcGluZ1xuLy8gdGhlIG5vbi1leGlzdGVudCB0YWlsLCBzbyB0aGF0IGEgbm90LXlldC1jcmVhdGVkIG91dHB1dCBkaXJlY3RvcnkgaXMgc3RpbGwgY29tcGFyZWQgY29ycmVjdGx5LlxuZnVuY3Rpb24gdG9DYW5vbmljYWxQYXRoKHRhcmdldFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN1ZmZpeGVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudFBhdGggPSB0YXJnZXRQYXRoO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMoY3VycmVudFBhdGgpKSB7XG4gICAgc3VmZml4ZXMudW5zaGlmdChwYXRoLmJhc2VuYW1lKGN1cnJlbnRQYXRoKSk7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKHBhcmVudFBhdGggPT09IGN1cnJlbnRQYXRoKSBicmVhaztcbiAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gIH1cbiAgdHJ5IHtcbiAgICBjdXJyZW50UGF0aCA9IGZzLnJlYWxwYXRoU3luYy5uYXRpdmUoY3VycmVudFBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBLZWVwIHRoZSBvcmlnaW5hbCBwYXRoIHdoZW4gaXQgY2Fubm90IGJlIHJlc29sdmVkIChlLmcuIHJlbW92ZWQgY29uY3VycmVudGx5KS5cbiAgfVxuICByZXR1cm4gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAuLi5zdWZmaXhlcyk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zUGF0aChwYXJlbnRQYXRoOiBzdHJpbmcsIGNoaWxkUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGFyZW50UGF0aCwgY2hpbGRQYXRoKTtcbiAgaWYgKHJlbGF0aXZlUGF0aCA9PT0gJycpIHJldHVybiB0cnVlO1xuICBpZiAocGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgLy8gT25seSBhbiBhY3R1YWwgYC4uYCBzZWdtZW50IG1lYW5zIFwib3V0c2lkZVwiOyBhIGNoaWxkIG5hbWUgbGlrZSBgLi5mb29gIGFsc28gc3RhcnRzIHdpdGggYC4uYC5cbiAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoYC4uJHtwYXRoLnNlcH1gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25zSW5wdXRFbnRyaWVzKGlucHV0czogc3RyaW5nW10pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBpbnB1dF0gb2YgaW5wdXRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IG5hbWUgPSBpbmRleCA9PT0gMCA/ICdpbmRleCcgOiBwYXRoLmJhc2VuYW1lKGlucHV0LCBwYXRoLmV4dG5hbWUoaW5wdXQpKTtcbiAgICBjb25zdCBjb25mbGljdGluZyA9IGVudHJpZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChjb25mbGljdGluZykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVudHJ5IG5hbWVzIGNvbmZsaWN0IGluIHRoZSBmdW5jdGlvbnMgYnVpbGQ6IFwiJHtuYW1lfVwiICgke2NvbmZsaWN0aW5nfSB2cyAke2lucHV0fSkuIExpc3QgLS1pbnB1dCBmaWxlcyBleHBsaWNpdGx5IHdpdGggdW5pcXVlIGJhc2UgbmFtZXMsIGtlZXBpbmcgdGhlIG1haW4gZW50cnkgZmlyc3QuYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgZW50cmllcy5zZXQobmFtZSwgaW5wdXQpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59XG5cbmZ1bmN0aW9uIGdldElucHV0RmlsZXMoaW5wdXQ6IFJvbGxkb3duT3B0aW9uc1snaW5wdXQnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIFtdO1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgcmV0dXJuIFtpbnB1dF07XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IGlucHV0IDogT2JqZWN0LnZhbHVlcyhpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUlucHV0KGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBjd2Q6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3YuaW5wdXQgJiYgYXJndi5pbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgaW5wdXRzID0gYXJndi5pbnB1dC5mbGF0TWFwKChwKSA9PiB7XG4gICAgICBjb25zdCByYXcgPSBwLnRvU3RyaW5nKCk7XG4gICAgICBpZiAoIWlzR2xvYlBhdHRlcm4ocmF3KSkgcmV0dXJuIFtwYXRoLnJlc29sdmUoY3dkLCByYXcpXTtcblxuICAgICAgLy8gYGZzLmdsb2JTeW5jYCByZXF1aXJlcyBcIi9cIiBhcyB0aGUgc2VwYXJhdG9yIGV2ZW4gb24gV2luZG93cyAoYSBuby1vcCBvbiBQT1NJWCkuXG4gICAgICAvLyBBbWJpZW50IGRlY2xhcmF0aW9uIGZpbGVzIGFsd2F5cyBwYXJ0aWNpcGF0ZSBpbiB0eXBlIGNoZWNraW5nLCBzbyB0aGV5IG11c3Qgbm90IGJlY29tZSBlbnRyaWVzLlxuICAgICAgLy8gYHRocm93SWZOb0VudHJ5OiBmYWxzZWAgc2tpcHMgYSBicm9rZW4gc3ltbGluayBpbnN0ZWFkIG9mIGNyYXNoaW5nLlxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGZzXG4gICAgICAgIC5nbG9iU3luYyhyYXcuc3BsaXQocGF0aC5zZXApLmpvaW4oJy8nKSwgeyBjd2QgfSlcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAobSkgPT4gIS9cXC5kXFwuW2NtXT90cyQvLnRlc3QobSkgJiYgZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGN3ZCwgbSksIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pPy5pc0ZpbGUoKVxuICAgICAgICApXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLm1hcCgobSkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgbSkpO1xuICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE5vIGZpbGVzIG1hdGNoZWQgdGhlIGlucHV0IHBhdHRlcm46ICR7cmF3fWApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9KTtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoaW5wdXRzKV07XG4gIH1cblxuICBjb25zdCBzcmNEaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyk7XG4gIGZvciAoY29uc3QgZXh0IG9mIFsndHMnLCAndHN4JywgJ2N0cycsICdtdHMnXSkge1xuICAgIGNvbnN0IGlucHV0ID0gcGF0aC5qb2luKHNyY0RpclBhdGgsIGBpbmRleC4ke2V4dH1gKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhpbnB1dCkpIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRldGVjdCBpbnB1dCBmaWxlLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbi8vIE9ubHkgcmVhbCBnbG9iIHN5bnRheCBjb3VudHMgYXMgYSBwYXR0ZXJuOiBcIipcIiwgXCI/XCIsIGEgXCJbLi4uXVwiIGNsYXNzLCBvciBhIFwie2EsYn1cIiBhbHRlcm5hdGlvbi5cbi8vIEEgYmFyZSBcIitcIiBvciBhIHNpbmdsZS1pdGVtIGJyYWNlIChcIntlbnRyeX1cIikgaXMgYW4gb3JkaW5hcnkgZmlsZW5hbWUgY2hhcmFjdGVyLlxuZnVuY3Rpb24gaXNHbG9iUGF0dGVybihpbnB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvWyo/XXxcXFtbXlxcXV0qXFxdfFxce1tefV0qLFtefV0qXFx9Ly50ZXN0KGlucHV0KTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5OiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10sIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBUYXJnZXREZXRhaWwge1xuICBzd2l0Y2ggKHRhcmdldENhdGVnb3J5KSB7XG4gICAgY2FzZSAnYXBwJzoge1xuICAgICAgcmV0dXJuICdhcHAtbm9kZSc7XG4gICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9ucyc6IHtcbiAgICAgIHJldHVybiAnZnVuY3Rpb25zJztcbiAgICB9XG4gICAgY2FzZSAnbGliJzoge1xuICAgICAgaWYgKGlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuZW5kc1dpdGgoJy50c3gnKSkgfHwgZG9lc1NyY0NvbnRhaW5Uc3gocGFja2FnZURpclBhdGgpKSB7XG4gICAgICAgIHJldHVybiAnbGliLXJlYWN0JztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnbGliJztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc29sZS5lcnJvcigndGFyZ2V0IG9wdGlvbiBtdXN0IGJlIG9uZSBvZjogJyArIGFsbFRhcmdldENhdGVnb3JpZXMuam9pbignLCAnKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRvZXNTcmNDb250YWluVHN4KHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICByZXR1cm4gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goc3JjRGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNEaXJlY3RvcnlDb250YWluVHN4KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGVudHJpZXMuc29tZSgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSByZXR1cm4gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goZW50cnlQYXRoKTtcbiAgICAgIHJldHVybiBlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCcudHN4Jyk7XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcGFja2FnZUpzb24ubmFtZSArPSAnLWRpc3QnO1xuICBjb25zdCBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gIGNvbnN0IGVzbU91dHB1dCA9IGlzRXNtT3V0cHV0KGVzbVBhY2thZ2UsIG1vZHVsZVR5cGUpO1xuICBwYWNrYWdlSnNvbi5tYWluID0gZXNtUGFja2FnZSA9PT0gZXNtT3V0cHV0ID8gJ2luZGV4LmpzJyA6IGVzbU91dHB1dCA/ICdpbmRleC5tanMnIDogJ2luZGV4LmNqcyc7XG5cbiAgLy8gUHJldmVudCBGaXJlYmFzZSBGdW5jdGlvbnMgZnJvbSBydW5uaW5nIGBidWlsZGAgc2NyaXB0IHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICAvLyBkZXZEZXBlbmRlbmNpZXMgYXJlIG5vdCByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuXG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKG91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKG91dERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW4sXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmdcbik6IE91dHB1dE9wdGlvbnNbXSB7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGNvbnN0IGVzbU91dHB1dCA9IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogZXNtT3V0cHV0ID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBtaW5pZnk6IGFyZ3YubWluaWZ5LFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgICBzdHJpY3Q6ICFlc21PdXRwdXQsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGltcG9ydCBzdGF0ZW1lbnQgaW4gYW4gZXNtIG1vZHVsZSBjYXVzZXMgdGhlIGZvbGxvd2luZyBlcnJvcjpcbiAgLy8gU3RhdGVtZW50OlxuICAvLyAgIGltcG9ydCB7IHVzZVByZXZpb3VzIH0gZnJvbSAncmVhY3QtdXNlJztcbiAgLy8gRXJyb3I6XG4gIC8vICAgTmFtZWQgZXhwb3J0ICd1c2VQcmV2aW91cycgbm90IGZvdW5kLiBUaGUgcmVxdWVzdGVkIG1vZHVsZSAncmVhY3QtdXNlJyBpcyBhIENvbW1vbkpTIG1vZHVsZSxcbiAgLy8gICB3aGljaCBtYXkgbm90IHN1cHBvcnQgYWxsIG1vZHVsZS5leHBvcnRzIGFzIG5hbWVkIGV4cG9ydHMuXG4gIC8vIFdlIG5lZWQgY2pzIG1vZHVsZXMgZm9yIHdlYiBhcHBzIHRvIGF2b2lkIHRoZSBlcnJvci5cbiAgLy8gQWxzbywgc3BsaXR0aW5nIGEgbGlicmFyeSBpcyB1c2VmdWwgaW4gYm90aCBtb2R1bGVzLCBzbyBwcmVzZXJ2ZU1vZHVsZXMgc2hvdWxkIGJlIHRydWUuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10gPSBbXTtcbiAgY29uc3QgbW9kdWxlVHlwZSA9IGFyZ3YubW9kdWxlVHlwZSB8fCAnYm90aCc7XG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS4gVG8gbGV0IGEgY2pzIHByb2plY3QgaW1wb3J0IGFuXG4gIC8vIGVzbSBwYWNrYWdlLCB0aGUgZm9ybWF0IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIHBhY2thZ2UgdHlwZSB1c2VzIC5janMgb3IgLm1qcyBpbnN0ZWFkIG9mIC5qcy5cbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdjanMnIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgIWlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBpc0VzbVBhY2thZ2UgPyAnW25hbWVdLmNqcycgOiAnW25hbWVdLmpzJyxcbiAgICAgIGZvcm1hdDogJ2NvbW1vbmpzJyxcbiAgICAgIG1pbmlmeTogYXJndi5taW5pZnksXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXNSb290OiBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdlc20nIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGlzRXNtUGFja2FnZSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5tanMnLFxuICAgICAgZm9ybWF0OiAnbW9kdWxlJyxcbiAgICAgIG1pbmlmeTogYXJndi5taW5pZnksXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXNSb290OiBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dE9wdGlvbnNMaXN0O1xufVxuXG5mdW5jdGlvbiBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2U6IGJvb2xlYW4sIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgKCghbW9kdWxlVHlwZSB8fCBtb2R1bGVUeXBlID09PSAnZWl0aGVyJykgJiYgaXNFc21QYWNrYWdlKTtcbn1cbiIsImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUgfSBmcm9tICcuLi9lbnYuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBydW46IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncnVuIDxmaWxlPicsXG4gIGRlc2NyaWJlOiAnUnVuIHNjcmlwdCcsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwcm9jZXNzLmN3ZCgpKTtcblxuICAgIGNvbnN0IGZpbGUgPSBhcmd2LmZpbGU/LnRvU3RyaW5nKCkgPz8gJyc7XG5cbiAgICAvLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICAgIGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW47XG4gICAgY29uc3QgcnVudGltZSA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAnbm9kZSc7XG4gICAgY29uc3QgYXJncyA9IGlzUnVubmluZ09uQnVuID8gWyctLWJ1biddIDogWyctLW5vLXdhcm5pbmdzJywgJy0taW1wb3J0JywgJ3RzeCddO1xuICAgIGlmIChhcmd2LndhdGNoKSB7XG4gICAgICBhcmdzLnB1c2goJy0td2F0Y2gnKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZpbGUpO1xuICAgIGNvbnN0IFssIC4uLmFkZGl0aW9uYWxBcmd1bWVudHNdID0gYXJndi5fO1xuICAgIGNvbnN0IHJ1bnRpbWVBcmdzID0gWy4uLmFyZ3MsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMubWFwKChhcmcpID0+IGFyZy50b1N0cmluZygpKV07XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nICcke3J1bnRpbWV9ICR7cnVudGltZUFyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocnVudGltZSwgcnVudGltZUFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGFwcCwgZnVuY3Rpb25zLCBsaWIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7IHJ1biB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBnZXRCdWlsZFRzUm9vdFBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxucmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnYnVpbGQtdHMnKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLmNvbW1hbmQoYXBwKVxuICAuY29tbWFuZChmdW5jdGlvbnMpXG4gIC5jb21tYW5kKGxpYilcbiAgLmNvbW1hbmQocnVuKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihnZXRCdWlsZFRzUm9vdFBhdGgoKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cbiJdLCJtYXBwaW5ncyI6IjZtQkFNQSxJQUFJLEVBS0osU0FBZ0IsRUFDZCxFQUNBLEVBQ29DLENBT3BDLE9BTkssSUFDSCxFQUFVLEVBQWlDLEVBQU0sQ0FBRyxFQUNoRCxFQUFLLFNBQ1AsUUFBUSxLQUFLLG1CQUFvQixPQUFPLEtBQUssQ0FBTyxDQUFDLEdBR2xELENBQ1QsQ0FLQSxTQUFnQixFQUNkLEVBQ0EsRUFDd0IsQ0FDeEIsSUFBTSxFQUFxQyxDQUFDLEVBQ3RDLEVBQWMsSUFBSSxJQUFJLENBQzFCLElBQUksRUFBSyxRQUFVLENBQUMsRUFBQSxDQUFHLFFBQVMsR0FBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzdELEdBQUksRUFBSyxXQUFhLE9BQU8sS0FBSyxFQUFrQyxFQUFNLENBQUcsQ0FBQyxFQUFJLENBQUMsQ0FDckYsQ0FBQyxFQUNELElBQUssSUFBTSxLQUFRLEVBQ2IsUUFBUSxJQUFJLEtBQVUsSUFBQSxLQUUxQixFQUFXLGVBQWUsS0FBVSxLQUFLLFVBQVUsUUFBUSxJQUFJLEVBQUssR0FLdEUsT0FISSxFQUFLLFNBQ1AsUUFBUSxLQUFLLG1CQUFvQixPQUFPLEtBQUssQ0FBVSxDQUFDLEVBRW5ELENBQ1QsQ0MzQ0EsTUFBYSxFQUFzQixDQUFDLE1BQU8sWUFBYSxLQUFLLEVDSTdELGVBQXNCLEVBQWdCLEVBQTZELENBQ2pHLElBQU0sRUFBa0IsRUFBSyxLQUFLLEVBQVMsY0FBYyxFQUN6RCxHQUFJLENBQ0YsSUFBTSxFQUFrQixNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQWlCLE1BQU0sRUFDMUUsTUFBTyxDQUFDLEtBQUssTUFBTSxDQUFlLEVBQWtCLENBQWUsQ0FDckUsTUFBUSxDQUVSLENBQ0EsTUFBTyxDQUFDLElBQUEsR0FBVyxDQUFlLENBQ3BDLENBRUEsU0FBZ0IsR0FBNkIsQ0FDM0MsT0FBTyxFQUFLLFFBQVEs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "build-ts",
3
- "version": "17.3.0",
3
+ "version": "18.0.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/WillBooster/build-ts.git"
@@ -38,9 +38,6 @@
38
38
  "@babel/preset-react": "8.0.1",
39
39
  "@babel/preset-typescript": "8.0.1",
40
40
  "@willbooster/shared-lib-node": "8.7.0",
41
- "babel-plugin-polyfill-corejs3": "1.0.0",
42
- "core-js": "3.49.0",
43
- "core-js-pure": "3.49.0",
44
41
  "magic-string": "0.30.21",
45
42
  "oxc-parser": "0.139.0",
46
43
  "rolldown": "1.1.5",