From cb5a6757130892eae979f5801a8798c8dc9d7e86 Mon Sep 17 00:00:00 2001 From: exoego Date: Tue, 7 May 2024 13:46:49 +0900 Subject: [PATCH] Make N configurable --- README.md | 1 + action.yaml | 7 +++++++ dist/index.mjs | 25 +++++++++++++++++-------- src/compare.ts | 27 +++++++++++++++++++-------- src/index.ts | 4 ++++ src/types.ts | 1 + 6 files changed, 49 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index fecbec7..216b55b 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ permissions: | `include_extensions` | `.js,.cjs,.mjs` | A comma-separated list of file extension to be included in the analysis table. | | `percent_extra_attention` | `20` | If an out file size has increased more than this percent, display a "‼️" to draw extra attention to the change. | | `show_details` | `true` | If `true`, a collapsed "details" section is rendered. It explains the details of the numbers provided and icons. | +| `top_n_largest_paths` | `20` | The number of largest paths (e.g.) `node_modules/foo`) to be collected. If 0 or lower, skipped. | ## Action outputs diff --git a/action.yaml b/action.yaml index 877123c..b49cee5 100644 --- a/action.yaml +++ b/action.yaml @@ -52,6 +52,12 @@ inputs: default: "true" description: | If `true`, a collapsed "details" section is rendered. It explains the details of the numbers provided and icons. + top_n_largest_paths: + required: false + default: "20" + description: | + The number of largest paths (e.g.) `node_modules/foo`) to be collected. + If 0 or lower, skipped. runs: using: composite @@ -75,6 +81,7 @@ runs: INPUT_INCLUDE_EXTENSIONS: ${{ inputs.include_extensions }} INPUT_PERCENT_EXTRA_ATTENTION: ${{ inputs.percent_extra_attention }} INPUT_SHOW_DETAILS: ${{ inputs.show_details }} + INPUT_TOP_N_LARGEST_PATHS: ${{ inputs.top_n_largest_paths }} run: | node ${{ github.action_path }}/dist/index.mjs diff --git a/dist/index.mjs b/dist/index.mjs index 1f1e063..acf21d0 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -63,7 +63,7 @@ This analysis was generated by [esbuild-bundle-analyzer](https://github.com/exoe }); if (hasAnyChange) { output += markdownTable(comparison, input.percentExtraAttention); - output += fileSizeTable(comparison); + output += fileSizeTable(comparison, input.topNLargestPaths); output += detail(input); } else { output += "This PR introduced no changes to the esbuild bundle! \u{1F64C}"; @@ -191,7 +191,7 @@ Meta File | Out File | Size (raw) | Note ----------|----------|-----------:|------ ${rows}`; } -function findLargeDirectories(root) { +function findLargeDirectories(root, N) { const nodes = []; const queue = [ { node: root, depth: 0 } @@ -214,22 +214,24 @@ function findLargeDirectories(root) { } } } - const largeNodes = nodes.sort((a, b) => b.value - a.value).slice(0, 10); + const largeNodes = nodes.sort((a, b) => b.value - a.value).slice(0, N); return { largeNodes, - hasOther: nodes.length > 10 + hasOther: nodes.length > N }; } function fixedPercent(n, d) { return Number.parseFloat((n / d * 100).toFixed(1)); } -function fileSizeTable(data) { - if (data.length === 0) { +function fileSizeTable(data, topNLargestPaths) { + if (data.length === 0 || topNLargestPaths <= 0) { return ""; } let output = ""; output += "
\n"; output += "Top ten largest paths\n"; + output += `These visualization shows top ${topNLargestPaths} largest paths in the bundle. +`; for (const d of data) { output += "\n"; output += `## Meta file: ${d.metafile}, Out file: ${d.outfile} @@ -241,7 +243,10 @@ function fileSizeTable(data) { output += "| Path | Size |\n"; output += "|------|-------|\n"; const totalSize = d.tree.value; - const { largeNodes, hasOther } = findLargeDirectories(d.tree); + const { largeNodes, hasOther } = findLargeDirectories( + d.tree, + topNLargestPaths + ); for (const { path: path3, value } of largeNodes) { const percent = fixedPercent(value, totalSize); output += `| ${path3} | ${renderBar(percent, value)} | @@ -373,6 +378,10 @@ function getOptions() { showDetails: ["true", "True", "TRUE"].includes( getInput("show_details") || "true" ), + topNLargestPaths: Number.parseInt( + getInput("top_n_largest_paths") || "20", + 10 + ), includeExtensions: (getInput("include_extensions") || ".js,.mjs,.cjs").split(","), name, analyzerDirectory: getInput("analyze_directory") || ".analyzer", @@ -389,4 +398,4 @@ if (import.meta.url === pathToFileURL(process.argv[1]).href) { export { run }; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXJlLnRzIiwgIi4uL3NyYy91dGlscy50cyIsICIuLi9zcmMvcmVwb3J0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBjb21wYXJlIH0gZnJvbSBcIi4vY29tcGFyZVwiO1xuaW1wb3J0IHsgcmVwb3J0IH0gZnJvbSBcIi4vcmVwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0SW5wdXQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5mdW5jdGlvbiBnZXRPcHRpb25zKCk6IE9wdGlvbnMge1xuXHRjb25zdCByYXdNZXRhZmlsZXMgPSBnZXRJbnB1dChcIm1ldGFmaWxlc1wiKTtcblx0aWYgKCFyYXdNZXRhZmlsZXMpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtZXRhZmlsZXMgaXMgbm90IHNwZWNpZmllZFwiKTtcblx0fVxuXHRjb25zdCBuYW1lID0gZ2V0SW5wdXQoXCJuYW1lXCIpO1xuXHRpZiAoIW5hbWUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGlzIG5vdCBzcGVjaWZpZWRcIik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRwZXJjZW50RXh0cmFBdHRlbnRpb246IE51bWJlci5wYXJzZUludChcblx0XHRcdGdldElucHV0KFwicGVyY2VudF9leHRyYV9hdHRlbnRpb25cIikgfHwgXCIyMFwiLFxuXHRcdFx0MTAsXG5cdFx0KSxcblx0XHRzaG93RGV0YWlsczogW1widHJ1ZVwiLCBcIlRydWVcIiwgXCJUUlVFXCJdLmluY2x1ZGVzKFxuXHRcdFx0Z2V0SW5wdXQoXCJzaG93X2RldGFpbHNcIikgfHwgXCJ0cnVlXCIsXG5cdFx0KSxcblx0XHRpbmNsdWRlRXh0ZW5zaW9uczogKFxuXHRcdFx0Z2V0SW5wdXQoXCJpbmNsdWRlX2V4dGVuc2lvbnNcIikgfHwgXCIuanMsLm1qcywuY2pzXCJcblx0XHQpLnNwbGl0KFwiLFwiKSxcblx0XHRuYW1lLFxuXHRcdGFuYWx5emVyRGlyZWN0b3J5OiBnZXRJbnB1dChcImFuYWx5emVfZGlyZWN0b3J5XCIpIHx8IFwiLmFuYWx5emVyXCIsXG5cdFx0bWV0YWZpbGVzOiByYXdNZXRhZmlsZXMuc3BsaXQoXCIsXCIpLFxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuKG9wdGlvbnM6IE9wdGlvbnMgPSBnZXRPcHRpb25zKCkpOiB2b2lkIHtcblx0cmVwb3J0KG9wdGlvbnMpO1xuXHRjb21wYXJlKG9wdGlvbnMpO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEudXJsID09PSBwYXRoVG9GaWxlVVJMKHByb2Nlc3MuYXJndlsxXSkuaHJlZikge1xuXHRydW4oKTtcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGFyZVJlc3VsdCwgT3B0aW9ucywgUmVwb3J0LCBUcmVlTWFwTm9kZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBsb2FkQW5hbHlzaXNKc29uLCBsb2FkTWV0YUZpbGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZShpbnB1dDogT3B0aW9ucyk6IHZvaWQge1xuXHRsZXQgaGFzQW55Q2hhbmdlID0gZmFsc2U7XG5cdGxldCBvdXRwdXQgPSBgIyMgXHVEODNEXHVEQ0U2IGVzYnVpbGQgQnVuZGxlIEFuYWx5c2lzIGZvciAke2lucHV0Lm5hbWV9XG5cblRoaXMgYW5hbHlzaXMgd2FzIGdlbmVyYXRlZCBieSBbZXNidWlsZC1idW5kbGUtYW5hbHl6ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9leG9lZ28vZXNidWlsZC1idW5kbGUtYW5hbHl6ZXIpLiBcdUQ4M0VcdUREMTZcbmA7XG5cblx0Y29uc3QgY3VycmVudCA9IGxvYWRBbmFseXNpc0pzb24oXG5cdFx0cGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGlucHV0LmFuYWx5emVyRGlyZWN0b3J5LCBcImJ1bmRsZV9hbmFseXNpcy5qc29uXCIpLFxuXHQpO1xuXHRjb25zdCBiYXNlID0gbG9hZEJhc2VBbmFseXNpc0pzb24oaW5wdXQpO1xuXG5cdGNvbnN0IGZpbGVUcmVlID0gYnVpbGRGaWxlVHJlZShpbnB1dCk7XG5cblx0Y29uc3QgYWxsT3V0RmlsZXM6IHN0cmluZ1tdID0gW1xuXHRcdC4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGN1cnJlbnQpLCAuLi5PYmplY3Qua2V5cyhiYXNlKV0pLFxuXHRdLnNvcnQoKTtcblxuXHRjb25zdCBjb21wYXJpc29uOiBBcnJheTxDb21wYXJlUmVzdWx0PiA9IGFsbE91dEZpbGVzLm1hcCgob3V0ZmlsZSkgPT4ge1xuXHRcdGNvbnN0IGN1cnJlbnRTdGF0cyA9IGN1cnJlbnRbb3V0ZmlsZV07XG5cdFx0Y29uc3QgYmFzZVN0YXRzID0gYmFzZVtvdXRmaWxlXTtcblxuXHRcdGlmICghY3VycmVudFN0YXRzKSB7XG5cdFx0XHRoYXNBbnlDaGFuZ2UgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIHsgLi4uYmFzZVN0YXRzLCBkaWZmOiAtMSwgcmVtYXJrOiBcImRlbGV0ZWRcIiwgdHJlZTogdW5kZWZpbmVkIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgdHJlZSA9IGZpbGVUcmVlLmdldChcblx0XHRcdHRyZWVLZXkoY3VycmVudFN0YXRzLm1ldGFmaWxlLCBjdXJyZW50U3RhdHMub3V0ZmlsZSksXG5cdFx0KTtcblx0XHRpZiAoIWJhc2VTdGF0cykge1xuXHRcdFx0aGFzQW55Q2hhbmdlID0gdHJ1ZTtcblx0XHRcdHJldHVybiB7IC4uLmN1cnJlbnRTdGF0cywgZGlmZjogLTEsIHJlbWFyazogXCJhZGRlZFwiLCB0cmVlIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGlmZiA9IGN1cnJlbnRTdGF0cy5ieXRlcyAtIGJhc2VTdGF0cy5ieXRlcztcblx0XHRpZiAoZGlmZiAhPT0gMCkge1xuXHRcdFx0aGFzQW55Q2hhbmdlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdC4uLmN1cnJlbnRTdGF0cyxcblx0XHRcdGRpZmYsXG5cdFx0XHR0cmVlLFxuXHRcdFx0cmVtYXJrOiBNYXRoLnNpZ24oZGlmZikgPyBcImluY3JlYXNlZFwiIDogXCJkZWNyZWFzZWRcIixcblx0XHR9O1xuXHR9KTtcblxuXHRpZiAoaGFzQW55Q2hhbmdlKSB7XG5cdFx0b3V0cHV0ICs9IG1hcmtkb3duVGFibGUoY29tcGFyaXNvbiwgaW5wdXQucGVyY2VudEV4dHJhQXR0ZW50aW9uKTtcblx0XHRvdXRwdXQgKz0gZmlsZVNpemVUYWJsZShjb21wYXJpc29uKTtcblx0XHRvdXRwdXQgKz0gZGV0YWlsKGlucHV0KTtcblx0fSBlbHNlIHtcblx0XHRvdXRwdXQgKz0gXCJUaGlzIFBSIGludHJvZHVjZWQgbm8gY2hhbmdlcyB0byB0aGUgZXNidWlsZCBidW5kbGUhIFx1RDgzRFx1REU0Q1wiO1xuXHR9XG5cblx0Ly8gd2UgYWRkIHRoaXMgdGFnIHNvIHRoYXQgb3VyIGFjdGlvbiBjYW4gYmUgYWJsZSB0byBlYXNpbHkgYW5kXG5cdC8vIGNvbnNpc3RlbnRseSBmaW5kIHRoZSByaWdodCBjb21tZW50IHRvIGVkaXQgYXMgbW9yZSBjb21taXRzIGFyZSBwdXNoZWQuXG5cdG91dHB1dCArPSBgPCEtLSBfX0VTQlVJTERfQlVORExFXyR7aW5wdXQubmFtZX0gLS0+YDtcblxuXHR3cml0ZUNvbW1lbnQoaW5wdXQsIG91dHB1dCk7XG59XG5cbmZ1bmN0aW9uIHRyZWVLZXkobWV0YWZpbGU6IHN0cmluZywgb3V0ZmlsZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIGAke21ldGFmaWxlfSAtPiAke291dGZpbGV9YDtcbn1cblxuLy8gV3JpdGUgdGhlIG91dHB1dCB0byBhIGZpbGUgd2hpY2ggaXMgbGF0ZXIgcmVhZCBpblxuLy8gYXMgY29tbWVudCBjb250ZW50cyBieSB0aGUgYWN0aW9ucyB3b3JrZmxvdy5cbmZ1bmN0aW9uIHdyaXRlQ29tbWVudChpbnB1dDogT3B0aW9ucywgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcblx0ZnMubWtkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBpbnB1dC5hbmFseXplckRpcmVjdG9yeSksIHtcblx0XHRyZWN1cnNpdmU6IHRydWUsXG5cdH0pO1xuXHRmcy53cml0ZUZpbGVTeW5jKFxuXHRcdHBhdGguam9pbihcblx0XHRcdHByb2Nlc3MuY3dkKCksXG5cdFx0XHRpbnB1dC5hbmFseXplckRpcmVjdG9yeSxcblx0XHRcdFwiYnVuZGxlX2FuYWx5c2lzX2NvbW1lbnQudHh0XCIsXG5cdFx0KSxcblx0XHRvdXRwdXQudHJpbSgpLFxuXHQpO1xufVxuXG5mdW5jdGlvbiBkZXRhaWwoaW5wdXQ6IE9wdGlvbnMpOiBzdHJpbmcge1xuXHRpZiAoIWlucHV0LnNob3dEZXRhaWxzKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblx0cmV0dXJuIGBcXG48ZGV0YWlscz5cbjxzdW1tYXJ5PkRldGFpbHM8L3N1bW1hcnk+XG48cD5OZXh0IHRvIHRoZSBzaXplIGlzIGhvdyBtdWNoIHRoZSBzaXplIGhhcyBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIGNvbXBhcmVkIHdpdGggdGhlIGJhc2UgYnJhbmNoIG9mIHRoaXMgUFIuPC9wPlxuPHVsPlxuPGxpPlx1MjAzQ1x1RkUwRjogU2l6ZSBpbmNyZWFzZWQgYnkgJHtpbnB1dC5wZXJjZW50RXh0cmFBdHRlbnRpb259JSBvciBtb3JlLiBTcGVjaWFsIGF0dGVudGlvbiBzaG91bGQgYmUgZ2l2ZW4gdG8gdGhpcy48L2xpPlxuPGxpPlx1MjZBMFx1RkUwRjogU2l6ZSBpbmNyZWFzZWQgaW4gYWNjZXB0YWJsZSByYW5nZSAobG93ZXIgdGhhbiAke2lucHV0LnBlcmNlbnRFeHRyYUF0dGVudGlvbn0lKS48L2xpPlxuPGxpPlx1MjcwNTogTm8gY2hhbmdlIG9yIGV2ZW4gZG93bnNpemVkLjwvbGk+XG48bGk+XHVEODNEXHVEREQxXHVGRTBGOiBUaGUgb3V0IGZpbGUgaXMgZGVsZXRlZDogbm90IGZvdW5kIGluIGJhc2UgYnJhbmNoLjwvbGk+XG48bGk+XHVEODNDXHVERDk1OiBUaGUgb3V0IGZpbGUgaXMgbmV3bHkgZm91bmQ6IHdpbGwgYmUgYWRkZWQgdG8gYmFzZSBicmFuY2guPC9saT5cbjwvdWw+XG48L2RldGFpbHM+XFxuYDtcbn1cblxuZnVuY3Rpb24gbG9hZEJhc2VBbmFseXNpc0pzb24oaW5wdXQ6IE9wdGlvbnMpOiBSZXBvcnQge1xuXHR0cnkge1xuXHRcdHJldHVybiBsb2FkQW5hbHlzaXNKc29uKFxuXHRcdFx0cGF0aC5qb2luKFxuXHRcdFx0XHRwcm9jZXNzLmN3ZCgpLFxuXHRcdFx0XHRpbnB1dC5hbmFseXplckRpcmVjdG9yeSxcblx0XHRcdFx0XCJiYXNlL2J1bmRsZS9idW5kbGVfYW5hbHlzaXMuanNvblwiLFxuXHRcdFx0KSxcblx0XHQpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gRW1wdHkgaWYgbm8gYmFzZSBhbmFseXNpcyBmb3VuZC5cblx0XHQvLyBUaGlzIGlzIGEgY2FzZSB3aGVuIGFuYWx5emVyIGlzIGZpcnN0IHNldCB1cCBvciBhbGwgYXJ0aWZhY3RzIGFyZSBleHBpcmVkLlxuXHRcdHJldHVybiB7fTtcblx0fVxufVxuXG5mdW5jdGlvbiBidWlsZEZpbGVUcmVlKGlucHV0OiBPcHRpb25zKSB7XG5cdGZ1bmN0aW9uIGJ1aWxkUm9vdChcblx0XHRpbnB1dDogUmVjb3JkPHN0cmluZywgeyBieXRlc0luT3V0cHV0OiBudW1iZXIgfT4sXG5cdCk6IFRyZWVNYXBOb2RlIHtcblx0XHRjb25zdCByb290OiBUcmVlTWFwTm9kZSA9IHsgbmFtZTogXCJcIiwgcGF0aDogXCJcIiwgdmFsdWU6IDAsIGNoaWxkcmVuOiBbXSB9O1xuXHRcdGZvciAoY29uc3QgW2ZpbGVQYXRoLCB7IGJ5dGVzSW5PdXRwdXQgfV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG5cdFx0XHRjb25zdCBkaXJlY3RvcmllcyA9IGZpbGVQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGJ1aWxkTm9kZShyb290LCBkaXJlY3RvcmllcywgYnl0ZXNJbk91dHB1dCk7XG5cdFx0fVxuXHRcdHJldHVybiByb290O1xuXHR9XG5cblx0ZnVuY3Rpb24gYnVpbGROb2RlKFxuXHRcdG5vZGU6IFRyZWVNYXBOb2RlLFxuXHRcdHBhdGhzOiBBcnJheTxzdHJpbmc+LFxuXHRcdHZhbHVlOiBudW1iZXIsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGZpcnN0ID0gcGF0aHMuc2hpZnQoKTtcblx0XHRpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gbGVhZiBub2RlIChmaWxlKVxuXHRcdFx0bm9kZS52YWx1ZSArPSB2YWx1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IGNoaWxkID0gbm9kZS5jaGlsZHJlbi5maW5kKChjaGlsZCkgPT4gY2hpbGQubmFtZSA9PT0gZmlyc3QpO1xuXHRcdGlmICghY2hpbGQpIHtcblx0XHRcdGNoaWxkID0ge1xuXHRcdFx0XHRuYW1lOiBmaXJzdCxcblx0XHRcdFx0cGF0aDogYCR7bm9kZS5wYXRofS8ke2ZpcnN0fWAucmVwbGFjZSgvXlxcLy8sIFwiXCIpLFxuXHRcdFx0XHR2YWx1ZTogMCxcblx0XHRcdFx0Y2hpbGRyZW46IFtdLFxuXHRcdFx0fTtcblx0XHRcdG5vZGUuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cdFx0fVxuXHRcdG5vZGUudmFsdWUgKz0gdmFsdWU7XG5cdFx0YnVpbGROb2RlKGNoaWxkLCBwYXRocywgdmFsdWUpO1xuXHR9XG5cblx0Y29uc3QgdHJlZXMgPSBuZXcgTWFwPHN0cmluZywgVHJlZU1hcE5vZGU+KCk7XG5cdGZvciAoY29uc3QgbWV0YWZpbGUgb2YgaW5wdXQubWV0YWZpbGVzKSB7XG5cdFx0Y29uc3QgbWV0YWZpbGVKc29uID0gbG9hZE1ldGFGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBtZXRhZmlsZSkpO1xuXHRcdGZvciAoY29uc3QgW291dGZpbGUsIGJ1aWxkTWV0YV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWZpbGVKc29uLm91dHB1dHMpKSB7XG5cdFx0XHRjb25zdCB0cmVlID0gYnVpbGRSb290KGJ1aWxkTWV0YS5pbnB1dHMpO1xuXHRcdFx0dHJlZXMuc2V0KHRyZWVLZXkobWV0YWZpbGUsIG91dGZpbGUpLCB0cmVlKTtcblxuXHRcdFx0ZnMud3JpdGVGaWxlU3luYyhcblx0XHRcdFx0cGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGlucHV0LmFuYWx5emVyRGlyZWN0b3J5LCBcInRyZWUuanNvblwiKSxcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkodHJlZSwgbnVsbCwgMiksXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJlZXM7XG59XG5cbmNvbnN0IHNwYWNlciA9IFwiXHUwMEEwXCI7XG5mdW5jdGlvbiBmaWxlc2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcblx0Y29uc3Qgc2lnbiA9IGJ5dGVzIDwgMCA/IFwiLVwiIDogXCJcIjtcblx0Y29uc3QgbiA9IE1hdGguYWJzKGJ5dGVzKTtcblx0aWYgKG4gPCAxMDAwKSB7XG5cdFx0cmV0dXJuIGAke3NpZ259JHtufSR7c3BhY2VyfUJgO1xuXHR9XG5cdGlmIChuIDwgMTAwMCAqIDEwMDApIHtcblx0XHRyZXR1cm4gYCR7c2lnbn0keyhuIC8gMTAwMCkudG9GaXhlZCgyKX0ke3NwYWNlcn1LQmA7XG5cdH1cblx0aWYgKG4gPCAxMDAwICogMTAwMCAqIDEwMDApIHtcblx0XHRyZXR1cm4gYCR7c2lnbn0keyhuIC8gMTAwMCAvIDEwMDApLnRvRml4ZWQoMil9JHtzcGFjZXJ9TUJgO1xuXHR9XG5cdGlmIChuIDwgMTAwMCAqIDEwMDAgKiAxMDAwICogMTAwMCkge1xuXHRcdHJldHVybiBgJHtzaWdufSR7KG4gLyAxMDAwIC8gMTAwMCAvIDEwMDApLnRvRml4ZWQoMil9JHtzcGFjZXJ9R0JgO1xuXHR9XG5cdHRocm93IG5ldyBFcnJvcihcIlRvbyBsYXJnZSBmaWxlIHNpemUhISBBcmUgeW91IHN1cmU/XCIpO1xufVxuXG5mdW5jdGlvbiBtYXJrZG93blRhYmxlKFxuXHRkYXRhOiBBcnJheTxDb21wYXJlUmVzdWx0Pixcblx0cmVkVGhyZXNob2xkOiBudW1iZXIsXG4pOiBzdHJpbmcge1xuXHRjb25zdCByb3dzID0gZGF0YVxuXHRcdC5tYXAoKGQpID0+IHtcblx0XHRcdHJldHVybiBgJHtkLm1ldGFmaWxlfSB8ICR7ZC5vdXRmaWxlfSB8ICR7cmVuZGVyU2l6ZShkKX0gfCAke3JlbmRlck5vdGUoXG5cdFx0XHRcdGQsXG5cdFx0XHRcdHJlZFRocmVzaG9sZCxcblx0XHRcdCl9XFxuYDtcblx0XHR9KVxuXHRcdC5qb2luKFwiXCIpO1xuXG5cdHJldHVybiBgXG5NZXRhIEZpbGUgfCBPdXQgRmlsZSAgfCBTaXplIChyYXcpIHwgTm90ZSBcbi0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLTp8LS0tLS0tXG4ke3Jvd3N9YDtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSB0b3AgdGVuIGxhcmdlc3Qgbm9kZXMgaW4gcm9vdCB0cmVlLlxuICogRGlnIG5vZGVzIHVudGlsIHRoZSBkZXB0aCBvZiAzLlxuICovXG5mdW5jdGlvbiBmaW5kTGFyZ2VEaXJlY3Rvcmllcyhyb290OiBUcmVlTWFwTm9kZSkge1xuXHRjb25zdCBub2RlczogVHJlZU1hcE5vZGVbXSA9IFtdO1xuXHRjb25zdCBxdWV1ZTogQXJyYXk8eyBub2RlOiBUcmVlTWFwTm9kZTsgZGVwdGg6IG51bWJlciB9PiA9IFtcblx0XHR7IG5vZGU6IHJvb3QsIGRlcHRoOiAwIH0sXG5cdF07XG5cdHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3Qgc2hpZnQgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdGlmICghc2hpZnQpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRjb25zdCB7IG5vZGUsIGRlcHRoIH0gPSBzaGlmdDtcblx0XHRpZiAoZGVwdGggPT09IDMpIHtcblx0XHRcdG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0aWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2Ygbm9kZS5jaGlsZHJlbikge1xuXHRcdFx0XHRxdWV1ZS5wdXNoKHsgbm9kZTogaXRlbSwgZGVwdGg6IGRlcHRoICsgMSB9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29uc3QgbGFyZ2VOb2RlcyA9IG5vZGVzLnNvcnQoKGEsIGIpID0+IGIudmFsdWUgLSBhLnZhbHVlKS5zbGljZSgwLCAxMCk7XG5cdHJldHVybiB7XG5cdFx0bGFyZ2VOb2Rlcyxcblx0XHRoYXNPdGhlcjogbm9kZXMubGVuZ3RoID4gMTAsXG5cdH07XG59XG5cbmZ1bmN0aW9uIGZpeGVkUGVyY2VudChuOiBudW1iZXIsIGQ6IG51bWJlcik6IG51bWJlciB7XG5cdHJldHVybiBOdW1iZXIucGFyc2VGbG9hdCgoKG4gLyBkKSAqIDEwMCkudG9GaXhlZCgxKSk7XG59XG5cbmZ1bmN0aW9uIGZpbGVTaXplVGFibGUoZGF0YTogQXJyYXk8Q29tcGFyZVJlc3VsdD4pOiBzdHJpbmcge1xuXHRpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXHRsZXQgb3V0cHV0ID0gXCJcIjtcblx0b3V0cHV0ICs9IFwiPGRldGFpbHM+XFxuXCI7XG5cdG91dHB1dCArPSBcIjxzdW1tYXJ5PlRvcCB0ZW4gbGFyZ2VzdCBwYXRoczwvc3VtbWFyeT5cXG5cIjtcblx0Zm9yIChjb25zdCBkIG9mIGRhdGEpIHtcblx0XHRvdXRwdXQgKz0gXCJcXG5cIjtcblx0XHRvdXRwdXQgKz0gYCMjIE1ldGEgZmlsZTogJHtkLm1ldGFmaWxlfSwgT3V0IGZpbGU6ICR7ZC5vdXRmaWxlfVxcbmA7XG5cdFx0aWYgKCFkLnRyZWUpIHtcblx0XHRcdG91dHB1dCArPSBcIlx1RkUwRlx1RkUwRlx1RDgzRFx1REREMVx1RkUwRkRlbGV0ZWRcXG5cIjtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRvdXRwdXQgKz0gXCJ8IFBhdGggfCBTaXplIHxcXG5cIjtcblx0XHRvdXRwdXQgKz0gXCJ8LS0tLS0tfC0tLS0tLS18XFxuXCI7XG5cdFx0Y29uc3QgdG90YWxTaXplID0gZC50cmVlLnZhbHVlO1xuXHRcdGNvbnN0IHsgbGFyZ2VOb2RlcywgaGFzT3RoZXIgfSA9IGZpbmRMYXJnZURpcmVjdG9yaWVzKGQudHJlZSk7XG5cdFx0Zm9yIChjb25zdCB7IHBhdGgsIHZhbHVlIH0gb2YgbGFyZ2VOb2Rlcykge1xuXHRcdFx0Y29uc3QgcGVyY2VudCA9IGZpeGVkUGVyY2VudCh2YWx1ZSwgdG90YWxTaXplKTtcblx0XHRcdG91dHB1dCArPSBgfCAke3BhdGh9IHwgJHtyZW5kZXJCYXIocGVyY2VudCwgdmFsdWUpfSB8XFxuYDtcblx0XHR9XG5cdFx0aWYgKGhhc090aGVyKSB7XG5cdFx0XHRjb25zdCBvdGhlclNpemUgPSB0b3RhbFNpemUgLSBsYXJnZU5vZGVzWzBdLnZhbHVlO1xuXHRcdFx0Y29uc3Qgb3RoZXJQZXJjZW50ID0gZml4ZWRQZXJjZW50KG90aGVyU2l6ZSwgdG90YWxTaXplKTtcblx0XHRcdG91dHB1dCArPSBgfCAob3RoZXIpIHwgJHtyZW5kZXJCYXIob3RoZXJQZXJjZW50LCBvdGhlclNpemUpfSB8XFxuYDtcblx0XHR9XG5cdH1cblx0b3V0cHV0ICs9IFwiPC9kZXRhaWxzPlxcblwiO1xuXHRyZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiByZW5kZXJCYXIocGVyY2VudDogbnVtYmVyLCBieXRlczogbnVtYmVyKTogc3RyaW5nIHtcblx0Y29uc3QgYmFyID0gcHJvZ3Jlc3MocGVyY2VudCAvIDEwMCk7XG5cdHJldHVybiBgXFwke3tcXFxcY29sb3J7R29sZGVucm9kfXsgJHtiYXJ9IH19fVxcJCAke3BlcmNlbnQudG9GaXhlZChcblx0XHQxLFxuXHQpfSUsICR7ZmlsZXNpemUoYnl0ZXMpfWA7XG59XG5cbi8vIEJsb2NrIHByb2dyZXNzaW9uIGlzIDEvOCA9IDAuMTI1XG5jb25zdCBibG9ja3MgPSBbXCJcIiwgXCJcdTI1OEZcIiwgXCJcdTI1OEVcIiwgXCJcdTI1OERcIiwgXCJcdTI1OENcIiwgXCJcdTI1OEJcIiwgXCJcdTI1OEFcIiwgXCJcdTI1ODlcIiwgXCJcdTI1ODhcIl07XG5jb25zdCBwcm9ncmVzc2lvbiA9IDEgLyAoYmxvY2tzLmxlbmd0aCAtIDEpO1xuZnVuY3Rpb24gcHJvZ3Jlc3ModmFsdWU6IG51bWJlciwgbGVuZ3RoID0gMjUsIHZtaW4gPSAwLjAsIHZtYXggPSAxLjApIHtcblx0Y29uc3QgdiA9IHZhbHVlICogbGVuZ3RoO1xuXHRjb25zdCBpbnRlZ2VyUGFydCA9IE1hdGguZmxvb3Iodik7XG5cdGNvbnN0IGZyYWN0aW9uYWxQYXJ0ID0gdiAtIGludGVnZXJQYXJ0O1xuXHRjb25zdCBpID0gTWF0aC5yb3VuZChcblx0XHQocHJvZ3Jlc3Npb24gKiBNYXRoLmZsb29yKGZyYWN0aW9uYWxQYXJ0IC8gcHJvZ3Jlc3Npb24pKSAvIHByb2dyZXNzaW9uLFxuXHQpO1xuXHRyZXR1cm4gXCJcdTI1ODhcIi5yZXBlYXQoaW50ZWdlclBhcnQpICsgYmxvY2tzW2ldO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTaXplKGQ6IENvbXBhcmVSZXN1bHQpOiBzdHJpbmcge1xuXHRyZXR1cm4gZmlsZXNpemUoZC5ieXRlcyk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5vdGUoZDogQ29tcGFyZVJlc3VsdCwgcmVkVGhyZXNob2xkOiBudW1iZXIpOiBzdHJpbmcge1xuXHRpZiAoZC5yZW1hcmsgPT09IFwiZGVsZXRlZFwiKSB7XG5cdFx0cmV0dXJuIFwiXHVEODNEXHVEREQxXHVGRTBGIERlbGV0ZWRcIjtcblx0fVxuXHRpZiAoZC5yZW1hcmsgPT09IFwiYWRkZWRcIikge1xuXHRcdHJldHVybiBcIlx1RDgzQ1x1REQ5NSBBZGRlZFwiO1xuXHR9XG5cdGlmIChkLmRpZmYpIHtcblx0XHRjb25zdCBwZXJjZW50Q2hhbmdlID0gKGQuZGlmZiAvIGQuYnl0ZXMpICogMTAwO1xuXHRcdHJldHVybiBgJHtyZW5kZXJTdGF0dXNJbmRpY2F0b3IocGVyY2VudENoYW5nZSwgcmVkVGhyZXNob2xkKX0ke2ZpbGVzaXplKFxuXHRcdFx0ZC5kaWZmLFxuXHRcdCl9ICgke3NpZ24ocGVyY2VudENoYW5nZSl9JHtwZXJjZW50Q2hhbmdlLnRvRml4ZWQoMSl9JSlgO1xuXHR9XG5cdHJldHVybiBcIlx1MjcwNSAgTm8gY2hhbmdlXCI7XG59XG5cbmZ1bmN0aW9uIHNpZ24obnVtOiBudW1iZXIpOiBzdHJpbmcge1xuXHRyZXR1cm4gbnVtIDwgMCA/IFwiXCIgOiBcIitcIjtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU3RhdHVzSW5kaWNhdG9yKFxuXHRwZXJjZW50Q2hhbmdlOiBudW1iZXIsXG5cdHJlZFRocmVzaG9sZDogbnVtYmVyLFxuKTogc3RyaW5nIHtcblx0bGV0IHJlczogc3RyaW5nO1xuXHRpZiAocGVyY2VudENoYW5nZSA+IDAgJiYgcGVyY2VudENoYW5nZSA8IHJlZFRocmVzaG9sZCkge1xuXHRcdHJlcyA9IFwiXHUyNkEwXHVGRTBGXCI7XG5cdH0gZWxzZSBpZiAocGVyY2VudENoYW5nZSA+PSByZWRUaHJlc2hvbGQpIHtcblx0XHRyZXMgPSBcIlx1MjAzQ1x1RkUwRlwiO1xuXHR9IGVsc2Uge1xuXHRcdHJlcyA9IFwiXHUyNzA1IFwiO1xuXHR9XG5cdHJldHVybiBgJHtyZXN9ICR7c2lnbihwZXJjZW50Q2hhbmdlKX1gO1xufVxuIiwgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiO1xuXG5pbXBvcnQgdHlwZSB7IE1ldGFmaWxlIH0gZnJvbSBcImVzYnVpbGRcIjtcbmltcG9ydCB0eXBlIHsgUmVwb3J0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZnVuY3Rpb24gbG9hZEpzb25GaWxlKHBhdGg6IHN0cmluZykge1xuXHRyZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTWV0YUZpbGUocGF0aDogc3RyaW5nKTogTWV0YWZpbGUge1xuXHRyZXR1cm4gbG9hZEpzb25GaWxlKHBhdGgpIGFzIE1ldGFmaWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEFuYWx5c2lzSnNvbihwYXRoOiBzdHJpbmcpOiBSZXBvcnQge1xuXHRyZXR1cm4gbG9hZEpzb25GaWxlKHBhdGgpIGFzIFJlcG9ydDtcbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvdG9vbGtpdC9ibG9iLzgxYTczYWJhOGJlZGQ1MzJmNmVkZGNjNDFlZDNhMGZhZDhiMWNmZWIvcGFja2FnZXMvY29yZS9zcmMvY29yZS50cyNMMTI2XG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5wdXQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgdmFsID0gcHJvY2Vzcy5lbnZbYElOUFVUXyR7bmFtZS50b1VwcGVyQ2FzZSgpfWBdIHx8IFwiXCI7XG5cdHJldHVybiB2YWwudHJpbSgpO1xufVxuIiwgImltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcIm5vZGU6cHJvY2Vzc1wiO1xuXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMsIFJlcG9ydCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBsb2FkTWV0YUZpbGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0KGlucHV0OiBPcHRpb25zKTogdm9pZCB7XG5cdGNvbnN0IGFsbFBhZ2VTaXplcyA9IGdldEFsbFBhZ2VTaXplcyhpbnB1dCk7XG5cdGZzLm1rZGlyU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgaW5wdXQuYW5hbHl6ZXJEaXJlY3RvcnkpLCB7XG5cdFx0cmVjdXJzaXZlOiB0cnVlLFxuXHR9KTtcblx0Y29uc3QgcmVzdWx0SnNvblBhdGggPSBwYXRoLmpvaW4oXG5cdFx0cHJvY2Vzcy5jd2QoKSxcblx0XHRpbnB1dC5hbmFseXplckRpcmVjdG9yeSxcblx0XHRcImJ1bmRsZV9hbmFseXNpcy5qc29uXCIsXG5cdCk7XG5cdGZzLndyaXRlRmlsZVN5bmMocmVzdWx0SnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KGFsbFBhZ2VTaXplcywgbnVsbCwgMikpO1xuXHRjb25zb2xlLmxvZyhgV3JvdGUgJHtyZXN1bHRKc29uUGF0aH1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsUGFnZVNpemVzKGlucHV0OiBPcHRpb25zKTogUmVwb3J0IHtcblx0Y29uc3QgYWNjOiBSZXBvcnQgPSB7fTtcblx0cmV0dXJuIGlucHV0Lm1ldGFmaWxlcy5yZWR1Y2UoKGFjYywgbWV0YWZpbGUpID0+IHtcblx0XHRjb25zdCBtZXRhRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgbWV0YWZpbGUpO1xuXHRcdHRyeSB7XG5cdFx0XHRmcy5hY2Nlc3NTeW5jKG1ldGFGaWxlUGF0aCwgZnMuY29uc3RhbnRzLlJfT0spO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0YE5vIG1ldGEgZmlsZSBmb3VuZCBhdCBcIiR7bWV0YUZpbGVQYXRofVwiIC0gYSBwYXRoIHRvIG1ldGEgZmlsZSBtYXkgYmUgd3JvbmcsIG9yIGVzYnVpbGQgaXMgbm90IGV4ZWN1dGVkLmAsXG5cdFx0XHQpO1xuXHRcdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFGaWxlSnNvbiA9IGxvYWRNZXRhRmlsZShtZXRhRmlsZVBhdGgpO1xuXHRcdE9iamVjdC5lbnRyaWVzKG1ldGFGaWxlSnNvbi5vdXRwdXRzKS5yZWR1Y2UoKGFjYywgb3V0cHV0KSA9PiB7XG5cdFx0XHRjb25zdCBbb3V0ZmlsZSwgYnVpbGRNZXRhXSA9IG91dHB1dDtcblx0XHRcdGlmIChcblx0XHRcdFx0IWlucHV0LmluY2x1ZGVFeHRlbnNpb25zLnNvbWUoKGV4dCkgPT5cblx0XHRcdFx0XHRvdXRmaWxlLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZXh0KSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBhY2M7XG5cdFx0XHR9XG5cdFx0XHRhY2NbYCR7bWV0YWZpbGV9IC0+ICR7b3V0ZmlsZX1gXSA9IHtcblx0XHRcdFx0Ynl0ZXM6IGJ1aWxkTWV0YS5ieXRlcyxcblx0XHRcdFx0bWV0YWZpbGUsXG5cdFx0XHRcdG91dGZpbGUsXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIGFjYztcblx0XHR9LCBhY2MpO1xuXHRcdHJldHVybiBhY2M7XG5cdH0sIGFjYyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxxQkFBcUI7OztBQ0E5QixPQUFPQSxTQUFRO0FBQ2YsT0FBTyxVQUFVOzs7QUNEakIsT0FBTyxRQUFRO0FBS2YsU0FBUyxhQUFhQyxPQUFjO0FBQ25DLFNBQU8sS0FBSyxNQUFNLEdBQUcsYUFBYUEsS0FBSSxFQUFFLFNBQVMsT0FBTyxDQUFDO0FBQzFEO0FBRU8sU0FBUyxhQUFhQSxPQUF3QjtBQUNwRCxTQUFPLGFBQWFBLEtBQUk7QUFDekI7QUFFTyxTQUFTLGlCQUFpQkEsT0FBc0I7QUFDdEQsU0FBTyxhQUFhQSxLQUFJO0FBQ3pCO0FBR08sU0FBUyxTQUFTLE1BQXNCO0FBQzlDLFFBQU0sTUFBTSxRQUFRLElBQUksU0FBUyxLQUFLLFlBQVksQ0FBQyxFQUFFLEtBQUs7QUFDMUQsU0FBTyxJQUFJLEtBQUs7QUFDakI7OztBRGhCTyxTQUFTLFFBQVEsT0FBc0I7QUFDN0MsTUFBSSxlQUFlO0FBQ25CLE1BQUksU0FBUyw0Q0FBcUMsTUFBTSxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBSzVELFFBQU0sVUFBVTtBQUFBLElBQ2YsS0FBSyxLQUFLLFFBQVEsSUFBSSxHQUFHLE1BQU0sbUJBQW1CLHNCQUFzQjtBQUFBLEVBQ3pFO0FBQ0EsUUFBTSxP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O0FBQ0gsTUFBQUYsSUFBRyxXQUFXLGNBQWNBLElBQUcsVUFBVSxJQUFJO0FBQUEsSUFDOUMsU0FBUyxLQUFLO0FBQ2IsY0FBUTtBQUFBLFFBQ1AsMEJBQTBCLFlBQVk7QUFBQSxNQUN2QztBQUNBLE1BQUFFLFNBQVEsS0FBSyxDQUFDO0FBQUEsSUFDZjtBQUVBLFVBQU0sZUFBZSxhQUFhLFlBQVk7QUFDOUMsV0FBTyxRQUFRLGFBQWEsT0FBTyxFQUFFLE9BQU8sQ0FBQ0MsTUFBSyxXQUFXO0FBQzVELFlBQU0sQ0FBQyxTQUFTLFNBQVMsSUFBSTtBQUM3QixVQUNDLENBQUMsTUFBTSxrQkFBa0I7QUFBQSxRQUFLLENBQUMsUUFDOUIsUUFBUSxZQUFZLEVBQUUsU0FBUyxHQUFHO0FBQUEsTUFDbkMsR0FDQztBQUNELGVBQU9BO0FBQUEsTUFDUjtBQUNBLE1BQUFBLEtBQUksR0FBRyxRQUFRLE9BQU8sT0FBTyxFQUFFLElBQUk7QUFBQSxRQUNsQyxPQUFPLFVBQVU7QUFBQSxRQUNqQjtBQUFBLFFBQ0E7QUFBQSxNQUNEO0FBQ0EsYUFBT0E7QUFBQSxJQUNSLEdBQUdBLElBQUc7QUFDTixXQUFPQTtBQUFBLEVBQ1IsR0FBRyxHQUFHO0FBQ1A7OztBSC9DQSxTQUFTLGFBQXNCO0FBQzlCLFFBQU0sZUFBZSxTQUFTLFdBQVc7QUFDekMsTUFBSSxDQUFDLGNBQWM7QUFDbEIsVUFBTSxJQUFJLE1BQU0sNEJBQTRCO0FBQUEsRUFDN0M7QUFDQSxRQUFNLE9BQU8sU0FBUyxNQUFNO0FBQzVCLE1BQUksQ0FBQyxNQUFNO0FBQ1YsVUFBTSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsRUFDeEM7QUFDQSxTQUFPO0FBQUEsSUFDTix1QkFBdUIsT0FBTztBQUFBLE1BQzdCLFNBQVMseUJBQXlCLEtBQUs7QUFBQSxNQUN2QztBQUFBLElBQ0Q7QUFBQSxJQUNBLGFBQWEsQ0FBQyxRQUFRLFFBQVEsTUFBTSxFQUFFO0FBQUEsTUFDckMsU0FBUyxjQUFjLEtBQUs7QUFBQSxJQUM3QjtBQUFBLElBQ0Esb0JBQ0MsU0FBUyxvQkFBb0IsS0FBSyxpQkFDakMsTUFBTSxHQUFHO0FBQUEsSUFDWDtBQUFBLElBQ0EsbUJBQW1CLFNBQVMsbUJBQW1CLEtBQUs7QUFBQSxJQUNwRCxXQUFXLGFBQWEsTUFBTSxHQUFHO0FBQUEsRUFDbEM7QUFDRDtBQUVPLFNBQVMsSUFBSSxVQUFtQixXQUFXLEdBQVM7QUFDMUQsU0FBTyxPQUFPO0FBQ2QsVUFBUSxPQUFPO0FBQ2hCO0FBRUEsSUFBSSxZQUFZLFFBQVEsY0FBYyxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTTtBQUM1RCxNQUFJO0FBQ0w7IiwKICAibmFtZXMiOiBbImZzIiwgInBhdGgiLCAiZnMiLCAiaW5wdXQiLCAiY2hpbGQiLCAic2lnbiIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAicHJvY2VzcyIsICJmcyIsICJwYXRoIiwgInByb2Nlc3MiLCAiYWNjIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXJlLnRzIiwgIi4uL3NyYy91dGlscy50cyIsICIuLi9zcmMvcmVwb3J0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBjb21wYXJlIH0gZnJvbSBcIi4vY29tcGFyZVwiO1xuaW1wb3J0IHsgcmVwb3J0IH0gZnJvbSBcIi4vcmVwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0SW5wdXQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5mdW5jdGlvbiBnZXRPcHRpb25zKCk6IE9wdGlvbnMge1xuXHRjb25zdCByYXdNZXRhZmlsZXMgPSBnZXRJbnB1dChcIm1ldGFmaWxlc1wiKTtcblx0aWYgKCFyYXdNZXRhZmlsZXMpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJtZXRhZmlsZXMgaXMgbm90IHNwZWNpZmllZFwiKTtcblx0fVxuXHRjb25zdCBuYW1lID0gZ2V0SW5wdXQoXCJuYW1lXCIpO1xuXHRpZiAoIW5hbWUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGlzIG5vdCBzcGVjaWZpZWRcIik7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRwZXJjZW50RXh0cmFBdHRlbnRpb246IE51bWJlci5wYXJzZUludChcblx0XHRcdGdldElucHV0KFwicGVyY2VudF9leHRyYV9hdHRlbnRpb25cIikgfHwgXCIyMFwiLFxuXHRcdFx0MTAsXG5cdFx0KSxcblx0XHRzaG93RGV0YWlsczogW1widHJ1ZVwiLCBcIlRydWVcIiwgXCJUUlVFXCJdLmluY2x1ZGVzKFxuXHRcdFx0Z2V0SW5wdXQoXCJzaG93X2RldGFpbHNcIikgfHwgXCJ0cnVlXCIsXG5cdFx0KSxcblx0XHR0b3BOTGFyZ2VzdFBhdGhzOiBOdW1iZXIucGFyc2VJbnQoXG5cdFx0XHRnZXRJbnB1dChcInRvcF9uX2xhcmdlc3RfcGF0aHNcIikgfHwgXCIyMFwiLFxuXHRcdFx0MTAsXG5cdFx0KSxcblx0XHRpbmNsdWRlRXh0ZW5zaW9uczogKFxuXHRcdFx0Z2V0SW5wdXQoXCJpbmNsdWRlX2V4dGVuc2lvbnNcIikgfHwgXCIuanMsLm1qcywuY2pzXCJcblx0XHQpLnNwbGl0KFwiLFwiKSxcblx0XHRuYW1lLFxuXHRcdGFuYWx5emVyRGlyZWN0b3J5OiBnZXRJbnB1dChcImFuYWx5emVfZGlyZWN0b3J5XCIpIHx8IFwiLmFuYWx5emVyXCIsXG5cdFx0bWV0YWZpbGVzOiByYXdNZXRhZmlsZXMuc3BsaXQoXCIsXCIpLFxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuKG9wdGlvbnM6IE9wdGlvbnMgPSBnZXRPcHRpb25zKCkpOiB2b2lkIHtcblx0cmVwb3J0KG9wdGlvbnMpO1xuXHRjb21wYXJlKG9wdGlvbnMpO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEudXJsID09PSBwYXRoVG9GaWxlVVJMKHByb2Nlc3MuYXJndlsxXSkuaHJlZikge1xuXHRydW4oKTtcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGFyZVJlc3VsdCwgT3B0aW9ucywgUmVwb3J0LCBUcmVlTWFwTm9kZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBsb2FkQW5hbHlzaXNKc29uLCBsb2FkTWV0YUZpbGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZShpbnB1dDogT3B0aW9ucyk6IHZvaWQge1xuXHRsZXQgaGFzQW55Q2hhbmdlID0gZmFsc2U7XG5cdGxldCBvdXRwdXQgPSBgIyMgXHVEODNEXHVEQ0U2IGVzYnVpbGQgQnVuZGxlIEFuYWx5c2lzIGZvciAke2lucHV0Lm5hbWV9XG5cblRoaXMgYW5hbHlzaXMgd2FzIGdlbmVyYXRlZCBieSBbZXNidWlsZC1idW5kbGUtYW5hbHl6ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9leG9lZ28vZXNidWlsZC1idW5kbGUtYW5hbHl6ZXIpLiBcdUQ4M0VcdUREMTZcbmA7XG5cblx0Y29uc3QgY3VycmVudCA9IGxvYWRBbmFseXNpc0pzb24oXG5cdFx0cGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGlucHV0LmFuYWx5emVyRGlyZWN0b3J5LCBcImJ1bmRsZV9hbmFseXNpcy5qc29uXCIpLFxuXHQpO1xuXHRjb25zdCBiYXNlID0gbG9hZEJhc2VBbmFseXNpc0pzb24oaW5wdXQpO1xuXG5cdGNvbnN0IGZpbGVUcmVlID0gYnVpbGRGaWxlVHJlZShpbnB1dCk7XG5cblx0Y29uc3QgYWxsT3V0RmlsZXM6IHN0cmluZ1tdID0gW1xuXHRcdC4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGN1cnJlbnQpLCAuLi5PYmplY3Qua2V5cyhiYXNlKV0pLFxuXHRdLnNvcnQoKTtcblxuXHRjb25zdCBjb21wYXJpc29uOiBBcnJheTxDb21wYXJlUmVzdWx0PiA9IGFsbE91dEZpbGVzLm1hcCgob3V0ZmlsZSkgPT4ge1xuXHRcdGNvbnN0IGN1cnJlbnRTdGF0cyA9IGN1cnJlbnRbb3V0ZmlsZV07XG5cdFx0Y29uc3QgYmFzZVN0YXRzID0gYmFzZVtvdXRmaWxlXTtcblxuXHRcdGlmICghY3VycmVudFN0YXRzKSB7XG5cdFx0XHRoYXNBbnlDaGFuZ2UgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIHsgLi4uYmFzZVN0YXRzLCBkaWZmOiAtMSwgcmVtYXJrOiBcImRlbGV0ZWRcIiwgdHJlZTogdW5kZWZpbmVkIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgdHJlZSA9IGZpbGVUcmVlLmdldChcblx0XHRcdHRyZWVLZXkoY3VycmVudFN0YXRzLm1ldGFmaWxlLCBjdXJyZW50U3RhdHMub3V0ZmlsZSksXG5cdFx0KTtcblx0XHRpZiAoIWJhc2VTdGF0cykge1xuXHRcdFx0aGFzQW55Q2hhbmdlID0gdHJ1ZTtcblx0XHRcdHJldHVybiB7IC4uLmN1cnJlbnRTdGF0cywgZGlmZjogLTEsIHJlbWFyazogXCJhZGRlZFwiLCB0cmVlIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGlmZiA9IGN1cnJlbnRTdGF0cy5ieXRlcyAtIGJhc2VTdGF0cy5ieXRlcztcblx0XHRpZiAoZGlmZiAhPT0gMCkge1xuXHRcdFx0aGFzQW55Q2hhbmdlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdC4uLmN1cnJlbnRTdGF0cyxcblx0XHRcdGRpZmYsXG5cdFx0XHR0cmVlLFxuXHRcdFx0cmVtYXJrOiBNYXRoLnNpZ24oZGlmZikgPyBcImluY3JlYXNlZFwiIDogXCJkZWNyZWFzZWRcIixcblx0XHR9O1xuXHR9KTtcblxuXHRpZiAoaGFzQW55Q2hhbmdlKSB7XG5cdFx0b3V0cHV0ICs9IG1hcmtkb3duVGFibGUoY29tcGFyaXNvbiwgaW5wdXQucGVyY2VudEV4dHJhQXR0ZW50aW9uKTtcblx0XHRvdXRwdXQgKz0gZmlsZVNpemVUYWJsZShjb21wYXJpc29uLCBpbnB1dC50b3BOTGFyZ2VzdFBhdGhzKTtcblx0XHRvdXRwdXQgKz0gZGV0YWlsKGlucHV0KTtcblx0fSBlbHNlIHtcblx0XHRvdXRwdXQgKz0gXCJUaGlzIFBSIGludHJvZHVjZWQgbm8gY2hhbmdlcyB0byB0aGUgZXNidWlsZCBidW5kbGUhIFx1RDgzRFx1REU0Q1wiO1xuXHR9XG5cblx0Ly8gd2UgYWRkIHRoaXMgdGFnIHNvIHRoYXQgb3VyIGFjdGlvbiBjYW4gYmUgYWJsZSB0byBlYXNpbHkgYW5kXG5cdC8vIGNvbnNpc3RlbnRseSBmaW5kIHRoZSByaWdodCBjb21tZW50IHRvIGVkaXQgYXMgbW9yZSBjb21taXRzIGFyZSBwdXNoZWQuXG5cdG91dHB1dCArPSBgPCEtLSBfX0VTQlVJTERfQlVORExFXyR7aW5wdXQubmFtZX0gLS0+YDtcblxuXHR3cml0ZUNvbW1lbnQoaW5wdXQsIG91dHB1dCk7XG59XG5cbmZ1bmN0aW9uIHRyZWVLZXkobWV0YWZpbGU6IHN0cmluZywgb3V0ZmlsZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIGAke21ldGFmaWxlfSAtPiAke291dGZpbGV9YDtcbn1cblxuLy8gV3JpdGUgdGhlIG91dHB1dCB0byBhIGZpbGUgd2hpY2ggaXMgbGF0ZXIgcmVhZCBpblxuLy8gYXMgY29tbWVudCBjb250ZW50cyBieSB0aGUgYWN0aW9ucyB3b3JrZmxvdy5cbmZ1bmN0aW9uIHdyaXRlQ29tbWVudChpbnB1dDogT3B0aW9ucywgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcblx0ZnMubWtkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBpbnB1dC5hbmFseXplckRpcmVjdG9yeSksIHtcblx0XHRyZWN1cnNpdmU6IHRydWUsXG5cdH0pO1xuXHRmcy53cml0ZUZpbGVTeW5jKFxuXHRcdHBhdGguam9pbihcblx0XHRcdHByb2Nlc3MuY3dkKCksXG5cdFx0XHRpbnB1dC5hbmFseXplckRpcmVjdG9yeSxcblx0XHRcdFwiYnVuZGxlX2FuYWx5c2lzX2NvbW1lbnQudHh0XCIsXG5cdFx0KSxcblx0XHRvdXRwdXQudHJpbSgpLFxuXHQpO1xufVxuXG5mdW5jdGlvbiBkZXRhaWwoaW5wdXQ6IE9wdGlvbnMpOiBzdHJpbmcge1xuXHRpZiAoIWlucHV0LnNob3dEZXRhaWxzKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblx0cmV0dXJuIGBcXG48ZGV0YWlscz5cbjxzdW1tYXJ5PkRldGFpbHM8L3N1bW1hcnk+XG48cD5OZXh0IHRvIHRoZSBzaXplIGlzIGhvdyBtdWNoIHRoZSBzaXplIGhhcyBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIGNvbXBhcmVkIHdpdGggdGhlIGJhc2UgYnJhbmNoIG9mIHRoaXMgUFIuPC9wPlxuPHVsPlxuPGxpPlx1MjAzQ1x1RkUwRjogU2l6ZSBpbmNyZWFzZWQgYnkgJHtpbnB1dC5wZXJjZW50RXh0cmFBdHRlbnRpb259JSBvciBtb3JlLiBTcGVjaWFsIGF0dGVudGlvbiBzaG91bGQgYmUgZ2l2ZW4gdG8gdGhpcy48L2xpPlxuPGxpPlx1MjZBMFx1RkUwRjogU2l6ZSBpbmNyZWFzZWQgaW4gYWNjZXB0YWJsZSByYW5nZSAobG93ZXIgdGhhbiAke2lucHV0LnBlcmNlbnRFeHRyYUF0dGVudGlvbn0lKS48L2xpPlxuPGxpPlx1MjcwNTogTm8gY2hhbmdlIG9yIGV2ZW4gZG93bnNpemVkLjwvbGk+XG48bGk+XHVEODNEXHVEREQxXHVGRTBGOiBUaGUgb3V0IGZpbGUgaXMgZGVsZXRlZDogbm90IGZvdW5kIGluIGJhc2UgYnJhbmNoLjwvbGk+XG48bGk+XHVEODNDXHVERDk1OiBUaGUgb3V0IGZpbGUgaXMgbmV3bHkgZm91bmQ6IHdpbGwgYmUgYWRkZWQgdG8gYmFzZSBicmFuY2guPC9saT5cbjwvdWw+XG48L2RldGFpbHM+XFxuYDtcbn1cblxuZnVuY3Rpb24gbG9hZEJhc2VBbmFseXNpc0pzb24oaW5wdXQ6IE9wdGlvbnMpOiBSZXBvcnQge1xuXHR0cnkge1xuXHRcdHJldHVybiBsb2FkQW5hbHlzaXNKc29uKFxuXHRcdFx0cGF0aC5qb2luKFxuXHRcdFx0XHRwcm9jZXNzLmN3ZCgpLFxuXHRcdFx0XHRpbnB1dC5hbmFseXplckRpcmVjdG9yeSxcblx0XHRcdFx0XCJiYXNlL2J1bmRsZS9idW5kbGVfYW5hbHlzaXMuanNvblwiLFxuXHRcdFx0KSxcblx0XHQpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gRW1wdHkgaWYgbm8gYmFzZSBhbmFseXNpcyBmb3VuZC5cblx0XHQvLyBUaGlzIGlzIGEgY2FzZSB3aGVuIGFuYWx5emVyIGlzIGZpcnN0IHNldCB1cCBvciBhbGwgYXJ0aWZhY3RzIGFyZSBleHBpcmVkLlxuXHRcdHJldHVybiB7fTtcblx0fVxufVxuXG5mdW5jdGlvbiBidWlsZEZpbGVUcmVlKGlucHV0OiBPcHRpb25zKSB7XG5cdGZ1bmN0aW9uIGJ1aWxkUm9vdChcblx0XHRpbnB1dDogUmVjb3JkPHN0cmluZywgeyBieXRlc0luT3V0cHV0OiBudW1iZXIgfT4sXG5cdCk6IFRyZWVNYXBOb2RlIHtcblx0XHRjb25zdCByb290OiBUcmVlTWFwTm9kZSA9IHsgbmFtZTogXCJcIiwgcGF0aDogXCJcIiwgdmFsdWU6IDAsIGNoaWxkcmVuOiBbXSB9O1xuXHRcdGZvciAoY29uc3QgW2ZpbGVQYXRoLCB7IGJ5dGVzSW5PdXRwdXQgfV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG5cdFx0XHRjb25zdCBkaXJlY3RvcmllcyA9IGZpbGVQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGJ1aWxkTm9kZShyb290LCBkaXJlY3RvcmllcywgYnl0ZXNJbk91dHB1dCk7XG5cdFx0fVxuXHRcdHJldHVybiByb290O1xuXHR9XG5cblx0ZnVuY3Rpb24gYnVpbGROb2RlKFxuXHRcdG5vZGU6IFRyZWVNYXBOb2RlLFxuXHRcdHBhdGhzOiBBcnJheTxzdHJpbmc+LFxuXHRcdHZhbHVlOiBudW1iZXIsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGZpcnN0ID0gcGF0aHMuc2hpZnQoKTtcblx0XHRpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gbGVhZiBub2RlIChmaWxlKVxuXHRcdFx0bm9kZS52YWx1ZSArPSB2YWx1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IGNoaWxkID0gbm9kZS5jaGlsZHJlbi5maW5kKChjaGlsZCkgPT4gY2hpbGQubmFtZSA9PT0gZmlyc3QpO1xuXHRcdGlmICghY2hpbGQpIHtcblx0XHRcdGNoaWxkID0ge1xuXHRcdFx0XHRuYW1lOiBmaXJzdCxcblx0XHRcdFx0cGF0aDogYCR7bm9kZS5wYXRofS8ke2ZpcnN0fWAucmVwbGFjZSgvXlxcLy8sIFwiXCIpLFxuXHRcdFx0XHR2YWx1ZTogMCxcblx0XHRcdFx0Y2hpbGRyZW46IFtdLFxuXHRcdFx0fTtcblx0XHRcdG5vZGUuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cdFx0fVxuXHRcdG5vZGUudmFsdWUgKz0gdmFsdWU7XG5cdFx0YnVpbGROb2RlKGNoaWxkLCBwYXRocywgdmFsdWUpO1xuXHR9XG5cblx0Y29uc3QgdHJlZXMgPSBuZXcgTWFwPHN0cmluZywgVHJlZU1hcE5vZGU+KCk7XG5cdGZvciAoY29uc3QgbWV0YWZpbGUgb2YgaW5wdXQubWV0YWZpbGVzKSB7XG5cdFx0Y29uc3QgbWV0YWZpbGVKc29uID0gbG9hZE1ldGFGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBtZXRhZmlsZSkpO1xuXHRcdGZvciAoY29uc3QgW291dGZpbGUsIGJ1aWxkTWV0YV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWZpbGVKc29uLm91dHB1dHMpKSB7XG5cdFx0XHRjb25zdCB0cmVlID0gYnVpbGRSb290KGJ1aWxkTWV0YS5pbnB1dHMpO1xuXHRcdFx0dHJlZXMuc2V0KHRyZWVLZXkobWV0YWZpbGUsIG91dGZpbGUpLCB0cmVlKTtcblxuXHRcdFx0ZnMud3JpdGVGaWxlU3luYyhcblx0XHRcdFx0cGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGlucHV0LmFuYWx5emVyRGlyZWN0b3J5LCBcInRyZWUuanNvblwiKSxcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkodHJlZSwgbnVsbCwgMiksXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdHJlZXM7XG59XG5cbmNvbnN0IHNwYWNlciA9IFwiXHUwMEEwXCI7XG5mdW5jdGlvbiBmaWxlc2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcblx0Y29uc3Qgc2lnbiA9IGJ5dGVzIDwgMCA/IFwiLVwiIDogXCJcIjtcblx0Y29uc3QgbiA9IE1hdGguYWJzKGJ5dGVzKTtcblx0aWYgKG4gPCAxMDAwKSB7XG5cdFx0cmV0dXJuIGAke3NpZ259JHtufSR7c3BhY2VyfUJgO1xuXHR9XG5cdGlmIChuIDwgMTAwMCAqIDEwMDApIHtcblx0XHRyZXR1cm4gYCR7c2lnbn0keyhuIC8gMTAwMCkudG9GaXhlZCgyKX0ke3NwYWNlcn1LQmA7XG5cdH1cblx0aWYgKG4gPCAxMDAwICogMTAwMCAqIDEwMDApIHtcblx0XHRyZXR1cm4gYCR7c2lnbn0keyhuIC8gMTAwMCAvIDEwMDApLnRvRml4ZWQoMil9JHtzcGFjZXJ9TUJgO1xuXHR9XG5cdGlmIChuIDwgMTAwMCAqIDEwMDAgKiAxMDAwICogMTAwMCkge1xuXHRcdHJldHVybiBgJHtzaWdufSR7KG4gLyAxMDAwIC8gMTAwMCAvIDEwMDApLnRvRml4ZWQoMil9JHtzcGFjZXJ9R0JgO1xuXHR9XG5cdHRocm93IG5ldyBFcnJvcihcIlRvbyBsYXJnZSBmaWxlIHNpemUhISBBcmUgeW91IHN1cmU/XCIpO1xufVxuXG5mdW5jdGlvbiBtYXJrZG93blRhYmxlKFxuXHRkYXRhOiBBcnJheTxDb21wYXJlUmVzdWx0Pixcblx0cmVkVGhyZXNob2xkOiBudW1iZXIsXG4pOiBzdHJpbmcge1xuXHRjb25zdCByb3dzID0gZGF0YVxuXHRcdC5tYXAoKGQpID0+IHtcblx0XHRcdHJldHVybiBgJHtkLm1ldGFmaWxlfSB8ICR7ZC5vdXRmaWxlfSB8ICR7cmVuZGVyU2l6ZShkKX0gfCAke3JlbmRlck5vdGUoXG5cdFx0XHRcdGQsXG5cdFx0XHRcdHJlZFRocmVzaG9sZCxcblx0XHRcdCl9XFxuYDtcblx0XHR9KVxuXHRcdC5qb2luKFwiXCIpO1xuXG5cdHJldHVybiBgXG5NZXRhIEZpbGUgfCBPdXQgRmlsZSAgfCBTaXplIChyYXcpIHwgTm90ZSBcbi0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLTp8LS0tLS0tXG4ke3Jvd3N9YDtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSB0b3AgTiBsYXJnZXN0IG5vZGVzIGluIHJvb3QgdHJlZS5cbiAqIERpZyBub2RlcyB1bnRpbCB0aGUgZGVwdGggb2YgMy5cbiAqL1xuZnVuY3Rpb24gZmluZExhcmdlRGlyZWN0b3JpZXMocm9vdDogVHJlZU1hcE5vZGUsIE46IG51bWJlcikge1xuXHRjb25zdCBub2RlczogVHJlZU1hcE5vZGVbXSA9IFtdO1xuXHRjb25zdCBxdWV1ZTogQXJyYXk8eyBub2RlOiBUcmVlTWFwTm9kZTsgZGVwdGg6IG51bWJlciB9PiA9IFtcblx0XHR7IG5vZGU6IHJvb3QsIGRlcHRoOiAwIH0sXG5cdF07XG5cdHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG5cdFx0Y29uc3Qgc2hpZnQgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdGlmICghc2hpZnQpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRjb25zdCB7IG5vZGUsIGRlcHRoIH0gPSBzaGlmdDtcblx0XHRpZiAoZGVwdGggPT09IDMpIHtcblx0XHRcdG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0aWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRub2Rlcy5wdXNoKG5vZGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW0gb2Ygbm9kZS5jaGlsZHJlbikge1xuXHRcdFx0XHRxdWV1ZS5wdXNoKHsgbm9kZTogaXRlbSwgZGVwdGg6IGRlcHRoICsgMSB9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29uc3QgbGFyZ2VOb2RlcyA9IG5vZGVzLnNvcnQoKGEsIGIpID0+IGIudmFsdWUgLSBhLnZhbHVlKS5zbGljZSgwLCBOKTtcblx0cmV0dXJuIHtcblx0XHRsYXJnZU5vZGVzLFxuXHRcdGhhc090aGVyOiBub2Rlcy5sZW5ndGggPiBOLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBmaXhlZFBlcmNlbnQobjogbnVtYmVyLCBkOiBudW1iZXIpOiBudW1iZXIge1xuXHRyZXR1cm4gTnVtYmVyLnBhcnNlRmxvYXQoKChuIC8gZCkgKiAxMDApLnRvRml4ZWQoMSkpO1xufVxuXG5mdW5jdGlvbiBmaWxlU2l6ZVRhYmxlKFxuXHRkYXRhOiBBcnJheTxDb21wYXJlUmVzdWx0Pixcblx0dG9wTkxhcmdlc3RQYXRoczogbnVtYmVyLFxuKTogc3RyaW5nIHtcblx0aWYgKGRhdGEubGVuZ3RoID09PSAwIHx8IHRvcE5MYXJnZXN0UGF0aHMgPD0gMCkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cdGxldCBvdXRwdXQgPSBcIlwiO1xuXHRvdXRwdXQgKz0gXCI8ZGV0YWlscz5cXG5cIjtcblx0b3V0cHV0ICs9IFwiPHN1bW1hcnk+VG9wIHRlbiBsYXJnZXN0IHBhdGhzPC9zdW1tYXJ5PlxcblwiO1xuXHRvdXRwdXQgKz0gYFRoZXNlIHZpc3VhbGl6YXRpb24gc2hvd3MgdG9wICR7dG9wTkxhcmdlc3RQYXRoc30gbGFyZ2VzdCBwYXRocyBpbiB0aGUgYnVuZGxlLlxcbmA7XG5cdGZvciAoY29uc3QgZCBvZiBkYXRhKSB7XG5cdFx0b3V0cHV0ICs9IFwiXFxuXCI7XG5cdFx0b3V0cHV0ICs9IGAjIyBNZXRhIGZpbGU6ICR7ZC5tZXRhZmlsZX0sIE91dCBmaWxlOiAke2Qub3V0ZmlsZX1cXG5gO1xuXHRcdGlmICghZC50cmVlKSB7XG5cdFx0XHRvdXRwdXQgKz0gXCJcdUZFMEZcdUZFMEZcdUQ4M0RcdURERDFcdUZFMEZEZWxldGVkXFxuXCI7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0b3V0cHV0ICs9IFwifCBQYXRoIHwgU2l6ZSB8XFxuXCI7XG5cdFx0b3V0cHV0ICs9IFwifC0tLS0tLXwtLS0tLS0tfFxcblwiO1xuXHRcdGNvbnN0IHRvdGFsU2l6ZSA9IGQudHJlZS52YWx1ZTtcblx0XHRjb25zdCB7IGxhcmdlTm9kZXMsIGhhc090aGVyIH0gPSBmaW5kTGFyZ2VEaXJlY3Rvcmllcyhcblx0XHRcdGQudHJlZSxcblx0XHRcdHRvcE5MYXJnZXN0UGF0aHMsXG5cdFx0KTtcblx0XHRmb3IgKGNvbnN0IHsgcGF0aCwgdmFsdWUgfSBvZiBsYXJnZU5vZGVzKSB7XG5cdFx0XHRjb25zdCBwZXJjZW50ID0gZml4ZWRQZXJjZW50KHZhbHVlLCB0b3RhbFNpemUpO1xuXHRcdFx0b3V0cHV0ICs9IGB8ICR7cGF0aH0gfCAke3JlbmRlckJhcihwZXJjZW50LCB2YWx1ZSl9IHxcXG5gO1xuXHRcdH1cblx0XHRpZiAoaGFzT3RoZXIpIHtcblx0XHRcdGNvbnN0IG90aGVyU2l6ZSA9IHRvdGFsU2l6ZSAtIGxhcmdlTm9kZXNbMF0udmFsdWU7XG5cdFx0XHRjb25zdCBvdGhlclBlcmNlbnQgPSBmaXhlZFBlcmNlbnQob3RoZXJTaXplLCB0b3RhbFNpemUpO1xuXHRcdFx0b3V0cHV0ICs9IGB8IChvdGhlcikgfCAke3JlbmRlckJhcihvdGhlclBlcmNlbnQsIG90aGVyU2l6ZSl9IHxcXG5gO1xuXHRcdH1cblx0fVxuXHRvdXRwdXQgKz0gXCI8L2RldGFpbHM+XFxuXCI7XG5cdHJldHVybiBvdXRwdXQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckJhcihwZXJjZW50OiBudW1iZXIsIGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuXHRjb25zdCBiYXIgPSBwcm9ncmVzcyhwZXJjZW50IC8gMTAwKTtcblx0cmV0dXJuIGBcXCR7e1xcXFxjb2xvcntHb2xkZW5yb2R9eyAke2Jhcn0gfX19XFwkICR7cGVyY2VudC50b0ZpeGVkKFxuXHRcdDEsXG5cdCl9JSwgJHtmaWxlc2l6ZShieXRlcyl9YDtcbn1cblxuLy8gQmxvY2sgcHJvZ3Jlc3Npb24gaXMgMS84ID0gMC4xMjVcbmNvbnN0IGJsb2NrcyA9IFtcIlwiLCBcIlx1MjU4RlwiLCBcIlx1MjU4RVwiLCBcIlx1MjU4RFwiLCBcIlx1MjU4Q1wiLCBcIlx1MjU4QlwiLCBcIlx1MjU4QVwiLCBcIlx1MjU4OVwiLCBcIlx1MjU4OFwiXTtcbmNvbnN0IHByb2dyZXNzaW9uID0gMSAvIChibG9ja3MubGVuZ3RoIC0gMSk7XG5mdW5jdGlvbiBwcm9ncmVzcyh2YWx1ZTogbnVtYmVyLCBsZW5ndGggPSAyNSwgdm1pbiA9IDAuMCwgdm1heCA9IDEuMCkge1xuXHRjb25zdCB2ID0gdmFsdWUgKiBsZW5ndGg7XG5cdGNvbnN0IGludGVnZXJQYXJ0ID0gTWF0aC5mbG9vcih2KTtcblx0Y29uc3QgZnJhY3Rpb25hbFBhcnQgPSB2IC0gaW50ZWdlclBhcnQ7XG5cdGNvbnN0IGkgPSBNYXRoLnJvdW5kKFxuXHRcdChwcm9ncmVzc2lvbiAqIE1hdGguZmxvb3IoZnJhY3Rpb25hbFBhcnQgLyBwcm9ncmVzc2lvbikpIC8gcHJvZ3Jlc3Npb24sXG5cdCk7XG5cdHJldHVybiBcIlx1MjU4OFwiLnJlcGVhdChpbnRlZ2VyUGFydCkgKyBibG9ja3NbaV07XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNpemUoZDogQ29tcGFyZVJlc3VsdCk6IHN0cmluZyB7XG5cdHJldHVybiBmaWxlc2l6ZShkLmJ5dGVzKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTm90ZShkOiBDb21wYXJlUmVzdWx0LCByZWRUaHJlc2hvbGQ6IG51bWJlcik6IHN0cmluZyB7XG5cdGlmIChkLnJlbWFyayA9PT0gXCJkZWxldGVkXCIpIHtcblx0XHRyZXR1cm4gXCJcdUQ4M0RcdURERDFcdUZFMEYgRGVsZXRlZFwiO1xuXHR9XG5cdGlmIChkLnJlbWFyayA9PT0gXCJhZGRlZFwiKSB7XG5cdFx0cmV0dXJuIFwiXHVEODNDXHVERDk1IEFkZGVkXCI7XG5cdH1cblx0aWYgKGQuZGlmZikge1xuXHRcdGNvbnN0IHBlcmNlbnRDaGFuZ2UgPSAoZC5kaWZmIC8gZC5ieXRlcykgKiAxMDA7XG5cdFx0cmV0dXJuIGAke3JlbmRlclN0YXR1c0luZGljYXRvcihwZXJjZW50Q2hhbmdlLCByZWRUaHJlc2hvbGQpfSR7ZmlsZXNpemUoXG5cdFx0XHRkLmRpZmYsXG5cdFx0KX0gKCR7c2lnbihwZXJjZW50Q2hhbmdlKX0ke3BlcmNlbnRDaGFuZ2UudG9GaXhlZCgxKX0lKWA7XG5cdH1cblx0cmV0dXJuIFwiXHUyNzA1ICBObyBjaGFuZ2VcIjtcbn1cblxuZnVuY3Rpb24gc2lnbihudW06IG51bWJlcik6IHN0cmluZyB7XG5cdHJldHVybiBudW0gPCAwID8gXCJcIiA6IFwiK1wiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTdGF0dXNJbmRpY2F0b3IoXG5cdHBlcmNlbnRDaGFuZ2U6IG51bWJlcixcblx0cmVkVGhyZXNob2xkOiBudW1iZXIsXG4pOiBzdHJpbmcge1xuXHRsZXQgcmVzOiBzdHJpbmc7XG5cdGlmIChwZXJjZW50Q2hhbmdlID4gMCAmJiBwZXJjZW50Q2hhbmdlIDwgcmVkVGhyZXNob2xkKSB7XG5cdFx0cmVzID0gXCJcdTI2QTBcdUZFMEZcIjtcblx0fSBlbHNlIGlmIChwZXJjZW50Q2hhbmdlID49IHJlZFRocmVzaG9sZCkge1xuXHRcdHJlcyA9IFwiXHUyMDNDXHVGRTBGXCI7XG5cdH0gZWxzZSB7XG5cdFx0cmVzID0gXCJcdTI3MDUgXCI7XG5cdH1cblx0cmV0dXJuIGAke3Jlc30gJHtzaWduKHBlcmNlbnRDaGFuZ2UpfWA7XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5cbmltcG9ydCB0eXBlIHsgTWV0YWZpbGUgfSBmcm9tIFwiZXNidWlsZFwiO1xuaW1wb3J0IHR5cGUgeyBSZXBvcnQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5mdW5jdGlvbiBsb2FkSnNvbkZpbGUocGF0aDogc3RyaW5nKSB7XG5cdHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZyhcInV0Zi04XCIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRNZXRhRmlsZShwYXRoOiBzdHJpbmcpOiBNZXRhZmlsZSB7XG5cdHJldHVybiBsb2FkSnNvbkZpbGUocGF0aCkgYXMgTWV0YWZpbGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQW5hbHlzaXNKc29uKHBhdGg6IHN0cmluZyk6IFJlcG9ydCB7XG5cdHJldHVybiBsb2FkSnNvbkZpbGUocGF0aCkgYXMgUmVwb3J0O1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy90b29sa2l0L2Jsb2IvODFhNzNhYmE4YmVkZDUzMmY2ZWRkY2M0MWVkM2EwZmFkOGIxY2ZlYi9wYWNrYWdlcy9jb3JlL3NyYy9jb3JlLnRzI0wxMjZcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnB1dChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCB2YWwgPSBwcm9jZXNzLmVudltgSU5QVVRfJHtuYW1lLnRvVXBwZXJDYXNlKCl9YF0gfHwgXCJcIjtcblx0cmV0dXJuIHZhbC50cmltKCk7XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5cbmltcG9ydCB0eXBlIHsgT3B0aW9ucywgUmVwb3J0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGxvYWRNZXRhRmlsZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnQoaW5wdXQ6IE9wdGlvbnMpOiB2b2lkIHtcblx0Y29uc3QgYWxsUGFnZVNpemVzID0gZ2V0QWxsUGFnZVNpemVzKGlucHV0KTtcblx0ZnMubWtkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBpbnB1dC5hbmFseXplckRpcmVjdG9yeSksIHtcblx0XHRyZWN1cnNpdmU6IHRydWUsXG5cdH0pO1xuXHRjb25zdCByZXN1bHRKc29uUGF0aCA9IHBhdGguam9pbihcblx0XHRwcm9jZXNzLmN3ZCgpLFxuXHRcdGlucHV0LmFuYWx5emVyRGlyZWN0b3J5LFxuXHRcdFwiYnVuZGxlX2FuYWx5c2lzLmpzb25cIixcblx0KTtcblx0ZnMud3JpdGVGaWxlU3luYyhyZXN1bHRKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoYWxsUGFnZVNpemVzLCBudWxsLCAyKSk7XG5cdGNvbnNvbGUubG9nKGBXcm90ZSAke3Jlc3VsdEpzb25QYXRofWApO1xufVxuXG5mdW5jdGlvbiBnZXRBbGxQYWdlU2l6ZXMoaW5wdXQ6IE9wdGlvbnMpOiBSZXBvcnQge1xuXHRjb25zdCBhY2M6IFJlcG9ydCA9IHt9O1xuXHRyZXR1cm4gaW5wdXQubWV0YWZpbGVzLnJlZHVjZSgoYWNjLCBtZXRhZmlsZSkgPT4ge1xuXHRcdGNvbnN0IG1ldGFGaWxlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBtZXRhZmlsZSk7XG5cdFx0dHJ5IHtcblx0XHRcdGZzLmFjY2Vzc1N5bmMobWV0YUZpbGVQYXRoLCBmcy5jb25zdGFudHMuUl9PSyk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgTm8gbWV0YSBmaWxlIGZvdW5kIGF0IFwiJHttZXRhRmlsZVBhdGh9XCIgLSBhIHBhdGggdG8gbWV0YSBmaWxlIG1heSBiZSB3cm9uZywgb3IgZXNidWlsZCBpcyBub3QgZXhlY3V0ZWQuYCxcblx0XHRcdCk7XG5cdFx0XHRwcm9jZXNzLmV4aXQoMSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YUZpbGVKc29uID0gbG9hZE1ldGFGaWxlKG1ldGFGaWxlUGF0aCk7XG5cdFx0T2JqZWN0LmVudHJpZXMobWV0YUZpbGVKc29uLm91dHB1dHMpLnJlZHVjZSgoYWNjLCBvdXRwdXQpID0+IHtcblx0XHRcdGNvbnN0IFtvdXRmaWxlLCBidWlsZE1ldGFdID0gb3V0cHV0O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQhaW5wdXQuaW5jbHVkZUV4dGVuc2lvbnMuc29tZSgoZXh0KSA9PlxuXHRcdFx0XHRcdG91dGZpbGUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChleHQpLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIGFjYztcblx0XHRcdH1cblx0XHRcdGFjY1tgJHttZXRhZmlsZX0gLT4gJHtvdXRmaWxlfWBdID0ge1xuXHRcdFx0XHRieXRlczogYnVpbGRNZXRhLmJ5dGVzLFxuXHRcdFx0XHRtZXRhZmlsZSxcblx0XHRcdFx0b3V0ZmlsZSxcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4gYWNjO1xuXHRcdH0sIGFjYyk7XG5cdFx0cmV0dXJuIGFjYztcblx0fSwgYWNjKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLHFCQUFxQjs7O0FDQTlCLE9BQU9BLFNBQVE7QUFDZixPQUFPLFVBQVU7OztBQ0RqQixPQUFPLFFBQVE7QUFLZixTQUFTLGFBQWFDLE9BQWM7QUFDbkMsU0FBTyxLQUFLLE1BQU0sR0FBRyxhQUFhQSxLQUFJLEVBQUUsU0FBUyxPQUFPLENBQUM7QUFDMUQ7QUFFTyxTQUFTLGFBQWFBLE9BQXdCO0FBQ3BELFNBQU8sYUFBYUEsS0FBSTtB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Q1IsR0FBR0EsSUFBRztBQUNOLFdBQU9BO0FBQUEsRUFDUixHQUFHLEdBQUc7QUFDUDs7O0FIL0NBLFNBQVMsYUFBc0I7QUFDOUIsUUFBTSxlQUFlLFNBQVMsV0FBVztBQUN6QyxNQUFJLENBQUMsY0FBYztBQUNsQixVQUFNLElBQUksTUFBTSw0QkFBNEI7QUFBQSxFQUM3QztBQUNBLFFBQU0sT0FBTyxTQUFTLE1BQU07QUFDNUIsTUFBSSxDQUFDLE1BQU07QUFDVixVQUFNLElBQUksTUFBTSx1QkFBdUI7QUFBQSxFQUN4QztBQUNBLFNBQU87QUFBQSxJQUNOLHVCQUF1QixPQUFPO0FBQUEsTUFDN0IsU0FBUyx5QkFBeUIsS0FBSztBQUFBLE1BQ3ZDO0FBQUEsSUFDRDtBQUFBLElBQ0EsYUFBYSxDQUFDLFFBQVEsUUFBUSxNQUFNLEVBQUU7QUFBQSxNQUNyQyxTQUFTLGNBQWMsS0FBSztBQUFBLElBQzdCO0FBQUEsSUFDQSxrQkFBa0IsT0FBTztBQUFBLE1BQ3hCLFNBQVMscUJBQXFCLEtBQUs7QUFBQSxNQUNuQztBQUFBLElBQ0Q7QUFBQSxJQUNBLG9CQUNDLFNBQVMsb0JBQW9CLEtBQUssaUJBQ2pDLE1BQU0sR0FBRztBQUFBLElBQ1g7QUFBQSxJQUNBLG1CQUFtQixTQUFTLG1CQUFtQixLQUFLO0FBQUEsSUFDcEQsV0FBVyxhQUFhLE1BQU0sR0FBRztBQUFBLEVBQ2xDO0FBQ0Q7QUFFTyxTQUFTLElBQUksVUFBbUIsV0FBVyxHQUFTO0FBQzFELFNBQU8sT0FBTztBQUNkLFVBQVEsT0FBTztBQUNoQjtBQUVBLElBQUksWUFBWSxRQUFRLGNBQWMsUUFBUSxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU07QUFDNUQsTUFBSTtBQUNMOyIsCiAgIm5hbWVzIjogWyJmcyIsICJwYXRoIiwgImZzIiwgImlucHV0IiwgImNoaWxkIiwgInNpZ24iLCAicGF0aCIsICJmcyIsICJwYXRoIiwgInByb2Nlc3MiLCAiZnMiLCAicGF0aCIsICJwcm9jZXNzIiwgImFjYyJdCn0K diff --git a/src/compare.ts b/src/compare.ts index f856d7a..af95ec1 100644 --- a/src/compare.ts +++ b/src/compare.ts @@ -52,7 +52,7 @@ This analysis was generated by [esbuild-bundle-analyzer](https://github.com/exoe if (hasAnyChange) { output += markdownTable(comparison, input.percentExtraAttention); - output += fileSizeTable(comparison); + output += fileSizeTable(comparison, input.topNLargestPaths); output += detail(input); } else { output += "This PR introduced no changes to the esbuild bundle! 🙌"; @@ -156,6 +156,10 @@ function buildFileTree(input: Options) { } const trees = new Map(); + if (input.topNLargestPaths <= 0) { + // Skip building tree if we don't need it. + return trees; + } for (const metafile of input.metafiles) { const metafileJson = loadMetaFile(path.join(process.cwd(), metafile)); for (const [outfile, buildMeta] of Object.entries(metafileJson.outputs)) { @@ -210,10 +214,10 @@ ${rows}`; } /** - * Find the top ten largest nodes in root tree. + * Find the top N largest nodes in root tree. * Dig nodes until the depth of 3. */ -function findLargeDirectories(root: TreeMapNode) { +function findLargeDirectories(root: TreeMapNode, N: number) { const nodes: TreeMapNode[] = []; const queue: Array<{ node: TreeMapNode; depth: number }> = [ { node: root, depth: 0 }, @@ -236,10 +240,10 @@ function findLargeDirectories(root: TreeMapNode) { } } } - const largeNodes = nodes.sort((a, b) => b.value - a.value).slice(0, 10); + const largeNodes = nodes.sort((a, b) => b.value - a.value).slice(0, N); return { largeNodes, - hasOther: nodes.length > 10, + hasOther: nodes.length > N, }; } @@ -247,13 +251,17 @@ function fixedPercent(n: number, d: number): number { return Number.parseFloat(((n / d) * 100).toFixed(1)); } -function fileSizeTable(data: Array): string { - if (data.length === 0) { +function fileSizeTable( + data: Array, + topNLargestPaths: number, +): string { + if (data.length === 0 || topNLargestPaths <= 0) { return ""; } let output = ""; output += "
\n"; output += "Top ten largest paths\n"; + output += `These visualization shows top ${topNLargestPaths} largest paths in the bundle.\n`; for (const d of data) { output += "\n"; output += `## Meta file: ${d.metafile}, Out file: ${d.outfile}\n`; @@ -264,7 +272,10 @@ function fileSizeTable(data: Array): string { output += "| Path | Size |\n"; output += "|------|-------|\n"; const totalSize = d.tree.value; - const { largeNodes, hasOther } = findLargeDirectories(d.tree); + const { largeNodes, hasOther } = findLargeDirectories( + d.tree, + topNLargestPaths, + ); for (const { path, value } of largeNodes) { const percent = fixedPercent(value, totalSize); output += `| ${path} | ${renderBar(percent, value)} |\n`; diff --git a/src/index.ts b/src/index.ts index 5ffcfdb..966d5a6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,6 +21,10 @@ function getOptions(): Options { showDetails: ["true", "True", "TRUE"].includes( getInput("show_details") || "true", ), + topNLargestPaths: Number.parseInt( + getInput("top_n_largest_paths") || "20", + 10, + ), includeExtensions: ( getInput("include_extensions") || ".js,.mjs,.cjs" ).split(","), diff --git a/src/types.ts b/src/types.ts index ff84763..81c1520 100644 --- a/src/types.ts +++ b/src/types.ts @@ -18,6 +18,7 @@ export interface Options { name: string; metafiles: Array; includeExtensions: Array; + topNLargestPaths: number; analyzerDirectory: string; percentExtraAttention: number; showDetails: boolean;