@dbx-tools/core 0.9.46 → 0.9.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/project-utils.js +13 -2
- package/package.json +2 -2
- package/src/project-utils.ts +10 -1
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.50";
|
|
7
7
|
export * as bin from "./src/bin.ts";
|
|
8
8
|
export * as brandFiles from "./src/brand-files.ts";
|
|
9
9
|
export * as bundle from "./src/bundle.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.50";
|
|
3
3
|
export * as bin from "./src/bin.ts";
|
|
4
4
|
export * as brandFiles from "./src/brand-files.ts";
|
|
5
5
|
export * as bundle from "./src/bundle.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.50";
|
|
6
6
|
export * as bin from "./src/bin.js";
|
|
7
7
|
export * as brandFiles from "./src/brand-files.js";
|
|
8
8
|
export * as bundle from "./src/bundle.js";
|
|
@@ -16,4 +16,4 @@ export * as projectUtils from "./src/project-utils.js";
|
|
|
16
16
|
export { BrandContextSchema, defaultBrandContext, parseBrandContext, brandContextJsonSchema, brandContextPrompt } from "./src/brand-files.js";
|
|
17
17
|
export { MAX_TCP_PORT, ENV_ONLY, valueSchema, bundleResourceSchema, bundleEnvEntrySchema, bundleAppSchema, appEnvEntrySchema, appSchema } from "./src/config-utils.js";
|
|
18
18
|
export { COMMAND_NOT_FOUND_EXIT_CODE } from "./src/exec.js";
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxrQkFBa0IsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5SSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3ZLLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvY29yZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjUwXCI7XG5leHBvcnQgKiBhcyBiaW4gZnJvbSBcIi4vc3JjL2Jpbi50c1wiO1xuZXhwb3J0ICogYXMgYnJhbmRGaWxlcyBmcm9tIFwiLi9zcmMvYnJhbmQtZmlsZXMudHNcIjtcbmV4cG9ydCAqIGFzIGJ1bmRsZSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWdVdGlscyBmcm9tIFwiLi9zcmMvY29uZmlnLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBkZXBlbmRlbmN5UmVzb2x2ZXIgZnJvbSBcIi4vc3JjL2RlcGVuZGVuY3ktcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCAqIGFzIGV4ZWMgZnJvbSBcIi4vc3JjL2V4ZWMudHNcIjtcbmV4cG9ydCAqIGFzIGZpbGUgZnJvbSBcIi4vc3JjL2ZpbGUudHNcIjtcbmV4cG9ydCAqIGFzIGZpbGVMb2NrIGZyb20gXCIuL3NyYy9maWxlLWxvY2sudHNcIjtcbmV4cG9ydCAqIGFzIHByb2Nlc3NMb2NrIGZyb20gXCIuL3NyYy9wcm9jZXNzLWxvY2sudHNcIjtcbmV4cG9ydCAqIGFzIHByb2plY3RVdGlscyBmcm9tIFwiLi9zcmMvcHJvamVjdC11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCaW5Db250ZXh0LCBCaW5TZWxlY3Rpb25Db250ZXh0LCBCaW5TZWxlY3RvciwgQmluVmVyc2lvbk91dHB1dCwgQmluVmVyc2lvblBhcnNlciwgQmluT3B0aW9ucywgQmluVXJsUmVzb2x2ZUNvbnRleHQsIEJpblNvdXJjZSwgQmluVXJsIH0gZnJvbSBcIi4vc3JjL2Jpbi50c1wiO1xuZXhwb3J0IHsgQnJhbmRDb250ZXh0U2NoZW1hLCBkZWZhdWx0QnJhbmRDb250ZXh0LCBwYXJzZUJyYW5kQ29udGV4dCwgYnJhbmRDb250ZXh0SnNvblNjaGVtYSwgYnJhbmRDb250ZXh0UHJvbXB0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLWZpbGVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCwgQnJhbmRDb250ZXh0SW5wdXQgfSBmcm9tIFwiLi9zcmMvYnJhbmQtZmlsZXMudHNcIjtcbmV4cG9ydCB7IE1BWF9UQ1BfUE9SVCwgRU5WX09OTFksIHZhbHVlU2NoZW1hLCBidW5kbGVSZXNvdXJjZVNjaGVtYSwgYnVuZGxlRW52RW50cnlTY2hlbWEsIGJ1bmRsZUFwcFNjaGVtYSwgYXBwRW52RW50cnlTY2hlbWEsIGFwcFNjaGVtYSB9IGZyb20gXCIuL3NyYy9jb25maWctdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29uZmlnTWFwVmFsdWUsIENvbmZpZ0RhdGEsIENvbmZpZ1NvdXJjZSwgQ29uZmlnT3B0aW9ucywgQ29uZmlnRmlsZSB9IGZyb20gXCIuL3NyYy9jb25maWctdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGVwZW5kZW5jeVJlc29sdmVyT3B0aW9ucywgRGVwZW5kZW5jeUluZm8sIFJlc29sdmVkTnBtVmVyc2lvbiwgTnBtU3BlY2lmaWVySW5wdXQsIFJlc29sdmVkTnBtRGVwZW5kZW5jaWVzLCBNaXNzaW5nRGVwZW5kZW5jeUluZm8gfSBmcm9tIFwiLi9zcmMvZGVwZW5kZW5jeS1yZXNvbHZlci50c1wiO1xuZXhwb3J0IHsgQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFIH0gZnJvbSBcIi4vc3JjL2V4ZWMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRXhlY1N0ZGlvLCBMaW5lSGFuZGxlciwgU3RkaW9PcHRpb24sIEV4ZWNSZXN1bHQsIENoaWxkUHJvY2Vzc1Jlc3VsdCwgRXhlY09wdGlvbnMsIFN5bmNFeGVjU3RkaW8sIFN5bmNFeGVjT3B0aW9ucywgU3Bhd25BcmdzIH0gZnJvbSBcIi4vc3JjL2V4ZWMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRmlsZUxvY2tCYWNrZW5kLCBGaWxlTG9ja0FjcXVpc2l0aW9uLCBGaWxlTG9ja09wdGlvbnMsIEZpbGVMb2NrTGVhc2UgfSBmcm9tIFwiLi9zcmMvZmlsZS1sb2NrLnRzXCI7XG5leHBvcnQgdHlwZSB7IFByb2plY3RDb250ZXh0LCBOcG1SZWdpc3RyeU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcHJvamVjdC11dGlscy50c1wiO1xuIl19
|
package/lib/src/project-utils.js
CHANGED
|
@@ -103,7 +103,7 @@ export function root(cwd) {
|
|
|
103
103
|
if (!fileStatSync(current)?.isDirectory()) {
|
|
104
104
|
current = dirname(current);
|
|
105
105
|
}
|
|
106
|
-
const boundaries = new Set([
|
|
106
|
+
const boundaries = new Set([npmBoundary(resolved), gitRoot(resolved)]
|
|
107
107
|
.filter((path) => path !== undefined)
|
|
108
108
|
.map((path) => resolve(path)));
|
|
109
109
|
const hasBoundary = boundaries.size > 0;
|
|
@@ -132,6 +132,17 @@ export function root(cwd) {
|
|
|
132
132
|
current = parent;
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
+
function npmBoundary(cwd) {
|
|
136
|
+
const candidate = npmRoot(cwd);
|
|
137
|
+
if (!candidate)
|
|
138
|
+
return undefined;
|
|
139
|
+
const resolved = resolve(candidate);
|
|
140
|
+
if (fileStatSync(join(resolved, "package.json"))?.isFile())
|
|
141
|
+
return resolved;
|
|
142
|
+
if (fileStatSync(join(resolved, "node_modules"))?.isDirectory())
|
|
143
|
+
return resolved;
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
135
146
|
/**
|
|
136
147
|
* Parse a git remote URL (`https://...`, `git@host:owner/repo.git`, etc.) and
|
|
137
148
|
* return the repo segment, stripping any `.git` suffix. Returns `undefined` for
|
|
@@ -487,4 +498,4 @@ if (import.meta.main) {
|
|
|
487
498
|
console.log("repository url:", repositoryUrl());
|
|
488
499
|
console.log("repository url (npm):", repositoryUrl(undefined, "npm"));
|
|
489
500
|
}
|
|
490
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBUyxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzdELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbkUsTUFBTSxZQUFZLEdBQUc7SUFDbkIsY0FBYztJQUNkLGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLGNBQWM7Q0FDTixDQUFDO0FBRVgscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxHQUFtQjtJQUN6RCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFpQkQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsMkJBQTJCLENBQUMsT0FBZSxFQUFFLElBQWMsRUFBRSxHQUFXO0lBQy9FLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFN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LE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3ZELE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDcEcsQ0FBQztBQUVELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLGFBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBvc2l0b3J5LCBwYWNrYWdlLCBidW5kbGUsIGFuZCBwcm9qZWN0IGRpc2NvdmVyeSBmb3IgTm9kZSBhbmQgQnVuIHRvb2xzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIHRoZSBzaGFyZWQgb3duZXIgZm9yIHdvcmtpbmctZGlyZWN0b3J5IG5vcm1hbGl6YXRpb24sIHByb2plY3RcbiAqIHJvb3RzLCByZXBvc2l0b3J5IFVSTHMsIHBhY2thZ2UgbmFtZXMsIGFuZCBEYXRhYnJpY2tzIGJ1bmRsZSBjb250ZXh0LiBSZXVzZSBpdFxuICogaW5zdGVhZCBvZiBhZGRpbmcgcGFja2FnZS1sb2NhbCByb290LW1hcmtlciB3YWxrcyBvciBHaXQgcmVtb3RlIHBhcnNpbmcuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFN0YXRzLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGpzb24sIG5ldCwgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVlhbWwgfSBmcm9tIFwieWFtbFwiO1xuaW1wb3J0IHsgY2FjaGVkUmVjb3JkLCBzdGF0U3luYyBhcyBmaWxlU3RhdFN5bmMgfSBmcm9tIFwiLi9maWxlLnRzXCI7XG5cbmNvbnN0IFJPT1RfTUFSS0VSUyA9IFtcbiAgXCIucHJvamVucmMudHNcIixcbiAgXCIucHJvamVucmMuanNcIixcbiAgXCIucHJvamVucmMubWpzXCIsXG4gIFwiLnByb2plbnJjLmNqc1wiLFxuICBcInBhY2thZ2UuanNvblwiLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlc29sdmUgYSBibGFuaywgbnVsbCwgb21pdHRlZCwgcmVsYXRpdmUsIG9yIGFic29sdXRlIGN3ZCB0byBhbiBhYnNvbHV0ZSBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICByZXR1cm4gcmVzb2x2ZShzdHJpbmdVdGlscy50cmltVG9OdWxsKGN3ZCkgPz8gcHJvY2Vzcy5jd2QoKSk7XG59XG5cbi8qKiBBIGNvbW1hbmQncyBzdGRvdXQsIGNsYXNzaWZpZWQgYXMgYSBmaWxlc3lzdGVtIHBhdGggYW5kL29yIGEgVVJMLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Q29udGV4dCB7XG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xuICAvKiogYG91dHB1dGAgd2hlbiBpdCBuYW1lcyBzb21ldGhpbmcgb24gZGlzay4gKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgLyoqIGBmaWxlLnN0YXRTeW5jYCBvZiB7QGxpbmsgcGF0aH0sIHdoZW4gaXQgZXhpc3RzLiAqL1xuICByZWFkb25seSBwYXRoU3RhdHM/OiBTdGF0cztcbiAgLyoqXG4gICAqIGBvdXRwdXRgIHBhcnNlZCBpbnRvIGEgY2hhaW5hYmxlIHtAbGluayBuZXQuVXJsQnVpbGRlcn0sIHdoZW4gaXQgaXMgYSByZWFsXG4gICAqIG5ldHdvcmsgVVJMIC0gYSBub24tYmxhbmsgc2NoZW1lIChub3QgYGZpbGU6YCkgQU5EIGEgbm9uLWJsYW5rIGhvc3RuYW1lLlxuICAgKiBCYXJlIHBhdGhzLCBzY3AtbGlrZSBgZ2l0QGhvc3Q6Li4uYCByZW1vdGVzLCBhbmQgYGZpbGU6YCBVUkxzIHN0YXkgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBuZXQuVXJsQnVpbGRlcjtcbn1cblxuLyoqXG4gKiBiZWNhdXNlIHRoaXMgaXMgY3J1Y2lhbCBkbyBub3QgdXNlIGV4ZWMuc3Bhd25TeW5jXG4gKlxuICogUnVuIGBjb21tYW5kIGFyZ3NgIGluIGBjd2RgIGFuZCBjbGFzc2lmeSBpdHMgc3Rkb3V0OiBgcGF0aGAgKyBgcGF0aFN0YXRzYCB3aGVuXG4gKiB0aGUgb3V0cHV0IG5hbWVzIHNvbWV0aGluZyBvbiBkaXNrLCBgdXJsYCAoYSB7QGxpbmsgbmV0LlVybEJ1aWxkZXJ9KSB3aGVuIGl0XG4gKiBwYXJzZXMgYXMgYSByZWFsIG5ldHdvcmsgVVJMLiBFbXB0eSB7QGxpbmsgUHJvamVjdENvbnRleHR9IG9uIGEgbm9uLXplcm8gZXhpdFxuICogb3IgZW1wdHkgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBQcm9qZWN0Q29udGV4dCB7XG4gIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhjb21tYW5kLCBhcmdzLCB7IGN3ZCwgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJpZ25vcmVcIl0gfSk7XG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdD8uc3Rkb3V0Py50b1N0cmluZygpPy50cmltKCk7XG4gIGlmIChyZXN1bHQuc3RhdHVzID09PSAwICYmIG91dHB1dCkge1xuICAgIGNvbnN0IHBhdGhTdGF0cyA9IGZpbGVTdGF0U3luYyhvdXRwdXQpO1xuICAgIC8vIE9ubHkgYW4gRVhQTElDSVQgYHNjaGVtZTovLy4uLmAgY291bnRzIGFzIGEgVVJMLiBgdXJsQnVpbGRlcmAgb3RoZXJ3aXNlXG4gICAgLy8gc3ludGhlc2l6ZXMgb25lIChhIGJhcmUgYGV4YW1wbGUuY29tYCAtPiBgaHR0cHM6Ly/igKZgLCBhbiBhYnNvbHV0ZSBwYXRoIC0+XG4gICAgLy8gYGh0dHA6Ly9sb2NhbGhvc3Qv4oCmYCksIHdoaWNoIHdvdWxkIG1pc2xhYmVsIGRpcmVjdG9yeSBvdXRwdXRzIGFuZCBiYXJlXG4gICAgLy8gdG9rZW5zIC0gc28gZ2F0ZSBvbiB0aGUgcmF3IG91dHB1dCBhbHJlYWR5IGNhcnJ5aW5nIGEgc2NoZW1lICsgYXV0aG9yaXR5LlxuICAgIGNvbnN0IHVybCA9IC9eW2Etel1bYS16MC05Ky4tXSo6XFwvXFwvL2kudGVzdChvdXRwdXQpID8gbmV0LnVybEJ1aWxkZXIob3V0cHV0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBvdXRwdXQsIHBhdGg6IHBhdGhTdGF0cyA/IG91dHB1dCA6IHVuZGVmaW5lZCwgcGF0aFN0YXRzLCB1cmwgfTtcbiAgfVxuICByZXR1cm4geyBvdXRwdXQgfTtcbn1cblxuY29uc3QgcHJvamVjdENvbW1hbmRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9qZWN0Q29udGV4dD4oKTtcblxuZnVuY3Rpb24gcHJvamVjdENvbnRleHRDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZD86IHN0cmluZyk6IFByb2plY3RDb250ZXh0IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBrZXkgPVxuICAgIHJlc29sdmVkID09PSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeSgpID8gSlNPTi5zdHJpbmdpZnkoW2NvbW1hbmQsIC4uLmFyZ3NdKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcHJvamVjdENvbW1hbmRDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoY29tbWFuZCwgYXJncywgcmVzb2x2ZWQpO1xuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHByb2plY3RDb21tYW5kQ2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbW1hbmRSb290KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkID0gcHJvamVjdENvbnRleHRDb21tYW5kKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIHJldHVybiBwYXJzZWQucGF0aFN0YXRzPy5pc0RpcmVjdG9yeSgpID8gcGFyc2VkLnBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2xvc2VzdCBkaXJlY3Rvcnkgd2l0aCBhIGBwYWNrYWdlLmpzb25gIG9yIGBub2RlX21vZHVsZXNgLCBtYXRjaGluZyBgbnBtIHByZWZpeGAuXG4gKlxuICogTGlmZWN5Y2xlIHNjcmlwdHMgZnJvbSBucG0gYW5kIEJ1biBzZXQgYG5wbV9jb25maWdfbG9jYWxfcHJlZml4YCB0byB0aGF0XG4gKiBkaXJlY3RvcnkuIFJlYWQgaXQgZmlyc3Qgd2hlbiByZXNvbHZpbmcgdGhpcyBwcm9jZXNzJ3MgY3dkIHNvIGEgbWlzc2luZyBucG1cbiAqIENMSSBpcyBub3QgcmVxdWlyZWQuIGBucG1fY29uZmlnX3ByZWZpeGAgLyBgUFJFRklYYCBhcmUgdGhlIGdsb2JhbCBpbnN0YWxsXG4gKiBwcmVmaXggYW5kIG11c3Qgbm90IGJlIHVzZWQgaGVyZS5cbiAqXG4gKiBCdW4gaGFzIG5vIHByZWZpeCBjb21tYW5kIChgYnVuIHBtIGJpbmAgaXMgdGhlIGAuYmluYCBkaXJlY3RvcnkpLiBwbnBtJ3NcbiAqIGBwcmVmaXhgIGNvbW1hbmQgaXMgdW5pbXBsZW1lbnRlZDsgYHBucG0gcm9vdGAgcHJpbnRzIGBub2RlX21vZHVsZXNgLlxuICovXG5mdW5jdGlvbiBucG1Sb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgaWYgKHJlc29sdmVkID09PSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeSgpKSB7XG4gICAgY29uc3QgZnJvbUVudiA9IGVudkRpcmVjdG9yeShwcm9jZXNzLmVudi5ucG1fY29uZmlnX2xvY2FsX3ByZWZpeCk7XG4gICAgaWYgKGZyb21FbnYpIHJldHVybiBmcm9tRW52O1xuICB9XG4gIHJldHVybiBjb21tYW5kUm9vdChcIm5wbVwiLCBbXCJwcmVmaXhcIl0sIHJlc29sdmVkKTtcbn1cblxuZnVuY3Rpb24gZW52RGlyZWN0b3J5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh2YWx1ZSk7XG4gIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHBhdGgpO1xuICByZXR1cm4gZmlsZVN0YXRTeW5jKHJlc29sdmVkKT8uaXNEaXJlY3RvcnkoKSA/IHJlc29sdmVkIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnaXRSb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgcmV0dXJuIGNvbW1hbmRSb290KFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIi0tc2hvdy10b3BsZXZlbFwiXSwgcmVzb2x2ZWQpO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgbmVhcmVzdCBwcm9qZWN0IHJvb3Qgd2l0aG91dCB3YWxraW5nIGFib3ZlIGl0cyBucG0gb3IgR2l0IGJvdW5kYXJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3QoY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBsZXQgY3VycmVudCA9IHJlc29sdmVkO1xuXG4gIGlmICghZmlsZVN0YXRTeW5jKGN1cnJlbnQpPy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgY3VycmVudCA9IGRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgY29uc3QgYm91bmRhcmllcyA9IG5ldyBTZXQoXG4gICAgW25wbVJvb3QocmVzb2x2ZWQpLCBnaXRSb290KHJlc29sdmVkKV1cbiAgICAgIC5maWx0ZXIoKHBhdGgpOiBwYXRoIGlzIHN0cmluZyA9PiBwYXRoICE9PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChwYXRoKSA9PiByZXNvbHZlKHBhdGgpKSxcbiAgKTtcbiAgY29uc3QgaGFzQm91bmRhcnkgPSBib3VuZGFyaWVzLnNpemUgPiAwO1xuICBsZXQgYmVzdDogeyBkaXI6IHN0cmluZzsgcHJpb3JpdHk6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGZvciAoY29uc3QgW3ByaW9yaXR5LCBtYXJrZXJdIG9mIFJPT1RfTUFSS0VSUy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChmaWxlU3RhdFN5bmMoam9pbihjdXJyZW50LCBtYXJrZXIpKT8uaXNGaWxlKCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGJlc3QgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIHByaW9yaXR5IDwgYmVzdC5wcmlvcml0eSB8fFxuICAgICAgICAgIChwcmlvcml0eSA9PT0gYmVzdC5wcmlvcml0eSAmJiBjdXJyZW50Lmxlbmd0aCA8IGJlc3QuZGlyLmxlbmd0aClcbiAgICAgICAgKSB7XG4gICAgICAgICAgYmVzdCA9IHsgZGlyOiBjdXJyZW50LCBwcmlvcml0eSB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc0JvdW5kYXJ5ICYmIGJlc3QpIHtcbiAgICAgIHJldHVybiBiZXN0LmRpcjtcbiAgICB9XG4gICAgaWYgKGJvdW5kYXJpZXMuaGFzKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gYmVzdD8uZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpO1xuICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBiZXN0Py5kaXI7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhIGdpdCByZW1vdGUgVVJMIChgaHR0cHM6Ly8uLi5gLCBgZ2l0QGhvc3Q6b3duZXIvcmVwby5naXRgLCBldGMuKSBhbmRcbiAqIHJldHVybiB0aGUgcmVwbyBzZWdtZW50LCBzdHJpcHBpbmcgYW55IGAuZ2l0YCBzdWZmaXguIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yXG4gKiBlbXB0eSBvciB1bnBhcnNhYmxlIGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHaXRSZW1vdGUodXJsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmltbWVkID0gdXJsLnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNjcCA9IC9eW15AXStAW146XSs6KC4rKSQvaS5leGVjKHRyaW1tZWQpO1xuICBpZiAoc2NwKSByZXR1cm4gbGFzdFBhdGhTZWdtZW50KHNjcFsxXSA/PyBcIlwiKTtcblxuICB0cnkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0cmltbWVkLnJlcGxhY2UoL1xcLmdpdCQvaSwgXCJcIik7XG4gICAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKG5vcm1hbGl6ZWQpLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNlZ21lbnQgPSBwYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmF0KC0xKTtcbiAgICByZXR1cm4gc2VnbWVudCA/IGxhc3RQYXRoU2VnbWVudChzZWdtZW50KSA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXN0UGF0aFNlZ21lbnQocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5hdCgtMSkgPz8gcGF0aDtcbiAgcmV0dXJuIHNlZ21lbnQucmVwbGFjZSgvXFwuZ2l0JC9pLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBZaWVsZCBjYW5kaWRhdGUgcHJvamVjdC1yb290IGRpcmVjdG9yaWVzIGZvciBgY3dkYCwgaW4gcHJpb3JpdHkgb3JkZXI6IHRoZVxuICogYG5wbSBwcmVmaXhgLCB0aGUgZ2l0IHRvcC1sZXZlbCwgdGhlbiBgY3dkYCBpdHNlbGYuIER1cGxpY2F0ZXMgYXJlIHNraXBwZWQ7XG4gKiBvbmx5IGV4aXN0aW5nIGRpcmVjdG9yaWVzIGFyZSB5aWVsZGVkIChleGNlcHQgdGhlIGZpbmFsIGBjd2RgIGZhbGxiYWNrKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uKiByZXNvbHZlUHJvamVjdFJvb3RzKGN3ZD86IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgY29uc3QgYmFzZSA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgW25wbVJvb3QoYmFzZSksIGdpdFJvb3QoYmFzZSldKSB7XG4gICAgaWYgKCFjYW5kaWRhdGUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRpciA9IHJlc29sdmUoY2FuZGlkYXRlKTtcbiAgICBpZiAoc2Vlbi5oYXMoZGlyKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQoZGlyKTtcbiAgICBpZiAoZmlsZVN0YXRTeW5jKGRpcik/LmlzRGlyZWN0b3J5KCkpIHlpZWxkIGRpcjtcbiAgfVxuICBpZiAoIXNlZW4uaGFzKGJhc2UpKSB5aWVsZCBiYXNlO1xufVxuXG4vKiogVGhlIG5lYXJlc3QgYW5jZXN0b3Igb2YgYGN3ZGAgKGZyb20ge0BsaW5rIHJlc29sdmVQcm9qZWN0Um9vdHN9KSB3aXRoIGEgYHBhY2thZ2UuanNvbmAuICovXG5mdW5jdGlvbiB3b3Jrc3BhY2VSb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBsYXN0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZGlyIG9mIHJlc29sdmVQcm9qZWN0Um9vdHMoY3dkKSkge1xuICAgIGlmIChmaWxlU3RhdFN5bmMocmVzb2x2ZShkaXIsIFwicGFja2FnZS5qc29uXCIpKT8uaXNGaWxlKCkpIHJldHVybiBkaXI7XG4gICAgbGFzdCA9IGRpcjtcbiAgfVxuICByZXR1cm4gbGFzdCA/PyByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBodW1hbi1mcmllbmRseSBwcm9qZWN0IG5hbWUgZm9yIHRoZSByZXBvIHJvb3RlZCBhdCBgY3dkYDpcbiAqIGBwYWNrYWdlLmpzb25gIGBuYW1lYCwgdGhlbiB0aGUgZ2l0IHJlbW90ZSdzIHJlcG8gbmFtZSwgdGhlbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5J3MgYmFzZW5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lKGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgY29uc3Qgcm9vdERpciA9IHdvcmtzcGFjZVJvb3QocmVzb2x2ZWQpO1xuXG4gIGNvbnN0IGZyb21QYWNrYWdlID0gcmVhZFBhY2thZ2VOYW1lKHJlc29sdmUocm9vdERpciwgXCJwYWNrYWdlLmpzb25cIikpO1xuICBpZiAoZnJvbVBhY2thZ2UpIHJldHVybiBmcm9tUGFja2FnZTtcblxuICBjb25zdCByZW1vdGUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXG4gICAgXCJnaXRcIixcbiAgICBbXCItQ1wiLCByb290RGlyLCBcInJlbW90ZVwiLCBcImdldC11cmxcIiwgXCJvcmlnaW5cIl0sXG4gICAgcm9vdERpcixcbiAgKS5vdXRwdXQ7XG4gIGNvbnN0IGZyb21HaXQgPSByZW1vdGUgPyBwYXJzZUdpdFJlbW90ZShyZW1vdGUpIDogdW5kZWZpbmVkO1xuICBpZiAoZnJvbUdpdCkgcmV0dXJuIGZyb21HaXQ7XG5cbiAgcmV0dXJuIGJhc2VuYW1lKHJvb3REaXIpO1xufVxuXG4vKipcbiAqIFRoZSBHaXRIdWIgQ0xJJ3MgY2Fub25pY2FsIHJlcG8gVVJMIC0gdGhlIGVhc3kgcGF0aC4gYGdoYCBhbHJlYWR5IHJlc29sdmVzIHRoZVxuICogdHJ1ZSBob3N0IChubyBzc2gtYWxpYXMgcGFyc2luZykgYW5kIHByaW50cyBhIGNsZWFuIGBodHRwczovL2hvc3Qvb3duZXIvcmVwb2AuXG4gKiBgdW5kZWZpbmVkYCB3aGVuIGBnaGAgaXMgYWJzZW50LCB1bmF1dGhlbnRpY2F0ZWQsIG9yIHRoZSBkaXIgaXNuJ3QgYSBHSCByZXBvLlxuICovXG5mdW5jdGlvbiByZXBvc2l0b3J5VXJsRnJvbUdoKGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG91dCA9IHByb2plY3RDb250ZXh0Q29tbWFuZChcImdoXCIsIFtcInJlcG9cIiwgXCJ2aWV3XCIsIFwiLS1qc29uXCIsIFwidXJsXCJdLCBjd2QpLm91dHB1dDtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoanNvbi5wYXJzZVJlY29yZChvdXQpPy51cmwpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqIFJlc29sdmUgYW4gc3NoIGhvc3QgYWxpYXMgKGB+Ly5zc2gvY29uZmlnYCkgdG8gaXRzIGVmZmVjdGl2ZSBgaG9zdG5hbWVgIHZpYSBgc3NoIC1HYC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTc2hIb3N0TmFtZShob3N0OiBzdHJpbmcsIGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbmUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXCJzc2hcIiwgW1wiLUdcIiwgaG9zdF0sIGN3ZClcbiAgICAub3V0cHV0Py5zcGxpdChcIlxcblwiKVxuICAgIC5maW5kKChsKSA9PiAvXmhvc3RuYW1lXFxzL2kudGVzdChsLnRyaW0oKSkpO1xuICBjb25zdCBuYW1lID0gbGluZT8udHJpbSgpLnNwbGl0KC9cXHMrLylbMV07XG4gIHJldHVybiBuYW1lICYmIG5hbWUgIT09IGhvc3QgPyBuYW1lIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZhbGxiYWNrOiBub3JtYWxpemUgYGdpdCByZW1vdGUgZ2V0LXVybCBvcmlnaW5gIHRvIGEgcGxhaW5cbiAqIGBodHRwczovL2hvc3Qvb3duZXIvcmVwb2AgVVJMLiBzY3AtbGlrZSAvIGBzc2g6Ly9gIC8gYGdpdDovL2AgL1xuICogZW1iZWRkZWQtY3JlZGVudGlhbCBmb3JtcyBhcmUgcmV3cml0dGVuIHRvIGh0dHBzLCBhbmQgYW4gc3NoIGhvc3QgYWxpYXMgaXNcbiAqIGZvbGxvd2VkIHRvIGl0cyByZWFsIGhvc3RuYW1lLlxuICovXG5mdW5jdGlvbiByZXBvc2l0b3J5VXJsRnJvbUdpdChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBwcm9qZWN0Q29udGV4dENvbW1hbmQoXCJnaXRcIiwgW1wicmVtb3RlXCIsIFwiZ2V0LXVybFwiLCBcIm9yaWdpblwiXSwgY3dkKS5vdXRwdXQ7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgc2NoZW1lIHRvIGh0dHBzIGF0IHRoZSBzdHJpbmcgbGV2ZWwgZmlyc3Q6IHRoZSBXSEFUV0cgYFVSTGBcbiAgLy8gcGFyc2VyIGNhbid0IGNvbnZlcnQgYSBub24tc3BlY2lhbCBzY2hlbWUgKGBzc2hgL2BnaXRgKSB0byBgaHR0cHNgICh0aGVcbiAgLy8gYHByb3RvY29sYCBzZXR0ZXIgbm8tb3BzKSwgYW5kIHNjcC1saWtlIGBnaXRAaG9zdDpvd25lci9yZXBvYCBpc24ndCBhIFVSTCBhdFxuICAvLyBhbGwuIFJld3JpdGUgYm90aCBpbnRvIGFuIGBodHRwczovL2Agc3RyaW5nLCB0aGVuIGxldCB7QGxpbmsgbmV0LnVybEJ1aWxkZXJ9XG4gIC8vIG93biB0aGUgc3RydWN0dXJlZCBlZGl0cyAoc3RyaXAgY3JlZGVudGlhbHMsIHN3YXAgdGhlIGhvc3QpLlxuICBsZXQgaHR0cHMgPSByYXcucmVwbGFjZSgvXmdpdFxcKy8sIFwiXCIpO1xuICBjb25zdCBzY3AgPSAvXlteQF0rQChbXjpdKyk6KC4rKSQvLmV4ZWMoaHR0cHMpO1xuICBpZiAoc2NwKSBodHRwcyA9IGBodHRwczovLyR7c2NwWzFdfS8ke3NjcFsyXX1gO1xuICBodHRwcyA9IGh0dHBzLnJlcGxhY2UoL14oc3NofGdpdCk6XFwvXFwvLywgXCJodHRwczovL1wiKTtcblxuICBsZXQgYnVpbGRlciA9IG5ldC51cmxCdWlsZGVyKGh0dHBzKTtcbiAgaWYgKCFidWlsZGVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBEcm9wIGFueSBlbWJlZGRlZCBgdXNlcls6cGFzc11AYCBjcmVkZW50aWFscy5cbiAgaWYgKGJ1aWxkZXIudXNlcm5hbWUgfHwgYnVpbGRlci5wYXNzd29yZCkge1xuICAgIGJ1aWxkZXIgPSBidWlsZGVyLndpdGgoXCJ1c2VybmFtZVwiLCBcIlwiKS53aXRoKFwicGFzc3dvcmRcIiwgXCJcIik7XG4gIH1cbiAgLy8gRm9sbG93IGFuIHNzaCBob3N0IGFsaWFzIHRvIHRoZSB0cnVlIGhvc3QgKHNvIGBnaXRodWItcmVnZ2llLWRiYCAtPiBgZ2l0aHViLmNvbWApLlxuICBjb25zdCByZWFsSG9zdCA9IHJlc29sdmVTc2hIb3N0TmFtZShidWlsZGVyLmhvc3RuYW1lLCBjd2QpO1xuICBpZiAocmVhbEhvc3QpIGJ1aWxkZXIgPSBidWlsZGVyLndpdGgoXCJob3N0bmFtZVwiLCByZWFsSG9zdCk7XG5cbiAgcmV0dXJuIGAke2J1aWxkZXIub3JpZ2lufSR7YnVpbGRlci5wYXRobmFtZS5yZXBsYWNlKC9cXC5naXQkLywgXCJcIil9YDtcbn1cblxuLyoqXG4gKiBUaGUgcmVwbydzIGNhbm9uaWNhbCByZW1vdGUgVVJMLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIGdpdCByZW1vdGUuXG4gKiBUcmllcyBgZ2ggcmVwbyB2aWV3YCBmaXJzdCAoaG9zdC1hY2N1cmF0ZSwgbm8gcGFyc2luZyksIHRoZW4gbm9ybWFsaXplc1xuICogYGdpdCByZW1vdGUgZ2V0LXVybCBvcmlnaW5gLiBBIGJsYW5rLCBvbWl0dGVkLCBvciBleHBsaWNpdGx5IGN1cnJlbnQgYGN3ZGBcbiAqIHJldXNlcyBjYWNoZWQgY29tbWFuZCBwcm9iZXM7IGFub3RoZXIgcmVzb2x2ZWQgZGlyZWN0b3J5IGV4ZWN1dGVzIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSBjd2QgLSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBmcm9tIChkZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWApLlxuICogQHBhcmFtIGZvcm1hdCAtIGBcImh0dHBzXCJgIChkZWZhdWx0KSB5aWVsZHMgYGh0dHBzOi8vaG9zdC9vd25lci9yZXBvYDtcbiAqICAgYFwibnBtXCJgIHlpZWxkcyBucG0ncyBgZ2l0K2h0dHBzOi8vaG9zdC9vd25lci9yZXBvLmdpdGAgZm9ybSAoZm9yIGFcbiAqICAgYHBhY2thZ2UuanNvbmAgYHJlcG9zaXRvcnkudXJsYCB0aGF0IHBhc3NlcyBucG0gcHJvdmVuYW5jZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBvc2l0b3J5VXJsKGN3ZD86IHN0cmluZywgZm9ybWF0OiBcImh0dHBzXCIgfCBcIm5wbVwiID0gXCJodHRwc1wiKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBodHRwcyA9IHJlcG9zaXRvcnlVcmxGcm9tR2gocmVzb2x2ZWQpID8/IHJlcG9zaXRvcnlVcmxGcm9tR2l0KHJlc29sdmVkKTtcbiAgaWYgKCFodHRwcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZvcm1hdCA9PT0gXCJucG1cIiA/IGBnaXQrJHtodHRwcy5yZXBsYWNlKC9cXC5naXQkLywgXCJcIil9LmdpdGAgOiBodHRwcztcbn1cblxuLyoqIFB1YmxpYyBucG0sIHVzZWQgb25seSBhZnRlciBlbnYsIG5wbXJjLCBidW5maWcsIGFuZCBwbnBtIHlhbWwgbWlzcy4gKi9cbmNvbnN0IERFRkFVTFRfTlBNX1JFR0lTVFJZID0gXCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9cIjtcblxuLyoqIElucHV0cyB0aGF0IGNvbnRyb2wgYWN0aXZlIG5wbSByZWdpc3RyeSBkaXNjb3ZlcnkuICovXG5leHBvcnQgdHlwZSBOcG1SZWdpc3RyeU9wdGlvbnMgPSB7XG4gIC8qKiBTa2lwIHB1YmxpYyBucG1qcy5vcmcgc28gY2FsbGVycyBjYW4gZGV0ZWN0IGEgY29uZmlndXJlZCBvdmVycmlkZS4gKi9cbiAgb3ZlcnJpZGVPbmx5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlYWQgYG5wbV9jb25maWdfcmVnaXN0cnlgLCBgTlBNX0NPTkZJR19SRUdJU1RSWWAsIGFuZCBgQlVOX0NPTkZJR19SRUdJU1RSWWBcbiAgICogZmlyc3QuIERlZmF1bHRzIHRvIHRydWUgc28gdGhlIHNhbWUgY2FzY2FkZSBhIHBhY2thZ2UgbWFuYWdlciB1c2VzIGlzIHRoZVxuICAgKiBkZWZhdWx0LlxuICAgKi9cbiAgZW52VmFycz86IGJvb2xlYW47XG59O1xuXG5jb25zdCBucG1SZWdpc3RyeUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG5ldC5VcmxCdWlsZGVyIHwgdW5kZWZpbmVkPigpO1xuXG4vKipcbiAqIFRoZSBhY3RpdmUgbnBtIHJlZ2lzdHJ5IGFzIGEgY2hhaW5hYmxlIHtAbGluayBuZXQuVXJsQnVpbGRlcn0uXG4gKlxuICogUmVzb2x1dGlvbiBpcyBtYW5hZ2VyLWFnbm9zdGljIGFuZCBtZW1vaXplZCBwZXIgY3dkIHBsdXMgb3B0aW9uczogZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgdGhlbiBgLm5wbXJjYCAocHJvamVjdCBhbmNlc3RvcnMsIHVzZXIsIGdsb2JhbCksIHRoZW4gQnVuXG4gKiBgYnVuZmlnLnRvbWxgIGBpbnN0YWxsLnJlZ2lzdHJ5YCwgdGhlbiBwbnBtIHdvcmtzcGFjZS9nbG9iYWwgWUFNTCwgdGhlblxuICogYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2AuIGBvdmVycmlkZU9ubHlgIHNraXBzIHRoYXQgcHVibGljIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBucG1SZWdpc3RyeShcbiAgY3dkPzogc3RyaW5nIHwgbnVsbCxcbiAgb3B0aW9ucz86IE5wbVJlZ2lzdHJ5T3B0aW9ucyxcbik6IG5ldC5VcmxCdWlsZGVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBlbnZWYXJzID0gb3B0aW9ucz8uZW52VmFycyAhPT0gZmFsc2U7XG4gIGNvbnN0IG92ZXJyaWRlT25seSA9IEJvb2xlYW4ob3B0aW9ucz8ub3ZlcnJpZGVPbmx5KTtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW1xuICAgIHJlc29sdmVkLFxuICAgIG92ZXJyaWRlT25seSxcbiAgICBlbnZWYXJzLFxuICAgIGhvbWVkaXIoKSxcbiAgICBwcm9jZXNzLmVudi5OUE1fQ09ORklHX1VTRVJDT05GSUcgPz8gXCJcIixcbiAgICBwcm9jZXNzLmVudi5OUE1fQ09ORklHX0dMT0JBTENPTkZJRyA/PyBcIlwiLFxuICAgIHByb2Nlc3MuZW52LlBSRUZJWCA/PyBcIlwiLFxuICAgIGVudlZhcnMgPyAocHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19yZWdpc3RyeSA/PyBcIlwiKSA6IFwiXCIsXG4gICAgZW52VmFycyA/IChwcm9jZXNzLmVudi5OUE1fQ09ORklHX1JFR0lTVFJZID8/IFwiXCIpIDogXCJcIixcbiAgICBlbnZWYXJzID8gKHByb2Nlc3MuZW52LkJVTl9DT05GSUdfUkVHSVNUUlkgPz8gXCJcIikgOiBcIlwiLFxuICBdKTtcbiAgaWYgKG5wbVJlZ2lzdHJ5Q2FjaGUuaGFzKGtleSkpIHJldHVybiBucG1SZWdpc3RyeUNhY2hlLmdldChrZXkpO1xuICBjb25zdCB2YWx1ZSA9IHJlc29sdmVOcG1SZWdpc3RyeShyZXNvbHZlZCwgeyBvdmVycmlkZU9ubHksIGVudlZhcnMgfSk7XG4gIG5wbVJlZ2lzdHJ5Q2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOcG1SZWdpc3RyeShcbiAgY3dkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHsgb3ZlcnJpZGVPbmx5OiBib29sZWFuOyBlbnZWYXJzOiBib29sZWFuIH0sXG4pOiBuZXQuVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIG5wbVJlZ2lzdHJ5Q2FuZGlkYXRlcyhjd2QsIG9wdGlvbnMuZW52VmFycykpIHtcbiAgICBjb25zdCB1cmwgPSB0b1JlZ2lzdHJ5VXJsKGNhbmRpZGF0ZSwgb3B0aW9ucy5vdmVycmlkZU9ubHkpO1xuICAgIGlmICh1cmwpIHJldHVybiB1cmw7XG4gIH1cbiAgcmV0dXJuIHRvUmVnaXN0cnlVcmwoREVGQVVMVF9OUE1fUkVHSVNUUlksIG9wdGlvbnMub3ZlcnJpZGVPbmx5KTtcbn1cblxuZnVuY3Rpb24qIG5wbVJlZ2lzdHJ5Q2FuZGlkYXRlcyhjd2Q6IHN0cmluZywgZW52VmFyczogYm9vbGVhbik6IEdlbmVyYXRvcjxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKGVudlZhcnMpIHtcbiAgICB5aWVsZCBwcm9jZXNzLmVudi5ucG1fY29uZmlnX3JlZ2lzdHJ5O1xuICAgIHlpZWxkIHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfUkVHSVNUUlk7XG4gICAgeWllbGQgcHJvY2Vzcy5lbnYuQlVOX0NPTkZJR19SRUdJU1RSWTtcbiAgfVxuICBmb3IgKGNvbnN0IGRpciBvZiBhbmNlc3RvckRpcnMoY3dkKSkge1xuICAgIHlpZWxkIHJlYWROcG1yY1JlZ2lzdHJ5KGpvaW4oZGlyLCBcIi5ucG1yY1wiKSk7XG4gIH1cbiAgeWllbGQgcmVhZE5wbXJjUmVnaXN0cnkocHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19VU0VSQ09ORklHID8/IGpvaW4oaG9tZWRpcigpLCBcIi5ucG1yY1wiKSk7XG4gIHlpZWxkIHJlYWROcG1yY1JlZ2lzdHJ5KHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfR0xPQkFMQ09ORklHID8/IGRlZmF1bHRHbG9iYWxOcG1yYygpKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgYW5jZXN0b3JEaXJzKGN3ZCkpIHtcbiAgICB5aWVsZCByZWFkQnVuZmlnUmVnaXN0cnkoam9pbihkaXIsIFwiYnVuZmlnLnRvbWxcIikpO1xuICB9XG4gIHlpZWxkIHJlYWRCdW5maWdSZWdpc3RyeShqb2luKGhvbWVkaXIoKSwgXCJidW5maWcudG9tbFwiKSk7XG4gIGZvciAoY29uc3QgZGlyIG9mIGFuY2VzdG9yRGlycyhjd2QpKSB7XG4gICAgeWllbGQgcmVhZFlhbWxSZWdpc3RyeShqb2luKGRpciwgXCJwbnBtLXdvcmtzcGFjZS55YW1sXCIpKTtcbiAgfVxuICBmb3IgKGNvbnN0IHBhdGggb2YgcG5wbUdsb2JhbENvbmZpZ1BhdGhzKCkpIHtcbiAgICB5aWVsZCByZWFkWWFtbFJlZ2lzdHJ5KHBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVnaXN0cnlVcmwoXG4gIGNhbmRpZGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvdmVycmlkZU9ubHk6IGJvb2xlYW4sXG4pOiBuZXQuVXJsQnVpbGRlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKGNhbmRpZGF0ZSk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIodHJpbW1lZCk7XG4gIGlmICghdXJsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob3ZlcnJpZGVPbmx5ICYmIGlzUHVibGljTnBtUmVnaXN0cnkodXJsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHVybDtcbn1cblxuZnVuY3Rpb24gaXNQdWJsaWNOcG1SZWdpc3RyeSh1cmw6IG5ldC5VcmxCdWlsZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiB1cmwuaG9zdG5hbWUgPT09IFwicmVnaXN0cnkubnBtanMub3JnXCI7XG59XG5cbmZ1bmN0aW9uKiBhbmNlc3RvckRpcnMoY3dkOiBzdHJpbmcpOiBHZW5lcmF0b3I8c3RyaW5nPiB7XG4gIGxldCBjdXJyZW50ID0gY3dkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHlpZWxkIGN1cnJlbnQ7XG4gICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShjdXJyZW50KTtcbiAgICBpZiAocGFyZW50ID09PSBjdXJyZW50KSByZXR1cm47XG4gICAgY3VycmVudCA9IHBhcmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0R2xvYmFsTnBtcmMoKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIHJldHVybiBqb2luKHByb2Nlc3MuZW52LlBST0dSQU1EQVRBID8/IFwiQzpcXFxcUHJvZ3JhbURhdGFcIiwgXCJucG1cIiwgXCJldGNcIiwgXCJucG1yY1wiKTtcbiAgfVxuICByZXR1cm4gam9pbihwcm9jZXNzLmVudi5QUkVGSVggPz8gXCIvdXNyL2xvY2FsXCIsIFwiZXRjXCIsIFwibnBtcmNcIik7XG59XG5cbmZ1bmN0aW9uIHBucG1HbG9iYWxDb25maWdQYXRocygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhvbWUgPSBob21lZGlyKCk7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSB7XG4gICAgcmV0dXJuIFtqb2luKGhvbWUsIFwiTGlicmFyeS9QcmVmZXJlbmNlcy9wbnBtL2NvbmZpZy55YW1sXCIpXTtcbiAgfVxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgcmV0dXJuIFtqb2luKHByb2Nlc3MuZW52LkxPQ0FMQVBQREFUQSA/PyBqb2luKGhvbWUsIFwiQXBwRGF0YS9Mb2NhbFwiKSwgXCJwbnBtL2NvbmZpZy55YW1sXCIpXTtcbiAgfVxuICByZXR1cm4gW2pvaW4oaG9tZSwgXCIuY29uZmlnL3BucG0vY29uZmlnLnlhbWxcIildO1xufVxuXG5mdW5jdGlvbiByZWFkTnBtcmNSZWdpc3RyeShwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2FjaGVkUmVjb3JkKGBucG1yYy1yZWdpc3RyeToke3BhdGh9YCwgKCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSByZWFkVGV4dEZpbGUocGF0aCk7XG4gICAgY29uc3QgcmVnaXN0cnkgPSB0ZXh0ID8gcGFyc2VJbmlSZWdpc3RyeSh0ZXh0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVnaXN0cnkgPyB7IHJlZ2lzdHJ5IH0gOiB1bmRlZmluZWQ7XG4gIH0pPy5yZWdpc3RyeTtcbn1cblxuZnVuY3Rpb24gcmVhZEJ1bmZpZ1JlZ2lzdHJ5KHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjYWNoZWRSZWNvcmQoYGJ1bmZpZy1yZWdpc3RyeToke3BhdGh9YCwgKCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSByZWFkVGV4dEZpbGUocGF0aCk7XG4gICAgY29uc3QgcmVnaXN0cnkgPSB0ZXh0ID8gcGFyc2VCdW5maWdSZWdpc3RyeSh0ZXh0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVnaXN0cnkgPyB7IHJlZ2lzdHJ5IH0gOiB1bmRlZmluZWQ7XG4gIH0pPy5yZWdpc3RyeTtcbn1cblxuZnVuY3Rpb24gcmVhZFlhbWxSZWdpc3RyeShwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY2FjaGVkUmVjb3JkKGB5YW1sLXJlZ2lzdHJ5OiR7cGF0aH1gLCAoKSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IHJlYWRUZXh0RmlsZShwYXRoKTtcbiAgICBpZiAoIXRleHQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VZYW1sKHRleHQpO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnNlZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVnaXN0cnkgPSB5YW1sUmVnaXN0cnkocGFyc2VkKTtcbiAgICByZXR1cm4gcmVnaXN0cnkgPyB7IHJlZ2lzdHJ5IH0gOiB1bmRlZmluZWQ7XG4gIH0pPy5yZWdpc3RyeTtcbn1cblxuZnVuY3Rpb24gcmVhZFRleHRGaWxlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZmlsZVN0YXRTeW5jKHBhdGgpPy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIik7XG59XG5cbi8qKiBQYXJzZSBhIGByZWdpc3RyeT1gIGFzc2lnbm1lbnQgZnJvbSBucG1yYyAvIGluaSB0ZXh0LiAqL1xuZnVuY3Rpb24gcGFyc2VJbmlSZWdpc3RyeSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHJhdyBvZiB0ZXh0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICBjb25zdCBsaW5lID0gcmF3LnRyaW0oKTtcbiAgICBpZiAoIWxpbmUgfHwgbGluZS5zdGFydHNXaXRoKFwiI1wiKSB8fCBsaW5lLnN0YXJ0c1dpdGgoXCI7XCIpKSBjb250aW51ZTtcbiAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZihcIj1cIik7XG4gICAgaWYgKGVxID09PSAtMSkgY29udGludWU7XG4gICAgaWYgKGxpbmUuc2xpY2UoMCwgZXEpLnRyaW0oKSAhPT0gXCJyZWdpc3RyeVwiKSBjb250aW51ZTtcbiAgICByZXR1cm4gdW5xdW90ZUluaVZhbHVlKGxpbmUuc2xpY2UoZXEgKyAxKSk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWFkIEJ1biBgaW5zdGFsbC5yZWdpc3RyeWAgZnJvbSBhIGJ1bmZpZy50b21sLiBUYWJsZSBmb3JtXG4gKiBgW2luc3RhbGwucmVnaXN0cnldYCB3aXRoIGB1cmwgPSBcIi4uLlwiYCBpcyBhY2NlcHRlZDsgc2NvcGVkIG1hcHMgYXJlIGlnbm9yZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnUmVnaXN0cnkodGV4dDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHNlY3Rpb24gPSBcIlwiO1xuICBmb3IgKGNvbnN0IHJhdyBvZiB0ZXh0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICBjb25zdCBsaW5lID0gc3RyaXBUb21sQ29tbWVudChyYXcpLnRyaW0oKTtcbiAgICBpZiAoIWxpbmUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGhlYWRlciA9IC9eXFxbKFteXFxdXSspXFxdJC8uZXhlYyhsaW5lKTtcbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBzZWN0aW9uID0gaGVhZGVyWzFdIS50cmltKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZXEgPSBsaW5lLmluZGV4T2YoXCI9XCIpO1xuICAgIGlmIChlcSA9PT0gLTEpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGtleSA9IGxpbmUuc2xpY2UoMCwgZXEpLnRyaW0oKTtcbiAgICBjb25zdCB2YWx1ZSA9IHVucXVvdGVJbmlWYWx1ZShsaW5lLnNsaWNlKGVxICsgMSkpO1xuICAgIGlmIChzZWN0aW9uID09PSBcImluc3RhbGxcIiAmJiBrZXkgPT09IFwicmVnaXN0cnlcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAoc2VjdGlvbiA9PT0gXCJpbnN0YWxsLnJlZ2lzdHJ5XCIgJiYga2V5ID09PSBcInVybFwiKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKCFzZWN0aW9uICYmIGtleSA9PT0gXCJpbnN0YWxsLnJlZ2lzdHJ5XCIpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB5YW1sUmVnaXN0cnkoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIGRhdGEucmVnaXN0cnkgPT09IFwic3RyaW5nXCIpIHJldHVybiBkYXRhLnJlZ2lzdHJ5O1xuICBjb25zdCByZWdpc3RyaWVzID0gZGF0YS5yZWdpc3RyaWVzO1xuICBpZiAob2JqZWN0LmlzUmVjb3JkKHJlZ2lzdHJpZXMpICYmIHR5cGVvZiByZWdpc3RyaWVzLmRlZmF1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gcmVnaXN0cmllcy5kZWZhdWx0O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHVucXVvdGVJbmlWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgY29uc3QgY29tbWVudCA9IHRyaW1tZWQuc2VhcmNoKC9cXHMrIy8pO1xuICBjb25zdCByYXcgPSBjb21tZW50ID09PSAtMSA/IHRyaW1tZWQgOiB0cmltbWVkLnNsaWNlKDAsIGNvbW1lbnQpLnRyaW0oKTtcbiAgaWYgKChyYXcuc3RhcnRzV2l0aCgnXCInKSAmJiByYXcuZW5kc1dpdGgoJ1wiJykpIHx8IChyYXcuc3RhcnRzV2l0aChcIidcIikgJiYgcmF3LmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICByZXR1cm4gcmF3LnNsaWNlKDEsIC0xKTtcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuXG5mdW5jdGlvbiBzdHJpcFRvbWxDb21tZW50KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2ggPSBsaW5lLmluZGV4T2YoXCIjXCIpO1xuICByZXR1cm4gaGFzaCA9PT0gLTEgPyBsaW5lIDogbGluZS5zbGljZSgwLCBoYXNoKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VOYW1lKHBrZ1BhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZmlsZVN0YXRTeW5jKHBrZ1BhdGgpPy5pc0ZpbGUoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoanNvbi5wYXJzZVJlY29yZChyZWFkRmlsZVN5bmMocGtnUGF0aCwgXCJ1dGY4XCIpKT8ubmFtZSkgPz8gdW5kZWZpbmVkO1xufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zb2xlLmxvZyhcIm5wbSByb290OlwiLCBucG1Sb290KCkpO1xuICBjb25zb2xlLmxvZyhcInJlcG8gcm9vdDpcIiwgZ2l0Um9vdCgpKTtcbiAgY29uc29sZS5sb2coXCJwYWNrYWdlIHJvb3Q6XCIsIHJvb3QoKSk7XG4gIGNvbnNvbGUubG9nKFwicHJvamVjdCBuYW1lOlwiLCBuYW1lKCkpO1xuICBjb25zb2xlLmxvZyhcInJlcG9zaXRvcnkgdXJsOlwiLCByZXBvc2l0b3J5VXJsKCkpO1xuICBjb25zb2xlLmxvZyhcInJlcG9zaXRvcnkgdXJsIChucG0pOlwiLCByZXBvc2l0b3J5VXJsKHVuZGVmaW5lZCwgXCJucG1cIikpO1xufVxuIl19
|
|
501
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBUyxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzdELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbkUsTUFBTSxZQUFZLEdBQUc7SUFDbkIsY0FBYztJQUNkLGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLGNBQWM7Q0FDTixDQUFDO0FBRVgscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxHQUFtQjtJQUN6RCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFpQkQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsMkJBQTJCLENBQUMsT0FBZSxFQUFFLElBQWMsRUFBRSxHQUFXO0lBQy9FLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFN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QUF1QixFQUFFLGFBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBvc2l0b3J5LCBwYWNrYWdlLCBidW5kbGUsIGFuZCBwcm9qZWN0IGRpc2NvdmVyeSBmb3IgTm9kZSBhbmQgQnVuIHRvb2xzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIHRoZSBzaGFyZWQgb3duZXIgZm9yIHdvcmtpbmctZGlyZWN0b3J5IG5vcm1hbGl6YXRpb24sIHByb2plY3RcbiAqIHJvb3RzLCByZXBvc2l0b3J5IFVSTHMsIHBhY2thZ2UgbmFtZXMsIGFuZCBEYXRhYnJpY2tzIGJ1bmRsZSBjb250ZXh0LiBSZXVzZSBpdFxuICogaW5zdGVhZCBvZiBhZGRpbmcgcGFja2FnZS1sb2NhbCByb290LW1hcmtlciB3YWxrcyBvciBHaXQgcmVtb3RlIHBhcnNpbmcuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFN0YXRzLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGpzb24sIG5ldCwgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVlhbWwgfSBmcm9tIFwieWFtbFwiO1xuaW1wb3J0IHsgY2FjaGVkUmVjb3JkLCBzdGF0U3luYyBhcyBmaWxlU3RhdFN5bmMgfSBmcm9tIFwiLi9maWxlLnRzXCI7XG5cbmNvbnN0IFJPT1RfTUFSS0VSUyA9IFtcbiAgXCIucHJvamVucmMudHNcIixcbiAgXCIucHJvamVucmMuanNcIixcbiAgXCIucHJvamVucmMubWpzXCIsXG4gIFwiLnByb2plbnJjLmNqc1wiLFxuICBcInBhY2thZ2UuanNvblwiLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlc29sdmUgYSBibGFuaywgbnVsbCwgb21pdHRlZCwgcmVsYXRpdmUsIG9yIGFic29sdXRlIGN3ZCB0byBhbiBhYnNvbHV0ZSBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICByZXR1cm4gcmVzb2x2ZShzdHJpbmdVdGlscy50cmltVG9OdWxsKGN3ZCkgPz8gcHJvY2Vzcy5jd2QoKSk7XG59XG5cbi8qKiBBIGNvbW1hbmQncyBzdGRvdXQsIGNsYXNzaWZpZWQgYXMgYSBmaWxlc3lzdGVtIHBhdGggYW5kL29yIGEgVVJMLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Q29udGV4dCB7XG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xuICAvKiogYG91dHB1dGAgd2hlbiBpdCBuYW1lcyBzb21ldGhpbmcgb24gZGlzay4gKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgLyoqIGBmaWxlLnN0YXRTeW5jYCBvZiB7QGxpbmsgcGF0aH0sIHdoZW4gaXQgZXhpc3RzLiAqL1xuICByZWFkb25seSBwYXRoU3RhdHM/OiBTdGF0cztcbiAgLyoqXG4gICAqIGBvdXRwdXRgIHBhcnNlZCBpbnRvIGEgY2hhaW5hYmxlIHtAbGluayBuZXQuVXJsQnVpbGRlcn0sIHdoZW4gaXQgaXMgYSByZWFsXG4gICAqIG5ldHdvcmsgVVJMIC0gYSBub24tYmxhbmsgc2NoZW1lIChub3QgYGZpbGU6YCkgQU5EIGEgbm9uLWJsYW5rIGhvc3RuYW1lLlxuICAgKiBCYXJlIHBhdGhzLCBzY3AtbGlrZSBgZ2l0QGhvc3Q6Li4uYCByZW1vdGVzLCBhbmQgYGZpbGU6YCBVUkxzIHN0YXkgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBuZXQuVXJsQnVpbGRlcjtcbn1cblxuLyoqXG4gKiBiZWNhdXNlIHRoaXMgaXMgY3J1Y2lhbCBkbyBub3QgdXNlIGV4ZWMuc3Bhd25TeW5jXG4gKlxuICogUnVuIGBjb21tYW5kIGFyZ3NgIGluIGBjd2RgIGFuZCBjbGFzc2lmeSBpdHMgc3Rkb3V0OiBgcGF0aGAgKyBgcGF0aFN0YXRzYCB3aGVuXG4gKiB0aGUgb3V0cHV0IG5hbWVzIHNvbWV0aGluZyBvbiBkaXNrLCBgdXJsYCAoYSB7QGxpbmsgbmV0LlVybEJ1aWxkZXJ9KSB3aGVuIGl0XG4gKiBwYXJzZXMgYXMgYSByZWFsIG5ldHdvcmsgVVJMLiBFbXB0eSB7QGxpbmsgUHJvamVjdENvbnRleHR9IG9uIGEgbm9uLXplcm8gZXhpdFxuICogb3IgZW1wdHkgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBQcm9qZWN0Q29udGV4dCB7XG4gIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhjb21tYW5kLCBhcmdzLCB7IGN3ZCwgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJpZ25vcmVcIl0gfSk7XG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdD8uc3Rkb3V0Py50b1N0cmluZygpPy50cmltKCk7XG4gIGlmIChyZXN1bHQuc3RhdHVzID09PSAwICYmIG91dHB1dCkge1xuICAgIGNvbnN0IHBhdGhTdGF0cyA9IGZpbGVTdGF0U3luYyhvdXRwdXQpO1xuICAgIC8vIE9ubHkgYW4gRVhQTElDSVQgYHNjaGVtZTovLy4uLmAgY291bnRzIGFzIGEgVVJMLiBgdXJsQnVpbGRlcmAgb3RoZXJ3aXNlXG4gICAgLy8gc3ludGhlc2l6ZXMgb25lIChhIGJhcmUgYGV4YW1wbGUuY29tYCAtPiBgaHR0cHM6Ly/igKZgLCBhbiBhYnNvbHV0ZSBwYXRoIC0+XG4gICAgLy8gYGh0dHA6Ly9sb2NhbGhvc3Qv4oCmYCksIHdoaWNoIHdvdWxkIG1pc2xhYmVsIGRpcmVjdG9yeSBvdXRwdXRzIGFuZCBiYXJlXG4gICAgLy8gdG9rZW5zIC0gc28gZ2F0ZSBvbiB0aGUgcmF3IG91dHB1dCBhbHJlYWR5IGNhcnJ5aW5nIGEgc2NoZW1lICsgYXV0aG9yaXR5LlxuICAgIGNvbnN0IHVybCA9IC9eW2Etel1bYS16MC05Ky4tXSo6XFwvXFwvL2kudGVzdChvdXRwdXQpID8gbmV0LnVybEJ1aWxkZXIob3V0cHV0KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBvdXRwdXQsIHBhdGg6IHBhdGhTdGF0cyA/IG91dHB1dCA6IHVuZGVmaW5lZCwgcGF0aFN0YXRzLCB1cmwgfTtcbiAgfVxuICByZXR1cm4geyBvdXRwdXQgfTtcbn1cblxuY29uc3QgcHJvamVjdENvbW1hbmRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9qZWN0Q29udGV4dD4oKTtcblxuZnVuY3Rpb24gcHJvamVjdENvbnRleHRDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZD86IHN0cmluZyk6IFByb2plY3RDb250ZXh0IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCBrZXkgPVxuICAgIHJlc29sdmVkID09PSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeSgpID8gSlNPTi5zdHJpbmdpZnkoW2NvbW1hbmQsIC4uLmFyZ3NdKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcHJvamVjdENvbW1hbmRDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBwcm9qZWN0Q29udGV4dENvbW1hbmRPdXRwdXQoY29tbWFuZCwgYXJncywgcmVzb2x2ZWQpO1xuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHByb2plY3RDb21tYW5kQ2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbW1hbmRSb290KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkID0gcHJvamVjdENvbnRleHRDb21tYW5kKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIHJldHVybiBwYXJzZWQucGF0aFN0YXRzPy5pc0RpcmVjdG9yeSgpID8gcGFyc2VkLnBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2xvc2VzdCBkaXJlY3Rvcnkgd2l0aCBhIGBwYWNrYWdlLmpzb25gIG9yIGBub2RlX21vZHVsZXNgLCBtYXRjaGluZyBgbnBtIHByZWZpeGAuXG4gKlxuICogTGlmZWN5Y2xlIHNjcmlwdHMgZnJvbSBucG0gYW5kIEJ1biBzZXQgYG5wbV9jb25maWdfbG9jYWxfcHJlZml4YCB0byB0aGF0XG4gKiBkaXJlY3RvcnkuIFJlYWQgaXQgZmlyc3Qgd2hlbiByZXNvbHZpbmcgdGhpcyBwcm9jZXNzJ3MgY3dkIHNvIGEgbWlzc2luZyBucG1cbiAqIENMSSBpcyBub3QgcmVxdWlyZWQuIGBucG1fY29uZmlnX3ByZWZpeGAgLyBgUFJFRklYYCBhcmUgdGhlIGdsb2JhbCBpbnN0YWxsXG4gKiBwcmVmaXggYW5kIG11c3Qgbm90IGJlIHVzZWQgaGVyZS5cbiAqXG4gKiBCdW4gaGFzIG5vIHByZWZpeCBjb21tYW5kIChgYnVuIHBtIGJpbmAgaXMgdGhlIGAuYmluYCBkaXJlY3RvcnkpLiBwbnBtJ3NcbiAqIGBwcmVmaXhgIGNvbW1hbmQgaXMgdW5pbXBsZW1lbnRlZDsgYHBucG0gcm9vdGAgcHJpbnRzIGBub2RlX21vZHVsZXNgLlxuICovXG5mdW5jdGlvbiBucG1Sb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgaWYgKHJlc29sdmVkID09PSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeSgpKSB7XG4gICAgY29uc3QgZnJvbUVudiA9IGVudkRpcmVjdG9yeShwcm9jZXNzLmVudi5ucG1fY29uZmlnX2xvY2FsX3ByZWZpeCk7XG4gICAgaWYgKGZyb21FbnYpIHJldHVybiBmcm9tRW52O1xuICB9XG4gIHJldHVybiBjb21tYW5kUm9vdChcIm5wbVwiLCBbXCJwcmVmaXhcIl0sIHJlc29sdmVkKTtcbn1cblxuZnVuY3Rpb24gZW52RGlyZWN0b3J5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh2YWx1ZSk7XG4gIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHBhdGgpO1xuICByZXR1cm4gZmlsZVN0YXRTeW5jKHJlc29sdmVkKT8uaXNEaXJlY3RvcnkoKSA/IHJlc29sdmVkIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnaXRSb290KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgcmV0dXJuIGNvbW1hbmRSb290KFwiZ2l0XCIsIFtcInJldi1wYXJzZVwiLCBcIi0tc2hvdy10b3BsZXZlbFwiXSwgcmVzb2x2ZWQpO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgbmVhcmVzdCBwcm9qZWN0IHJvb3Qgd2l0aG91dCB3YWxraW5nIGFib3ZlIGl0cyBucG0gb3IgR2l0IGJvdW5kYXJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3QoY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBsZXQgY3VycmVudCA9IHJlc29sdmVkO1xuXG4gIGlmICghZmlsZVN0YXRTeW5jKGN1cnJlbnQpPy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgY3VycmVudCA9IGRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgY29uc3QgYm91bmRhcmllcyA9IG5ldyBTZXQoXG4gICAgW25wbUJvdW5kYXJ5KHJlc29sdmVkKSwgZ2l0Um9vdChyZXNvbHZlZCldXG4gICAgICAuZmlsdGVyKChwYXRoKTogcGF0aCBpcyBzdHJpbmcgPT4gcGF0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgocGF0aCkgPT4gcmVzb2x2ZShwYXRoKSksXG4gICk7XG4gIGNvbnN0IGhhc0JvdW5kYXJ5ID0gYm91bmRhcmllcy5zaXplID4gMDtcbiAgbGV0IGJlc3Q6IHsgZGlyOiBzdHJpbmc7IHByaW9yaXR5OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBmb3IgKGNvbnN0IFtwcmlvcml0eSwgbWFya2VyXSBvZiBST09UX01BUktFUlMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZmlsZVN0YXRTeW5jKGpvaW4oY3VycmVudCwgbWFya2VyKSk/LmlzRmlsZSgpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBiZXN0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBwcmlvcml0eSA8IGJlc3QucHJpb3JpdHkgfHxcbiAgICAgICAgICAocHJpb3JpdHkgPT09IGJlc3QucHJpb3JpdHkgJiYgY3VycmVudC5sZW5ndGggPCBiZXN0LmRpci5sZW5ndGgpXG4gICAgICAgICkge1xuICAgICAgICAgIGJlc3QgPSB7IGRpcjogY3VycmVudCwgcHJpb3JpdHkgfTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNCb3VuZGFyeSAmJiBiZXN0KSB7XG4gICAgICByZXR1cm4gYmVzdC5kaXI7XG4gICAgfVxuICAgIGlmIChib3VuZGFyaWVzLmhhcyhjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGJlc3Q/LmRpcjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShjdXJyZW50KTtcbiAgICBpZiAocGFyZW50ID09PSBjdXJyZW50KSB7XG4gICAgICByZXR1cm4gYmVzdD8uZGlyO1xuICAgIH1cbiAgICBjdXJyZW50ID0gcGFyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIG5wbUJvdW5kYXJ5KGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FuZGlkYXRlID0gbnBtUm9vdChjd2QpO1xuICBpZiAoIWNhbmRpZGF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGNhbmRpZGF0ZSk7XG4gIGlmIChmaWxlU3RhdFN5bmMoam9pbihyZXNvbHZlZCwgXCJwYWNrYWdlLmpzb25cIikpPy5pc0ZpbGUoKSkgcmV0dXJuIHJlc29sdmVkO1xuICBpZiAoZmlsZVN0YXRTeW5jKGpvaW4ocmVzb2x2ZWQsIFwibm9kZV9tb2R1bGVzXCIpKT8uaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHJlc29sdmVkO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgZ2l0IHJlbW90ZSBVUkwgKGBodHRwczovLy4uLmAsIGBnaXRAaG9zdDpvd25lci9yZXBvLmdpdGAsIGV0Yy4pIGFuZFxuICogcmV0dXJuIHRoZSByZXBvIHNlZ21lbnQsIHN0cmlwcGluZyBhbnkgYC5naXRgIHN1ZmZpeC4gUmV0dXJucyBgdW5kZWZpbmVkYCBmb3JcbiAqIGVtcHR5IG9yIHVucGFyc2FibGUgaW5wdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdpdFJlbW90ZSh1cmw6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRyaW1tZWQgPSB1cmwudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc2NwID0gL15bXkBdK0BbXjpdKzooLispJC9pLmV4ZWModHJpbW1lZCk7XG4gIGlmIChzY3ApIHJldHVybiBsYXN0UGF0aFNlZ21lbnQoc2NwWzFdID8/IFwiXCIpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRyaW1tZWQucmVwbGFjZSgvXFwuZ2l0JC9pLCBcIlwiKTtcbiAgICBjb25zdCBwYXRobmFtZSA9IG5ldyBVUkwobm9ybWFsaXplZCkucGF0aG5hbWU7XG4gICAgY29uc3Qgc2VnbWVudCA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikuYXQoLTEpO1xuICAgIHJldHVybiBzZWdtZW50ID8gbGFzdFBhdGhTZWdtZW50KHNlZ21lbnQpIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxhc3RQYXRoU2VnbWVudChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzZWdtZW50ID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmF0KC0xKSA/PyBwYXRoO1xuICByZXR1cm4gc2VnbWVudC5yZXBsYWNlKC9cXC5naXQkL2ksIFwiXCIpO1xufVxuXG4vKipcbiAqIFlpZWxkIGNhbmRpZGF0ZSBwcm9qZWN0LXJvb3QgZGlyZWN0b3JpZXMgZm9yIGBjd2RgLCBpbiBwcmlvcml0eSBvcmRlcjogdGhlXG4gKiBgbnBtIHByZWZpeGAsIHRoZSBnaXQgdG9wLWxldmVsLCB0aGVuIGBjd2RgIGl0c2VsZi4gRHVwbGljYXRlcyBhcmUgc2tpcHBlZDtcbiAqIG9ubHkgZXhpc3RpbmcgZGlyZWN0b3JpZXMgYXJlIHlpZWxkZWQgKGV4Y2VwdCB0aGUgZmluYWwgYGN3ZGAgZmFsbGJhY2spLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIHJlc29sdmVQcm9qZWN0Um9vdHMoY3dkPzogc3RyaW5nKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICBjb25zdCBiYXNlID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBbbnBtUm9vdChiYXNlKSwgZ2l0Um9vdChiYXNlKV0pIHtcbiAgICBpZiAoIWNhbmRpZGF0ZSkgY29udGludWU7XG4gICAgY29uc3QgZGlyID0gcmVzb2x2ZShjYW5kaWRhdGUpO1xuICAgIGlmIChzZWVuLmhhcyhkaXIpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZChkaXIpO1xuICAgIGlmIChmaWxlU3RhdFN5bmMoZGlyKT8uaXNEaXJlY3RvcnkoKSkgeWllbGQgZGlyO1xuICB9XG4gIGlmICghc2Vlbi5oYXMoYmFzZSkpIHlpZWxkIGJhc2U7XG59XG5cbi8qKiBUaGUgbmVhcmVzdCBhbmNlc3RvciBvZiBgY3dkYCAoZnJvbSB7QGxpbmsgcmVzb2x2ZVByb2plY3RSb290c30pIHdpdGggYSBgcGFja2FnZS5qc29uYC4gKi9cbmZ1bmN0aW9uIHdvcmtzcGFjZVJvb3QoY3dkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGxhc3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBkaXIgb2YgcmVzb2x2ZVByb2plY3RSb290cyhjd2QpKSB7XG4gICAgaWYgKGZpbGVTdGF0U3luYyhyZXNvbHZlKGRpciwgXCJwYWNrYWdlLmpzb25cIikpPy5pc0ZpbGUoKSkgcmV0dXJuIGRpcjtcbiAgICBsYXN0ID0gZGlyO1xuICB9XG4gIHJldHVybiBsYXN0ID8/IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGh1bWFuLWZyaWVuZGx5IHByb2plY3QgbmFtZSBmb3IgdGhlIHJlcG8gcm9vdGVkIGF0IGBjd2RgOlxuICogYHBhY2thZ2UuanNvbmAgYG5hbWVgLCB0aGVuIHRoZSBnaXQgcmVtb3RlJ3MgcmVwbyBuYW1lLCB0aGVuIHRoZSByb290XG4gKiBkaXJlY3RvcnkncyBiYXNlbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hbWUoY3dkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICBjb25zdCByb290RGlyID0gd29ya3NwYWNlUm9vdChyZXNvbHZlZCk7XG5cbiAgY29uc3QgZnJvbVBhY2thZ2UgPSByZWFkUGFja2FnZU5hbWUocmVzb2x2ZShyb290RGlyLCBcInBhY2thZ2UuanNvblwiKSk7XG4gIGlmIChmcm9tUGFja2FnZSkgcmV0dXJuIGZyb21QYWNrYWdlO1xuXG4gIGNvbnN0IHJlbW90ZSA9IHByb2plY3RDb250ZXh0Q29tbWFuZChcbiAgICBcImdpdFwiLFxuICAgIFtcIi1DXCIsIHJvb3REaXIsIFwicmVtb3RlXCIsIFwiZ2V0LXVybFwiLCBcIm9yaWdpblwiXSxcbiAgICByb290RGlyLFxuICApLm91dHB1dDtcbiAgY29uc3QgZnJvbUdpdCA9IHJlbW90ZSA/IHBhcnNlR2l0UmVtb3RlKHJlbW90ZSkgOiB1bmRlZmluZWQ7XG4gIGlmIChmcm9tR2l0KSByZXR1cm4gZnJvbUdpdDtcblxuICByZXR1cm4gYmFzZW5hbWUocm9vdERpcik7XG59XG5cbi8qKlxuICogVGhlIEdpdEh1YiBDTEkncyBjYW5vbmljYWwgcmVwbyBVUkwgLSB0aGUgZWFzeSBwYXRoLiBgZ2hgIGFscmVhZHkgcmVzb2x2ZXMgdGhlXG4gKiB0cnVlIGhvc3QgKG5vIHNzaC1hbGlhcyBwYXJzaW5nKSBhbmQgcHJpbnRzIGEgY2xlYW4gYGh0dHBzOi8vaG9zdC9vd25lci9yZXBvYC5cbiAqIGB1bmRlZmluZWRgIHdoZW4gYGdoYCBpcyBhYnNlbnQsIHVuYXV0aGVudGljYXRlZCwgb3IgdGhlIGRpciBpc24ndCBhIEdIIHJlcG8uXG4gKi9cbmZ1bmN0aW9uIHJlcG9zaXRvcnlVcmxGcm9tR2goY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0ID0gcHJvamVjdENvbnRleHRDb21tYW5kKFwiZ2hcIiwgW1wicmVwb1wiLCBcInZpZXdcIiwgXCItLWpzb25cIiwgXCJ1cmxcIl0sIGN3ZCkub3V0cHV0O1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChqc29uLnBhcnNlUmVjb3JkKG91dCk/LnVybCkgPz8gdW5kZWZpbmVkO1xufVxuXG4vKiogUmVzb2x2ZSBhbiBzc2ggaG9zdCBhbGlhcyAoYH4vLnNzaC9jb25maWdgKSB0byBpdHMgZWZmZWN0aXZlIGBob3N0bmFtZWAgdmlhIGBzc2ggLUdgLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNzaEhvc3ROYW1lKGhvc3Q6IHN0cmluZywgY3dkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbGluZSA9IHByb2plY3RDb250ZXh0Q29tbWFuZChcInNzaFwiLCBbXCItR1wiLCBob3N0XSwgY3dkKVxuICAgIC5vdXRwdXQ/LnNwbGl0KFwiXFxuXCIpXG4gICAgLmZpbmQoKGwpID0+IC9eaG9zdG5hbWVcXHMvaS50ZXN0KGwudHJpbSgpKSk7XG4gIGNvbnN0IG5hbWUgPSBsaW5lPy50cmltKCkuc3BsaXQoL1xccysvKVsxXTtcbiAgcmV0dXJuIG5hbWUgJiYgbmFtZSAhPT0gaG9zdCA/IG5hbWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmFsbGJhY2s6IG5vcm1hbGl6ZSBgZ2l0IHJlbW90ZSBnZXQtdXJsIG9yaWdpbmAgdG8gYSBwbGFpblxuICogYGh0dHBzOi8vaG9zdC9vd25lci9yZXBvYCBVUkwuIHNjcC1saWtlIC8gYHNzaDovL2AgLyBgZ2l0Oi8vYCAvXG4gKiBlbWJlZGRlZC1jcmVkZW50aWFsIGZvcm1zIGFyZSByZXdyaXR0ZW4gdG8gaHR0cHMsIGFuZCBhbiBzc2ggaG9zdCBhbGlhcyBpc1xuICogZm9sbG93ZWQgdG8gaXRzIHJlYWwgaG9zdG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHJlcG9zaXRvcnlVcmxGcm9tR2l0KGN3ZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHByb2plY3RDb250ZXh0Q29tbWFuZChcImdpdFwiLCBbXCJyZW1vdGVcIiwgXCJnZXQtdXJsXCIsIFwib3JpZ2luXCJdLCBjd2QpLm91dHB1dDtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBzY2hlbWUgdG8gaHR0cHMgYXQgdGhlIHN0cmluZyBsZXZlbCBmaXJzdDogdGhlIFdIQVRXRyBgVVJMYFxuICAvLyBwYXJzZXIgY2FuJ3QgY29udmVydCBhIG5vbi1zcGVjaWFsIHNjaGVtZSAoYHNzaGAvYGdpdGApIHRvIGBodHRwc2AgKHRoZVxuICAvLyBgcHJvdG9jb2xgIHNldHRlciBuby1vcHMpLCBhbmQgc2NwLWxpa2UgYGdpdEBob3N0Om93bmVyL3JlcG9gIGlzbid0IGEgVVJMIGF0XG4gIC8vIGFsbC4gUmV3cml0ZSBib3RoIGludG8gYW4gYGh0dHBzOi8vYCBzdHJpbmcsIHRoZW4gbGV0IHtAbGluayBuZXQudXJsQnVpbGRlcn1cbiAgLy8gb3duIHRoZSBzdHJ1Y3R1cmVkIGVkaXRzIChzdHJpcCBjcmVkZW50aWFscywgc3dhcCB0aGUgaG9zdCkuXG4gIGxldCBodHRwcyA9IHJhdy5yZXBsYWNlKC9eZ2l0XFwrLywgXCJcIik7XG4gIGNvbnN0IHNjcCA9IC9eW15AXStAKFteOl0rKTooLispJC8uZXhlYyhodHRwcyk7XG4gIGlmIChzY3ApIGh0dHBzID0gYGh0dHBzOi8vJHtzY3BbMV19LyR7c2NwWzJdfWA7XG4gIGh0dHBzID0gaHR0cHMucmVwbGFjZSgvXihzc2h8Z2l0KTpcXC9cXC8vLCBcImh0dHBzOi8vXCIpO1xuXG4gIGxldCBidWlsZGVyID0gbmV0LnVybEJ1aWxkZXIoaHR0cHMpO1xuICBpZiAoIWJ1aWxkZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIERyb3AgYW55IGVtYmVkZGVkIGB1c2VyWzpwYXNzXUBgIGNyZWRlbnRpYWxzLlxuICBpZiAoYnVpbGRlci51c2VybmFtZSB8fCBidWlsZGVyLnBhc3N3b3JkKSB7XG4gICAgYnVpbGRlciA9IGJ1aWxkZXIud2l0aChcInVzZXJuYW1lXCIsIFwiXCIpLndpdGgoXCJwYXNzd29yZFwiLCBcIlwiKTtcbiAgfVxuICAvLyBGb2xsb3cgYW4gc3NoIGhvc3QgYWxpYXMgdG8gdGhlIHRydWUgaG9zdCAoc28gYGdpdGh1Yi1yZWdnaWUtZGJgIC0+IGBnaXRodWIuY29tYCkuXG4gIGNvbnN0IHJlYWxIb3N0ID0gcmVzb2x2ZVNzaEhvc3ROYW1lKGJ1aWxkZXIuaG9zdG5hbWUsIGN3ZCk7XG4gIGlmIChyZWFsSG9zdCkgYnVpbGRlciA9IGJ1aWxkZXIud2l0aChcImhvc3RuYW1lXCIsIHJlYWxIb3N0KTtcblxuICByZXR1cm4gYCR7YnVpbGRlci5vcmlnaW59JHtidWlsZGVyLnBhdGhuYW1lLnJlcGxhY2UoL1xcLmdpdCQvLCBcIlwiKX1gO1xufVxuXG4vKipcbiAqIFRoZSByZXBvJ3MgY2Fub25pY2FsIHJlbW90ZSBVUkwsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gZ2l0IHJlbW90ZS5cbiAqIFRyaWVzIGBnaCByZXBvIHZpZXdgIGZpcnN0IChob3N0LWFjY3VyYXRlLCBubyBwYXJzaW5nKSwgdGhlbiBub3JtYWxpemVzXG4gKiBgZ2l0IHJlbW90ZSBnZXQtdXJsIG9yaWdpbmAuIEEgYmxhbmssIG9taXR0ZWQsIG9yIGV4cGxpY2l0bHkgY3VycmVudCBgY3dkYFxuICogcmV1c2VzIGNhY2hlZCBjb21tYW5kIHByb2JlczsgYW5vdGhlciByZXNvbHZlZCBkaXJlY3RvcnkgZXhlY3V0ZXMgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIGN3ZCAtIGRpcmVjdG9yeSB0byByZXNvbHZlIGZyb20gKGRlZmF1bHRzIHRvIGBwcm9jZXNzLmN3ZCgpYCkuXG4gKiBAcGFyYW0gZm9ybWF0IC0gYFwiaHR0cHNcImAgKGRlZmF1bHQpIHlpZWxkcyBgaHR0cHM6Ly9ob3N0L293bmVyL3JlcG9gO1xuICogICBgXCJucG1cImAgeWllbGRzIG5wbSdzIGBnaXQraHR0cHM6Ly9ob3N0L293bmVyL3JlcG8uZ2l0YCBmb3JtIChmb3IgYVxuICogICBgcGFja2FnZS5qc29uYCBgcmVwb3NpdG9yeS51cmxgIHRoYXQgcGFzc2VzIG5wbSBwcm92ZW5hbmNlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9zaXRvcnlVcmwoY3dkPzogc3RyaW5nLCBmb3JtYXQ6IFwiaHR0cHNcIiB8IFwibnBtXCIgPSBcImh0dHBzXCIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IGh0dHBzID0gcmVwb3NpdG9yeVVybEZyb21HaChyZXNvbHZlZCkgPz8gcmVwb3NpdG9yeVVybEZyb21HaXQocmVzb2x2ZWQpO1xuICBpZiAoIWh0dHBzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZm9ybWF0ID09PSBcIm5wbVwiID8gYGdpdCske2h0dHBzLnJlcGxhY2UoL1xcLmdpdCQvLCBcIlwiKX0uZ2l0YCA6IGh0dHBzO1xufVxuXG4vKiogUHVibGljIG5wbSwgdXNlZCBvbmx5IGFmdGVyIGVudiwgbnBtcmMsIGJ1bmZpZywgYW5kIHBucG0geWFtbCBtaXNzLiAqL1xuY29uc3QgREVGQVVMVF9OUE1fUkVHSVNUUlkgPSBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL1wiO1xuXG4vKiogSW5wdXRzIHRoYXQgY29udHJvbCBhY3RpdmUgbnBtIHJlZ2lzdHJ5IGRpc2NvdmVyeS4gKi9cbmV4cG9ydCB0eXBlIE5wbVJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgLyoqIFNraXAgcHVibGljIG5wbWpzLm9yZyBzbyBjYWxsZXJzIGNhbiBkZXRlY3QgYSBjb25maWd1cmVkIG92ZXJyaWRlLiAqL1xuICBvdmVycmlkZU9ubHk/OiBib29sZWFuO1xuICAvKipcbiAgICogUmVhZCBgbnBtX2NvbmZpZ19yZWdpc3RyeWAsIGBOUE1fQ09ORklHX1JFR0lTVFJZYCwgYW5kIGBCVU5fQ09ORklHX1JFR0lTVFJZYFxuICAgKiBmaXJzdC4gRGVmYXVsdHMgdG8gdHJ1ZSBzbyB0aGUgc2FtZSBjYXNjYWRlIGEgcGFja2FnZSBtYW5hZ2VyIHVzZXMgaXMgdGhlXG4gICAqIGRlZmF1bHQuXG4gICAqL1xuICBlbnZWYXJzPzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IG5wbVJlZ2lzdHJ5Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgbmV0LlVybEJ1aWxkZXIgfCB1bmRlZmluZWQ+KCk7XG5cbi8qKlxuICogVGhlIGFjdGl2ZSBucG0gcmVnaXN0cnkgYXMgYSBjaGFpbmFibGUge0BsaW5rIG5ldC5VcmxCdWlsZGVyfS5cbiAqXG4gKiBSZXNvbHV0aW9uIGlzIG1hbmFnZXItYWdub3N0aWMgYW5kIG1lbW9pemVkIHBlciBjd2QgcGx1cyBvcHRpb25zOiBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzLCB0aGVuIGAubnBtcmNgIChwcm9qZWN0IGFuY2VzdG9ycywgdXNlciwgZ2xvYmFsKSwgdGhlbiBCdW5cbiAqIGBidW5maWcudG9tbGAgYGluc3RhbGwucmVnaXN0cnlgLCB0aGVuIHBucG0gd29ya3NwYWNlL2dsb2JhbCBZQU1MLCB0aGVuXG4gKiBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYC4gYG92ZXJyaWRlT25seWAgc2tpcHMgdGhhdCBwdWJsaWMgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5wbVJlZ2lzdHJ5KFxuICBjd2Q/OiBzdHJpbmcgfCBudWxsLFxuICBvcHRpb25zPzogTnBtUmVnaXN0cnlPcHRpb25zLFxuKTogbmV0LlVybEJ1aWxkZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIGNvbnN0IGVudlZhcnMgPSBvcHRpb25zPy5lbnZWYXJzICE9PSBmYWxzZTtcbiAgY29uc3Qgb3ZlcnJpZGVPbmx5ID0gQm9vbGVhbihvcHRpb25zPy5vdmVycmlkZU9ubHkpO1xuICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbXG4gICAgcmVzb2x2ZWQsXG4gICAgb3ZlcnJpZGVPbmx5LFxuICAgIGVudlZhcnMsXG4gICAgaG9tZWRpcigpLFxuICAgIHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfVVNFUkNPTkZJRyA/PyBcIlwiLFxuICAgIHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfR0xPQkFMQ09ORklHID8/IFwiXCIsXG4gICAgcHJvY2Vzcy5lbnYuUFJFRklYID8/IFwiXCIsXG4gICAgZW52VmFycyA/IChwcm9jZXNzLmVudi5ucG1fY29uZmlnX3JlZ2lzdHJ5ID8/IFwiXCIpIDogXCJcIixcbiAgICBlbnZWYXJzID8gKHByb2Nlc3MuZW52Lk5QTV9DT05GSUdfUkVHSVNUUlkgPz8gXCJcIikgOiBcIlwiLFxuICAgIGVudlZhcnMgPyAocHJvY2Vzcy5lbnYuQlVOX0NPTkZJR19SRUdJU1RSWSA/PyBcIlwiKSA6IFwiXCIsXG4gIF0pO1xuICBpZiAobnBtUmVnaXN0cnlDYWNoZS5oYXMoa2V5KSkgcmV0dXJuIG5wbVJlZ2lzdHJ5Q2FjaGUuZ2V0KGtleSk7XG4gIGNvbnN0IHZhbHVlID0gcmVzb2x2ZU5wbVJlZ2lzdHJ5KHJlc29sdmVkLCB7IG92ZXJyaWRlT25seSwgZW52VmFycyB9KTtcbiAgbnBtUmVnaXN0cnlDYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU5wbVJlZ2lzdHJ5KFxuICBjd2Q6IHN0cmluZyxcbiAgb3B0aW9uczogeyBvdmVycmlkZU9ubHk6IGJvb2xlYW47IGVudlZhcnM6IGJvb2xlYW4gfSxcbik6IG5ldC5VcmxCdWlsZGVyIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgbnBtUmVnaXN0cnlDYW5kaWRhdGVzKGN3ZCwgb3B0aW9ucy5lbnZWYXJzKSkge1xuICAgIGNvbnN0IHVybCA9IHRvUmVnaXN0cnlVcmwoY2FuZGlkYXRlLCBvcHRpb25zLm92ZXJyaWRlT25seSk7XG4gICAgaWYgKHVybCkgcmV0dXJuIHVybDtcbiAgfVxuICByZXR1cm4gdG9SZWdpc3RyeVVybChERUZBVUxUX05QTV9SRUdJU1RSWSwgb3B0aW9ucy5vdmVycmlkZU9ubHkpO1xufVxuXG5mdW5jdGlvbiogbnBtUmVnaXN0cnlDYW5kaWRhdGVzKGN3ZDogc3RyaW5nLCBlbnZWYXJzOiBib29sZWFuKTogR2VuZXJhdG9yPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoZW52VmFycykge1xuICAgIHlpZWxkIHByb2Nlc3MuZW52Lm5wbV9jb25maWdfcmVnaXN0cnk7XG4gICAgeWllbGQgcHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19SRUdJU1RSWTtcbiAgICB5aWVsZCBwcm9jZXNzLmVudi5CVU5fQ09ORklHX1JFR0lTVFJZO1xuICB9XG4gIGZvciAoY29uc3QgZGlyIG9mIGFuY2VzdG9yRGlycyhjd2QpKSB7XG4gICAgeWllbGQgcmVhZE5wbXJjUmVnaXN0cnkoam9pbihkaXIsIFwiLm5wbXJjXCIpKTtcbiAgfVxuICB5aWVsZCByZWFkTnBtcmNSZWdpc3RyeShwcm9jZXNzLmVudi5OUE1fQ09ORklHX1VTRVJDT05GSUcgPz8gam9pbihob21lZGlyKCksIFwiLm5wbXJjXCIpKTtcbiAgeWllbGQgcmVhZE5wbXJjUmVnaXN0cnkocHJvY2Vzcy5lbnYuTlBNX0NPTkZJR19HTE9CQUxDT05GSUcgPz8gZGVmYXVsdEdsb2JhbE5wbXJjKCkpO1xuICBmb3IgKGNvbnN0IGRpciBvZiBhbmNlc3RvckRpcnMoY3dkKSkge1xuICAgIHlpZWxkIHJlYWRCdW5maWdSZWdpc3RyeShqb2luKGRpciwgXCJidW5maWcudG9tbFwiKSk7XG4gIH1cbiAgeWllbGQgcmVhZEJ1bmZpZ1JlZ2lzdHJ5KGpvaW4oaG9tZWRpcigpLCBcImJ1bmZpZy50b21sXCIpKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgYW5jZXN0b3JEaXJzKGN3ZCkpIHtcbiAgICB5aWVsZCByZWFkWWFtbFJlZ2lzdHJ5KGpvaW4oZGlyLCBcInBucG0td29ya3NwYWNlLnlhbWxcIikpO1xuICB9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwbnBtR2xvYmFsQ29uZmlnUGF0aHMoKSkge1xuICAgIHlpZWxkIHJlYWRZYW1sUmVnaXN0cnkocGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9SZWdpc3RyeVVybChcbiAgY2FuZGlkYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG92ZXJyaWRlT25seTogYm9vbGVhbixcbik6IG5ldC5VcmxCdWlsZGVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHJpbW1lZCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoY2FuZGlkYXRlKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcih0cmltbWVkKTtcbiAgaWYgKCF1cmwpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvdmVycmlkZU9ubHkgJiYgaXNQdWJsaWNOcG1SZWdpc3RyeSh1cmwpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdXJsO1xufVxuXG5mdW5jdGlvbiBpc1B1YmxpY05wbVJlZ2lzdHJ5KHVybDogbmV0LlVybEJ1aWxkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHVybC5ob3N0bmFtZSA9PT0gXCJyZWdpc3RyeS5ucG1qcy5vcmdcIjtcbn1cblxuZnVuY3Rpb24qIGFuY2VzdG9yRGlycyhjd2Q6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGN1cnJlbnQgPSBjd2Q7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgeWllbGQgY3VycmVudDtcbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpO1xuICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHJldHVybjtcbiAgICBjdXJyZW50ID0gcGFyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRHbG9iYWxOcG1yYygpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnYuUFJPR1JBTURBVEEgPz8gXCJDOlxcXFxQcm9ncmFtRGF0YVwiLCBcIm5wbVwiLCBcImV0Y1wiLCBcIm5wbXJjXCIpO1xuICB9XG4gIHJldHVybiBqb2luKHByb2Nlc3MuZW52LlBSRUZJWCA/PyBcIi91c3IvbG9jYWxcIiwgXCJldGNcIiwgXCJucG1yY1wiKTtcbn1cblxuZnVuY3Rpb24gcG5wbUdsb2JhbENvbmZpZ1BhdGhzKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaG9tZSA9IGhvbWVkaXIoKTtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIpIHtcbiAgICByZXR1cm4gW2pvaW4oaG9tZSwgXCJMaWJyYXJ5L1ByZWZlcmVuY2VzL3BucG0vY29uZmlnLnlhbWxcIildO1xuICB9XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpIHtcbiAgICByZXR1cm4gW2pvaW4ocHJvY2Vzcy5lbnYuTE9DQUxBUFBEQVRBID8/IGpvaW4oaG9tZSwgXCJBcHBEYXRhL0xvY2FsXCIpLCBcInBucG0vY29uZmlnLnlhbWxcIildO1xuICB9XG4gIHJldHVybiBbam9pbihob21lLCBcIi5jb25maWcvcG5wbS9jb25maWcueWFtbFwiKV07XG59XG5cbmZ1bmN0aW9uIHJlYWROcG1yY1JlZ2lzdHJ5KHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjYWNoZWRSZWNvcmQoYG5wbXJjLXJlZ2lzdHJ5OiR7cGF0aH1gLCAoKSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IHJlYWRUZXh0RmlsZShwYXRoKTtcbiAgICBjb25zdCByZWdpc3RyeSA9IHRleHQgPyBwYXJzZUluaVJlZ2lzdHJ5KHRleHQpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWdpc3RyeSA/IHsgcmVnaXN0cnkgfSA6IHVuZGVmaW5lZDtcbiAgfSk/LnJlZ2lzdHJ5O1xufVxuXG5mdW5jdGlvbiByZWFkQnVuZmlnUmVnaXN0cnkocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNhY2hlZFJlY29yZChgYnVuZmlnLXJlZ2lzdHJ5OiR7cGF0aH1gLCAoKSA9PiB7XG4gICAgY29uc3QgdGV4dCA9IHJlYWRUZXh0RmlsZShwYXRoKTtcbiAgICBjb25zdCByZWdpc3RyeSA9IHRleHQgPyBwYXJzZUJ1bmZpZ1JlZ2lzdHJ5KHRleHQpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWdpc3RyeSA/IHsgcmVnaXN0cnkgfSA6IHVuZGVmaW5lZDtcbiAgfSk/LnJlZ2lzdHJ5O1xufVxuXG5mdW5jdGlvbiByZWFkWWFtbFJlZ2lzdHJ5KHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjYWNoZWRSZWNvcmQoYHlhbWwtcmVnaXN0cnk6JHtwYXRofWAsICgpID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gcmVhZFRleHRGaWxlKHBhdGgpO1xuICAgIGlmICghdGV4dCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVlhbWwodGV4dCk7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFyc2VkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWdpc3RyeSA9IHlhbWxSZWdpc3RyeShwYXJzZWQpO1xuICAgIHJldHVybiByZWdpc3RyeSA/IHsgcmVnaXN0cnkgfSA6IHVuZGVmaW5lZDtcbiAgfSk/LnJlZ2lzdHJ5O1xufVxuXG5mdW5jdGlvbiByZWFkVGV4dEZpbGUocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFmaWxlU3RhdFN5bmMocGF0aCk/LmlzRmlsZSgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKTtcbn1cblxuLyoqIFBhcnNlIGEgYHJlZ2lzdHJ5PWAgYXNzaWdubWVudCBmcm9tIG5wbXJjIC8gaW5pIHRleHQuICovXG5mdW5jdGlvbiBwYXJzZUluaVJlZ2lzdHJ5KHRleHQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgcmF3IG9mIHRleHQuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgIGNvbnN0IGxpbmUgPSByYXcudHJpbSgpO1xuICAgIGlmICghbGluZSB8fCBsaW5lLnN0YXJ0c1dpdGgoXCIjXCIpIHx8IGxpbmUuc3RhcnRzV2l0aChcIjtcIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGVxID0gbGluZS5pbmRleE9mKFwiPVwiKTtcbiAgICBpZiAoZXEgPT09IC0xKSBjb250aW51ZTtcbiAgICBpZiAobGluZS5zbGljZSgwLCBlcSkudHJpbSgpICE9PSBcInJlZ2lzdHJ5XCIpIGNvbnRpbnVlO1xuICAgIHJldHVybiB1bnF1b3RlSW5pVmFsdWUobGluZS5zbGljZShlcSArIDEpKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlYWQgQnVuIGBpbnN0YWxsLnJlZ2lzdHJ5YCBmcm9tIGEgYnVuZmlnLnRvbWwuIFRhYmxlIGZvcm1cbiAqIGBbaW5zdGFsbC5yZWdpc3RyeV1gIHdpdGggYHVybCA9IFwiLi4uXCJgIGlzIGFjY2VwdGVkOyBzY29wZWQgbWFwcyBhcmUgaWdub3JlZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VCdW5maWdSZWdpc3RyeSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgc2VjdGlvbiA9IFwiXCI7XG4gIGZvciAoY29uc3QgcmF3IG9mIHRleHQuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgIGNvbnN0IGxpbmUgPSBzdHJpcFRvbWxDb21tZW50KHJhdykudHJpbSgpO1xuICAgIGlmICghbGluZSkgY29udGludWU7XG4gICAgY29uc3QgaGVhZGVyID0gL15cXFsoW15cXF1dKylcXF0kLy5leGVjKGxpbmUpO1xuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIHNlY3Rpb24gPSBoZWFkZXJbMV0hLnRyaW0oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZihcIj1cIik7XG4gICAgaWYgKGVxID09PSAtMSkgY29udGludWU7XG4gICAgY29uc3Qga2V5ID0gbGluZS5zbGljZSgwLCBlcSkudHJpbSgpO1xuICAgIGNvbnN0IHZhbHVlID0gdW5xdW90ZUluaVZhbHVlKGxpbmUuc2xpY2UoZXEgKyAxKSk7XG4gICAgaWYgKHNlY3Rpb24gPT09IFwiaW5zdGFsbFwiICYmIGtleSA9PT0gXCJyZWdpc3RyeVwiICYmICF2YWx1ZS5zdGFydHNXaXRoKFwie1wiKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmIChzZWN0aW9uID09PSBcImluc3RhbGwucmVnaXN0cnlcIiAmJiBrZXkgPT09IFwidXJsXCIpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAoIXNlY3Rpb24gJiYga2V5ID09PSBcImluc3RhbGwucmVnaXN0cnlcIikgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHlhbWxSZWdpc3RyeShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgZGF0YS5yZWdpc3RyeSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGEucmVnaXN0cnk7XG4gIGNvbnN0IHJlZ2lzdHJpZXMgPSBkYXRhLnJlZ2lzdHJpZXM7XG4gIGlmIChvYmplY3QuaXNSZWNvcmQocmVnaXN0cmllcykgJiYgdHlwZW9mIHJlZ2lzdHJpZXMuZGVmYXVsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiByZWdpc3RyaWVzLmRlZmF1bHQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdW5xdW90ZUluaVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpO1xuICBjb25zdCBjb21tZW50ID0gdHJpbW1lZC5zZWFyY2goL1xccysjLyk7XG4gIGNvbnN0IHJhdyA9IGNvbW1lbnQgPT09IC0xID8gdHJpbW1lZCA6IHRyaW1tZWQuc2xpY2UoMCwgY29tbWVudCkudHJpbSgpO1xuICBpZiAoKHJhdy5zdGFydHNXaXRoKCdcIicpICYmIHJhdy5lbmRzV2l0aCgnXCInKSkgfHwgKHJhdy5zdGFydHNXaXRoKFwiJ1wiKSAmJiByYXcuZW5kc1dpdGgoXCInXCIpKSkge1xuICAgIHJldHVybiByYXcuc2xpY2UoMSwgLTEpO1xuICB9XG4gIHJldHVybiByYXc7XG59XG5cbmZ1bmN0aW9uIHN0cmlwVG9tbENvbW1lbnQobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGxpbmUuaW5kZXhPZihcIiNcIik7XG4gIHJldHVybiBoYXNoID09PSAtMSA/IGxpbmUgOiBsaW5lLnNsaWNlKDAsIGhhc2gpO1xufVxuXG5mdW5jdGlvbiByZWFkUGFja2FnZU5hbWUocGtnUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFmaWxlU3RhdFN5bmMocGtnUGF0aCk/LmlzRmlsZSgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChqc29uLnBhcnNlUmVjb3JkKHJlYWRGaWxlU3luYyhwa2dQYXRoLCBcInV0ZjhcIikpPy5uYW1lKSA/PyB1bmRlZmluZWQ7XG59XG5cbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnNvbGUubG9nKFwibnBtIHJvb3Q6XCIsIG5wbVJvb3QoKSk7XG4gIGNvbnNvbGUubG9nKFwicmVwbyByb290OlwiLCBnaXRSb290KCkpO1xuICBjb25zb2xlLmxvZyhcInBhY2thZ2Ugcm9vdDpcIiwgcm9vdCgpKTtcbiAgY29uc29sZS5sb2coXCJwcm9qZWN0IG5hbWU6XCIsIG5hbWUoKSk7XG4gIGNvbnNvbGUubG9nKFwicmVwb3NpdG9yeSB1cmw6XCIsIHJlcG9zaXRvcnlVcmwoKSk7XG4gIGNvbnNvbGUubG9nKFwicmVwb3NpdG9yeSB1cmwgKG5wbSk6XCIsIHJlcG9zaXRvcnlVcmwodW5kZWZpbmVkLCBcIm5wbVwiKSk7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"typescript": "^5.9.3"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
28
|
+
"@dbx-tools/shared-core": "^0.9.50",
|
|
29
29
|
"extract-zip": "^2.0.1",
|
|
30
30
|
"proper-lockfile": "^4.1.2",
|
|
31
31
|
"semver": "^7.7.3",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"./package.json": "./package.json"
|
|
88
88
|
}
|
|
89
89
|
},
|
|
90
|
-
"version": "0.9.
|
|
90
|
+
"version": "0.9.50",
|
|
91
91
|
"types": "./lib/index.d.ts",
|
|
92
92
|
"dbxToolsConfig": {
|
|
93
93
|
"tags": [
|
package/src/project-utils.ts
CHANGED
|
@@ -128,7 +128,7 @@ export function root(cwd?: string): string | undefined {
|
|
|
128
128
|
current = dirname(current);
|
|
129
129
|
}
|
|
130
130
|
const boundaries = new Set(
|
|
131
|
-
[
|
|
131
|
+
[npmBoundary(resolved), gitRoot(resolved)]
|
|
132
132
|
.filter((path): path is string => path !== undefined)
|
|
133
133
|
.map((path) => resolve(path)),
|
|
134
134
|
);
|
|
@@ -161,6 +161,15 @@ export function root(cwd?: string): string | undefined {
|
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
+
function npmBoundary(cwd: string): string | undefined {
|
|
165
|
+
const candidate = npmRoot(cwd);
|
|
166
|
+
if (!candidate) return undefined;
|
|
167
|
+
const resolved = resolve(candidate);
|
|
168
|
+
if (fileStatSync(join(resolved, "package.json"))?.isFile()) return resolved;
|
|
169
|
+
if (fileStatSync(join(resolved, "node_modules"))?.isDirectory()) return resolved;
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
|
|
164
173
|
/**
|
|
165
174
|
* Parse a git remote URL (`https://...`, `git@host:owner/repo.git`, etc.) and
|
|
166
175
|
* return the repo segment, stripping any `.git` suffix. Returns `undefined` for
|