build-ts 17.2.0 → 17.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +18 -16
  2. package/dist/index.js +4 -4
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -73,22 +73,24 @@ npx build-ts run src/main.ts -- --foo bar
73
73
 
74
74
  ### Common build options (`app`, `functions`, and `lib`)
75
75
 
76
- | Option | Alias | Default | Description |
77
- | -------------------------------- | ----- | -------- | ----------------------------------------------------------------------------------------------------------- |
78
- | `--input` | `-i` | (auto) | Source files to build. The first file is the main entry. Defaults to `src/index.{ts,tsx,cts,mts}`. |
79
- | `--out-dir` | `-o` | `dist` | Output directory, resolved from the current directory (e.g., `../../dist/shared`). Removed before building. |
80
- | `--module-type` | `-m` | (varies) | Output module format: `esm`, `cjs`, `either` (follow `package.json`'s `type`), or `both` (`lib` only). |
81
- | `--minify` / `--no-minify` | | `true` | Enable/disable minification. |
82
- | `--sourcemap` / `--no-sourcemap` | | `true` | Enable/disable sourcemaps. |
83
- | `--watch` | `-w` | `false` | Rebuild on file changes. |
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
- | `--inline` | | | Names of environment variables to inline into the bundle. |
88
- | `--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
- | `--silent` | `-s` | `false` | Suppress non-error output. |
76
+ | Option | Alias | Default | Description |
77
+ | -------------------------------- | ----- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
78
+ | `--input` | `-i` | (auto) | Source files (or glob patterns like `src/**/*.ts`) to build. The first file is the main entry. Defaults to `src/index.{ts,tsx,cts,mts}`. |
79
+ | `--out-dir` | `-o` | `dist` | Output directory, resolved from the current directory (e.g., `../../dist/shared`). Removed before building. |
80
+ | `--module-type` | `-m` | (varies) | Output module format: `esm`, `cjs`, `either` (follow `package.json`'s `type`), or `both` (`lib` only). |
81
+ | `--minify` / `--no-minify` | | `true` | Enable/disable minification. |
82
+ | `--sourcemap` / `--no-sourcemap` | | `true` | Enable/disable sourcemaps. |
83
+ | `--watch` | `-w` | `false` | Rebuild on file changes. |
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
+ | `--inline` | | | Names of environment variables to inline into the bundle. |
88
+ | `--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
+ | `--silent` | `-s` | `false` | Suppress non-error output. |
92
+
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).
92
94
 
93
95
  ### `functions`-specific options
94
96
 
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
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 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 Wt(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=Bt(n,a,o),f=Vt(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=Gt(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 Wt(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`?Object.fromEntries(d.map((e,n)=>[n===0?`index`:t.basename(e,t.extname(e)),e])):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(zt(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(e){return e?typeof e==`string`?[e]:Array.isArray(e)?e:Object.values(e):[]}function Bt(n,r,i){if(n.input&&n.input.length>0)return n.input.map(e=>t.resolve(r,e.toString()));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 Vt(e,t,n){switch(e){case`app`:return`app-node`;case`functions`:return`functions`;case`lib`:return t.some(e=>e.endsWith(`.tsx`))||Ht(n)?`lib-react`:`lib`;default:console.error(`target option must be one of: `+S.join(`, `)),process.exit(1)}}function Ht(e){return Ut(t.join(e,`src`))}function Ut(n){try{return e.readdirSync(n,{withFileTypes:!0}).some(e=>{let r=t.join(n,e.name);return e.isDirectory()?Ut(r):e.isFile()&&e.name.endsWith(`.tsx`)})}catch{return!1}}async function Wt(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 Gt(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 Kt={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(Kt).demandCommand().strict().version(qt()).help().argv;function qt(){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/IFtdO1xuICByZXR1cm4gW25hbWVzcGFjZSwgbmFtZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtwYWQoZGF0ZS5nZXRNb250aCgpICsgMSl9LSR7cGFkKGRhdGUuZ2V0RGF0ZSgpKX0gJHtwYWQoZGF0ZS5nZXRIb3VycygpKX06JHtwYWQoXG4gICAgZGF0ZS5nZXRNaW51dGVzKClcbiAgKX06JHtwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpfWA7XG59XG5cbmZ1bmN0aW9uIHBhZCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG1pbGxpc2Vjb25kcyA8IDEwMDApIHJldHVybiBgJHtNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyl9bXNgO1xuXG4gIGNvbnN0IHNlY29uZHMgPSBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICBpZiAoc2Vjb25kcyA8IDYwKSByZXR1cm4gYCR7TnVtYmVyKHNlY29uZHMudG9GaXhlZCgxKSl9c2A7XG5cbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgcmV0dXJuIGAke21pbnV0ZXN9bSAke051bWJlcigoc2Vjb25kcyAtIG1pbnV0ZXMgKiA2MCkudG9GaXhlZCgxKSl9c2A7XG59XG4iLCJpbXBvcnQgeyB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHN1cHByZXNzIG5vbi1lcnJvciBvdXRwdXQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdzJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iLCJpbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuZXhwb3J0IGNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBpbnB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1BhdGhzIG9mIHNvdXJjZSBjb2RlIGZpbGVzIHRvIGJlIGJ1aWx0LiBUaGUgZmlyc3QgZmlsZSBpcyBtYWluLiBJZiBubyBvcHRpb24gaXMgZ2l2ZW4sIFwic3JjL2luZGV4Lnt0cyx0c3gsY3RzLG10c31cIiBmcm9tIHBhY2thZ2UgZGlyZWN0b3J5IGlzIHRhcmdldGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2knLFxuICB9LFxuICAnY29yZS1qcyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IGNvcmUtanMgaXMgZW1wbG95ZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gICdjb3JlLWpzLXByb3Bvc2Fscyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IGNvcmUtanMgd2l0aCBwcm9wb3NhbHMgc3VwcG9ydCBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgbWluaWZ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBtaW5pZmljYXRpb24gaXMgZW5hYmxlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBzb3VyY2VtYXA6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHNvdXJjZW1hcCBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIGV4dGVybmFsOiB7XG4gICAgZGVzY3JpcHRpb246ICdBZGRpdGlvbmFsIGV4dGVybmFsIGRlcGVuZGVuY2llcy4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gIG91dERpcjoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IGRpcmVjdG9yeS4gRGVmYXVsdHMgdG8gXCJkaXN0XCIgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxuICBkZWNsYXJhdGlvbk9ubHk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0VtaXQgb25seSBkZWNsYXJhdGlvbiAoLmQudHMpIGZpbGVzIHdpdGhvdXQgYnVuZGxpbmcgSmF2YVNjcmlwdC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEFueUJ1aWxkZXJUeXBlID0gdHlwZW9mIGFwcEJ1aWxkZXIgfCB0eXBlb2YgZnVuY3Rpb25zQnVpbGRlciB8IHR5cGVvZiBsaWJCdWlsZGVyO1xuIiwiaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHN0eWxlVGV4dCB9IGZyb20gJ25vZGU6dXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogQnVpbGRFcnJvciwgcmVjb3ZlciA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lIHx8IChlcnJvci5jYXVzZSBhcyBFcnJvcik/Lm5hbWU7XG4gIGNvbnN0IG5hbWVTZWN0aW9uID0gbmFtZSA/IGAke25hbWV9OiBgIDogJyc7XG4gIGNvbnN0IHBsdWdpblNlY3Rpb24gPSBlcnJvci5wbHVnaW4gPyBgKHBsdWdpbiAke2Vycm9yLnBsdWdpbn0pIGAgOiAnJztcbiAgY29uc3QgbWVzc2FnZSA9IGAke3BsdWdpblNlY3Rpb259JHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9YDtcblxuICBjb25zdCBvdXRwdXRMaW5lcyA9IFtzdHlsZVRleHQoWydib2xkJywgJ3JlZCddLCBgWyFdICR7bWVzc2FnZX1gKV07XG5cbiAgaWYgKGVycm9yLnVybCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goc3R5bGVUZXh0KCdjeWFuJywgZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goc3R5bGVUZXh0KCdkaW0nLCBlcnJvci5mcmFtZSkpO1xuICB9XG5cbiAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChzdHlsZVRleHQoJ2RpbScsIGVycm9yLnN0YWNrLnJlcGxhY2UoYCR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfVxcbmAsICcnKSkpO1xuICB9XG5cbiAgb3V0cHV0TGluZXMucHVzaCgnJywgJycpO1xuICBjb25zb2xlLmVycm9yKG91dHB1dExpbmVzLmpvaW4oJ1xcbicpKTtcblxuICBpZiAoIXJlY292ZXIpIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNhdXNlPzogdW5rbm93bjtcbiAgZnJhbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBsb2M/OiB7XG4gICAgY29sdW1uOiBudW1iZXI7XG4gICAgZmlsZT86IHN0cmluZztcbiAgICBsaW5lOiBudW1iZXI7XG4gIH07XG4gIHBsdWdpbj86IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgYnVpbHRpbk1vZHVsZXMgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlLCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmNvbnN0IG5vZGVCdWlsdGluTW9kdWxlcyA9IG5ldyBTZXQoYnVpbHRpbk1vZHVsZXMpO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXh0ZXJuYWxNYXRjaGVyKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmdcbik6IChpZDogc3RyaW5nKSA9PiBib29sZWFuIHtcbiAgY29uc3QgYnVuZGxlZEJ1aWx0aW5OYW1lcyA9IGdldEJ1bmRsZWRCdWlsdGluTmFtZXMoYXJndik7XG4gIGNvbnN0IGV4dGVybmFsRGVwZW5kZW5jeU5hbWVzID0gbmV3IFNldChcbiAgICBjb2xsZWN0RXh0ZXJuYWxEZXBlbmRlbmNpZXMoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgcGFja2FnZURpclBhdGgsIG5hbWVzcGFjZSwgYnVuZGxlZEJ1aWx0aW5OYW1lcylcbiAgKTtcbiAgcmV0dXJuIChpZCkgPT4ge1xuICAgIGlmIChnZXRCdW5kbGVkQnVpbHRpblBhY2thZ2VOYW1lKGlkLCBidW5kbGVkQnVpbHRpbk5hbWVzKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBpc05vZGVCdWlsdGluKGlkKSB8fCBtYXRjaGVzTW9kdWxlT3JTdWJwYXRoKGlkLCBleHRlcm5hbERlcGVuZGVuY3lOYW1lcyk7XG4gIH07XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciBgaWRgIGVxdWFscyBhIG5hbWUgaW4gYG5hbWVzYCBvciBpcyBhIHN1YnBhdGggb2YgaXQgKGUuZy4gYGxvZGFzaC5jaHVuay9pbmRleC5qc2ApLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc01vZHVsZU9yU3VicGF0aChpZDogc3RyaW5nLCBuYW1lczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgaWYgKG5hbWVzLmhhcyhpZCkpIHJldHVybiB0cnVlO1xuICBmb3IgKGxldCBzbGFzaEluZGV4ID0gaWQuaW5kZXhPZignLycpOyBzbGFzaEluZGV4ICE9PSAtMTsgc2xhc2hJbmRleCA9IGlkLmluZGV4T2YoJy8nLCBzbGFzaEluZGV4ICsgMSkpIHtcbiAgICBpZiAobmFtZXMuaGFzKGlkLnNsaWNlKDAsIHNsYXNoSW5kZXgpKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RXh0ZXJuYWxEZXBlbmRlbmNpZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgYnVuZGxlZEJ1aWx0aW5OYW1lczogU2V0PHN0cmluZz5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXh0ZXJuYWxEZXBzID0gWy4uLihhcmd2LmV4dGVybmFsID8/IFtdKV0ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpO1xuICBpZiAocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ0BwcmlzbWEvY2xpZW50J10pIHtcbiAgICBleHRlcm5hbERlcHMucHVzaCgncHJpc21hLWNsaWVudCcpO1xuICB9XG4gIC8vIGBkZXBzOiB0cnVlYCBkaWQgbm90IGhhbmRsZSBpbXBvcnRzIHN1Y2ggYXMgYGxvZGFzaC5jaHVuay9pbmRleC5qc2AuXG4gIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICk7XG4gIC8vIEFkZCBleHRlcm5hbCBkZXBlbmRlbmNpZXMgZnJvbSBzaWJsaW5nIHBhY2thZ2VzXG4gIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUocGFja2FnZURpclBhdGgpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhcmVudERpclBhdGgpLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFja2FnZURpcnMgPSBmcy5yZWFkZGlyU3luYyhwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlRGlyIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgICBpZiAoIXBhY2thZ2VEaXIuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYXJlbnREaXJQYXRoLCBwYWNrYWdlRGlyLm5hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgb3RoZXJQYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW290aGVyUGFja2FnZUpzb24ubmFtZSA/PyAnJ10pIHtcbiAgICAgICAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBidW5kbGVkTmFtZXNwYWNlUGF0dGVybiA9XG4gICAgc2hvdWxkQnVuZGxlU2FtZU5hbWVzcGFjZURlcGVuZGVuY2llcyh0YXJnZXREZXRhaWwpICYmIG5hbWVzcGFjZSA/IG5ldyBSZWdFeHAoYF5APyR7bmFtZXNwYWNlfSg/Oi8uKyk/YCkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBleHRlcm5hbERlcHMuZmlsdGVyKChkZXBlbmRlbmN5TmFtZSkgPT4ge1xuICAgIGlmIChidW5kbGVkQnVpbHRpbk5hbWVzLmhhcyhub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoZGVwZW5kZW5jeU5hbWUpKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhYnVuZGxlZE5hbWVzcGFjZVBhdHRlcm4/LnRlc3QoZGVwZW5kZW5jeU5hbWUpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1bmRsZWRCdWlsdGluTmFtZXMoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4pOiBTZXQ8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgU2V0KGFyZ3YuYnVuZGxlQnVpbHRpbnM/Lm1hcCgoaXRlbSkgPT4gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGl0ZW0udG9TdHJpbmcoKSkpID8/IFtdKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQnVuZGxlU2FtZU5hbWVzcGFjZURlcGVuZGVuY2llcyh0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdW5kbGVkQnVpbHRpblBhY2thZ2VOYW1lKGlkOiBzdHJpbmcsIGJ1bmRsZWRCdWlsdGluTmFtZXM6IFNldDxzdHJpbmc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGlkKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlTmFtZSBvZiBidW5kbGVkQnVpbHRpbk5hbWVzKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRJZCA9PT0gcGFja2FnZU5hbWUgfHwgbm9ybWFsaXplZElkLnN0YXJ0c1dpdGgoYCR7cGFja2FnZU5hbWV9L2ApKSByZXR1cm4gcGFja2FnZU5hbWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VTdWJwYXRoKGlkOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkSWQgPSBub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoaWQpO1xuICByZXR1cm4gbm9ybWFsaXplZElkID09PSBwYWNrYWdlTmFtZSA/ICcuJyA6IGAuLyR7bm9ybWFsaXplZElkLnNsaWNlKHBhY2thZ2VOYW1lLmxlbmd0aCArIDEpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBpZC5zdGFydHNXaXRoKCdub2RlOicpID8gaWQuc2xpY2UoJ25vZGU6Jy5sZW5ndGgpIDogaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVCdWlsdGluKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoJ25vZGU6JykgfHwgbm9kZUJ1aWx0aW5Nb2R1bGVzLmhhcyhpZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbXBvcnRLaW5kLCBQbHVnaW4gfSBmcm9tICdyb2xsZG93bic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZ2V0QnVuZGxlZEJ1aWx0aW5OYW1lcywgZ2V0QnVuZGxlZEJ1aWx0aW5QYWNrYWdlTmFtZSwgZ2V0UGFja2FnZVN1YnBhdGgsIGlzTm9kZUJ1aWx0aW4gfSBmcm9tICcuL2V4dGVybmFscy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBidW5kbGVCdWlsdGluc1BsdWdpbihhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFBsdWdpbiB7XG4gIGNvbnN0IGJ1bmRsZWRCdWlsdGluTmFtZXMgPSBnZXRCdW5kbGVkQnVpbHRpbk5hbWVzKGFyZ3YpO1xuICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2J1bmRsZS1idWlsdGlucycsXG4gICAgcmVzb2x2ZUlkKHNvdXJjZSwgX2ltcG9ydGVyLCBleHRyYU9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZ2V0QnVuZGxlZEJ1aWx0aW5QYWNrYWdlTmFtZShzb3VyY2UsIGJ1bmRsZWRCdWlsdGluTmFtZXMpO1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHJlc29sdmVQYWNrYWdlRW50cnkoXG4gICAgICAgIHJlcXVpcmUsXG4gICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICBwYWNrYWdlRGlyUGF0aCxcbiAgICAgICAgZ2V0UGFja2FnZUV4cG9ydENvbmRpdGlvbnMoZXh0cmFPcHRpb25zLmtpbmQpLFxuICAgICAgICBnZXRQYWNrYWdlU3VicGF0aChzb3VyY2UsIHBhY2thZ2VOYW1lKVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5KFxuICByZXF1aXJlOiBOb2RlSlMuUmVxdWlyZSxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgY29uZGl0aW9uczogU2V0PHN0cmluZz4sXG4gIHN1YnBhdGg6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uUGF0aChyZXF1aXJlLCBwYWNrYWdlTmFtZSwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlUGFja2FnZVdpdGhvdXRFeHBvcnRzKHJlcXVpcmUsIHBhY2thZ2VOYW1lLCBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgc3VicGF0aCk7XG4gICAgaWYgKHJlc29sdmVkUGF0aCAhPT0gcGFja2FnZU5hbWUgJiYgIXJlc29sdmVkUGF0aC5zdGFydHNXaXRoKCdub2RlOicpKSByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICB9XG5cbiAgY29uc3QgZW50cnlQYXRoID0gZ2V0UGFja2FnZUVudHJ5UGF0aChwYWNrYWdlSnNvbiwgY29uZGl0aW9ucywgc3VicGF0aCk7XG4gIGlmICghZW50cnlQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlIGV4cG9ydCBmb3IgJHtwYWNrYWdlTmFtZX1gKTtcbiAgfVxuICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCBlbnRyeVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlRXhwb3J0Q29uZGl0aW9ucyhpbXBvcnRLaW5kOiBJbXBvcnRLaW5kKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBjb25kaXRpb25zID0gbmV3IFNldChbJ25vZGUtYWRkb25zJywgJ25vZGUnLCAnbW9kdWxlLXN5bmMnLCAnZGVmYXVsdCddKTtcbiAgaWYgKGltcG9ydEtpbmQgPT09ICdyZXF1aXJlLWNhbGwnKSB7XG4gICAgY29uZGl0aW9ucy5hZGQoJ3JlcXVpcmUnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLmFkZCgnaW1wb3J0Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlV2l0aG91dEV4cG9ydHMoXG4gIHJlcXVpcmU6IE5vZGVKUy5SZXF1aXJlLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBzdWJwYXRoOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmIChzdWJwYXRoID09PSAnLicpIHJldHVybiByZXF1aXJlLnJlc29sdmUocGFja2FnZU5hbWUpO1xuICBjb25zdCByZXNvbHZlZFBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9LyR7c3VicGF0aC5zbGljZSgnLi8nLmxlbmd0aCl9YCk7XG4gIHJldHVybiBpc05vZGVCdWlsdGluKHJlc29sdmVkUGF0aCkgPyByZXNvbHZlUGFja2FnZVN1YnBhdGhGcm9tRGlyKHBhY2thZ2VEaXJQYXRoLCBzdWJwYXRoKSA6IHJlc29sdmVkUGF0aDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VTdWJwYXRoRnJvbURpcihwYWNrYWdlRGlyUGF0aDogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdWJwYXRoRW50cnlQYXRoID0gbm9ybWFsaXplUGFja2FnZUVudHJ5UGF0aChzdWJwYXRoKTtcbiAgaWYgKCFzdWJwYXRoRW50cnlQYXRoKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIHBhY2thZ2Ugc3VicGF0aCAke3N1YnBhdGh9YCk7XG5cbiAgY29uc3QgZW50cnlQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBzdWJwYXRoRW50cnlQYXRoKTtcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKGVudHJ5UGF0aCkgPz8gcmVzb2x2ZURpcmVjdG9yeVBhdGgoZW50cnlQYXRoKTtcbiAgaWYgKHJlc29sdmVkUGF0aCkgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlIHN1YnBhdGggJHtzdWJwYXRofWApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPyBbZmlsZVBhdGhdIDogW2ZpbGVQYXRoLCBgJHtmaWxlUGF0aH0uanNgLCBgJHtmaWxlUGF0aH0uanNvbmAsIGAke2ZpbGVQYXRofS5ub2RlYF07XG4gIHJldHVybiBmaWxlUGF0aHMuZmluZCgoY2FuZGlkYXRlUGF0aCkgPT4gZnMuZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSAmJiBmcy5zdGF0U3luYyhjYW5kaWRhdGVQYXRoKS5pc0ZpbGUoKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RvcnlQYXRoKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgIGNvbnN0IG1haW5QYXRoID0gcmVzb2x2ZUZpbGVQYXRoKHBhdGguam9pbihkaXJQYXRoLCBwYWNrYWdlSnNvbi5tYWluID8/ICdpbmRleC5qcycpKTtcbiAgICBpZiAobWFpblBhdGgpIHJldHVybiBtYWluUGF0aDtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZUZpbGVQYXRoKHBhdGguam9pbihkaXJQYXRoLCAnaW5kZXgnKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblBhdGgocmVxdWlyZTogTm9kZUpTLlJlcXVpcmUsIHBhY2thZ2VOYW1lOiBzdHJpbmcsIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtb2R1bGVQYXRocyA9IHJlcXVpcmUucmVzb2x2ZS5wYXRocyhwYWNrYWdlTmFtZSkgPz8gcmVxdWlyZS5yZXNvbHZlLnBhdGhzKCdfX2J1aWxkX3RzX3BhY2thZ2VfbG9va3VwX18nKSA/PyBbXTtcbiAgZm9yIChjb25zdCBtb2R1bGVQYXRoIG9mIFtwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdub2RlX21vZHVsZXMnKSwgLi4ubW9kdWxlUGF0aHNdKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKG1vZHVsZVBhdGgsIHBhY2thZ2VOYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgcGFja2FnZS5qc29uIGZvciAke3BhY2thZ2VOYW1lfWApO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlRW50cnlQYXRoKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgY29uZGl0aW9uczogU2V0PHN0cmluZz4sIHN1YnBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwYWNrYWdlSnNvbi5leHBvcnRzKSB7XG4gICAgY29uc3QgZW50cnlQYXRoID0gZ2V0RXhwb3J0RW50cnlQYXRoKHBhY2thZ2VKc29uLmV4cG9ydHMsIGNvbmRpdGlvbnMsIHN1YnBhdGgpO1xuICAgIHJldHVybiBlbnRyeVBhdGggPT09IG51bGwgPyB1bmRlZmluZWQgOiBub3JtYWxpemVQYWNrYWdlRW50cnlQYXRoKGVudHJ5UGF0aCk7XG4gIH1cbiAgaWYgKHN1YnBhdGggPT09ICcuJykgcmV0dXJuIHBhY2thZ2VKc29uLm1haW4gPz8gJ2luZGV4LmpzJztcbiAgcmV0dXJuIG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoc3VicGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydEVudHJ5UGF0aChcbiAgZXhwb3J0c0ZpZWxkOiB1bmtub3duLFxuICBjb25kaXRpb25zOiBTZXQ8c3RyaW5nPixcbiAgc3VicGF0aDogc3RyaW5nLFxuICBwYXR0ZXJuTWF0Y2g/OiBzdHJpbmdcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICBpZiAodHlwZW9mIGV4cG9ydHNGaWVsZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3VicGF0aCA9PT0gJy4nID8gcmVzb2x2ZUV4cG9ydFRhcmdldChleHBvcnRzRmllbGQsIHBhdHRlcm5NYXRjaCkgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGV4cG9ydHNGaWVsZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cG9ydHNGaWVsZCkpIHtcbiAgICBpZiAoc3VicGF0aCAhPT0gJy4nKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBleHBvcnRFbnRyeSBvZiBleHBvcnRzRmllbGQpIHtcbiAgICAgIGxldCBlbnRyeVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBlbnRyeVBhdGggPSBnZXRFeHBvcnRFbnRyeVBhdGgoZXhwb3J0RW50cnksIGNvbmRpdGlvbnMsIHN1YnBhdGgsIHBhdHRlcm5NYXRjaCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnlQYXRoKSByZXR1cm4gZW50cnlQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwb3J0c0ZpZWxkICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBleHBvcnRSZWNvcmQgPSBleHBvcnRzRmllbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChoYXNFeHBvcnRTdWJwYXRocyhleHBvcnRSZWNvcmQpKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oZXhwb3J0UmVjb3JkLCBzdWJwYXRoKSkgcmV0dXJuIGdldEV4cG9ydEVudHJ5UGF0aChleHBvcnRSZWNvcmRbc3VicGF0aF0sIGNvbmRpdGlvbnMsICcuJyk7XG5cbiAgICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gZmluZEV4cG9ydFN1YnBhdGhQYXR0ZXJuKGV4cG9ydFJlY29yZCwgc3VicGF0aCk7XG4gICAgcmV0dXJuIHN1YnBhdGhFeHBvcnQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGdldEV4cG9ydEVudHJ5UGF0aChzdWJwYXRoRXhwb3J0LnZhbHVlLCBjb25kaXRpb25zLCAnLicpO1xuICB9XG4gIGlmIChzdWJwYXRoICE9PSAnLicpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBbY29uZGl0aW9uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwb3J0UmVjb3JkKSkge1xuICAgIGlmICghY29uZGl0aW9ucy5oYXMoY29uZGl0aW9uKSkgY29udGludWU7XG5cbiAgICBjb25zdCBlbnRyeVBhdGggPSBnZXRFeHBvcnRFbnRyeVBhdGgodmFsdWUsIGNvbmRpdGlvbnMsIHN1YnBhdGgsIHBhdHRlcm5NYXRjaCk7XG4gICAgaWYgKGVudHJ5UGF0aCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZW50cnlQYXRoO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc0V4cG9ydFN1YnBhdGhzKGV4cG9ydFJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGV4cG9ydFJlY29yZCkuc29tZSgoa2V5KSA9PiBrZXkgPT09ICcuJyB8fCBrZXkuc3RhcnRzV2l0aCgnLi8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRFeHBvcnRTdWJwYXRoUGF0dGVybihleHBvcnRSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzdWJwYXRoOiBzdHJpbmcpOiB7IHZhbHVlOiB1bmtub3duIH0gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBvcnRSZWNvcmQpLnNvcnQoKFtrZXlBXSwgW2tleUJdKSA9PiBjb21wYXJlRXhwb3J0UGF0dGVybktleXMoa2V5QSwga2V5QikpKSB7XG4gICAgY29uc3QgcGF0dGVybk1hdGNoID0gZ2V0RXhwb3J0UGF0dGVybk1hdGNoKGtleSwgc3VicGF0aCk7XG4gICAgaWYgKHBhdHRlcm5NYXRjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogcmVwbGFjZUV4cG9ydFBhdHRlcm4odmFsdWUsIHBhdHRlcm5NYXRjaCkgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUV4cG9ydFBhdHRlcm5LZXlzKGtleUE6IHN0cmluZywga2V5Qjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgYmFzZUxlbmd0aEEgPSBrZXlBLmluZGV4T2YoJyonKTtcbiAgY29uc3QgYmFzZUxlbmd0aEIgPSBrZXlCLmluZGV4T2YoJyonKTtcbiAgaWYgKGJhc2VMZW5ndGhBID09PSAtMSAmJiBiYXNlTGVuZ3RoQiA9PT0gLTEpIHJldHVybiAwO1xuICBpZiAoYmFzZUxlbmd0aEEgPT09IC0xKSByZXR1cm4gMTtcbiAgaWYgKGJhc2VMZW5ndGhCID09PSAtMSkgcmV0dXJuIC0xO1xuICByZXR1cm4gYmFzZUxlbmd0aEIgLSBiYXNlTGVuZ3RoQSB8fCBrZXlCLmxlbmd0aCAtIGtleUEubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdHRlcm4uc3RhcnRzV2l0aCgnLi8nKSB8fCAhcGF0dGVybi5pbmNsdWRlcygnKicpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBwYXR0ZXJuLnNwbGl0KCcqJywgMikgYXMgW3N0cmluZywgc3RyaW5nXTtcbiAgaWYgKHN1YnBhdGggPT09IHByZWZpeCB8fCAhc3VicGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHwgIXN1YnBhdGguZW5kc1dpdGgoc3VmZml4KSB8fCBzdWJwYXRoLmxlbmd0aCA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gc3VicGF0aC5zbGljZShwcmVmaXgubGVuZ3RoLCBzdWJwYXRoLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlRXhwb3J0UGF0dGVybih2YWx1ZTogdW5rbm93biwgcGF0dGVybk1hdGNoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiByZXNvbHZlRXhwb3J0VGFyZ2V0KHZhbHVlLCBwYXR0ZXJuTWF0Y2gpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHJlcGxhY2VFeHBvcnRQYXR0ZXJuKGl0ZW0sIHBhdHRlcm5NYXRjaCkpO1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBba2V5LCByZXBsYWNlRXhwb3J0UGF0dGVybihpdGVtLCBwYXR0ZXJuTWF0Y2gpXSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQ6IHN0cmluZywgcGF0dGVybk1hdGNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICB2YWxpZGF0ZUV4cG9ydFRhcmdldCh0YXJnZXQpO1xuICBpZiAocGF0dGVybk1hdGNoID09PSB1bmRlZmluZWQpIHJldHVybiB0YXJnZXQ7XG5cbiAgdmFsaWRhdGVFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybk1hdGNoKTtcbiAgcmV0dXJuIHRhcmdldC5yZXBsYWNlQWxsKCcqJywgcGF0dGVybk1hdGNoKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBvcnRUYXJnZXQodGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCF0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2thZ2UgZXhwb3J0IHRhcmdldDogJHt0YXJnZXR9YCk7XG5cbiAgdmFsaWRhdGVQYXRoU2VnbWVudHModGFyZ2V0LnNsaWNlKCcuLycubGVuZ3RoKSwgdGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybk1hdGNoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdmFsaWRhdGVQYXRoU2VnbWVudHMocGF0dGVybk1hdGNoLCBwYXR0ZXJuTWF0Y2gpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhdGhTZWdtZW50cyhwYXRoVmFsdWU6IHN0cmluZywgc291cmNlVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkZWNvZGVkUGF0aCA9IGRlY29kZVBhdGhWYWx1ZShwYXRoVmFsdWUsIHNvdXJjZVZhbHVlKTtcbiAgY29uc3QgaW52YWxpZFNlZ21lbnRzID0gbmV3IFNldChbJycsICcuJywgJy4uJywgJ25vZGVfbW9kdWxlcyddKTtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIGRlY29kZWRQYXRoLnNwbGl0KC9bXFxcXC9dL3UpKSB7XG4gICAgaWYgKGludmFsaWRTZWdtZW50cy5oYXMoc2VnbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrYWdlIGV4cG9ydCBwYXRoIHNlZ21lbnQgaW4gJHtzb3VyY2VWYWx1ZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlUGF0aFZhbHVlKHBhdGhWYWx1ZTogc3RyaW5nLCBzb3VyY2VWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhWYWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2thZ2UgZXhwb3J0IHBhdGggc2VnbWVudCBpbiAke3NvdXJjZVZhbHVlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoZW50cnlQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZW50cnlQYXRoPy5yZXBsYWNlKC9eXFwuXFwvLywgJycpO1xufVxuIiwiaW1wb3J0IHsgcGFyc2VTeW5jLCB2aXNpdG9yS2V5cyB9IGZyb20gJ294Yy1wYXJzZXInO1xuXG5jb25zdCBzb3VyY2VGaWxlRXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2Zvcm1UYXJnZXRGaWxlKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBzb3VyY2VGaWxlRXh0ZW5zaW9ucy5zb21lKChleHRlbnNpb24pID0+IGlkLmVuZHNXaXRoKGV4dGVuc2lvbikpICYmICFpZC5zdGFydHNXaXRoKCdcXDAnKSAmJiAhaXNOb2RlTW9kdWxlc1BhdGgoaWQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZU1vZHVsZXNQYXRoKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpIHx8IGlkLmluY2x1ZGVzKCdcXFxcbm9kZV9tb2R1bGVzXFxcXCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTb3VyY2VGaWxlKGlkOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlU3luYz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBsYW5nID0gZ2V0UGFyc2VyTGFuZyhpZCk7XG4gIGNvbnN0IHNvdXJjZVR5cGUgPSBnZXRQYXJzZXJTb3VyY2VUeXBlKGlkKTtcbiAgY29uc3QgYXN0ID0gcGFyc2VTeW5jKGlkLCBjb2RlLCB7IGxhbmcsIHNvdXJjZVR5cGUgfSk7XG4gIGlmICghaGFzUGFyc2VFcnJvcihhc3QpKSByZXR1cm4gYXN0O1xuICBpZiAoaWQuZW5kc1dpdGgoJy5qcycpICYmIHNvdXJjZVR5cGUgPT09ICd1bmFtYmlndW91cycpIHtcbiAgICBjb25zdCBjb21tb25Kc0FzdCA9IHBhcnNlU3luYyhpZCwgY29kZSwgeyBsYW5nLCBzb3VyY2VUeXBlOiAnY29tbW9uanMnIH0pO1xuICAgIGlmICghaGFzUGFyc2VFcnJvcihjb21tb25Kc0FzdCkpIHJldHVybiBjb21tb25Kc0FzdDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNQYXJzZUVycm9yKGFzdDogUmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VTeW5jPik6IGJvb2xlYW4ge1xuICByZXR1cm4gYXN0LmVycm9ycy5zb21lKChlcnJvcikgPT4gZXJyb3Iuc2V2ZXJpdHkgPT09ICdFcnJvcicpO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZXJMYW5nKGlkOiBzdHJpbmcpOiAnanMnIHwgJ2pzeCcgfCAndHMnIHwgJ3RzeCcge1xuICBpZiAoaWQuZW5kc1dpdGgoJy50c3gnKSkgcmV0dXJuICd0c3gnO1xuICBpZiAoaWQuZW5kc1dpdGgoJy50cycpIHx8IGlkLmVuZHNXaXRoKCcuY3RzJykgfHwgaWQuZW5kc1dpdGgoJy5tdHMnKSkgcmV0dXJuICd0cyc7XG4gIGlmIChpZC5lbmRzV2l0aCgnLmpzeCcpKSByZXR1cm4gJ2pzeCc7XG4gIHJldHVybiAnanMnO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZXJTb3VyY2VUeXBlKGlkOiBzdHJpbmcpOiAnY29tbW9uanMnIHwgJ3VuYW1iaWd1b3VzJyB7XG4gIHJldHVybiBpZC5lbmRzV2l0aCgnLmNqcycpIHx8IGlkLmVuZHNXaXRoKCcuY3RzJykgPyAnY29tbW9uanMnIDogJ3VuYW1iaWd1b3VzJztcbn1cblxuZXhwb3J0IHR5cGUgQXN0Tm9kZSA9IHtcbiAgdHlwZTogc3RyaW5nO1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBc3ROb2RlQ2hpbGRyZW4obm9kZTogQXN0Tm9kZSk6IEFzdE5vZGVbXSB7XG4gIHJldHVybiAodmlzaXRvcktleXNbbm9kZS50eXBlXSA/PyBbXSlcbiAgICAuZmxhdE1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgQXN0Tm9kZSA9PiBpc0FzdE5vZGUodmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFzdE5vZGVQcm9wZXJ0eShub2RlOiBBc3ROb2RlLCBrZXk6IHN0cmluZyk6IEFzdE5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgcmV0dXJuIGlzQXN0Tm9kZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFzdEFycmF5UHJvcGVydHkobm9kZTogQXN0Tm9kZSwga2V5OiBzdHJpbmcpOiBBc3ROb2RlW10ge1xuICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBBc3ROb2RlID0+IGlzQXN0Tm9kZShpdGVtKSkgOiBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXN0Tm9kZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEFzdE5vZGUge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiAodmFsdWUgYXMgQXN0Tm9kZSkudHlwZSA9PT0gJ3N0cmluZyc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzdE5vZGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcbmltcG9ydCB7IGdldEFzdE5vZGVDaGlsZHJlbiwgaXNBc3ROb2RlLCBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gY29kZSBjb250YWlucyBhIGRlY29yYXRvciwgaWdub3JpbmcgYEBgIGluIGNvbW1lbnRzLCBzdHJpbmdzLCBhbmQgcmVnZXhlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zRGVjb3JhdG9yKGNvZGU6IHN0cmluZywgaWQgPSAnZmlsZS50cycpOiBib29sZWFuIHtcbiAgLy8gQSBkZWNvcmF0b3IgcmVxdWlyZXMgYSBsaXRlcmFsIGBAYCBldmVuIHdoZW4gaXRzIGlkZW50aWZpZXIgdXNlcyBlc2NhcGVzIHN1Y2ggYXMgYFxcdTAwNjN1c3RvbWAuXG4gIGlmICghY29kZS5pbmNsdWRlcygnQCcpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgYXN0ID0gcGFyc2VTb3VyY2VGaWxlKGlkLCBjb2RlKTtcbiAgLy8gSWYgdGhlIGNvZGUgZmFpbHMgdG8gcGFyc2UsIGxldCBCYWJlbCB0cmFuc2Zvcm0gaXQgYW5kIHJlcG9ydCBhIHByb3BlciBzeW50YXggZXJyb3IuXG4gIGlmICghYXN0KSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGlzQXN0Tm9kZShhc3QucHJvZ3JhbSkgJiYgaGFzRGVjb3JhdG9yTm9kZShhc3QucHJvZ3JhbSk7XG59XG5cbmZ1bmN0aW9uIGhhc0RlY29yYXRvck5vZGUobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlID09PSAnRGVjb3JhdG9yJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBnZXRBc3ROb2RlQ2hpbGRyZW4obm9kZSkuc29tZSgoY2hpbGQpID0+IGhhc0RlY29yYXRvck5vZGUoY2hpbGQpKTtcbn1cbiIsImltcG9ydCBNYWdpY1N0cmluZyBmcm9tICdtYWdpYy1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4sIFNvdXJjZU1hcElucHV0IH0gZnJvbSAncm9sbGRvd24nO1xuXG5pbXBvcnQgdHlwZSB7IEFzdE5vZGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcbmltcG9ydCB7XG4gIGdldEFzdEFycmF5UHJvcGVydHksXG4gIGdldEFzdE5vZGVDaGlsZHJlbixcbiAgZ2V0QXN0Tm9kZVByb3BlcnR5LFxuICBpc0FzdE5vZGUsXG4gIGlzVHJhbnNmb3JtVGFyZ2V0RmlsZSxcbiAgcGFyc2VTb3VyY2VGaWxlLFxufSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnNvbGVSZW1vdmFsRXhjbHVkZWRNZXRob2RzKCk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBlbnYgfSA9IHByb2Nlc3M7XG4gIGlmIChlbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykgcmV0dXJuIG5ldyBTZXQoWydlcnJvcicsICdpbmZvJywgJ3dhcm4nXSk7XG4gIGlmIChlbnYuTk9ERV9FTlYgPT09ICd0ZXN0JykgcmV0dXJuIG5ldyBTZXQoWydkZWJ1ZycsICdlcnJvcicsICdpbmZvJywgJ3dhcm4nXSk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDb25zb2xlUGx1Z2luKGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdyZW1vdmUtY29uc29sZScsXG4gICAgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICBpZiAoIWlzVHJhbnNmb3JtVGFyZ2V0RmlsZShpZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAvLyBFc2NhcGVkIGlkZW50aWZpZXJzIHN1Y2ggYXMgYFxcdTAwNjNvbnNvbGVgIG11c3Qgc3RpbGwgYmUgaGFuZGxlZCwgc28gYWxzbyBtYXRjaCBgXFx1YCBlc2NhcGVzLlxuICAgICAgaWYgKCEvY29uc29sZXxcXFxcdS8udGVzdChjb2RlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHJlbW92ZUNvbnNvbGUoY29kZSwgaWQsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ29uc29sZShjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiB7IGNvZGU6IHN0cmluZzsgbWFwOiBTb3VyY2VNYXBJbnB1dCB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYXN0ID0gcGFyc2VTb3VyY2VGaWxlKGlkLCBjb2RlKTtcbiAgaWYgKCFhc3QgfHwgIWlzQXN0Tm9kZShhc3QucHJvZ3JhbSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbWFnaWNTdHJpbmcgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSk7XG4gIGNvbnN0IHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10gPSBbXTtcbiAgY29uc3Qgc2NvcGVzOiBDb25zb2xlU2NvcGVbXSA9IFtdO1xuICBjb2xsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhhc3QucHJvZ3JhbSwgW10sIHNjb3BlcywgcmVwbGFjZW1lbnRzLCBleGNsdWRlZE1ldGhvZHMpO1xuICBmb3IgKGNvbnN0IHJlcGxhY2VtZW50IG9mIHNlbGVjdENvbnNvbGVSZXBsYWNlbWVudHMocmVwbGFjZW1lbnRzKSkge1xuICAgIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZShyZXBsYWNlbWVudC5zdGFydCwgcmVwbGFjZW1lbnQuZW5kLCByZXBsYWNlbWVudC52YWx1ZSk7XG4gIH1cblxuICBpZiAoIW1hZ2ljU3RyaW5nLmhhc0NoYW5nZWQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBtYWdpY1N0cmluZy50b1N0cmluZygpLFxuICAgIG1hcDogbWFnaWNTdHJpbmcuZ2VuZXJhdGVNYXAoeyBoaXJlczogdHJ1ZSB9KSBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgfTtcbn1cblxudHlwZSBDb25zb2xlUmVwbGFjZW1lbnQgPSB7XG4gIGtpbmQ6ICdyZXBsYWNlJztcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHZhbHVlOiBzdHJpbmc7XG59O1xuXG50eXBlIENvbnNvbGVTY29wZSA9IHtcbiAgZW5kOiBudW1iZXI7XG4gIHNoYWRvd3NDb25zb2xlOiBib29sZWFuO1xuICBzdGFydDogbnVtYmVyO1xufTtcblxuY29uc3Qgbm9vcEZ1bmN0aW9uRXhwcmVzc2lvbiA9ICcoZnVuY3Rpb24gKCkge30pJztcbmNvbnN0IHVuZGVmaW5lZEV4cHJlc3Npb24gPSAnKHZvaWQgMCknO1xuXG5mdW5jdGlvbiBjb2xsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhcbiAgbm9kZTogQXN0Tm9kZSxcbiAgYW5jZXN0b3JzOiBBc3ROb2RlW10sXG4gIHNjb3BlczogQ29uc29sZVNjb3BlW10sXG4gIHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10sXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBjb25zdCBwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTEpO1xuICBjb25zdCBzY29wZSA9IGdldENvbnNvbGVTY29wZShub2RlLCBwYXJlbnQpO1xuICBpZiAoc2NvcGUpIHNjb3Blcy5wdXNoKHNjb3BlKTtcblxuICBpZiAoIWlzQ29uc29sZVNoYWRvd2VkKHNjb3Blcywgbm9kZSkgJiYgbm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVDYWxsUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIH1cbiAgaWYgKCFpc0NvbnNvbGVTaGFkb3dlZChzY29wZXMsIG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVNZW1iZXJSZXBsYWNlbWVudChub2RlLCBhbmNlc3RvcnMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkQW5jZXN0b3JzID0gWy4uLmFuY2VzdG9ycywgbm9kZV07XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZ2V0QXN0Tm9kZUNoaWxkcmVuKG5vZGUpKSB7XG4gICAgY29sbGVjdENvbnNvbGVSZXBsYWNlbWVudHMoY2hpbGQsIGNoaWxkQW5jZXN0b3JzLCBzY29wZXMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgfVxuXG4gIGlmIChzY29wZSkgc2NvcGVzLnBvcCgpO1xufVxuXG5mdW5jdGlvbiBnZXRDb25zb2xlU2NvcGUobm9kZTogQXN0Tm9kZSwgcGFyZW50OiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogQ29uc29sZVNjb3BlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1Byb2dyYW0nKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc1Byb2dyYW1Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUobm9kZSkpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnKSB7XG4gICAgY29uc3QgaXNGdW5jdGlvbkJvZHkgPSBwYXJlbnQgPyBpc0NvbnNvbGVGdW5jdGlvblNjb3BlTm9kZShwYXJlbnQpIDogZmFsc2U7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZSwgZmFsc2UpIHx8IChpc0Z1bmN0aW9uQm9keSAmJiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcobm9kZSkpLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdDYXRjaENsYXVzZScpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKG5vZGUucGFyYW0pLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdDbGFzc0V4cHJlc3Npb24nKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihub2RlLmlkKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnU3RhdGljQmxvY2snIHx8IG5vZGUudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZDogbm9kZS5lbmQsXG4gICAgICBzaGFkb3dzQ29uc29sZTpcbiAgICAgICAgaGFzQmxvY2tDb25zb2xlQmluZGluZyhub2RlLCBmYWxzZSkgfHxcbiAgICAgICAgaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKG5vZGUpIHx8XG4gICAgICAgIChub2RlLnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJyAmJiBoYXNOYW1lc3BhY2VDb25zb2xlQmluZGluZyhwYXJlbnQpKSxcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0LFxuICAgIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N3aXRjaFN0YXRlbWVudCcpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzU3dpdGNoQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBnZXRTd2l0Y2hTY29wZVN0YXJ0KG5vZGUpIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N3aXRjaENhc2UnKSB7XG4gICAgY29uc3Qgc3dpdGNoU2hhZG93c0NvbnNvbGUgPSBwYXJlbnQ/LnR5cGUgPT09ICdTd2l0Y2hTdGF0ZW1lbnQnICYmIGhhc1N3aXRjaENvbnNvbGVCaW5kaW5nKHBhcmVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZDogbm9kZS5lbmQsXG4gICAgICBzaGFkb3dzQ29uc29sZTogc3dpdGNoU2hhZG93c0NvbnNvbGUgfHwgaGFzU3dpdGNoQ2FzZUNvbnNvbGVCaW5kaW5nKG5vZGUpLFxuICAgICAgc3RhcnQ6IGdldFN3aXRjaENhc2VTY29wZVN0YXJ0KG5vZGUpLFxuICAgIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0ZvclN0YXRlbWVudCcgfHwgbm9kZS50eXBlID09PSAnRm9ySW5TdGF0ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50Jykge1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNMb29wQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzUHJvZ3JhbUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnYm9keScpKSB7XG4gICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCB0cnVlKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGhhc0hvaXN0ZWRWYXJDb25zb2xlQmluZGluZyhub2RlKTtcbn1cblxuZnVuY3Rpb24gaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGlmIChoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4obm9kZS5pZCkpIHJldHVybiB0cnVlO1xuICBmb3IgKGNvbnN0IHBhcmFtIG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ3BhcmFtcycpKSB7XG4gICAgaWYgKGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihwYXJhbSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzQmxvY2tDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlLCBpbmNsdWRlVmFyOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2JvZHknKSkge1xuICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgaW5jbHVkZVZhcikpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzU3dpdGNoQ29uc29sZUJpbmRpbmcobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IHN3aXRjaENhc2Ugb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY2FzZXMnKSkge1xuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldEFzdEFycmF5UHJvcGVydHkoc3dpdGNoQ2FzZSwgJ2NvbnNlcXVlbnQnKSkge1xuICAgICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCBmYWxzZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFN3aXRjaFNjb3BlU3RhcnQobm9kZTogQXN0Tm9kZSk6IG51bWJlciB7XG4gIGZvciAoY29uc3Qgc3dpdGNoQ2FzZSBvZiBnZXRBc3RBcnJheVByb3BlcnR5KG5vZGUsICdjYXNlcycpKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBnZXRTd2l0Y2hDYXNlU2NvcGVTdGFydChzd2l0Y2hDYXNlKTtcbiAgICBpZiAoc3RhcnQgPCBzd2l0Y2hDYXNlLmVuZCkgcmV0dXJuIHN0YXJ0O1xuICB9XG4gIHJldHVybiBub2RlLmVuZDtcbn1cblxuZnVuY3Rpb24gaGFzU3dpdGNoQ2FzZUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY29uc2VxdWVudCcpKSB7XG4gICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCBmYWxzZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3dpdGNoQ2FzZVNjb3BlU3RhcnQobm9kZTogQXN0Tm9kZSk6IG51bWJlciB7XG4gIGNvbnN0IHRlc3QgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ3Rlc3QnKTtcbiAgaWYgKHRlc3QpIHJldHVybiB0ZXN0LnN0YXJ0O1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY29uc2VxdWVudCcpWzBdPy5zdGFydCA/PyBub2RlLmVuZDtcbn1cblxuZnVuY3Rpb24gaGFzTG9vcENvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgbm9kZS50eXBlID09PSAnRm9yU3RhdGVtZW50JyA/ICdpbml0JyA6ICdsZWZ0Jyk7XG4gIHJldHVybiAhIWRlY2xhcmF0aW9uICYmIGRlY2xhcmF0aW9uLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJiBkZWNsYXJhdGlvbi5raW5kICE9PSAndmFyJyAmJiBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pO1xufVxuXG5mdW5jdGlvbiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcocm9vdDogQXN0Tm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXJvb3QpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGdldEFzdE5vZGVDaGlsZHJlbihyb290KSkge1xuICAgIGlmIChjaGlsZCAhPT0gcm9vdCAmJiAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09ICdTdGF0aWNCbG9jaycgfHwgY2hpbGQudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoaWxkLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJlxuICAgICAgY2hpbGQua2luZCA9PT0gJ3ZhcicgJiZcbiAgICAgIGhhc1ZhcmlhYmxlRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhjaGlsZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNJbXBvcnRDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGlmIChub2RlLmltcG9ydEtpbmQgPT09ICd0eXBlJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnc3BlY2lmaWVycycpLnNvbWUoXG4gICAgKHNwZWNpZmllcikgPT4gc3BlY2lmaWVyLmltcG9ydEtpbmQgIT09ICd0eXBlJyAmJiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oc3BlY2lmaWVyLmxvY2FsKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUsIGluY2x1ZGVWYXI6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRFeHBvcnREZWNsYXJhdGlvbihub2RlKSA/PyBub2RlO1xuICBpZiAoZGVjbGFyYXRpb24uZGVjbGFyZSA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJykgcmV0dXJuIGhhc0ltcG9ydENvbnNvbGVCaW5kaW5nKGRlY2xhcmF0aW9uKTtcbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyB8fCBkZWNsYXJhdGlvbi50eXBlID09PSAnQ2xhc3NEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGRlY2xhcmF0aW9uLmlkKTtcbiAgfVxuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ1RTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24nKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmltcG9ydEtpbmQgIT09ICd0eXBlJyAmJiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oZGVjbGFyYXRpb24uaWQpO1xuICB9XG4gIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSAnVFNFbnVtRGVjbGFyYXRpb24nIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09ICdUU01vZHVsZURlY2xhcmF0aW9uJykge1xuICAgIHJldHVybiBoYXNMZWZ0bW9zdE1vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0QXN0Tm9kZVByb3BlcnR5KGRlY2xhcmF0aW9uLCAnaWQnKSk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBkZWNsYXJhdGlvbi50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbicgJiZcbiAgICAoaW5jbHVkZVZhciB8fCBkZWNsYXJhdGlvbi5raW5kICE9PSAndmFyJykgJiZcbiAgICBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc05hbWVzcGFjZUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGU/LnR5cGUgPT09ICdUU01vZHVsZURlY2xhcmF0aW9uJyAmJiBub2RlLmRlY2xhcmUgIT09IHRydWUgJiYgaGFzTW9kdWxlSWRDb25zb2xlQmluZGluZyhnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ2lkJykpO1xufVxuXG5mdW5jdGlvbiBoYXNMZWZ0bW9zdE1vZHVsZUlkQ29uc29sZUJpbmRpbmcoaWQ6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFpZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKSByZXR1cm4gaWQubmFtZSA9PT0gJ2NvbnNvbGUnO1xuICByZXR1cm4gaWQudHlwZSA9PT0gJ1RTUXVhbGlmaWVkTmFtZScgJiYgaGFzTGVmdG1vc3RNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldEFzdE5vZGVQcm9wZXJ0eShpZCwgJ2xlZnQnKSk7XG59XG5cbmZ1bmN0aW9uIGhhc01vZHVsZUlkQ29uc29sZUJpbmRpbmcoaWQ6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFpZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKSByZXR1cm4gaWQubmFtZSA9PT0gJ2NvbnNvbGUnO1xuICByZXR1cm4gKFxuICAgIGlkLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnICYmXG4gICAgKGhhc01vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0QXN0Tm9kZVByb3BlcnR5KGlkLCAnbGVmdCcpKSB8fCBoYXNNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldEFzdE5vZGVQcm9wZXJ0eShpZCwgJ3JpZ2h0JykpKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnZGVjbGFyYXRpb25zJykuc29tZSgoZGVjbGFyYXRpb24pID0+XG4gICAgaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGdldEFzdE5vZGVQcm9wZXJ0eShkZWNsYXJhdGlvbiwgJ2lkJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWlzQXN0Tm9kZSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAodmFsdWUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIHZhbHVlLm5hbWUgPT09ICdjb25zb2xlJykgcmV0dXJuIHRydWU7XG4gIGlmICh2YWx1ZS50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nIHx8IHZhbHVlLnR5cGUgPT09ICdSZXN0RWxlbWVudCcpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlLmxlZnQgPz8gdmFsdWUuYXJndW1lbnQpO1xuICB9XG4gIGlmICh2YWx1ZS50eXBlID09PSAnVFNQYXJhbWV0ZXJQcm9wZXJ0eScpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlLnBhcmFtZXRlcik7XG4gIH1cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnKSB7XG4gICAgcmV0dXJuIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZS5sZWZ0KTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ0FycmF5UGF0dGVybicpIHtcbiAgICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eSh2YWx1ZSwgJ2VsZW1lbnRzJykuc29tZSgoZWxlbWVudCkgPT4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGVsZW1lbnQpKTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nKSB7XG4gICAgcmV0dXJuIGdldEFzdEFycmF5UHJvcGVydHkodmFsdWUsICdwcm9wZXJ0aWVzJykuc29tZSgocHJvcGVydHkpID0+XG4gICAgICBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4ocHJvcGVydHkudmFsdWUgPz8gcHJvcGVydHkuYXJndW1lbnQpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzQ29uc29sZUZ1bmN0aW9uU2NvcGVOb2RlKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicgfHwgbm9kZS50eXBlID09PSAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVTaGFkb3dlZChzY29wZXM6IENvbnNvbGVTY29wZVtdLCBub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY29wZXMuc29tZSgoc2NvcGUpID0+IHNjb3BlLnNoYWRvd3NDb25zb2xlICYmIHNjb3BlLnN0YXJ0IDw9IG5vZGUuc3RhcnQgJiYgbm9kZS5lbmQgPD0gc2NvcGUuZW5kKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdENvbnNvbGVDYWxsUmVwbGFjZW1lbnQoXG4gIG5vZGU6IEFzdE5vZGUsXG4gIGFuY2VzdG9yczogQXN0Tm9kZVtdLFxuICByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdLFxuICBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0xKTtcbiAgY29uc3QgY2FsbGVlID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdjYWxsZWUnKTtcbiAgaWYgKG5vZGUub3B0aW9uYWwgPT09IHRydWUpIHJldHVybjtcbiAgaWYgKCFjYWxsZWUgfHwgIWlzSW5jbHVkZWRDb25zb2xlTWVtYmVyKGNhbGxlZSwgZXhjbHVkZWRNZXRob2RzKSkge1xuICAgIGlmIChjYWxsZWUgJiYgaXNJbmNsdWRlZENvbnNvbGVCaW5kTWVtYmVyKGNhbGxlZSwgZXhjbHVkZWRNZXRob2RzKSkge1xuICAgICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBub2RlLnN0YXJ0LCBlbmQ6IG5vZGUuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKSB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBwYXJlbnQuc3RhcnQsIGVuZDogcGFyZW50LmVuZCwgdmFsdWU6ICc7JyB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXBsYWNlbWVudHMucHVzaCh7IGtpbmQ6ICdyZXBsYWNlJywgc3RhcnQ6IG5vZGUuc3RhcnQsIGVuZDogbm9kZS5lbmQsIHZhbHVlOiBnZXRVbmRlZmluZWRFeHByZXNzaW9uUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzKSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0Q29uc29sZU1lbWJlclJlcGxhY2VtZW50KFxuICBub2RlOiBBc3ROb2RlLFxuICBhbmNlc3RvcnM6IEFzdE5vZGVbXSxcbiAgcmVwbGFjZW1lbnRzOiBDb25zb2xlUmVwbGFjZW1lbnRbXSxcbiAgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGNvbnN0IHBhcmVudCA9IGFuY2VzdG9ycy5hdCgtMSk7XG4gIGNvbnN0IGdyYW5kcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0yKTtcbiAgaWYgKCFpc0luY2x1ZGVkQ29uc29sZU1lbWJlcihub2RlLCBleGNsdWRlZE1ldGhvZHMpIHx8IHBhcmVudD8udHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm47XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgJiYgcGFyZW50LmNhbGxlZSA9PT0gbm9kZSAmJiBwYXJlbnQub3B0aW9uYWwgIT09IHRydWUpIHJldHVybjtcbiAgaWYgKGlzQ29uc29sZUFzc2lnbm1lbnRUYXJnZXQobm9kZSwgcGFyZW50LCBncmFuZHBhcmVudCkpIHJldHVybjtcblxuICBpZiAocGFyZW50Py50eXBlID09PSAnQXNzaWdubWVudEV4cHJlc3Npb24nICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSB7XG4gICAgY29uc3QgcmlnaHQgPSBnZXRBc3ROb2RlUHJvcGVydHkocGFyZW50LCAncmlnaHQnKTtcbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogcmlnaHQuc3RhcnQsIGVuZDogcmlnaHQuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQocmlnaHQsIGFuY2VzdG9ycykgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogbm9kZS5zdGFydCwgZW5kOiBub2RlLmVuZCwgdmFsdWU6IGdldE5vb3BGdW5jdGlvblJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycykgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZEV4cHJlc3Npb25SZXBsYWNlbWVudChub2RlOiBBc3ROb2RlLCBhbmNlc3RvcnM6IEFzdE5vZGVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZSwgYW5jZXN0b3JzKSA/IGA7JHt1bmRlZmluZWRFeHByZXNzaW9ufWAgOiB1bmRlZmluZWRFeHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXROb29wRnVuY3Rpb25SZXBsYWNlbWVudChub2RlOiBBc3ROb2RlLCBhbmNlc3RvcnM6IEFzdE5vZGVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZSwgYW5jZXN0b3JzKSA/IGA7JHtub29wRnVuY3Rpb25FeHByZXNzaW9ufWAgOiBub29wRnVuY3Rpb25FeHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZTogQXN0Tm9kZSwgYW5jZXN0b3JzOiBBc3ROb2RlW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc3RhdGVtZW50SW5kZXggPSBhbmNlc3RvcnMuZmluZExhc3RJbmRleCgoYW5jZXN0b3IpID0+IGFuY2VzdG9yLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50Jyk7XG4gIGlmIChzdGF0ZW1lbnRJbmRleCA8IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdGVtZW50ID0gYW5jZXN0b3JzW3N0YXRlbWVudEluZGV4XTtcbiAgaWYgKCFzdGF0ZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdGVtZW50UGFyZW50ID0gYW5jZXN0b3JzW3N0YXRlbWVudEluZGV4IC0gMV07XG4gIHJldHVybiBzdGF0ZW1lbnQuc3RhcnQgPT09IG5vZGUuc3RhcnQgJiYgaXNTdGF0ZW1lbnRMaXN0Tm9kZShzdGF0ZW1lbnRQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiBpc1N0YXRlbWVudExpc3ROb2RlKG5vZGU6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBub2RlPy50eXBlID09PSAnUHJvZ3JhbScgfHxcbiAgICBub2RlPy50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnIHx8XG4gICAgbm9kZT8udHlwZSA9PT0gJ1N0YXRpY0Jsb2NrJyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdTd2l0Y2hDYXNlJ1xuICApO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVBc3NpZ25tZW50VGFyZ2V0KFxuICBub2RlOiBBc3ROb2RlLFxuICBwYXJlbnQ6IEFzdE5vZGUgfCB1bmRlZmluZWQsXG4gIGdyYW5kcGFyZW50OiBBc3ROb2RlIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ1VwZGF0ZUV4cHJlc3Npb24nICYmIHBhcmVudC5hcmd1bWVudCA9PT0gbm9kZSkgcmV0dXJuIHRydWU7XG4gIGlmICgocGFyZW50Py50eXBlID09PSAnRm9ySW5TdGF0ZW1lbnQnIHx8IHBhcmVudD8udHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50JykgJiYgcGFyZW50LmxlZnQgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICBpZiAocGFyZW50Py50eXBlID09PSAnQXJyYXlQYXR0ZXJuJykgcmV0dXJuIHRydWU7XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdBc3NpZ25tZW50UGF0dGVybicgJiYgcGFyZW50LmxlZnQgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcGFyZW50Py50eXBlID09PSAnUHJvcGVydHknICYmIHBhcmVudC52YWx1ZSA9PT0gbm9kZSAmJiBncmFuZHBhcmVudD8udHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nO1xufVxuXG5mdW5jdGlvbiBpc0luY2x1ZGVkQ29uc29sZU1lbWJlcihub2RlOiBBc3ROb2RlLCBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdNZW1iZXJFeHByZXNzaW9uJykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IG9iamVjdCA9IGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAnb2JqZWN0Jyk7XG4gIGNvbnN0IHByb3BlcnR5ID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdwcm9wZXJ0eScpO1xuICBpZiAobm9kZS5vcHRpb25hbCA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIW9iamVjdCB8fCAhcHJvcGVydHkgfHwgaXNFeGNsdWRlZENvbnNvbGVQcm9wZXJ0eShub2RlLCBwcm9wZXJ0eSwgZXhjbHVkZWRNZXRob2RzKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihvYmplY3QpKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gKFxuICAgIG9iamVjdC50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgJiZcbiAgICBpc0dsb2JhbENvbnNvbGVJZGVudGlmaWVyKGdldEFzdE5vZGVQcm9wZXJ0eShvYmplY3QsICdvYmplY3QnKSkgJiZcbiAgICAvLyBNYXRjaGVzIGJhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcmVtb3ZlLWNvbnNvbGU6IGNhbGwvYXBwbHkgZXhjbHVzaW9ucyBhcmUgY2hlY2tlZCBvbiB0aGUgb3V0ZXIgcHJvcGVydHkgb25seS5cbiAgICBub2RlLmNvbXB1dGVkICE9PSB0cnVlICYmXG4gICAgcHJvcGVydHkudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmXG4gICAgKHByb3BlcnR5Lm5hbWUgPT09ICdjYWxsJyB8fCBwcm9wZXJ0eS5uYW1lID09PSAnYXBwbHknKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0luY2x1ZGVkQ29uc29sZUJpbmRNZW1iZXIobm9kZTogQXN0Tm9kZSwgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBvYmplY3QgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ29iamVjdCcpO1xuICBjb25zdCBwcm9wZXJ0eSA9IGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAncHJvcGVydHknKTtcbiAgaWYgKCFvYmplY3QgfHwgIXByb3BlcnR5IHx8IG9iamVjdC50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUuY29tcHV0ZWQgPT09IHRydWUgfHwgcHJvcGVydHkudHlwZSAhPT0gJ0lkZW50aWZpZXInIHx8IHByb3BlcnR5Lm5hbWUgIT09ICdiaW5kJykgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIoZ2V0QXN0Tm9kZVByb3BlcnR5KG9iamVjdCwgJ29iamVjdCcpKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjb25zb2xlTWV0aG9kID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG9iamVjdCwgJ3Byb3BlcnR5Jyk7XG4gIHJldHVybiAhIWNvbnNvbGVNZXRob2QgJiYgIWlzRXhjbHVkZWRDb25zb2xlUHJvcGVydHkob2JqZWN0LCBjb25zb2xlTWV0aG9kLCBleGNsdWRlZE1ldGhvZHMpO1xufVxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkQ29uc29sZVByb3BlcnR5KFxuICBtZW1iZXJFeHByZXNzaW9uOiBBc3ROb2RlLFxuICBwcm9wZXJ0eTogQXN0Tm9kZSxcbiAgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPlxuKTogYm9vbGVhbiB7XG4gIC8vIFRoZSByZXN0b3JlZCBiZWhhdmlvciBtYXRjaGVzIGJhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcmVtb3ZlLWNvbnNvbGUsIHdob3NlIGV4Y2x1c2lvbnMgb25seSBhcHBseSB0byBpZGVudGlmaWVyIHByb3BlcnRpZXMuXG4gIHJldHVybiBtZW1iZXJFeHByZXNzaW9uLmNvbXB1dGVkICE9PSB0cnVlICYmIHByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJiBleGNsdWRlZE1ldGhvZHMuaGFzKHByb3BlcnR5Lm5hbWUgYXMgc3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihub2RlOiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBub2RlPy50eXBlID09PSAnSWRlbnRpZmllcicgJiYgbm9kZS5uYW1lID09PSAnY29uc29sZSc7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdENvbnNvbGVSZXBsYWNlbWVudHMocmVwbGFjZW1lbnRzOiBDb25zb2xlUmVwbGFjZW1lbnRbXSk6IENvbnNvbGVSZXBsYWNlbWVudFtdIHtcbiAgY29uc3Qgc2VsZWN0ZWQ6IENvbnNvbGVSZXBsYWNlbWVudFtdID0gW107XG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2YgcmVwbGFjZW1lbnRzLnRvU29ydGVkKChhLCBiKSA9PiBhLnN0YXJ0IC0gYi5zdGFydCB8fCBiLmVuZCAtIGEuZW5kKSkge1xuICAgIGlmIChzZWxlY3RlZC5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXJ0IDw9IHJlcGxhY2VtZW50LnN0YXJ0ICYmIHJlcGxhY2VtZW50LmVuZCA8PSBpdGVtLmVuZCkpIGNvbnRpbnVlO1xuICAgIHNlbGVjdGVkLnB1c2gocmVwbGFjZW1lbnQpO1xuICB9XG4gIHJldHVybiBzZWxlY3RlZC50b1NvcnRlZCgoYSwgYikgPT4gYi5zdGFydCAtIGEuc3RhcnQpO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnREZWNsYXJhdGlvbihub2RlOiBBc3ROb2RlKTogQXN0Tm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyAmJiBub2RlLnR5cGUgIT09ICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdkZWNsYXJhdGlvbicpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbnB1dE9wdGlvbnMgfSBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgTWFnaWNTdHJpbmcgZnJvbSAnbWFnaWMtc3RyaW5nJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUGx1Z2luLCBSb2xsZG93blBsdWdpbk9wdGlvbiwgU291cmNlTWFwSW5wdXQgfSBmcm9tICdyb2xsZG93bic7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1bmRsZUJ1aWx0aW5zUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVCdWlsdGluc1BsdWdpbi5qcyc7XG5pbXBvcnQgeyBjb250YWluc0RlY29yYXRvciB9IGZyb20gJy4vZGVjb3JhdG9yRGV0ZWN0aW9uLmpzJztcbmltcG9ydCB7IGdldENvbnNvbGVSZW1vdmFsRXhjbHVkZWRNZXRob2RzLCByZW1vdmVDb25zb2xlUGx1Z2luIH0gZnJvbSAnLi9yZW1vdmVDb25zb2xlUGx1Z2luLmpzJztcbmltcG9ydCB7IGlzVHJhbnNmb3JtVGFyZ2V0RmlsZSB9IGZyb20gJy4vdHJhbnNmb3JtVXRpbHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQbHVnaW5zKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZ1xuKTogUm9sbGRvd25QbHVnaW5PcHRpb25bXSB7XG4gIGNvbnN0IHBsdWdpbnM6IFJvbGxkb3duUGx1Z2luT3B0aW9uW10gPSBbXG4gICAgYnVuZGxlQnVpbHRpbnNQbHVnaW4oYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIGtlZXBJbXBvcnRQbHVnaW4oYXJndi5rZWVwSW1wb3J0Py5tYXAoKGl0ZW0pID0+IGl0ZW0udG9TdHJpbmcoKSkgPz8gW10pLFxuICBdO1xuICBjb25zdCBleGNsdWRlZENvbnNvbGVNZXRob2RzID0gZ2V0Q29uc29sZVJlbW92YWxFeGNsdWRlZE1ldGhvZHMoKTtcbiAgaWYgKGV4Y2x1ZGVkQ29uc29sZU1ldGhvZHMpIHtcbiAgICBwbHVnaW5zLnB1c2gocmVtb3ZlQ29uc29sZVBsdWdpbihleGNsdWRlZENvbnNvbGVNZXRob2RzKSk7XG4gIH1cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSB8fCBhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcGx1Z2lucy5wdXNoKGJhYmVsQ29yZUpzUGx1Z2luKCkpO1xuICAgIGlmICghb3V0cHV0T3B0aW9uc0xpc3Quc29tZSgob3B0cykgPT4gb3B0cy5wcmVzZXJ2ZU1vZHVsZXMpKSB7XG4gICAgICBwbHVnaW5zLnB1c2goY29tbW9uSnNSdW50aW1lUHJlbHVkZVBsdWdpbigpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGx1Z2lucy5wdXNoKGJhYmVsRGVjb3JhdG9yc1BsdWdpbigpKTtcbiAgfVxuICBwbHVnaW5zLnB1c2godGV4dFBsdWdpbigpKTtcbiAgcmV0dXJuIHBsdWdpbnM7XG59XG5cbmZ1bmN0aW9uIGtlZXBJbXBvcnRQbHVnaW4obW9kdWxlTmFtZXM6IHN0cmluZ1tdKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAna2VlcC1pbXBvcnQnLFxuICAgIHJlc29sdmVEeW5hbWljSW1wb3J0KHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG1vZHVsZU5hbWVzLmluY2x1ZGVzKHNvdXJjZSkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYWJlbENvcmVKc1BsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4gYmFiZWxQbHVnaW4oJ2JhYmVsLWNvcmUtanMnLCAoKSA9PiB0cnVlKTtcbn1cblxuZnVuY3Rpb24gYmFiZWxEZWNvcmF0b3JzUGx1Z2luKCk6IFBsdWdpbiB7XG4gIHJldHVybiBiYWJlbFBsdWdpbignYmFiZWwtZGVjb3JhdG9ycycsIGNvbnRhaW5zRGVjb3JhdG9yKTtcbn1cblxuZnVuY3Rpb24gYmFiZWxQbHVnaW4obmFtZTogc3RyaW5nLCBzaG91bGRUcmFuc2Zvcm06IChjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+IGJvb2xlYW4pOiBQbHVnaW4ge1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgIGlmICghaXNUcmFuc2Zvcm1UYXJnZXRGaWxlKGlkKSB8fCAhc2hvdWxkVHJhbnNmb3JtKGNvZGUsIGlkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHRyYW5zZm9ybUFzeW5jIH0gPSBhd2FpdCBpbXBvcnQoJ0BiYWJlbC9jb3JlJyk7XG4gICAgICBjb25zdCBvcHRpb25zOiBJbnB1dE9wdGlvbnMgPSB7XG4gICAgICAgIGNhbGxlcjoge1xuICAgICAgICAgIG5hbWU6ICdidWlsZC10cycsXG4gICAgICAgICAgc3VwcG9ydHNEeW5hbWljSW1wb3J0OiB0cnVlLFxuICAgICAgICAgIHN1cHBvcnRzRXhwb3J0TmFtZXNwYWNlRnJvbTogdHJ1ZSxcbiAgICAgICAgICBzdXBwb3J0c1N0YXRpY0VTTTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnRmlsZTogYmFiZWxDb25maWdQYXRoLFxuICAgICAgICBmaWxlbmFtZTogaWQsXG4gICAgICAgIHNvdXJjZU1hcHM6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtQXN5bmMoY29kZSwgb3B0aW9ucyk7XG4gICAgICBpZiAoIXJlc3VsdD8uY29kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmNvZGUsXG4gICAgICAgIG1hcDogcmVzdWx0Lm1hcCBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tbW9uSnNSdW50aW1lUHJlbHVkZVBsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdjb21tb25qcy1ydW50aW1lLXByZWx1ZGUnLFxuICAgIHJlbmRlckNodW5rKGNvZGUsIF9jaHVuaywgb3B0aW9ucykge1xuICAgICAgY29uc3QgcHJlbHVkZSA9IGdldENvbW1vbkpzUnVudGltZVByZWx1ZGUoY29kZSwgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgaWYgKCFwcmVsdWRlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBtYWdpY1N0cmluZyA9IG5ldyBNYWdpY1N0cmluZyhjb2RlKTtcbiAgICAgIG1hZ2ljU3RyaW5nLmFwcGVuZExlZnQoZ2V0UHJlbHVkZUluc2VydGlvbkluZGV4KGNvZGUpLCBgJHtwcmVsdWRlfVxcbmApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogbWFnaWNTdHJpbmcudG9TdHJpbmcoKSxcbiAgICAgICAgbWFwOiBtYWdpY1N0cmluZy5nZW5lcmF0ZU1hcCh7IGhpcmVzOiB0cnVlIH0pIGFzIFNvdXJjZU1hcElucHV0LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBjb21tb25Kc1J1bnRpbWVQcmVsdWRlID0gYHZhciBfX2NyZWF0ZT1PYmplY3QuY3JlYXRlLF9fZGVmUHJvcD1PYmplY3QuZGVmaW5lUHJvcGVydHksX19nZXRPd25Qcm9wRGVzYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLF9fZ2V0T3duUHJvcE5hbWVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLF9fZ2V0UHJvdG9PZj1PYmplY3QuZ2V0UHJvdG90eXBlT2YsX19oYXNPd25Qcm9wPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksX19jb21tb25KU01pbj0obW9kdWxlRmFjdG9yeSxtb2R1bGUpPT4oKT0+KG1vZHVsZXx8KG1vZHVsZT17ZXhwb3J0czp7fX0sbW9kdWxlRmFjdG9yeShtb2R1bGUuZXhwb3J0cyxtb2R1bGUpKSxtb2R1bGUuZXhwb3J0cyksX19jb3B5UHJvcHM9KHRvLGZyb20sZXhjZXB0LGRlc2NyaXB0b3IpPT57aWYoZnJvbSYmXCJvYmplY3RcIj09dHlwZW9mIGZyb218fFwiZnVuY3Rpb25cIj09dHlwZW9mIGZyb20pZm9yKHZhciBrZXksbmFtZXM9X19nZXRPd25Qcm9wTmFtZXMoZnJvbSksaW5kZXg9MCxsZW5ndGg9bmFtZXMubGVuZ3RoO2luZGV4PGxlbmd0aDtpbmRleCsrKWtleT1uYW1lc1tpbmRleF0sX19oYXNPd25Qcm9wLmNhbGwodG8sa2V5KXx8a2V5PT09ZXhjZXB0fHxfX2RlZlByb3AodG8sa2V5LHtnZXQ6KGtleT0+ZnJvbVtrZXldKS5iaW5kKG51bGwsa2V5KSxlbnVtZXJhYmxlOiEoZGVzY3JpcHRvcj1fX2dldE93blByb3BEZXNjKGZyb20sa2V5KSl8fGRlc2NyaXB0b3IuZW51bWVyYWJsZX0pO3JldHVybiB0b30sX190b0VTTT0obW9kLGlzTm9kZU1vZGUsdGFyZ2V0KT0+KHRhcmdldD1udWxsIT1tb2Q/X19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpOnt9LF9fY29weVByb3BzKCFpc05vZGVNb2RlJiZtb2QmJm1vZC5fX2VzTW9kdWxlP3RhcmdldDpfX2RlZlByb3AodGFyZ2V0LFwiZGVmYXVsdFwiLHt2YWx1ZTptb2QsZW51bWVyYWJsZTohMH0pLG1vZCkpO2A7XG5cbmZ1bmN0aW9uIGdldENvbW1vbkpzUnVudGltZVByZWx1ZGUoY29kZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29kZS5pbmNsdWRlcygnX19jb21tb25KU01pbicpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFJvbGxkb3duIDEuMS4yIGNhbiBlbWl0IGhlbHBlcnMgYWZ0ZXIgY29yZS1qcyB3cmFwcGVycyB0aGF0IGFscmVhZHkgY2FsbCB0aGVtLlxuICAvLyBTZWVkaW5nIHRoZSBoZWxwZXJzIGZpcnN0IHByZXZlbnRzIG1pbmlmaWVkIG91dHB1dCBmcm9tIGNhbGxpbmcgdW5pbml0aWFsaXplZCBhbGlhc2VzLlxuICBpZiAoaXNDb21tb25Kc0Zvcm1hdChmb3JtYXQpKSByZXR1cm4gY29kZS5pbmNsdWRlcygnX190b0VTTScpID8gY29tbW9uSnNSdW50aW1lUHJlbHVkZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGB2YXIgX19jb21tb25KU01pbj0obW9kdWxlRmFjdG9yeSxtb2R1bGUpPT4oKT0+KG1vZHVsZXx8KG1vZHVsZT17ZXhwb3J0czp7fX0sbW9kdWxlRmFjdG9yeShtb2R1bGUuZXhwb3J0cyxtb2R1bGUpKSxtb2R1bGUuZXhwb3J0cyk7YDtcbn1cblxuZnVuY3Rpb24gaXNDb21tb25Kc0Zvcm1hdChmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZm9ybWF0ID09PSAnY2pzJyB8fCBmb3JtYXQgPT09ICdjb21tb25qcyc7XG59XG5cbmZ1bmN0aW9uIGdldFByZWx1ZGVJbnNlcnRpb25JbmRleChjb2RlOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBpZiAoY29kZS5zdGFydHNXaXRoKCcjIScpKSB7XG4gICAgY29uc3QgZmlyc3RMaW5lRW5kID0gY29kZS5pbmRleE9mKCdcXG4nKTtcbiAgICBpZiAoZmlyc3RMaW5lRW5kID09PSAtMSkgcmV0dXJuIGNvZGUubGVuZ3RoO1xuICAgIGluZGV4ID0gZmlyc3RMaW5lRW5kICsgMTtcbiAgfVxuXG4gIGNvbnN0IGRpcmVjdGl2ZVBhdHRlcm4gPSAvKD86KD86XCJbXlwiXFxuXSpcInwnW14nXFxuXSonKTs/XFxzKikveTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBkaXJlY3RpdmVQYXR0ZXJuLmxhc3RJbmRleCA9IGluZGV4O1xuICAgIGNvbnN0IG1hdGNoID0gZGlyZWN0aXZlUGF0dGVybi5leGVjKGNvZGUpO1xuICAgIGlmICghbWF0Y2g/LlswXSkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4ID0gZGlyZWN0aXZlUGF0dGVybi5sYXN0SW5kZXg7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGV4dFBsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd0ZXh0JyxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLmVuZHNXaXRoKCcuY3N2JykgJiYgIWlkLmVuZHNXaXRoKCcudHh0JykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShpZCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IGBleHBvcnQgZGVmYXVsdCAke0pTT04uc3RyaW5naWZ5KGNvbnRlbnQpfTtgLFxuICAgICAgICBtb2R1bGVUeXBlOiAnanMnLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICBpbnB1dHM/OiBzdHJpbmdbXVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZ1tdIHwgdW5kZWZpbmVkXVtdID0gW107XG4gIGxldCBjb3JlT3V0RGlyID0gcGF0aC5qb2luKG91dERpclBhdGgsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhjb3JlT3V0RGlyKSkge1xuICAgIC8vIFRoZSBidW5kbGVyIGVtaXR0ZWQgcGVyLXByb2plY3QgZGlyZWN0b3JpZXMgKG1vbm9yZXBvIGJ1aWxkKSwgc28gZW50cnktYmFzZWQgcmVzdHJpY3Rpb24gaXMgdW5zYWZlOlxuICAgIC8vIGVudHJpZXMgbWF5IGltcG9ydCBmaWxlcyBvdXRzaWRlIGVhY2ggcHJvamVjdCdzIHJvb3REaXIuXG4gICAgaW5wdXRzID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29yZVByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChwcm9qZWN0RGlyUGF0aCA9PT0gY29yZVByb2plY3REaXJQYXRoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IGZpbmRDb25maWdGaWxlKHByb2plY3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbihvdXREaXJQYXRoLCBkaXJlbnQubmFtZSwgJ3NyYycpO1xuICAgICAgaWYgKGNvbmZpZ0ZpbGUgJiYgZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgICAgIHByb2plY3RzLnB1c2goW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIsIHVuZGVmaW5lZF0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb3JlT3V0RGlyID0gb3V0RGlyUGF0aDtcbiAgfVxuICBwcm9qZWN0cy5wdXNoKFtjb3JlUHJvamVjdERpclBhdGgsIGNvcmVDb25maWdGaWxlLCBjb3JlT3V0RGlyLCBpbnB1dHNdKTtcblxuICBsZXQgYWxsU3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciwgcHJvamVjdElucHV0c10gb2YgcHJvamVjdHMpIHtcbiAgICBhbGxTdWNjZWVkZWQgJiY9IGF3YWl0IHJ1blRzZ28oYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciwgcHJvamVjdElucHV0cyk7XG4gIH1cbiAgcmV0dXJuIGFsbFN1Y2NlZWRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuVHNnbyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ0ZpbGU6IHN0cmluZyxcbiAgb3V0RGlyOiBzdHJpbmcsXG4gIGlucHV0cz86IHN0cmluZ1tdXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHNnbygpJywgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciwgaW5wdXRzKTtcbiAgfVxuXG4gIC8vIFRoZSB0ZW1wb3JhcnkgY29uZmlnIG11c3QgbGl2ZSBpbiB0aGUgcHJvamVjdCBkaXJlY3Rvcnkgc28gdGhhdCBpdHMgcmVsYXRpdmUgYHJvb3REaXJgIGFuZFxuICAvLyBgaW5jbHVkZWAgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBwcm9qZWN0IGV2ZW4gd2hlbiB0aGUgZXh0ZW5kZWQgdHNjb25maWcgaXMgaW4gYW4gYW5jZXN0b3IgZGlyZWN0b3J5LlxuICBjb25zdCB0ZW1wQ29uZmlnRmlsZSA9IHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgYC5idWlsZC10cy10c2dvLiR7cHJvY2Vzcy5waWR9LiR7RGF0ZS5ub3coKX0uanNvbmApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHRlbXBDb25maWdGaWxlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoYXdhaXQgY3JlYXRlVHlwZVNjcmlwdE5hdGl2ZUNvbmZpZyhwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyLCBpbnB1dHMpLCB1bmRlZmluZWQsIDIpXG4gICAgKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwcm9jZXNzLmV4ZWNQYXRoLCBbZ2V0VHNnb1BhdGgoKSwgJy1wJywgdGVtcENvbmZpZ0ZpbGVdLCB7XG4gICAgICBjd2Q6IHByb2plY3REaXJQYXRoLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LmVycm9yKSB0aHJvdyByZXQuZXJyb3I7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPT09IDA7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGVtcENvbmZpZ0ZpbGUsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHlwZVNjcmlwdE5hdGl2ZUNvbmZpZyhcbiAgcHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgY29uZmlnRmlsZTogc3RyaW5nLFxuICBvdXREaXI6IHN0cmluZyxcbiAgaW5wdXRzPzogc3RyaW5nW11cbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgY29tcGlsZXJPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAvLyBBbiBpbmhlcml0ZWQgYGNvbXBvc2l0ZWAgd291bGQgcmVxdWlyZSBsaXN0aW5nIGV2ZXJ5IGltcG9ydGVkIGZpbGUgZXhwbGljaXRseSAoVFM2MzA3KSBhbmQsXG4gICAgLy8gbGlrZSBgaW5jcmVtZW50YWxgLCB3b3VsZCB3cml0ZSBuZWVkbGVzcyAudHNidWlsZGluZm8gZmlsZXMgZm9yIHRoaXMgb25lLXNob3QgY29tcGlsYXRpb24uXG4gICAgY29tcG9zaXRlOiBmYWxzZSxcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICAvLyBBbiBpbmhlcml0ZWQgYGRlY2xhcmF0aW9uRGlyYCB3b3VsZCBzaWxlbnRseSByZWRpcmVjdCB0aGUgb3V0cHV0IGF3YXkgZnJvbSBgb3V0RGlyYC5cbiAgICBkZWNsYXJhdGlvbkRpcjogb3V0RGlyLFxuICAgIGVtaXREZWNsYXJhdGlvbk9ubHk6IHRydWUsXG4gICAgaW5jcmVtZW50YWw6IGZhbHNlLFxuICAgIG5vRW1pdDogZmFsc2UsXG4gICAgbm9FbWl0T25FcnJvcjogdHJ1ZSxcbiAgICBvdXREaXIsXG4gICAgLy8gVHlwZVNjcmlwdCA3IHJlcXVpcmVzIGFuIGV4cGxpY2l0IGByb290RGlyYCAoVFM1MDExKS4gRW50cmllcyBpbXBvcnRpbmcgZmlsZXMgb3V0c2lkZSBzcmMvXG4gICAgLy8gKGUuZy4gc2libGluZyBwYWNrYWdlcyBpbiBkZWNsYXJhdGlvbi1vbmx5IG1vZGUpIGZhaWwgd2l0aCBUUzYwNTk7IHNlZSB0aGUgUkVBRE1FIGxpbWl0YXRpb24uXG4gICAgcm9vdERpcjogJ3NyYycsXG4gIH07XG4gIGlmIChhd2FpdCB1c2VzTm9kZVByb3RvY29sSW1wb3J0KHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgJ3NyYycpKSkge1xuICAgIGNvbnN0IHR5cGVzRGlyUGF0aCA9IGZpbmRUeXBlc0RpclBhdGgocHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IHR5cGVzID0gdHlwZXNEaXJQYXRoID8gYXdhaXQgY29sbGVjdFR5cGVQYWNrYWdlcyh0eXBlc0RpclBhdGgpIDogW107XG4gICAgaWYgKHR5cGVzLmluY2x1ZGVzKCdub2RlJykpIHtcbiAgICAgIGNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IHR5cGVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbXBpbGVyT3B0aW9ucyxcbiAgICBleHRlbmRzOiB0b1JlbGF0aXZlQ29uZmlnUGF0aChwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSksXG4gICAgLy8gV2l0aCBgZmlsZXNgLCB0c2MgYWxzbyBlbWl0cyBkZWNsYXJhdGlvbnMgZm9yIGZpbGVzIHRyYW5zaXRpdmVseSBpbXBvcnRlZCBmcm9tIHRoZSBlbnRyaWVzLFxuICAgIC8vIHNvIHRoZSBvdXRwdXQgaXMgcmVzdHJpY3RlZCB0byB3aGF0IHRoZSBidW5kbGVkIEphdmFTY3JpcHQgYWN0dWFsbHkgY29udGFpbnMuIGBpbmNsdWRlYCBtdXN0IGJlXG4gICAgLy8gb3ZlcnJpZGRlbiBzaW5jZSBhbiBpbmhlcml0ZWQgYGluY2x1ZGVgIHdvdWxkIGFkZCBmaWxlcyBiYWNrIHRvIHRoZSBwcm9ncmFtOyBvbmx5IGFtYmllbnRcbiAgICAvLyBkZWNsYXJhdGlvbiBmaWxlcyBhcmUga2VwdCBiZWNhdXNlIGVudHJpZXMgbWF5IHJlbHkgb24gdGhlaXIgZ2xvYmFsIHR5cGVzIHdpdGhvdXQgaW1wb3J0aW5nIHRoZW0uXG4gICAgLi4uKGlucHV0cz8ubGVuZ3RoXG4gICAgICA/IHtcbiAgICAgICAgICBleGNsdWRlOiBbXSxcbiAgICAgICAgICBmaWxlczogaW5wdXRzLm1hcCgoaW5wdXQpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyUGF0aCwgaW5wdXQpLnJlcGxhY2VBbGwocGF0aC5zZXAsICcvJykpLFxuICAgICAgICAgIGluY2x1ZGU6IFsnc3JjLyoqLyouZC50cycsICdzcmMvKiovKi5kLm10cycsICdzcmMvKiovKi5kLmN0cyddLFxuICAgICAgICB9XG4gICAgICA6IHsgaW5jbHVkZTogWydzcmMvKiovKiddIH0pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kQ29uZmlnRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdGaWxlKSkgcmV0dXJuIGNvbmZpZ0ZpbGU7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3VycmVudERpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRzZ29QYXRoKCk6IHN0cmluZyB7XG4gIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIChmb3JtZXJseSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgKSBhc1xuICAvLyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UsIHdob3NlIGBsaWIvdHNjLmpzYCB3cmFwcGVyIHNwYXducyB0aGUgcGxhdGZvcm0gYmluYXJ5LlxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoJ3R5cGVzY3JpcHQvcGFja2FnZS5qc29uJyk7XG4gIHJldHVybiBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksICdsaWInLCAndHNjLmpzJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaWYgKGF3YWl0IHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQoY2hpbGRQYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKC9cXC5bY21dP3RzeD8kLy50ZXN0KGRpcmVudC5uYW1lKSAmJiAoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY2hpbGRQYXRoLCAndXRmOCcpKS5pbmNsdWRlcygnbm9kZTonKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRUeXBlc0RpclBhdGgoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVzRGlyUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICdAdHlwZXMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0eXBlc0RpclBhdGgpKSByZXR1cm4gdHlwZXNEaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0VHlwZVBhY2thZ2VzKHR5cGVSb290c0RpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0eXBlUm9vdHNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRpcmVudHMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLy8gYHRvRmlsZVBhdGhgIGlzIGFsd2F5cyBhIHRzY29uZmlnIGluIGBmcm9tRGlyUGF0aGAgb3Igb25lIG9mIGl0cyBhbmNlc3RvciBkaXJlY3Rvcmllcywgc28gdGhlXG4vLyByZXN1bHQgaXMgYWx3YXlzIHJlbGF0aXZlIChgLi9gIG9yIGAuLi9gIGNoYWlucyk7IGEgY3Jvc3MtZHJpdmUgYWJzb2x1dGUgcmVzdWx0IGlzIGltcG9zc2libGUuXG5mdW5jdGlvbiB0b1JlbGF0aXZlQ29uZmlnUGF0aChmcm9tRGlyUGF0aDogc3RyaW5nLCB0b0ZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGZyb21EaXJQYXRoLCB0b0ZpbGVQYXRoKS5yZXBsYWNlQWxsKHBhdGguc2VwLCAnLycpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgc3R5bGVUZXh0IH0gZnJvbSAnbm9kZTp1dGlsJztcblxuaW1wb3J0IHsgcm9sbGRvd24sIHdhdGNoIH0gZnJvbSAncm9sbGRvd24nO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRPcHRpb25zLCBSb2xsZG93bkJ1aWxkLCBSb2xsZG93bk9wdGlvbnMgfSBmcm9tICdyb2xsZG93bic7XG5pbXBvcnQgeyBvbkV4aXQgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uLCBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUgfSBmcm9tICcuLi8uLi9lbnYuanMnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlLCBUYXJnZXRDYXRlZ29yeSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgYWxsVGFyZ2V0Q2F0ZWdvcmllcyB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGZvcm1hdERhdGVUaW1lLCBmb3JtYXREdXJhdGlvbiwgZ2V0TmFtZXNwYWNlQW5kTmFtZSwgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlLCBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGFwcEJ1aWxkZXIsIGZ1bmN0aW9uc0J1aWxkZXIsIGxpYkJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tICcuL2J1bmRsZXJMb2dnZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlRXh0ZXJuYWxNYXRjaGVyIH0gZnJvbSAnLi9leHRlcm5hbHMuanMnO1xuaW1wb3J0IHsgc2V0dXBQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW4uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzIH0gZnJvbSAnLi90eXBlU2NyaXB0LmpzJztcblxuZXhwb3J0IGNvbnN0IGFwcDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBhcHBCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdhcHAgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhbiBhcHAnLFxuICBidWlsZGVyOiBhcHBCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2FwcCcpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uczogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdmdW5jdGlvbnMgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIEdDUC9GaXJlYmFzZSBmdW5jdGlvbnMgYXBwJyxcbiAgYnVpbGRlcjogZnVuY3Rpb25zQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3Yub25seVBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShhcmd2LnBhY2thZ2U/LnRvU3RyaW5nKCkgPz8gJy4nKTtcbiAgICAgIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gICAgICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBwYWNrYWdlLmpzb24gKCR7cGFja2FnZUpzb25QYXRofSkuYCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMoXG4gICAgICAgIHJlc29sdmVPdXREaXJQYXRoKGFyZ3YsIHByb2Nlc3MuY3dkKCksIHBhY2thZ2VEaXJQYXRoLCB1bmRlZmluZWQsICdmdW5jdGlvbnMnKSxcbiAgICAgICAgcGFja2FnZUpzb24sXG4gICAgICAgIGFyZ3YubW9kdWxlVHlwZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdmdW5jdGlvbnMnKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbGliOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGxpYkJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpYiBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgTm9kZS5qcyAvIFJlYWN0IGxpYnJhcnknLFxuICBidWlsZGVyOiBsaWJCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2xpYicpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCB0YXJnZXRDYXRlZ29yeTogVGFyZ2V0Q2F0ZWdvcnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHw9ICdwcm9kdWN0aW9uJztcblxuICAvLyBgc2lsZW50YCBpcyBzdHJvbmdlciB0aGFuIGB2ZXJib3NlYC5cbiAgY29uc3QgdmVyYm9zZSA9ICFhcmd2LnNpbGVudCAmJiBhcmd2LnZlcmJvc2U7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gIGlmICghcGFja2FnZUpzb24pIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG5cbiAgY29uc3QgaW5wdXRzID0gdmVyaWZ5SW5wdXQoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IHRhcmdldERldGFpbCA9IGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeSwgaW5wdXRzLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IG91dERpclBhdGggPSByZXNvbHZlT3V0RGlyUGF0aChhcmd2LCBjd2QsIHBhY2thZ2VEaXJQYXRoLCBpbnB1dHMsIHRhcmdldENhdGVnb3J5KTtcbiAgLy8gUmVzdHJpY3QgZGVjbGFyYXRpb24gZmlsZXMgdG8gdGhlIGVudHJ5IGZpbGVzIChhbmQgdGhlaXIgaW1wb3J0cykgb25seSB3aGVuIGlucHV0cyBhcmUgZXhwbGljaXQsXG4gIC8vIHRvIGtlZXAgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZW1pdHRpbmcgZGVjbGFyYXRpb25zIGZvciBhbGwgZmlsZXMgdW5kZXIgc3JjLy5cbiAgY29uc3QgZGVjbGFyYXRpb25JbnB1dHMgPSBhcmd2LmlucHV0Py5sZW5ndGggPyBpbnB1dHMgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ2FyZ3Y6JywgYXJndik7XG4gICAgY29uc29sZS5pbmZvKCdwYWNrYWdlSnNvblBhdGg6JywgcGFja2FnZUpzb25QYXRoKTtcbiAgICBjb25zb2xlLmluZm8oJ1RhcmdldCAoQ2F0ZWdvcnkpOicsIGAke3RhcmdldERldGFpbH0gKCR7dGFyZ2V0Q2F0ZWdvcnl9KWApO1xuICB9XG5cbiAgY29uc3QgW25hbWVzcGFjZV0gPSBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uKTtcbiAgY29uc3QgaXNFc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG5cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKUyA9ICcxJztcbiAgfSBlbHNlIGlmIChhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTID0gJzEnO1xuICB9XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19WRVJCT1NFID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSA9IHRhcmdldENhdGVnb3J5O1xuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfREVUQUlMID0gdGFyZ2V0RGV0YWlsO1xuXG4gIGNvbnN0IGRlY2xhcmF0aW9uT25seSA9ICdkZWNsYXJhdGlvbk9ubHknIGluIGFyZ3YgJiYgYXJndi5kZWNsYXJhdGlvbk9ubHk7XG4gIGlmIChkZWNsYXJhdGlvbk9ubHkgJiYgYXJndi53YXRjaCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJy0tZGVjbGFyYXRpb24tb25seSBjYW5ub3QgYmUgdXNlZCB3aXRoIC0td2F0Y2guJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3QgPSBnZXRPdXRwdXRPcHRpb25zTGlzdChhcmd2LCB0YXJnZXREZXRhaWwsIG91dERpclBhdGgsIGlzRXNtUGFja2FnZSwgcGFja2FnZURpclBhdGgpO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnT3V0cHV0T3B0aW9uczonLCBvdXRwdXRPcHRpb25zTGlzdCk7XG4gIH1cbiAgaWYgKG91dHB1dE9wdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3Qgb3V0cHV0IGZpbGVzLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuY2hkaXIocGFja2FnZURpclBhdGgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShvdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhvdXREaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgfVxuXG4gIGlmIChkZWNsYXJhdGlvbk9ubHkpIHtcbiAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIHN0eWxlVGV4dChcbiAgICAgICAgICAnY3lhbicsXG4gICAgICAgICAgYEdlbmVyYXRlcyBkZWNsYXJhdGlvbiBmaWxlcyDihpIgJHtzdHlsZVRleHQoJ2JvbGQnLCBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBvdXREaXJQYXRoKSl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgsIG91dERpclBhdGgsIGRlY2xhcmF0aW9uSW5wdXRzKSkpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9uczogUm9sbGRvd25PcHRpb25zID0ge1xuICAgIGNoZWNrczogeyBwcmVmZXJCdWlsdGluRmVhdHVyZTogZmFsc2UgfSxcbiAgICBleHRlcm5hbDogY3JlYXRlRXh0ZXJuYWxNYXRjaGVyKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZUpzb24sIG5hbWVzcGFjZSwgcGFja2FnZURpclBhdGgpLFxuICAgIGlucHV0OlxuICAgICAgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJ1xuICAgICAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIGlucHV0cy5tYXAoKGlucHV0LCBpbmRleCkgPT4gW2luZGV4ID09PSAwID8gJ2luZGV4JyA6IHBhdGguYmFzZW5hbWUoaW5wdXQsIHBhdGguZXh0bmFtZShpbnB1dCkpLCBpbnB1dF0pXG4gICAgICAgICAgKVxuICAgICAgICA6IGlucHV0cyxcbiAgICBwbHVnaW5zOiBzZXR1cFBsdWdpbnMoYXJndiwgb3V0cHV0T3B0aW9uc0xpc3QsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICByZXNvbHZlOiB7XG4gICAgICBleHRlbnNpb25BbGlhczoge1xuICAgICAgICAnLmNqcyc6IFsnLmNqcycsICcuY3RzJ10sXG4gICAgICAgICcuanMnOiBbJy5qcycsICcudHMnLCAnLnRzeCddLFxuICAgICAgICAnLm1qcyc6IFsnLm1qcycsICcubXRzJ10sXG4gICAgICB9LFxuICAgICAgZXh0ZW5zaW9uczogWycuY3RzJywgJy5tdHMnLCAnLnRzJywgJy50c3gnLCAnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJ10sXG4gICAgfSxcbiAgICB0cmVlc2hha2U6IGFyZ3ZbJ2NvcmUtanMnXSB8fCBhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddID8gZmFsc2UgOiB1bmRlZmluZWQsXG4gICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm1PcHRpb25zKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB3YXRjaDogYXJndi53YXRjaCA/IHsgY2xlYXJTY3JlZW46IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgY29uc3QgcGF0aFRvUmVsYXRpdmVQYXRoID0gKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pOiBzdHJpbmdbXSA9PlxuICAgIChBcnJheS5pc0FycmF5KHBhdGhzKSA/IHBhdGhzIDogW3BhdGhzXSkubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwKSk7XG4gIGNvbnN0IHByaW50QnVuZGxpbmdNZXNzYWdlID0gKGlucHV0UGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gcGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSk7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAnY3lhbicsXG4gICAgICAgIGBCdW5kbGVzICR7c3R5bGVUZXh0KCdib2xkJywgcGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0UGF0aHMpLmpvaW4oJywgJykpfSDihpIgJHtzdHlsZVRleHQoXG4gICAgICAgICAgJ2JvbGQnLFxuICAgICAgICAgIG91dHB1dFBhdGhzLmpvaW4oJywgJylcbiAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICApXG4gICAgKTtcbiAgfTtcbiAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICB3YXRjaFJvbGxkb3duKFxuICAgICAgYXJndixcbiAgICAgIHRhcmdldERldGFpbCxcbiAgICAgIHBhY2thZ2VEaXJQYXRoLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIGRlY2xhcmF0aW9uSW5wdXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG91dHB1dE9wdGlvbnNMaXN0LFxuICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoLFxuICAgICAgcHJpbnRCdW5kbGluZ01lc3NhZ2VcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIHByaW50QnVuZGxpbmdNZXNzYWdlKGlucHV0cyk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbGRvd25CdWlsZCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnVpbGRGYWlsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IF9idW5kbGUgPSBhd2FpdCByb2xsZG93bihvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAgICAgJ2dyZWVuJyxcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtzdHlsZVRleHQoJ2JvbGQnLCBmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJlxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJlxuICAgICAgIShhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgsIG91dERpclBhdGgsIGRlY2xhcmF0aW9uSW5wdXRzKSlcbiAgICApIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtT3B0aW9ucyhhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFJvbGxkb3duT3B0aW9uc1sndHJhbnNmb3JtJ10ge1xuICByZXR1cm4ge1xuICAgIGRlZmluZTogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIHRhcmdldDogJ2VzMjAyMicsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbGRvd24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICBkZWNsYXJhdGlvbklucHV0czogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFJvbGxkb3duT3B0aW9ucyxcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSxcbiAgcGF0aFRvUmVsYXRpdmVQYXRoOiAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPikgPT4gc3RyaW5nW10sXG4gIHByaW50QnVuZGxpbmdNZXNzYWdlOiAoaW5wdXRQYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlPzogbnVtYmVyIHwgbnVsbCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2VPblVuY2F1Z2h0RXhjZXB0aW9uKTtcbiAgICBwcm9jZXNzLnN0ZGluLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbG9zZU9uU3RkaW5FbmQpO1xuICAgIGF3YWl0IHdhdGNoZXIuY2xvc2UoKTtcbiAgICBpZiAoY29kZSkgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICB9O1xuICBjb25zdCBjbG9zZU9uVW5jYXVnaHRFeGNlcHRpb24gPSAoZXJyb3I6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB2b2lkIGNsb3NlKDEpO1xuICB9O1xuICBjb25zdCBjbG9zZU9uU3RkaW5FbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgdm9pZCBjbG9zZSgpO1xuICB9O1xuICBvbkV4aXQoKGNvZGUpID0+IHZvaWQgY2xvc2UoY29kZSkpO1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlT25VbmNhdWdodEV4Y2VwdGlvbik7XG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHByb2Nlc3Muc3RkaW4ub24oJ2VuZCcsIGNsb3NlT25TdGRpbkVuZCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihldmVudC5lcnJvciwgdHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQlVORExFX1NUQVJUJzoge1xuICAgICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgICBwcmludEJ1bmRsaW5nTWVzc2FnZShnZXRJbnB1dEZpbGVzKG9wdGlvbnMuaW5wdXQpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCVU5ETEVfRU5EJzoge1xuICAgICAgICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAgICAgICAgICdncmVlbicsXG4gICAgICAgICAgICAgICAgYENyZWF0ZWQgJHtzdHlsZVRleHQoJ2JvbGQnLCBwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpKX0gaW4gJHtzdHlsZVRleHQoXG4gICAgICAgICAgICAgICAgICAnYm9sZCcsXG4gICAgICAgICAgICAgICAgICBmb3JtYXREdXJhdGlvbihldmVudC5kdXJhdGlvbilcbiAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycpIHtcbiAgICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCwgb3V0RGlyUGF0aCwgZGVjbGFyYXRpb25JbnB1dHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdFTkQnOiB7XG4gICAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuWyR7Zm9ybWF0RGF0ZVRpbWUobmV3IERhdGUoKSl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gS2VlcCB0aGUgd2F0Y2hlciBhbGl2ZSBldmVuIGlmIGhhbmRsaW5nIGFuIGV2ZW50IChlLmcuIGRlY2xhcmF0aW9uIGZpbGUgZ2VuZXJhdGlvbikgZmFpbHMuXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gaGFuZGxlIHdhdGNoIGV2ZW50IGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgICAgdm9pZCBldmVudC5yZXN1bHQuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlT3V0RGlyUGF0aChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGN3ZDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBpbnB1dHM/OiBzdHJpbmdbXSxcbiAgdGFyZ2V0Q2F0ZWdvcnk/OiBUYXJnZXRDYXRlZ29yeVxuKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJndi5vdXREaXIpKSB7XG4gICAgY29uc29sZS5lcnJvcignTXVsdGlwbGUgLS1vdXQtZGlyIG9wdGlvbnMgYXJlIG5vdCBhbGxvd2VkLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyB5YXJncyBhbHNvIGFjY2VwdHMgYC0tbm8tb3V0LWRpcmAsIHdoaWNoIHlpZWxkcyBgZmFsc2VgIGRlc3BpdGUgdGhlIGRlY2xhcmVkIHN0cmluZyB0eXBlLlxuICBjb25zdCBvdXREaXJPcHRpb24gPSB0eXBlb2YgYXJndi5vdXREaXIgPT09ICdzdHJpbmcnID8gYXJndi5vdXREaXIgOiB1bmRlZmluZWQ7XG4gIGlmIChvdXREaXJPcHRpb24gPT09ICcnKSB7XG4gICAgY29uc29sZS5lcnJvcignLS1vdXQtZGlyIG11c3Qgbm90IGJlIGVtcHR5LicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIFRoZSBvdXRwdXQgZGlyZWN0b3J5IGlzIHJlbW92ZWQgYmVmb3JlIGJ1aWxkaW5nLCBzbyByZWZ1c2UgbG9jYXRpb25zIHRoYXQgd291bGQgZGVsZXRlIHNvdXJjZSBmaWxlcy5cbiAgLy8gQ29udGFpbm1lbnQgY2hlY2tzIGNvbXBhcmUgYm90aCB0aGUgbGV4aWNhbCBhbmQgdGhlIGNhbm9uaWNhbCAoc3ltbGluay1yZXNvbHZlZCkgZm9ybXM6IGNhbm9uaWNhbFxuICAvLyBvbmVzIGNhdGNoIHN5bWxpbmtlZCBwYXJlbnQgY29tcG9uZW50cyAoYGZzLnJtYCBmb2xsb3dzIHRoZW0pLCBhbmQgbGV4aWNhbCBvbmVzIGNhdGNoIGFuIG91dHB1dCBwYXRoXG4gIC8vIHRoYXQgaXMgaXRzZWxmIGEgc3ltbGluayBpbnNpZGUgYSBwcm90ZWN0ZWQgZGlyZWN0b3J5LiBUaGUgbGV4aWNhbCBwYXRoIGlzIHJldHVybmVkIHNvIHRoYXQgcmVtb3ZpbmdcbiAgLy8gYSBzeW1saW5rZWQgb3V0cHV0IGRpcmVjdG9yeSBkZWxldGVzIHRoZSBzeW1saW5rIGl0c2VsZiByYXRoZXIgdGhhbiBpdHMgdGFyZ2V0J3MgY29udGVudHMuXG4gIGNvbnN0IGxleGljYWxPdXREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgb3V0RGlyT3B0aW9uID8/IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKSk7XG4gIGNvbnN0IG91dERpclBhdGggPSB0b0Nhbm9uaWNhbFBhdGgobGV4aWNhbE91dERpclBhdGgpO1xuICBjb25zdCBjb250YWluZWRJbnB1dCA9IGlucHV0cz8uZmluZChcbiAgICAoaW5wdXQpID0+IGNvbnRhaW5zUGF0aChvdXREaXJQYXRoLCB0b0Nhbm9uaWNhbFBhdGgoaW5wdXQpKSB8fCBjb250YWluc1BhdGgobGV4aWNhbE91dERpclBhdGgsIGlucHV0KVxuICApO1xuICBpZiAoY29udGFpbmVkSW5wdXQpIHtcbiAgICBjb25zb2xlLmVycm9yKGBUaGUgb3V0cHV0IGRpcmVjdG9yeSAoJHtvdXREaXJQYXRofSkgbXVzdCBub3QgY29udGFpbiB0aGUgaW5wdXQgZmlsZSAoJHtjb250YWluZWRJbnB1dH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICBpZiAoIW91dERpck9wdGlvbikgcmV0dXJuIGxleGljYWxPdXREaXJQYXRoO1xuXG4gIGNvbnN0IGNhbm9uaWNhbFBhY2thZ2VEaXJQYXRoID0gdG9DYW5vbmljYWxQYXRoKHBhY2thZ2VEaXJQYXRoKTtcbiAgaWYgKGNvbnRhaW5zUGF0aChvdXREaXJQYXRoLCBjYW5vbmljYWxQYWNrYWdlRGlyUGF0aCkgfHwgY29udGFpbnNQYXRoKGxleGljYWxPdXREaXJQYXRoLCBwYWNrYWdlRGlyUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGAtLW91dC1kaXIgKCR7b3V0RGlyUGF0aH0pIG11c3Qgbm90IGNvbnRhaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5ICgke2Nhbm9uaWNhbFBhY2thZ2VEaXJQYXRofSkuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIC8vIGBzcmNgIGl0c2VsZiBtYXkgYmUgYSBzeW1saW5rLCBzbyBpdCBuZWVkcyBpdHMgb3duIGNhbm9uaWNhbGl6YXRpb24uXG4gIGNvbnN0IHNyY0RpclBhdGggPSB0b0Nhbm9uaWNhbFBhdGgocGF0aC5qb2luKGNhbm9uaWNhbFBhY2thZ2VEaXJQYXRoLCAnc3JjJykpO1xuICBpZiAoY29udGFpbnNQYXRoKHNyY0RpclBhdGgsIG91dERpclBhdGgpIHx8IGNvbnRhaW5zUGF0aChwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKSwgbGV4aWNhbE91dERpclBhdGgpKSB7XG4gICAgY29uc29sZS5lcnJvcihgLS1vdXQtZGlyICgke291dERpclBhdGh9KSBtdXN0IG5vdCBiZSBpbnNpZGUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgKCR7c3JjRGlyUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICAvLyBBIHBhY2thZ2UuanNvbiBhdCB0aGUgb3V0cHV0IGRpcmVjdG9yeSByb290IGluZGljYXRlcyBhbm90aGVyIHBhY2thZ2UncyBkaXJlY3RvcnkuIFRoZSBmdW5jdGlvbnNcbiAgLy8gdGFyZ2V0IGlzIGV4ZW1wdCBiZWNhdXNlIGl0IGdlbmVyYXRlcyBhIHBhY2thZ2UuanNvbiB0aGVyZSBpdHNlbGYuXG4gIGlmICh0YXJnZXRDYXRlZ29yeSAhPT0gJ2Z1bmN0aW9ucycgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ob3V0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYC0tb3V0LWRpciAoJHtvdXREaXJQYXRofSkgY29udGFpbnMgYSBwYWNrYWdlLmpzb24sIHNvIGl0IGxvb2tzIGxpa2UgYSBwYWNrYWdlIGRpcmVjdG9yeS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGxleGljYWxPdXREaXJQYXRoO1xufVxuXG4vLyBSZXNvbHZlcyBzeW1saW5rcyBpbiB0aGUgbG9uZ2VzdCBleGlzdGluZyBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gcGF0aCwga2VlcGluZyB0aGUgbm9uLWV4aXN0ZW50IHRhaWwuXG5mdW5jdGlvbiB0b0Nhbm9uaWNhbFBhdGgodGFyZ2V0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VmZml4ZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50UGF0aCA9IHRhcmdldFBhdGg7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhjdXJyZW50UGF0aCkpIHtcbiAgICBzdWZmaXhlcy51bnNoaWZ0KHBhdGguYmFzZW5hbWUoY3VycmVudFBhdGgpKTtcbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAocGFyZW50UGF0aCA9PT0gY3VycmVudFBhdGgpIGJyZWFrO1xuICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgfVxuICB0cnkge1xuICAgIGN1cnJlbnRQYXRoID0gZnMucmVhbHBhdGhTeW5jKGN1cnJlbnRQYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gS2VlcCB0aGUgb3JpZ2luYWwgcGF0aCB3aGVuIGl0IGNhbm5vdCBiZSByZXNvbHZlZCAoZS5nLiByZW1vdmVkIGNvbmN1cnJlbnRseSkuXG4gIH1cbiAgcmV0dXJuIHBhdGguam9pbihjdXJyZW50UGF0aCwgLi4uc3VmZml4ZXMpO1xufVxuXG5mdW5jdGlvbiBjb250YWluc1BhdGgocGFyZW50UGF0aDogc3RyaW5nLCBjaGlsZFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhcmVudFBhdGgsIGNoaWxkUGF0aCk7XG4gIGlmIChyZWxhdGl2ZVBhdGggPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIC8vIE9ubHkgYW4gYWN0dWFsIGAuLmAgc2VnbWVudCBtZWFucyBcIm91dHNpZGVcIjsgYSBjaGlsZCBuYW1lIGxpa2UgYC4uZm9vYCBhbHNvIHN0YXJ0cyB3aXRoIGAuLmAuXG4gIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcuLicgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKGAuLiR7cGF0aC5zZXB9YCk7XG59XG5cbmZ1bmN0aW9uIGdldElucHV0RmlsZXMoaW5wdXQ6IFJvbGxkb3duT3B0aW9uc1snaW5wdXQnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIFtdO1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgcmV0dXJuIFtpbnB1dF07XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IGlucHV0IDogT2JqZWN0LnZhbHVlcyhpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUlucHV0KGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBjd2Q6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3YuaW5wdXQgJiYgYXJndi5pbnB1dC5sZW5ndGggPiAwKSByZXR1cm4gYXJndi5pbnB1dC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZShjd2QsIHAudG9TdHJpbmcoKSkpO1xuXG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgZm9yIChjb25zdCBleHQgb2YgWyd0cycsICd0c3gnLCAnY3RzJywgJ210cyddKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwYXRoLmpvaW4oc3JjRGlyUGF0aCwgYGluZGV4LiR7ZXh0fWApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGlucHV0KSkgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IGlucHV0IGZpbGUuJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5OiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10sIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBUYXJnZXREZXRhaWwge1xuICBzd2l0Y2ggKHRhcmdldENhdGVnb3J5KSB7XG4gICAgY2FzZSAnYXBwJzoge1xuICAgICAgcmV0dXJuICdhcHAtbm9kZSc7XG4gICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9ucyc6IHtcbiAgICAgIHJldHVybiAnZnVuY3Rpb25zJztcbiAgICB9XG4gICAgY2FzZSAnbGliJzoge1xuICAgICAgaWYgKGlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuZW5kc1dpdGgoJy50c3gnKSkgfHwgZG9lc1NyY0NvbnRhaW5Uc3gocGFja2FnZURpclBhdGgpKSB7XG4gICAgICAgIHJldHVybiAnbGliLXJlYWN0JztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnbGliJztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc29sZS5lcnJvcigndGFyZ2V0IG9wdGlvbiBtdXN0IGJlIG9uZSBvZjogJyArIGFsbFRhcmdldENhdGVnb3JpZXMuam9pbignLCAnKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRvZXNTcmNDb250YWluVHN4KHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICByZXR1cm4gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goc3JjRGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNEaXJlY3RvcnlDb250YWluVHN4KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGVudHJpZXMuc29tZSgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSByZXR1cm4gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goZW50cnlQYXRoKTtcbiAgICAgIHJldHVybiBlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCcudHN4Jyk7XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcGFja2FnZUpzb24ubmFtZSArPSAnLWRpc3QnO1xuICBjb25zdCBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gIGNvbnN0IGVzbU91dHB1dCA9IGlzRXNtT3V0cHV0KGVzbVBhY2thZ2UsIG1vZHVsZVR5cGUpO1xuICBwYWNrYWdlSnNvbi5tYWluID0gZXNtUGFja2FnZSA9PT0gZXNtT3V0cHV0ID8gJ2luZGV4LmpzJyA6IGVzbU91dHB1dCA/ICdpbmRleC5tanMnIDogJ2luZGV4LmNqcyc7XG5cbiAgLy8gUHJldmVudCBGaXJlYmFzZSBGdW5jdGlvbnMgZnJvbSBydW5uaW5nIGBidWlsZGAgc2NyaXB0IHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICAvLyBkZXZEZXBlbmRlbmNpZXMgYXJlIG5vdCByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuXG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKG91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKG91dERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW4sXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmdcbik6IE91dHB1dE9wdGlvbnNbXSB7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGNvbnN0IGVzbU91dHB1dCA9IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogZXNtT3V0cHV0ID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBtaW5pZnk6IGFyZ3YubWluaWZ5LFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgICBzdHJpY3Q6ICFlc21PdXRwdXQsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGltcG9ydCBzdGF0ZW1lbnQgaW4gYW4gZXNtIG1vZHVsZSBjYXVzZXMgdGhlIGZvbGxvd2luZyBlcnJvcjpcbiAgLy8gU3RhdGVtZW50OlxuICAvLyAgIGltcG9ydCB7IHVzZVByZXZpb3VzIH0gZnJvbSAncmVhY3QtdXNlJztcbiAgLy8gRXJyb3I6XG4gIC8vICAgTmFtZWQgZXhwb3J0ICd1c2VQcmV2aW91cycgbm90IGZvdW5kLiBUaGUgcmVxdWVzdGVkIG1vZHVsZSAncmVhY3QtdXNlJyBpcyBhIENvbW1vbkpTIG1vZHVsZSxcbiAgLy8gICB3aGljaCBtYXkgbm90IHN1cHBvcnQgYWxsIG1vZHVsZS5leHBvcnRzIGFzIG5hbWVkIGV4cG9ydHMuXG4gIC8vIFdlIG5lZWQgY2pzIG1vZHVsZXMgZm9yIHdlYiBhcHBzIHRvIGF2b2lkIHRoZSBlcnJvci5cbiAgLy8gQWxzbywgc3BsaXR0aW5nIGEgbGlicmFyeSBpcyB1c2VmdWwgaW4gYm90aCBtb2R1bGVzLCBzbyBwcmVzZXJ2ZU1vZHVsZXMgc2hvdWxkIGJlIHRydWUuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10gPSBbXTtcbiAgY29uc3QgbW9kdWxlVHlwZSA9IGFyZ3YubW9kdWxlVHlwZSB8fCAnYm90aCc7XG4gIGNvbnN0IGpzRXh0ID0gYXJndi5qc0V4dGVuc2lvbiB8fCAnZWl0aGVyJztcbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdjanMnIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgIWlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgIWlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0uY2pzJyxcbiAgICAgIGZvcm1hdDogJ2NvbW1vbmpzJyxcbiAgICAgIG1pbmlmeTogYXJndi5taW5pZnksXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXNSb290OiBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdlc20nIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLm1qcycsXG4gICAgICBmb3JtYXQ6ICdtb2R1bGUnLFxuICAgICAgbWluaWZ5OiBhcmd2Lm1pbmlmeSxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0T3B0aW9uc0xpc3Q7XG59XG5cbmZ1bmN0aW9uIGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZTogYm9vbGVhbiwgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBtb2R1bGVUeXBlID09PSAnZXNtJyB8fCAoKCFtb2R1bGVUeXBlIHx8IG1vZHVsZVR5cGUgPT09ICdlaXRoZXInKSAmJiBpc0VzbVBhY2thZ2UpO1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uL2Vudi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJ1bjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdydW4gPGZpbGU+JyxcbiAgZGVzY3JpYmU6ICdSdW4gc2NyaXB0JyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgY29uc3QgZmlsZSA9IGFyZ3YuZmlsZT8udG9TdHJpbmcoKSA/PyAnJztcblxuICAgIC8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gICAgY29uc3QgaXNSdW5uaW5nT25CdW4gPSBwcm9jZXNzLnZlcnNpb25zLmJ1bjtcbiAgICBjb25zdCBydW50aW1lID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICdub2RlJztcbiAgICBjb25zdCBhcmdzID0gaXNSdW5uaW5nT25CdW4gPyBbJy0tYnVuJ10gOiBbJy0tbm8td2FybmluZ3MnLCAnLS1pbXBvcnQnLCAndHN4J107XG4gICAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS13YXRjaCcpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goZmlsZSk7XG4gICAgY29uc3QgWywgLi4uYWRkaXRpb25hbEFyZ3VtZW50c10gPSBhcmd2Ll87XG4gICAgY29uc3QgcnVudGltZUFyZ3MgPSBbLi4uYXJncywgLi4uYWRkaXRpb25hbEFyZ3VtZW50cy5tYXAoKGFyZykgPT4gYXJnLnRvU3RyaW5nKCkpXTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgJyR7cnVudGltZX0gJHtydW50aW1lQXJncy5qb2luKCcgJyl9J2ApO1xuICAgIH1cbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhydW50aW1lLCBydW50aW1lQXJncywge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiB9LFxuICAgIH0pO1xuICAgIHByb2Nlc3MuZXhpdChyZXQuc3RhdHVzID8/IDEpO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYXBwLCBmdW5jdGlvbnMsIGxpYiB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGQuanMnO1xuaW1wb3J0IHsgcnVuIH0gZnJvbSAnLi9jb21tYW5kcy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5yZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCdidWlsZC10cycpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAuY29tbWFuZChhcHApXG4gIC5jb21tYW5kKGZ1bmN0aW9ucylcbiAgLmNvbW1hbmQobGliKVxuICAuY29tbWFuZChydW4pXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGdldEJ1aWxkVHNSb290UGF0aCgpLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuIl0sIm1hcHBpbmdzIjoiNm1CQU1BLElBQUksRUFLSixTQUFnQixFQUNkLEVBQ0EsRUFDb0MsQ0FPcEMsT0FOSyxJQUNILEVBQVUsRUFBaUMsRUFBTSxDQUFHLEVBQ2hELEVBQUssU0FDUCxRQUFRLEtBQUssbUJBQW9CLE9BQU8sS0FBSyxDQUFPLENBQUMsR0FHbEQsQ0FDVCxDQUtBLFNBQWdCLEVBQ2QsRUFDQSxFQUN3QixDQUN4QixJQUFNLEVBQXFDLENBQUMsRUFDdEMsRUFBYyxJQUFJLElBQUksQ0FDMUIsSUFBSSxFQUFLLFFBQVUsQ0FBQyxFQUFBLENBQUcsUUFBUyxHQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDN0QsR0FBSSxFQUFLLFdBQWEsT0FBTyxLQUFLLEVBQWtDLEVBQU0sQ0FBRyxDQUFDLEVBQUksQ0FBQyxDQUNyRixDQUFDLEVBQ0QsSUFBSyxJQUFNLEtBQVEsRUFDYixRQUFRLElBQUksS0FBVSxJQUFBLEtBRTFCLEVBQVcsZUFBZSxLQUFVLEtBQUssVUFBVSxRQUFRLElBQUksRUFBSyxHQUt0RSxPQUhJLEVBQUssU0FDUCxRQUFRLEtBQUssbUJBQW9CLE9BQU8sS0FBSyxDQUFVLENBQUMsRUFFbkQsQ0FDVCxDQzNDQSxNQUFhLEVBQXNCLENBQUMsTUFBTyxZQUFhLEtBQUssRUNJN0QsZUFBc0IsRUFBZ0IsRUFBNkQsQ0FDakcsSUFBTSxFQUFrQixFQUFLLEtBQUssRUFBUyxjQUFjLEVBQ3pELEdBQUksQ0FDRixJQUFNLEVBQWtCLE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBaUIsTUFBTSxFQUMxRSxNQUFPLENBQUMsS0FBSyxNQUFNLENBQWUsRUFBa0IsQ0FBZSxDQUNyRSxNQUFRLENBRVIsQ0FDQSxNQUFPLENBQUMsSUFBQSxHQUFXLENBQWUsQ0FDcEMsQ0FFQSxTQUFnQixHQUE2QixDQUMzQyxPQUFPLEVBQUssUUFBUSxFQUFLLFFBQVEsRUFBSSxjQUFjLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUN0RSxDQUVBLFNBQWdCLEdBQW9CLEVBQW9FLENBQ3RHLElBQU0sRUFBYyxFQUFZLE1BQU0sU0FBUyxHQUFLLEdBRTlDLEVBQUcsRUFBVyxHQUROLGlCQUFpQixLQUFLLENBQ0osR0FBSyxDQUFDLEVBQ3RDLE1BQU8sQ0FBQyxFQUFXLENBQUksQ0FDekIsQ0FFQSxTQUFnQixHQUFlLEVBQW9CLENBQ2pELE1BQU8sR0FBRyxFQUFLLFlBQVksRUFBRSxHQUFHLEVBQUksRUFBSyxTQUFTLEVBQUksQ0FBQyxFQUFFLEdBQUcsRUFBSSxFQUFLLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBSSxFQUFLLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFDekcsRUFBSyxXQUFXLENBQ2xCLEVBQUUsR0FBRyxFQUFJLEVBQUssV0FBVyxDQUFDLEdBQzVCLENBRUEsU0FBUyxFQUFJLEVBQXVCLENBQ2xDLE9BQU8sT0FBTyxDQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUcsR0FBRyxDQUN0QyxDQUVBLFNBQWdCLEVBQWUsRUFBOEIsQ0FDM0QsR0FBSSxFQUFlLElBQU0sTUFBTyxHQUFHLEtBQUssTUFBTSxDQUFZLEVBQUUsSUFFNUQsSUFBTSxFQUFVLEVBQWUsSUFDL0IsR0FBSSxFQUFVLEdBQUksTUFBTyxHQUFHLE9BQU8sRUFBUSxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBRXZELElBQU0sRUFBVSxLQUFLLE1BQU0sRUFBVSxFQUFFLEVBQ3ZDLE1BQU8sR0FBRyxFQUFRLElBQUksUUFBUSxFQUFVLEVBQVUsR0FBQSxDQUFJLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFDcEUsQ0M1Q0EsTUFBYSxFQUF1QixDQUNsQyxHQUFHLEVBQ0gsT0FBUSxDQUNOLFlBQWEsOENBQ2IsS0FBTSxVQUNOLE1BQU8sR0FDVCxDQUNGLEVDUGFBLEdBQVUsQ0FDckIsR0FBRyxFQUNILE1BQU8sQ0FDTCxZQUNFLDBKQUNGLEtBQU0sUUFDTixNQUFPLEdBQ1QsRUFDQSxVQUFXLENBQ1QsWUFBYSxzQ0FDYixLQUFNLFVBQ04sUUFBUyxFQUNYLEVBQ0Esb0JBQXFCLENBQ25CLFlBQWEsNkRBQ2IsS0FBTSxVQUNOLFFBQVMsRUFDWCxFQUNBLE9BQVEsQ0FDTixZQUFhLDBDQUNiLEtBQU0sVUFDTixRQUFTLEVBQ1gsRUFDQSxVQUFXLENBQ1QsWUFBYSx1Q0FDYixLQUFNLFVBQ04sUUFBUyxFQUNYLEVBQ0EsU0FBVSxDQUNSLFlBQWEsb0NBQ2IsS0FBTSxPQUNSLEVBQ0EsT0FBUSxDQUNOLFlBQWEsaUVBQ2IsS0FBTSxTQUNOLE1BQU8sR0FDVCxFQUNBLE9BQVEsQ0FDTixZQUFhLHVDQUNiLEtBQU0sT0FDUixFQUNBLGNBQWUsQ0FDYixZQUFhLHFEQUNiLEtBQU0sVUFDTixRQUFTLEVBQ1gsRUFDQSxNQUFPLENBQ0wsWUFBYSx1Q0FDYixLQUFNLFVBQ04sTUFBTyxHQUNULEVBQ0EsV0FBWSxDQUNWLFlBQWEsK0NBQ2IsS0FBTSxPQUNSLEVBQ0EsZUFBZ0IsQ0FDZCxZQUFhLGdFQUNiLEtBQU0sT0FDUixDQUNGLEVBRWEsR0FBYSxDQUN4QixHQUFHQSxHQUNILFdBQVksQ0FDVixZQUFhLGlDQUNiLEtBQU0sU0FDTixNQUFPLEdBQ1QsQ0FDRixFQUVhLEdBQW1CLENBQzlCLEdBQUcsR0FDSCxnQkFBaUIsQ0FDZixZQUFhLHlDQUNiLEtBQU0sU0FDUixDQUNGLEVBRWEsR0FBYSxDQUN4QixHQUFHQSxHQUNILFdBQVksQ0FDVixZQUFhLHVDQUNiLEtBQU0sU0FDTixNQUFPLEdBQ1QsRUFJQSxZQUFhLENBQ1gsWUFBYSx5RUFDYixLQUFNLFNBQ04sTUFBTyxHQUNULEVBQ0EsZ0JBQWlCLENBQ2YsWUFBYSxtRUFDYixLQUFNLFVBQ04sUUFBUyxFQUNYLENBQ0YsRUNqR0EsU0FBZ0IsR0FBWSxFQUFtQixFQUFVLEdBQWEsQ0FDcEUsSUFBTSxFQUFPLEVBQU0sTUFBUyxFQUFNLE9BQWlCLEtBQzdDLEVBQWMsRUFBTyxHQUFHLEVBQUssSUFBTSxHQUluQyxFQUFjLENBQUMsRUFBVSxDQUFDLE9BQVEsS0FBSyxFQUFHLE9BQU8sR0FIakMsRUFBTSxPQUFTLFdBQVcsRUFBTSxPQUFPLElBQU0sS0FDaEMsSUFBYyxFQUFNLFdBRVMsQ0FBQyxFQUU3RCxFQUFNLEtBQ1IsRUFBWSxLQUFLLEVBQVUsT0FBUSxFQUFNLEdBQUcsQ0FBQyxFQUczQyxFQUFNLElBQ1IsRUFBWSxLQUFLLEdBQUcsRUFBTSxJQUFJLE1BQVEsRUFBTSxHQUFHLElBQUksRUFBTSxJQUFJLEtBQUssR0FBRyxFQUFNLElBQUksT0FBTyxFQUFFLEVBQy9FLEVBQU0sSUFDZixFQUFZLEtBQUssRUFBTSxFQUFFLEVBR3ZCLEVBQU0sT0FDUixFQUFZLEtBQUssRUFBVSxNQUFPLEVBQU0sS0FBSyxDQUFDLEVBRzVDLEVBQU0sT0FDUixFQUFZLEtBQUssRUFBVSxNQUFPLEVBQU0sTUFBTSxRQUFRLEdBQUcsSUFBYyxFQUFNLFFBQVEsSUFBSyxFQUFFLENBQUMsQ0FBQyxFQUdoRyxFQUFZLEtBQUssR0FBSSxFQUFFLEVBQ3ZCLFFBQVEsTUFBTSxFQUFZLEtBQUs7Q0FBSSxDQUFDLEVBRS9CLEdBQVMsRUFBUSxLQUFLLENBQUMsQ0FDOUIsQ0N2QkEsTUFBTSxHQUFxQixJQUFJLElBQUksQ0FBYyxFQUVqRCxTQUFnQixHQUNkLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDeUIsQ0FDekIsSUFBTSxFQUFzQixHQUF1QixDQUFJLEVBQ2pELEVBQTBCLElBQUksSUFDbEMsR0FBNEIsRUFBTSxFQUFjLEVBQWEsRUFBZ0IsRUFBVyxDQUFtQixDQUM3RyxFQUNBLE1BQVEsSUFDRixHQUE2QixFQUFJLENBQW1CLEVBQVUsR0FDM0QsR0FBYyxDQUFFLEdBQUssR0FBdUIsRUFBSSxDQUF1QixDQUVsRixDQUdBLFNBQVMsR0FBdUIsRUFBWSxFQUE2QixDQUN2RSxHQUFJLEVBQU0sSUFBSSxDQUFFLEVBQUcsTUFBTyxHQUMxQixJQUFLLElBQUksRUFBYSxFQUFHLFFBQVEsR0FBRyxFQUFHLElBQWUsR0FBSSxFQUFhLEVBQUcsUUFBUSxJQUFLLEVBQWEsQ0FBQyxFQUNuRyxHQUFJLEVBQU0sSUFBSSxFQUFHLE1BQU0sRUFBRyxDQUFVLENBQUMsRUFBRyxNQUFPLEdBRWpELE1BQU8sRUFDVCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDVSxDQUNWLElBQU0sRUFBZSxDQUFDLEdBQUksRUFBSyxVQUFZLENBQUMsQ0FBRSxDQUFDLENBQUMsSUFBSyxHQUFTLEVBQUssU0FBUyxDQUFDLEVBQ3pFLEVBQVksZUFBZSxtQkFDN0IsRUFBYSxLQUFLLGVBQWUsRUFHbkMsRUFBYSxLQUNYLEdBQUcsT0FBTyxLQUFLLEVBQVksY0FBZ0IsQ0FBQyxDQUFDLEVBQzdDLEdBQUcsT0FBTyxLQUFLLEVBQVksa0JBQW9CLENBQUMsQ0FBQyxFQUNqRCxHQUFHLE9BQU8sS0FBSyxFQUFZLHNCQUF3QixDQUFDLENBQUMsQ0FDdkQsRUFFQSxJQUFNLEVBQWdCLEVBQUssUUFBUSxDQUFjLEVBQ2pELEdBQUksRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFLLFFBQVEsQ0FBYSxFQUFHLGNBQWMsQ0FBQyxFQUFHLENBQ3pFLElBQU0sRUFBYyxFQUFHLFlBQVksRUFBZSxDQUFFLGNBQWUsRUFBSyxDQUFDLEVBQ3pFLElBQUssSUFBTSxLQUFjLEVBQWEsQ0FDcEMsR0FBSSxDQUFDLEVBQVcsWUFBWSxFQUFHLFNBRS9CLElBQU0sRUFBa0IsRUFBSyxLQUFLLEVBQWUsRUFBVyxLQUFNLGNBQWMsRUFDaEYsR0FBSSxDQUFDLEVBQUcsV0FBVyxDQUFlLEVBQUcsU0FFckMsSUFBTSxFQUFnQyxLQUFLLE1BQU0sRUFBRyxhQUFhLEVBQWlCLE1BQU0sQ0FBQyxFQUNyRixFQUFZLGVBQWUsRUFBaUIsTUFBUSxLQUN0RCxFQUFhLEtBQ1gsR0FBRyxPQUFPLEtBQUssRUFBaUIsY0FBZ0IsQ0FBQyxDQUFDLEVBQ2xELEdBQUcsT0FBTyxLQUFLLEVBQWlCLGtCQUFvQixDQUFDLENBQUMsRUFDdEQsR0FBRyxPQUFPLEtBQUssRUFBaUIsc0JBQXdCLENBQUMsQ0FBQyxDQUM1RCxDQUVKLENBQ0YsQ0FFQSxJQUFNLEVBQ0osR0FBc0MsQ0FBWSxHQUFLLEVBQWdCLE9BQU8sTUFBTSxFQUFVLFNBQVMsRUFBSSxJQUFBLEdBQzdHLE9BQU8sRUFBYSxPQUFRLEdBQzFCLENBQUksRUFBb0IsSUFBSSxFQUF5QixDQUFjLENBQUMsR0FDN0QsQ0FBQyxHQUF5QixLQUFLLENBQWMsQ0FDckQsQ0FDSCxDQUVBLFNBQWdCLEdBQXVCLEVBQWtELENBQ3ZGLE9BQU8sSUFBSSxJQUFJLEVBQUssZ0JBQWdCLElBQUssR0FBUyxFQUF5QixFQUFLLFNBQVMsQ0FBQyxDQUFDLEdBQUssQ0FBQyxDQUFDLENBQ3BHLENBRUEsU0FBUyxHQUFzQyxFQUFxQyxDQUNsRixPQUFPLElBQWlCLFlBQWMsSUFBaUIsV0FDekQsQ0FFQSxTQUFnQixHQUE2QixFQUFZLEVBQXNELENBQzdHLElBQU0sRUFBZSxFQUF5QixDQUFFLEVBQ2hELElBQUssSUFBTSxLQUFlLEVBQ3hCLEdBQUksSUFBaUIsR0FBZSxFQUFhLFdBQVcsR0FBRyxFQUFZLEVBQUUsRUFBRyxPQUFPLENBRzNGLENBRUEsU0FBZ0IsR0FBa0IsRUFBWSxFQUE2QixDQUN6RSxJQUFNLEVBQWUsRUFBeUIsQ0FBRSxFQUNoRCxPQUFPLElBQWlCLEVBQWMsSUFBTSxLQUFLLEVBQWEsTUFBTSxFQUFZLE9BQVMsQ0FBQyxHQUM1RixDQUVBLFNBQWdCLEVBQXlCLEVBQW9CLENBQzNELE9BQU8sRUFBRyxXQUFXLE9BQU8sRUFBSSxFQUFHLE1BQU0sQ0FBYyxFQUFJLENBQzdELENBRUEsU0FBZ0IsR0FBYyxFQUFxQixDQUNqRCxPQUFPLEVBQUcsV0FBVyxPQUFPLEdBQUssR0FBbUIsSUFBSSxDQUFFLENBQzVELENDcEdBLFNBQWdCLEdBQXFCLEVBQXFDLEVBQWdDLENBQ3hHLElBQU0sRUFBc0IsR0FBdUIsQ0FBSSxFQUNqRCxFQUFVLEVBQWMsRUFBSyxLQUFLLEVBQWdCLGNBQWMsQ0FBQyxFQUN2RSxNQUFPLENBQ0wsS0FBTSxrQkFDTixVQUFVLEVBQVEsRUFBVyxFQUFjLENBQ3pDLElBQU0sRUFBYyxHQUE2QixFQUFRLENBQW1CLEVBQ3ZFLEtBRUwsT0FBTyxHQUNMLEVBQ0EsRUFDQSxFQUNBLEdBQTJCLEVBQWEsSUFBSSxFQUM1QyxHQUFrQixFQUFRLENBQVcsQ0FDdkMsQ0FDRixDQUNGLENBQ0YsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNRLENBQ1IsSUFBTSxFQUFrQixHQUFvQixFQUFTLEVBQWEsQ0FBYyxFQUMxRSxFQUEyQixLQUFLLE1BQU0sRUFBRyxhQUFhLEVBQWlCLE1BQU0sQ0FBQyxFQUNwRixHQUFJLENBQUMsRUFBWSxRQUFTLENBQ3hCLElBQU0sRUFBZSxHQUE2QixFQUFTLEVBQWEsRUFBSyxRQUFRLENBQWUsRUFBRyxDQUFPLEVBQzlHLEdBQUksSUFBaUIsR0FBZSxDQUFDLEVBQWEsV0FBVyxPQUFPLEVBQUcsT0FBTyxDQUNoRixDQUVBLElBQU0sRUFBWSxHQUFvQixFQUFhLEVBQVksQ0FBTyxFQUN0RSxHQUFJLENBQUMsRUFDSCxNQUFVLE1BQU0sd0NBQXdDLEdBQWEsRUFFdkUsT0FBTyxFQUFLLEtBQUssRUFBSyxRQUFRLENBQWUsRUFBRyxDQUFTLENBQzNELENBRUEsU0FBUyxHQUEyQixFQUFxQyxDQUN2RSxJQUFNLEVBQWEsSUFBSSxJQUFJLENBQUMsY0FBZSxPQUFRLGNBQWUsU0FBUyxDQUFDLEVBTTVFLE9BTEksSUFBZSxlQUNqQixFQUFXLElBQUksU0FBUyxFQUV4QixFQUFXLElBQUksUUFBUSxFQUVsQixDQUNULENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQ1EsQ0FDUixHQUFJLElBQVksSUFBSyxPQUFPLEVBQVEsUUFBUSxDQUFXLEVBQ3ZELElBQU0sRUFBZSxFQUFRLFFBQVEsR0FBRyxFQUFZLEdBQUcsRUFBUSxNQUFNLENBQVcsR0FBRyxFQUNuRixPQUFPLEdBQWMsQ0FBWSxFQUFJLEdBQTZCLEVBQWdCLENBQU8sRUFBSSxDQUMvRixDQUVBLFNBQVMsR0FBNkIsRUFBd0IsRUFBeUIsQ0FDckYsSUFBTSxFQUFtQixFQUEwQixDQUFPLEVBQzFELEdBQUksQ0FBQyxFQUFrQixNQUFVLE1BQU0scUNBQXFDLEdBQVMsRUFFckYsSUFBTSxFQUFZLEVBQUssS0FBSyxFQUFnQixDQUFnQixFQUN0RCxFQUFlLEVBQWdCLENBQVMsR0FBSyxHQUFxQixDQUFTLEVBQ2pGLEdBQUksRUFBYyxPQUFPLEVBQ3pCLE1BQVUsTUFBTSxxQ0FBcUMsR0FBUyxDQUNoRSxDQUVBLFNBQVMsRUFBZ0IsRUFBc0MsQ0FFN0QsT0FEa0IsRUFBSyxRQUFRLENBQVEsRUFBSSxDQUFDLENBQVEsRUFBSSxDQUFDLEVBQVUsR0FBRyxFQUFTLEtBQU0sR0FBRyxFQUFTLE9BQVEsR0FBRyxFQUFTLE1BQU0sRUFBQSxDQUMxRyxLQUFNLEdBQWtCLEVBQUcsV0FBVyxDQUFhLEdBQUssRUFBRyxTQUFTLENBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUM5RyxDQUVBLFNBQVMsR0FBcUIsRUFBcUMsQ0FDakUsSUFBTSxFQUFrQixFQUFLLEtBQUssRUFBUyxjQUFjLEVBQ3pELEdBQUksRUFBRyxXQUFXLENBQWUsRUFBRyxDQUNsQyxJQUFNLEVBQTJCLEtBQUssTUFBTSxFQUFHLGFBQWEsRUFBaUIsTUFBTSxDQUFDLEVBQzlFLEVBQVcsRUFBZ0IsRUFBSyxLQUFLLEVBQVMsRUFBWSxNQUFRLFVBQVUsQ0FBQyxFQUNuRixHQUFJLEVBQVUsT0FBTyxDQUN2QixDQUNBLE9BQU8sRUFBZ0IsRUFBSyxLQUFLLEVBQVMsT0FBTyxDQUFDLENBQ3BELENBRUEsU0FBUyxHQUFvQixFQUF5QixFQUFxQixFQUFnQyxDQUN6RyxJQUFNLEVBQWMsRUFBUSxRQUFRLE1BQU0sQ0FBVyxHQUFLLEVBQVEsUUFBUSxNQUFNLDZCQUE2QixHQUFLLENBQUMsRUFDbkgsSUFBSyxJQUFNLElBQWMsQ0FBQyxFQUFLLEtBQUssRUFBZ0IsY0FBYyxFQUFHLEdBQUcsQ0FBVyxFQUFHLENBQ3BGLElBQU0sRUFBa0IsRUFBSyxLQUFLLEVBQVksRUFBYSxjQUFjLEVBQ3pFLEdBQUksRUFBRyxXQUFXLENBQWUsRUFBRyxPQUFPLEVBQUcsYUFBYSxDQUFlLENBQzVFLENBQ0EsTUFBVSxNQUFNLHNDQUFzQyxHQUFhLENBQ3JFLENBRUEsU0FBUyxHQUFvQixFQUEwQixFQUF5QixFQUFxQyxDQUNuSCxHQUFJLEVBQVksUUFBUyxDQUN2QixJQUFNLEVBQVksRUFBbUIsRUFBWSxRQUFTLEVBQVksQ0FBTyxFQUM3RSxPQUFPLElBQWMsS0FBTyxJQUFBLEdBQVksRUFBMEIsQ0FBUyxDQUM3RSxDQUVBLE9BREksSUFBWSxJQUFZLEVBQVksTUFBUSxXQUN6QyxFQUEwQixDQUFPLENBQzFDLENBRUEsU0FBUyxFQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQzJCLENBQzNCLEdBQUksT0FBTyxHQUFpQixTQUMxQixPQUFPLElBQVksSUFBTSxFQUFvQixFQUFjLENBQVksRUFBSSxJQUFBLEdBRTdFLEdBQUksSUFBaUIsS0FBTSxPQUFPLEtBQ2xDLEdBQUksTUFBTSxRQUFRLENBQVksRUFBRyxDQUMvQixHQUFJLElBQVksSUFBSyxPQUVyQixJQUFLLElBQU0sS0FBZSxFQUFjLENBQ3RDLElBQUksRUFDSixHQUFJLENBQ0YsRUFBWSxFQUFtQixFQUFhLEVBQVksRUFBUyxDQUFZLENBQy9FLE1BQVEsQ0FDTixRQUNGLENBQ0EsR0FBSSxFQUFXLE9BQU8sQ0FDeEIsQ0FDQSxNQUNGLENBQ0EsR0FBSSxPQUFPLEdBQWlCLFNBQVUsT0FFdEMsSUFBTSxFQUFlLEVBQ3JCLEdBQUksR0FBa0IsQ0FBWSxFQUFHLENBQ25DLEdBQUksT0FBTyxPQUFPLEVBQWMsQ0FBTyxFQUFHLE9BQU8sRUFBbUIsRUFBYSxHQUFVLEVBQVksR0FBRyxFQUUxRyxJQUFNLEVBQWdCLEdBQXlCLEVBQWMsQ0FBTyxFQUNwRSxPQUFPLElBQWtCLElBQUEsR0FBWSxJQUFBLEdBQVksRUFBbUIsRUFBYyxNQUFPLEVBQVksR0FBRyxDQUMxRyxDQUNJLE9BQVksSUFFaEIsSUFBSyxHQUFNLENBQUMsRUFBVyxLQUFVLE9BQU8sUUFBUSxDQUFZLEVBQUcsQ0FDN0QsR0FBSSxDQUFDLEVBQVcsSUFBSSxDQUFTLEVBQUcsU0FFaEMsSUFBTSxFQUFZLEVBQW1CLEVBQU8sRUFBWSxFQUFTLENBQVksRUFDN0UsR0FBSSxJQUFjLElBQUEsR0FBVyxPQUFPLENBQ3RDLENBRUYsQ0FFQSxTQUFTLEdBQWtCLEVBQWdELENBQ3pFLE9BQU8sT0FBTyxLQUFLLENBQVksQ0FBQyxDQUFDLEtBQU0sR0FBUSxJQUFRLEtBQU8sRUFBSSxXQUFXLElBQUksQ0FBQyxDQUNwRixDQUVBLFNBQVMsR0FBeUIsRUFBdUMsRUFBaUQsQ0FDeEgsSUFBSyxHQUFNLENBQUMsRUFBSyxLQUFVLE9BQU8sUUFBUSxDQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBTyxDQUFDLEtBQVUsR0FBeUIsRUFBTSxDQUFJLENBQUMsRUFBRyxDQUN0SCxJQUFNLEVBQWUsR0FBc0IsRUFBSyxDQUFPLEVBQ3ZELEdBQUksSUFBaUIsSUFBQSxHQUNuQixNQUFPLENBQUUsTUFBTyxFQUFxQixFQUFPLENBQVksQ0FBRSxDQUU5RCxDQUVGLENBRUEsU0FBUyxHQUF5QixFQUFjLEVBQXNCLENBQ3BFLElBQU0sRUFBYyxFQUFLLFFBQVEsR0FBRyxFQUM5QixFQUFjLEVBQUssUUFBUSxHQUFHLEVBSXBDLE9BSEksSUFBZ0IsSUFBTSxJQUFnQixHQUFXLEVBQ2pELElBQWdCLEdBQVcsRUFDM0IsSUFBZ0IsR0FBVyxHQUN4QixFQUFjLEdBQWUsRUFBSyxPQUFTLEVBQUssTUFDekQsQ0FFQSxTQUFTLEdBQXNCLEVBQWlCLEVBQXFDLENBQ25GLEdBQUksQ0FBQyxFQUFRLFdBQVcsSUFBSSxHQUFLLENBQUMsRUFBUSxTQUFTLEdBQUcsRUFBRyxPQUV6RCxHQUFNLENBQUMsRUFBUSxHQUFVLEVBQVEsTUFBTSxJQUFLLENBQUMsRUFDekMsU0FBWSxHQUFVLENBQUMsRUFBUSxXQUFXLENBQU0sR0FBSyxDQUFDLEVBQVEsU0FBUyxDQUFNLEdBQUssRUFBUSxPQUFTLEVBQVEsUUFHL0csT0FBTyxFQUFRLE1BQU0sRUFBTyxPQUFRLEVBQVEsT0FBUyxFQUFPLE1BQU0sQ0FDcEUsQ0FFQSxTQUFTLEVBQXFCLEVBQWdCLEVBQStCLENBSzNFLE9BSkksT0FBTyxHQUFVLFNBQWlCLEVBQW9CLEVBQU8sQ0FBWSxFQUN6RSxNQUFNLFFBQVEsQ0FBSyxFQUFVLEVBQU0sSUFBSyxHQUFTLEVBQXFCLEVBQU0sQ0FBWSxDQUFDLEVBQ3pGLENBQUMsR0FBUyxPQUFPLEdBQVUsU0FBaUIsRUFFekMsT0FBTyxZQUNaLE9BQU8sUUFBUSxDQUFnQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUssS0FBVSxDQUFDLEVBQUssRUFBcUIsRUFBTSxDQUFZLENBQUMsQ0FBQyxDQUN2SCxDQUNGLENBRUEsU0FBUyxFQUFvQixFQUFnQixFQUEwQyxDQUtyRixPQUpBLEdBQXFCLENBQU0sRUFDdkIsSUFBaUIsSUFBQSxHQUFrQixHQUV2QyxHQUEyQixDQUFZLEVBQ2hDLEVBQU8sV0FBVyxJQUFLLENBQVksRUFDNUMsQ0FFQSxTQUFTLEdBQXFCLEVBQXNCLENBQ2xELEdBQUksQ0FBQyxFQUFPLFdBQVcsSUFBSSxFQUFHLE1BQVUsTUFBTSxrQ0FBa0MsR0FBUSxFQUV4RixFQUFxQixFQUFPLE1BQU0sQ0FBVyxFQUFHLENBQU0sQ0FDeEQsQ0FFQSxTQUFTLEdBQTJCLEVBQTRCLENBQzlELEVBQXFCLEVBQWMsQ0FBWSxDQUNqRCxDQUVBLFNBQVMsRUFBcUIsRUFBbUIsRUFBMkIsQ0FDMUUsSUFBTSxFQUFjLEdBQWdCLEVBQVcsQ0FBVyxFQUNwRCxFQUFrQixJQUFJLElBQUksQ0FBQyxHQUFJLElBQUssS0FBTSxjQUFjLENBQUMsRUFDL0QsSUFBSyxJQUFNLEtBQVcsRUFBWSxNQUFNLFFBQVEsRUFDOUMsR0FBSSxFQUFnQixJQUFJLENBQU8sRUFDN0IsTUFBVSxNQUFNLDBDQUEwQyxHQUFhLENBRzdFLENBRUEsU0FBUyxHQUFnQixFQUFtQixFQUE2QixDQUN2RSxHQUFJLENBQ0YsT0FBTyxtQkFBbUIsQ0FBUyxDQUFDLENBQUMsWUFBWSxDQUNuRCxNQUFRLENBQ04sTUFBVSxNQUFNLDBDQUEwQyxHQUFhLENBQ3pFLENBQ0YsQ0FFQSxTQUFTLEVBQTBCLEVBQW1ELENBQ3BGLE9BQU8sR0FBVyxRQUFRLFFBQVMsRUFBRSxDQUN2QyxDQ2hQQSxNQUFNLEdBQXVCLENBQUMsT0FBUSxPQUFRLE1BQU8sT0FBUSxPQUFRLE9BQVEsTUFBTyxNQUFNLEVBRTFGLFNBQWdCLEVBQXNCLEVBQXFCLENBQ3pELE9BQ0UsR0FBcUIsS0FBTSxHQUFjLEVBQUcsU0FBUyxDQUFTLENBQUMsR0FBSyxDQUFDLEVBQUcsV0FBVyxJQUFJLEdBQUssQ0FBQyxHQUFrQixDQUFFLENBRXJILENBRUEsU0FBUyxHQUFrQixFQUFxQixDQUM5QyxPQUFPLEVBQUcsU0FBUyxnQkFBZ0IsR0FBSyxFQUFHLFNBQVMsa0JBQWtCLENBQ3hFLENBRUEsU0FBZ0IsR0FBZ0IsRUFBWSxFQUF3RCxDQUNsRyxJQUFNLEVBQU8sR0FBYyxDQUFFLEVBQ3ZCLEVBQWEsR0FBb0IsQ0FBRSxFQUNuQyxFQUFNLEVBQVUsRUFBSSxFQUFNLENBQUUsT0FBTSxZQUFXLENBQUMsRUFDcEQsR0FBSSxDQUFDLEdBQWMsQ0FBRyxFQUFHLE9BQU8sRUFDaEMsR0FBSSxFQUFHLFNBQVMsS0FBSyxHQUFLLElBQWUsY0FBZSxDQUN0RCxJQUFNLEVBQWMsRUFBVSxFQUFJLEVBQU0sQ0FBRSxPQUFNLFdBQVksVUFBVyxDQUFDLEVBQ3hFLEdBQUksQ0FBQyxHQUFjLENBQVcsRUFBRyxPQUFPLENBQzFDLENBRUYsQ0FFQSxTQUFTLEdBQWMsRUFBNEMsQ0FDakUsT0FBTyxFQUFJLE9BQU8sS0FBTSxHQUFVLEVBQU0sV0FBYSxPQUFPLENBQzlELENBRUEsU0FBUyxHQUFjLEVBQXlDLENBSTlELE9BSEksRUFBRyxTQUFTLE1BQU0sRUFBVSxNQUM1QixFQUFHLFNBQVMsS0FBSyxHQUFLLEVBQUcsU0FBUyxNQUFNLEdBQUssRUFBRyxTQUFTLE1BQU0sRUFBVSxLQUN6RSxFQUFHLFNBQVMsTUFBTSxFQUFVLE1BQ3pCLElBQ1QsQ0FFQSxTQUFTLEdBQW9CLEVBQXdDLENBQ25FLE9BQU8sRUFBRyxTQUFTLE1BQU0sR0FBSyxFQUFHLFNBQVMsTUFBTSxFQUFJLFdBQWEsYUFDbkUsQ0FTQSxTQUFnQixFQUFtQixFQUEwQixDQUMzRCxPQUFRLEVBQVksRUFBSyxPQUFTLENBQUMsRUFBQSxDQUNoQyxRQUFTLEdBQVEsQ0FDaEIsSUFBTSxFQUFRLEVBQUssR0FDbkIsT0FBTyxNQUFNLFFBQVEsQ0FBSyxFQUFJLEVBQVEsQ0FBQyxDQUFLLENBQzlDLENBQUMsQ0FBQyxDQUNELE9BQVEsR0FBNEIsRUFBVSxDQUFLLENBQUMsQ0FDekQsQ0FFQSxTQUFnQixFQUFtQixFQUFlLEVBQWtDLENBQ2xGLElBQU0sRUFBUSxFQUFLLEdBQ25CLE9BQU8sRUFBVSxDQUFLLEVBQUksRUFBUSxJQUFBLEVBQ3BDLENBRUEsU0FBZ0IsRUFBb0IsRUFBZSxFQUF3QixDQUN6RSxJQUFNLEVBQVEsRUFBSyxHQUNuQixPQUFPLE1BQU0sUUFBUSxDQUFLLEVBQUksRUFBTSxPQUFRLEdBQTBCLEVBQVUsQ0FBSSxDQUFDLEVBQUksQ0FBQyxDQUM1RixDQUVBLFNBQWdCLEVBQVUsRUFBa0MsQ0FDMUQsTUFBTyxDQUFDLENBQUMsR0FBUyxPQUFPLEdBQVUsVUFBWSxPQUFRLEVBQWtCLE1BQVMsUUFDcEYsQ0MvREEsU0FBZ0IsR0FBa0IsRUFBYyxFQUFLLFVBQW9CLENBRXZFLEdBQUksQ0FBQyxFQUFLLFNBQVMsR0FBRyxFQUFHLE1BQU8sR0FFaEMsSUFBTSxFQUFNLEdBQWdCLEVBQUksQ0FBSSxFQUdwQyxNQURBLENBQUssR0FDRSxFQUFVLEVBQUksT0FBTyxHQUFLLEdBQWlCLEVBQUksT0FBTyxDQUMvRCxDQUVBLFNBQVMsR0FBaUIsRUFBd0IsQ0FFaEQsT0FESSxFQUFLLE9BQVMsYUFDWCxFQUFtQixDQUFJLENBQUMsQ0FBQyxLQUFNLEdBQVUsR0FBaUIsQ0FBSyxDQUFDLENBQ3pFLENDTkEsU0FBZ0IsSUFBNEQsQ0FDMUUsR0FBTSxDQUFFLE9BQVEsUUFDaEIsR0FBSSxFQUFJLFdBQWEsYUFBYyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVMsT0FBUSxNQUFNLENBQUMsRUFDM0UsR0FBSSxFQUFJLFdBQWEsT0FBUSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVMsUUFBUyxPQUFRLE1BQU0sQ0FBQyxDQUVoRixDQUVBLFNBQWdCLEdBQW9CLEVBQXNDLENBQ3hFLE1BQU8sQ0FDTCxLQUFNLGlCQUNOLFVBQVUsRUFBTSxFQUFJLENBQ2IsS0FBc0IsQ0FBRSxHQUV4QixjQUFjLEtBQUssQ0FBSSxFQUU1QixPQUFPLEdBQWMsRUFBTSxFQUFJLENBQWUsQ0FDaEQsQ0FDRixDQUNGLENBRUEsU0FBUyxHQUFjLEVBQWMsRUFBWSxFQUFpRixDQUNoSSxJQUFNLEVBQU0sR0FBZ0IsRUFBSSxDQUFJLEVBQ3BDLEdBQUksQ0FBQyxHQUFPLENBQUMsRUFBVSxFQUFJLE9BQU8sRUFBRyxPQUVyQyxJQUFNLEVBQWMsSUFBSSxFQUFZLENBQUksRUFDbEMsRUFBcUMsQ0FBQyxFQUU1QyxFQUEyQixFQUFJLFFBQVMsQ0FBQyxFQUFHLENBQUssRUFBRyxFQUFjLENBQWUsRUFDakYsSUFBSyxJQUFNLEtBQWUsR0FBMEIsQ0FBWSxFQUM5RCxFQUFZLFVBQVUsRUFBWSxNQUFPLEVBQVksSUFBSyxFQUFZLEtBQUssRUFHeEUsS0FBWSxXQUFXLEVBQzVCLE1BQU8sQ0FDTCxLQUFNLEVBQVksU0FBUyxFQUMzQixJQUFLLEVBQVksWUFBWSxDQUFFLE1BQU8sRUFBSyxDQUFDLENBQzlDLENBQ0YsQ0FlQSxNQUFNLEdBQXlCLG1CQUN6QixHQUFzQixXQUU1QixTQUFTLEVBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBRU4sSUFBTSxFQUFRLEdBQWdCLEVBRGYsRUFBVSxHQUFHLEVBQ2EsQ0FBQyxFQUN0QyxHQUFPLEVBQU8sS0FBSyxDQUFLLEVBRXhCLENBQUMsR0FBa0IsRUFBUSxDQUFJLEdBQUssRUFBSyxPQUFTLGtCQUNwRCxHQUE4QixFQUFNLEVBQVcsRUFBYyxDQUFlLEVBRTFFLENBQUMsR0FBa0IsRUFBUSxDQUFJLEdBQUssRUFBSyxPQUFTLG9CQUNwRCxHQUFnQyxFQUFNLEVBQVcsRUFBYyxDQUFlLEVBR2hGLElBQU0sRUFBaUIsQ0FBQyxHQUFHLEVBQVcsQ0FBSSxFQUMxQyxJQUFLLElBQU0sS0FBUyxFQUFtQixDQUFJLEVBQ3pDLEVBQTJCLEVBQU8sRUFBZ0IsRUFBUSxFQUFjLENBQWUsRUFHckYsR0FBTyxFQUFPLElBQUksQ0FDeEIsQ0FFQSxTQUFTLEdBQWdCLEVBQWUsRUFBdUQsQ0FDN0YsR0FBSSxFQUFLLE9BQVMsVUFDaEIsTUFBTyxDQUFFLElBQUssRUFBSyxJQUFLLGVBQWdCLEdBQXlCLENBQUksRUFBRyxNQUFPLEVBQUssS0FBTSxFQUU1RixHQUFJLEVBQTJCLENBQUksRUFDakMsTUFBTyxDQUFFLElBQUssRUFBSyxJQUFLLGVBQWdCLEdBQTBCLENBQUksRUFBRyxNQUFPLEVBQUssS0FBTSxFQUU3RixHQUFJLEVBQUssT0FBUyxpQkFBa0IsQ0FDbEMsSUFBTSxFQUFpQixFQUFTLEVBQTJCLENBQU0sRUFBSSxHQUNyRSxNQUFPLENBQUUsSUFBSyxFQUFLLElBQUssZUFBZ0IsR0FBdUIsRUFBTSxFQUFLLEdBQU0sR0FBa0IsRUFBNEIsQ0FBSSxFQUFJLE1BQU8sRUFBSyxLQUFNLENBQzFKLENBQ0EsR0FBSSxFQUFLLE9BQVMsY0FDaEIsTUFBTyxDQUFFLElBQUssRUFBSyxJQUFLLGVBQWdCLEVBQXlCLEVBQUssS0FBSyxFQUFHLE1BQU8sRUFBSyxLQUFNLEVBRWxHLEdBQUksRUFBSyxPQUFTLGtCQUNoQixNQUFPLENBQUUsSUFBSyxFQUFLLElBQUssZUFBZ0IsRUFBeUIsRUFBSyxFQUFFLEVBQUcsTUFBTyxFQUFLLEtBQU0sRUFFL0YsR0FBSSxFQUFLLE9BQVMsZUFBaUIsRUFBSyxPQUFTLGdCQUMvQyxNQUFPLENBQ0wsSUFBSyxFQUFLLElBQ1YsZUFDRSxHQUF1QixFQUFNLEVBQUssR0FDbEMsRUFBNEIsQ0FBSSxHQUMvQixFQUFLLE9BQVMsaUJBQW1CLEdBQTJCLENBQU0sRUFDckUsTUFBTyxFQUFLLEtBQ2QsRUFFRixHQUFJLEVBQUssT0FBUyxrQkFDaEIsTUFBTyxDQUFFLElBQUssRUFBSyxJQUFLLGVBQWdCLEdBQXdCLENBQUksRUFBRyxNQUFPLEdBQW9CLENBQUksQ0FBRSxFQUUxRyxHQUFJLEVBQUssT0FBUyxhQUFjLENBQzlCLElBQU0sRUFBdUIsR0FBUSxPQUFTLG1CQUFxQixHQUF3QixDQUFNLEVBQ2pHLE1BQU8sQ0FDTCxJQUFLLEVBQUssSUFDVixlQUFnQixHQUF3QixHQUE0QixDQUFJLEVBQ3hFLE1BQU8sR0FBd0IsQ0FBSSxDQUNyQyxDQUNGLENBQ0EsR0FBSSxFQUFLLE9BQVMsZ0JBQWtCLEVBQUssT0FBUyxrQkFBb0IsRUFBSyxPQUFTLGlCQUNsRixNQUFPLENBQUUsSUFBSyxFQUFLLElBQUssZUFBZ0IsR0FBc0IsQ0FBSSxFQUFHLE1BQU8sRUFBSyxLQUFNLENBRzNGLENBRUEsU0FBUyxHQUF5QixFQUF3QixDQUN4RCxJQUFLLElBQU0sS0FBYSxFQUFvQixFQUFNLE1BQU0sRUFDdEQsR0FBSSxFQUE2QixFQUFXLEVBQUksRUFBRyxNQUFPLEdBRTVELE9BQU8sRUFBNEIsQ0FBSSxDQUN6QyxDQUVBLFNBQVMsR0FBMEIsRUFBd0IsQ0FDekQsR0FBSSxFQUF5QixFQUFLLEVBQUUsRUFBRyxNQUFPLEdBQzlDLElBQUssSUFBTSxLQUFTLEVBQW9CLEVBQU0sUUFBUSxFQUNwRCxHQUFJLEVBQXlCLENBQUssRUFBRyxNQUFPLEdBRTlDLE1BQU8sRUFDVCxDQUVBLFNBQVMsR0FBdUIsRUFBZSxFQUE4QixDQUMzRSxJQUFLLElBQU0sS0FBYSxFQUFvQixFQUFNLE1BQU0sRUFDdEQsR0FBSSxFQUE2QixFQUFXLENBQVUsRUFBRyxNQUFPLEdBRWxFLE1BQU8sRUFDVCxDQUVBLFNBQVMsR0FBd0IsRUFBd0IsQ0FDdkQsSUFBSyxJQUFNLEtBQWMsRUFBb0IsRUFBTSxPQUFPLEVBQ3hELElBQUssSUFBTSxLQUFhLEVBQW9CLEVBQVksWUFBWSxFQUNsRSxHQUFJLEVBQTZCLEVBQVcsRUFBSyxFQUFHLE1BQU8sR0FHL0QsTUFBTyxFQUNULENBRUEsU0FBUyxHQUFvQixFQUF1QixDQUNsRCxJQUFLLElBQU0sS0FBYyxFQUFvQixFQUFNLE9BQU8sRUFBRyxDQUMzRCxJQUFNLEVBQVEsR0FBd0IsQ0FBVSxFQUNoRCxHQUFJLEVBQVEsRUFBVyxJQUFLLE9BQU8sQ0FDckMsQ0FDQSxPQUFPLEVBQUssR0FDZCxDQUVBLFNBQVMsR0FBNEIsRUFBd0IsQ0FDM0QsSUFBSyxJQUFNLEtBQWEsRUFBb0IsRUFBTSxZQUFZLEVBQzVELEdBQUksRUFBNkIsRUFBVyxFQUFLLEVBQUcsTUFBTyxHQUU3RCxNQUFPLEVBQ1QsQ0FFQSxTQUFTLEdBQXdCLEVBQXVCLENBQ3RELElBQU0sRUFBTyxFQUFtQixFQUFNLE1BQU0sRUFFNUMsT0FESSxFQUFhLEVBQUssTUFDZixFQUFvQixFQUFNLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFTLEVBQUssR0FDbkUsQ0FFQSxTQUFTLEdBQXNCLEVBQXdCLENBQ3JELElBQU0sRUFBYyxFQUFtQixFQUFNLEVBQUssT0FBUyxlQUFpQixPQUFTLE1BQU0sRUFDM0YsTUFBTyxDQUFDLENBQUMsR0FBZSxFQUFZLE9BQVMsdUJBQXlCLEVBQVksT0FBUyxPQUFTLEVBQXFDLENBQVcsQ0FDdEosQ0FFQSxTQUFTLEVBQTRCLEVBQW9DLENBQ3ZFLEdBQUksQ0FBQyxFQUFNLE1BQU8sR0FFbEIsSUFBSyxJQUFNLEtBQVMsRUFBbUIsQ0FBSSxFQUNyQyxTQUFVLElBQVMsRUFBMkIsQ0FBSyxHQUFLLEVBQU0sT0FBUyxlQUFpQixFQUFNLE9BQVMsb0JBSXpHLEVBQU0sT0FBUyx1QkFDZixFQUFNLE9BQVMsT0FDZixFQUFxQyxDQUFLLEdBSXhDLEVBQTRCLENBQUssR0FBRyxNQUFPLEdBRWpELE1BQU8sRUFDVCxDQUVBLFNBQVMsR0FBd0IsRUFBd0IsQ0FFdkQsT0FESSxFQUFLLGFBQWUsUUFDakIsRUFBb0IsRUFBTSxZQUFZLENBQUMsQ0FBQyxLQUM1QyxHQUFjLEVBQVUsYUFBZSxRQUFVLEVBQXlCLEVBQVUsS0FBSyxDQUM1RixDQUNGLENBRUEsU0FBUyxFQUE2QixFQUFlLEVBQThCLENBQ2pGLElBQU0sRUFBYyxHQUFxQixDQUFJLEdBQUssRUFZbEQsT0FYSSxFQUFZLFVBQVksR0FBYSxHQUNyQyxFQUFZLE9BQVMsb0JBQTRCLEdBQXdCLENBQVcsRUFDcEYsRUFBWSxPQUFTLHVCQUF5QixFQUFZLE9BQVMsbUJBQzlELEVBQXlCLEVBQVksRUFBRSxFQUU1QyxFQUFZLE9BQVMsNEJBQ2hCLEVBQVksYUFBZSxRQUFVLEVBQXlCLEVBQVksRUFBRSxFQUVqRixFQUFZLE9BQVMscUJBQXVCLEVBQVksT0FBUyxzQkFDNUQsR0FBa0MsRUFBbUIsRUFBYSxJQUFJLENBQUMsRUFHOUUsRUFBWSxPQUFTLHdCQUNwQixHQUFjLEVBQVksT0FBUyxRQUNwQyxFQUFxQyxDQUFXLENBRXBELENBRUEsU0FBUyxHQUEyQixFQUFvQyxDQUN0RSxPQUFPLEdBQU0sT0FBUyx1QkFBeUIsRUFBSyxVQUFZLElBQVEsRUFBMEIsRUFBbUIsRUFBTSxJQUFJLENBQUMsQ0FDbEksQ0FFQSxTQUFTLEdBQWtDLEVBQWtDLENBRzNFLE9BRkssRUFDRCxFQUFHLE9BQVMsYUFBcUIsRUFBRyxPQUFTLFVBQzFDLEVBQUcsT0FBUyxtQkFBcUIsR0FBa0MsRUFBbUIsRUFBSSxNQUFNLENBQUMsRUFGeEYsRUFHbEIsQ0FFQSxTQUFTLEVBQTBCLEVBQWtDLENBR25FLE9BRkssRUFDRCxFQUFHLE9BQVMsYUFBcUIsRUFBRyxPQUFTLFVBRS9DLEVBQUcsT0FBUyxvQkFDWCxFQUEwQixFQUFtQixFQUFJLE1BQU0sQ0FBQyxHQUFLLEVBQTBCLEVBQW1CLEVBQUksT0FBTyxDQUFDLEdBSnpHLEVBTWxCLENBRUEsU0FBUyxFQUFxQyxFQUF3QixDQUNwRSxPQUFPLEVBQW9CLEVBQU0sY0FBYyxDQUFDLENBQUMsS0FBTSxHQUNyRCxFQUF5QixFQUFtQixFQUFhLElBQUksQ0FBQyxDQUNoRSxDQUNGLENBRUEsU0FBUyxFQUF5QixFQUF5QixDQXFCekQsT0FwQkssRUFBVSxDQUFLLEVBRWhCLEVBQU0sT0FBUyxjQUFnQixFQUFNLE9BQVMsVUFBa0IsR0FDaEUsRUFBTSxPQUFTLHFCQUF1QixFQUFNLE9BQVMsY0FDaEQsRUFBeUIsRUFBTSxNQUFRLEVBQU0sUUFBUSxFQUUxRCxFQUFNLE9BQVMsc0JBQ1YsRUFBeUIsRUFBTSxTQUFTLEVBRTdDLEVBQU0sT0FBUyxrQkFDVixFQUF5QixFQUFNLElBQUksRUFFeEMsRUFBTSxPQUFTLGVBQ1YsRUFBb0IsRUFBTyxVQUFVLENBQUMsQ0FBQyxLQUFNLEdBQVksRUFBeUIsQ0FBTyxDQUFDLEVBRS9GLEVBQU0sT0FBUyxpQkFDVixFQUFvQixFQUFPLFlBQVksQ0FBQyxDQUFDLEtBQU0sR0FDcEQsRUFBeUIsRUFBUyxPQUFTLEVBQVMsUUFBUSxDQUM5RCxFQWxCNEIsRUFxQmhDLENBRUEsU0FBUyxFQUEyQixFQUF3QixDQUMxRCxPQUFPLEVBQUssT0FBUyx1QkFBeUIsRUFBSyxPQUFTLHNCQUF3QixFQUFLLE9BQVMseUJBQ3BHLENBRUEsU0FBUyxHQUFrQixFQUF3QixFQUF3QixDQUN6RSxPQUFPLEVBQU8sS0FBTSxHQUFVLEVBQU0sZ0JBQWtCLEVBQU0sT0FBUyxFQUFLLE9BQVMsRUFBSyxLQUFPLEVBQU0sR0FBRyxDQUMxRyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBQ04sSUFBTSxFQUFTLEVBQVUsR0FBRyxFQUFFLEVBQ3hCLEVBQVMsRUFBbUIsRUFBTSxRQUFRLEVBQzVDLEtBQUssV0FBYSxHQUN0QixJQUFJLENBQUMsR0FBVSxDQUFDLEdBQXdCLEVBQVEsQ0FBZSxFQUFHLENBQzVELEdBQVUsR0FBNEIsRUFBUSxDQUFlLEdBQy9ELEVBQWEsS0FBSyxDQUFFLEtBQU0sVUFBVyxNQUFPLEVBQUssTUFBTyxJQUFLLEVBQUssSUFBSyxNQUFPLEVBQTJCLEVBQU0sQ0FBUyxDQUFFLENBQUMsRUFFN0gsTUFDRixDQUVJLEdBQVEsT0FBUyxzQkFDbkIsRUFBYSxLQUFLLENBQUUsS0FBTSxVQUFXLE1BQU8sRUFBTyxNQUFPLElBQUssRUFBTyxJQUFLLE1BQU8sR0FBSSxDQUFDLEVBRXZGLEVBQWEsS0FBSyxDQUFFLEtBQU0sVUFBVyxNQUFPLEVBQUssTUFBTyxJQUFLLEVBQUssSUFBSyxNQUFPLEdBQWtDLEVBQU0sQ0FBUyxDQUFFLENBQUMsQ0FMcEksQ0FPRixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNNLENBQ04sSUFBTSxFQUFTLEVBQVUsR0FBRyxFQUFFLEVBQ3hCLEVBQWMsRUFBVSxHQUFHLEVBQUUsRUFDL0IsTUFBQyxHQUF3QixFQUFNLENBQWUsR0FBSyxHQUFRLE9BQVMscUJBQ3BFLEtBQVEsT0FBUyxrQkFBb0IsRUFBTyxTQUFXLEdBQVEsRUFBTyxXQUFhLEtBQ25GLElBQTBCLEVBQU0sRUFBUSxDQUFXLEVBRXZELElBQUksR0FBUSxPQUFTLHdCQUEwQixFQUFPLE9BQVMsRUFBTSxDQUNuRSxJQUFNLEVBQVEsRUFBbUIsRUFBUSxPQUFPLEVBQzVDLEdBQ0YsRUFBYSxLQUFLLENBQUUsS0FBTSxVQUFXLE1BQU8sRUFBTSxNQUFPLElBQUssRUFBTSxJQUFLLE1BQU8sRUFBMkIsRUFBTyxDQUFTLENBQUUsQ0FBQyxFQUVoSSxNQUNGLENBRUEsRUFBYSxLQUFLLENBQUUsS0FBTSxVQUFXLE1BQU8sRUFBSyxNQUFPLElBQUssRUFBSyxJQUFLLE1BQU8sRUFBMkIsRUFBTSxDQUFTLENBQUUsQ0FBQyxDQUYzSCxDQUdGLENBRUEsU0FBUyxHQUFrQyxFQUFlLEVBQThCLENBQ3RGLE9BQU8sR0FBK0IsRUFBTSxDQUFTLEVBQUksSUFBSSxLQUF3QixFQUN2RixDQUVBLFNBQVMsRUFBMkIsRUFBZSxFQUE4QixDQUMvRSxPQUFPLEdBQStCLEVBQU0sQ0FBUyxFQUFJLElBQUksS0FBMkIsRUFDMUYsQ0FFQSxTQUFTLEdBQStCLEVBQWUsRUFBK0IsQ0FDcEYsSUFBTSxFQUFpQixFQUFVLGNBQWUsR0FBYSxFQUFTLE9BQVMscUJBQXFCLEVBQ3BHLEdBQUksRUFBaUIsRUFBRyxNQUFPLEdBQy9CLElBQU0sRUFBWSxFQUFVLEdBQzVCLEdBQUksQ0FBQyxFQUFXLE1BQU8sR0FDdkIsSUFBTSxFQUFrQixFQUFVLEVBQWlCLEdBQ25ELE9BQU8sRUFBVSxRQUFVLEVBQUssT0FBUyxHQUFvQixDQUFlLENBQzlFLENBRUEsU0FBUyxHQUFvQixFQUFvQyxDQUMvRCxPQUNFLEdBQU0sT0FBUyxXQUNmLEdBQU0sT0FBUyxrQkFDZixHQUFNLE9BQVMsZUFDZixHQUFNLE9BQVMsaUJBQ2YsR0FBTSxPQUFTLFlBRW5CLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNTLENBS1QsT0FKSSxHQUFRLE9BQVMsb0JBQXNCLEVBQU8sV0FBYSxJQUMxRCxHQUFRLE9BQVMsa0JBQW9CLEdBQVEsT0FBUyxtQkFBcUIsRUFBTyxPQUFTLEdBQzVGLEdBQVEsT0FBUyxnQkFDakIsR0FBUSxPQUFTLHFCQUF1QixFQUFPLE9BQVMsR0FDckQsR0FBUSxPQUFTLFlBQWMsRUFBTyxRQUFVLEdBQVEsR0FBYSxPQUFTLGVBQ3ZGLENBRUEsU0FBUyxHQUF3QixFQUFlLEVBQXVDLENBQ3JGLEdBQUksRUFBSyxPQUFTLG1CQUFvQixNQUFPLEdBRTdDLElBQU0sRUFBUyxFQUFtQixFQUFNLFFBQVEsRUFDMUMsRUFBVyxFQUFtQixFQUFNLFVBQVUsRUFLcEQsT0FKSSxFQUFLLFdBQWEsSUFDbEIsQ0FBQyxHQUFVLENBQUMsR0FBWSxHQUEwQixFQUFNLEVBQVUsQ0FBZSxFQUFVLEdBQzNGLEVBQTBCLENBQU0sRUFBVSxHQUc1QyxFQUFPLE9BQVMsb0JBQ2hCLEVBQTBCLEVBQW1CLEVBQVEsUUFBUSxDQUFDLEdBRTlELEVBQUssV0FBYSxJQUNsQixFQUFTLE9BQVMsZUFDakIsRUFBUyxPQUFTLFFBQVUsRUFBUyxPQUFTLFFBRW5ELENBRUEsU0FBUyxHQUE0QixFQUFlLEVBQXVDLENBQ3pGLEdBQUksRUFBSyxPQUFTLG1CQUFvQixNQUFPLEdBRTdDLElBQU0sRUFBUyxFQUFtQixFQUFNLFFBQVEsRUFDMUMsRUFBVyxFQUFtQixFQUFNLFVBQVUsRUFHcEQsR0FGSSxDQUFDLEdBQVUsQ0FBQyxHQUFZLEVBQU8sT0FBUyxvQkFDeEMsRUFBSyxXQUFhLElBQVEsRUFBUyxPQUFTLGNBQWdCLEVBQVMsT0FBUyxRQUM5RSxDQUFDLEVBQTBCLEVBQW1CLEVBQVEsUUFBUSxDQUFDLEVBQUcsTUFBTyxHQUM3RSxJQUFNLEVBQWdCLEVBQW1CLEVBQVEsVUFBVSxFQUMzRCxNQUFPLENBQUMsQ0FBQyxHQUFpQixDQUFDLEdBQTBCLEVBQVEsRUFBZSxDQUFlLENBQzdGLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNTLENBRVQsT0FBTyxFQUFpQixXQUFhLElBQVEsRUFBUyxPQUFTLGNBQWdCLEVBQWdCLElBQUksRUFBUyxJQUFjLENBQzVILENBRUEsU0FBUyxFQUEwQixFQUFvQyxDQUNyRSxPQUFPLEdBQU0sT0FBUyxjQUFnQixFQUFLLE9BQVMsU0FDdEQsQ0FFQSxTQUFTLEdBQTBCLEVBQTBELENBQzNGLElBQU0sRUFBaUMsQ0FBQyxFQUN4QyxJQUFLLElBQU0sS0FBZSxFQUFhLFVBQVUsRUFBRyxJQUFNLEVBQUUsTUFBUSxFQUFFLE9BQVMsRUFBRSxJQUFNLEVBQUUsR0FBRyxFQUN0RixFQUFTLEtBQU0sR0FBUyxFQUFLLE9BQVMsRUFBWSxPQUFTLEVBQVksS0FBTyxFQUFLLEdBQUcsR0FDMUYsRUFBUyxLQUFLLENBQVcsRUFFM0IsT0FBTyxFQUFTLFVBQVUsRUFBRyxJQUFNLEVBQUUsTUFBUSxFQUFFLEtBQUssQ0FDdEQsQ0FFQSxTQUFTLEdBQXFCLEVBQW9DLENBQzVELE9BQUssT0FBUywwQkFBNEIsRUFBSyxPQUFTLDRCQUM1RCxPQUFPLEVBQW1CLEVBQU0sYUFBYSxDQUMvQyxDQ3ZhQSxTQUFnQixHQUNkLEVBQ0EsRUFDQSxFQUN3QixDQUN4QixJQUFNLEVBQWtDLENBQ3RDLEdBQXFCLEVBQU0sQ0FBYyxFQUN6QyxHQUFpQixFQUFLLFlBQVksSUFBSyxHQUFTLEVBQUssU0FBUyxDQUFDLEdBQUssQ0FBQyxDQUFDLENBQ3hFLEVBQ00sRUFBeUIsR0FBaUMsRUFhaEUsT0FaSSxHQUNGLEVBQVEsS0FBSyxHQUFvQixDQUFzQixDQUFDLEVBRXRELEVBQUssWUFBYyxFQUFLLHNCQUMxQixFQUFRLEtBQUssR0FBa0IsQ0FBQyxFQUMzQixFQUFrQixLQUFNLEdBQVMsRUFBSyxlQUFlLEdBQ3hELEVBQVEsS0FBSyxHQUE2QixDQUFDLEdBRzdDLEVBQVEsS0FBSyxHQUFzQixDQUFDLEVBRXRDLEVBQVEsS0FBSyxHQUFXLENBQUMsRUFDbEIsQ0FDVCxDQUVBLFNBQVMsR0FBaUIsRUFBK0IsQ0FDdkQsTUFBTyxDQUNMLEtBQU0sY0FDTixxQkFBcUIsRUFBUSxDQUMzQixNQUFPLEdBQVksU0FBUyxDQUFNLEdBQVksSUFBQSxFQUNoRCxDQUNGLENBQ0YsQ0FFQSxTQUFTLElBQTRCLENBQ25DLE9BQU8sR0FBWSxvQkFBdUIsRUFBSSxDQUNoRCxDQUVBLFNBQVMsSUFBZ0MsQ0FDdkMsT0FBTyxHQUFZLG1CQUFvQixFQUFpQixDQUMxRCxDQUVBLFNBQVMsR0FBWSxFQUFjLEVBQWdFLENBQ2pHLElBQU0sRUFBa0IsRUFBSyxLQUFLLEVBQW1CLEVBQUcsa0JBQWtCLEVBQzFFLE1BQU8sQ0FDTCxPQUNBLE1BQU0sVUFBVSxFQUFNLEVBQUksQ0FDeEIsR0FBSSxDQUFDLEVBQXNCLENBQUUsR0FBSyxDQUFDLEVBQWdCLEVBQU0sQ0FBRSxFQUN6RCxPQUdGLEdBQU0sQ0FBRSxrQkFBbUIsTUFBTSxPQUFPLGVBWWxDLEVBQVMsTUFBTSxFQUFlLEVBQU0sQ0FWeEMsT0FBUSxDQUNOLEtBQU0sV0FDTixzQkFBdUIsR0FDdkIsNEJBQTZCLEdBQzdCLGtCQUFtQixFQUNyQixFQUNBLFdBQVksRUFDWixTQUFVLEVBQ1YsV0FBWSxFQUVrQyxDQUFDLEVBQzVDLE1BQVEsS0FFYixNQUFPLENBQ0wsS0FBTSxFQUFPLEtBQ2IsSUFBSyxFQUFPLEdBQ2QsQ0FDRixDQUNGLENBQ0YsQ0FFQSxTQUFTLElBQXVDLENBQzlDLE1BQU8sQ0FDTCxLQUFNLDJCQUNOLFlBQVksRUFBTSxFQUFRLEVBQVMsQ0FDakMsSUFBTSxFQUFVLEdBQTBCLEVBQU0sRUFBUSxNQUFNLEVBQzlELEdBQUksQ0FBQyxFQUFTLE9BRWQsSUFBTSxFQUFjLElBQUksRUFBWSxDQUFJLEVBRXhDLE9BREEsRUFBWSxXQUFXLEdBQXlCLENBQUksRUFBRyxHQUFHLEVBQVEsR0FBRyxFQUM5RCxDQUNMLEtBQU0sRUFBWSxTQUFTLEVBQzNCLElBQUssRUFBWSxZQUFZLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FDOUMsQ0FDRixDQUNGLENBQ0YsQ0FJQSxTQUFTLEdBQTBCLEVBQWMsRUFBb0MsQ0FDOUUsS0FBSyxTQUFTLGVBQWUsRUFLbEMsT0FESSxHQUFpQixDQUFNLEVBQVUsRUFBSyxTQUFTLFNBQVMsRUFBSSxpN0JBQXlCLElBQUEsR0FDbEYsb0lBQ1QsQ0FFQSxTQUFTLEdBQWlCLEVBQXlCLENBQ2pELE9BQU8sSUFBVyxPQUFTLElBQVcsVUFDeEMsQ0FFQSxTQUFTLEdBQXlCLEVBQXNCLENBQ3RELElBQUksRUFBUSxFQUNaLEdBQUksRUFBSyxXQUFXLElBQUksRUFBRyxDQUN6QixJQUFNLEVBQWUsRUFBSyxRQUFRO0NBQUksRUFDdEMsR0FBSSxJQUFpQixHQUFJLE9BQU8sRUFBSyxPQUNyQyxFQUFRLEVBQWUsQ0FDekIsQ0FFQSxJQUFNLEVBQW1CLG9DQUN6QixPQUFhLENBR1gsR0FGQSxFQUFpQixVQUFZLEVBRXpCLENBRFUsRUFBaUIsS0FBSyxDQUMzQixDQUFDLEdBQUcsR0FBSSxPQUFPLEVBQ3hCLEVBQVEsRUFBaUIsU0FDM0IsQ0FDRixDQUVBLFNBQVMsSUFBcUIsQ0FDNUIsTUFBTyxDQUNMLEtBQU0sT0FDTixNQUFNLEtBQUssRUFBSSxDQUNiLEdBQUksQ0FBQyxFQUFHLFNBQVMsTUFBTSxHQUFLLENBQUMsRUFBRyxTQUFTLE1BQU0sRUFBRyxPQUVsRCxJQUFNLEVBQVUsTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFJLE1BQU0sRUFDckQsTUFBTyxDQUNMLEtBQU0sa0JBQWtCLEtBQUssVUFBVSxDQUFPLEVBQUUsR0FDaEQsV0FBWSxJQUNkLENBQ0YsQ0FDRixDQUNGLENDL0lBLE1BQU0sR0FBVSxFQUFjLE9BQU8sS0FBSyxHQUFHLEVBRTdDLGVBQXNCLEVBQ3BCLEVBQ0EsRUFDQSxFQUNBLEVBQ2tCLENBQ2xCLElBQU0sRUFBaUIsR0FBZSxDQUFrQixFQUN4RCxHQUFJLENBQUMsRUFBZ0IsTUFBVSxNQUFNLG1DQUFtQyxFQUFtQixFQUFFLEVBQ3pGLEVBQUssU0FDUCxRQUFRLEtBQUssdUJBQXdCLENBQWMsRUFHckQsSUFBTSxFQUE2RCxDQUFDLEVBQ2hFLEVBQWEsRUFBSyxLQUFLLEVBQVksRUFBSyxTQUFTLENBQWtCLEVBQUcsS0FBSyxFQUMvRSxHQUFJLEVBQUcsV0FBVyxDQUFVLEVBQUcsQ0FHN0IsRUFBUyxJQUFBLEdBQ1QsSUFBTSxFQUFnQixFQUFLLFFBQVEsQ0FBa0IsRUFDL0MsRUFBVSxNQUFNLEVBQUcsU0FBUyxRQUFRLEVBQWUsQ0FBRSxjQUFlLEVBQUssQ0FBQyxFQUNoRixFQUFxQixFQUFLLFFBQVEsQ0FBa0IsRUFDcEQsSUFBSyxJQUFNLEtBQVUsRUFBUyxDQUM1QixHQUFJLENBQUMsRUFBTyxZQUFZLEVBQUcsU0FFM0IsSUFBTSxFQUFpQixFQUFLLFFBQVEsRUFBZSxFQUFPLElBQUksRUFDOUQsR0FBSSxJQUFtQixFQUFvQixTQUUzQyxJQUFNLEVBQWEsR0FBZSxDQUFjLEVBQzFDLEVBQVMsRUFBSyxLQUFLLEVBQVksRUFBTyxLQUFNLEtBQUssRUFDbkQsR0FBYyxFQUFHLFdBQVcsQ0FBTSxHQUNwQyxFQUFTLEtBQUssQ0FBQyxFQUFnQixFQUFZLEVBQVEsSUFBQSxFQUFTLENBQUMsQ0FFakUsQ0FDRixLQUNFLEdBQWEsRUFFZixFQUFTLEtBQUssQ0FBQyxFQUFvQixFQUFnQixFQUFZLENBQU0sQ0FBQyxFQUV0RSxJQUFJLEVBQWUsR0FDbkIsSUFBSyxHQUFNLENBQUMsRUFBZ0IsRUFBWSxFQUFRLEtBQWtCLEVBQ2hFLElBQWlCLE1BQU0sR0FBUSxFQUFNLEVBQWdCLEVBQVksRUFBUSxDQUFhLEVBRXhGLE9BQU8sQ0FDVCxDQUVBLGVBQWUsR0FDYixFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ2tCLENBQ2QsRUFBSyxTQUNQLFFBQVEsS0FBSyxZQUFhLEVBQWdCLEVBQVksRUFBUSxDQUFNLEVBS3RFLElBQU0sRUFBaUIsRUFBSyxLQUFLLEVBQWdCLGtCQUFrQixRQUFRLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxNQUFNLEVBQ25HLEdBQUksQ0FDRixNQUFNLEVBQUcsU0FBUyxVQUNoQixFQUNBLEtBQUssVUFBVSxNQUFNLEdBQTZCLEVBQWdCLEVBQVksRUFBUSxDQUFNLEVBQUcsSUFBQSxHQUFXLENBQUMsQ0FDN0csRUFDQSxJQUFNLEVBQU0sRUFBYyxVQUFVLFFBQVEsU0FBVSxDQUFDLEdBQVksRUFBRyxLQUFNLENBQWMsRUFBRyxDQUMzRixJQUFLLEVBQ0wsTUFBTyxTQUNULENBQUMsRUFDRCxHQUFJLEVBQUksTUFBTyxNQUFNLEVBQUksTUFDekIsT0FBTyxFQUFJLFNBQVcsQ0FDeEIsUUFBVSxDQUNSLE1BQU0sRUFBRyxTQUFTLEdBQUcsRUFBZ0IsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUN0RCxDQUNGLENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUNBLEVBQ2tDLENBQ2xDLElBQU0sRUFBMkMsQ0FHL0MsVUFBVyxHQUNYLFlBQWEsR0FFYixlQUFnQixFQUNoQixvQkFBcUIsR0FDckIsWUFBYSxHQUNiLE9BQVEsR0FDUixjQUFlLEdBQ2YsU0FHQSxRQUFTLEtBQ1gsRUFDQSxHQUFJLE1BQU0sR0FBdUIsRUFBSyxLQUFLLEVBQWdCLEtBQUssQ0FBQyxFQUFHLENBQ2xFLElBQU0sRUFBZSxHQUFpQixDQUFjLEVBQzlDLEVBQVEsRUFBZSxNQUFNLEdBQW9CLENBQVksRUFBSSxDQUFDLEVBQ3BFLEVBQU0sU0FBUyxNQUFNLElBQ3ZCLEVBQWdCLE1BQVEsRUFFNUIsQ0FDQSxNQUFPLENBQ0wsa0JBQ0EsUUFBUyxHQUFxQixFQUFnQixDQUFVLEVBS3hELEdBQUksR0FBUSxPQUNSLENBQ0UsUUFBUyxDQUFDLEVBQ1YsTUFBTyxFQUFPLElBQUssR0FBVSxFQUFLLFFBQVEsRUFBZ0IsQ0FBSyxDQUFDLENBQUMsV0FBVyxFQUFLLElBQUssR0FBRyxDQUFDLEVBQzFGLFFBQVMsQ0FBQyxnQkFBaUIsaUJBQWtCLGdCQUFnQixDQUMvRCxFQUNBLENBQUUsUUFBUyxDQUFDLFVBQVUsQ0FBRSxDQUM5QixDQUNGLENBRUEsU0FBUyxHQUFlLEVBQXFDLENBQzNELElBQUksRUFBaUIsRUFBSyxRQUFRLENBQU8sRUFDekMsT0FBYSxDQUNYLElBQU0sRUFBYSxFQUFLLEtBQUssRUFBZ0IsZUFBZSxFQUM1RCxHQUFJLEVBQUcsV0FBVyxDQUFVLEVBQUcsT0FBTyxFQUV0QyxJQUFNLEVBQWdCLEVBQUssUUFBUSxDQUFjLEVBQ2pELEdBQUksSUFBa0IsRUFBZ0IsT0FDdEMsRUFBaUIsQ0FDbkIsQ0FDRixDQUVBLFNBQVMsSUFBc0IsQ0FHN0IsSUFBTSxFQUFrQixHQUFRLFFBQVEseUJBQXlCLEVBQ2pFLE9BQU8sRUFBSyxLQUFLLEVBQUssUUFBUSxDQUFlLEVBQUcsTUFBTyxRQUFRLENBQ2pFLENBRUEsZUFBZSxHQUF1QixFQUFtQyxDQUN2RSxHQUFJLENBQ0YsSUFBTSxFQUFVLE1BQU0sRUFBRyxTQUFTLFFBQVEsRUFBUyxDQUFFLGNBQWUsRUFBSyxDQUFDLEVBQzFFLElBQUssSUFBTSxLQUFVLEVBQVMsQ0FDNUIsSUFBTSxFQUFZLEVBQUssS0FBSyxFQUFTLEVBQU8sSUFBSSxFQUNoRCxHQUFJLEVBQU8sWUFBWSxNQUNqQixNQUFNLEdBQXVCLENBQVMsRUFBRyxNQUFPLEVBQUEsTUFDL0MsR0FBSSxlQUFlLEtBQUssRUFBTyxJQUFJLElBQU0sTUFBTSxFQUFHLFNBQVMsU0FBUyxFQUFXLE1BQU0sRUFBQSxDQUFHLFNBQVMsT0FBTyxFQUM3RyxNQUFPLEVBRVgsQ0FDRixNQUFRLENBQ04sTUFBTyxFQUNULENBQ0EsTUFBTyxFQUNULENBRUEsU0FBUyxHQUFpQixFQUFxQyxDQUM3RCxJQUFJLEVBQWlCLEVBQUssUUFBUSxDQUFPLEVBQ3pDLE9BQWEsQ0FDWCxJQUFNLEVBQWUsRUFBSyxLQUFLLEVBQWdCLGVBQWdCLFFBQVEsRUFDdkUsR0FBSSxFQUFHLFdBQVcsQ0FBWSxFQUFHLE9BQU8sRUFFeEMsSUFBTSxFQUFnQixFQUFLLFFBQVEsQ0FBYyxFQUNqRCxHQUFJLElBQWtCLEVBQWdCLE9BQ3RDLEVBQWlCLENBQ25CLENBQ0YsQ0FFQSxlQUFlLEdBQW9CLEVBQTZDLENBQzlFLEdBQUksQ0FFRixPQUFPLE1BRGUsRUFBRyxTQUFTLFFBQVEsRUFBa0IsQ0FBRSxjQUFlLEVBQUssQ0FBQyxFQUFBLENBQ3BFLE9BQVEsR0FBVyxFQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSyxHQUFXLEVBQU8sSUFBSSxDQUNyRixNQUFRLENBQ04sTUFBTyxDQUFDLENBQ1YsQ0FDRixDQUlBLFNBQVMsR0FBcUIsRUFBcUIsRUFBNEIsQ0FDN0UsSUFBTSxFQUFlLEVBQUssU0FBUyxFQUFhLENBQVUsQ0FBQyxDQUFDLFdBQVcsRUFBSyxJQUFLLEdBQUcsRUFDcEYsT0FBTyxFQUFhLFdBQVcsR0FBRyxFQUFJLEVBQWUsS0FBSyxHQUM1RCxDQzVLQSxNQUFhLEdBQWdFLENBQzNFLFFBQVMsZ0JBQ1QsU0FBVSxlQUNWLFFBQVMsR0FDVCxNQUFNLFFBQVEsRUFBTSxDQUNsQixPQUFPLEVBQU0sRUFBTSxLQUFLLENBQzFCLENBQ0YsRUFFYSxHQUE0RSxDQUN2RixRQUFTLHNCQUNULFNBQVUscUNBQ1YsUUFBUyxHQUNULE1BQU0sUUFBUSxFQUFNLENBQ2xCLEdBQUksRUFBSyxnQkFBaUIsQ0FDeEIsSUFBTSxFQUFpQixFQUFLLFFBQVEsRUFBSyxTQUFTLFNBQVMsR0FBSyxHQUFHLEVBQzdELENBQUMsRUFBYSxHQUFtQixNQUFNLEVBQWdCLENBQWMsRUFDdEUsSUFDSCxRQUFRLE1BQU0saUNBQWlDLEVBQWdCLEdBQUcsRUFDbEUsUUFBUSxLQUFLLENBQUMsR0FFaEIsTUFBTSxHQUNKLEdBQWtCLEVBQU0sUUFBUSxJQUFJLEVBQUcsRUFBZ0IsSUFBQSxHQUFXLFdBQVcsRUFDN0UsRUFDQSxFQUFLLFVBQ1AsQ0FDRixNQUNFLE9BQU8sRUFBTSxFQUFNLFdBQVcsQ0FFbEMsQ0FDRixFQUVhLEdBQWdFLENBQzNFLFFBQVMsZ0JBQ1QsU0FBVSxrQ0FDVixRQUFTLEdBQ1QsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsT0FBTyxFQUFNLEVBQU0sS0FBSyxDQUMxQixDQUNGLEVBRUEsZUFBc0IsRUFBTSxFQUFxQyxFQUErQyxDQUM5RyxRQUFRLElBQUksV0FBYSxhQUd6QixJQUFNLEVBQVUsQ0FBQyxFQUFLLFFBQVUsRUFBSyxRQUMvQixFQUFNLFFBQVEsSUFBSSxFQUVsQixFQUFpQixFQUFLLFFBQVEsRUFBSyxTQUFTLFNBQVMsR0FBSyxHQUFHLEVBQzdELENBQUMsRUFBYSxHQUFtQixNQUFNLEVBQWdCLENBQWMsRUFDdEUsSUFDSCxRQUFRLE1BQU0saUNBQWlDLEVBQWdCLEdBQUcsRUFDbEUsUUFBUSxLQUFLLENBQUMsR0FHaEIsRUFBa0MsRUFBTSxDQUFjLEVBRXRELElBQU0sRUFBUyxHQUFZLEVBQU0sRUFBSyxDQUFjLEVBQzlDLEVBQWUsR0FBbUIsRUFBZ0IsRUFBUSxDQUFjLEVBQ3hFLEVBQWEsR0FBa0IsRUFBTSxFQUFLLEVBQWdCLEVBQVEsQ0FBYyxFQUdoRixFQUFvQixFQUFLLE9BQU8sT0FBUyxFQUFTLElBQUEsR0FFcEQsSUFDRixRQUFRLEtBQUssUUFBUyxDQUFJLEVBQzFCLFFBQVEsS0FBSyxtQkFBb0IsQ0FBZSxFQUNoRCxRQUFRLEtBQUsscUJBQXNCLEdBQUcsRUFBYSxJQUFJLEVBQWUsRUFBRSxHQUcxRSxHQUFNLENBQUMsR0FBYSxHQUFvQixDQUFXLEVBQzdDLEVBQWUsRUFBWSxPQUFTLFNBRXRDLEVBQUssV0FDUCxRQUFRLElBQUksZ0JBQWtCLElBQ3JCLEVBQUssdUJBQ2QsUUFBUSxJQUFJLCtCQUFpQyxLQUczQyxJQUNGLFFBQVEsSUFBSSxpQkFBbUIsS0FFakMsUUFBUSxJQUFJLHlCQUEyQixFQUN2QyxRQUFRLElBQUksdUJBQXlCLEVBRXJDLElBQU0sRUFBa0Isb0JBQXFCLEdBQVEsRUFBSyxnQkFDdEQsR0FBbUIsRUFBSyxRQUMxQixRQUFRLE1BQU0saURBQWlELEVBQy9ELFFBQVEsS0FBSyxDQUFDLEdBR2hCLElBQU0sRUFBb0IsR0FBcUIsRUFBTSxFQUFjLEVBQVksRUFBYyxDQUFjLEVBZTNHLEdBZEksR0FDRixRQUFRLEtBQUssaUJBQWtCLENBQWlCLEVBRTlDLEVBQWtCLFNBQVcsSUFDL0IsUUFBUSxNQUFNLGdDQUFnQyxFQUM5QyxRQUFRLEtBQUssQ0FBQyxHQUdoQixRQUFRLE1BQU0sQ0FBYyxFQUM1QixNQUFNLEVBQUcsU0FBUyxHQUFHLEVBQVksQ0FBRSxVQUFXLEdBQU0sTUFBTyxFQUFLLENBQUMsRUFDN0QsSUFBaUIsYUFDbkIsTUFBTSxHQUFnQyxFQUFZLEVBQWEsRUFBSyxVQUFVLEVBRzVFLEVBQWlCLENBQ2QsRUFBSyxRQUNSLFFBQVEsS0FDTixFQUNFLE9BQ0EsaUNBQWlDLEVBQVUsT0FBUSxFQUFLLFNBQVMsRUFBZ0IsQ0FBVSxDQUFDLEVBQUUsT0FBTyxFQUFlLEtBQ3RILENBQ0YsRUFFSSxNQUFNLEVBQXlCLEVBQU0sRUFBZ0IsRUFBWSxDQUFpQixHQUN0RixRQUFRLEtBQUssQ0FBQyxFQUVoQixNQUNGLENBRUEsSUFBTSxFQUEyQixDQUMvQixPQUFRLENBQUUscUJBQXNCLEVBQU0sRUFDdEMsU0FBVSxHQUFzQixFQUFNLEVBQWMsRUFBYSxFQUFXLENBQWMsRUFDMUYsTUFDRSxJQUFpQixZQUNiLE9BQU8sWUFDTCxFQUFPLEtBQUssRUFBTyxJQUFVLENBQUMsSUFBVSxFQUFJLFFBQVUsRUFBSyxTQUFTLEVBQU8sRUFBSyxRQUFRLENBQUssQ0FBQyxFQUFHLENBQUssQ0FBQyxDQUN6RyxFQUNBLEVBQ04sUUFBUyxHQUFhLEVBQU0sRUFBbUIsQ0FBYyxFQUM3RCxRQUFTLENBQ1AsZUFBZ0IsQ0FDZCxPQUFRLENBQUMsT0FBUSxNQUFNLEVBQ3ZCLE1BQU8sQ0FBQyxNQUFPLE1BQU8sTUFBTSxFQUM1QixPQUFRLENBQUMsT0FBUSxNQUFNLENBQ3pCLEVBQ0EsV0FBWSxDQUFDLE9BQVEsT0FBUSxNQUFPLE9BQVEsT0FBUSxPQUFRLE1BQU8sT0FBUSxPQUFPLENBQ3BGLEVBQ0EsVUFBVyxFQUFLLFlBQWMsRUFBSyxxQkFBdUIsR0FBUSxJQUFBLEdBQ2xFLFVBQVcsR0FBb0IsRUFBTSxDQUFjLEVBQ25ELE1BQU8sRUFBSyxNQUFRLENBQUUsWUFBYSxFQUFNLEVBQUksSUFBQSxFQUMvQyxFQUVNLEVBQXNCLElBQ3pCLE1BQU0sUUFBUSxDQUFLLEVBQUksRUFBUSxDQUFDLENBQUssRUFBQSxDQUFHLElBQUssR0FBTSxFQUFLLFNBQVMsRUFBZ0IsQ0FBQyxDQUFDLEVBQ2hGLEVBQXdCLEdBQWtELENBQzlFLElBQU0sRUFBYyxFQUFtQixFQUFrQixJQUFLLEdBQVMsRUFBSyxNQUFRLEVBQUssS0FBTyxFQUFFLENBQUMsRUFDbkcsUUFBUSxLQUNOLEVBQ0UsT0FDQSxXQUFXLEVBQVUsT0FBUSxFQUFtQixDQUFVLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEtBQUssRUFDM0UsT0FDQSxFQUFZLEtBQUssSUFBSSxDQUN2QixFQUFFLE9BQU8sRUFBZSxLQUMxQixDQUNGLENBQ0YsRUFDQSxHQUFJLEVBQUssTUFDUCxHQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxDQUNGLE1BQ0ssQ0FDQSxFQUFLLFFBQ1IsRUFBcUIsQ0FBTSxFQUc3QixJQUFJLEVBQ0EsRUFBYyxHQUNsQixHQUFJLENBQ0YsSUFBTSxFQUFZLEtBQUssSUFBSSxFQUNyQixFQUFVLE1BQU0sRUFBUyxDQUFPLEVBQ3RDLEVBQVMsRUFDVCxNQUFNLFFBQVEsSUFBSSxFQUFrQixJQUFLLEdBQVMsRUFBUSxNQUFNLENBQUksQ0FBQyxDQUFDLEVBRWpFLEVBQUssUUFDUixRQUFRLEtBQ04sRUFDRSxRQUNBLFdBQVcsRUFBbUIsRUFBa0IsSUFBSyxHQUFTLEVBQUssTUFBUSxFQUFLLEtBQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUMxRixJQUNGLEVBQUUsTUFBTSxFQUFVLE9BQVEsRUFBZSxLQUFLLElBQUksRUFBSSxDQUFTLENBQUMsR0FDbEUsQ0FDRixDQUVKLE9BQVMsRUFBTyxDQUNkLEVBQWMsR0FDZCxRQUFRLE1BQU0sMEJBQTJCLENBQUssQ0FDaEQsQ0FDQSxNQUFNLEdBQVEsTUFBTSxFQUNoQixHQUFhLFFBQVEsS0FBSyxDQUFDLEVBRzdCLElBQWlCLFlBQ2pCLElBQWlCLGFBQ2pCLENBQUUsTUFBTSxFQUF5QixFQUFNLEVBQWdCLEVBQVksQ0FBaUIsR0FFcEYsUUFBUSxLQUFLLENBQUMsQ0FFbEIsQ0FDRixDQUVBLFNBQVMsR0FBb0IsRUFBcUMsRUFBc0QsQ0FDdEgsTUFBTyxDQUNMLE9BQVEsRUFBcUMsRUFBTSxDQUFjLEVBQ2pFLElBQUssWUFDTCxPQUFRLFFBQ1YsQ0FDRixDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDTSxDQUNOLElBQU0sRUFBVSxFQUFNLENBQUUsR0FBRyxFQUFTLE9BQVEsQ0FBa0IsQ0FBQyxFQUV6RCxFQUFRLEtBQU8sSUFBd0MsQ0FDM0QsUUFBUSxlQUFlLG9CQUFxQixDQUF3QixFQUNwRSxRQUFRLE1BQU0sZUFBZSxNQUFPLENBQWUsRUFDbkQsTUFBTSxFQUFRLE1BQU0sRUFDaEIsR0FBTSxRQUFRLEtBQUssQ0FBSSxDQUM3QixFQUNNLEVBQTRCLEdBQXlCLENBQ3pELFFBQVEsTUFBTSxDQUFLLEVBQ25CLEVBQVcsQ0FBQyxDQUNkLEVBQ00sTUFBOEIsQ0FDbEMsRUFBVyxDQUNiLEVBQ0EsRUFBUSxHQUFTLEtBQUssRUFBTSxDQUFJLENBQUMsRUFDakMsUUFBUSxHQUFHLG9CQUFxQixDQUF3QixFQUNuRCxRQUFRLE1BQU0sUUFDakIsUUFBUSxNQUFNLEdBQUcsTUFBTyxDQUFlLEVBQ3ZDLFFBQVEsTUFBTSxPQUFPLEdBR3ZCLEVBQVEsR0FBRyxRQUFTLEtBQU8sSUFBVSxDQUNuQyxHQUFJLENBQ0YsT0FBUSxFQUFNLEtBQWQsQ0FDRSxJQUFLLFFBQ0gsR0FBWSxFQUFNLE1BQU8sRUFBSSxFQUM3QixNQUVGLElBQUssZUFDSCxHQUFJLEVBQUssT0FBUSxNQUVqQixFQUFxQixHQUFjLEVBQVEsS0FBSyxDQUFDLEVBQ2pELE1BRUYsSUFBSyxhQUNFLEVBQUssUUFDUixRQUFRLEtBQ04sRUFDRSxRQUNBLFdBQVcsRUFBVSxPQUFRLEVBQW1CLEVBQU0sTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQzlFLE9BQ0EsRUFBZSxFQUFNLFFBQVEsQ0FDL0IsR0FDRixDQUNGLEVBR0UsSUFBaUIsWUFBYyxJQUFpQixhQUNsRCxNQUFNLEVBQXlCLEVBQU0sRUFBZ0IsRUFBWSxDQUFpQixFQUVwRixNQUVGLElBQUssTUFDSCxHQUFJLEVBQUssT0FBUSxNQUVqQixRQUFRLEtBQUssTUFBTSxHQUFlLElBQUksSUFBTSxFQUFFLHlCQUF5QixFQUN2RSxLQUVKLENBQ0YsT0FBUyxFQUFPLENBRWQsUUFBUSxNQUFNLHVDQUF3QyxDQUFLLENBQzdELFFBQVUsQ0FDSixXQUFZLEdBQVMsRUFBTSxRQUM3QixFQUFXLE9BQU8sTUFBTSxDQUU1QixDQUNGLENBQUMsQ0FDSCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ1EsQ0FDSixNQUFNLFFBQVEsRUFBSyxNQUFNLElBQzNCLFFBQVEsTUFBTSw2Q0FBNkMsRUFDM0QsUUFBUSxLQUFLLENBQUMsR0FHaEIsSUFBTSxFQUFlLE9BQU8sRUFBSyxRQUFXLFNBQVcsRUFBSyxPQUFTLElBQUEsR0FDakUsSUFBaUIsS0FDbkIsUUFBUSxNQUFNLDhCQUE4QixFQUM1QyxRQUFRLEtBQUssQ0FBQyxHQVFoQixJQUFNLEVBQW9CLEVBQUssUUFBUSxFQUFLLEdBQWdCLEVBQUssS0FBSyxFQUFnQixNQUFNLENBQUMsRUFDdkYsRUFBYSxFQUFnQixDQUFpQixFQUM5QyxFQUFpQixHQUFRLEtBQzVCLEdBQVUsRUFBYSxFQUFZLEVBQWdCLENBQUssQ0FBQyxHQUFLLEVBQWEsRUFBbUIsQ0FBSyxDQUN0RyxFQUtBLEdBSkksSUFDRixRQUFRLE1BQU0seUJBQXlCLEVBQVcscUNBQXFDLEVBQWUsR0FBRyxFQUN6RyxRQUFRLEtBQUssQ0FBQyxHQUVaLENBQUMsRUFBYyxPQUFPLEVBRTFCLElBQU0sRUFBMEIsRUFBZ0IsQ0FBYyxHQUMxRCxFQUFhLEVBQVksQ0FBdUIsR0FBSyxFQUFhLEVBQW1CLENBQWMsS0FDckcsUUFBUSxNQUFNLGNBQWMsRUFBVyw0Q0FBNEMsRUFBd0IsR0FBRyxFQUM5RyxRQUFRLEtBQUssQ0FBQyxHQUdoQixJQUFNLEVBQWEsRUFBZ0IsRUFBSyxLQUFLLEVBQXlCLEtBQUssQ0FBQyxFQVc1RSxPQVZJLEVBQWEsRUFBWSxDQUFVLEdBQUssRUFBYSxFQUFLLEtBQUssRUFBZ0IsS0FBSyxFQUFHLENBQWlCLEtBQzFHLFFBQVEsTUFBTSxjQUFjLEVBQVcsNkNBQTZDLEVBQVcsR0FBRyxFQUNsRyxRQUFRLEtBQUssQ0FBQyxHQUlaLElBQW1CLGFBQWUsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFZLGNBQWMsQ0FBQyxJQUN2RixRQUFRLE1BQU0sY0FBYyxFQUFXLGlFQUFpRSxFQUN4RyxRQUFRLEtBQUssQ0FBQyxHQUVULENBQ1QsQ0FHQSxTQUFTLEVBQWdCLEVBQTRCLENBQ25ELElBQU0sRUFBcUIsQ0FBQyxFQUN4QixFQUFjLEVBQ2xCLEtBQU8sQ0FBQyxFQUFHLFdBQVcsQ0FBVyxHQUFHLENBQ2xDLEVBQVMsUUFBUSxFQUFLLFNBQVMsQ0FBVyxDQUFDLEVBQzNDLElBQU0sRUFBYSxFQUFLLFFBQVEsQ0FBVyxFQUMzQyxHQUFJLElBQWUsRUFBYSxNQUNoQyxFQUFjLENBQ2hCLENBQ0EsR0FBSSxDQUNGLEVBQWMsRUFBRyxhQUFhLENBQVcsQ0FDM0MsTUFBUSxDQUVSLENBQ0EsT0FBTyxFQUFLLEtBQUssRUFBYSxHQUFHLENBQVEsQ0FDM0MsQ0FFQSxTQUFTLEVBQWEsRUFBb0IsRUFBNEIsQ0FDcEUsSUFBTSxFQUFlLEVBQUssU0FBUyxFQUFZLENBQVMsRUFJeEQsT0FISSxJQUFpQixJQUNyQixDQUFJLEVBQUssV0FBVyxDQUFZLEdBRXpCLElBQWlCLE1BQVEsQ0FBQyxFQUFhLFdBQVcsS0FBSyxFQUFLLEtBQUssQ0FDMUUsQ0FFQSxTQUFTLEdBQWMsRUFBMkMsQ0FHaEUsT0FGSyxFQUNELE9BQU8sR0FBVSxTQUFpQixDQUFDLENBQUssRUFDckMsTUFBTSxRQUFRLENBQUssRUFBSSxFQUFRLE9BQU8sT0FBTyxDQUFLLEVBRnRDLENBQUMsQ0FHdEIsQ0FFQSxTQUFTLEdBQVksRUFBcUMsRUFBYSxFQUFrQyxDQUN2RyxHQUFJLEVBQUssT0FBUyxFQUFLLE1BQU0sT0FBUyxFQUFHLE9BQU8sRUFBSyxNQUFNLElBQUssR0FBTSxFQUFLLFFBQVEsRUFBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBRXJHLElBQU0sRUFBYSxFQUFLLEtBQUssRUFBZ0IsS0FBSyxFQUNsRCxJQUFLLElBQU0sSUFBTyxDQUFDLEtBQU0sTUFBTyxNQUFPLEtBQUssRUFBRyxDQUM3QyxJQUFNLEVBQVEsRUFBSyxLQUFLLEVBQVksU0FBUyxHQUFLLEVBQ2xELEdBQUksRUFBRyxXQUFXLENBQUssRUFBRyxNQUFPLENBQUMsQ0FBSyxDQUN6QyxDQUVBLFFBQVEsTUFBTSw4QkFBOEIsRUFDNUMsUUFBUSxLQUFLLENBQUMsQ0FDaEIsQ0FFQSxTQUFTLEdBQW1CLEVBQXdCLEVBQWtCLEVBQXNDLENBQzFHLE9BQVEsRUFBUixDQUNFLElBQUssTUFDSCxNQUFPLFdBRVQsSUFBSyxZQUNILE1BQU8sWUFFVCxJQUFLLE1BSUgsT0FISSxFQUFPLEtBQU0sR0FBVSxFQUFNLFNBQVMsTUFBTSxDQUFDLEdBQUssR0FBa0IsQ0FBYyxFQUM3RSxZQUVGLE1BRVQsUUFDRSxRQUFRLE1BQU0saUNBQW1DLEVBQW9CLEtBQUssSUFBSSxDQUFDLEVBQy9FLFFBQVEsS0FBSyxDQUFDLENBRWxCLENBQ0YsQ0FFQSxTQUFTLEdBQWtCLEVBQWlDLENBRTFELE9BQU8sR0FEWSxFQUFLLEtBQUssRUFBZ0IsS0FDTCxDQUFDLENBQzNDLENBRUEsU0FBUyxHQUF3QixFQUEwQixDQUN6RCxHQUFJLENBRUYsT0FEZ0IsRUFBRyxZQUFZLEVBQVMsQ0FBRSxjQUFlLEVBQUssQ0FDakQsQ0FBQyxDQUFDLEtBQU0sR0FBVSxDQUM3QixJQUFNLEVBQVksRUFBSyxLQUFLLEVBQVMsRUFBTSxJQUFJLEVBRS9DLE9BREksRUFBTSxZQUFZLEVBQVUsR0FBd0IsQ0FBUyxFQUMxRCxFQUFNLE9BQU8sR0FBSyxFQUFNLEtBQUssU0FBUyxNQUFNLENBQ3JELENBQUMsQ0FDSCxNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FFQSxlQUFlLEdBQ2IsRUFDQSxFQUNBLEVBQ2UsQ0FDZixFQUFZLE1BQVEsUUFDcEIsSUFBTSxFQUFhLEVBQVksT0FBUyxTQUNsQyxFQUFZLEVBQVksRUFBWSxDQUFVLEVBQ3BELEVBQVksS0FBTyxJQUFlLEVBQVksV0FBYSxFQUFZLFlBQWMsWUFHckYsT0FBTyxFQUFZLFFBRW5CLE9BQU8sRUFBWSxnQkFFbkIsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFZLENBQUUsVUFBVyxFQUFLLENBQUMsRUFDdkQsTUFBTSxFQUFHLFNBQVMsVUFBVSxFQUFLLEtBQUssRUFBWSxjQUFjLEVBQUcsS0FBSyxVQUFVLENBQVcsQ0FBQyxDQUNoRyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQ2lCLENBQ2pCLEdBQUksSUFBaUIsWUFBYyxJQUFpQixZQUFhLENBQy9ELElBQU0sRUFBWSxFQUFZLEVBQWMsRUFBSyxVQUFVLEVBQzNELE1BQU8sQ0FDTCxDQUNFLElBQUssRUFDTCxPQUFRLEVBQVksU0FBVyxXQUMvQixPQUFRLEVBQUssT0FDYixVQUFXLEVBQUssV0FBYSxTQUM3QixPQUFRLENBQUMsQ0FDWCxDQUNGLENBQ0YsQ0FVQSxJQUFNLEVBQXFDLENBQUMsRUFDdEMsRUFBYSxFQUFLLFlBQWMsT0FDaEMsRUFBUSxFQUFLLGFBQWUsU0F3QmxDLE9BdkJJLElBQWUsT0FBUyxJQUFlLFFBQVcsSUFBZSxVQUFZLENBQUMsSUFDaEYsRUFBa0IsS0FBSyxDQUNyQixJQUFLLEVBQ0wsZUFBZ0IsSUFBVSxRQUFXLElBQVUsVUFBWSxDQUFDLEVBQWdCLFlBQWMsYUFDMUYsT0FBUSxXQUNSLE9BQVEsRUFBSyxPQUNiLGdCQUFpQixHQUNqQixvQkFBcUIsRUFBSyxLQUFLLEVBQWdCLEtBQUssRUFDcEQsVUFBVyxFQUFLLFVBQ2hCLE9BQVEsRUFDVixDQUFDLEdBRUMsSUFBZSxPQUFTLElBQWUsUUFBVyxJQUFlLFVBQVksSUFDL0UsRUFBa0IsS0FBSyxDQUNyQixJQUFLLEVBQ0wsZUFBZ0IsSUFBVSxRQUFXLElBQVUsVUFBWSxFQUFnQixZQUFjLGFBQ3pGLE9BQVEsU0FDUixPQUFRLEVBQUssT0FDYixnQkFBaUIsR0FDakIsb0JBQXFCLEVBQUssS0FBSyxFQUFnQixLQUFLLEVBQ3BELFVBQVcsRUFBSyxTQUNsQixDQUFDLEVBRUksQ0FDVCxDQUVBLFNBQVMsRUFBWSxFQUF1QixFQUF5QyxDQUNuRixPQUFPLElBQWUsUUFBVyxDQUFDLEdBQWMsSUFBZSxXQUFhLENBQzlFLENDMWdCQSxNQUFhLEdBQW1FLENBQzlFLFFBQVMsYUFDVCxTQUFVLGFBQ1YsU0FYQSxHQUFHLEVBQ0gsTUFBTyxDQUNMLFlBQWEsdUNBQ2IsS0FBTSxVQUNOLE1BQU8sR0FDVCxDQU1BLEVBQ0EsUUFBUSxFQUFNLENBQ1osRUFBa0MsRUFBTSxRQUFRLElBQUksQ0FBQyxFQUVyRCxJQUFNLEVBQU8sRUFBSyxNQUFNLFNBQVMsR0FBSyxHQUdoQyxFQUFpQixRQUFRLFNBQVMsSUFDbEMsRUFBVSxFQUFpQixNQUFRLE9BQ25DLEVBQU8sRUFBaUIsQ0FBQyxPQUFPLEVBQUksQ0FBQyxnQkFBaUIsV0FBWSxLQUFLLEVBQ3pFLEVBQUssT0FDUCxFQUFLLEtBQUssU0FBUyxFQUVyQixFQUFLLEtBQUssQ0FBSSxFQUNkLEdBQU0sRUFBRyxHQUFHLEdBQXVCLEVBQUssRUFDbEMsRUFBYyxDQUFDLEdBQUcsRUFBTSxHQUFHLEVBQW9CLElBQUssR0FBUSxFQUFJLFNBQVMsQ0FBQyxDQUFDLEVBQzdFLEVBQUssU0FDUCxRQUFRLEtBQUssWUFBWSxFQUFRLEdBQUcsRUFBWSxLQUFLLEdBQUcsRUFBRSxFQUFFLEVBRTlELElBQU0sRUFBTSxFQUFjLFVBQVUsRUFBUyxFQUFhLENBQ3hELE1BQU8sVUFDUCxJQUFLLENBQUUsR0FBRyxRQUFRLEdBQUksQ0FDeEIsQ0FBQyxFQUNELFFBQVEsS0FBSyxFQUFJLFFBQVUsQ0FBQyxDQUM5QixDQUNGLEVDaENBLEVBQXFDLFFBQVEsR0FBRyxFQUVoRCxNQUFNLEVBQU0sRUFBUSxRQUFRLElBQUksQ0FBQyxDQUFDLENBQy9CLFdBQVcsVUFBVSxDQUFDLENBQ3RCLFFBQVEsQ0FBb0IsQ0FBQyxDQUM3QixRQUFRLEVBQUcsQ0FBQyxDQUNaLFFBQVEsRUFBUyxDQUFDLENBQ2xCLFFBQVEsRUFBRyxDQUFDLENBQ1osUUFBUSxFQUFHLENBQUMsQ0FDWixjQUFjLENBQUMsQ0FDZixPQUFPLENBQUMsQ0FDUixRQUFRLEdBQVcsQ0FBQyxDQUFDLENBQ3JCLEtBQUssQ0FBQyxDQUFDLEtBRVYsU0FBUyxJQUFxQixDQUk1QixPQUhvQixLQUFLLE1BQU0sRUFBRyxhQUFhLEVBQUssS0FBSyxFQUFtQixFQUFHLGNBQWMsRUFBRyxNQUFNLENBR3JGLENBQUMsQ0FBQyxPQUNyQiJ9
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{ResolverFactory as h}from"rolldown/experimental";import g from"magic-string";import{parseSync as _,visitorKeys as v}from"oxc-parser";import*as y from"node:child_process";let b;function x(e,t){return b||(b=n(e,t),e.verbose&&console.info(`Loaded env vars:`,Object.keys(b))),b}function S(e,t){let n={},r=new Set([...(e.inline??[]).flatMap(e=>e.toString().split(`,`)),...e.autoInline?Object.keys(x(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 C=[`app`,`functions`,`lib`];async function ee(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 te(e){let t=e.name?.toString()??``,[,n,r]=/@([^/]+)\/(.+)/.exec(t)??[];return[n,r]}function T(e){return`${e.getFullYear()}-${E(e.getMonth()+1)}-${E(e.getDate())} ${E(e.getHours())}:${E(e.getMinutes())}:${E(e.getSeconds())}`}function E(e){return String(e).padStart(2,`0`)}function ne(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`}},re={...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`}},ie={...re,moduleType:{description:`esm, cjs, or either (default).`,type:`string`,alias:`m`}},ae={...ie,onlyPackageJson:{description:`Whether to generate only package.json.`,type:`boolean`}},oe={...re,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 se(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 ce=new Set(p);function le(e,t,n,r,i){let a=fe(e),o=new Set(de(e,t,n,i,r,a));return e=>me(e,a)?!1:ge(e)||ue(e,o)}function ue(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 de(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=pe(r)&&o?RegExp(`^@?${o}(?:/.+)?`):void 0;return c.filter(e=>!s.has(O(e))&&!u?.test(e))}function fe(e){return new Set(e.bundleBuiltins?.map(e=>O(e.toString()))??[])}function pe(e){return e===`app-node`||e===`functions`}function me(e,t){let n=O(e);for(let e of t)if(n===e||n.startsWith(`${e}/`))return e}function he(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 ge(e){return e.startsWith(`node:`)||ce.has(e)}const _e={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`]},ve={browser:{aliasFields:[[`browser`]],conditionNames:[`import`,`browser`,`default`],mainFields:[`browser`,`module`,`main`]},node:{aliasFields:[],conditionNames:[`import`,`node`,`default`],mainFields:[`main`,`module`]}};function ye(e){return Ce([`browser`,`node`]).some(t=>{let{error:n,path:r}=xe(e,t);return r!==void 0||Se(n)})}function be(e,t){let n=[];for(let r of t){let{error:t,path:i}=xe(e,r);if(i)n.push(i);else if(!Se(t))return}return[...new Set(n)]}function xe(e,n){return n.sync(t.dirname(e),`./${t.basename(e)}`)}function Se(e){return e?.startsWith(`Path is ignored`)??!1}function Ce(e){return[...new Set(e)].map(e=>new h({..._e,...ve[e],mainFiles:[`index`]}))}function we(e,n){let r=fe(e),i=m(t.join(n,`package.json`));return{name:`bundle-builtins`,resolveId(e,t,a){let o=me(e,r);if(o)return Te(i,o,n,Ee(a.kind),he(e,o))}}}function Te(n,r,i,a,o){let s=Ae(n,r,i),c=JSON.parse(e.readFileSync(s,`utf8`));if(!c.exports){let e=De(n,r,t.dirname(s),o);if(e!==r&&!e.startsWith(`node:`))return e}let l=je(c,a,o);if(!l)throw Error(`Failed to resolve package export for ${r}`);return t.join(t.dirname(s),l)}function Ee(e){let t=new Set([`node-addons`,`node`,`module-sync`,`default`]);return e===`require-call`?t.add(`require`):t.add(`import`),t}function De(e,t,n,r){if(r===`.`)return e.resolve(t);let i=e.resolve(`${t}/${r.slice(2)}`);return ge(i)?Oe(n,r):i}function Oe(e,n){let r=M(n);if(!r)throw Error(`Failed to resolve package subpath ${n}`);let i=t.join(e,r),a=k(i)??ke(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 ke(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 Ae(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 je(e,t,n){if(e.exports){let r=A(e.exports,t,n);return r===null?void 0:M(r)}return n===`.`?e.main??`index.js`:M(n)}function A(e,t,n,r){if(typeof e==`string`)return n===`.`?Ie(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(Me(i)){if(Object.hasOwn(i,n))return A(i[n],t,`.`);let e=Ne(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 Me(e){return Object.keys(e).some(e=>e===`.`||e.startsWith(`./`))}function Ne(e,t){for(let[n,r]of Object.entries(e).sort(([e],[t])=>Pe(e,t))){let e=Fe(n,t);if(e!==void 0)return{value:j(r,e)}}}function Pe(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 Fe(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`?Ie(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 Ie(e,t){return Le(e),t===void 0?e:(Re(t),e.replaceAll(`*`,t))}function Le(e){if(!e.startsWith(`./`))throw Error(`Invalid package export target: ${e}`);ze(e.slice(2),e)}function Re(e){ze(e,e)}function ze(e,t){let n=Be(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 Be(e,t){try{return decodeURIComponent(e).toLowerCase()}catch{throw Error(`Invalid package export path segment in ${t}`)}}function M(e){return e?.replace(/^\.\//,``)}const Ve=[`.cjs`,`.mjs`,`.js`,`.jsx`,`.cts`,`.mts`,`.ts`,`.tsx`];function He(e){return Ve.some(t=>e.endsWith(t))&&!e.startsWith(`\0`)&&!Ue(e)}function Ue(e){return e.includes(`/node_modules/`)||e.includes(`\\node_modules\\`)}function We(e,t){let n=Ke(e),r=qe(e),i=_(e,t,{lang:n,sourceType:r});if(!Ge(i))return i;if(e.endsWith(`.js`)&&r===`unambiguous`){let r=_(e,t,{lang:n,sourceType:`commonjs`});if(!Ge(r))return r}}function Ge(e){return e.errors.some(e=>e.severity===`Error`)}function Ke(e){return e.endsWith(`.tsx`)?`tsx`:e.endsWith(`.ts`)||e.endsWith(`.cts`)||e.endsWith(`.mts`)?`ts`:e.endsWith(`.jsx`)?`jsx`:`js`}function qe(e){return e.endsWith(`.cjs`)||e.endsWith(`.cts`)?`commonjs`:`unambiguous`}function N(e){return(v[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 Je(e,t=`file.ts`){if(!e.includes(`@`))return!1;let n=We(t,e);return!n||I(n.program)&&L(n.program)}function L(e){return e.type===`Decorator`||N(e).some(e=>L(e))}function Ye(){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 Xe(e){return{name:`remove-console`,transform(t,n){if(He(n)&&/console|\\u/.test(t))return Ze(t,n,e)}}}function Ze(e,t,n){let r=We(t,e);if(!r||!I(r.program))return;let i=new g(e),a=[];Qe(r.program,[],[],a,n);for(let e of xt(a))i.overwrite(e.start,e.end,e.value);if(i.hasChanged())return{code:i.toString(),map:i.generateMap({hires:!0})}}const R=`(function () {})`,z=`(void 0)`;function Qe(e,t,n,r,i){let a=$e(e,t.at(-1));a&&n.push(a),!dt(n,e)&&e.type===`CallExpression`&&ft(e,t,r,i),!dt(n,e)&&e.type===`MemberExpression`&&pt(e,t,r,i);let o=[...t,e];for(let t of N(e))Qe(t,o,n,r,i);a&&n.pop()}function $e(e,t){if(e.type===`Program`)return{end:e.end,shadowsConsole:et(e),start:e.start};if(G(e))return{end:e.end,shadowsConsole:tt(e),start:e.start};if(e.type===`BlockStatement`){let n=t?G(t):!1;return{end:e.end,shadowsConsole:nt(e,!1)||n&&B(e),start:e.start}}if(e.type===`CatchClause`)return{end:e.end,shadowsConsole:W(e.param),start:e.start};if(e.type===`ClassExpression`)return{end:e.end,shadowsConsole:W(e.id),start:e.start};if(e.type===`StaticBlock`||e.type===`TSModuleBlock`)return{end:e.end,shadowsConsole:nt(e,!1)||B(e)||e.type===`TSModuleBlock`&&lt(t),start:e.start};if(e.type===`SwitchStatement`)return{end:e.end,shadowsConsole:rt(e),start:it(e)};if(e.type===`SwitchCase`){let n=t?.type===`SwitchStatement`&&rt(t);return{end:e.end,shadowsConsole:n||at(e),start:ot(e)}}if(e.type===`ForStatement`||e.type===`ForInStatement`||e.type===`ForOfStatement`)return{end:e.end,shadowsConsole:st(e),start:e.start}}function et(e){for(let t of F(e,`body`))if(V(t,!0))return!0;return B(e)}function tt(e){if(W(e.id))return!0;for(let t of F(e,`params`))if(W(t))return!0;return!1}function nt(e,t){for(let n of F(e,`body`))if(V(n,t))return!0;return!1}function rt(e){for(let t of F(e,`cases`))for(let e of F(t,`consequent`))if(V(e,!1))return!0;return!1}function it(e){for(let t of F(e,`cases`)){let e=ot(t);if(e<t.end)return e}return e.end}function at(e){for(let t of F(e,`consequent`))if(V(t,!1))return!0;return!1}function ot(e){let t=P(e,`test`);return t?t.start:F(e,`consequent`)[0]?.start??e.end}function st(e){let t=P(e,e.type===`ForStatement`?`init`:`left`);return!!t&&t.type===`VariableDeclaration`&&t.kind!==`var`&&U(t)}function B(e){if(!e)return!1;for(let t of N(e))if(!(t!==e&&(G(t)||t.type===`StaticBlock`||t.type===`TSModuleBlock`))&&(t.type===`VariableDeclaration`&&t.kind===`var`&&U(t)||B(t)))return!0;return!1}function ct(e){return e.importKind!==`type`&&F(e,`specifiers`).some(e=>e.importKind!==`type`&&W(e.local))}function V(e,t){let n=St(e)??e;return n.declare===!0?!1:n.type===`ImportDeclaration`?ct(n):n.type===`FunctionDeclaration`||n.type===`ClassDeclaration`?W(n.id):n.type===`TSImportEqualsDeclaration`?n.importKind!==`type`&&W(n.id):n.type===`TSEnumDeclaration`||n.type===`TSModuleDeclaration`?ut(P(n,`id`)):n.type===`VariableDeclaration`&&(t||n.kind!==`var`)&&U(n)}function lt(e){return e?.type===`TSModuleDeclaration`&&e.declare!==!0&&H(P(e,`id`))}function ut(e){return e?e.type===`Identifier`?e.name===`console`:e.type===`TSQualifiedName`&&ut(P(e,`left`)):!1}function H(e){return e?e.type===`Identifier`?e.name===`console`:e.type===`TSQualifiedName`&&(H(P(e,`left`))||H(P(e,`right`))):!1}function U(e){return F(e,`declarations`).some(e=>W(P(e,`id`)))}function W(e){return I(e)?e.type===`Identifier`&&e.name===`console`?!0:e.type===`AssignmentPattern`||e.type===`RestElement`?W(e.left??e.argument):e.type===`TSParameterProperty`?W(e.parameter):e.type===`TSQualifiedName`?W(e.left):e.type===`ArrayPattern`?F(e,`elements`).some(e=>W(e)):e.type===`ObjectPattern`&&F(e,`properties`).some(e=>W(e.value??e.argument)):!1}function G(e){return e.type===`FunctionDeclaration`||e.type===`FunctionExpression`||e.type===`ArrowFunctionExpression`}function dt(e,t){return e.some(e=>e.shadowsConsole&&e.start<=t.start&&t.end<=e.end)}function ft(e,t,n,r){let i=t.at(-1),a=P(e,`callee`);if(e.optional!==!0){if(!a||!vt(a,r)){a&&yt(a,r)&&n.push({kind:`replace`,start:e.start,end:e.end,value:K(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:mt(e,t)})}}function pt(e,t,n,r){let i=t.at(-1),a=t.at(-2);if(!(!vt(e,r)||i?.type===`MemberExpression`)&&!(i?.type===`CallExpression`&&i.callee===e&&i.optional!==!0)&&!_t(e,i,a)){if(i?.type===`AssignmentExpression`&&i.left===e){let e=P(i,`right`);e&&n.push({kind:`replace`,start:e.start,end:e.end,value:K(e,t)});return}n.push({kind:`replace`,start:e.start,end:e.end,value:K(e,t)})}}function mt(e,t){return ht(e,t)?`;${z}`:z}function K(e,t){return ht(e,t)?`;${R}`:R}function ht(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&&gt(i)}function gt(e){return e?.type===`Program`||e?.type===`BlockStatement`||e?.type===`StaticBlock`||e?.type===`TSModuleBlock`||e?.type===`SwitchCase`}function _t(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 vt(e,t){if(e.type!==`MemberExpression`)return!1;let n=P(e,`object`),r=P(e,`property`);return e.optional===!0||!n||!r||bt(e,r,t)?!1:q(n)?!0:n.type===`MemberExpression`&&q(P(n,`object`))&&e.computed!==!0&&r.type===`Identifier`&&(r.name===`call`||r.name===`apply`)}function yt(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`||!q(P(n,`object`)))return!1;let i=P(n,`property`);return!!i&&!bt(n,i,t)}function bt(e,t,n){return e.computed!==!0&&t.type===`Identifier`&&n.has(t.name)}function q(e){return e?.type===`Identifier`&&e.name===`console`}function xt(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 St(e){if(!(e.type!==`ExportNamedDeclaration`&&e.type!==`ExportDefaultDeclaration`))return P(e,`declaration`)}function Ct(e,t,n){let r=[we(e,n),wt(e.keepImport?.map(e=>e.toString())??[])],i=Ye();return i&&r.push(Xe(i)),e[`core-js`]||e[`core-js-proposals`]?(r.push(Tt()),t.some(e=>e.preserveModules)||r.push(Ot())):r.push(Et()),r.push(Mt()),r}function wt(e){return{name:`keep-import`,resolveDynamicImport(t){return!e.includes(t)&&void 0}}}function Tt(){return Dt(`babel-core-js`,()=>!0)}function Et(){return Dt(`babel-decorators`,Je)}function Dt(e,n){let r=t.join(w(),`babel.config.mjs`);return{name:e,async transform(e,t){if(!He(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 Ot(){return{name:`commonjs-runtime-prelude`,renderChunk(e,t,n){let r=kt(e,n.format);if(!r)return;let i=new g(e);return i.appendLeft(jt(e),`${r}\n`),{code:i.toString(),map:i.generateMap({hires:!0})}}}}function kt(e,t){if(e.includes(`__commonJSMin`))return At(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 At(e){return e===`cjs`||e===`commonjs`}function jt(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 Mt(){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 Nt=m(import.meta.url);async function J(n,r,i,a){let o=It(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=It(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 Pt(n,e,t,r,i);return l}async function Pt(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 Ft(r,i,a,o),void 0,2));let t=y.spawnSync(process.execPath,[Lt(),`-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 Ft(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 Y(t.join(e,`src`))){let t=Rt(e),n=t?await zt(t):[];n.includes(`node`)&&(a.types=n)}return{compilerOptions:a,extends:Bt(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 It(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 Lt(){let e=Nt.resolve(`typescript/package.json`);return t.join(t.dirname(e),`lib`,`tsc.js`)}async function Y(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 Y(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 Rt(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 zt(t){try{return(await e.promises.readdir(t,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}function Bt(e,n){let r=t.relative(e,n).replaceAll(t.sep,`/`);return r.startsWith(`.`)?r:`./${r}`}const Vt={command:`app [package]`,describe:`Build an app`,builder:ie,async handler(e){return X(e,`app`)}},Ht={command:`functions [package]`,describe:`Build a GCP/Firebase functions app`,builder:ae,async handler(e){if(e.onlyPackageJson){let n=t.resolve(e.package?.toString()??`.`),[r,i]=await ee(n);r||(console.error(`Failed to parse package.json (${i}).`),process.exit(1)),await en(Kt(e,process.cwd(),n,void 0,`functions`),r,e.moduleType)}else return X(e,`functions`)}},Ut={command:`lib [package]`,describe:`Build a Node.js / React library`,builder:oe,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 ee(o);l||(console.error(`Failed to parse package.json (${u}).`),process.exit(1)),x(n,o);let d=Xt(n,a,o),f=Zt(r,d,o),p=Kt(n,a,o,d,r);i&&(console.info(`argv:`,n),console.info(`packageJsonPath:`,u),console.info(`Target (Category):`,`${f} (${r})`));let[m]=te(l),h=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 g=`declarationOnly`in n&&n.declarationOnly;g&&n.watch&&(console.error(`--declaration-only cannot be used with --watch.`),process.exit(1));let _=tn(n,f,p,h,o);i&&console.info(`OutputOptions:`,_),_.length===0&&(console.error(`Failed to detect output files.`),process.exit(1));let v=_.map(e=>e.format===`commonjs`?`node`:`browser`),y=Jt(n,d,v),b=y.paths,S=b?.length===0;if(process.chdir(o),await e.promises.rm(p,{recursive:!0,force:!0}),f===`functions`&&await en(p,l,n.moduleType),g){n.silent||console.info(s(`cyan`,`Generates declaration files → ${s(`bold`,t.relative(o,p))}\non ${o} ...`)),y.unresolvedInput&&($(y.unresolvedInput),process.exit(1)),!S&&!await J(n,o,p,b)&&process.exit(1);return}let C={checks:{preferBuiltinFeature:!1},external:le(n,f,l,m,o),input:f===`functions`?qt(d):d,plugins:Ct(n,_,o),resolve:_e,treeshake:n[`core-js`]||n[`core-js-proposals`]?!1:void 0,transform:Wt(n,o),watch:n.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map(e=>t.relative(o,e)),T=e=>{let t=w(_.map(e=>e.file||e.dir||``));console.info(s(`cyan`,`Bundles ${s(`bold`,w(e).join(`, `))} → ${s(`bold`,t.join(`, `))}\non ${o} ...`))};if(n.watch)Gt(n,f,o,p,d,v,C,_,w,T);else{n.silent||T(d);let e,t=!1;try{let t=Date.now(),r=await c(C);e=r,await Promise.all(_.map(e=>r.write(e))),n.silent||console.info(s(`green`,`Created ${w(_.map(e=>e.file||e.dir||``)).join(`, `)} in ${s(`bold`,ne(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`&&!S&&(y.unresolvedInput&&($(y.unresolvedInput),process.exit(1)),await J(n,o,p,b)||process.exit(1))}}function Wt(e,t){return{define:S(e,t),jsx:`react-jsx`,target:`es2022`}}function Gt(e,t,n,r,i,a,o,c,d,f){let p=l({...o,output:c}),m=async e=>{process.removeListener(`uncaughtException`,h),process.stdin.removeListener(`end`,g),await p.close(),e&&process.exit(e)},h=e=>{console.error(e),m(1)},g=()=>{m()};u(e=>void m(e)),process.on(`uncaughtException`,h),process.stdin.isTTY||(process.stdin.on(`end`,g),process.stdin.resume()),p.on(`event`,async c=>{try{switch(c.code){case`ERROR`:se(c.error,!0);break;case`BUNDLE_START`:if(e.silent)break;f(Yt(o.input));break;case`BUNDLE_END`:if(e.silent||console.info(s(`green`,`Created ${s(`bold`,d(c.output).join(`, `))} in ${s(`bold`,ne(c.duration))}`)),t!==`app-node`&&t!==`functions`){let t=Jt(e,i,a);t.unresolvedInput?$(t.unresolvedInput):t.paths?.length!==0&&await J(e,n,r,t.paths)}break;case`END`:if(e.silent)break;console.info(`\n[${T(new Date)}] waiting for changes...`);break}}catch(e){console.error(`Failed to handle watch event due to:`,e)}finally{`result`in c&&c.result&&c.result.close()}})}function Kt(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 qt(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 Jt(e,t,n){if(!e.input?.length)return{paths:void 0,unresolvedInput:void 0};let r=Ce(n),i=[];for(let e of t){let t=be(e,r);if(!t)return{paths:void 0,unresolvedInput:e};i.push(...t)}return{paths:[...new Set(i)],unresolvedInput:void 0}}function $(e){console.error(`Failed to resolve the input for declaration generation: ${e}`)}function Yt(e){return e?typeof e==`string`?[e]:Array.isArray(e)?e:Object.values(e):[]}function Xt(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()||ye(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 Zt(e,t,n){switch(e){case`app`:return`app-node`;case`functions`:return`functions`;case`lib`:return t.some(e=>e.endsWith(`.tsx`))||Qt(n)?`lib-react`:`lib`;default:console.error(`target option must be one of: `+C.join(`, `)),process.exit(1)}}function Qt(e){return $t(t.join(e,`src`))}function $t(n){try{return e.readdirSync(n,{withFileTypes:!0}).some(e=>{let r=t.join(n,e.name);return e.isDirectory()?$t(r):e.isFile()&&e.name.endsWith(`.tsx`)})}catch{return!1}}async function en(n,r,i){r.name+=`-dist`;let a=r.type===`module`,o=nn(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 tn(e,n,r,i,a){if(n===`app-node`||n===`functions`){let t=nn(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 nn(e,t){return t===`esm`||(!t||t===`either`)&&e}const rn={command:`run <file>`,describe:`Run script`,builder:{...D,watch:{description:`Whether watch mode is enabled or not`,type:`boolean`,alias:`w`}},handler(e){x(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=y.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(Vt).command(Ht).command(Ut).command(rn).demandCommand().strict().version(an()).help().argv;function an(){return JSON.parse(e.readFileSync(t.join(w(),`package.json`),`utf8`)).version}
4
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJidWlsZGVyIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Vudi50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1bmRsZXJMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvZXh0ZXJuYWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2lucHV0UmVzb2x2ZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVuZGxlQnVpbHRpbnNQbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHJhbnNmb3JtVXRpbHMudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvZGVjb3JhdG9yRGV0ZWN0aW9uLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3JlbW92ZUNvbnNvbGVQbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvcGx1Z2luLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3R5cGVTY3JpcHQudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgZW52VmFyTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi4oYXJndi5hdXRvSW5saW5lID8gT2JqZWN0LmtleXMobG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIGN3ZCkpIDogW10pLFxuICBdKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgZW52VmFyc0RlZltgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdID0gSlNPTi5zdHJpbmdpZnkocHJvY2Vzcy5lbnZbbmFtZV0pO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0lubGluZSBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzRGVmKSk7XG4gIH1cbiAgcmV0dXJuIGVudlZhcnNEZWY7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcywgT3B0aW9ucyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldENhdGVnb3JpZXMgPSBbJ2FwcCcsICdmdW5jdGlvbnMnLCAnbGliJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldENhdGVnb3J5ID0gKHR5cGVvZiBhbGxUYXJnZXRDYXRlZ29yaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IFsnYXBwLW5vZGUnLCAnZnVuY3Rpb25zJywgJ2xpYicsICdsaWItcmVhY3QnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0RGV0YWlsID0gKHR5cGVvZiBhbGxUYXJnZXREZXRhaWxzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHNUeXBlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBPcHRpb25zPj4gPSBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczxUPj47XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8W1BhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBzdHJpbmddPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIHJldHVybiBbSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHBhY2thZ2VKc29uUGF0aF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZFRzUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUodXJsLmZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lPy50b1N0cmluZygpID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggPz8gW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke3BhZChkYXRlLmdldE1vbnRoKCkgKyAxKX0tJHtwYWQoZGF0ZS5nZXREYXRlKCkpfSAke3BhZChkYXRlLmdldEhvdXJzKCkpfToke3BhZChcbiAgICBkYXRlLmdldE1pbnV0ZXMoKVxuICApfToke3BhZChkYXRlLmdldFNlY29uZHMoKSl9YDtcbn1cblxuZnVuY3Rpb24gcGFkKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obWlsbGlzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobWlsbGlzZWNvbmRzIDwgMTAwMCkgcmV0dXJuIGAke01hdGgucm91bmQobWlsbGlzZWNvbmRzKX1tc2A7XG5cbiAgY29uc3Qgc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gIGlmIChzZWNvbmRzIDwgNjApIHJldHVybiBgJHtOdW1iZXIoc2Vjb25kcy50b0ZpeGVkKDEpKX1zYDtcblxuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICByZXR1cm4gYCR7bWludXRlc31tICR7TnVtYmVyKChzZWNvbmRzIC0gbWludXRlcyAqIDYwKS50b0ZpeGVkKDEpKX1zYDtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gc3VwcHJlc3Mgbm9uLWVycm9yIG91dHB1dCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3MnLFxuICB9LFxufSBhcyBjb25zdDtcbiIsImltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5leHBvcnQgY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIGlucHV0OiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGF0aHMgb3IgZ2xvYiBwYXR0ZXJucyAoZS5nLiBcInNyYy8qKi8qLnRzXCIpIG9mIHNvdXJjZSBjb2RlIGZpbGVzIHRvIGJlIGJ1aWx0LiBUaGUgZmlyc3QgZmlsZSBpcyBtYWluLiBJZiBubyBvcHRpb24gaXMgZ2l2ZW4sIFwic3JjL2luZGV4Lnt0cyx0c3gsY3RzLG10c31cIiBmcm9tIHBhY2thZ2UgZGlyZWN0b3J5IGlzIHRhcmdldGVkLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2knLFxuICB9LFxuICAnY29yZS1qcyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IGNvcmUtanMgaXMgZW1wbG95ZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gICdjb3JlLWpzLXByb3Bvc2Fscyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IGNvcmUtanMgd2l0aCBwcm9wb3NhbHMgc3VwcG9ydCBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgbWluaWZ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCBtaW5pZmljYXRpb24gaXMgZW5hYmxlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBzb3VyY2VtYXA6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHNvdXJjZW1hcCBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIGV4dGVybmFsOiB7XG4gICAgZGVzY3JpcHRpb246ICdBZGRpdGlvbmFsIGV4dGVybmFsIGRlcGVuZGVuY2llcy4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gIG91dERpcjoge1xuICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IGRpcmVjdG9yeS4gRGVmYXVsdHMgdG8gXCJkaXN0XCIgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxuICBkZWNsYXJhdGlvbk9ubHk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0VtaXQgb25seSBkZWNsYXJhdGlvbiAoLmQudHMpIGZpbGVzIHdpdGhvdXQgYnVuZGxpbmcgSmF2YVNjcmlwdC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEFueUJ1aWxkZXJUeXBlID0gdHlwZW9mIGFwcEJ1aWxkZXIgfCB0eXBlb2YgZnVuY3Rpb25zQnVpbGRlciB8IHR5cGVvZiBsaWJCdWlsZGVyO1xuIiwiaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHN0eWxlVGV4dCB9IGZyb20gJ25vZGU6dXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvcjogQnVpbGRFcnJvciwgcmVjb3ZlciA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lIHx8IChlcnJvci5jYXVzZSBhcyBFcnJvcik/Lm5hbWU7XG4gIGNvbnN0IG5hbWVTZWN0aW9uID0gbmFtZSA/IGAke25hbWV9OiBgIDogJyc7XG4gIGNvbnN0IHBsdWdpblNlY3Rpb24gPSBlcnJvci5wbHVnaW4gPyBgKHBsdWdpbiAke2Vycm9yLnBsdWdpbn0pIGAgOiAnJztcbiAgY29uc3QgbWVzc2FnZSA9IGAke3BsdWdpblNlY3Rpb259JHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9YDtcblxuICBjb25zdCBvdXRwdXRMaW5lcyA9IFtzdHlsZVRleHQoWydib2xkJywgJ3JlZCddLCBgWyFdICR7bWVzc2FnZX1gKV07XG5cbiAgaWYgKGVycm9yLnVybCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goc3R5bGVUZXh0KCdjeWFuJywgZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goc3R5bGVUZXh0KCdkaW0nLCBlcnJvci5mcmFtZSkpO1xuICB9XG5cbiAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChzdHlsZVRleHQoJ2RpbScsIGVycm9yLnN0YWNrLnJlcGxhY2UoYCR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfVxcbmAsICcnKSkpO1xuICB9XG5cbiAgb3V0cHV0TGluZXMucHVzaCgnJywgJycpO1xuICBjb25zb2xlLmVycm9yKG91dHB1dExpbmVzLmpvaW4oJ1xcbicpKTtcblxuICBpZiAoIXJlY292ZXIpIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNhdXNlPzogdW5rbm93bjtcbiAgZnJhbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBsb2M/OiB7XG4gICAgY29sdW1uOiBudW1iZXI7XG4gICAgZmlsZT86IHN0cmluZztcbiAgICBsaW5lOiBudW1iZXI7XG4gIH07XG4gIHBsdWdpbj86IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgYnVpbHRpbk1vZHVsZXMgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlLCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmNvbnN0IG5vZGVCdWlsdGluTW9kdWxlcyA9IG5ldyBTZXQoYnVpbHRpbk1vZHVsZXMpO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXh0ZXJuYWxNYXRjaGVyKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmdcbik6IChpZDogc3RyaW5nKSA9PiBib29sZWFuIHtcbiAgY29uc3QgYnVuZGxlZEJ1aWx0aW5OYW1lcyA9IGdldEJ1bmRsZWRCdWlsdGluTmFtZXMoYXJndik7XG4gIGNvbnN0IGV4dGVybmFsRGVwZW5kZW5jeU5hbWVzID0gbmV3IFNldChcbiAgICBjb2xsZWN0RXh0ZXJuYWxEZXBlbmRlbmNpZXMoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgcGFja2FnZURpclBhdGgsIG5hbWVzcGFjZSwgYnVuZGxlZEJ1aWx0aW5OYW1lcylcbiAgKTtcbiAgcmV0dXJuIChpZCkgPT4ge1xuICAgIGlmIChnZXRCdW5kbGVkQnVpbHRpblBhY2thZ2VOYW1lKGlkLCBidW5kbGVkQnVpbHRpbk5hbWVzKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBpc05vZGVCdWlsdGluKGlkKSB8fCBtYXRjaGVzTW9kdWxlT3JTdWJwYXRoKGlkLCBleHRlcm5hbERlcGVuZGVuY3lOYW1lcyk7XG4gIH07XG59XG5cbi8qKiBDaGVja3Mgd2hldGhlciBgaWRgIGVxdWFscyBhIG5hbWUgaW4gYG5hbWVzYCBvciBpcyBhIHN1YnBhdGggb2YgaXQgKGUuZy4gYGxvZGFzaC5jaHVuay9pbmRleC5qc2ApLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc01vZHVsZU9yU3VicGF0aChpZDogc3RyaW5nLCBuYW1lczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgaWYgKG5hbWVzLmhhcyhpZCkpIHJldHVybiB0cnVlO1xuICBmb3IgKGxldCBzbGFzaEluZGV4ID0gaWQuaW5kZXhPZignLycpOyBzbGFzaEluZGV4ICE9PSAtMTsgc2xhc2hJbmRleCA9IGlkLmluZGV4T2YoJy8nLCBzbGFzaEluZGV4ICsgMSkpIHtcbiAgICBpZiAobmFtZXMuaGFzKGlkLnNsaWNlKDAsIHNsYXNoSW5kZXgpKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RXh0ZXJuYWxEZXBlbmRlbmNpZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgYnVuZGxlZEJ1aWx0aW5OYW1lczogU2V0PHN0cmluZz5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXh0ZXJuYWxEZXBzID0gWy4uLihhcmd2LmV4dGVybmFsID8/IFtdKV0ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpO1xuICBpZiAocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bJ0BwcmlzbWEvY2xpZW50J10pIHtcbiAgICBleHRlcm5hbERlcHMucHVzaCgncHJpc21hLWNsaWVudCcpO1xuICB9XG4gIC8vIGBkZXBzOiB0cnVlYCBkaWQgbm90IGhhbmRsZSBpbXBvcnRzIHN1Y2ggYXMgYGxvZGFzaC5jaHVuay9pbmRleC5qc2AuXG4gIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICk7XG4gIC8vIEFkZCBleHRlcm5hbCBkZXBlbmRlbmNpZXMgZnJvbSBzaWJsaW5nIHBhY2thZ2VzXG4gIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUocGFja2FnZURpclBhdGgpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhcmVudERpclBhdGgpLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc3QgcGFja2FnZURpcnMgPSBmcy5yZWFkZGlyU3luYyhwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlRGlyIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgICBpZiAoIXBhY2thZ2VEaXIuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYXJlbnREaXJQYXRoLCBwYWNrYWdlRGlyLm5hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgb3RoZXJQYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW290aGVyUGFja2FnZUpzb24ubmFtZSA/PyAnJ10pIHtcbiAgICAgICAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBidW5kbGVkTmFtZXNwYWNlUGF0dGVybiA9XG4gICAgc2hvdWxkQnVuZGxlU2FtZU5hbWVzcGFjZURlcGVuZGVuY2llcyh0YXJnZXREZXRhaWwpICYmIG5hbWVzcGFjZSA/IG5ldyBSZWdFeHAoYF5APyR7bmFtZXNwYWNlfSg/Oi8uKyk/YCkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBleHRlcm5hbERlcHMuZmlsdGVyKChkZXBlbmRlbmN5TmFtZSkgPT4ge1xuICAgIGlmIChidW5kbGVkQnVpbHRpbk5hbWVzLmhhcyhub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoZGVwZW5kZW5jeU5hbWUpKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhYnVuZGxlZE5hbWVzcGFjZVBhdHRlcm4/LnRlc3QoZGVwZW5kZW5jeU5hbWUpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1bmRsZWRCdWlsdGluTmFtZXMoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4pOiBTZXQ8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgU2V0KGFyZ3YuYnVuZGxlQnVpbHRpbnM/Lm1hcCgoaXRlbSkgPT4gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGl0ZW0udG9TdHJpbmcoKSkpID8/IFtdKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQnVuZGxlU2FtZU5hbWVzcGFjZURlcGVuZGVuY2llcyh0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdW5kbGVkQnVpbHRpblBhY2thZ2VOYW1lKGlkOiBzdHJpbmcsIGJ1bmRsZWRCdWlsdGluTmFtZXM6IFNldDxzdHJpbmc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGlkKTtcbiAgZm9yIChjb25zdCBwYWNrYWdlTmFtZSBvZiBidW5kbGVkQnVpbHRpbk5hbWVzKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRJZCA9PT0gcGFja2FnZU5hbWUgfHwgbm9ybWFsaXplZElkLnN0YXJ0c1dpdGgoYCR7cGFja2FnZU5hbWV9L2ApKSByZXR1cm4gcGFja2FnZU5hbWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VTdWJwYXRoKGlkOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkSWQgPSBub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoaWQpO1xuICByZXR1cm4gbm9ybWFsaXplZElkID09PSBwYWNrYWdlTmFtZSA/ICcuJyA6IGAuLyR7bm9ybWFsaXplZElkLnNsaWNlKHBhY2thZ2VOYW1lLmxlbmd0aCArIDEpfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBpZC5zdGFydHNXaXRoKCdub2RlOicpID8gaWQuc2xpY2UoJ25vZGU6Jy5sZW5ndGgpIDogaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVCdWlsdGluKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoJ25vZGU6JykgfHwgbm9kZUJ1aWx0aW5Nb2R1bGVzLmhhcyhpZCk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBSZXNvbHZlckZhY3RvcnkgfSBmcm9tICdyb2xsZG93bi9leHBlcmltZW50YWwnO1xuXG4vKiogVGhlIHBsYXRmb3JtIHRoZSBidW5kbGVyIHJlc29sdmVzIGZvciwgd2hpY2ggaXQgZGVyaXZlcyBmcm9tIGVhY2ggb3V0cHV0IGZvcm1hdC4gKi9cbmV4cG9ydCB0eXBlIEJ1bmRsZXJQbGF0Zm9ybSA9ICdicm93c2VyJyB8ICdub2RlJztcblxuLy8gT25seSB0aGUgb3B0aW9ucyB0aGUgYnVuZGxlciBpcyBhY3R1YWxseSBnaXZlbjogaXRzIHJlbWFpbmluZyBkZWZhdWx0cyBhcmUgcGxhdGZvcm0tZGVwZW5kZW50LCBzb1xuLy8gcGlubmluZyB0aGVtIGhlcmUgd291bGQgY2hhbmdlIHdoaWNoIHNvdXJjZSBnZXRzIGJ1bmRsZWQuXG5leHBvcnQgY29uc3QgYnVuZGxlclJlc29sdmVPcHRpb25zID0ge1xuICBleHRlbnNpb25BbGlhczoge1xuICAgICcuY2pzJzogWycuY2pzJywgJy5jdHMnXSxcbiAgICAnLmpzJzogWycuanMnLCAnLnRzJywgJy50c3gnXSxcbiAgICAnLmpzeCc6IFsnLmpzeCcsICcudHMnLCAnLnRzeCddLFxuICAgICcubWpzJzogWycubWpzJywgJy5tdHMnXSxcbiAgfSxcbiAgZXh0ZW5zaW9uczogWycuY3RzJywgJy5tdHMnLCAnLnRzJywgJy50c3gnLCAnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJ10sXG59O1xuXG4vLyBUaGUgYnVuZGxlcidzIGRlZmF1bHRzIGZvciBlYWNoIHBsYXRmb3JtLCB3aGljaCBgUmVzb2x2ZXJGYWN0b3J5YCBkb2VzIG5vdCBhcHBseSBvbiBpdHMgb3duLlxuLy8gVmVyaWZpZWQgYWdhaW5zdCB0aGUgYnVuZGxlcjogYSBkaXJlY3Rvcnkgd2hvc2UgcGFja2FnZS5qc29uIGhhcyBcImJyb3dzZXJcIiwgXCJtb2R1bGVcIiBhbmQgXCJtYWluXCJcbi8vIHJlc29sdmVzIHRvIHRoZSBicm93c2VyIGVudHJ5IGZvciBhbiBFU00gb3V0cHV0IGFuZCB0byB0aGUgbWFpbiBlbnRyeSBmb3IgYSBDb21tb25KUyBvbmUsIGFuZCB0aGVcbi8vIFwiYnJvd3NlclwiIGFsaWFzIG1hcCBvbmx5IHRha2VzIGVmZmVjdCBmb3IgdGhlIGZvcm1lci5cbmNvbnN0IHBsYXRmb3JtUmVzb2x2ZU9wdGlvbnM6IFJlY29yZDxcbiAgQnVuZGxlclBsYXRmb3JtLFxuICB7IGFsaWFzRmllbGRzOiBzdHJpbmdbXVtdOyBjb25kaXRpb25OYW1lczogc3RyaW5nW107IG1haW5GaWVsZHM6IHN0cmluZ1tdIH1cbj4gPSB7XG4gIGJyb3dzZXI6IHtcbiAgICBhbGlhc0ZpZWxkczogW1snYnJvd3NlciddXSxcbiAgICBjb25kaXRpb25OYW1lczogWydpbXBvcnQnLCAnYnJvd3NlcicsICdkZWZhdWx0J10sXG4gICAgbWFpbkZpZWxkczogWydicm93c2VyJywgJ21vZHVsZScsICdtYWluJ10sXG4gIH0sXG4gIG5vZGU6IHsgYWxpYXNGaWVsZHM6IFtdLCBjb25kaXRpb25OYW1lczogWydpbXBvcnQnLCAnbm9kZScsICdkZWZhdWx0J10sIG1haW5GaWVsZHM6IFsnbWFpbicsICdtb2R1bGUnXSB9LFxufTtcblxuY29uc3QgaWdub3JlZFBhdGhFcnJvclByZWZpeCA9ICdQYXRoIGlzIGlnbm9yZWQnO1xuXG4vKiogUmVwb3J0cyB3aGV0aGVyIGFueSBwbGF0Zm9ybSBhY2NlcHRzIHRoZSBwYXRoLCB3aGljaCBpcyBhbGwgYW4gaW5wdXQgbmVlZHMgdG8gYmUgd29ydGggcGFzc2luZyBvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0J1bmRsZXJSZXNvbHZhYmxlUGF0aChsaXRlcmFsUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjcmVhdGVCdW5kbGVyUmVzb2x2ZXJzKFsnYnJvd3NlcicsICdub2RlJ10pLnNvbWUoKHJlc29sdmVyKSA9PiB7XG4gICAgY29uc3QgeyBlcnJvciwgcGF0aDogcmVzb2x2ZWRQYXRoIH0gPSByZXNvbHZlKGxpdGVyYWxQYXRoLCByZXNvbHZlcik7XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aCAhPT0gdW5kZWZpbmVkIHx8IGlzSWdub3JlZChlcnJvcik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuIGVudHJ5IHBhdGggdG8gZXZlcnkgc291cmNlIGZpbGUgdGhlIGJ1bmRsZXIgbG9hZHMgZm9yIGl0LCB3aGljaCBpcyBtb3JlIHRoYW4gb25lIHdoZW5cbiAqIHRoZSBvdXRwdXRzIHJlc29sdmUgZGlmZmVyZW50bHkgcGVyIHBsYXRmb3JtIChlLmcuIGEgXCJicm93c2VyXCIgZW50cnkgZm9yIEVTTSBhbmQgYSBcIm1haW5cIiBlbnRyeSBmb3JcbiAqIENvbW1vbkpTKS4gQW4gZW1wdHkgYXJyYXkgbWVhbnMgdGhlIGJ1bmRsZXIgZGVsaWJlcmF0ZWx5IGlnbm9yZXMgdGhlIGVudHJ5IG9uIGV2ZXJ5IHBsYXRmb3JtIChhXG4gKiBgXCJicm93c2VyXCJgIG1hcHBpbmcgdG8gYGZhbHNlYCksIHdoaWNoIGlzIGEgc3VjY2Vzc2Z1bCByZXNvbHV0aW9uIHRoYXQgc2ltcGx5IGhhcyBubyBzb3VyY2UgZmlsZS5cbiAqIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gYW55IHJlcXVlc3RlZCBwbGF0Zm9ybSBmYWlscyB0byByZXNvbHZlLCBzaW5jZSB0aGUgYnVuZGxlciBmYWlscyB0aGVyZSB0b28uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU291cmNlRmlsZVBhdGhzKGxpdGVyYWxQYXRoOiBzdHJpbmcsIHJlc29sdmVyczogUmVzb2x2ZXJGYWN0b3J5W10pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVzb2x2ZXIgb2YgcmVzb2x2ZXJzKSB7XG4gICAgY29uc3QgeyBlcnJvciwgcGF0aDogcmVzb2x2ZWRQYXRoIH0gPSByZXNvbHZlKGxpdGVyYWxQYXRoLCByZXNvbHZlcik7XG4gICAgaWYgKHJlc29sdmVkUGF0aCkge1xuICAgICAgcmVzb2x2ZWRQYXRocy5wdXNoKHJlc29sdmVkUGF0aCk7XG4gICAgfSBlbHNlIGlmICghaXNJZ25vcmVkKGVycm9yKSkge1xuICAgICAgLy8gU3VjY2VlZGluZyBoZXJlIHdvdWxkIGxldCBkZWNsYXJhdGlvbiBnZW5lcmF0aW9uIHBhc3MgZm9yIGEgYnVpbGQgdGhlIGJ1bmRsZXIgcmVqZWN0cy5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChyZXNvbHZlZFBhdGhzKV07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmUobGl0ZXJhbFBhdGg6IHN0cmluZywgcmVzb2x2ZXI6IFJlc29sdmVyRmFjdG9yeSk6IHsgZXJyb3I/OiBzdHJpbmc7IHBhdGg/OiBzdHJpbmcgfSB7XG4gIHJldHVybiByZXNvbHZlci5zeW5jKHBhdGguZGlybmFtZShsaXRlcmFsUGF0aCksIGAuLyR7cGF0aC5iYXNlbmFtZShsaXRlcmFsUGF0aCl9YCk7XG59XG5cbi8vIEEgZGVsaWJlcmF0ZWx5IGlnbm9yZWQgZW50cnkgaXMgcmVwb3J0ZWQgYXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYXMgYSBkaXN0aW5jdCBzdGF0ZSwgc28gdGhlIHR3b1xuLy8gaGF2ZSB0byBiZSB0b2xkIGFwYXJ0IGJ5IHRoZSBtZXNzYWdlIGl0c2VsZi5cbmZ1bmN0aW9uIGlzSWdub3JlZChlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvcj8uc3RhcnRzV2l0aChpZ25vcmVkUGF0aEVycm9yUHJlZml4KSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSByZXNvbHZlcnMgZm9yIG9uZSByZXNvbHV0aW9uIHBhc3MuIFRoZWlyIGNhY2hlcyBuZXZlciBvYnNlcnZlIGxhdGVyIGZpbGUgc3lzdGVtXG4gKiBjaGFuZ2VzLCBzbyBhIHdhdGNoIHJlYnVpbGQgbXVzdCBjcmVhdGUgbmV3IG9uZXMgcmF0aGVyIHRoYW4gcmV1c2UgZWFybGllciByZXNvbHZlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdW5kbGVyUmVzb2x2ZXJzKHBsYXRmb3JtczogSXRlcmFibGU8QnVuZGxlclBsYXRmb3JtPik6IFJlc29sdmVyRmFjdG9yeVtdIHtcbiAgLy8gVGhlIGJ1bmRsZXIncyBvd24gcmVzb2x2ZXIgaXMgdXNlZCByYXRoZXIgdGhhbiBhIHJlaW1wbGVtZW50YXRpb24gb2YgaXQ6IGRpcmVjdG9yeSBhbmQgcGFja2FnZVxuICAvLyBlbnRyeSByZXNvbHV0aW9uIGhhcyBtYW55IGJlaGF2aW9ycyB0aGF0IGFyZSBlYXN5IHRvIGdldCBzdWJ0bHkgd3JvbmcgKGVudHJ5IGZpZWxkIHByZWNlZGVuY2UsXG4gIC8vIG5lc3RlZCBwYWNrYWdlcywgZHVwbGljYXRlIGtleXMsIGJ5dGUgb3JkZXIgbWFya3MsIHN5bWxpbmsgY3ljbGVzKSwgYW5kIGFueSBkaWZmZXJlbmNlIHNpbGVudGx5XG4gIC8vIGRlc2NyaWJlcyBhIGRpZmZlcmVudCBzb3VyY2UgdGhhbiB0aGUgb25lIGJ1bmRsZWQuXG4gIHJldHVybiBbLi4ubmV3IFNldChwbGF0Zm9ybXMpXS5tYXAoXG4gICAgKHBsYXRmb3JtKSA9PlxuICAgICAgbmV3IFJlc29sdmVyRmFjdG9yeSh7IC4uLmJ1bmRsZXJSZXNvbHZlT3B0aW9ucywgLi4ucGxhdGZvcm1SZXNvbHZlT3B0aW9uc1twbGF0Zm9ybV0sIG1haW5GaWxlczogWydpbmRleCddIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbXBvcnRLaW5kLCBQbHVnaW4gfSBmcm9tICdyb2xsZG93bic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZ2V0QnVuZGxlZEJ1aWx0aW5OYW1lcywgZ2V0QnVuZGxlZEJ1aWx0aW5QYWNrYWdlTmFtZSwgZ2V0UGFja2FnZVN1YnBhdGgsIGlzTm9kZUJ1aWx0aW4gfSBmcm9tICcuL2V4dGVybmFscy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBidW5kbGVCdWlsdGluc1BsdWdpbihhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFBsdWdpbiB7XG4gIGNvbnN0IGJ1bmRsZWRCdWlsdGluTmFtZXMgPSBnZXRCdW5kbGVkQnVpbHRpbk5hbWVzKGFyZ3YpO1xuICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2J1bmRsZS1idWlsdGlucycsXG4gICAgcmVzb2x2ZUlkKHNvdXJjZSwgX2ltcG9ydGVyLCBleHRyYU9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZ2V0QnVuZGxlZEJ1aWx0aW5QYWNrYWdlTmFtZShzb3VyY2UsIGJ1bmRsZWRCdWlsdGluTmFtZXMpO1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHJlc29sdmVQYWNrYWdlRW50cnkoXG4gICAgICAgIHJlcXVpcmUsXG4gICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICBwYWNrYWdlRGlyUGF0aCxcbiAgICAgICAgZ2V0UGFja2FnZUV4cG9ydENvbmRpdGlvbnMoZXh0cmFPcHRpb25zLmtpbmQpLFxuICAgICAgICBnZXRQYWNrYWdlU3VicGF0aChzb3VyY2UsIHBhY2thZ2VOYW1lKVxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5KFxuICByZXF1aXJlOiBOb2RlSlMuUmVxdWlyZSxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgY29uZGl0aW9uczogU2V0PHN0cmluZz4sXG4gIHN1YnBhdGg6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uUGF0aChyZXF1aXJlLCBwYWNrYWdlTmFtZSwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlUGFja2FnZVdpdGhvdXRFeHBvcnRzKHJlcXVpcmUsIHBhY2thZ2VOYW1lLCBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgc3VicGF0aCk7XG4gICAgaWYgKHJlc29sdmVkUGF0aCAhPT0gcGFja2FnZU5hbWUgJiYgIXJlc29sdmVkUGF0aC5zdGFydHNXaXRoKCdub2RlOicpKSByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICB9XG5cbiAgY29uc3QgZW50cnlQYXRoID0gZ2V0UGFja2FnZUVudHJ5UGF0aChwYWNrYWdlSnNvbiwgY29uZGl0aW9ucywgc3VicGF0aCk7XG4gIGlmICghZW50cnlQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlIGV4cG9ydCBmb3IgJHtwYWNrYWdlTmFtZX1gKTtcbiAgfVxuICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCBlbnRyeVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlRXhwb3J0Q29uZGl0aW9ucyhpbXBvcnRLaW5kOiBJbXBvcnRLaW5kKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBjb25kaXRpb25zID0gbmV3IFNldChbJ25vZGUtYWRkb25zJywgJ25vZGUnLCAnbW9kdWxlLXN5bmMnLCAnZGVmYXVsdCddKTtcbiAgaWYgKGltcG9ydEtpbmQgPT09ICdyZXF1aXJlLWNhbGwnKSB7XG4gICAgY29uZGl0aW9ucy5hZGQoJ3JlcXVpcmUnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLmFkZCgnaW1wb3J0Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlV2l0aG91dEV4cG9ydHMoXG4gIHJlcXVpcmU6IE5vZGVKUy5SZXF1aXJlLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBzdWJwYXRoOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmIChzdWJwYXRoID09PSAnLicpIHJldHVybiByZXF1aXJlLnJlc29sdmUocGFja2FnZU5hbWUpO1xuICBjb25zdCByZXNvbHZlZFBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9LyR7c3VicGF0aC5zbGljZSgnLi8nLmxlbmd0aCl9YCk7XG4gIHJldHVybiBpc05vZGVCdWlsdGluKHJlc29sdmVkUGF0aCkgPyByZXNvbHZlUGFja2FnZVN1YnBhdGhGcm9tRGlyKHBhY2thZ2VEaXJQYXRoLCBzdWJwYXRoKSA6IHJlc29sdmVkUGF0aDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VTdWJwYXRoRnJvbURpcihwYWNrYWdlRGlyUGF0aDogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdWJwYXRoRW50cnlQYXRoID0gbm9ybWFsaXplUGFja2FnZUVudHJ5UGF0aChzdWJwYXRoKTtcbiAgaWYgKCFzdWJwYXRoRW50cnlQYXRoKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIHBhY2thZ2Ugc3VicGF0aCAke3N1YnBhdGh9YCk7XG5cbiAgY29uc3QgZW50cnlQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBzdWJwYXRoRW50cnlQYXRoKTtcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKGVudHJ5UGF0aCkgPz8gcmVzb2x2ZURpcmVjdG9yeVBhdGgoZW50cnlQYXRoKTtcbiAgaWYgKHJlc29sdmVkUGF0aCkgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlIHN1YnBhdGggJHtzdWJwYXRofWApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPyBbZmlsZVBhdGhdIDogW2ZpbGVQYXRoLCBgJHtmaWxlUGF0aH0uanNgLCBgJHtmaWxlUGF0aH0uanNvbmAsIGAke2ZpbGVQYXRofS5ub2RlYF07XG4gIHJldHVybiBmaWxlUGF0aHMuZmluZCgoY2FuZGlkYXRlUGF0aCkgPT4gZnMuZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSAmJiBmcy5zdGF0U3luYyhjYW5kaWRhdGVQYXRoKS5pc0ZpbGUoKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RvcnlQYXRoKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgIGNvbnN0IG1haW5QYXRoID0gcmVzb2x2ZUZpbGVQYXRoKHBhdGguam9pbihkaXJQYXRoLCBwYWNrYWdlSnNvbi5tYWluID8/ICdpbmRleC5qcycpKTtcbiAgICBpZiAobWFpblBhdGgpIHJldHVybiBtYWluUGF0aDtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZUZpbGVQYXRoKHBhdGguam9pbihkaXJQYXRoLCAnaW5kZXgnKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblBhdGgocmVxdWlyZTogTm9kZUpTLlJlcXVpcmUsIHBhY2thZ2VOYW1lOiBzdHJpbmcsIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtb2R1bGVQYXRocyA9IHJlcXVpcmUucmVzb2x2ZS5wYXRocyhwYWNrYWdlTmFtZSkgPz8gcmVxdWlyZS5yZXNvbHZlLnBhdGhzKCdfX2J1aWxkX3RzX3BhY2thZ2VfbG9va3VwX18nKSA/PyBbXTtcbiAgZm9yIChjb25zdCBtb2R1bGVQYXRoIG9mIFtwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdub2RlX21vZHVsZXMnKSwgLi4ubW9kdWxlUGF0aHNdKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKG1vZHVsZVBhdGgsIHBhY2thZ2VOYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgcGFja2FnZS5qc29uIGZvciAke3BhY2thZ2VOYW1lfWApO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlRW50cnlQYXRoKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgY29uZGl0aW9uczogU2V0PHN0cmluZz4sIHN1YnBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChwYWNrYWdlSnNvbi5leHBvcnRzKSB7XG4gICAgY29uc3QgZW50cnlQYXRoID0gZ2V0RXhwb3J0RW50cnlQYXRoKHBhY2thZ2VKc29uLmV4cG9ydHMsIGNvbmRpdGlvbnMsIHN1YnBhdGgpO1xuICAgIHJldHVybiBlbnRyeVBhdGggPT09IG51bGwgPyB1bmRlZmluZWQgOiBub3JtYWxpemVQYWNrYWdlRW50cnlQYXRoKGVudHJ5UGF0aCk7XG4gIH1cbiAgaWYgKHN1YnBhdGggPT09ICcuJykgcmV0dXJuIHBhY2thZ2VKc29uLm1haW4gPz8gJ2luZGV4LmpzJztcbiAgcmV0dXJuIG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoc3VicGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydEVudHJ5UGF0aChcbiAgZXhwb3J0c0ZpZWxkOiB1bmtub3duLFxuICBjb25kaXRpb25zOiBTZXQ8c3RyaW5nPixcbiAgc3VicGF0aDogc3RyaW5nLFxuICBwYXR0ZXJuTWF0Y2g/OiBzdHJpbmdcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICBpZiAodHlwZW9mIGV4cG9ydHNGaWVsZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3VicGF0aCA9PT0gJy4nID8gcmVzb2x2ZUV4cG9ydFRhcmdldChleHBvcnRzRmllbGQsIHBhdHRlcm5NYXRjaCkgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGV4cG9ydHNGaWVsZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cG9ydHNGaWVsZCkpIHtcbiAgICBpZiAoc3VicGF0aCAhPT0gJy4nKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBleHBvcnRFbnRyeSBvZiBleHBvcnRzRmllbGQpIHtcbiAgICAgIGxldCBlbnRyeVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBlbnRyeVBhdGggPSBnZXRFeHBvcnRFbnRyeVBhdGgoZXhwb3J0RW50cnksIGNvbmRpdGlvbnMsIHN1YnBhdGgsIHBhdHRlcm5NYXRjaCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnlQYXRoKSByZXR1cm4gZW50cnlQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwb3J0c0ZpZWxkICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBleHBvcnRSZWNvcmQgPSBleHBvcnRzRmllbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChoYXNFeHBvcnRTdWJwYXRocyhleHBvcnRSZWNvcmQpKSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oZXhwb3J0UmVjb3JkLCBzdWJwYXRoKSkgcmV0dXJuIGdldEV4cG9ydEVudHJ5UGF0aChleHBvcnRSZWNvcmRbc3VicGF0aF0sIGNvbmRpdGlvbnMsICcuJyk7XG5cbiAgICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gZmluZEV4cG9ydFN1YnBhdGhQYXR0ZXJuKGV4cG9ydFJlY29yZCwgc3VicGF0aCk7XG4gICAgcmV0dXJuIHN1YnBhdGhFeHBvcnQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGdldEV4cG9ydEVudHJ5UGF0aChzdWJwYXRoRXhwb3J0LnZhbHVlLCBjb25kaXRpb25zLCAnLicpO1xuICB9XG4gIGlmIChzdWJwYXRoICE9PSAnLicpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBbY29uZGl0aW9uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwb3J0UmVjb3JkKSkge1xuICAgIGlmICghY29uZGl0aW9ucy5oYXMoY29uZGl0aW9uKSkgY29udGludWU7XG5cbiAgICBjb25zdCBlbnRyeVBhdGggPSBnZXRFeHBvcnRFbnRyeVBhdGgodmFsdWUsIGNvbmRpdGlvbnMsIHN1YnBhdGgsIHBhdHRlcm5NYXRjaCk7XG4gICAgaWYgKGVudHJ5UGF0aCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZW50cnlQYXRoO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc0V4cG9ydFN1YnBhdGhzKGV4cG9ydFJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGV4cG9ydFJlY29yZCkuc29tZSgoa2V5KSA9PiBrZXkgPT09ICcuJyB8fCBrZXkuc3RhcnRzV2l0aCgnLi8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRFeHBvcnRTdWJwYXRoUGF0dGVybihleHBvcnRSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzdWJwYXRoOiBzdHJpbmcpOiB7IHZhbHVlOiB1bmtub3duIH0gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBvcnRSZWNvcmQpLnNvcnQoKFtrZXlBXSwgW2tleUJdKSA9PiBjb21wYXJlRXhwb3J0UGF0dGVybktleXMoa2V5QSwga2V5QikpKSB7XG4gICAgY29uc3QgcGF0dGVybk1hdGNoID0gZ2V0RXhwb3J0UGF0dGVybk1hdGNoKGtleSwgc3VicGF0aCk7XG4gICAgaWYgKHBhdHRlcm5NYXRjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogcmVwbGFjZUV4cG9ydFBhdHRlcm4odmFsdWUsIHBhdHRlcm5NYXRjaCkgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZUV4cG9ydFBhdHRlcm5LZXlzKGtleUE6IHN0cmluZywga2V5Qjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgYmFzZUxlbmd0aEEgPSBrZXlBLmluZGV4T2YoJyonKTtcbiAgY29uc3QgYmFzZUxlbmd0aEIgPSBrZXlCLmluZGV4T2YoJyonKTtcbiAgaWYgKGJhc2VMZW5ndGhBID09PSAtMSAmJiBiYXNlTGVuZ3RoQiA9PT0gLTEpIHJldHVybiAwO1xuICBpZiAoYmFzZUxlbmd0aEEgPT09IC0xKSByZXR1cm4gMTtcbiAgaWYgKGJhc2VMZW5ndGhCID09PSAtMSkgcmV0dXJuIC0xO1xuICByZXR1cm4gYmFzZUxlbmd0aEIgLSBiYXNlTGVuZ3RoQSB8fCBrZXlCLmxlbmd0aCAtIGtleUEubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdHRlcm4uc3RhcnRzV2l0aCgnLi8nKSB8fCAhcGF0dGVybi5pbmNsdWRlcygnKicpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBwYXR0ZXJuLnNwbGl0KCcqJywgMikgYXMgW3N0cmluZywgc3RyaW5nXTtcbiAgaWYgKHN1YnBhdGggPT09IHByZWZpeCB8fCAhc3VicGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHwgIXN1YnBhdGguZW5kc1dpdGgoc3VmZml4KSB8fCBzdWJwYXRoLmxlbmd0aCA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gc3VicGF0aC5zbGljZShwcmVmaXgubGVuZ3RoLCBzdWJwYXRoLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlRXhwb3J0UGF0dGVybih2YWx1ZTogdW5rbm93biwgcGF0dGVybk1hdGNoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiByZXNvbHZlRXhwb3J0VGFyZ2V0KHZhbHVlLCBwYXR0ZXJuTWF0Y2gpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHJlcGxhY2VFeHBvcnRQYXR0ZXJuKGl0ZW0sIHBhdHRlcm5NYXRjaCkpO1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBba2V5LCByZXBsYWNlRXhwb3J0UGF0dGVybihpdGVtLCBwYXR0ZXJuTWF0Y2gpXSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQ6IHN0cmluZywgcGF0dGVybk1hdGNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICB2YWxpZGF0ZUV4cG9ydFRhcmdldCh0YXJnZXQpO1xuICBpZiAocGF0dGVybk1hdGNoID09PSB1bmRlZmluZWQpIHJldHVybiB0YXJnZXQ7XG5cbiAgdmFsaWRhdGVFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybk1hdGNoKTtcbiAgcmV0dXJuIHRhcmdldC5yZXBsYWNlQWxsKCcqJywgcGF0dGVybk1hdGNoKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBvcnRUYXJnZXQodGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCF0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2thZ2UgZXhwb3J0IHRhcmdldDogJHt0YXJnZXR9YCk7XG5cbiAgdmFsaWRhdGVQYXRoU2VnbWVudHModGFyZ2V0LnNsaWNlKCcuLycubGVuZ3RoKSwgdGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBvcnRQYXR0ZXJuTWF0Y2gocGF0dGVybk1hdGNoOiBzdHJpbmcpOiB2b2lkIHtcbiAgdmFsaWRhdGVQYXRoU2VnbWVudHMocGF0dGVybk1hdGNoLCBwYXR0ZXJuTWF0Y2gpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhdGhTZWdtZW50cyhwYXRoVmFsdWU6IHN0cmluZywgc291cmNlVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkZWNvZGVkUGF0aCA9IGRlY29kZVBhdGhWYWx1ZShwYXRoVmFsdWUsIHNvdXJjZVZhbHVlKTtcbiAgY29uc3QgaW52YWxpZFNlZ21lbnRzID0gbmV3IFNldChbJycsICcuJywgJy4uJywgJ25vZGVfbW9kdWxlcyddKTtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIGRlY29kZWRQYXRoLnNwbGl0KC9bXFxcXC9dL3UpKSB7XG4gICAgaWYgKGludmFsaWRTZWdtZW50cy5oYXMoc2VnbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWNrYWdlIGV4cG9ydCBwYXRoIHNlZ21lbnQgaW4gJHtzb3VyY2VWYWx1ZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlUGF0aFZhbHVlKHBhdGhWYWx1ZTogc3RyaW5nLCBzb3VyY2VWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhWYWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2thZ2UgZXhwb3J0IHBhdGggc2VnbWVudCBpbiAke3NvdXJjZVZhbHVlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoZW50cnlQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZW50cnlQYXRoPy5yZXBsYWNlKC9eXFwuXFwvLywgJycpO1xufVxuIiwiaW1wb3J0IHsgcGFyc2VTeW5jLCB2aXNpdG9yS2V5cyB9IGZyb20gJ294Yy1wYXJzZXInO1xuXG5jb25zdCBzb3VyY2VGaWxlRXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2Zvcm1UYXJnZXRGaWxlKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBzb3VyY2VGaWxlRXh0ZW5zaW9ucy5zb21lKChleHRlbnNpb24pID0+IGlkLmVuZHNXaXRoKGV4dGVuc2lvbikpICYmICFpZC5zdGFydHNXaXRoKCdcXDAnKSAmJiAhaXNOb2RlTW9kdWxlc1BhdGgoaWQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZU1vZHVsZXNQYXRoKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlkLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpIHx8IGlkLmluY2x1ZGVzKCdcXFxcbm9kZV9tb2R1bGVzXFxcXCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTb3VyY2VGaWxlKGlkOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlU3luYz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBsYW5nID0gZ2V0UGFyc2VyTGFuZyhpZCk7XG4gIGNvbnN0IHNvdXJjZVR5cGUgPSBnZXRQYXJzZXJTb3VyY2VUeXBlKGlkKTtcbiAgY29uc3QgYXN0ID0gcGFyc2VTeW5jKGlkLCBjb2RlLCB7IGxhbmcsIHNvdXJjZVR5cGUgfSk7XG4gIGlmICghaGFzUGFyc2VFcnJvcihhc3QpKSByZXR1cm4gYXN0O1xuICBpZiAoaWQuZW5kc1dpdGgoJy5qcycpICYmIHNvdXJjZVR5cGUgPT09ICd1bmFtYmlndW91cycpIHtcbiAgICBjb25zdCBjb21tb25Kc0FzdCA9IHBhcnNlU3luYyhpZCwgY29kZSwgeyBsYW5nLCBzb3VyY2VUeXBlOiAnY29tbW9uanMnIH0pO1xuICAgIGlmICghaGFzUGFyc2VFcnJvcihjb21tb25Kc0FzdCkpIHJldHVybiBjb21tb25Kc0FzdDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNQYXJzZUVycm9yKGFzdDogUmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VTeW5jPik6IGJvb2xlYW4ge1xuICByZXR1cm4gYXN0LmVycm9ycy5zb21lKChlcnJvcikgPT4gZXJyb3Iuc2V2ZXJpdHkgPT09ICdFcnJvcicpO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZXJMYW5nKGlkOiBzdHJpbmcpOiAnanMnIHwgJ2pzeCcgfCAndHMnIHwgJ3RzeCcge1xuICBpZiAoaWQuZW5kc1dpdGgoJy50c3gnKSkgcmV0dXJuICd0c3gnO1xuICBpZiAoaWQuZW5kc1dpdGgoJy50cycpIHx8IGlkLmVuZHNXaXRoKCcuY3RzJykgfHwgaWQuZW5kc1dpdGgoJy5tdHMnKSkgcmV0dXJuICd0cyc7XG4gIGlmIChpZC5lbmRzV2l0aCgnLmpzeCcpKSByZXR1cm4gJ2pzeCc7XG4gIHJldHVybiAnanMnO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzZXJTb3VyY2VUeXBlKGlkOiBzdHJpbmcpOiAnY29tbW9uanMnIHwgJ3VuYW1iaWd1b3VzJyB7XG4gIHJldHVybiBpZC5lbmRzV2l0aCgnLmNqcycpIHx8IGlkLmVuZHNXaXRoKCcuY3RzJykgPyAnY29tbW9uanMnIDogJ3VuYW1iaWd1b3VzJztcbn1cblxuZXhwb3J0IHR5cGUgQXN0Tm9kZSA9IHtcbiAgdHlwZTogc3RyaW5nO1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBc3ROb2RlQ2hpbGRyZW4obm9kZTogQXN0Tm9kZSk6IEFzdE5vZGVbXSB7XG4gIHJldHVybiAodmlzaXRvcktleXNbbm9kZS50eXBlXSA/PyBbXSlcbiAgICAuZmxhdE1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgQXN0Tm9kZSA9PiBpc0FzdE5vZGUodmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFzdE5vZGVQcm9wZXJ0eShub2RlOiBBc3ROb2RlLCBrZXk6IHN0cmluZyk6IEFzdE5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgcmV0dXJuIGlzQXN0Tm9kZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFzdEFycmF5UHJvcGVydHkobm9kZTogQXN0Tm9kZSwga2V5OiBzdHJpbmcpOiBBc3ROb2RlW10ge1xuICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBBc3ROb2RlID0+IGlzQXN0Tm9kZShpdGVtKSkgOiBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXN0Tm9kZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEFzdE5vZGUge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiAodmFsdWUgYXMgQXN0Tm9kZSkudHlwZSA9PT0gJ3N0cmluZyc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzdE5vZGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcbmltcG9ydCB7IGdldEFzdE5vZGVDaGlsZHJlbiwgaXNBc3ROb2RlLCBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gY29kZSBjb250YWlucyBhIGRlY29yYXRvciwgaWdub3JpbmcgYEBgIGluIGNvbW1lbnRzLCBzdHJpbmdzLCBhbmQgcmVnZXhlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zRGVjb3JhdG9yKGNvZGU6IHN0cmluZywgaWQgPSAnZmlsZS50cycpOiBib29sZWFuIHtcbiAgLy8gQSBkZWNvcmF0b3IgcmVxdWlyZXMgYSBsaXRlcmFsIGBAYCBldmVuIHdoZW4gaXRzIGlkZW50aWZpZXIgdXNlcyBlc2NhcGVzIHN1Y2ggYXMgYFxcdTAwNjN1c3RvbWAuXG4gIGlmICghY29kZS5pbmNsdWRlcygnQCcpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgYXN0ID0gcGFyc2VTb3VyY2VGaWxlKGlkLCBjb2RlKTtcbiAgLy8gSWYgdGhlIGNvZGUgZmFpbHMgdG8gcGFyc2UsIGxldCBCYWJlbCB0cmFuc2Zvcm0gaXQgYW5kIHJlcG9ydCBhIHByb3BlciBzeW50YXggZXJyb3IuXG4gIGlmICghYXN0KSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGlzQXN0Tm9kZShhc3QucHJvZ3JhbSkgJiYgaGFzRGVjb3JhdG9yTm9kZShhc3QucHJvZ3JhbSk7XG59XG5cbmZ1bmN0aW9uIGhhc0RlY29yYXRvck5vZGUobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlID09PSAnRGVjb3JhdG9yJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBnZXRBc3ROb2RlQ2hpbGRyZW4obm9kZSkuc29tZSgoY2hpbGQpID0+IGhhc0RlY29yYXRvck5vZGUoY2hpbGQpKTtcbn1cbiIsImltcG9ydCBNYWdpY1N0cmluZyBmcm9tICdtYWdpYy1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4sIFNvdXJjZU1hcElucHV0IH0gZnJvbSAncm9sbGRvd24nO1xuXG5pbXBvcnQgdHlwZSB7IEFzdE5vZGUgfSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcbmltcG9ydCB7XG4gIGdldEFzdEFycmF5UHJvcGVydHksXG4gIGdldEFzdE5vZGVDaGlsZHJlbixcbiAgZ2V0QXN0Tm9kZVByb3BlcnR5LFxuICBpc0FzdE5vZGUsXG4gIGlzVHJhbnNmb3JtVGFyZ2V0RmlsZSxcbiAgcGFyc2VTb3VyY2VGaWxlLFxufSBmcm9tICcuL3RyYW5zZm9ybVV0aWxzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnNvbGVSZW1vdmFsRXhjbHVkZWRNZXRob2RzKCk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBlbnYgfSA9IHByb2Nlc3M7XG4gIGlmIChlbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykgcmV0dXJuIG5ldyBTZXQoWydlcnJvcicsICdpbmZvJywgJ3dhcm4nXSk7XG4gIGlmIChlbnYuTk9ERV9FTlYgPT09ICd0ZXN0JykgcmV0dXJuIG5ldyBTZXQoWydkZWJ1ZycsICdlcnJvcicsICdpbmZvJywgJ3dhcm4nXSk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDb25zb2xlUGx1Z2luKGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdyZW1vdmUtY29uc29sZScsXG4gICAgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICBpZiAoIWlzVHJhbnNmb3JtVGFyZ2V0RmlsZShpZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAvLyBFc2NhcGVkIGlkZW50aWZpZXJzIHN1Y2ggYXMgYFxcdTAwNjNvbnNvbGVgIG11c3Qgc3RpbGwgYmUgaGFuZGxlZCwgc28gYWxzbyBtYXRjaCBgXFx1YCBlc2NhcGVzLlxuICAgICAgaWYgKCEvY29uc29sZXxcXFxcdS8udGVzdChjb2RlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHJlbW92ZUNvbnNvbGUoY29kZSwgaWQsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ29uc29sZShjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiB7IGNvZGU6IHN0cmluZzsgbWFwOiBTb3VyY2VNYXBJbnB1dCB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYXN0ID0gcGFyc2VTb3VyY2VGaWxlKGlkLCBjb2RlKTtcbiAgaWYgKCFhc3QgfHwgIWlzQXN0Tm9kZShhc3QucHJvZ3JhbSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbWFnaWNTdHJpbmcgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSk7XG4gIGNvbnN0IHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10gPSBbXTtcbiAgY29uc3Qgc2NvcGVzOiBDb25zb2xlU2NvcGVbXSA9IFtdO1xuICBjb2xsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhhc3QucHJvZ3JhbSwgW10sIHNjb3BlcywgcmVwbGFjZW1lbnRzLCBleGNsdWRlZE1ldGhvZHMpO1xuICBmb3IgKGNvbnN0IHJlcGxhY2VtZW50IG9mIHNlbGVjdENvbnNvbGVSZXBsYWNlbWVudHMocmVwbGFjZW1lbnRzKSkge1xuICAgIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZShyZXBsYWNlbWVudC5zdGFydCwgcmVwbGFjZW1lbnQuZW5kLCByZXBsYWNlbWVudC52YWx1ZSk7XG4gIH1cblxuICBpZiAoIW1hZ2ljU3RyaW5nLmhhc0NoYW5nZWQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBtYWdpY1N0cmluZy50b1N0cmluZygpLFxuICAgIG1hcDogbWFnaWNTdHJpbmcuZ2VuZXJhdGVNYXAoeyBoaXJlczogdHJ1ZSB9KSBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgfTtcbn1cblxudHlwZSBDb25zb2xlUmVwbGFjZW1lbnQgPSB7XG4gIGtpbmQ6ICdyZXBsYWNlJztcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIHZhbHVlOiBzdHJpbmc7XG59O1xuXG50eXBlIENvbnNvbGVTY29wZSA9IHtcbiAgZW5kOiBudW1iZXI7XG4gIHNoYWRvd3NDb25zb2xlOiBib29sZWFuO1xuICBzdGFydDogbnVtYmVyO1xufTtcblxuY29uc3Qgbm9vcEZ1bmN0aW9uRXhwcmVzc2lvbiA9ICcoZnVuY3Rpb24gKCkge30pJztcbmNvbnN0IHVuZGVmaW5lZEV4cHJlc3Npb24gPSAnKHZvaWQgMCknO1xuXG5mdW5jdGlvbiBjb2xsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhcbiAgbm9kZTogQXN0Tm9kZSxcbiAgYW5jZXN0b3JzOiBBc3ROb2RlW10sXG4gIHNjb3BlczogQ29uc29sZVNjb3BlW10sXG4gIHJlcGxhY2VtZW50czogQ29uc29sZVJlcGxhY2VtZW50W10sXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBjb25zdCBwYXJlbnQgPSBhbmNlc3RvcnMuYXQoLTEpO1xuICBjb25zdCBzY29wZSA9IGdldENvbnNvbGVTY29wZShub2RlLCBwYXJlbnQpO1xuICBpZiAoc2NvcGUpIHNjb3Blcy5wdXNoKHNjb3BlKTtcblxuICBpZiAoIWlzQ29uc29sZVNoYWRvd2VkKHNjb3Blcywgbm9kZSkgJiYgbm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVDYWxsUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIH1cbiAgaWYgKCFpc0NvbnNvbGVTaGFkb3dlZChzY29wZXMsIG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgY29sbGVjdENvbnNvbGVNZW1iZXJSZXBsYWNlbWVudChub2RlLCBhbmNlc3RvcnMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkQW5jZXN0b3JzID0gWy4uLmFuY2VzdG9ycywgbm9kZV07XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZ2V0QXN0Tm9kZUNoaWxkcmVuKG5vZGUpKSB7XG4gICAgY29sbGVjdENvbnNvbGVSZXBsYWNlbWVudHMoY2hpbGQsIGNoaWxkQW5jZXN0b3JzLCBzY29wZXMsIHJlcGxhY2VtZW50cywgZXhjbHVkZWRNZXRob2RzKTtcbiAgfVxuXG4gIGlmIChzY29wZSkgc2NvcGVzLnBvcCgpO1xufVxuXG5mdW5jdGlvbiBnZXRDb25zb2xlU2NvcGUobm9kZTogQXN0Tm9kZSwgcGFyZW50OiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogQ29uc29sZVNjb3BlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1Byb2dyYW0nKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc1Byb2dyYW1Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUobm9kZSkpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnKSB7XG4gICAgY29uc3QgaXNGdW5jdGlvbkJvZHkgPSBwYXJlbnQgPyBpc0NvbnNvbGVGdW5jdGlvblNjb3BlTm9kZShwYXJlbnQpIDogZmFsc2U7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZSwgZmFsc2UpIHx8IChpc0Z1bmN0aW9uQm9keSAmJiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcobm9kZSkpLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdDYXRjaENsYXVzZScpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKG5vZGUucGFyYW0pLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdDbGFzc0V4cHJlc3Npb24nKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihub2RlLmlkKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnU3RhdGljQmxvY2snIHx8IG5vZGUudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZDogbm9kZS5lbmQsXG4gICAgICBzaGFkb3dzQ29uc29sZTpcbiAgICAgICAgaGFzQmxvY2tDb25zb2xlQmluZGluZyhub2RlLCBmYWxzZSkgfHxcbiAgICAgICAgaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKG5vZGUpIHx8XG4gICAgICAgIChub2RlLnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJyAmJiBoYXNOYW1lc3BhY2VDb25zb2xlQmluZGluZyhwYXJlbnQpKSxcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0LFxuICAgIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N3aXRjaFN0YXRlbWVudCcpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzU3dpdGNoQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBnZXRTd2l0Y2hTY29wZVN0YXJ0KG5vZGUpIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N3aXRjaENhc2UnKSB7XG4gICAgY29uc3Qgc3dpdGNoU2hhZG93c0NvbnNvbGUgPSBwYXJlbnQ/LnR5cGUgPT09ICdTd2l0Y2hTdGF0ZW1lbnQnICYmIGhhc1N3aXRjaENvbnNvbGVCaW5kaW5nKHBhcmVudCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZDogbm9kZS5lbmQsXG4gICAgICBzaGFkb3dzQ29uc29sZTogc3dpdGNoU2hhZG93c0NvbnNvbGUgfHwgaGFzU3dpdGNoQ2FzZUNvbnNvbGVCaW5kaW5nKG5vZGUpLFxuICAgICAgc3RhcnQ6IGdldFN3aXRjaENhc2VTY29wZVN0YXJ0KG5vZGUpLFxuICAgIH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0ZvclN0YXRlbWVudCcgfHwgbm9kZS50eXBlID09PSAnRm9ySW5TdGF0ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50Jykge1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNMb29wQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzUHJvZ3JhbUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnYm9keScpKSB7XG4gICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCB0cnVlKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGhhc0hvaXN0ZWRWYXJDb25zb2xlQmluZGluZyhub2RlKTtcbn1cblxuZnVuY3Rpb24gaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGlmIChoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4obm9kZS5pZCkpIHJldHVybiB0cnVlO1xuICBmb3IgKGNvbnN0IHBhcmFtIG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ3BhcmFtcycpKSB7XG4gICAgaWYgKGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihwYXJhbSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzQmxvY2tDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlLCBpbmNsdWRlVmFyOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldEFzdEFycmF5UHJvcGVydHkobm9kZSwgJ2JvZHknKSkge1xuICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgaW5jbHVkZVZhcikpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzU3dpdGNoQ29uc29sZUJpbmRpbmcobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IHN3aXRjaENhc2Ugb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY2FzZXMnKSkge1xuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldEFzdEFycmF5UHJvcGVydHkoc3dpdGNoQ2FzZSwgJ2NvbnNlcXVlbnQnKSkge1xuICAgICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCBmYWxzZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFN3aXRjaFNjb3BlU3RhcnQobm9kZTogQXN0Tm9kZSk6IG51bWJlciB7XG4gIGZvciAoY29uc3Qgc3dpdGNoQ2FzZSBvZiBnZXRBc3RBcnJheVByb3BlcnR5KG5vZGUsICdjYXNlcycpKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBnZXRTd2l0Y2hDYXNlU2NvcGVTdGFydChzd2l0Y2hDYXNlKTtcbiAgICBpZiAoc3RhcnQgPCBzd2l0Y2hDYXNlLmVuZCkgcmV0dXJuIHN0YXJ0O1xuICB9XG4gIHJldHVybiBub2RlLmVuZDtcbn1cblxuZnVuY3Rpb24gaGFzU3dpdGNoQ2FzZUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY29uc2VxdWVudCcpKSB7XG4gICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCBmYWxzZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3dpdGNoQ2FzZVNjb3BlU3RhcnQobm9kZTogQXN0Tm9kZSk6IG51bWJlciB7XG4gIGNvbnN0IHRlc3QgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ3Rlc3QnKTtcbiAgaWYgKHRlc3QpIHJldHVybiB0ZXN0LnN0YXJ0O1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnY29uc2VxdWVudCcpWzBdPy5zdGFydCA/PyBub2RlLmVuZDtcbn1cblxuZnVuY3Rpb24gaGFzTG9vcENvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgbm9kZS50eXBlID09PSAnRm9yU3RhdGVtZW50JyA/ICdpbml0JyA6ICdsZWZ0Jyk7XG4gIHJldHVybiAhIWRlY2xhcmF0aW9uICYmIGRlY2xhcmF0aW9uLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJiBkZWNsYXJhdGlvbi5raW5kICE9PSAndmFyJyAmJiBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pO1xufVxuXG5mdW5jdGlvbiBoYXNIb2lzdGVkVmFyQ29uc29sZUJpbmRpbmcocm9vdDogQXN0Tm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXJvb3QpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGdldEFzdE5vZGVDaGlsZHJlbihyb290KSkge1xuICAgIGlmIChjaGlsZCAhPT0gcm9vdCAmJiAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09ICdTdGF0aWNCbG9jaycgfHwgY2hpbGQudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoaWxkLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJlxuICAgICAgY2hpbGQua2luZCA9PT0gJ3ZhcicgJiZcbiAgICAgIGhhc1ZhcmlhYmxlRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhjaGlsZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNJbXBvcnRDb25zb2xlQmluZGluZyhub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIGlmIChub2RlLmltcG9ydEtpbmQgPT09ICd0eXBlJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnc3BlY2lmaWVycycpLnNvbWUoXG4gICAgKHNwZWNpZmllcikgPT4gc3BlY2lmaWVyLmltcG9ydEtpbmQgIT09ICd0eXBlJyAmJiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oc3BlY2lmaWVyLmxvY2FsKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUsIGluY2x1ZGVWYXI6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRFeHBvcnREZWNsYXJhdGlvbihub2RlKSA/PyBub2RlO1xuICBpZiAoZGVjbGFyYXRpb24uZGVjbGFyZSA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJykgcmV0dXJuIGhhc0ltcG9ydENvbnNvbGVCaW5kaW5nKGRlY2xhcmF0aW9uKTtcbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyB8fCBkZWNsYXJhdGlvbi50eXBlID09PSAnQ2xhc3NEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGRlY2xhcmF0aW9uLmlkKTtcbiAgfVxuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ1RTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24nKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmltcG9ydEtpbmQgIT09ICd0eXBlJyAmJiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oZGVjbGFyYXRpb24uaWQpO1xuICB9XG4gIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSAnVFNFbnVtRGVjbGFyYXRpb24nIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09ICdUU01vZHVsZURlY2xhcmF0aW9uJykge1xuICAgIHJldHVybiBoYXNMZWZ0bW9zdE1vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0QXN0Tm9kZVByb3BlcnR5KGRlY2xhcmF0aW9uLCAnaWQnKSk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBkZWNsYXJhdGlvbi50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbicgJiZcbiAgICAoaW5jbHVkZVZhciB8fCBkZWNsYXJhdGlvbi5raW5kICE9PSAndmFyJykgJiZcbiAgICBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoZGVjbGFyYXRpb24pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc05hbWVzcGFjZUNvbnNvbGVCaW5kaW5nKG5vZGU6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGU/LnR5cGUgPT09ICdUU01vZHVsZURlY2xhcmF0aW9uJyAmJiBub2RlLmRlY2xhcmUgIT09IHRydWUgJiYgaGFzTW9kdWxlSWRDb25zb2xlQmluZGluZyhnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ2lkJykpO1xufVxuXG5mdW5jdGlvbiBoYXNMZWZ0bW9zdE1vZHVsZUlkQ29uc29sZUJpbmRpbmcoaWQ6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFpZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKSByZXR1cm4gaWQubmFtZSA9PT0gJ2NvbnNvbGUnO1xuICByZXR1cm4gaWQudHlwZSA9PT0gJ1RTUXVhbGlmaWVkTmFtZScgJiYgaGFzTGVmdG1vc3RNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldEFzdE5vZGVQcm9wZXJ0eShpZCwgJ2xlZnQnKSk7XG59XG5cbmZ1bmN0aW9uIGhhc01vZHVsZUlkQ29uc29sZUJpbmRpbmcoaWQ6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFpZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKSByZXR1cm4gaWQubmFtZSA9PT0gJ2NvbnNvbGUnO1xuICByZXR1cm4gKFxuICAgIGlkLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnICYmXG4gICAgKGhhc01vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0QXN0Tm9kZVByb3BlcnR5KGlkLCAnbGVmdCcpKSB8fCBoYXNNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldEFzdE5vZGVQcm9wZXJ0eShpZCwgJ3JpZ2h0JykpKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNWYXJpYWJsZURlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcobm9kZTogQXN0Tm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eShub2RlLCAnZGVjbGFyYXRpb25zJykuc29tZSgoZGVjbGFyYXRpb24pID0+XG4gICAgaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGdldEFzdE5vZGVQcm9wZXJ0eShkZWNsYXJhdGlvbiwgJ2lkJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWlzQXN0Tm9kZSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAodmFsdWUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIHZhbHVlLm5hbWUgPT09ICdjb25zb2xlJykgcmV0dXJuIHRydWU7XG4gIGlmICh2YWx1ZS50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nIHx8IHZhbHVlLnR5cGUgPT09ICdSZXN0RWxlbWVudCcpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlLmxlZnQgPz8gdmFsdWUuYXJndW1lbnQpO1xuICB9XG4gIGlmICh2YWx1ZS50eXBlID09PSAnVFNQYXJhbWV0ZXJQcm9wZXJ0eScpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlLnBhcmFtZXRlcik7XG4gIH1cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnKSB7XG4gICAgcmV0dXJuIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZS5sZWZ0KTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ0FycmF5UGF0dGVybicpIHtcbiAgICByZXR1cm4gZ2V0QXN0QXJyYXlQcm9wZXJ0eSh2YWx1ZSwgJ2VsZW1lbnRzJykuc29tZSgoZWxlbWVudCkgPT4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGVsZW1lbnQpKTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nKSB7XG4gICAgcmV0dXJuIGdldEFzdEFycmF5UHJvcGVydHkodmFsdWUsICdwcm9wZXJ0aWVzJykuc29tZSgocHJvcGVydHkpID0+XG4gICAgICBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4ocHJvcGVydHkudmFsdWUgPz8gcHJvcGVydHkuYXJndW1lbnQpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzQ29uc29sZUZ1bmN0aW9uU2NvcGVOb2RlKG5vZGU6IEFzdE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicgfHwgbm9kZS50eXBlID09PSAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVTaGFkb3dlZChzY29wZXM6IENvbnNvbGVTY29wZVtdLCBub2RlOiBBc3ROb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY29wZXMuc29tZSgoc2NvcGUpID0+IHNjb3BlLnNoYWRvd3NDb25zb2xlICYmIHNjb3BlLnN0YXJ0IDw9IG5vZGUuc3RhcnQgJiYgbm9kZS5lbmQgPD0gc2NvcGUuZW5kKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdENvbnNvbGVDYWxsUmVwbGFjZW1lbnQoXG4gIG5vZGU6IEFzdE5vZGUsXG4gIGFuY2VzdG9yczogQXN0Tm9kZVtdLFxuICByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdLFxuICBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0xKTtcbiAgY29uc3QgY2FsbGVlID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdjYWxsZWUnKTtcbiAgaWYgKG5vZGUub3B0aW9uYWwgPT09IHRydWUpIHJldHVybjtcbiAgaWYgKCFjYWxsZWUgfHwgIWlzSW5jbHVkZWRDb25zb2xlTWVtYmVyKGNhbGxlZSwgZXhjbHVkZWRNZXRob2RzKSkge1xuICAgIGlmIChjYWxsZWUgJiYgaXNJbmNsdWRlZENvbnNvbGVCaW5kTWVtYmVyKGNhbGxlZSwgZXhjbHVkZWRNZXRob2RzKSkge1xuICAgICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBub2RlLnN0YXJ0LCBlbmQ6IG5vZGUuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKSB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBwYXJlbnQuc3RhcnQsIGVuZDogcGFyZW50LmVuZCwgdmFsdWU6ICc7JyB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXBsYWNlbWVudHMucHVzaCh7IGtpbmQ6ICdyZXBsYWNlJywgc3RhcnQ6IG5vZGUuc3RhcnQsIGVuZDogbm9kZS5lbmQsIHZhbHVlOiBnZXRVbmRlZmluZWRFeHByZXNzaW9uUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzKSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0Q29uc29sZU1lbWJlclJlcGxhY2VtZW50KFxuICBub2RlOiBBc3ROb2RlLFxuICBhbmNlc3RvcnM6IEFzdE5vZGVbXSxcbiAgcmVwbGFjZW1lbnRzOiBDb25zb2xlUmVwbGFjZW1lbnRbXSxcbiAgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGNvbnN0IHBhcmVudCA9IGFuY2VzdG9ycy5hdCgtMSk7XG4gIGNvbnN0IGdyYW5kcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0yKTtcbiAgaWYgKCFpc0luY2x1ZGVkQ29uc29sZU1lbWJlcihub2RlLCBleGNsdWRlZE1ldGhvZHMpIHx8IHBhcmVudD8udHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm47XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgJiYgcGFyZW50LmNhbGxlZSA9PT0gbm9kZSAmJiBwYXJlbnQub3B0aW9uYWwgIT09IHRydWUpIHJldHVybjtcbiAgaWYgKGlzQ29uc29sZUFzc2lnbm1lbnRUYXJnZXQobm9kZSwgcGFyZW50LCBncmFuZHBhcmVudCkpIHJldHVybjtcblxuICBpZiAocGFyZW50Py50eXBlID09PSAnQXNzaWdubWVudEV4cHJlc3Npb24nICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSB7XG4gICAgY29uc3QgcmlnaHQgPSBnZXRBc3ROb2RlUHJvcGVydHkocGFyZW50LCAncmlnaHQnKTtcbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogcmlnaHQuc3RhcnQsIGVuZDogcmlnaHQuZW5kLCB2YWx1ZTogZ2V0Tm9vcEZ1bmN0aW9uUmVwbGFjZW1lbnQocmlnaHQsIGFuY2VzdG9ycykgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogbm9kZS5zdGFydCwgZW5kOiBub2RlLmVuZCwgdmFsdWU6IGdldE5vb3BGdW5jdGlvblJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycykgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZEV4cHJlc3Npb25SZXBsYWNlbWVudChub2RlOiBBc3ROb2RlLCBhbmNlc3RvcnM6IEFzdE5vZGVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZSwgYW5jZXN0b3JzKSA/IGA7JHt1bmRlZmluZWRFeHByZXNzaW9ufWAgOiB1bmRlZmluZWRFeHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXROb29wRnVuY3Rpb25SZXBsYWNlbWVudChub2RlOiBBc3ROb2RlLCBhbmNlc3RvcnM6IEFzdE5vZGVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZSwgYW5jZXN0b3JzKSA/IGA7JHtub29wRnVuY3Rpb25FeHByZXNzaW9ufWAgOiBub29wRnVuY3Rpb25FeHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZTogQXN0Tm9kZSwgYW5jZXN0b3JzOiBBc3ROb2RlW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc3RhdGVtZW50SW5kZXggPSBhbmNlc3RvcnMuZmluZExhc3RJbmRleCgoYW5jZXN0b3IpID0+IGFuY2VzdG9yLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50Jyk7XG4gIGlmIChzdGF0ZW1lbnRJbmRleCA8IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdGVtZW50ID0gYW5jZXN0b3JzW3N0YXRlbWVudEluZGV4XTtcbiAgaWYgKCFzdGF0ZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdGVtZW50UGFyZW50ID0gYW5jZXN0b3JzW3N0YXRlbWVudEluZGV4IC0gMV07XG4gIHJldHVybiBzdGF0ZW1lbnQuc3RhcnQgPT09IG5vZGUuc3RhcnQgJiYgaXNTdGF0ZW1lbnRMaXN0Tm9kZShzdGF0ZW1lbnRQYXJlbnQpO1xufVxuXG5mdW5jdGlvbiBpc1N0YXRlbWVudExpc3ROb2RlKG5vZGU6IEFzdE5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBub2RlPy50eXBlID09PSAnUHJvZ3JhbScgfHxcbiAgICBub2RlPy50eXBlID09PSAnQmxvY2tTdGF0ZW1lbnQnIHx8XG4gICAgbm9kZT8udHlwZSA9PT0gJ1N0YXRpY0Jsb2NrJyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdTd2l0Y2hDYXNlJ1xuICApO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVBc3NpZ25tZW50VGFyZ2V0KFxuICBub2RlOiBBc3ROb2RlLFxuICBwYXJlbnQ6IEFzdE5vZGUgfCB1bmRlZmluZWQsXG4gIGdyYW5kcGFyZW50OiBBc3ROb2RlIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ1VwZGF0ZUV4cHJlc3Npb24nICYmIHBhcmVudC5hcmd1bWVudCA9PT0gbm9kZSkgcmV0dXJuIHRydWU7XG4gIGlmICgocGFyZW50Py50eXBlID09PSAnRm9ySW5TdGF0ZW1lbnQnIHx8IHBhcmVudD8udHlwZSA9PT0gJ0Zvck9mU3RhdGVtZW50JykgJiYgcGFyZW50LmxlZnQgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICBpZiAocGFyZW50Py50eXBlID09PSAnQXJyYXlQYXR0ZXJuJykgcmV0dXJuIHRydWU7XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdBc3NpZ25tZW50UGF0dGVybicgJiYgcGFyZW50LmxlZnQgPT09IG5vZGUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcGFyZW50Py50eXBlID09PSAnUHJvcGVydHknICYmIHBhcmVudC52YWx1ZSA9PT0gbm9kZSAmJiBncmFuZHBhcmVudD8udHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nO1xufVxuXG5mdW5jdGlvbiBpc0luY2x1ZGVkQ29uc29sZU1lbWJlcihub2RlOiBBc3ROb2RlLCBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdNZW1iZXJFeHByZXNzaW9uJykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IG9iamVjdCA9IGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAnb2JqZWN0Jyk7XG4gIGNvbnN0IHByb3BlcnR5ID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdwcm9wZXJ0eScpO1xuICBpZiAobm9kZS5vcHRpb25hbCA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIW9iamVjdCB8fCAhcHJvcGVydHkgfHwgaXNFeGNsdWRlZENvbnNvbGVQcm9wZXJ0eShub2RlLCBwcm9wZXJ0eSwgZXhjbHVkZWRNZXRob2RzKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihvYmplY3QpKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gKFxuICAgIG9iamVjdC50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgJiZcbiAgICBpc0dsb2JhbENvbnNvbGVJZGVudGlmaWVyKGdldEFzdE5vZGVQcm9wZXJ0eShvYmplY3QsICdvYmplY3QnKSkgJiZcbiAgICAvLyBNYXRjaGVzIGJhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcmVtb3ZlLWNvbnNvbGU6IGNhbGwvYXBwbHkgZXhjbHVzaW9ucyBhcmUgY2hlY2tlZCBvbiB0aGUgb3V0ZXIgcHJvcGVydHkgb25seS5cbiAgICBub2RlLmNvbXB1dGVkICE9PSB0cnVlICYmXG4gICAgcHJvcGVydHkudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmXG4gICAgKHByb3BlcnR5Lm5hbWUgPT09ICdjYWxsJyB8fCBwcm9wZXJ0eS5uYW1lID09PSAnYXBwbHknKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0luY2x1ZGVkQ29uc29sZUJpbmRNZW1iZXIobm9kZTogQXN0Tm9kZSwgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBvYmplY3QgPSBnZXRBc3ROb2RlUHJvcGVydHkobm9kZSwgJ29iamVjdCcpO1xuICBjb25zdCBwcm9wZXJ0eSA9IGdldEFzdE5vZGVQcm9wZXJ0eShub2RlLCAncHJvcGVydHknKTtcbiAgaWYgKCFvYmplY3QgfHwgIXByb3BlcnR5IHx8IG9iamVjdC50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUuY29tcHV0ZWQgPT09IHRydWUgfHwgcHJvcGVydHkudHlwZSAhPT0gJ0lkZW50aWZpZXInIHx8IHByb3BlcnR5Lm5hbWUgIT09ICdiaW5kJykgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIoZ2V0QXN0Tm9kZVByb3BlcnR5KG9iamVjdCwgJ29iamVjdCcpKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjb25zb2xlTWV0aG9kID0gZ2V0QXN0Tm9kZVByb3BlcnR5KG9iamVjdCwgJ3Byb3BlcnR5Jyk7XG4gIHJldHVybiAhIWNvbnNvbGVNZXRob2QgJiYgIWlzRXhjbHVkZWRDb25zb2xlUHJvcGVydHkob2JqZWN0LCBjb25zb2xlTWV0aG9kLCBleGNsdWRlZE1ldGhvZHMpO1xufVxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkQ29uc29sZVByb3BlcnR5KFxuICBtZW1iZXJFeHByZXNzaW9uOiBBc3ROb2RlLFxuICBwcm9wZXJ0eTogQXN0Tm9kZSxcbiAgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPlxuKTogYm9vbGVhbiB7XG4gIC8vIFRoZSByZXN0b3JlZCBiZWhhdmlvciBtYXRjaGVzIGJhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcmVtb3ZlLWNvbnNvbGUsIHdob3NlIGV4Y2x1c2lvbnMgb25seSBhcHBseSB0byBpZGVudGlmaWVyIHByb3BlcnRpZXMuXG4gIHJldHVybiBtZW1iZXJFeHByZXNzaW9uLmNvbXB1dGVkICE9PSB0cnVlICYmIHByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJiBleGNsdWRlZE1ldGhvZHMuaGFzKHByb3BlcnR5Lm5hbWUgYXMgc3RyaW5nKTtcbn1cblxuZnVuY3Rpb24gaXNHbG9iYWxDb25zb2xlSWRlbnRpZmllcihub2RlOiBBc3ROb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBub2RlPy50eXBlID09PSAnSWRlbnRpZmllcicgJiYgbm9kZS5uYW1lID09PSAnY29uc29sZSc7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdENvbnNvbGVSZXBsYWNlbWVudHMocmVwbGFjZW1lbnRzOiBDb25zb2xlUmVwbGFjZW1lbnRbXSk6IENvbnNvbGVSZXBsYWNlbWVudFtdIHtcbiAgY29uc3Qgc2VsZWN0ZWQ6IENvbnNvbGVSZXBsYWNlbWVudFtdID0gW107XG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2YgcmVwbGFjZW1lbnRzLnRvU29ydGVkKChhLCBiKSA9PiBhLnN0YXJ0IC0gYi5zdGFydCB8fCBiLmVuZCAtIGEuZW5kKSkge1xuICAgIGlmIChzZWxlY3RlZC5zb21lKChpdGVtKSA9PiBpdGVtLnN0YXJ0IDw9IHJlcGxhY2VtZW50LnN0YXJ0ICYmIHJlcGxhY2VtZW50LmVuZCA8PSBpdGVtLmVuZCkpIGNvbnRpbnVlO1xuICAgIHNlbGVjdGVkLnB1c2gocmVwbGFjZW1lbnQpO1xuICB9XG4gIHJldHVybiBzZWxlY3RlZC50b1NvcnRlZCgoYSwgYikgPT4gYi5zdGFydCAtIGEuc3RhcnQpO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnREZWNsYXJhdGlvbihub2RlOiBBc3ROb2RlKTogQXN0Tm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyAmJiBub2RlLnR5cGUgIT09ICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZ2V0QXN0Tm9kZVByb3BlcnR5KG5vZGUsICdkZWNsYXJhdGlvbicpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBJbnB1dE9wdGlvbnMgfSBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgTWFnaWNTdHJpbmcgZnJvbSAnbWFnaWMtc3RyaW5nJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUGx1Z2luLCBSb2xsZG93blBsdWdpbk9wdGlvbiwgU291cmNlTWFwSW5wdXQgfSBmcm9tICdyb2xsZG93bic7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1bmRsZUJ1aWx0aW5zUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVCdWlsdGluc1BsdWdpbi5qcyc7XG5pbXBvcnQgeyBjb250YWluc0RlY29yYXRvciB9IGZyb20gJy4vZGVjb3JhdG9yRGV0ZWN0aW9uLmpzJztcbmltcG9ydCB7IGdldENvbnNvbGVSZW1vdmFsRXhjbHVkZWRNZXRob2RzLCByZW1vdmVDb25zb2xlUGx1Z2luIH0gZnJvbSAnLi9yZW1vdmVDb25zb2xlUGx1Z2luLmpzJztcbmltcG9ydCB7IGlzVHJhbnNmb3JtVGFyZ2V0RmlsZSB9IGZyb20gJy4vdHJhbnNmb3JtVXRpbHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQbHVnaW5zKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZ1xuKTogUm9sbGRvd25QbHVnaW5PcHRpb25bXSB7XG4gIGNvbnN0IHBsdWdpbnM6IFJvbGxkb3duUGx1Z2luT3B0aW9uW10gPSBbXG4gICAgYnVuZGxlQnVpbHRpbnNQbHVnaW4oYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIGtlZXBJbXBvcnRQbHVnaW4oYXJndi5rZWVwSW1wb3J0Py5tYXAoKGl0ZW0pID0+IGl0ZW0udG9TdHJpbmcoKSkgPz8gW10pLFxuICBdO1xuICBjb25zdCBleGNsdWRlZENvbnNvbGVNZXRob2RzID0gZ2V0Q29uc29sZVJlbW92YWxFeGNsdWRlZE1ldGhvZHMoKTtcbiAgaWYgKGV4Y2x1ZGVkQ29uc29sZU1ldGhvZHMpIHtcbiAgICBwbHVnaW5zLnB1c2gocmVtb3ZlQ29uc29sZVBsdWdpbihleGNsdWRlZENvbnNvbGVNZXRob2RzKSk7XG4gIH1cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSB8fCBhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcGx1Z2lucy5wdXNoKGJhYmVsQ29yZUpzUGx1Z2luKCkpO1xuICAgIGlmICghb3V0cHV0T3B0aW9uc0xpc3Quc29tZSgob3B0cykgPT4gb3B0cy5wcmVzZXJ2ZU1vZHVsZXMpKSB7XG4gICAgICBwbHVnaW5zLnB1c2goY29tbW9uSnNSdW50aW1lUHJlbHVkZVBsdWdpbigpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGx1Z2lucy5wdXNoKGJhYmVsRGVjb3JhdG9yc1BsdWdpbigpKTtcbiAgfVxuICBwbHVnaW5zLnB1c2godGV4dFBsdWdpbigpKTtcbiAgcmV0dXJuIHBsdWdpbnM7XG59XG5cbmZ1bmN0aW9uIGtlZXBJbXBvcnRQbHVnaW4obW9kdWxlTmFtZXM6IHN0cmluZ1tdKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAna2VlcC1pbXBvcnQnLFxuICAgIHJlc29sdmVEeW5hbWljSW1wb3J0KHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG1vZHVsZU5hbWVzLmluY2x1ZGVzKHNvdXJjZSkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYWJlbENvcmVKc1BsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4gYmFiZWxQbHVnaW4oJ2JhYmVsLWNvcmUtanMnLCAoKSA9PiB0cnVlKTtcbn1cblxuZnVuY3Rpb24gYmFiZWxEZWNvcmF0b3JzUGx1Z2luKCk6IFBsdWdpbiB7XG4gIHJldHVybiBiYWJlbFBsdWdpbignYmFiZWwtZGVjb3JhdG9ycycsIGNvbnRhaW5zRGVjb3JhdG9yKTtcbn1cblxuZnVuY3Rpb24gYmFiZWxQbHVnaW4obmFtZTogc3RyaW5nLCBzaG91bGRUcmFuc2Zvcm06IChjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcpID0+IGJvb2xlYW4pOiBQbHVnaW4ge1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgIGlmICghaXNUcmFuc2Zvcm1UYXJnZXRGaWxlKGlkKSB8fCAhc2hvdWxkVHJhbnNmb3JtKGNvZGUsIGlkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHRyYW5zZm9ybUFzeW5jIH0gPSBhd2FpdCBpbXBvcnQoJ0BiYWJlbC9jb3JlJyk7XG4gICAgICBjb25zdCBvcHRpb25zOiBJbnB1dE9wdGlvbnMgPSB7XG4gICAgICAgIGNhbGxlcjoge1xuICAgICAgICAgIG5hbWU6ICdidWlsZC10cycsXG4gICAgICAgICAgc3VwcG9ydHNEeW5hbWljSW1wb3J0OiB0cnVlLFxuICAgICAgICAgIHN1cHBvcnRzRXhwb3J0TmFtZXNwYWNlRnJvbTogdHJ1ZSxcbiAgICAgICAgICBzdXBwb3J0c1N0YXRpY0VTTTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnRmlsZTogYmFiZWxDb25maWdQYXRoLFxuICAgICAgICBmaWxlbmFtZTogaWQsXG4gICAgICAgIHNvdXJjZU1hcHM6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtQXN5bmMoY29kZSwgb3B0aW9ucyk7XG4gICAgICBpZiAoIXJlc3VsdD8uY29kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmNvZGUsXG4gICAgICAgIG1hcDogcmVzdWx0Lm1hcCBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tbW9uSnNSdW50aW1lUHJlbHVkZVBsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdjb21tb25qcy1ydW50aW1lLXByZWx1ZGUnLFxuICAgIHJlbmRlckNodW5rKGNvZGUsIF9jaHVuaywgb3B0aW9ucykge1xuICAgICAgY29uc3QgcHJlbHVkZSA9IGdldENvbW1vbkpzUnVudGltZVByZWx1ZGUoY29kZSwgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgaWYgKCFwcmVsdWRlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBtYWdpY1N0cmluZyA9IG5ldyBNYWdpY1N0cmluZyhjb2RlKTtcbiAgICAgIG1hZ2ljU3RyaW5nLmFwcGVuZExlZnQoZ2V0UHJlbHVkZUluc2VydGlvbkluZGV4KGNvZGUpLCBgJHtwcmVsdWRlfVxcbmApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogbWFnaWNTdHJpbmcudG9TdHJpbmcoKSxcbiAgICAgICAgbWFwOiBtYWdpY1N0cmluZy5nZW5lcmF0ZU1hcCh7IGhpcmVzOiB0cnVlIH0pIGFzIFNvdXJjZU1hcElucHV0LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBjb21tb25Kc1J1bnRpbWVQcmVsdWRlID0gYHZhciBfX2NyZWF0ZT1PYmplY3QuY3JlYXRlLF9fZGVmUHJvcD1PYmplY3QuZGVmaW5lUHJvcGVydHksX19nZXRPd25Qcm9wRGVzYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLF9fZ2V0T3duUHJvcE5hbWVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLF9fZ2V0UHJvdG9PZj1PYmplY3QuZ2V0UHJvdG90eXBlT2YsX19oYXNPd25Qcm9wPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksX19jb21tb25KU01pbj0obW9kdWxlRmFjdG9yeSxtb2R1bGUpPT4oKT0+KG1vZHVsZXx8KG1vZHVsZT17ZXhwb3J0czp7fX0sbW9kdWxlRmFjdG9yeShtb2R1bGUuZXhwb3J0cyxtb2R1bGUpKSxtb2R1bGUuZXhwb3J0cyksX19jb3B5UHJvcHM9KHRvLGZyb20sZXhjZXB0LGRlc2NyaXB0b3IpPT57aWYoZnJvbSYmXCJvYmplY3RcIj09dHlwZW9mIGZyb218fFwiZnVuY3Rpb25cIj09dHlwZW9mIGZyb20pZm9yKHZhciBrZXksbmFtZXM9X19nZXRPd25Qcm9wTmFtZXMoZnJvbSksaW5kZXg9MCxsZW5ndGg9bmFtZXMubGVuZ3RoO2luZGV4PGxlbmd0aDtpbmRleCsrKWtleT1uYW1lc1tpbmRleF0sX19oYXNPd25Qcm9wLmNhbGwodG8sa2V5KXx8a2V5PT09ZXhjZXB0fHxfX2RlZlByb3AodG8sa2V5LHtnZXQ6KGtleT0+ZnJvbVtrZXldKS5iaW5kKG51bGwsa2V5KSxlbnVtZXJhYmxlOiEoZGVzY3JpcHRvcj1fX2dldE93blByb3BEZXNjKGZyb20sa2V5KSl8fGRlc2NyaXB0b3IuZW51bWVyYWJsZX0pO3JldHVybiB0b30sX190b0VTTT0obW9kLGlzTm9kZU1vZGUsdGFyZ2V0KT0+KHRhcmdldD1udWxsIT1tb2Q/X19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpOnt9LF9fY29weVByb3BzKCFpc05vZGVNb2RlJiZtb2QmJm1vZC5fX2VzTW9kdWxlP3RhcmdldDpfX2RlZlByb3AodGFyZ2V0LFwiZGVmYXVsdFwiLHt2YWx1ZTptb2QsZW51bWVyYWJsZTohMH0pLG1vZCkpO2A7XG5cbmZ1bmN0aW9uIGdldENvbW1vbkpzUnVudGltZVByZWx1ZGUoY29kZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29kZS5pbmNsdWRlcygnX19jb21tb25KU01pbicpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFJvbGxkb3duIDEuMS4yIGNhbiBlbWl0IGhlbHBlcnMgYWZ0ZXIgY29yZS1qcyB3cmFwcGVycyB0aGF0IGFscmVhZHkgY2FsbCB0aGVtLlxuICAvLyBTZWVkaW5nIHRoZSBoZWxwZXJzIGZpcnN0IHByZXZlbnRzIG1pbmlmaWVkIG91dHB1dCBmcm9tIGNhbGxpbmcgdW5pbml0aWFsaXplZCBhbGlhc2VzLlxuICBpZiAoaXNDb21tb25Kc0Zvcm1hdChmb3JtYXQpKSByZXR1cm4gY29kZS5pbmNsdWRlcygnX190b0VTTScpID8gY29tbW9uSnNSdW50aW1lUHJlbHVkZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGB2YXIgX19jb21tb25KU01pbj0obW9kdWxlRmFjdG9yeSxtb2R1bGUpPT4oKT0+KG1vZHVsZXx8KG1vZHVsZT17ZXhwb3J0czp7fX0sbW9kdWxlRmFjdG9yeShtb2R1bGUuZXhwb3J0cyxtb2R1bGUpKSxtb2R1bGUuZXhwb3J0cyk7YDtcbn1cblxuZnVuY3Rpb24gaXNDb21tb25Kc0Zvcm1hdChmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZm9ybWF0ID09PSAnY2pzJyB8fCBmb3JtYXQgPT09ICdjb21tb25qcyc7XG59XG5cbmZ1bmN0aW9uIGdldFByZWx1ZGVJbnNlcnRpb25JbmRleChjb2RlOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBpZiAoY29kZS5zdGFydHNXaXRoKCcjIScpKSB7XG4gICAgY29uc3QgZmlyc3RMaW5lRW5kID0gY29kZS5pbmRleE9mKCdcXG4nKTtcbiAgICBpZiAoZmlyc3RMaW5lRW5kID09PSAtMSkgcmV0dXJuIGNvZGUubGVuZ3RoO1xuICAgIGluZGV4ID0gZmlyc3RMaW5lRW5kICsgMTtcbiAgfVxuXG4gIGNvbnN0IGRpcmVjdGl2ZVBhdHRlcm4gPSAvKD86KD86XCJbXlwiXFxuXSpcInwnW14nXFxuXSonKTs/XFxzKikveTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBkaXJlY3RpdmVQYXR0ZXJuLmxhc3RJbmRleCA9IGluZGV4O1xuICAgIGNvbnN0IG1hdGNoID0gZGlyZWN0aXZlUGF0dGVybi5leGVjKGNvZGUpO1xuICAgIGlmICghbWF0Y2g/LlswXSkgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4ID0gZGlyZWN0aXZlUGF0dGVybi5sYXN0SW5kZXg7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGV4dFBsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd0ZXh0JyxcbiAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICBpZiAoIWlkLmVuZHNXaXRoKCcuY3N2JykgJiYgIWlkLmVuZHNXaXRoKCcudHh0JykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShpZCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IGBleHBvcnQgZGVmYXVsdCAke0pTT04uc3RyaW5naWZ5KGNvbnRlbnQpfTtgLFxuICAgICAgICBtb2R1bGVUeXBlOiAnanMnLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICBpbnB1dHM/OiBzdHJpbmdbXVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZ1tdIHwgdW5kZWZpbmVkXVtdID0gW107XG4gIGxldCBjb3JlT3V0RGlyID0gcGF0aC5qb2luKG91dERpclBhdGgsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhjb3JlT3V0RGlyKSkge1xuICAgIC8vIFRoZSBidW5kbGVyIGVtaXR0ZWQgcGVyLXByb2plY3QgZGlyZWN0b3JpZXMgKG1vbm9yZXBvIGJ1aWxkKSwgc28gZW50cnktYmFzZWQgcmVzdHJpY3Rpb24gaXMgdW5zYWZlOlxuICAgIC8vIGVudHJpZXMgbWF5IGltcG9ydCBmaWxlcyBvdXRzaWRlIGVhY2ggcHJvamVjdCdzIHJvb3REaXIuXG4gICAgaW5wdXRzID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29yZVByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChwcm9qZWN0RGlyUGF0aCA9PT0gY29yZVByb2plY3REaXJQYXRoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IGZpbmRDb25maWdGaWxlKHByb2plY3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbihvdXREaXJQYXRoLCBkaXJlbnQubmFtZSwgJ3NyYycpO1xuICAgICAgaWYgKGNvbmZpZ0ZpbGUgJiYgZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgICAgIHByb2plY3RzLnB1c2goW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIsIHVuZGVmaW5lZF0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb3JlT3V0RGlyID0gb3V0RGlyUGF0aDtcbiAgfVxuICBwcm9qZWN0cy5wdXNoKFtjb3JlUHJvamVjdERpclBhdGgsIGNvcmVDb25maWdGaWxlLCBjb3JlT3V0RGlyLCBpbnB1dHNdKTtcblxuICBsZXQgYWxsU3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciwgcHJvamVjdElucHV0c10gb2YgcHJvamVjdHMpIHtcbiAgICBhbGxTdWNjZWVkZWQgJiY9IGF3YWl0IHJ1blRzZ28oYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciwgcHJvamVjdElucHV0cyk7XG4gIH1cbiAgcmV0dXJuIGFsbFN1Y2NlZWRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuVHNnbyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ0ZpbGU6IHN0cmluZyxcbiAgb3V0RGlyOiBzdHJpbmcsXG4gIGlucHV0cz86IHN0cmluZ1tdXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHNnbygpJywgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciwgaW5wdXRzKTtcbiAgfVxuXG4gIC8vIFRoZSB0ZW1wb3JhcnkgY29uZmlnIG11c3QgbGl2ZSBpbiB0aGUgcHJvamVjdCBkaXJlY3Rvcnkgc28gdGhhdCBpdHMgcmVsYXRpdmUgYHJvb3REaXJgIGFuZFxuICAvLyBgaW5jbHVkZWAgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBwcm9qZWN0IGV2ZW4gd2hlbiB0aGUgZXh0ZW5kZWQgdHNjb25maWcgaXMgaW4gYW4gYW5jZXN0b3IgZGlyZWN0b3J5LlxuICBjb25zdCB0ZW1wQ29uZmlnRmlsZSA9IHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgYC5idWlsZC10cy10c2dvLiR7cHJvY2Vzcy5waWR9LiR7RGF0ZS5ub3coKX0uanNvbmApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHRlbXBDb25maWdGaWxlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoYXdhaXQgY3JlYXRlVHlwZVNjcmlwdE5hdGl2ZUNvbmZpZyhwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyLCBpbnB1dHMpLCB1bmRlZmluZWQsIDIpXG4gICAgKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwcm9jZXNzLmV4ZWNQYXRoLCBbZ2V0VHNnb1BhdGgoKSwgJy1wJywgdGVtcENvbmZpZ0ZpbGVdLCB7XG4gICAgICBjd2Q6IHByb2plY3REaXJQYXRoLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LmVycm9yKSB0aHJvdyByZXQuZXJyb3I7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPT09IDA7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGVtcENvbmZpZ0ZpbGUsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHlwZVNjcmlwdE5hdGl2ZUNvbmZpZyhcbiAgcHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgY29uZmlnRmlsZTogc3RyaW5nLFxuICBvdXREaXI6IHN0cmluZyxcbiAgaW5wdXRzPzogc3RyaW5nW11cbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgY29tcGlsZXJPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAvLyBBbiBpbmhlcml0ZWQgYGNvbXBvc2l0ZWAgd291bGQgcmVxdWlyZSBsaXN0aW5nIGV2ZXJ5IGltcG9ydGVkIGZpbGUgZXhwbGljaXRseSAoVFM2MzA3KSBhbmQsXG4gICAgLy8gbGlrZSBgaW5jcmVtZW50YWxgLCB3b3VsZCB3cml0ZSBuZWVkbGVzcyAudHNidWlsZGluZm8gZmlsZXMgZm9yIHRoaXMgb25lLXNob3QgY29tcGlsYXRpb24uXG4gICAgY29tcG9zaXRlOiBmYWxzZSxcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICAvLyBBbiBpbmhlcml0ZWQgYGRlY2xhcmF0aW9uRGlyYCB3b3VsZCBzaWxlbnRseSByZWRpcmVjdCB0aGUgb3V0cHV0IGF3YXkgZnJvbSBgb3V0RGlyYC5cbiAgICBkZWNsYXJhdGlvbkRpcjogb3V0RGlyLFxuICAgIGVtaXREZWNsYXJhdGlvbk9ubHk6IHRydWUsXG4gICAgaW5jcmVtZW50YWw6IGZhbHNlLFxuICAgIG5vRW1pdDogZmFsc2UsXG4gICAgbm9FbWl0T25FcnJvcjogdHJ1ZSxcbiAgICBvdXREaXIsXG4gICAgLy8gVHlwZVNjcmlwdCA3IHJlcXVpcmVzIGFuIGV4cGxpY2l0IGByb290RGlyYCAoVFM1MDExKS4gRW50cmllcyBpbXBvcnRpbmcgZmlsZXMgb3V0c2lkZSBzcmMvXG4gICAgLy8gKGUuZy4gc2libGluZyBwYWNrYWdlcyBpbiBkZWNsYXJhdGlvbi1vbmx5IG1vZGUpIGZhaWwgd2l0aCBUUzYwNTk7IHNlZSB0aGUgUkVBRE1FIGxpbWl0YXRpb24uXG4gICAgcm9vdERpcjogJ3NyYycsXG4gIH07XG4gIGlmIChhd2FpdCB1c2VzTm9kZVByb3RvY29sSW1wb3J0KHBhdGguam9pbihwcm9qZWN0RGlyUGF0aCwgJ3NyYycpKSkge1xuICAgIGNvbnN0IHR5cGVzRGlyUGF0aCA9IGZpbmRUeXBlc0RpclBhdGgocHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IHR5cGVzID0gdHlwZXNEaXJQYXRoID8gYXdhaXQgY29sbGVjdFR5cGVQYWNrYWdlcyh0eXBlc0RpclBhdGgpIDogW107XG4gICAgaWYgKHR5cGVzLmluY2x1ZGVzKCdub2RlJykpIHtcbiAgICAgIGNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IHR5cGVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbXBpbGVyT3B0aW9ucyxcbiAgICBleHRlbmRzOiB0b1JlbGF0aXZlQ29uZmlnUGF0aChwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSksXG4gICAgLy8gV2l0aCBgZmlsZXNgLCB0c2MgYWxzbyBlbWl0cyBkZWNsYXJhdGlvbnMgZm9yIGZpbGVzIHRyYW5zaXRpdmVseSBpbXBvcnRlZCBmcm9tIHRoZSBlbnRyaWVzLFxuICAgIC8vIHNvIHRoZSBvdXRwdXQgaXMgcmVzdHJpY3RlZCB0byB3aGF0IHRoZSBidW5kbGVkIEphdmFTY3JpcHQgYWN0dWFsbHkgY29udGFpbnMuIGBpbmNsdWRlYCBtdXN0IGJlXG4gICAgLy8gb3ZlcnJpZGRlbiBzaW5jZSBhbiBpbmhlcml0ZWQgYGluY2x1ZGVgIHdvdWxkIGFkZCBmaWxlcyBiYWNrIHRvIHRoZSBwcm9ncmFtOyBvbmx5IGFtYmllbnRcbiAgICAvLyBkZWNsYXJhdGlvbiBmaWxlcyBhcmUga2VwdCBiZWNhdXNlIGVudHJpZXMgbWF5IHJlbHkgb24gdGhlaXIgZ2xvYmFsIHR5cGVzIHdpdGhvdXQgaW1wb3J0aW5nIHRoZW0uXG4gICAgLi4uKGlucHV0cz8ubGVuZ3RoXG4gICAgICA/IHtcbiAgICAgICAgICBleGNsdWRlOiBbXSxcbiAgICAgICAgICBmaWxlczogaW5wdXRzLm1hcCgoaW5wdXQpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyUGF0aCwgaW5wdXQpLnJlcGxhY2VBbGwocGF0aC5zZXAsICcvJykpLFxuICAgICAgICAgIGluY2x1ZGU6IFsnc3JjLyoqLyouZC50cycsICdzcmMvKiovKi5kLm10cycsICdzcmMvKiovKi5kLmN0cyddLFxuICAgICAgICB9XG4gICAgICA6IHsgaW5jbHVkZTogWydzcmMvKiovKiddIH0pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kQ29uZmlnRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdGaWxlKSkgcmV0dXJuIGNvbmZpZ0ZpbGU7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3VycmVudERpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRzZ29QYXRoKCk6IHN0cmluZyB7XG4gIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIChmb3JtZXJseSBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgKSBhc1xuICAvLyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UsIHdob3NlIGBsaWIvdHNjLmpzYCB3cmFwcGVyIHNwYXducyB0aGUgcGxhdGZvcm0gYmluYXJ5LlxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoJ3R5cGVzY3JpcHQvcGFja2FnZS5qc29uJyk7XG4gIHJldHVybiBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksICdsaWInLCAndHNjLmpzJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaWYgKGF3YWl0IHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQoY2hpbGRQYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKC9cXC5bY21dP3RzeD8kLy50ZXN0KGRpcmVudC5uYW1lKSAmJiAoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY2hpbGRQYXRoLCAndXRmOCcpKS5pbmNsdWRlcygnbm9kZTonKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGZpbmRUeXBlc0RpclBhdGgoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnREaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHR5cGVzRGlyUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICdAdHlwZXMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0eXBlc0RpclBhdGgpKSByZXR1cm4gdHlwZXNEaXJQYXRoO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0VHlwZVBhY2thZ2VzKHR5cGVSb290c0RpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0eXBlUm9vdHNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRpcmVudHMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLy8gYHRvRmlsZVBhdGhgIGlzIGFsd2F5cyBhIHRzY29uZmlnIGluIGBmcm9tRGlyUGF0aGAgb3Igb25lIG9mIGl0cyBhbmNlc3RvciBkaXJlY3Rvcmllcywgc28gdGhlXG4vLyByZXN1bHQgaXMgYWx3YXlzIHJlbGF0aXZlIChgLi9gIG9yIGAuLi9gIGNoYWlucyk7IGEgY3Jvc3MtZHJpdmUgYWJzb2x1dGUgcmVzdWx0IGlzIGltcG9zc2libGUuXG5mdW5jdGlvbiB0b1JlbGF0aXZlQ29uZmlnUGF0aChmcm9tRGlyUGF0aDogc3RyaW5nLCB0b0ZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGZyb21EaXJQYXRoLCB0b0ZpbGVQYXRoKS5yZXBsYWNlQWxsKHBhdGguc2VwLCAnLycpO1xuICByZXR1cm4gcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSA/IHJlbGF0aXZlUGF0aCA6IGAuLyR7cmVsYXRpdmVQYXRofWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgc3R5bGVUZXh0IH0gZnJvbSAnbm9kZTp1dGlsJztcblxuaW1wb3J0IHsgcm9sbGRvd24sIHdhdGNoIH0gZnJvbSAncm9sbGRvd24nO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRPcHRpb25zLCBSb2xsZG93bkJ1aWxkLCBSb2xsZG93bk9wdGlvbnMgfSBmcm9tICdyb2xsZG93bic7XG5pbXBvcnQgeyBvbkV4aXQgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uLCBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUgfSBmcm9tICcuLi8uLi9lbnYuanMnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlLCBUYXJnZXRDYXRlZ29yeSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgYWxsVGFyZ2V0Q2F0ZWdvcmllcyB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGZvcm1hdERhdGVUaW1lLCBmb3JtYXREdXJhdGlvbiwgZ2V0TmFtZXNwYWNlQW5kTmFtZSwgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlLCBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGFwcEJ1aWxkZXIsIGZ1bmN0aW9uc0J1aWxkZXIsIGxpYkJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tICcuL2J1bmRsZXJMb2dnZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlRXh0ZXJuYWxNYXRjaGVyIH0gZnJvbSAnLi9leHRlcm5hbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBCdW5kbGVyUGxhdGZvcm0gfSBmcm9tICcuL2lucHV0UmVzb2x2ZXIuanMnO1xuaW1wb3J0IHtcbiAgYnVuZGxlclJlc29sdmVPcHRpb25zLFxuICBjcmVhdGVCdW5kbGVyUmVzb2x2ZXJzLFxuICBpc0J1bmRsZXJSZXNvbHZhYmxlUGF0aCxcbiAgcmVzb2x2ZVNvdXJjZUZpbGVQYXRocyxcbn0gZnJvbSAnLi9pbnB1dFJlc29sdmVyLmpzJztcbmltcG9ydCB7IHNldHVwUGx1Z2lucyB9IGZyb20gJy4vcGx1Z2luLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbmV4cG9ydCBjb25zdCBhcHA6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgYXBwQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYXBwIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYW4gYXBwJyxcbiAgYnVpbGRlcjogYXBwQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdhcHAnKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgZnVuY3Rpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZnVuY3Rpb25zIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBHQ1AvRmlyZWJhc2UgZnVuY3Rpb25zIGFwcCcsXG4gIGJ1aWxkZXI6IGZ1bmN0aW9uc0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2Lm9ubHlQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gICAgICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICAgICAgICByZXNvbHZlT3V0RGlyUGF0aChhcmd2LCBwcm9jZXNzLmN3ZCgpLCBwYWNrYWdlRGlyUGF0aCwgdW5kZWZpbmVkLCAnZnVuY3Rpb25zJyksXG4gICAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgICBhcmd2Lm1vZHVsZVR5cGVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWlsZChhcmd2LCAnZnVuY3Rpb25zJyk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxpYjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBsaWJCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaWIgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIE5vZGUuanMgLyBSZWFjdCBsaWJyYXJ5JyxcbiAgYnVpbGRlcjogbGliQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdsaWInKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgdGFyZ2V0Q2F0ZWdvcnk6IFRhcmdldENhdGVnb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8PSAncHJvZHVjdGlvbic7XG5cbiAgLy8gYHNpbGVudGAgaXMgc3Ryb25nZXIgdGhhbiBgdmVyYm9zZWAuXG4gIGNvbnN0IHZlcmJvc2UgPSAhYXJndi5zaWxlbnQgJiYgYXJndi52ZXJib3NlO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcGFja2FnZURpclBhdGgpO1xuXG4gIGNvbnN0IGlucHV0cyA9IHZlcmlmeUlucHV0KGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCB0YXJnZXREZXRhaWwgPSBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnksIGlucHV0cywgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCBvdXREaXJQYXRoID0gcmVzb2x2ZU91dERpclBhdGgoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCwgaW5wdXRzLCB0YXJnZXRDYXRlZ29yeSk7XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ2FyZ3Y6JywgYXJndik7XG4gICAgY29uc29sZS5pbmZvKCdwYWNrYWdlSnNvblBhdGg6JywgcGFja2FnZUpzb25QYXRoKTtcbiAgICBjb25zb2xlLmluZm8oJ1RhcmdldCAoQ2F0ZWdvcnkpOicsIGAke3RhcmdldERldGFpbH0gKCR7dGFyZ2V0Q2F0ZWdvcnl9KWApO1xuICB9XG5cbiAgY29uc3QgW25hbWVzcGFjZV0gPSBnZXROYW1lc3BhY2VBbmROYW1lKHBhY2thZ2VKc29uKTtcbiAgY29uc3QgaXNFc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG5cbiAgaWYgKGFyZ3ZbJ2NvcmUtanMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKUyA9ICcxJztcbiAgfSBlbHNlIGlmIChhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTX1dJVEhfUFJPUE9TQUxTID0gJzEnO1xuICB9XG5cbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19WRVJCT1NFID0gJzEnO1xuICB9XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9DQVRFR09SWSA9IHRhcmdldENhdGVnb3J5O1xuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfREVUQUlMID0gdGFyZ2V0RGV0YWlsO1xuXG4gIGNvbnN0IGRlY2xhcmF0aW9uT25seSA9ICdkZWNsYXJhdGlvbk9ubHknIGluIGFyZ3YgJiYgYXJndi5kZWNsYXJhdGlvbk9ubHk7XG4gIGlmIChkZWNsYXJhdGlvbk9ubHkgJiYgYXJndi53YXRjaCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJy0tZGVjbGFyYXRpb24tb25seSBjYW5ub3QgYmUgdXNlZCB3aXRoIC0td2F0Y2guJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3QgPSBnZXRPdXRwdXRPcHRpb25zTGlzdChhcmd2LCB0YXJnZXREZXRhaWwsIG91dERpclBhdGgsIGlzRXNtUGFja2FnZSwgcGFja2FnZURpclBhdGgpO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnT3V0cHV0T3B0aW9uczonLCBvdXRwdXRPcHRpb25zTGlzdCk7XG4gIH1cbiAgaWYgKG91dHB1dE9wdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3Qgb3V0cHV0IGZpbGVzLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIFRoZSBidW5kbGVyIHJlc29sdmVzIHBlciBvdXRwdXQgZm9ybWF0LCBzbyBkZWNsYXJhdGlvbnMgbXVzdCBjb3ZlciBldmVyeSBwbGF0Zm9ybSBpbiBwbGF5LlxuICBjb25zdCBwbGF0Zm9ybXMgPSBvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpOiBCdW5kbGVyUGxhdGZvcm0gPT4gKG9wdHMuZm9ybWF0ID09PSAnY29tbW9uanMnID8gJ25vZGUnIDogJ2Jyb3dzZXInKSk7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gcmVzb2x2ZURlY2xhcmF0aW9uSW5wdXRzKGFyZ3YsIGlucHV0cywgcGxhdGZvcm1zKTtcbiAgY29uc3QgZGVjbGFyYXRpb25JbnB1dHMgPSBkZWNsYXJhdGlvbi5wYXRocztcbiAgLy8gRXhwbGljaXQgaW5wdXRzIHRoYXQgdGhlIGJ1bmRsZXIgaWdub3JlcyBvbiBldmVyeSBwbGF0Zm9ybSBsZWF2ZSBub3RoaW5nIHRvIGRlY2xhcmUuIEdlbmVyYXRpbmdcbiAgLy8gYW55d2F5IHdvdWxkIGVtaXQgZGVjbGFyYXRpb25zIGZvciBldmVyeSBmaWxlIHVuZGVyIHNyYy8sIHNpbmNlIGFuIGVtcHR5IGVudHJ5IGxpc3QgaXMgbm8gZmlsdGVyLlxuICBjb25zdCBoYXNOb3RoaW5nVG9EZWNsYXJlID0gZGVjbGFyYXRpb25JbnB1dHM/Lmxlbmd0aCA9PT0gMDtcblxuICBwcm9jZXNzLmNoZGlyKHBhY2thZ2VEaXJQYXRoKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMob3V0RGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gIH1cblxuICBpZiAoZGVjbGFyYXRpb25Pbmx5KSB7XG4gICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBzdHlsZVRleHQoXG4gICAgICAgICAgJ2N5YW4nLFxuICAgICAgICAgIGBHZW5lcmF0ZXMgZGVjbGFyYXRpb24gZmlsZXMg4oaSICR7c3R5bGVUZXh0KCdib2xkJywgcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgb3V0RGlyUGF0aCkpfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRlY2xhcmF0aW9uLnVucmVzb2x2ZWRJbnB1dCkge1xuICAgICAgcmVwb3J0VW5yZXNvbHZlZElucHV0KGRlY2xhcmF0aW9uLnVucmVzb2x2ZWRJbnB1dCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmICghaGFzTm90aGluZ1RvRGVjbGFyZSAmJiAhKGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCwgb3V0RGlyUGF0aCwgZGVjbGFyYXRpb25JbnB1dHMpKSkge1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcHRpb25zOiBSb2xsZG93bk9wdGlvbnMgPSB7XG4gICAgY2hlY2tzOiB7IHByZWZlckJ1aWx0aW5GZWF0dXJlOiBmYWxzZSB9LFxuICAgIGV4dGVybmFsOiBjcmVhdGVFeHRlcm5hbE1hdGNoZXIoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlSnNvbiwgbmFtZXNwYWNlLCBwYWNrYWdlRGlyUGF0aCksXG4gICAgaW5wdXQ6XG4gICAgICB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnID8gY3JlYXRlRnVuY3Rpb25zSW5wdXRFbnRyaWVzKGlucHV0cykgOiBpbnB1dHMsXG4gICAgcGx1Z2luczogc2V0dXBQbHVnaW5zKGFyZ3YsIG91dHB1dE9wdGlvbnNMaXN0LCBwYWNrYWdlRGlyUGF0aCksXG4gICAgcmVzb2x2ZTogYnVuZGxlclJlc29sdmVPcHRpb25zLFxuICAgIHRyZWVzaGFrZTogYXJndlsnY29yZS1qcyddIHx8IGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10gPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICB0cmFuc2Zvcm06IGdldFRyYW5zZm9ybU9wdGlvbnMoYXJndiwgcGFja2FnZURpclBhdGgpLFxuICAgIHdhdGNoOiBhcmd2LndhdGNoID8geyBjbGVhclNjcmVlbjogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgfTtcblxuICBjb25zdCBwYXRoVG9SZWxhdGl2ZVBhdGggPSAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPik6IHN0cmluZ1tdID0+XG4gICAgKEFycmF5LmlzQXJyYXkocGF0aHMpID8gcGF0aHMgOiBbcGF0aHNdKS5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHApKTtcbiAgY29uc3QgcHJpbnRCdW5kbGluZ01lc3NhZ2UgPSAoaW5wdXRQYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KTogdm9pZCA9PiB7XG4gICAgY29uc3Qgb3V0cHV0UGF0aHMgPSBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKTtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBzdHlsZVRleHQoXG4gICAgICAgICdjeWFuJyxcbiAgICAgICAgYEJ1bmRsZXMgJHtzdHlsZVRleHQoJ2JvbGQnLCBwYXRoVG9SZWxhdGl2ZVBhdGgoaW5wdXRQYXRocykuam9pbignLCAnKSl9IOKGkiAke3N0eWxlVGV4dChcbiAgICAgICAgICAnYm9sZCcsXG4gICAgICAgICAgb3V0cHV0UGF0aHMuam9pbignLCAnKVxuICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgIClcbiAgICApO1xuICB9O1xuICBpZiAoYXJndi53YXRjaCkge1xuICAgIHdhdGNoUm9sbGRvd24oXG4gICAgICBhcmd2LFxuICAgICAgdGFyZ2V0RGV0YWlsLFxuICAgICAgcGFja2FnZURpclBhdGgsXG4gICAgICBvdXREaXJQYXRoLFxuICAgICAgaW5wdXRzLFxuICAgICAgcGxhdGZvcm1zLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG91dHB1dE9wdGlvbnNMaXN0LFxuICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoLFxuICAgICAgcHJpbnRCdW5kbGluZ01lc3NhZ2VcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIHByaW50QnVuZGxpbmdNZXNzYWdlKGlucHV0cyk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbGRvd25CdWlsZCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnVpbGRGYWlsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IF9idW5kbGUgPSBhd2FpdCByb2xsZG93bihvcHRpb25zKTtcbiAgICAgIGJ1bmRsZSA9IF9idW5kbGU7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IF9idW5kbGUud3JpdGUob3B0cykpKTtcblxuICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgc3R5bGVUZXh0KFxuICAgICAgICAgICAgJ2dyZWVuJyxcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtzdHlsZVRleHQoJ2JvbGQnLCBmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnVpbGRGYWlsZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgfVxuICAgIGF3YWl0IGJ1bmRsZT8uY2xvc2UoKTtcbiAgICBpZiAoYnVpbGRGYWlsZWQpIHByb2Nlc3MuZXhpdCgxKTtcblxuICAgIGlmICh0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiYgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJyAmJiAhaGFzTm90aGluZ1RvRGVjbGFyZSkge1xuICAgICAgLy8gVGhlIGJ1bmRsZXIgcmVwb3J0cyBhbiB1bnJlc29sdmFibGUgZW50cnkgaXRzZWxmLCBzbyByZWFjaGluZyBoZXJlIG1lYW5zIGl0IHNvbWVob3cgZGlkIG5vdC5cbiAgICAgIGlmIChkZWNsYXJhdGlvbi51bnJlc29sdmVkSW5wdXQpIHtcbiAgICAgICAgcmVwb3J0VW5yZXNvbHZlZElucHV0KGRlY2xhcmF0aW9uLnVucmVzb2x2ZWRJbnB1dCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCwgb3V0RGlyUGF0aCwgZGVjbGFyYXRpb25JbnB1dHMpKSkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zZm9ybU9wdGlvbnMoYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBSb2xsZG93bk9wdGlvbnNbJ3RyYW5zZm9ybSddIHtcbiAgcmV0dXJuIHtcbiAgICBkZWZpbmU6IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbihhcmd2LCBwYWNrYWdlRGlyUGF0aCksXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICB0YXJnZXQ6ICdlczIwMjInLFxuICB9O1xufVxuXG5mdW5jdGlvbiB3YXRjaFJvbGxkb3duKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG91dERpclBhdGg6IHN0cmluZyxcbiAgaW5wdXRzOiBzdHJpbmdbXSxcbiAgcGxhdGZvcm1zOiBCdW5kbGVyUGxhdGZvcm1bXSxcbiAgb3B0aW9uczogUm9sbGRvd25PcHRpb25zLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdLFxuICBwYXRoVG9SZWxhdGl2ZVBhdGg6IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiBzdHJpbmdbXSxcbiAgcHJpbnRCdW5kbGluZ01lc3NhZ2U6IChpbnB1dFBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pID0+IHZvaWRcbik6IHZvaWQge1xuICBjb25zdCB3YXRjaGVyID0gd2F0Y2goeyAuLi5vcHRpb25zLCBvdXRwdXQ6IG91dHB1dE9wdGlvbnNMaXN0IH0pO1xuXG4gIGNvbnN0IGNsb3NlID0gYXN5bmMgKGNvZGU/OiBudW1iZXIgfCBudWxsKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZU9uVW5jYXVnaHRFeGNlcHRpb24pO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsb3NlT25TdGRpbkVuZCk7XG4gICAgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgIGlmIChjb2RlKSBwcm9jZXNzLmV4aXQoY29kZSk7XG4gIH07XG4gIGNvbnN0IGNsb3NlT25VbmNhdWdodEV4Y2VwdGlvbiA9IChlcnJvcjogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIHZvaWQgY2xvc2UoMSk7XG4gIH07XG4gIGNvbnN0IGNsb3NlT25TdGRpbkVuZCA9ICgpOiB2b2lkID0+IHtcbiAgICB2b2lkIGNsb3NlKCk7XG4gIH07XG4gIG9uRXhpdCgoY29kZSkgPT4gdm9pZCBjbG9zZShjb2RlKSk7XG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2VPblVuY2F1Z2h0RXhjZXB0aW9uKTtcbiAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgY2xvc2VPblN0ZGluRW5kKTtcbiAgICBwcm9jZXNzLnN0ZGluLnJlc3VtZSgpO1xuICB9XG5cbiAgd2F0Y2hlci5vbignZXZlbnQnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGV2ZW50LmVycm9yLCB0cnVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCVU5ETEVfU1RBUlQnOiB7XG4gICAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICAgIHByaW50QnVuZGxpbmdNZXNzYWdlKGdldElucHV0RmlsZXMob3B0aW9ucy5pbnB1dCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0JVTkRMRV9FTkQnOiB7XG4gICAgICAgICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICBzdHlsZVRleHQoXG4gICAgICAgICAgICAgICAgJ2dyZWVuJyxcbiAgICAgICAgICAgICAgICBgQ3JlYXRlZCAke3N0eWxlVGV4dCgnYm9sZCcsIHBhdGhUb1JlbGF0aXZlUGF0aChldmVudC5vdXRwdXQpLmpvaW4oJywgJykpfSBpbiAke3N0eWxlVGV4dChcbiAgICAgICAgICAgICAgICAgICdib2xkJyxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdER1cmF0aW9uKGV2ZW50LmR1cmF0aW9uKVxuICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiYgdGFyZ2V0RGV0YWlsICE9PSAnZnVuY3Rpb25zJykge1xuICAgICAgICAgICAgLy8gVGhlIGJ1bmRsZXIgcmUtcmVzb2x2ZXMgaXRzIGxpdGVyYWwgaW5wdXRzIG9uIGV2ZXJ5IHJlYnVpbGQsIHNvIHRoZSBkZWNsYXJhdGlvbiBpbnB1dHNcbiAgICAgICAgICAgIC8vIGFyZSByZXNvbHZlZCBhZ2FpbiBoZXJlOyByZXVzaW5nIHRoZSBpbml0aWFsIGxpc3Qgd291bGQgZGVzY3JpYmUgdGhlIHByZXZpb3VzIHNvdXJjZXNcbiAgICAgICAgICAgIC8vIGFmdGVyIGFuIGVudHJ5IChlLmcuIGEgcGFja2FnZSBlbnRyeSBmaWVsZCkgc3RhcnRlZCByZXNvbHZpbmcgZWxzZXdoZXJlLlxuICAgICAgICAgICAgY29uc3QgcmVidWlsdCA9IHJlc29sdmVEZWNsYXJhdGlvbklucHV0cyhhcmd2LCBpbnB1dHMsIHBsYXRmb3Jtcyk7XG4gICAgICAgICAgICBpZiAocmVidWlsdC51bnJlc29sdmVkSW5wdXQpIHtcbiAgICAgICAgICAgICAgcmVwb3J0VW5yZXNvbHZlZElucHV0KHJlYnVpbHQudW5yZXNvbHZlZElucHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVidWlsdC5wYXRocz8ubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCwgb3V0RGlyUGF0aCwgcmVidWlsdC5wYXRocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0VORCc6IHtcbiAgICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgICAgY29uc29sZS5pbmZvKGBcXG5bJHtmb3JtYXREYXRlVGltZShuZXcgRGF0ZSgpKX1dIHdhaXRpbmcgZm9yIGNoYW5nZXMuLi5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBLZWVwIHRoZSB3YXRjaGVyIGFsaXZlIGV2ZW4gaWYgaGFuZGxpbmcgYW4gZXZlbnQgKGUuZy4gZGVjbGFyYXRpb24gZmlsZSBnZW5lcmF0aW9uKSBmYWlscy5cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBoYW5kbGUgd2F0Y2ggZXZlbnQgZHVlIHRvOicsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCdyZXN1bHQnIGluIGV2ZW50ICYmIGV2ZW50LnJlc3VsdCkge1xuICAgICAgICB2b2lkIGV2ZW50LnJlc3VsdC5jbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVPdXREaXJQYXRoKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgY3dkOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIGlucHV0cz86IHN0cmluZ1tdLFxuICB0YXJnZXRDYXRlZ29yeT86IFRhcmdldENhdGVnb3J5XG4pOiBzdHJpbmcge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcmd2Lm91dERpcikpIHtcbiAgICBjb25zb2xlLmVycm9yKCdNdWx0aXBsZSAtLW91dC1kaXIgb3B0aW9ucyBhcmUgbm90IGFsbG93ZWQuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIC8vIHlhcmdzIGFsc28gYWNjZXB0cyBgLS1uby1vdXQtZGlyYCwgd2hpY2ggeWllbGRzIGBmYWxzZWAgZGVzcGl0ZSB0aGUgZGVjbGFyZWQgc3RyaW5nIHR5cGUuXG4gIGNvbnN0IG91dERpck9wdGlvbiA9IHR5cGVvZiBhcmd2Lm91dERpciA9PT0gJ3N0cmluZycgPyBhcmd2Lm91dERpciA6IHVuZGVmaW5lZDtcbiAgaWYgKG91dERpck9wdGlvbiA9PT0gJycpIHtcbiAgICBjb25zb2xlLmVycm9yKCctLW91dC1kaXIgbXVzdCBub3QgYmUgZW1wdHkuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gVGhlIG91dHB1dCBkaXJlY3RvcnkgaXMgcmVtb3ZlZCBiZWZvcmUgYnVpbGRpbmcsIHNvIHJlZnVzZSBsb2NhdGlvbnMgdGhhdCB3b3VsZCBkZWxldGUgc291cmNlIGZpbGVzLlxuICAvLyBDb250YWlubWVudCBjaGVja3MgY29tcGFyZSBib3RoIHRoZSBsZXhpY2FsIGFuZCB0aGUgY2Fub25pY2FsIChzeW1saW5rLXJlc29sdmVkKSBmb3JtczogY2Fub25pY2FsXG4gIC8vIG9uZXMgY2F0Y2ggc3ltbGlua2VkIHBhcmVudCBjb21wb25lbnRzIChgZnMucm1gIGZvbGxvd3MgdGhlbSksIGFuZCBsZXhpY2FsIG9uZXMgY2F0Y2ggYW4gb3V0cHV0IHBhdGhcbiAgLy8gdGhhdCBpcyBpdHNlbGYgYSBzeW1saW5rIGluc2lkZSBhIHByb3RlY3RlZCBkaXJlY3RvcnkuIFRoZSBsZXhpY2FsIHBhdGggaXMgcmV0dXJuZWQgc28gdGhhdCByZW1vdmluZ1xuICAvLyBhIHN5bWxpbmtlZCBvdXRwdXQgZGlyZWN0b3J5IGRlbGV0ZXMgdGhlIHN5bWxpbmsgaXRzZWxmIHJhdGhlciB0aGFuIGl0cyB0YXJnZXQncyBjb250ZW50cy5cbiAgY29uc3QgbGV4aWNhbE91dERpclBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCBvdXREaXJPcHRpb24gPz8gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpKTtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHRvQ2Fub25pY2FsUGF0aChsZXhpY2FsT3V0RGlyUGF0aCk7XG4gIGNvbnN0IGNvbnRhaW5lZElucHV0ID0gaW5wdXRzPy5maW5kKFxuICAgIChpbnB1dCkgPT4gY29udGFpbnNQYXRoKG91dERpclBhdGgsIHRvQ2Fub25pY2FsUGF0aChpbnB1dCkpIHx8IGNvbnRhaW5zUGF0aChsZXhpY2FsT3V0RGlyUGF0aCwgaW5wdXQpXG4gICk7XG4gIGlmIChjb250YWluZWRJbnB1dCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBvdXRwdXQgZGlyZWN0b3J5ICgke291dERpclBhdGh9KSBtdXN0IG5vdCBjb250YWluIHRoZSBpbnB1dCBmaWxlICgke2NvbnRhaW5lZElucHV0fSkuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGlmICghb3V0RGlyT3B0aW9uKSByZXR1cm4gbGV4aWNhbE91dERpclBhdGg7XG5cbiAgY29uc3QgY2Fub25pY2FsUGFja2FnZURpclBhdGggPSB0b0Nhbm9uaWNhbFBhdGgocGFja2FnZURpclBhdGgpO1xuICBpZiAoY29udGFpbnNQYXRoKG91dERpclBhdGgsIGNhbm9uaWNhbFBhY2thZ2VEaXJQYXRoKSB8fCBjb250YWluc1BhdGgobGV4aWNhbE91dERpclBhdGgsIHBhY2thZ2VEaXJQYXRoKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYC0tb3V0LWRpciAoJHtvdXREaXJQYXRofSkgbXVzdCBub3QgY29udGFpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgKCR7Y2Fub25pY2FsUGFja2FnZURpclBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgLy8gYHNyY2AgaXRzZWxmIG1heSBiZSBhIHN5bWxpbmssIHNvIGl0IG5lZWRzIGl0cyBvd24gY2Fub25pY2FsaXphdGlvbi5cbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHRvQ2Fub25pY2FsUGF0aChwYXRoLmpvaW4oY2Fub25pY2FsUGFja2FnZURpclBhdGgsICdzcmMnKSk7XG4gIGlmIChjb250YWluc1BhdGgoc3JjRGlyUGF0aCwgb3V0RGlyUGF0aCkgfHwgY29udGFpbnNQYXRoKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpLCBsZXhpY2FsT3V0RGlyUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGAtLW91dC1kaXIgKCR7b3V0RGlyUGF0aH0pIG11c3Qgbm90IGJlIGluc2lkZSB0aGUgc291cmNlIGRpcmVjdG9yeSAoJHtzcmNEaXJQYXRofSkuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIC8vIEEgcGFja2FnZS5qc29uIGF0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IHJvb3QgaW5kaWNhdGVzIGFub3RoZXIgcGFja2FnZSdzIGRpcmVjdG9yeS4gVGhlIGZ1bmN0aW9uc1xuICAvLyB0YXJnZXQgaXMgZXhlbXB0IGJlY2F1c2UgaXQgZ2VuZXJhdGVzIGEgcGFja2FnZS5qc29uIHRoZXJlIGl0c2VsZi5cbiAgaWYgKHRhcmdldENhdGVnb3J5ICE9PSAnZnVuY3Rpb25zJyAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihvdXREaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgY29uc29sZS5lcnJvcihgLS1vdXQtZGlyICgke291dERpclBhdGh9KSBjb250YWlucyBhIHBhY2thZ2UuanNvbiwgc28gaXQgbG9va3MgbGlrZSBhIHBhY2thZ2UgZGlyZWN0b3J5LmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuICByZXR1cm4gbGV4aWNhbE91dERpclBhdGg7XG59XG5cbi8vIFJlc29sdmVzIHN5bWxpbmtzIGluIHRoZSBsb25nZXN0IGV4aXN0aW5nIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBwYXRoLCBrZWVwaW5nIHRoZSBub24tZXhpc3RlbnQgdGFpbC5cbmZ1bmN0aW9uIHRvQ2Fub25pY2FsUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzdWZmaXhlczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRQYXRoID0gdGFyZ2V0UGF0aDtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKGN1cnJlbnRQYXRoKSkge1xuICAgIHN1ZmZpeGVzLnVuc2hpZnQocGF0aC5iYXNlbmFtZShjdXJyZW50UGF0aCkpO1xuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBjdXJyZW50UGF0aCkgYnJlYWs7XG4gICAgY3VycmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICB9XG4gIHRyeSB7XG4gICAgY3VycmVudFBhdGggPSBmcy5yZWFscGF0aFN5bmMoY3VycmVudFBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBLZWVwIHRoZSBvcmlnaW5hbCBwYXRoIHdoZW4gaXQgY2Fubm90IGJlIHJlc29sdmVkIChlLmcuIHJlbW92ZWQgY29uY3VycmVudGx5KS5cbiAgfVxuICByZXR1cm4gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCAuLi5zdWZmaXhlcyk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zUGF0aChwYXJlbnRQYXRoOiBzdHJpbmcsIGNoaWxkUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGFyZW50UGF0aCwgY2hpbGRQYXRoKTtcbiAgaWYgKHJlbGF0aXZlUGF0aCA9PT0gJycpIHJldHVybiB0cnVlO1xuICBpZiAocGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpIHJldHVybiBmYWxzZTtcbiAgLy8gT25seSBhbiBhY3R1YWwgYC4uYCBzZWdtZW50IG1lYW5zIFwib3V0c2lkZVwiOyBhIGNoaWxkIG5hbWUgbGlrZSBgLi5mb29gIGFsc28gc3RhcnRzIHdpdGggYC4uYC5cbiAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoYC4uJHtwYXRoLnNlcH1gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25zSW5wdXRFbnRyaWVzKGlucHV0czogc3RyaW5nW10pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgLy8gQSBudWxsIHByb3RvdHlwZSBhdm9pZHMgZmFsc2UgY29uZmxpY3RzIHdpdGggaW5oZXJpdGVkIG1lbWJlcnMgKGUuZy4gYW4gZW50cnkgbmFtZWQgXCJ0b1N0cmluZ1wiKS5cbiAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBpbnB1dF0gb2YgaW5wdXRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IG5hbWUgPSBpbmRleCA9PT0gMCA/ICdpbmRleCcgOiBwYXRoLmJhc2VuYW1lKGlucHV0LCBwYXRoLmV4dG5hbWUoaW5wdXQpKTtcbiAgICBpZiAoZW50cmllc1tuYW1lXSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVudHJ5IG5hbWVzIGNvbmZsaWN0IGluIHRoZSBmdW5jdGlvbnMgYnVpbGQ6IFwiJHtuYW1lfVwiICgke2VudHJpZXNbbmFtZV19IHZzICR7aW5wdXR9KS4gTGlzdCAtLWlucHV0IGZpbGVzIGV4cGxpY2l0bHkgd2l0aCB1bmlxdWUgYmFzZSBuYW1lcywga2VlcGluZyB0aGUgbWFpbiBlbnRyeSBmaXJzdC5gXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBlbnRyaWVzW25hbWVdID0gaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8vIFJlc3RyaWN0cyBkZWNsYXJhdGlvbiBmaWxlcyB0byB0aGUgZW50cnkgZmlsZXMgKGFuZCB0aGVpciBpbXBvcnRzKSBvbmx5IHdoZW4gaW5wdXRzIGFyZSBleHBsaWNpdCxcbi8vIHRvIGtlZXAgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZW1pdHRpbmcgZGVjbGFyYXRpb25zIGZvciBhbGwgZmlsZXMgdW5kZXIgc3JjLy4gdHNjIGNhbm5vdCB0YWtlIGFcbi8vIGJ1bmRsZXItc3R5bGUgZW50cnkgKGEgZGlyZWN0b3J5LCBvciBhIFwiLmpzXCIgc3BlY2lmaWVyIGFsaWFzZWQgdG8gYSBcIi50c1wiIHNvdXJjZSkgbGl0ZXJhbGx5LCBzbyBlYWNoXG4vLyBvbmUgaXMgcmVzb2x2ZWQgdG8gdGhlIHNvdXJjZSBmaWxlIGl0IHJlZmVycyB0bzsgYW4gdW5yZXNvbHZhYmxlIHBhdGggaXMga2VwdCBhcyBpcyB0byBsZXQgdGhlXG4vLyBjb21waWxlciByZXBvcnQgaXQuIFJlc29sdXRpb24gZGVwZW5kcyBvbiB0aGUgZmlsZSBzeXN0ZW0sIHNvIGEgd2F0Y2ggcmVidWlsZCBoYXMgdG8gcmVkbyBpdC5cbmludGVyZmFjZSBEZWNsYXJhdGlvbklucHV0cyB7XG4gIC8qKiBVbmRlZmluZWQgcmVzdHJpY3RzIG5vdGhpbmcsIHNvIGRlY2xhcmF0aW9ucyBjb3ZlciBldmVyeSBmaWxlIHVuZGVyIHNyYy8uICovXG4gIHBhdGhzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFNldCB3aGVuIHRoZSBidW5kbGVyIGNhbm5vdCByZXNvbHZlIGFuIGlucHV0IGZvciBzb21lIG91dHB1dCBwbGF0Zm9ybSwgd2hpY2ggZmFpbHMgaXRzIGJ1aWxkIHRvby4gKi9cbiAgdW5yZXNvbHZlZElucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8vIFJlc3RyaWN0cyBkZWNsYXJhdGlvbiBmaWxlcyB0byB0aGUgZW50cnkgZmlsZXMgKGFuZCB0aGVpciBpbXBvcnRzKSBvbmx5IHdoZW4gaW5wdXRzIGFyZSBleHBsaWNpdCxcbi8vIHRvIGtlZXAgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgZW1pdHRpbmcgZGVjbGFyYXRpb25zIGZvciBhbGwgZmlsZXMgdW5kZXIgc3JjLy4gdHNjIGNhbm5vdCB0YWtlIGFcbi8vIGJ1bmRsZXItc3R5bGUgZW50cnkgKGEgZGlyZWN0b3J5LCBvciBhIFwiLmpzXCIgc3BlY2lmaWVyIGFsaWFzZWQgdG8gYSBcIi50c1wiIHNvdXJjZSkgbGl0ZXJhbGx5LCBzbyBlYWNoXG4vLyBvbmUgaXMgcmVzb2x2ZWQgdG8gdGhlIHNvdXJjZSBmaWxlIGl0IHJlZmVycyB0by4gUmVzb2x1dGlvbiBkZXBlbmRzIG9uIHRoZSBmaWxlIHN5c3RlbSwgc28gYSB3YXRjaFxuLy8gcmVidWlsZCBoYXMgdG8gcmVkbyBpdC5cbmZ1bmN0aW9uIHJlc29sdmVEZWNsYXJhdGlvbklucHV0cyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGlucHV0czogc3RyaW5nW10sXG4gIHBsYXRmb3JtczogQnVuZGxlclBsYXRmb3JtW11cbik6IERlY2xhcmF0aW9uSW5wdXRzIHtcbiAgaWYgKCFhcmd2LmlucHV0Py5sZW5ndGgpIHJldHVybiB7IHBhdGhzOiB1bmRlZmluZWQsIHVucmVzb2x2ZWRJbnB1dDogdW5kZWZpbmVkIH07XG5cbiAgLy8gVGhlIHJlc29sdmVycyBzZXJ2ZSB0aGUgd2hvbGUgcGFzczogdGhlaXIgY2FjaGVzIGFyZSBjb25zaXN0ZW50IHdpdGhpbiBhIGJ1aWxkIGJ1dCBuZXZlciBzdGFsZVxuICAvLyBhY3Jvc3MgcmVidWlsZHMsIHNpbmNlIGVhY2ggY2FsbCBjcmVhdGVzIG5ldyBvbmVzLlxuICBjb25zdCByZXNvbHZlcnMgPSBjcmVhdGVCdW5kbGVyUmVzb2x2ZXJzKHBsYXRmb3Jtcyk7XG4gIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0cykge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aHMgPSByZXNvbHZlU291cmNlRmlsZVBhdGhzKGlucHV0LCByZXNvbHZlcnMpO1xuICAgIC8vIEZhbGxpbmcgYmFjayB0byB0aGUgbGl0ZXJhbCBpbnB1dCB3b3VsZCBxdWlldGx5IHN1Y2NlZWQgd2hlbmV2ZXIgaXQgaGFwcGVucyB0byBiZSBhIHZhbGlkXG4gICAgLy8gVHlwZVNjcmlwdCBmaWxlLCBkZWNsYXJpbmcgYSBidWlsZCB0aGUgYnVuZGxlciByZWZ1c2VzIHRvIHByb2R1Y2UuXG4gICAgaWYgKCFyZXNvbHZlZFBhdGhzKSByZXR1cm4geyBwYXRoczogdW5kZWZpbmVkLCB1bnJlc29sdmVkSW5wdXQ6IGlucHV0IH07XG5cbiAgICBwYXRocy5wdXNoKC4uLnJlc29sdmVkUGF0aHMpO1xuICB9XG4gIHJldHVybiB7IHBhdGhzOiBbLi4ubmV3IFNldChwYXRocyldLCB1bnJlc29sdmVkSW5wdXQ6IHVuZGVmaW5lZCB9O1xufVxuXG5mdW5jdGlvbiByZXBvcnRVbnJlc29sdmVkSW5wdXQoaW5wdXQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSB0aGUgaW5wdXQgZm9yIGRlY2xhcmF0aW9uIGdlbmVyYXRpb246ICR7aW5wdXR9YCk7XG59XG5cbmZ1bmN0aW9uIGdldElucHV0RmlsZXMoaW5wdXQ6IFJvbGxkb3duT3B0aW9uc1snaW5wdXQnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCFpbnB1dCkgcmV0dXJuIFtdO1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgcmV0dXJuIFtpbnB1dF07XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IGlucHV0IDogT2JqZWN0LnZhbHVlcyhpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUlucHV0KGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBjd2Q6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGFyZ3YuaW5wdXQgJiYgYXJndi5pbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgaW5wdXRzID0gYXJndi5pbnB1dC5mbGF0TWFwKChwKSA9PiB7XG4gICAgICBjb25zdCByYXcgPSBwLnRvU3RyaW5nKCk7XG4gICAgICAvLyBBbiBleGlzdGluZyBmaWxlIGFsd2F5cyB3aW5zIG92ZXIgZ2xvYiBpbnRlcnByZXRhdGlvbiAoZS5nLiBcInNyYy9lbnRyeVsxXS50c1wiKSwgYnV0IGFcbiAgICAgIC8vIGRpcmVjdG9yeSBtdXN0IG5vdCwgc28gdGhhdCBhIGRpcmVjdG9yeSBsaXRlcmFsbHkgbmFtZWQgbGlrZSBhIHBhdHRlcm4gc3RpbGwgZXhwYW5kcy5cbiAgICAgIGNvbnN0IGxpdGVyYWxQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgcmF3KTtcbiAgICAgIGNvbnN0IGxpdGVyYWxTdGF0cyA9IGZzLnN0YXRTeW5jKGxpdGVyYWxQYXRoLCB7IHRocm93SWZOb0VudHJ5OiBmYWxzZSB9KTtcbiAgICAgIGlmIChsaXRlcmFsU3RhdHM/LmlzRmlsZSgpKSByZXR1cm4gW2xpdGVyYWxQYXRoXTtcblxuICAgICAgLy8gYGZzLmdsb2JTeW5jYCByZXF1aXJlcyBcIi9cIiBhcyB0aGUgc2VwYXJhdG9yIGV2ZW4gb24gV2luZG93cyAoYSBuby1vcCBvbiBQT1NJWCkuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gcmF3LnNwbGl0KHBhdGguc2VwKS5qb2luKCcvJyk7XG4gICAgICAvLyBBbWJpZW50IGRlY2xhcmF0aW9uIGZpbGVzIGFsd2F5cyBwYXJ0aWNpcGF0ZSBpbiB0eXBlIGNoZWNraW5nLCBzbyB0aGV5IG11c3Qgbm90IGJlY29tZSBlbnRyaWVzLlxuICAgICAgLy8gYHRocm93SWZOb0VudHJ5OiBmYWxzZWAgc2tpcHMgYnJva2VuIHN5bWxpbmtzIGluc3RlYWQgb2YgY3Jhc2hpbmcuXG4gICAgICBjb25zdCBtYXRjaGVzID0gZnNcbiAgICAgICAgLmdsb2JTeW5jKHBhdHRlcm4sIHsgY3dkIH0pXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKG0pID0+ICEvXFwuZFxcLltjbV0/dHMkLy50ZXN0KG0pICYmIGZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShjd2QsIG0pLCB7IHRocm93SWZOb0VudHJ5OiBmYWxzZSB9KT8uaXNGaWxlKClcbiAgICAgICAgKVxuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5tYXAoKG0pID0+IHBhdGgucmVzb2x2ZShjd2QsIG0pKTtcbiAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHJldHVybiBtYXRjaGVzO1xuICAgICAgLy8gT25jZSBubyBmaWxlIG1hdGNoZWQsIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBpcyBsZWZ0IHRvIHRoZSBidW5kbGVyLCB3aGljaCByZXNvbHZlcyBpdFxuICAgICAgLy8gdGhyb3VnaCBpdHMgXCJpbmRleFwiIGZpbGUgb3IgaXRzIHBhY2thZ2UuanNvbiBlbnRyeSBmaWVsZHMuXG4gICAgICBpZiAobGl0ZXJhbFN0YXRzPy5pc0RpcmVjdG9yeSgpKSByZXR1cm4gW2xpdGVyYWxQYXRoXTtcbiAgICAgIC8vIEEgbm9uLWV4aXN0aW5nIHBhdGggbWF5IHN0aWxsIGJlIHJlc29sdmFibGUgYnkgdGhlIGJ1bmRsZXIgKGUuZy4gYW4gZXh0ZW5zaW9uLWxlc3MgcGF0aCBvciBhXG4gICAgICAvLyBcIi5qc1wiIHNwZWNpZmllciBhbGlhc2VkIHRvIFwiLnRzXCIpLCBldmVuIHdoZW4gaXQgY29udGFpbnMgZ2xvYiBtZXRhY2hhcmFjdGVycy5cbiAgICAgIGlmIChpc0J1bmRsZXJSZXNvbHZhYmxlUGF0aChsaXRlcmFsUGF0aCkpIHJldHVybiBbbGl0ZXJhbFBhdGhdO1xuICAgICAgLy8gRXJyb3Igb25seSBvbiBhY3R1YWwgZ2xvYiBzeW50YXggKFwiKlwiLCBcIj9cIiwgXCJbLi4uXVwiLCBhbHRlcm5hdGlvbi9yYW5nZSBicmFjZXMsIG9yIGV4dGdsb2IgXCJAKC4uLilcIiBldGMuKTtcbiAgICAgIC8vIGNoYXJhY3RlcnMgbGlrZSBhIGJhcmUgXCIrXCIgb3IgYSBzaW5nbGUtaXRlbSBicmFjZSAoXCJ7ZW50cnl9XCIpIGFyZSBvcmRpbmFyeSBmaWxlbmFtZSBjaGFyYWN0ZXJzLlxuICAgICAgaWYgKC9bKj9dfFtAIStdXFwofFxcWy4qXFxdfFxce1tefV0qKCx8XFwuXFwuKVtefV0qXFx9Ly50ZXN0KHJhdykpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgTm8gZmlsZXMgbWF0Y2hlZCB0aGUgaW5wdXQgcGF0dGVybjogJHtyYXd9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbGl0ZXJhbFBhdGhdO1xuICAgIH0pO1xuICAgIHJldHVybiBbLi4ubmV3IFNldChpbnB1dHMpXTtcbiAgfVxuXG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgZm9yIChjb25zdCBleHQgb2YgWyd0cycsICd0c3gnLCAnY3RzJywgJ210cyddKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwYXRoLmpvaW4oc3JjRGlyUGF0aCwgYGluZGV4LiR7ZXh0fWApO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGlucHV0KSkgcmV0dXJuIFtpbnB1dF07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGV0ZWN0IGlucHV0IGZpbGUuJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5OiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10sIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBUYXJnZXREZXRhaWwge1xuICBzd2l0Y2ggKHRhcmdldENhdGVnb3J5KSB7XG4gICAgY2FzZSAnYXBwJzoge1xuICAgICAgcmV0dXJuICdhcHAtbm9kZSc7XG4gICAgfVxuICAgIGNhc2UgJ2Z1bmN0aW9ucyc6IHtcbiAgICAgIHJldHVybiAnZnVuY3Rpb25zJztcbiAgICB9XG4gICAgY2FzZSAnbGliJzoge1xuICAgICAgaWYgKGlucHV0cy5zb21lKChpbnB1dCkgPT4gaW5wdXQuZW5kc1dpdGgoJy50c3gnKSkgfHwgZG9lc1NyY0NvbnRhaW5Uc3gocGFja2FnZURpclBhdGgpKSB7XG4gICAgICAgIHJldHVybiAnbGliLXJlYWN0JztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnbGliJztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc29sZS5lcnJvcigndGFyZ2V0IG9wdGlvbiBtdXN0IGJlIG9uZSBvZjogJyArIGFsbFRhcmdldENhdGVnb3JpZXMuam9pbignLCAnKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRvZXNTcmNDb250YWluVHN4KHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICByZXR1cm4gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goc3JjRGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNEaXJlY3RvcnlDb250YWluVHN4KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGVudHJpZXMuc29tZSgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSByZXR1cm4gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goZW50cnlQYXRoKTtcbiAgICAgIHJldHVybiBlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKCcudHN4Jyk7XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcGFja2FnZUpzb24ubmFtZSArPSAnLWRpc3QnO1xuICBjb25zdCBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gIGNvbnN0IGVzbU91dHB1dCA9IGlzRXNtT3V0cHV0KGVzbVBhY2thZ2UsIG1vZHVsZVR5cGUpO1xuICBwYWNrYWdlSnNvbi5tYWluID0gZXNtUGFja2FnZSA9PT0gZXNtT3V0cHV0ID8gJ2luZGV4LmpzJyA6IGVzbU91dHB1dCA/ICdpbmRleC5tanMnIDogJ2luZGV4LmNqcyc7XG5cbiAgLy8gUHJldmVudCBGaXJlYmFzZSBGdW5jdGlvbnMgZnJvbSBydW5uaW5nIGBidWlsZGAgc2NyaXB0IHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICAvLyBkZXZEZXBlbmRlbmNpZXMgYXJlIG5vdCByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuXG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKG91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKG91dERpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW4sXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmdcbik6IE91dHB1dE9wdGlvbnNbXSB7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGNvbnN0IGVzbU91dHB1dCA9IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogZXNtT3V0cHV0ID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBtaW5pZnk6IGFyZ3YubWluaWZ5LFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgICBzdHJpY3Q6ICFlc21PdXRwdXQsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGltcG9ydCBzdGF0ZW1lbnQgaW4gYW4gZXNtIG1vZHVsZSBjYXVzZXMgdGhlIGZvbGxvd2luZyBlcnJvcjpcbiAgLy8gU3RhdGVtZW50OlxuICAvLyAgIGltcG9ydCB7IHVzZVByZXZpb3VzIH0gZnJvbSAncmVhY3QtdXNlJztcbiAgLy8gRXJyb3I6XG4gIC8vICAgTmFtZWQgZXhwb3J0ICd1c2VQcmV2aW91cycgbm90IGZvdW5kLiBUaGUgcmVxdWVzdGVkIG1vZHVsZSAncmVhY3QtdXNlJyBpcyBhIENvbW1vbkpTIG1vZHVsZSxcbiAgLy8gICB3aGljaCBtYXkgbm90IHN1cHBvcnQgYWxsIG1vZHVsZS5leHBvcnRzIGFzIG5hbWVkIGV4cG9ydHMuXG4gIC8vIFdlIG5lZWQgY2pzIG1vZHVsZXMgZm9yIHdlYiBhcHBzIHRvIGF2b2lkIHRoZSBlcnJvci5cbiAgLy8gQWxzbywgc3BsaXR0aW5nIGEgbGlicmFyeSBpcyB1c2VmdWwgaW4gYm90aCBtb2R1bGVzLCBzbyBwcmVzZXJ2ZU1vZHVsZXMgc2hvdWxkIGJlIHRydWUuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10gPSBbXTtcbiAgY29uc3QgbW9kdWxlVHlwZSA9IGFyZ3YubW9kdWxlVHlwZSB8fCAnYm90aCc7XG4gIGNvbnN0IGpzRXh0ID0gYXJndi5qc0V4dGVuc2lvbiB8fCAnZWl0aGVyJztcbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdjanMnIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgIWlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgIWlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0uY2pzJyxcbiAgICAgIGZvcm1hdDogJ2NvbW1vbmpzJyxcbiAgICAgIG1pbmlmeTogYXJndi5taW5pZnksXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXNSb290OiBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdlc20nIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLm1qcycsXG4gICAgICBmb3JtYXQ6ICdtb2R1bGUnLFxuICAgICAgbWluaWZ5OiBhcmd2Lm1pbmlmeSxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0T3B0aW9uc0xpc3Q7XG59XG5cbmZ1bmN0aW9uIGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZTogYm9vbGVhbiwgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBtb2R1bGVUeXBlID09PSAnZXNtJyB8fCAoKCFtb2R1bGVUeXBlIHx8IG1vZHVsZVR5cGUgPT09ICdlaXRoZXInKSAmJiBpc0VzbVBhY2thZ2UpO1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uL2Vudi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJ1bjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdydW4gPGZpbGU+JyxcbiAgZGVzY3JpYmU6ICdSdW4gc2NyaXB0JyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgY29uc3QgZmlsZSA9IGFyZ3YuZmlsZT8udG9TdHJpbmcoKSA/PyAnJztcblxuICAgIC8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gICAgY29uc3QgaXNSdW5uaW5nT25CdW4gPSBwcm9jZXNzLnZlcnNpb25zLmJ1bjtcbiAgICBjb25zdCBydW50aW1lID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICdub2RlJztcbiAgICBjb25zdCBhcmdzID0gaXNSdW5uaW5nT25CdW4gPyBbJy0tYnVuJ10gOiBbJy0tbm8td2FybmluZ3MnLCAnLS1pbXBvcnQnLCAndHN4J107XG4gICAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS13YXRjaCcpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goZmlsZSk7XG4gICAgY29uc3QgWywgLi4uYWRkaXRpb25hbEFyZ3VtZW50c10gPSBhcmd2Ll87XG4gICAgY29uc3QgcnVudGltZUFyZ3MgPSBbLi4uYXJncywgLi4uYWRkaXRpb25hbEFyZ3VtZW50cy5tYXAoKGFyZykgPT4gYXJnLnRvU3RyaW5nKCkpXTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgJyR7cnVudGltZX0gJHtydW50aW1lQXJncy5qb2luKCcgJyl9J2ApO1xuICAgIH1cbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhydW50aW1lLCBydW50aW1lQXJncywge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiB9LFxuICAgIH0pO1xuICAgIHByb2Nlc3MuZXhpdChyZXQuc3RhdHVzID8/IDEpO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYXBwLCBmdW5jdGlvbnMsIGxpYiB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGQuanMnO1xuaW1wb3J0IHsgcnVuIH0gZnJvbSAnLi9jb21tYW5kcy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5yZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCdidWlsZC10cycpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAuY29tbWFuZChhcHApXG4gIC5jb21tYW5kKGZ1bmN0aW9ucylcbiAgLmNvbW1hbmQobGliKVxuICAuY29tbWFuZChydW4pXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGdldEJ1aWxkVHNSb290UGF0aCgpLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuIl0sIm1hcHBpbmdzIjoicXFCQU1BLElBQUksRUFLSixTQUFnQixFQUNkLEVBQ0EsRUFDb0MsQ0FPcEMsT0FOSyxJQUNILEVBQVUsRUFBaUMsRUFBTSxDQUFHLEVBQ2hELEVBQUssU0FDUCxRQUFRLEtBQUssbUJBQW9CLE9BQU8sS0FBSyxDQUFPLENBQUMsR0FHbEQs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "build-ts",
3
- "version": "17.2.0",
3
+ "version": "17.3.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/WillBooster/build-ts.git"