@tscircuit/eval 0.0.423 → 0.0.425
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blob-url.js +1 -1
- package/dist/eval/index.d.ts +4 -0
- package/dist/eval/index.js +36 -1
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.js +87 -3
- package/dist/webworker/entrypoint.js +110 -110
- package/dist/worker.js +54 -3
- package/package.json +2 -2
package/dist/lib/index.js
CHANGED
|
@@ -1105,6 +1105,50 @@ var enhanceRootCircuitHasNoChildrenError = (error, entrypoint) => {
|
|
|
1105
1105
|
|
|
1106
1106
|
// lib/runner/CircuitRunner.ts
|
|
1107
1107
|
import Debug6 from "debug";
|
|
1108
|
+
|
|
1109
|
+
// lib/shared/obj-path.ts
|
|
1110
|
+
function getObjectPaths(obj, prefix = "") {
|
|
1111
|
+
const paths = [];
|
|
1112
|
+
for (const key in obj) {
|
|
1113
|
+
if (!Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
1114
|
+
continue;
|
|
1115
|
+
}
|
|
1116
|
+
const value = obj[key];
|
|
1117
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
1118
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value)) {
|
|
1119
|
+
const subPaths = getObjectPaths(value, path);
|
|
1120
|
+
paths.push(...subPaths);
|
|
1121
|
+
} else {
|
|
1122
|
+
paths.push(path);
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
return paths;
|
|
1126
|
+
}
|
|
1127
|
+
function getValueAtPath(obj, path) {
|
|
1128
|
+
const keys = path.split(".");
|
|
1129
|
+
let current = obj;
|
|
1130
|
+
for (const key of keys) {
|
|
1131
|
+
current = current[key];
|
|
1132
|
+
}
|
|
1133
|
+
return current;
|
|
1134
|
+
}
|
|
1135
|
+
function setValueAtPath(obj, path, value) {
|
|
1136
|
+
const keys = path.split(".");
|
|
1137
|
+
let current = obj;
|
|
1138
|
+
for (let i = 0; i < keys.length; i++) {
|
|
1139
|
+
const key = keys[i];
|
|
1140
|
+
if (i === keys.length - 1) {
|
|
1141
|
+
current[key] = value;
|
|
1142
|
+
} else {
|
|
1143
|
+
if (!Object.prototype.hasOwnProperty.call(current, key) || typeof current[key] !== "object" || current[key] === null || Array.isArray(current[key])) {
|
|
1144
|
+
current[key] = {};
|
|
1145
|
+
}
|
|
1146
|
+
current = current[key];
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
// lib/runner/CircuitRunner.ts
|
|
1108
1152
|
var debug6 = Debug6("tsci:eval:CircuitRunner");
|
|
1109
1153
|
var CircuitRunner = class {
|
|
1110
1154
|
constructor(configuration = {}) {
|
|
@@ -1251,9 +1295,25 @@ var CircuitRunner = class {
|
|
|
1251
1295
|
async setPlatformConfig(platform) {
|
|
1252
1296
|
this._circuitRunnerConfiguration.platform = platform;
|
|
1253
1297
|
}
|
|
1298
|
+
async setPlatformConfigProperty(property, value) {
|
|
1299
|
+
if (!this._circuitRunnerConfiguration.platform) {
|
|
1300
|
+
this._circuitRunnerConfiguration.platform = {};
|
|
1301
|
+
}
|
|
1302
|
+
setValueAtPath(this._circuitRunnerConfiguration.platform, property, value);
|
|
1303
|
+
}
|
|
1254
1304
|
async setProjectConfig(project) {
|
|
1255
1305
|
this._circuitRunnerConfiguration.projectConfig = project;
|
|
1256
1306
|
}
|
|
1307
|
+
async setProjectConfigProperty(property, value) {
|
|
1308
|
+
if (!this._circuitRunnerConfiguration.projectConfig) {
|
|
1309
|
+
this._circuitRunnerConfiguration.projectConfig = {};
|
|
1310
|
+
}
|
|
1311
|
+
setValueAtPath(
|
|
1312
|
+
this._circuitRunnerConfiguration.projectConfig,
|
|
1313
|
+
property,
|
|
1314
|
+
value
|
|
1315
|
+
);
|
|
1316
|
+
}
|
|
1257
1317
|
async enableDebug(namespace) {
|
|
1258
1318
|
this._debugNamespace = namespace;
|
|
1259
1319
|
if (this._executionContext) {
|
|
@@ -1454,11 +1514,35 @@ var createCircuitWebWorker = async (configuration) => {
|
|
|
1454
1514
|
if (configuration.snippetsApiBaseUrl) {
|
|
1455
1515
|
await comlinkWorker.setSnippetsApiBaseUrl(configuration.snippetsApiBaseUrl);
|
|
1456
1516
|
}
|
|
1517
|
+
const maybeProxy = (value) => {
|
|
1518
|
+
if (typeof value === "function") {
|
|
1519
|
+
return Comlink.proxy(value);
|
|
1520
|
+
}
|
|
1521
|
+
return value;
|
|
1522
|
+
};
|
|
1457
1523
|
if (configuration.platform) {
|
|
1458
|
-
|
|
1524
|
+
for (const path of getObjectPaths(configuration.platform)) {
|
|
1525
|
+
await comlinkWorker.setPlatformConfigProperty(
|
|
1526
|
+
path,
|
|
1527
|
+
maybeProxy(getValueAtPath(configuration.platform, path))
|
|
1528
|
+
).catch((e) => {
|
|
1529
|
+
throw new Error(
|
|
1530
|
+
`Error setting platform config property ${path}: ${e instanceof Error ? e.message : String(e)}`
|
|
1531
|
+
);
|
|
1532
|
+
});
|
|
1533
|
+
}
|
|
1459
1534
|
}
|
|
1460
1535
|
if (configuration.projectConfig) {
|
|
1461
|
-
|
|
1536
|
+
for (const path of getObjectPaths(configuration.projectConfig)) {
|
|
1537
|
+
await comlinkWorker.setProjectConfigProperty(
|
|
1538
|
+
path,
|
|
1539
|
+
maybeProxy(getValueAtPath(configuration.projectConfig, path))
|
|
1540
|
+
).catch((e) => {
|
|
1541
|
+
throw new Error(
|
|
1542
|
+
`Error setting project config property ${path}: ${e instanceof Error ? e.message : String(e)}`
|
|
1543
|
+
);
|
|
1544
|
+
});
|
|
1545
|
+
}
|
|
1462
1546
|
}
|
|
1463
1547
|
let isTerminated = false;
|
|
1464
1548
|
const wrapper = {
|
|
@@ -1564,4 +1648,4 @@ export {
|
|
|
1564
1648
|
runTscircuitCode,
|
|
1565
1649
|
runTscircuitModule
|
|
1566
1650
|
};
|
|
1567
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9qbGMtcGFydHMtZW5naW5lLnRzIiwgIi4uLy4uL2xpYi9nZXRQbGF0Zm9ybUNvbmZpZy50cyIsICIuLi8uLi9saWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvdHNjb25maWdQYXRocy50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vbGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LW5wbS1wYWNrYWdlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdENvZGUudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRNb2R1bGUudHMiLCAiLi4vLi4vbGliL3dvcmtlci50cyIsICIuLi8uLi9saWIvZ2V0UG9zc2libGVFbnRyeXBvaW50Q29tcG9uZW50UGF0aHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgdHlwZSB7IFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgKiBhcyB0c2NpcmN1aXRDb3JlIGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZyB9IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6ZXhlY3V0aW9uLWNvbnRleHRcIilcblxuaW50ZXJmYWNlIFN0b3JlZExvZ2dlciB7XG4gIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbiAgZ2V0TG9nczogKCkgPT4gQXJyYXk8eyBtc2c6IHN0cmluZyB9PlxuICBzdHJpbmdpZnlMb2dzOiAoKSA9PiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGVudHJ5cG9pbnQ6IHN0cmluZ1xuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgY2lyY3VpdDogUm9vdENpcmN1aXRcbiAgbG9nZ2VyOiBTdG9yZWRMb2dnZXJcbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbFxuICBpbXBvcnRTdGFjazogc3RyaW5nW11cbiAgY3VycmVudGx5SW1wb3J0aW5nOiBTZXQ8c3RyaW5nPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgd2ViV29ya2VyQ29uZmlndXJhdGlvbjogV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgb3B0czoge1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBwbGF0Zm9ybT86IFBsYXRmb3JtQ29uZmlnXG4gICAgcHJvamVjdENvbmZpZz86IFBhcnRpYWw8UGxhdGZvcm1Db25maWc+XG4gICAgZGVidWdOYW1lc3BhY2U/OiBzdHJpbmdcbiAgfSA9IHt9LFxuKTogRXhlY3V0aW9uQ29udGV4dCB7XG4gIGdsb2JhbFRoaXMuUmVhY3QgPSBSZWFjdFxuXG4gIGNvbnN0IGJhc2VQbGF0Zm9ybSA9IG9wdHMucGxhdGZvcm0gfHwgZ2V0UGxhdGZvcm1Db25maWcoKVxuICBjb25zdCBwbGF0Zm9ybSA9IG9wdHMucHJvamVjdENvbmZpZ1xuICAgID8geyAuLi5iYXNlUGxhdGZvcm0sIC4uLm9wdHMucHJvamVjdENvbmZpZyB9XG4gICAgOiBiYXNlUGxhdGZvcm1cblxuICBjb25zdCBjaXJjdWl0ID0gbmV3IFJvb3RDaXJjdWl0KHtcbiAgICBwbGF0Zm9ybSxcbiAgfSlcblxuICBpZiAob3B0cy5uYW1lKSB7XG4gICAgY2lyY3VpdC5uYW1lID0gb3B0cy5uYW1lXG4gIH1cblxuICBpZiAob3B0cy5kZWJ1Z05hbWVzcGFjZSkge1xuICAgIGNpcmN1aXQuZW5hYmxlRGVidWcob3B0cy5kZWJ1Z05hbWVzcGFjZSlcbiAgfVxuXG4gIGNvbnN0IGxvZ3M6IEFycmF5PHsgbXNnOiBzdHJpbmcgfT4gPSBbXVxuXG4gIHJldHVybiB7XG4gICAgZnNNYXA6IHt9LFxuICAgIGVudHJ5cG9pbnQ6IFwiXCIsXG4gICAgbG9nZ2VyOiB7XG4gICAgICBpbmZvOiAobWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxvZ3MucHVzaCh7IG1zZzogbWVzc2FnZSB9KVxuICAgICAgfSxcbiAgICAgIGdldExvZ3M6ICgpID0+IGxvZ3MsXG4gICAgICBzdHJpbmdpZnlMb2dzOiAoKSA9PiBsb2dzLm1hcCgobG9nKSA9PiBsb2cubXNnKS5qb2luKFwiXFxuXCIpLFxuICAgIH0sXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzOiB7XG4gICAgICBcIkB0c2NpcmN1aXQvY29yZVwiOiB0c2NpcmN1aXRDb3JlLFxuICAgICAgdHNjaXJjdWl0OiB0c2NpcmN1aXRDb3JlLFxuICAgICAgXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIjogdHNjaXJjdWl0TWF0aFV0aWxzLFxuICAgICAgcmVhY3Q6IFJlYWN0LFxuICAgICAgZGVidWc6IERlYnVnLFxuXG4gICAgICAvLyBUaGlzIGlzIHVzdWFsbHkgdXNlZCBhcyBhIHR5cGUgaW1wb3J0LCB3ZSBjYW4gcmVtb3ZlIHRoZSBzaGltIHdoZW4gd2VcbiAgICAgIC8vIGlnbm9yZSB0eXBlIGltcG9ydHMgaW4gZ2V0SW1wb3J0c0Zyb21Db2RlXG4gICAgICBcIkB0c2NpcmN1aXQvcHJvcHNcIjoge30sXG4gICAgfSxcbiAgICBjaXJjdWl0LFxuICAgIHRzQ29uZmlnOiBudWxsLFxuICAgIGltcG9ydFN0YWNrOiBbXSxcbiAgICBjdXJyZW50bHlJbXBvcnRpbmc6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgIC4uLndlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIH1cbn1cbiIsICIvKipcbiAqIFRyYW5zZm9ybXMgYSBLaUNhZCBmb290cHJpbnQgc3RyaW5nIGludG8gYSBnZW5lcmljIFwiZm9vdHByaW50ZXIgc3RyaW5nXCIuXG4gKiBGb3Igbm93LCB0aGlzIGlzIGEgc2ltcGxpZmllZCBjb252ZXJzaW9uIHRvIGEgc3RhbmRhcmQgcGFja2FnZSBuYW1lLlxuICogZS5nLiBcImtpY2FkOlJlc2lzdG9yX1NNRDpSXzA2MDNfMTYwOE1ldHJpY1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb290cHJpbnRlclN0cmluZ0Zyb21LaWNhZCA9IChcbiAga2ljYWRGb290cHJpbnQ6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIC8vIGtpY2FkOlJlc2lzdG9yX1NNRDpSXzA2MDNfMTYwOE1ldHJpYyAtPiAwNjAzXG4gIGxldCBtYXRjaCA9IGtpY2FkRm9vdHByaW50Lm1hdGNoKC86W1JDXV8oXFxkezR9KV8vKVxuICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaFsxXVxuXG4gIC8vIGtpY2FkOlBhY2thZ2VfU086U09JQy04XzMuOXg0LjltbV9QMS4yN21tIC0+IFNPSUMtOFxuICAvLyBraWNhZDpQYWNrYWdlX1RPX1NPVF9TTUQ6U09ULTIzIC0+IFNPVC0yM1xuICBtYXRjaCA9IGtpY2FkRm9vdHByaW50Lm1hdGNoKFxuICAgIC86KFNPSUMtXFxkK3xTT1QtXFxkK3xTT0QtXFxkK3xTU09QLVxcZCt8VFNTT1AtXFxkK3xRRlAtXFxkK3xRRk4tXFxkKykvLFxuICApXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIiBpbnRvIGEgSkxDLWNvbXBhdGlibGUgcGFja2FnZSBuYW1lLlxuICogZS5nLiBcImNhcDA2MDNcIiAtPiBcIjA2MDNcIlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyA9IChcbiAgZm9vdHByaW50ZXJTdHJpbmc6IHN0cmluZyxcbik6IHN0cmluZyA9PiB7XG4gIGlmIChmb290cHJpbnRlclN0cmluZy5pbmNsdWRlcyhcImNhcFwiKSkge1xuICAgIHJldHVybiBmb290cHJpbnRlclN0cmluZy5yZXBsYWNlKC9jYXAvZywgXCJcIilcbiAgfVxuICByZXR1cm4gZm9vdHByaW50ZXJTdHJpbmdcbn1cbiIsICJpbXBvcnQgeyBnZXRGb290cHJpbnRlclN0cmluZ0Zyb21LaWNhZCB9IGZyb20gXCIuL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZFwiXG5pbXBvcnQgeyBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nIH0gZnJvbSBcIi4vZ2V0LWpsYy1wYWNrYWdlLWZyb20tZm9vdHByaW50ZXItc3RyaW5nXCJcblxuLyoqXG4gKiBHZXQgYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUgZnJvbSBhIGZvb3RwcmludCBzdHJpbmcsIHdoaWNoIGNvdWxkIGJlXG4gKiBhIEtpQ2FkIGZvb3RwcmludCBvciBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEpsY3BjYlBhY2thZ2VOYW1lID0gKFxuICBmb290cHJpbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghZm9vdHByaW50KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgaWYgKGZvb3RwcmludC5zdGFydHNXaXRoKFwia2ljYWQ6XCIpKSB7XG4gICAgY29uc3QgZm9vdHByaW50ZXJTdHJpbmcgPSBnZXRGb290cHJpbnRlclN0cmluZ0Zyb21LaWNhZChmb290cHJpbnQpXG4gICAgaWYgKGZvb3RwcmludGVyU3RyaW5nKSB7XG4gICAgICByZXR1cm4gZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyhmb290cHJpbnRlclN0cmluZylcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW4tbWF0Y2hlZCBLaUNhZCBzdHJpbmdzXG4gICAgcmV0dXJuIGZvb3RwcmludFxuICB9XG5cbiAgLy8gTm90IGEgS2lDYWQgc3RyaW5nLCBhc3N1bWUgaXQncyBhIGZvb3RwcmludGVyIHN0cmluZ1xuICByZXR1cm4gZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyhmb290cHJpbnQpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQYXJ0c0VuZ2luZSwgU3VwcGxpZXJQYXJ0TnVtYmVycyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGdldEpsY3BjYlBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZm9vdHByaW50LXRyYW5zbGF0b3JzL2luZGV4XCJcblxuZXhwb3J0IGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKVxuXG5jb25zdCBnZXRKbGNQYXJ0c0NhY2hlZCA9IGFzeW5jIChuYW1lOiBhbnksIHBhcmFtczogYW55KSA9PiB7XG4gIGNvbnN0IHBhcmFtU3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgLi4ucGFyYW1zLFxuICAgIGpzb246IFwidHJ1ZVwiLFxuICB9KS50b1N0cmluZygpXG4gIGlmIChjYWNoZS5oYXMocGFyYW1TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGNhY2hlLmdldChwYXJhbVN0cmluZylcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgIGBodHRwczovL2psY3NlYXJjaC50c2NpcmN1aXQuY29tLyR7bmFtZX0vbGlzdD8ke3BhcmFtU3RyaW5nfWAsXG4gIClcbiAgY29uc3QgcmVzcG9uc2VKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gIGNhY2hlLnNldChwYXJhbVN0cmluZywgcmVzcG9uc2VKc29uKVxuICByZXR1cm4gcmVzcG9uc2VKc29uXG59XG5cbmNvbnN0IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlID0gKHBhcnRzOiBhbnlbXSB8IHVuZGVmaW5lZCkgPT4ge1xuICBpZiAoIXBhcnRzKSByZXR1cm4gW11cbiAgcmV0dXJuIFsuLi5wYXJ0c10uc29ydChcbiAgICAoYSwgYikgPT4gTnVtYmVyKGIuaXNfYmFzaWMgPz8gZmFsc2UpIC0gTnVtYmVyKGEuaXNfYmFzaWMgPz8gZmFsc2UpLFxuICApXG59XG5cbmV4cG9ydCBjb25zdCBqbGNQYXJ0c0VuZ2luZTogUGFydHNFbmdpbmUgPSB7XG4gIGZpbmRQYXJ0OiBhc3luYyAoe1xuICAgIHNvdXJjZUNvbXBvbmVudCxcbiAgICBmb290cHJpbnRlclN0cmluZyxcbiAgfSk6IFByb21pc2U8U3VwcGxpZXJQYXJ0TnVtYmVycz4gPT4ge1xuICAgIGNvbnN0IGpsY3BjYlBhY2thZ2UgPSBnZXRKbGNwY2JQYWNrYWdlTmFtZShmb290cHJpbnRlclN0cmluZylcblxuICAgIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNpc3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJyZXNpc3RvcnNcIiwge1xuICAgICAgICByZXNpc3RhbmNlOiBzb3VyY2VDb21wb25lbnQucmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocmVzaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2NhcGFjaXRvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNhcGFjaXRvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY2FwYWNpdG9yc1wiLCB7XG4gICAgICAgIGNhcGFjaXRhbmNlOiBzb3VyY2VDb21wb25lbnQuY2FwYWNpdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNhcGFjaXRvcnMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcGluX2hlYWRlclwiXG4gICAgKSB7XG4gICAgICBsZXQgcGl0Y2g6IG51bWJlciB8IHVuZGVmaW5lZFxuICAgICAgaWYgKGZvb3RwcmludGVyU3RyaW5nPy5pbmNsdWRlcyhcIl9wXCIpKSB7XG4gICAgICAgIHBpdGNoID0gTnVtYmVyKGZvb3RwcmludGVyU3RyaW5nLnNwbGl0KFwiX3BcIilbMV0pXG4gICAgICB9XG4gICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFxuICAgICAgICBcImhlYWRlcnNcIixcbiAgICAgICAgcGl0Y2hcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgICAgICAgICBudW1fcGluczogc291cmNlQ29tcG9uZW50LnBpbl9jb3VudCxcbiAgICAgICAgICAgICAgZ2VuZGVyOiBzb3VyY2VDb21wb25lbnQuZ2VuZGVyLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBudW1fcGluczogc291cmNlQ29tcG9uZW50LnBpbl9jb3VudCxcbiAgICAgICAgICAgICAgZ2VuZGVyOiBzb3VyY2VDb21wb25lbnQuZ2VuZGVyLFxuICAgICAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoaGVhZGVycylcbiAgICAgICAgICAubWFwKChoOiBhbnkpID0+IGBDJHtoLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9wb3RlbnRpb21ldGVyXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcG90ZW50aW9tZXRlcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG90ZW50aW9tZXRlcnNcIiwge1xuICAgICAgICByZXNpc3RhbmNlOiBzb3VyY2VDb21wb25lbnQubWF4X3Jlc2lzdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShwb3RlbnRpb21ldGVycylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9kaW9kZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGRpb2RlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJkaW9kZXNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoZGlvZGVzKVxuICAgICAgICAgIC5tYXAoKGQ6IGFueSkgPT4gYEMke2QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2NoaXBcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBjaGlwcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjaGlwc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShjaGlwcylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV90cmFuc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNpc3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwidHJhbnNpc3RvcnNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgICB0cmFuc2lzdG9yX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50cmFuc2lzdG9yX3R5cGUsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZSh0cmFuc2lzdG9ycylcbiAgICAgICAgICAubWFwKCh0OiBhbnkpID0+IGBDJHt0Lmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9wb3dlcl9zb3VyY2VcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3dlcl9zb3VyY2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInBvd2VyX3NvdXJjZXNcIiwge1xuICAgICAgICB2b2x0YWdlOiBzb3VyY2VDb21wb25lbnQudm9sdGFnZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvd2VyX3NvdXJjZXMpXG4gICAgICAgICAgLm1hcCgocDogYW55KSA9PiBgQyR7cC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfaW5kdWN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBpbmR1Y3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiaW5kdWN0b3JzXCIsIHtcbiAgICAgICAgaW5kdWN0YW5jZTogc291cmNlQ29tcG9uZW50LmluZHVjdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShpbmR1Y3RvcnMpXG4gICAgICAgICAgLm1hcCgoaTogYW55KSA9PiBgQyR7aS5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY3J5c3RhbFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNyeXN0YWxzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNyeXN0YWxzXCIsIHtcbiAgICAgICAgZnJlcXVlbmN5OiBzb3VyY2VDb21wb25lbnQuZnJlcXVlbmN5LFxuICAgICAgICBsb2FkX2NhcGFjaXRhbmNlOiBzb3VyY2VDb21wb25lbnQubG9hZF9jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNyeXN0YWxzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX21vc2ZldFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IG1vc2ZldHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwibW9zZmV0c1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIG1vc2ZldF9tb2RlOiBzb3VyY2VDb21wb25lbnQubW9zZmV0X21vZGUsXG4gICAgICAgIGNoYW5uZWxfdHlwZTogc291cmNlQ29tcG9uZW50LmNoYW5uZWxfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKG1vc2ZldHMpXG4gICAgICAgICAgLm1hcCgobTogYW55KSA9PiBgQyR7bS5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcmVzb25hdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzb25hdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJyZXNvbmF0b3JzXCIsIHtcbiAgICAgICAgZnJlcXVlbmN5OiBzb3VyY2VDb21wb25lbnQuZnJlcXVlbmN5LFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocmVzb25hdG9ycylcbiAgICAgICAgICAubWFwKChyOiBhbnkpID0+IGBDJHtyLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9zd2l0Y2hcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBzd2l0Y2hlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJzd2l0Y2hlc1wiLCB7XG4gICAgICAgIHN3aXRjaF90eXBlOiBzb3VyY2VDb21wb25lbnQudHlwZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHN3aXRjaGVzKVxuICAgICAgICAgIC5tYXAoKHM6IGFueSkgPT4gYEMke3MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2xlZFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGxlZHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwibGVkc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShsZWRzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Z1c2VcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBmdXNlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJmdXNlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShmdXNlcylcbiAgICAgICAgICAubWFwKChsOiBhbnkpID0+IGBDJHtsLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9LFxufVxuIiwgImltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBqbGNQYXJ0c0VuZ2luZSB9IGZyb20gXCJAdHNjaXJjdWl0L3BhcnRzLWVuZ2luZVwiXG5pbXBvcnQgeyBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbiB9IGZyb20gXCJraWNhZC1jb21wb25lbnQtY29udmVydGVyXCJcbmNvbnN0IEtJQ0FEX0ZPT1RQUklOVF9DQUNIRV9VUkwgPSBcImh0dHBzOi8va2ljYWQtbW9kLWNhY2hlLnRzY2lyY3VpdC5jb21cIlxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1Db25maWcgPSAoKTogUGxhdGZvcm1Db25maWcgPT4gKHtcbiAgcGFydHNFbmdpbmU6IGpsY1BhcnRzRW5naW5lLFxuICBmb290cHJpbnRMaWJyYXJ5TWFwOiB7XG4gICAga2ljYWQ6IGFzeW5jIChmb290cHJpbnROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMfS8ke2Zvb3RwcmludE5hbWV9YFxuICAgICAgY29uc3QgY2lyY3VpdEpzb25VcmwgPSBgJHtiYXNlVXJsfS5jaXJjdWl0Lmpzb25gXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjaXJjdWl0SnNvblVybClcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgIC8vIEZpbHRlciBwY2Jfc2lsa3NjcmVlbl90ZXh0IHRvIG9ubHkga2VlcCBlbnRyaWVzIHdpdGggdGV4dCA9PT0gXCJSRUYqKlwiXG4gICAgICAvLyBBcHBseSBmaWx0ZXJpbmcgb25seSB0byBlbGVtZW50cyBjb21pbmcgZnJvbSB0aGUga2ljYWRfbW9kX3NlcnZlciByZXNwb25zZVxuICAgICAgY29uc3QgZmlsdGVyZWQgPSBBcnJheS5pc0FycmF5KHJhdylcbiAgICAgICAgPyByYXcuZmlsdGVyKChlbCkgPT5cbiAgICAgICAgICAgIGVsPy50eXBlID09PSBcInBjYl9zaWxrc2NyZWVuX3RleHRcIiA/IGVsPy50ZXh0ID09PSBcIlJFRioqXCIgOiB0cnVlLFxuICAgICAgICAgIClcbiAgICAgICAgOiByYXdcbiAgICAgIGNvbnN0IHdybFVybCA9IGAke2Jhc2VVcmx9LndybGBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBmaWx0ZXJlZCxcbiAgICAgICAgY2FkTW9kZWw6IHsgd3JsVXJsLCBtb2RlbFVuaXRUb01tU2NhbGU6IDIuNTQgfSxcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuICBmb290cHJpbnRGaWxlUGFyc2VyTWFwOiB7XG4gICAga2ljYWRfbW9kOiB7XG4gICAgICBsb2FkRnJvbVVybDogYXN5bmMgKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpY2FkQ29udGVudCA9IGF3YWl0IGZldGNoKHVybCkudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgICAgICBjb25zdCBraWNhZEpzb24gPSBhd2FpdCBwYXJzZUtpY2FkTW9kVG9DaXJjdWl0SnNvbihraWNhZENvbnRlbnQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IEFycmF5LmlzQXJyYXkoa2ljYWRKc29uKVxuICAgICAgICAgICAgPyBraWNhZEpzb25cbiAgICAgICAgICAgIDogW2tpY2FkSnNvbl0sXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pXG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgbGV0IG5vcm1GaWxlUGF0aCA9IGZpbGVQYXRoXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGgudHJpbSgpXG4gIGlmIChub3JtRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDIpXG4gIH1cbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5zbGljZSgxKVxuICB9XG4gIHJldHVybiBub3JtRmlsZVBhdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZzTWFwKGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgW2ZzUGF0aCwgZmlsZUNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZzTWFwKSkge1xuICAgIG5vcm1hbGl6ZWRGc01hcFtub3JtYWxpemVGaWxlUGF0aChmc1BhdGgpXSA9IGZpbGVDb250ZW50XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWRGc01hcFxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuXG5leHBvcnQgdHlwZSBUc0NvbmZpZyA9IHtcbiAgY29tcGlsZXJPcHRpb25zPzoge1xuICAgIGJhc2VVcmw/OiBzdHJpbmdcbiAgICBwYXRocz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxuICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cbiAgfVxuICBleHRlbmRzPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgZmlsZXM/OiBzdHJpbmdbXVxuICByZWZlcmVuY2VzPzogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIGluY2x1ZGU/OiBzdHJpbmdbXVxuICBleGNsdWRlPzogc3RyaW5nW11cbiAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNDb25maWcoXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbik6IFRzQ29uZmlnIHwgbnVsbCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGZzTWFwT3JBbGxGaWxlUGF0aHMpKSByZXR1cm4gbnVsbFxuICBjb25zdCB0c2NvbmZpZ0NvbnRlbnQgPSBmc01hcE9yQWxsRmlsZVBhdGhzW1widHNjb25maWcuanNvblwiXVxuICBpZiAoIXRzY29uZmlnQ29udGVudCkgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRDb250ZW50ID0gdHNjb25maWdDb250ZW50LnJlcGxhY2UoXG4gICAgICAvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3xcXC9cXC8uKi9nLFxuICAgICAgXCJcIixcbiAgICApIC8vIHJlbW92ZSBjb21tZW50c1xuXG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzYW5pdGl6ZWRDb250ZW50KSBhcyBUc0NvbmZpZ1xuICAgIHJldHVybiBwYXJzZWRcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgdHNjb25maWcuanNvbjogJHtlLm1lc3NhZ2V9YClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzKG9wdHM6IHtcbiAgaW1wb3J0UGF0aDogc3RyaW5nXG4gIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcDogTWFwPHN0cmluZywgc3RyaW5nPlxuICBleHRlbnNpb25zOiBzdHJpbmdbXVxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsXG59KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHsgaW1wb3J0UGF0aCwgbm9ybWFsaXplZEZpbGVQYXRoTWFwLCBleHRlbnNpb25zLCB0c0NvbmZpZyB9ID0gb3B0c1xuICBjb25zdCBwYXRocyA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LnBhdGhzXG4gIGlmICghcGF0aHMpIHJldHVybiBudWxsXG4gIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsIHx8IFwiLlwiXG5cbiAgY29uc3QgdHJ5UmVzb2x2ZUNhbmRpZGF0ZSA9IChjYW5kaWRhdGU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDYW5kaWRhdGUgPSBub3JtYWxpemVGaWxlUGF0aChjYW5kaWRhdGUpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZENhbmRpZGF0ZSkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRDYW5kaWRhdGUpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZENhbmRpZGF0ZX0uJHtleHR9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQod2l0aEV4dCkhXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMocGF0aHMpKSB7XG4gICAgLy8gU3VwcG9ydCBwYXR0ZXJucyBsaWtlIFwiQHNyYy8qXCIgb3IgXCJ1dGlscy8qXCIgYW5kIGFsc28gZXhhY3QgbWF0Y2hlcyB3aXRob3V0IFwiKlwiXG4gICAgY29uc3QgaGFzV2lsZGNhcmQgPSBhbGlhcy5pbmNsdWRlcyhcIipcIilcbiAgICBpZiAoaGFzV2lsZGNhcmQpIHtcbiAgICAgIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBhbGlhcy5zcGxpdChcIipcIilcbiAgICAgIGlmIChcbiAgICAgICAgIWltcG9ydFBhdGguc3RhcnRzV2l0aChwcmVmaXgpIHx8XG4gICAgICAgICFpbXBvcnRQYXRoLmVuZHNXaXRoKHN1ZmZpeCB8fCBcIlwiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBzdGFyTWF0Y2ggPSBpbXBvcnRQYXRoLnNsaWNlKFxuICAgICAgICBwcmVmaXgubGVuZ3RoLFxuICAgICAgICBpbXBvcnRQYXRoLmxlbmd0aCAtIChzdWZmaXggPyBzdWZmaXgubGVuZ3RoIDogMCksXG4gICAgICApXG4gICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkID0gdGFyZ2V0LnJlcGxhY2UoXCIqXCIsIHN0YXJNYXRjaClcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICFyZXBsYWNlZC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAgICAgICA/IGAke2Jhc2VVcmx9LyR7cmVwbGFjZWR9YFxuICAgICAgICAgICAgOiByZXBsYWNlZFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRyeVJlc29sdmVDYW5kaWRhdGUoY2FuZGlkYXRlKVxuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW1wb3J0UGF0aCAhPT0gYWxpYXMpIGNvbnRpbnVlXG4gICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgICAgYmFzZVVybCAmJiAhdGFyZ2V0LnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdGFyZ2V0LnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAgICAgICA/IGAke2Jhc2VVcmx9LyR7dGFyZ2V0fWBcbiAgICAgICAgICAgIDogdGFyZ2V0XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwgPSByZXNvbHZlV2l0aEJhc2VVcmwoe1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gIH0pXG5cbiAgaWYgKHJlc29sdmVkUGF0aEZyb21CYXNlVXJsKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmxcblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdpdGhCYXNlVXJsKG9wdHM6IHtcbiAgaW1wb3J0UGF0aDogc3RyaW5nXG4gIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcDogTWFwPHN0cmluZywgc3RyaW5nPlxuICBleHRlbnNpb25zOiBzdHJpbmdbXVxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsXG59KTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHsgaW1wb3J0UGF0aCwgbm9ybWFsaXplZEZpbGVQYXRoTWFwLCBleHRlbnNpb25zLCB0c0NvbmZpZyB9ID0gb3B0c1xuICBjb25zdCBiYXNlVXJsID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybFxuICBpZiAoIWJhc2VVcmwpIHJldHVybiBudWxsXG5cbiAgY29uc3QgZmlsZVBhdGhUb1Jlc29sdmUgPSBgJHtiYXNlVXJsfS8ke2ltcG9ydFBhdGh9YFxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aFRvUmVzb2x2ZSlcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkRmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZEZpbGVQYXRoKSFcbiAgfVxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZEZpbGVQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHdpdGhFeHQpIVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihcbiAgaW1wb3J0UGF0aDogc3RyaW5nLFxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIGZhbHNlXG5cbiAgZm9yIChjb25zdCBbYWxpYXNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgJiYgaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggPT09IGFsaWFzKSByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB0eXBlIHtcbiAgQ2lyY3VpdFJ1bm5lckFwaSxcbiAgQ2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG59IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBjcmVhdGVFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4uLy4uL3dlYndvcmtlci9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBub3JtYWxpemVGc01hcCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IGdldFRzQ29uZmlnIH0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwid2Vid29ya2VyL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IHsgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkIH0gZnJvbSBcIi4vc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCJcbmltcG9ydCB7IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciB9IGZyb20gXCJsaWIvdXRpbHMvZW5oYW5jZS1yb290LWNpcmN1aXQtZXJyb3JcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6Q2lyY3VpdFJ1bm5lclwiKVxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuICBfZGVidWdOYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8Q2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24+ID0ge30pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgYXN5bmMgdmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBcIjAuMC4wXCJcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuXG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIERlYnVnLmVuYWJsZShcInRzY2k6ZXZhbDoqXCIpXG4gICAgfVxuXG4gICAgZGVidWcoXCJleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgICBmc01hcEtleXM6IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLFxuICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgIH0pXG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIGRlYnVnKFwiZW50cnlwb2ludCBhZnRlciBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQ6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICB9KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcCA9IG5vcm1hbGl6ZUZzTWFwKG9wdHMuZnNNYXApXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IGdldFRzQ29uZmlnKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXApXG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW29wdHMuZW50cnlwb2ludCFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgXCIke29wdHMuZW50cnlwb2ludH1cIiBub3QgZm91bmRgKVxuICAgIH1cbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IS5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gb3B0cy5lbnRyeXBvaW50XG4gICAgICA6IGAuLyR7b3B0cy5lbnRyeXBvaW50fWBcblxuICAgIGRlYnVnKFwiZmluYWwgZW50cnlwb2ludDpcIiwgZW50cnlwb2ludClcbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChlbnRyeXBvaW50ISwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoY29kZTogc3RyaW5nLCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlIGNhbGxlZCB3aXRoIGNvZGUgbGVuZ3RoOlwiLFxuICAgICAgICBjb2RlLmxlbmd0aCxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbXBvbmVudChjb21wb25lbnQ6IGFueSwgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlQ29tcG9uZW50IGNhbGxlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IG51bGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgPyBjb21wb25lbnQoKSA6IGNvbXBvbmVudFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5hZGQoZWxlbWVudCBhcyBhbnkpXG4gIH1cblxuICBvbihldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdID8/PSBbXVxuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBjYWxsYmFjaylcbiAgfVxuXG4gIGFzeW5jIHJlbmRlclVudGlsU2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LnJlbmRlclVudGlsU2V0dGxlZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDaXJjdWl0SnNvbigpOiBQcm9taXNlPEFueUNpcmN1aXRFbGVtZW50W10+IHtcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNpcmN1aXQgaGFzIGJlZW4gY3JlYXRlZFwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5nZXRDaXJjdWl0SnNvbigpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvcihcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjbGVhckV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0KSB7XG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogPGV4cGxhbmF0aW9uPlxuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXI/OiAoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEZ1bmN0aW9uKSA9PiB2b2lkXG4gICAgICAgICAgfVxuICAgICAgICAgIGNpcmN1aXQucmVtb3ZlTGlzdGVuZXI/LihldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdXG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpIHtcbiAgICAvLyBDbGVhbnVwIHJlc291cmNlc1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBudWxsXG4gIH1cblxuICBhc3luYyBzZXRTbmlwcGV0c0FwaUJhc2VVcmwoYmFzZVVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsID0gYmFzZVVybFxuICB9XG5cbiAgYXN5bmMgc2V0UGxhdGZvcm1Db25maWcocGxhdGZvcm06IFBsYXRmb3JtQ29uZmlnKSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0gPSBwbGF0Zm9ybVxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZyhwcm9qZWN0OiBQYXJ0aWFsPFBsYXRmb3JtQ29uZmlnPikge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSBwcm9qZWN0XG4gIH1cblxuICBhc3luYyBlbmFibGVEZWJ1ZyhuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIHRoaXMuX2RlYnVnTmFtZXNwYWNlID0gbmFtZXNwYWNlXG4gICAgaWYgKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgYW55XG4gICAgICBjaXJjdWl0LmVuYWJsZURlYnVnPy4obmFtZXNwYWNlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2JpbmRFdmVudExpc3RlbmVycyhjaXJjdWl0OiBSb290Q2lyY3VpdCkge1xuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgIGNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBsaXN0ZW5lciBhcyBhbnkpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiBhIHBhdGgsIHNpbWlsYXIgdG8gTm9kZS5qcyBwYXRoLmRpcm5hbWVcbiAqIFdvcmtzIG9uIGJvdGggVW5peCBhbmQgV2luZG93cyBwYXRoc1xuICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gZXh0cmFjdCB0aGUgZGlyZWN0b3J5IGZyb21cbiAqIEByZXR1cm5zIFRoZSBkaXJlY3RvcnkgcGFydCBvZiB0aGUgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlybmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXBhdGgpIHJldHVybiBcIi5cIlxuXG4gIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzXG4gIGNvbnN0IGNsZWFuUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcblxuICAvLyBJZiB0aGVyZSBhcmUgbm8gc2xhc2hlcywgcmV0dXJuIFwiLlwiXG4gIGlmIChjbGVhblBhdGguaW5kZXhPZihcIi9cIikgPT09IC0xKSByZXR1cm4gXCIuXCJcblxuICAvLyBSZXR1cm4gZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCBzbGFzaFxuICByZXR1cm4gY2xlYW5QYXRoLnN1YnN0cmluZygwLCBjbGVhblBhdGgubGFzdEluZGV4T2YoXCIvXCIpKSB8fCBcIi9cIlxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuLyoqXG4gKiBSZXNvbHZlIGFuIGltcG9ydFBhdGggcmVsYXRpdmUgdG8gYSBjd2QsIHN1cHBvcnRpbmcgLi4vLCAuLyBhbmQgYWJzb2x1dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IHJlc29sdmVSZWxhdGl2ZVBhdGggfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGhcIlxuaW1wb3J0IHtcbiAgcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzLFxuICB0eXBlIFRzQ29uZmlnLFxuICByZXNvbHZlV2l0aEJhc2VVcmwsXG59IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGwgfSA9IHt9LFxuKSA9PiB7XG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb24gcHJvcGVybHlcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gY3dkXG4gICAgPyByZXNvbHZlUmVsYXRpdmVQYXRoKHVua25vd25GaWxlUGF0aCwgY3dkKVxuICAgIDogdW5rbm93bkZpbGVQYXRoXG5cbiAgY29uc3QgZmlsZVBhdGhzID0gbmV3IFNldChcbiAgICBBcnJheS5pc0FycmF5KGZzTWFwT3JBbGxGaWxlUGF0aHMpXG4gICAgICA/IGZzTWFwT3JBbGxGaWxlUGF0aHNcbiAgICAgIDogT2JqZWN0LmtleXMoZnNNYXBPckFsbEZpbGVQYXRocyksXG4gIClcblxuICBpZiAoZmlsZVBhdGhzLmhhcyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aFxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5zZXQobm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGgpLCBmaWxlUGF0aClcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGggPSBub3JtYWxpemVGaWxlUGF0aChyZXNvbHZlZFBhdGgpXG5cbiAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSFcbiAgfVxuXG4gIC8vIFNlYXJjaCBmb3IgZmlsZSB3aXRoIGEgc2V0IG9mIGRpZmZlcmVudCBleHRlbnNpb25zXG4gIGNvbnN0IGV4dGVuc2lvbiA9IFtcInRzeFwiLCBcInRzXCIsIFwianNvblwiLCBcImpzXCIsIFwianN4XCIsIFwib2JqXCIsIFwiZ2x0ZlwiLCBcImdsYlwiXVxuICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb24pIHtcbiAgICBjb25zdCBwb3NzaWJsZUZpbGVQYXRoID0gYCR7bm9ybWFsaXplZFJlc29sdmVkUGF0aH0uJHtleHR9YFxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICB9XG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHVzaW5nIHRzY29uZmlnIFwicGF0aHNcIiBtYXBwaW5nIHdoZW4gdGhlIGltcG9ydCBpcyBub24tcmVsYXRpdmVcbiAgY29uc3QgdHNDb25maWcgPSBvcHRzLnRzQ29uZmlnID8/IG51bGxcblxuICBpZiAoIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbVBhdGhzID0gcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbixcbiAgICAgIHRzQ29uZmlnLFxuICAgIH0pXG4gICAgaWYgKHJlc29sdmVkUGF0aEZyb21QYXRocykgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21QYXRoc1xuXG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwgPSByZXNvbHZlV2l0aEJhc2VVcmwoe1xuICAgICAgaW1wb3J0UGF0aDogdW5rbm93bkZpbGVQYXRoLFxuICAgICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9uLFxuICAgICAgdHNDb25maWcsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhYnNvbHV0ZSBpbXBvcnRcbiAgaWYgKCF1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpICYmICF1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4uL1wiKSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb24pIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkVW5rbm93bkZpbGVQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuICBvcHRzOiB7IHRzQ29uZmlnPzogVHNDb25maWcgfCBudWxsIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIHVua25vd25GaWxlUGF0aCxcbiAgICBmc01hcE9yQWxsRmlsZVBhdGhzLFxuICAgIGN3ZCxcbiAgICBvcHRzLFxuICApXG4gIGlmICghcmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaWxlIG5vdCBmb3VuZCBcIiR7dW5rbm93bkZpbGVQYXRofVwiLCBhdmFpbGFibGUgcGF0aHM6XFxuXFxuJHtPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKS5qb2luKFwiLCBcIil9YCxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkRmlsZVBhdGhcbn1cbiIsICJleHBvcnQgY29uc3QgZ2V0SW1wb3J0c0Zyb21Db2RlID0gKGNvZGU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyopP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGZ1bGxNYXRjaCA9IG1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmltcG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSlcbiAgfVxuXG4gIC8vIE1hdGNoIHJlLWV4cG9ydHNcbiAgY29uc3QgcmVFeHBvcnRSZWdleCA9XG4gICAgL15cXHMqZXhwb3J0XFxzKyg/OnR5cGVcXHMrKT8oPzpcXCpcXHMrYXNcXHMrW1xcdyRdK3xcXCp8XFx7W159XStcXH0pXFxzK2Zyb21cXHMqWydcIl0oLis/KVsnXCJdL2dtXG4gIGxldCByZUV4cG9ydE1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgocmVFeHBvcnRNYXRjaCA9IHJlRXhwb3J0UmVnZXguZXhlYyhjb2RlKSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBmdWxsTWF0Y2ggPSByZUV4cG9ydE1hdGNoWzBdXG4gICAgaWYgKC9eXFxzKmV4cG9ydFxccyt0eXBlXFxiLy50ZXN0KGZ1bGxNYXRjaCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGltcG9ydHMucHVzaChyZUV4cG9ydE1hdGNoWzFdKVxuICB9XG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QpXG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1sb2NhbC1maWxlXCIpXG5cbmV4cG9ydCBjb25zdCBpbXBvcnRMb2NhbEZpbGUgPSBhc3luYyAoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pID0+IHtcbiAgZGVidWcoXCJpbXBvcnRMb2NhbEZpbGUgY2FsbGVkIHdpdGg6XCIsIHtcbiAgICBpbXBvcnROYW1lLFxuICB9KVxuXG4gIGNvbnN0IHsgZnNNYXAsIHByZVN1cHBsaWVkSW1wb3J0cywgaW1wb3J0U3RhY2ssIGN1cnJlbnRseUltcG9ydGluZyB9ID0gY3R4XG5cbiAgY29uc3QgZnNQYXRoID0gcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhpbXBvcnROYW1lLCBmc01hcCwgdW5kZWZpbmVkLCB7XG4gICAgdHNDb25maWc6IGN0eC50c0NvbmZpZyxcbiAgfSlcbiAgZGVidWcoXCJmc1BhdGg6XCIsIGZzUGF0aClcbiAgaWYgKGN1cnJlbnRseUltcG9ydGluZy5oYXMoZnNQYXRoKSkge1xuICAgIGNvbnN0IGN5Y2xlU3RhcnRJbmRleCA9IGltcG9ydFN0YWNrLmluZGV4T2YoZnNQYXRoKVxuICAgIGNvbnN0IGN5Y2xlUGF0aCA9XG4gICAgICBjeWNsZVN0YXJ0SW5kZXggPj0gMFxuICAgICAgICA/IGltcG9ydFN0YWNrLnNsaWNlKGN5Y2xlU3RhcnRJbmRleCkuY29uY2F0KGZzUGF0aClcbiAgICAgICAgOiBbLi4uaW1wb3J0U3RhY2ssIGZzUGF0aF1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCB3aGlsZSBpbXBvcnRpbmcgXCIke2ZzUGF0aH1cIi4gVGhlIGZvbGxvd2luZyBpbXBvcnQgY2hhaW4gZm9ybXMgYSBjeWNsZTpcXG5cXG4ke2N5Y2xlUGF0aC5qb2luKFxuICAgICAgICBcIiAtPiBcIixcbiAgICAgICl9YCxcbiAgICApXG4gIH1cblxuICBpZiAoIWN0eC5mc01hcFtmc1BhdGhdKSB7XG4gICAgZGVidWcoXCJmc1BhdGggbm90IGZvdW5kIGluIGZzTWFwOlwiLCBmc1BhdGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIFwiJHtmc1BhdGh9XCIgbm90IGZvdW5kYClcbiAgfVxuICBjb25zdCBmaWxlQ29udGVudCA9IGZzTWFwW2ZzUGF0aF1cbiAgZGVidWcoXCJmaWxlQ29udGVudDpcIiwgZmlsZUNvbnRlbnQ/LnNsaWNlKDAsIDEwMCkpXG4gIGN1cnJlbnRseUltcG9ydGluZy5hZGQoZnNQYXRoKVxuICBpbXBvcnRTdGFjay5wdXNoKGZzUGF0aClcbiAgdHJ5IHtcbiAgICBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShmaWxlQ29udGVudClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBkZWZhdWx0OiBqc29uRGF0YSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU3RhdGljQXNzZXRQYXRoKGZzUGF0aCkpIHtcbiAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgIC8vIFVzZSBwcm9qZWN0QmFzZVVybCBmb3Igc3RhdGljIGZpbGUgaW1wb3J0c1xuICAgICAgY29uc3Qgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgIGZzUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgPyBmc1BhdGguc2xpY2UoMikgOiBmc1BhdGhcbiAgICAgIH1gXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IHtcbiAgICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgZGVmYXVsdDogc3RhdGljVXJsLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICAgIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGZpbGVDb250ZW50KVxuXG4gICAgICBmb3IgKGNvbnN0IGltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICAgICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICAgICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChpbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICAgICAgY3dkOiBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKVxuICAgICAgICBkZWJ1ZyhcImV2YWxDb21waWxlZEpzIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICAgICAgY29kZTogdHJhbnNmb3JtZWRDb2RlLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgZGlybmFtZTogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBpbXBvcnRSdW5SZXN1bHQgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgICB0cmFuc2Zvcm1lZENvZGUsXG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgKVxuICAgICAgICBkZWJ1ZyhcImltcG9ydFJ1blJlc3VsdDpcIiwge1xuICAgICAgICAgIGZzUGF0aCxcbiAgICAgICAgICBpbXBvcnRSdW5SZXN1bHQsXG4gICAgICAgIH0pXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gaW1wb3J0UnVuUmVzdWx0LmV4cG9ydHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFdmFsIGNvbXBpbGVkIGpzIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgICAgLy8gRm9yIC5qcyBmaWxlcywgZXNwZWNpYWxseSBmcm9tIG5vZGVfbW9kdWxlcywgd2UgbmVlZCB0byB0cmFuc2Zvcm0gdGhlbVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aCksXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgZGlybmFtZShmc1BhdGgpLFxuICAgICAgKS5leHBvcnRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIFwiJHtmc1BhdGguc3BsaXQoXCIuXCIpLnBvcCgpfVwiIGZvciBcIiR7ZnNQYXRofVwiYCxcbiAgICAgIClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaW1wb3J0U3RhY2sucG9wKClcbiAgICBjdXJyZW50bHlJbXBvcnRpbmcuZGVsZXRlKGZzUGF0aClcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUyA9IFtcbiAgXCIuZ2xiXCIsXG4gIFwiLmtpY2FkX21vZFwiLFxuICBcIi5nbHRmXCIsXG4gIFwiLm9ialwiLFxuICBcIi5zdGxcIixcbl1cblxuZXhwb3J0IGNvbnN0IGlzU3RhdGljQXNzZXRQYXRoID0gKHBhdGg6IHN0cmluZykgPT5cbiAgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMuc29tZSgoZXh0KSA9PiBwYXRoLmVuZHNXaXRoKGV4dCkpXG4iLCAiaW1wb3J0IHsgdHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybSBhcyBTdWNyYXNlVHJhbnNmb3JtIH0gZnJvbSBcInN1Y3Jhc2VcIlxuXG5jb25zdCBUU19FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHNcIiwgXCIudHN4XCIsIFwiLm10c1wiLCBcIi5jdHNcIl0pXG5jb25zdCBKU1hfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzeFwiLCBcIi5qc3hcIiwgXCIudHNcIl0pXG5cbmNvbnN0IHN0cmlwUXVlcnlBbmRIYXNoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcXVlcnlJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCI/XCIpXG4gIGNvbnN0IGhhc2hJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCIjXCIpXG5cbiAgbGV0IGVuZEluZGV4ID0gZmlsZVBhdGgubGVuZ3RoXG5cbiAgaWYgKHF1ZXJ5SW5kZXggIT09IC0xICYmIGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IE1hdGgubWluKHF1ZXJ5SW5kZXgsIGhhc2hJbmRleClcbiAgfSBlbHNlIGlmIChxdWVyeUluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gcXVlcnlJbmRleFxuICB9IGVsc2UgaWYgKGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IGhhc2hJbmRleFxuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKDAsIGVuZEluZGV4KVxufVxuXG5jb25zdCBnZXRFeHRlbnNpb24gPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHN0cmlwUXVlcnlBbmRIYXNoKGZpbGVQYXRoKVxuICBjb25zdCBsYXN0RG90SW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi5cIilcblxuICBpZiAobGFzdERvdEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IE1hdGgubWF4KFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSxcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIlxcXFxcIiksXG4gIClcblxuICBpZiAobGFzdFNsYXNoSW5kZXggPiBsYXN0RG90SW5kZXgpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnNsaWNlKGxhc3REb3RJbmRleCkudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZVBhdGgpXG5cbiAgY29uc3QgdHJhbnNmb3JtczogU3VjcmFzZVRyYW5zZm9ybVtdID0gW1wiaW1wb3J0c1wiXVxuXG4gIGlmIChUU19FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy51bnNoaWZ0KFwidHlwZXNjcmlwdFwiKVxuICB9XG5cbiAgaWYgKEpTWF9FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy5wdXNoKFwianN4XCIpXG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3Jtc1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgPSAoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybXMgPSBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGgoZmlsZVBhdGgpXG4gIGNvbnN0IHsgY29kZTogdHJhbnNmb3JtZWRDb2RlIH0gPSB0cmFuc2Zvcm0oY29kZSwge1xuICAgIGZpbGVQYXRoLFxuICAgIHByb2R1Y3Rpb246IHRydWUsXG4gICAgdHJhbnNmb3JtcyxcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRDb2RlXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNuaXBwZXQoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBmdWxsU25pcHBldE5hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikucmVwbGFjZShcIi5cIiwgXCIvXCIpXG5cbiAgY29uc3QgeyBjanMsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKGAke2N0eC5janNSZWdpc3RyeVVybH0vJHtmdWxsU25pcHBldE5hbWV9YClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiAoeyBjanM6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH0pKVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNqczogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIGNqcyEsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgKS5leHBvcnRzXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIHNuaXBwZXRcIiwgZSlcbiAgfVxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+XG59XG5cbmludGVyZmFjZSBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBleHRlbnNpb25zOiBzdHJpbmdbXVxuICBiYXNlUGF0aDogc3RyaW5nXG4gIG1vZHVsZVBhdGg6IHN0cmluZ1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBmc01hcCxcbiAgICBleHRlbnNpb25zOiBbXCIuanNcIiwgXCIuanN4XCIsIFwiLnRzXCIsIFwiLnRzeFwiLCBcIi5qc29uXCJdLFxuICAgIGJhc2VQYXRoLFxuICAgIG1vZHVsZVBhdGgsXG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLCBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCkge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9L3BhY2thZ2UuanNvbmBcbiAgaWYgKCFjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgYXMgUGFja2FnZUpzb25cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoXG4gIHBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGN0eC5mc01hcFtwYXRoXSkgcmV0dXJuIHBhdGhcblxuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IHBhdGhXaXRoRXh0ID0gcGF0aC5yZXBsYWNlKC9cXC5qcyR8XFwuanN4JC8sIFwiXCIpICsgZXh0XG4gICAgaWYgKGN0eC5mc01hcFtwYXRoV2l0aEV4dF0pIHJldHVybiBwYXRoV2l0aEV4dFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgZXhwb3J0UGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBmdWxsRXhwb3J0UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vJHtleHBvcnRQYXRoLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKX1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbEV4cG9ydFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcGFja2FnZUpzb24uZXhwb3J0cykgcmV0dXJuIG51bGxcblxuICAvLyBIYW5kbGUgZGVmYXVsdCBleHBvcnQgY29uZGl0aW9uXG4gIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBwYWNrYWdlSnNvbi5leHBvcnRzW1wiLlwiXVxuICBpZiAocmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJiBkZWZhdWx0RXhwb3J0KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZhdWx0RXhwb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgZGVmYXVsdEV4cG9ydCwgY3R4KVxuICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBleHBvcnRzXG4gIGNvbnN0IHN1YnBhdGhFeHBvcnQgPSByZW1haW5pbmdQYXRoXG4gICAgPyBwYWNrYWdlSnNvbi5leHBvcnRzW2AuLyR7cmVtYWluaW5nUGF0aH1gXVxuICAgIDogbnVsbFxuICBpZiAoc3VicGF0aEV4cG9ydCAmJiB0eXBlb2Ygc3VicGF0aEV4cG9ydCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBzdWJwYXRoRXhwb3J0LCBjdHgpXG4gICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb25kaXRpb25hbCBleHBvcnRzXG4gIGNvbnN0IGltcG9ydEV4cG9ydCA9IHBhY2thZ2VKc29uLmV4cG9ydHNbXCJpbXBvcnRcIl1cbiAgaWYgKFxuICAgIHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiZcbiAgICBpbXBvcnRFeHBvcnQgJiZcbiAgICB0eXBlb2YgaW1wb3J0RXhwb3J0ID09PSBcInN0cmluZ1wiXG4gICkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBpbXBvcnRFeHBvcnQsIGN0eClcbiAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09IFwiLlwiID8gXCJcIiA6IGAke3NlYXJjaFBhdGh9L2B9bm9kZV9tb2R1bGVzLyR7c2NvcGV9YFxuXG4gIC8vIFRyeSB0byBmaW5kIHBhY2thZ2UuanNvblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGgsIGN0eClcbiAgaWYgKHBhY2thZ2VKc29uKSB7XG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIGV4cG9ydHMgZmllbGRcbiAgICBjb25zdCBleHBvcnRzUmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgcmVtYWluaW5nUGF0aCxcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGV4cG9ydHNSZXNvbHV0aW9uKSByZXR1cm4gZXhwb3J0c1Jlc29sdXRpb25cblxuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBtYWluL21vZHVsZSBmaWVsZHNcbiAgICBjb25zdCBlbnRyeVBvaW50UmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRW50cnlQb2ludChcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZW50cnlQb2ludFJlc29sdXRpb24pIHJldHVybiBlbnRyeVBvaW50UmVzb2x1dGlvblxuICB9XG5cbiAgLy8gVHJ5IHJlc29sdmluZyByZW1haW5pbmcgcGF0aFxuICBjb25zdCByZW1haW5pbmdQYXRoUmVzb2x1dGlvbiA9IHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICByZW1haW5pbmdQYXRoLFxuICAgIGN0eCxcbiAgKVxuICBpZiAocmVtYWluaW5nUGF0aFJlc29sdXRpb24pIHJldHVybiByZW1haW5pbmdQYXRoUmVzb2x1dGlvblxuXG4gIC8vIElmIG5vdCBmb3VuZCBhbmQgd2UgaGF2ZSBhIHBhcmVudCBkaXJlY3RvcnksIHRyeSB0aGVyZVxuICBjb25zdCBwYXJlbnRQYXRoID0gZGlybmFtZShzZWFyY2hQYXRoKVxuICBpZiAocGFyZW50UGF0aCAmJiBwYXJlbnRQYXRoICE9PSBzZWFyY2hQYXRoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKHBhcmVudFBhdGgsIGN0eClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZShcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KG1vZHVsZVBhdGgsIGZzTWFwLCBiYXNlUGF0aClcbiAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKGN0eC5iYXNlUGF0aCwgY3R4KVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcblxuZXhwb3J0IGNvbnN0IGltcG9ydE5vZGVNb2R1bGUgPSBhc3luYyAoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pID0+IHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHguZnNNYXAsIFwiXCIpXG5cbiAgaWYgKCFyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBub3QgZm91bmRgKVxuICB9XG5cbiAgLy8gVXNlIGltcG9ydExvY2FsRmlsZSB0byBoYW5kbGUgdGhlIG5vZGUgbW9kdWxlXG4gIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZE5vZGVNb2R1bGVQYXRoLCBjdHgsIGRlcHRoKVxuXG4gIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZSdzIGV4cG9ydHNcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gTWFwIHdpdGhvdXQgbm9kZV9tb2R1bGVzIHByZWZpeCBmb3IgZGlyZWN0IGltcG9ydHNcbiAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZFBhdGhdID1cbiAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBIYW5kbGUgaW5kZXggZmlsZXMgc3BlY2lhbGx5XG4gIGlmIChcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzeFwiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHNcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LmpzXCIpXG4gICkge1xuICAgIGNvbnN0IGRpclBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL1xcL2luZGV4XFwuKHRzeD98anMpJC8sIFwiXCIpXG4gICAgY29uc3QgdW5wcmVmaXhlZERpclBhdGggPSBkaXJQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkRGlyUGF0aF0gPVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgICAvLyBIYW5kbGUgc2NvcGVkIHBhY2thZ2VzXG4gICAgaWYgKHVucHJlZml4ZWREaXJQYXRoLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICBjb25zdCBzY29wZVBhcnRzID0gdW5wcmVmaXhlZERpclBhdGguc3BsaXQoXCIvXCIpXG4gICAgICBpZiAoc2NvcGVQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBzY29wZWROYW1lID0gYCR7c2NvcGVQYXJ0c1swXX0vJHtzY29wZVBhcnRzWzFdfWBcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Njb3BlZE5hbWVdID1cbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ucG0tcGFja2FnZVwiKVxuXG5mdW5jdGlvbiBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIodXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL1wiXG4gIGlmICh1cmwuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gIH1cbiAgcmV0dXJuIHVybFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0TnBtUGFja2FnZShcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikge1xuICBkZWJ1ZyhgaW1wb3J0aW5nIG5wbSBwYWNrYWdlOiAke2ltcG9ydE5hbWV9YClcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuXG4gIGNvbnN0IG5wbUNkblVybCA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtLyR7aW1wb3J0TmFtZX0vK2VzbWBcblxuICBsZXQgZmluYWxVcmw6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBjb25zdCB7IGNvbnRlbnQsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKG5wbUNkblVybClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiB7XG4gICAgICBmaW5hbFVybCA9IHJlcy51cmxcbiAgICAgIGlmICghcmVzLm9rKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmZXRjaCBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIGpzZGVsaXZyOiAke3Jlcy5zdGF0dXNUZXh0fVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgcmV0dXJuIHsgY29udGVudDogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfVxuICAgIH0pXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY29udGVudDogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgbnBtIGltcG9ydFwiLCBpbXBvcnROYW1lLCBlcnJvcilcbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgY29uc3QgZmluYWxJbXBvcnROYW1lID0gZXh0cmFjdFBhY2thZ2VQYXRoRnJvbUpTRGVsaXZyKGZpbmFsVXJsISlcbiAgY29uc3QgY3dkID0gZGlybmFtZShmaW5hbEltcG9ydE5hbWUpXG5cbiAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoY29udGVudCEpXG4gIGZvciAoY29uc3Qgc3ViSW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW3N1YkltcG9ydE5hbWVdKSB7XG4gICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChzdWJJbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICBjd2QsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKFxuICAgIGNvbnRlbnQhLFxuICAgIGZpbmFsSW1wb3J0TmFtZSB8fCBpbXBvcnROYW1lLFxuICApXG4gIHRyeSB7XG4gICAgY29uc3QgZXhwb3J0cyA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgY3dkLFxuICAgICkuZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxJbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxVcmwhXSA9IGV4cG9ydHNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV2YWwgbnBtIHBhY2thZ2UgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2UubWVzc2FnZX1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5wbVBhY2thZ2UgfSBmcm9tIFwiLi9pbXBvcnQtbnBtLXBhY2thZ2VcIlxuaW1wb3J0IHtcbiAgZ2V0VHNDb25maWcsXG4gIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuLFxufSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ldmFsLXBhdGhcIilcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEV2YWxQYXRoKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuICBvcHRzOiB7XG4gICAgY3dkPzogc3RyaW5nXG4gIH0gPSB7fSxcbikge1xuICBkZWJ1ZyhcImltcG9ydEV2YWxQYXRoIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCxcbiAgICBvcHRzLFxuICB9KVxuICBjdHgubG9nZ2VyLmluZm8oXG4gICAgYGltcG9ydEV2YWxQYXRoKFwiJHtpbXBvcnROYW1lfVwiLCB7Y3dkOiBcIiR7b3B0cy5jd2R9XCIsIGRlcHRoOiAke2RlcHRofX0pYCxcbiAgKVxuXG4gIGRlYnVnKGAke1wiICBcIi5yZXBlYXQoZGVwdGgpfVx1MjdBMVx1RkUwRmAsIGltcG9ydE5hbWUpXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzFdYClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLi9cIikgJiYgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWUuc2xpY2UoMildKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzJdYClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChkZXB0aCA+IDUpIHtcbiAgICBjb25zb2xlLmxvZyhcIk1heCBkZXB0aCBmb3IgaW1wb3J0cyByZWFjaGVkXCIpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL25wbS9cIikpIHtcbiAgICBjb25zdCBwa2dOYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKC9eXFwvbnBtXFwvLywgXCJcIikucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROcG1QYWNrYWdlKFwiJHtwa2dOYW1lfVwiKWApXG4gICAgYXdhaXQgaW1wb3J0TnBtUGFja2FnZShwa2dOYW1lLCBjdHgsIGRlcHRoKVxuICAgIGNvbnN0IHBrZyA9IHByZVN1cHBsaWVkSW1wb3J0c1twa2dOYW1lXVxuICAgIGlmIChwa2cpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHBrZ1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkLFxuICAgIHsgdHNDb25maWc6IGN0eC50c0NvbmZpZyB9LFxuICApXG4gIGlmIChyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TG9jYWxGaWxlKFwiJHtyZXNvbHZlZExvY2FsSW1wb3J0UGF0aH1cIilgKVxuICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCwgY3R4LCBkZXB0aClcbiAgICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lICh3aGljaCBtaWdodCBiZSBhIHRzY29uZmlnIHBhdGggYWxpYXMpIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAgICBpZiAoaW1wb3J0TmFtZSAhPT0gcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9XG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZExvY2FsSW1wb3J0UGF0aF1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGlzIG1hdGNoZXMgYSB0c2NvbmZpZyBwYXRoIHBhdHRlcm4gYnV0IGZhaWxlZCB0byByZXNvbHZlXG4gIC8vIElmIHNvLCB0aHJvdyBhbiBlcnJvciBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0byBucG1cbiAgY29uc3QgdHNDb25maWcgPSBjdHgudHNDb25maWcgPz8gZ2V0VHNDb25maWcoY3R4LmZzTWFwKVxuICBpZiAoIWN0eC50c0NvbmZpZyAmJiB0c0NvbmZpZykge1xuICAgIGN0eC50c0NvbmZpZyA9IHRzQ29uZmlnXG4gIH1cbiAgaWYgKG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuKGltcG9ydE5hbWUsIHRzQ29uZmlnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggYWxpYXMgYnV0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhbiBleGlzdGluZyBmaWxlJHtvcHRzLmN3ZCA/IGAgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgIClcbiAgfVxuXG4gIC8vIFRyeSB0byByZXNvbHZlIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShcbiAgICBpbXBvcnROYW1lLFxuICAgIGN0eC5mc01hcCxcbiAgICBvcHRzLmN3ZCB8fCBcIlwiLFxuICApXG4gIGlmIChyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGByZXNvbHZlZE5vZGVNb2R1bGVQYXRoPVwiJHtyZXNvbHZlZE5vZGVNb2R1bGVQYXRofVwiYClcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5vZGVNb2R1bGUoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0Tm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkB0c2NpL1wiKSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0U25pcHBldChcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnRTbmlwcGV0KGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0TnBtUGFja2FnZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBVbnJlc29sdmVkIGltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiAke29wdHMuY3dkID8gYGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwiLi9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6c2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCIpXG5cbmV4cG9ydCBjb25zdCBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgPSAob3B0czoge1xuICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxufSkgPT4ge1xuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiAhb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIGlmIChcImluZGV4LnRzeFwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzeFwiXG4gICAgfSBlbHNlIGlmIChcImluZGV4LnRzXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHNcIlxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5maWx0ZXIoKGspID0+IGsuZW5kc1dpdGgoXCIudHN4XCIpKS5sZW5ndGggPT09IDFcbiAgICApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKVswXVxuICAgIH0gZWxzZSBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBjb25zdCBjb25maWdDb250ZW50ID0gb3B0cy5mc01hcFtcInRzY2lyY3VpdC5jb25maWcuanNvblwiXVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KVxuICAgICAgICBpZiAoY29uZmlnLm1haW5FbnRyeXBvaW50KSB7XG4gICAgICAgICAgb3B0cy5lbnRyeXBvaW50ID0gY29uZmlnLm1haW5FbnRyeXBvaW50XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIHRzY2lyY3VpdC5jb25maWcuanNvbjpcIiwgZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkVpdGhlciBlbnRyeXBvaW50IG9yIG1haW5Db21wb25lbnRQYXRoIG11c3QgYmUgcHJvdmlkZWQgKG5vIGluZGV4IGZpbGUsIGNvdWxkIG5vdCBpbmZlciBlbnRyeXBvaW50KVwiLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmIG9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBvcHRzLmVudHJ5cG9pbnQgPSBcImVudHJ5cG9pbnQudHN4XCJcbiAgICBjb25zdCBtYWluQ29tcG9uZW50Q29kZSA9XG4gICAgICBvcHRzLmZzTWFwW3Jlc29sdmVGaWxlUGF0aE9yVGhyb3cob3B0cy5tYWluQ29tcG9uZW50UGF0aCwgb3B0cy5mc01hcCldXG4gICAgaWYgKCFtYWluQ29tcG9uZW50Q29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWFpbiBjb21wb25lbnQgcGF0aCBcIiR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIiBub3QgZm91bmQgaW4gZnNNYXAuIEF2YWlsYWJsZSBwYXRoczogJHtPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5qb2luKFwiLCBcIil9YCxcbiAgICAgIClcbiAgICB9XG4gICAgb3B0cy5mc01hcFtvcHRzLmVudHJ5cG9pbnRdID0gYFxuICAgICBpbXBvcnQgKiBhcyBVc2VyQ29tcG9uZW50cyBmcm9tIFwiLi8ke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCI7XG4gICAgICAgICAgXG4gICAgICAke1xuICAgICAgICBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gICAgICAgICAgPyBgXG4gICAgICAgIGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHNbXCIke29wdHMubWFpbkNvbXBvbmVudE5hbWV9XCJdXG4gICAgICAgIGBcbiAgICAgICAgICA6IGBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzLmRlZmF1bHQgfHwgXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoVXNlckNvbXBvbmVudHMpXG4gICAgICAgICAgLmZpbHRlcigoW25hbWVdKSA9PiAhbmFtZS5zdGFydHNXaXRoKFwidXNlXCIpKVxuICAgICAgICAgIC5tYXAoKFtfLCBjb21wb25lbnRdKSA9PiBjb21wb25lbnQpWzBdIHx8ICgoKSA9PiBudWxsKTtgXG4gICAgICB9XG5cbiAgICAgICAgICAgJHtcbiAgICAgICAgICAgICBkZWJ1Zy5lbmFibGVkXG4gICAgICAgICAgICAgICA/IGBcbiAgICAgY29uc29sZS5sb2coeyBVc2VyQ29tcG9uZW50cyB9KVxuICAgICBjb25zb2xlLmxvZyhcIkNvbXBvbmVudFRvUmVuZGVyIFwiICsgQ29tcG9uZW50VG9SZW5kZXIudG9TdHJpbmcoKSwgIHsgQ29tcG9uZW50VG9SZW5kZXIgfSlcbiAgICAgYFxuICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgIH1cblxuICAgICAgY2lyY3VpdC5hZGQoICAgICAgIFxuICAgICAgICAgIDxDb21wb25lbnRUb1JlbmRlciAke29wdHMubWFpbkNvbXBvbmVudFByb3BzID8gYHsuLi4ke0pTT04uc3RyaW5naWZ5KG9wdHMubWFpbkNvbXBvbmVudFByb3BzLCBudWxsLCAyKX19YCA6IFwiXCJ9IC8+IFxuICAgICAgKTtcbmBcbiAgfVxuXG4gIGlmICghb3B0cy5uYW1lICYmIG9wdHMubWFpbkNvbXBvbmVudE5hbWUpIHtcbiAgICBvcHRzLm5hbWUgPSBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgZW50cnlwb2ludD86IHN0cmluZyxcbikgPT4ge1xuICBpZiAoXG4gICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgIGVudHJ5cG9pbnQgJiZcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiUm9vdENpcmN1aXQgaGFzIG5vIGNoaWxkcmVuXCIpICYmXG4gICAgIWVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ1wiZW50cnlwb2ludFwiOicpXG4gICkge1xuICAgIGNvbnN0IGVudHJ5cG9pbnRNZXNzYWdlID0gZW50cnlwb2ludC5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gZW50cnlwb2ludC5zbGljZSgyKVxuICAgICAgOiBlbnRyeXBvaW50XG4gICAgZXJyb3IubWVzc2FnZSA9IGAke2Vycm9yLm1lc3NhZ2V9LiBcImVudHJ5cG9pbnRcIjogXCIke2VudHJ5cG9pbnRNZXNzYWdlfVwiIGlzIHNldCBpbiB0aGUgcnVubmVyIGNvbmZpZ3VyYXRpb24sIGVudHJ5cG9pbnRzIG11c3QgY29udGFpbiBcImNpcmN1aXQuYWRkKC4uLilcIiwgeW91IG1pZ2h0IGJlIGxvb2tpbmcgdG8gdXNlIG1haW5Db21wb25lbnRQYXRoIGluc3RlYWQgaWYgeW91ciBmaWxlIGV4cG9ydHMgYSBjb21wb25lbnQuYFxuICB9XG5cbiAgcmV0dXJuIGVycm9yXG59XG4iLCAiaW1wb3J0IHsgQ2lyY3VpdFJ1bm5lciB9IGZyb20gXCIuL0NpcmN1aXRSdW5uZXJcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVHNjaXJjdWl0Q29kZShcbiAgZmlsZXN5c3RlbU9yQ29kZVN0cmluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZyxcbiAgb3B0cz86IE9taXQ8UGFyYW1ldGVyczxDaXJjdWl0UnVubmVyW1wiZXhlY3V0ZVdpdGhGc01hcFwiXT5bMF0sIFwiZnNNYXBcIj4sXG4pIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiICYmXG4gICAgIWZpbGVzeXN0ZW1PckNvZGVTdHJpbmcuaW5jbHVkZXMoXCJleHBvcnRcIilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBcImV4cG9ydFwiIGtleXdvcmQgd2Fzbid0IGZvdW5kIGluIHlvdXIgcHJvdmlkZWQgY29kZS4gWW91IG5lZWQgdG8gZXhwb3J0IGEgY29tcG9uZW50IGluIHlvdXIgY29kZSwgZS5nLlxcblxcbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcXG4gIDxyZXNpc3RvciBuYW1lPVwiUjFcIiByZXNpc3RhbmNlPVwiMWtcIiAvPlxcbilgLFxuICAgIClcbiAgfVxuICBjb25zdCBmaWxlc3lzdGVtID1cbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyB7IFwidXNlci1jb2RlLnRzeFwiOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nIH1cbiAgICAgIDogZmlsZXN5c3RlbU9yQ29kZVN0cmluZ1xuXG4gIGNvbnN0IGNpcmN1aXRSdW5uZXIgPSBuZXcgQ2lyY3VpdFJ1bm5lcigpXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICBmc01hcDogZmlsZXN5c3RlbSxcbiAgICAuLi5vcHRzLFxuICB9KVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICByZXR1cm4gYXdhaXQgY2lyY3VpdFJ1bm5lci5nZXRDaXJjdWl0SnNvbigpXG59XG4iLCAiaW1wb3J0IHsgcnVuVHNjaXJjdWl0Q29kZSB9IGZyb20gXCIuL3J1blRzY2lyY3VpdENvZGVcIlxuXG5leHBvcnQgY29uc3QgcnVuVHNjaXJjdWl0TW9kdWxlID0gYXN5bmMgKFxuICBtb2R1bGU6IHN0cmluZyxcbiAgb3B0czogeyBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT47IGV4cG9ydE5hbWU/OiBzdHJpbmcgfSA9IHt9LFxuKSA9PiB7XG4gIGlmICghbW9kdWxlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgbW9kdWxlID0gYEB0c2NpLyR7bW9kdWxlLnJlcGxhY2UoL1xcLy8sIFwiLlwiKX1gXG4gIH1cbiAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCBydW5Uc2NpcmN1aXRDb2RlKFxuICAgIHtcbiAgICAgIC8vIFRPRE8gaGFuZGxlIGV4cG9ydHMgdGhhdCBhcmUgbm90IHRoZSBkZWZhdWx0IGV4cG9ydCBieSBzY2FubmluZ1xuICAgICAgLy8gb3RoZXJFeHBvcnRzIGZvciBjb21wb25lbnRzXG4gICAgICBcInVzZXItY29kZS50c3hcIjogYFxuICAgIGltcG9ydCBNb2R1bGUsICogYXMgb3RoZXJFeHBvcnRzIGZyb20gXCIke21vZHVsZX1cIjtcblxuICAgIGxldCBleHBvcnROYW1lID0gXCIke29wdHMuZXhwb3J0TmFtZSA/PyBcIlwifVwiXG5cbiAgICBpZiAoKCFNb2R1bGUgfHwgdHlwZW9mIE1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSAmJiAhQm9vbGVhbihleHBvcnROYW1lKSkge1xuICAgICAgZXhwb3J0TmFtZSA9IE9iamVjdC5rZXlzKG90aGVyRXhwb3J0cykuZmlsdGVyKGtleSA9PiBrZXlbMF0gPT09IGtleVswXS50b1VwcGVyQ2FzZSgpICYmIHR5cGVvZiBvdGhlckV4cG9ydHNba2V5XSA9PT0gXCJmdW5jdGlvblwiKVswXVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBleHBvcnROYW1lID8gb3RoZXJFeHBvcnRzW2V4cG9ydE5hbWVdIDogTW9kdWxlXG5cbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcXGBObyBleHBvcnQgZm91bmQgZm9yIG1vZHVsZSBcIlxcJHttb2R1bGV9XCIgKHRyaWVkIFwiXFwke2V4cG9ydE5hbWUgPz8gXCJkZWZhdWx0XCJ9XCIpXFxgKVxuICAgIH1cblxuICAgIGV4cG9ydCBkZWZhdWx0IGRlZmF1bHRFeHBvcnQ7XG4gICAgYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1haW5Db21wb25lbnRQcm9wczogb3B0cy5wcm9wcyxcbiAgICB9LFxuICApXG4gIHJldHVybiBjaXJjdWl0SnNvblxufVxuIiwgImltcG9ydCAqIGFzIENvbWxpbmsgZnJvbSBcImNvbWxpbmtcIlxuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvaW5kZXhcIlxuaW1wb3J0IHR5cGUge1xuICBJbnRlcm5hbFdlYldvcmtlckFwaSxcbiAgV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgQ2lyY3VpdFdlYldvcmtlcixcbn0gZnJvbSBcIi4vc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXRFdmVudE5hbWUgfSBmcm9tIFwiLi9zaGFyZWQvdHlwZXNcIlxuXG5leHBvcnQgdHlwZSB7IENpcmN1aXRXZWJXb3JrZXIsIFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIFRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVI6IENpcmN1aXRXZWJXb3JrZXIgfCB1bmRlZmluZWRcbiAgfVxuICB2YXIgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciA9IGFzeW5jIChcbiAgY29uZmlndXJhdGlvbjogUGFydGlhbDxXZWJXb3JrZXJDb25maWd1cmF0aW9uPixcbik6IFByb21pc2U8Q2lyY3VpdFdlYldvcmtlcj4gPT4ge1xuICAvLyBLaWxsIGV4aXN0aW5nIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UgaWYgcHJlc2VudFxuICBjb25zdCBleGlzdGluZ1dvcmtlciA9IGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUlxuICBpZiAoZXhpc3RpbmdXb3JrZXIgJiYgdHlwZW9mIGV4aXN0aW5nV29ya2VyLmtpbGwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gS2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlLi4uXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1dvcmtlci5raWxsKClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIltXb3JrZXJdIEVycm9yIGtpbGxpbmcgcHJldmlvdXMgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZTpcIixcbiAgICAgICAgICBlLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhlIGtleSBpcyBjbGVhcmVkIGV2ZW4gaWYga2lsbCB0aHJvd3MgYW4gZXJyb3JcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IGV4aXN0aW5nV29ya2VyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiW1dvcmtlcl0gQ3JlYXRpbmcgY2lyY3VpdCB3ZWIgd29ya2VyIHdpdGggY29uZmlnOlwiLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICApXG4gIH1cblxuICBsZXQgd29ya2VyQmxvYlVybCA9XG4gICAgY29uZmlndXJhdGlvbi53ZWJXb3JrZXJCbG9iVXJsID8/IGNvbmZpZ3VyYXRpb24ud2ViV29ya2VyVXJsXG5cbiAgaWYgKCF3b3JrZXJCbG9iVXJsKSB7XG4gICAgY29uc3QgY2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ldmFsQCR7Y29uZmlndXJhdGlvbi5ldmFsVmVyc2lvbiA/PyBcImxhdGVzdFwifS9kaXN0L3dlYndvcmtlci9lbnRyeXBvaW50LmpzYFxuXG4gICAgY29uc3Qgd29ya2VyQmxvYiA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goY2RuVXJsKS50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXG4gICAgd29ya2VyQmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwod29ya2VyQmxvYilcbiAgfVxuXG4gIGNvbnN0IHJhd1dvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyQmxvYlVybCwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pXG4gIGxldCB3b3JrZXJJbml0RXJyb3I6IGFueVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBFcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gICAgd29ya2VySW5pdEVycm9yID0gZXZlbnRcbiAgfSlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIFVuaGFuZGxlZCByZWplY3Rpb24gaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gTWVzc2FnZSBlcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIGNvbnN0IGVhcmx5TWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gTWVzc2FnZSBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH1cbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGFuZGxlIGZldGNoIHJlcXVlc3RzIGZyb20gdGhlIHdvcmtlclxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgYXN5bmMgKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YVxuICAgIGlmIChkYXRhPy50eXBlICE9PSBcIndvcmtlcl9mZXRjaFwiKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goZGF0YS5pbnB1dCwgZGF0YS5pbml0KVxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwid29ya2VyX2ZldGNoX3Jlc3VsdFwiLFxuICAgICAgICByZXF1ZXN0SWQ6IGRhdGEucmVxdWVzdElkLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBuYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHdvcmtlckluaXRFcnJvcikge1xuICAgIHRocm93IHdvcmtlckluaXRFcnJvclxuICB9XG5cbiAgY29uc3QgY29tbGlua1dvcmtlciA9IENvbWxpbmsud3JhcDxJbnRlcm5hbFdlYldvcmtlckFwaT4ocmF3V29ya2VyKVxuXG4gIHJhd1dvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlYXJseU1lc3NhZ2VIYW5kbGVyKVxuXG4gIC8vIEhlbHBlciB0byBzZXJpYWxpemUgUmVhY3QgZWxlbWVudHMgZm9yIGNyb3NzLXdvcmtlciBjb21tdW5pY2F0aW9uXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVJlYWN0RWxlbWVudChlbGVtZW50OiBhbnkpOiBhbnkge1xuICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBpcyBhIFJlYWN0IGVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9faXNTZXJpYWxpemVkUmVhY3RFbGVtZW50OiB0cnVlLFxuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIHByb3BzOiBzZXJpYWxpemVQcm9wcyhlbGVtZW50LnByb3BzKSxcbiAgICAgICAga2V5OiBlbGVtZW50LmtleSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplUHJvcHMocHJvcHM6IGFueSk6IGFueSB7XG4gICAgaWYgKCFwcm9wcyB8fCB0eXBlb2YgcHJvcHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBwcm9wc1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IGFueSA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNoaWxkcmVuXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHZhbHVlLm1hcChzZXJpYWxpemVSZWFjdEVsZW1lbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VyaWFsaXplZFtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRcbiAgfVxuXG4gIC8vIENvbmRpdGlvbmFsbHkgb3ZlcnJpZGUgZ2xvYmFsIGZldGNoIGluc2lkZSB0aGUgd29ya2VyIHRvIHJvdXRlIHRocm91Z2ggdGhlIHBhcmVudFxuICAvLyBPbmx5IGVuYWJsZSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHZpYSBjb25maWd1cmF0aW9uXG4gIGlmIChjb25maWd1cmF0aW9uLmVuYWJsZUZldGNoUHJveHkpIHtcbiAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIm92ZXJyaWRlX2dsb2JhbF9mZXRjaFwiIH0pXG4gIH1cblxuICBpZiAoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpIHtcbiAgICBhd2FpdCBjb21saW5rV29ya2VyLnNldFNuaXBwZXRzQXBpQmFzZVVybChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybClcbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSkge1xuICAgIGF3YWl0IGNvbWxpbmtXb3JrZXIuc2V0UGxhdGZvcm1Db25maWcoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSlcbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXRQcm9qZWN0Q29uZmlnKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZylcbiAgfVxuXG4gIGxldCBpc1Rlcm1pbmF0ZWQgPSBmYWxzZVxuXG4gIC8vIENyZWF0ZSBhIHdyYXBwZXIgdGhhdCBoYW5kbGVzIGV2ZW50cyBkaXJlY3RseSB0aHJvdWdoIGNpcmN1aXQgaW5zdGFuY2VcbiAgY29uc3Qgd3JhcHBlcjogQ2lyY3VpdFdlYldvcmtlciA9IHtcbiAgICBjbGVhckV2ZW50TGlzdGVuZXJzOiBjb21saW5rV29ya2VyLmNsZWFyRXZlbnRMaXN0ZW5lcnMuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBlbmFibGVEZWJ1ZzogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZW5hYmxlRGVidWdcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmVuYWJsZURlYnVnLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIHZlcnNpb246IGNvbWxpbmtXb3JrZXIudmVyc2lvbi5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGV4ZWN1dGU6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGUuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgZXhlY3V0ZUNvbXBvbmVudDogYXN5bmMgKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVDb21wb25lbnRcIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24sIHBhc3MgaXQgYXMtaXMgKHdpbGwgYmUgcHJveGllZCBieSBDb21saW5rKVxuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoY29tcG9uZW50KVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgUmVhY3QgZWxlbWVudCwgc2VyaWFsaXplIGl0IHRvIGEgcmVjb25zdHJ1Y3RhYmxlIGZvcm1hdFxuICAgICAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIGNvbXBvbmVudC50eXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRFbGVtZW50ID0gc2VyaWFsaXplUmVhY3RFbGVtZW50KGNvbXBvbmVudClcbiAgICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKFxuICAgICAgICAgIHNlcmlhbGl6ZWRFbGVtZW50LFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShjb21wb25lbnQpXG4gICAgfSxcbiAgICBleGVjdXRlV2l0aEZzTWFwOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlV2l0aEZzTWFwXCIsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgcmVuZGVyVW50aWxTZXR0bGVkOiBjb21saW5rV29ya2VyLnJlbmRlclVudGlsU2V0dGxlZC5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGdldENpcmN1aXRKc29uOiBjb21saW5rV29ya2VyLmdldENpcmN1aXRKc29uLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSA9PiB7XG4gICAgICBjb25zdCBwcm94aWVkQ2FsbGJhY2sgPSBDb21saW5rLnByb3h5KGNhbGxiYWNrKVxuICAgICAgY29tbGlua1dvcmtlci5vbihldmVudCBhcyBSb290Q2lyY3VpdEV2ZW50TmFtZSwgcHJveGllZENhbGxiYWNrKVxuICAgIH0sXG4gICAga2lsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29tbGlua1dvcmtlcltDb21saW5rLnJlbGVhc2VQcm94eV0oKVxuICAgICAgcmF3V29ya2VyLnRlcm1pbmF0ZSgpXG4gICAgICBpc1Rlcm1pbmF0ZWQgPSB0cnVlXG4gICAgICBpZiAoZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID09PSB3cmFwcGVyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG4gIH1cbiAgOyh3cmFwcGVyIGFzIGFueSkuX19yYXdXb3JrZXIgPSByYXdXb3JrZXJcbiAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gd3JhcHBlclxuICByZXR1cm4gd3JhcHBlclxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vcnVubmVyL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IGNvbnN0IGdldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzID0gKFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbcGF0aCwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKHBhdGgpXSA9IGNvbnRlbnRcbiAgfVxuXG4gIGNvbnN0IHBvc3NpYmxlID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBub3JtYWxpemVkRnNNYXApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShub3JtYWxpemVkRnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl0pXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5tYWluRW50cnlwb2ludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBwb3NzaWJsZS5hZGQobm9ybWFsaXplRmlsZVBhdGgoY29uZmlnLm1haW5FbnRyeXBvaW50KSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkRnNNYXBbXCJpbmRleC50c3hcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzeFwiKVxuICBpZiAobm9ybWFsaXplZEZzTWFwW1wiaW5kZXgudHNcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzXCIpXG5cbiAgY29uc3QgY2lyY3VpdEZpbGVzID0gT2JqZWN0LmtleXMobm9ybWFsaXplZEZzTWFwKS5maWx0ZXIoKGspID0+XG4gICAgay5lbmRzV2l0aChcIi5jaXJjdWl0LnRzeFwiKSxcbiAgKVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgY2lyY3VpdEZpbGVzKSB7XG4gICAgcG9zc2libGUuYWRkKGZpbGUpXG4gIH1cblxuICBjb25zdCB0c3hGaWxlcyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRGc01hcCkuZmlsdGVyKChrKSA9PlxuICAgIGsuZW5kc1dpdGgoXCIudHN4XCIpLFxuICApXG4gIGlmICh0c3hGaWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICBwb3NzaWJsZS5hZGQodHN4RmlsZXNbMF0pXG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShwb3NzaWJsZSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLG1CQUFtQjtBQUU1QixZQUFZLG1CQUFtQjtBQUMvQixZQUFZLFdBQVc7QUFDdkIsWUFBWSx3QkFBd0I7OztBQ0M3QixJQUFNLGdDQUFnQyxDQUMzQyxtQkFDdUI7QUFFdkIsTUFBSSxRQUFRLGVBQWUsTUFBTSxnQkFBZ0I7QUFDakQsTUFBSSxNQUFPLFFBQU8sTUFBTSxDQUFDO0FBSXpCLFVBQVEsZUFBZTtBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUNBLE1BQUksTUFBTyxRQUFPLE1BQU0sQ0FBQztBQUV6QixTQUFPO0FBQ1Q7OztBQ2hCTyxJQUFNLHFDQUFxQyxDQUNo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Q25ELG9CQUFnQixrQkFBa0IsSUFBSSxDQUFDLElBQUk7QUFBQSxFQUM3QztBQUVBLFFBQU0sV0FBVyxvQkFBSSxJQUFZO0FBRWpDLE1BQUksMkJBQTJCLGlCQUFpQjtBQUM5QyxRQUFJO0FBQ0YsWUFBTSxTQUFTLEtBQUssTUFBTSxnQkFBZ0IsdUJBQXVCLENBQUM7QUFDbEUsVUFBSSxPQUFPLE9BQU8sbUJBQW1CLFVBQVU7QUFDN0MsaUJBQVMsSUFBSSxrQkFBa0IsT0FBTyxjQUFjLENBQUM7QUFBQSxNQUN2RDtBQUFBLElBQ0YsUUFBUTtBQUFBLElBRVI7QUFBQSxFQUNGO0FBRUEsTUFBSSxnQkFBZ0IsV0FBVyxFQUFHLFVBQVMsSUFBSSxXQUFXO0FBQzFELE1BQUksZ0JBQWdCLFVBQVUsRUFBRyxVQUFTLElBQUksVUFBVTtBQUV4RCxRQUFNLGVBQWUsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUN4RCxFQUFFLFNBQVMsY0FBYztBQUFBLEVBQzNCO0FBQ0EsYUFBVyxRQUFRLGNBQWM7QUFDL0IsYUFBUyxJQUFJLElBQUk7QUFBQSxFQUNuQjtBQUVBLFFBQU0sV0FBVyxPQUFPLEtBQUssZUFBZSxFQUFFO0FBQUEsSUFBTyxDQUFDLE1BQ3BELEVBQUUsU0FBUyxNQUFNO0FBQUEsRUFDbkI7QUFDQSxNQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLGFBQVMsSUFBSSxTQUFTLENBQUMsQ0FBQztBQUFBLEVBQzFCO0FBRUEsU0FBTyxNQUFNLEtBQUssUUFBUTtBQUM1QjsiLAogICJuYW1lcyI6IFsiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiaW1wb3J0TmFtZSIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyJdCn0K
|
|
1651
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9qbGMtcGFydHMtZW5naW5lLnRzIiwgIi4uLy4uL2xpYi9nZXRQbGF0Zm9ybUNvbmZpZy50cyIsICIuLi8uLi9saWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvdHNjb25maWdQYXRocy50cyIsICIuLi8uLi9saWIvcnVubmVyL0NpcmN1aXRSdW5uZXIudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vbGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LW5wbS1wYWNrYWdlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvc2hhcmVkL29iai1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0Q29kZS50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdE1vZHVsZS50cyIsICIuLi8uLi9saWIvd29ya2VyLnRzIiwgIi4uLy4uL2xpYi9nZXRQb3NzaWJsZUVudHJ5cG9pbnRDb21wb25lbnRQYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdENvcmUgZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0ICogYXMgdHNjaXJjdWl0TWF0aFV0aWxzIGZyb20gXCJAdHNjaXJjdWl0L21hdGgtdXRpbHNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGdldFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcImxpYi9nZXRQbGF0Zm9ybUNvbmZpZ1wiXG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnIH0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpleGVjdXRpb24tY29udGV4dFwiKVxuXG5pbnRlcmZhY2UgU3RvcmVkTG9nZ2VyIHtcbiAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICBnZXRMb2dzOiAoKSA9PiBBcnJheTx7IG1zZzogc3RyaW5nIH0+XG4gIHN0cmluZ2lmeUxvZ3M6ICgpID0+IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZW50cnlwb2ludDogc3RyaW5nXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PlxuICBjaXJjdWl0OiBSb290Q2lyY3VpdFxuICBsb2dnZXI6IFN0b3JlZExvZ2dlclxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsXG4gIGltcG9ydFN0YWNrOiBzdHJpbmdbXVxuICBjdXJyZW50bHlJbXBvcnRpbmc6IFNldDxzdHJpbmc+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICB3ZWJXb3JrZXJDb25maWd1cmF0aW9uOiBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBvcHRzOiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHBsYXRmb3JtPzogUGxhdGZvcm1Db25maWdcbiAgICBwcm9qZWN0Q29uZmlnPzogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz5cbiAgICBkZWJ1Z05hbWVzcGFjZT86IHN0cmluZ1xuICB9ID0ge30sXG4pOiBFeGVjdXRpb25Db250ZXh0IHtcbiAgZ2xvYmFsVGhpcy5SZWFjdCA9IFJlYWN0XG5cbiAgY29uc3QgYmFzZVBsYXRmb3JtID0gb3B0cy5wbGF0Zm9ybSB8fCBnZXRQbGF0Zm9ybUNvbmZpZygpXG4gIGNvbnN0IHBsYXRmb3JtID0gb3B0cy5wcm9qZWN0Q29uZmlnXG4gICAgPyB7IC4uLmJhc2VQbGF0Zm9ybSwgLi4ub3B0cy5wcm9qZWN0Q29uZmlnIH1cbiAgICA6IGJhc2VQbGF0Zm9ybVxuXG4gIGNvbnN0IGNpcmN1aXQgPSBuZXcgUm9vdENpcmN1aXQoe1xuICAgIHBsYXRmb3JtLFxuICB9KVxuXG4gIGlmIChvcHRzLm5hbWUpIHtcbiAgICBjaXJjdWl0Lm5hbWUgPSBvcHRzLm5hbWVcbiAgfVxuXG4gIGlmIChvcHRzLmRlYnVnTmFtZXNwYWNlKSB7XG4gICAgY2lyY3VpdC5lbmFibGVEZWJ1ZyhvcHRzLmRlYnVnTmFtZXNwYWNlKVxuICB9XG5cbiAgY29uc3QgbG9nczogQXJyYXk8eyBtc2c6IHN0cmluZyB9PiA9IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBmc01hcDoge30sXG4gICAgZW50cnlwb2ludDogXCJcIixcbiAgICBsb2dnZXI6IHtcbiAgICAgIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbG9ncy5wdXNoKHsgbXNnOiBtZXNzYWdlIH0pXG4gICAgICB9LFxuICAgICAgZ2V0TG9nczogKCkgPT4gbG9ncyxcbiAgICAgIHN0cmluZ2lmeUxvZ3M6ICgpID0+IGxvZ3MubWFwKChsb2cpID0+IGxvZy5tc2cpLmpvaW4oXCJcXG5cIiksXG4gICAgfSxcbiAgICBwcmVTdXBwbGllZEltcG9ydHM6IHtcbiAgICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IHRzY2lyY3VpdENvcmUsXG4gICAgICB0c2NpcmN1aXQ6IHRzY2lyY3VpdENvcmUsXG4gICAgICBcIkB0c2NpcmN1aXQvbWF0aC11dGlsc1wiOiB0c2NpcmN1aXRNYXRoVXRpbHMsXG4gICAgICByZWFjdDogUmVhY3QsXG4gICAgICBkZWJ1ZzogRGVidWcsXG5cbiAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFzIGEgdHlwZSBpbXBvcnQsIHdlIGNhbiByZW1vdmUgdGhlIHNoaW0gd2hlbiB3ZVxuICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0cyBpbiBnZXRJbXBvcnRzRnJvbUNvZGVcbiAgICAgIFwiQHRzY2lyY3VpdC9wcm9wc1wiOiB7fSxcbiAgICB9LFxuICAgIGNpcmN1aXQsXG4gICAgdHNDb25maWc6IG51bGwsXG4gICAgaW1wb3J0U3RhY2s6IFtdLFxuICAgIGN1cnJlbnRseUltcG9ydGluZzogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgLi4ud2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgfVxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIEtpQ2FkIGZvb3RwcmludCBzdHJpbmcgaW50byBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqIEZvciBub3csIHRoaXMgaXMgYSBzaW1wbGlmaWVkIGNvbnZlcnNpb24gdG8gYSBzdGFuZGFyZCBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwia2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkID0gKFxuICBraWNhZEZvb3RwcmludDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8ga2ljYWQ6UmVzaXN0b3JfU01EOlJfMDYwM18xNjA4TWV0cmljIC0+IDA2MDNcbiAgbGV0IG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goLzpbUkNdXyhcXGR7NH0pXy8pXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgLy8ga2ljYWQ6UGFja2FnZV9TTzpTT0lDLThfMy45eDQuOW1tX1AxLjI3bW0gLT4gU09JQy04XG4gIC8vIGtpY2FkOlBhY2thZ2VfVE9fU09UX1NNRDpTT1QtMjMgLT4gU09ULTIzXG4gIG1hdGNoID0ga2ljYWRGb290cHJpbnQubWF0Y2goXG4gICAgLzooU09JQy1cXGQrfFNPVC1cXGQrfFNPRC1cXGQrfFNTT1AtXFxkK3xUU1NPUC1cXGQrfFFGUC1cXGQrfFFGTi1cXGQrKS8sXG4gIClcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiIGludG8gYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUuXG4gKiBlLmcuIFwiY2FwMDYwM1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nID0gKFxuICBmb290cHJpbnRlclN0cmluZzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKGZvb3RwcmludGVyU3RyaW5nLmluY2x1ZGVzKFwiY2FwXCIpKSB7XG4gICAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nLnJlcGxhY2UoL2NhcC9nLCBcIlwiKVxuICB9XG4gIHJldHVybiBmb290cHJpbnRlclN0cmluZ1xufVxuIiwgImltcG9ydCB7IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkIH0gZnJvbSBcIi4vZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkXCJcbmltcG9ydCB7IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgfSBmcm9tIFwiLi9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmdcIlxuXG4vKipcbiAqIEdldCBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZSBmcm9tIGEgZm9vdHByaW50IHN0cmluZywgd2hpY2ggY291bGQgYmVcbiAqIGEgS2lDYWQgZm9vdHByaW50IG9yIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjcGNiUGFja2FnZU5hbWUgPSAoXG4gIGZvb3RwcmludDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFmb290cHJpbnQpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoZm9vdHByaW50LnN0YXJ0c1dpdGgoXCJraWNhZDpcIikpIHtcbiAgICBjb25zdCBmb290cHJpbnRlclN0cmluZyA9IGdldEZvb3RwcmludGVyU3RyaW5nRnJvbUtpY2FkKGZvb3RwcmludClcbiAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmcpIHtcbiAgICAgIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludGVyU3RyaW5nKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bi1tYXRjaGVkIEtpQ2FkIHN0cmluZ3NcbiAgICByZXR1cm4gZm9vdHByaW50XG4gIH1cblxuICAvLyBOb3QgYSBLaUNhZCBzdHJpbmcsIGFzc3VtZSBpdCdzIGEgZm9vdHByaW50ZXIgc3RyaW5nXG4gIHJldHVybiBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nKGZvb3RwcmludClcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBhcnRzRW5naW5lLCBTdXBwbGllclBhcnROdW1iZXJzIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0SmxjcGNiUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXhcIlxuXG5leHBvcnQgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55PigpXG5cbmNvbnN0IGdldEpsY1BhcnRzQ2FjaGVkID0gYXN5bmMgKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgY29uc3QgcGFyYW1TdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAuLi5wYXJhbXMsXG4gICAganNvbjogXCJ0cnVlXCIsXG4gIH0pLnRvU3RyaW5nKClcbiAgaWYgKGNhY2hlLmhhcyhwYXJhbVN0cmluZykpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KHBhcmFtU3RyaW5nKVxuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgYGh0dHBzOi8vamxjc2VhcmNoLnRzY2lyY3VpdC5jb20vJHtuYW1lfS9saXN0PyR7cGFyYW1TdHJpbmd9YCxcbiAgKVxuICBjb25zdCByZXNwb25zZUpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgY2FjaGUuc2V0KHBhcmFtU3RyaW5nLCByZXNwb25zZUpzb24pXG4gIHJldHVybiByZXNwb25zZUpzb25cbn1cblxuY29uc3Qgd2l0aEJhc2ljUGFydFByZWZlcmVuY2UgPSAocGFydHM6IGFueVtdIHwgdW5kZWZpbmVkKSA9PiB7XG4gIGlmICghcGFydHMpIHJldHVybiBbXVxuICByZXR1cm4gWy4uLnBhcnRzXS5zb3J0KFxuICAgIChhLCBiKSA9PiBOdW1iZXIoYi5pc19iYXNpYyA/PyBmYWxzZSkgLSBOdW1iZXIoYS5pc19iYXNpYyA/PyBmYWxzZSksXG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGpsY1BhcnRzRW5naW5lOiBQYXJ0c0VuZ2luZSA9IHtcbiAgZmluZFBhcnQ6IGFzeW5jICh7XG4gICAgc291cmNlQ29tcG9uZW50LFxuICAgIGZvb3RwcmludGVyU3RyaW5nLFxuICB9KTogUHJvbWlzZTxTdXBwbGllclBhcnROdW1iZXJzPiA9PiB7XG4gICAgY29uc3QgamxjcGNiUGFja2FnZSA9IGdldEpsY3BjYlBhY2thZ2VOYW1lKGZvb3RwcmludGVyU3RyaW5nKVxuXG4gICAgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc2lzdG9yc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2FwYWNpdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2FwYWNpdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjYXBhY2l0b3JzXCIsIHtcbiAgICAgICAgY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2FwYWNpdG9ycylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9waW5faGVhZGVyXCJcbiAgICApIHtcbiAgICAgIGxldCBwaXRjaDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAoZm9vdHByaW50ZXJTdHJpbmc/LmluY2x1ZGVzKFwiX3BcIikpIHtcbiAgICAgICAgcGl0Y2ggPSBOdW1iZXIoZm9vdHByaW50ZXJTdHJpbmcuc3BsaXQoXCJfcFwiKVsxXSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXG4gICAgICAgIFwiaGVhZGVyc1wiLFxuICAgICAgICBwaXRjaFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwaXRjaDogcGl0Y2gsXG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG51bV9waW5zOiBzb3VyY2VDb21wb25lbnQucGluX2NvdW50LFxuICAgICAgICAgICAgICBnZW5kZXI6IHNvdXJjZUNvbXBvbmVudC5nZW5kZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShoZWFkZXJzKVxuICAgICAgICAgIC5tYXAoKGg6IGFueSkgPT4gYEMke2gubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3BvdGVudGlvbWV0ZXJcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3RlbnRpb21ldGVycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3RlbnRpb21ldGVyc1wiLCB7XG4gICAgICAgIHJlc2lzdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5tYXhfcmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvdGVudGlvbWV0ZXJzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Rpb2RlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZGlvZGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImRpb2Rlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShkaW9kZXMpXG4gICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBgQyR7ZC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY2hpcFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNoaXBzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNoaXBzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNoaXBzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3RyYW5zaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyB0cmFuc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJ0cmFuc2lzdG9yc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIHRyYW5zaXN0b3JfdHlwZTogc291cmNlQ29tcG9uZW50LnRyYW5zaXN0b3JfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHRyYW5zaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHQ6IGFueSkgPT4gYEMke3QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bvd2VyX3NvdXJjZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvd2VyX3NvdXJjZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG93ZXJfc291cmNlc1wiLCB7XG4gICAgICAgIHZvbHRhZ2U6IHNvdXJjZUNvbXBvbmVudC52b2x0YWdlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG93ZXJfc291cmNlcylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9pbmR1Y3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGluZHVjdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJpbmR1Y3RvcnNcIiwge1xuICAgICAgICBpbmR1Y3RhbmNlOiBzb3VyY2VDb21wb25lbnQuaW5kdWN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGluZHVjdG9ycylcbiAgICAgICAgICAubWFwKChpOiBhbnkpID0+IGBDJHtpLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jcnlzdGFsXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY3J5c3RhbHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY3J5c3RhbHNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIGxvYWRfY2FwYWNpdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5sb2FkX2NhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY3J5c3RhbHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbW9zZmV0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbW9zZmV0cyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJtb3NmZXRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgbW9zZmV0X21vZGU6IHNvdXJjZUNvbXBvbmVudC5tb3NmZXRfbW9kZSxcbiAgICAgICAgY2hhbm5lbF90eXBlOiBzb3VyY2VDb21wb25lbnQuY2hhbm5lbF90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobW9zZmV0cylcbiAgICAgICAgICAubWFwKChtOiBhbnkpID0+IGBDJHttLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNvbmF0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNvbmF0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInJlc29uYXRvcnNcIiwge1xuICAgICAgICBmcmVxdWVuY3k6IHNvdXJjZUNvbXBvbmVudC5mcmVxdWVuY3ksXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShyZXNvbmF0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3N3aXRjaFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHN3aXRjaGVzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInN3aXRjaGVzXCIsIHtcbiAgICAgICAgc3dpdGNoX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50eXBlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2Uoc3dpdGNoZXMpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBgQyR7cy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfbGVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgbGVkcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJsZWRzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGxlZHMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZnVzZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGZ1c2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImZ1c2VzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGZ1c2VzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9XG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGpsY1BhcnRzRW5naW5lIH0gZnJvbSBcIkB0c2NpcmN1aXQvcGFydHMtZW5naW5lXCJcbmltcG9ydCB7IHBhcnNlS2ljYWRNb2RUb0NpcmN1aXRKc29uIH0gZnJvbSBcImtpY2FkLWNvbXBvbmVudC1jb252ZXJ0ZXJcIlxuY29uc3QgS0lDQURfRk9PVFBSSU5UX0NBQ0hFX1VSTCA9IFwiaHR0cHM6Ly9raWNhZC1tb2QtY2FjaGUudHNjaXJjdWl0LmNvbVwiXG5cbmV4cG9ydCBjb25zdCBnZXRQbGF0Zm9ybUNvbmZpZyA9ICgpOiBQbGF0Zm9ybUNvbmZpZyA9PiAoe1xuICBwYXJ0c0VuZ2luZTogamxjUGFydHNFbmdpbmUsXG4gIGZvb3RwcmludExpYnJhcnlNYXA6IHtcbiAgICBraWNhZDogYXN5bmMgKGZvb3RwcmludE5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgYmFzZVVybCA9IGAke0tJQ0FEX0ZPT1RQUklOVF9DQUNIRV9VUkx9LyR7Zm9vdHByaW50TmFtZX1gXG4gICAgICBjb25zdCBjaXJjdWl0SnNvblVybCA9IGAke2Jhc2VVcmx9LmNpcmN1aXQuanNvbmBcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGNpcmN1aXRKc29uVXJsKVxuICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVzLmpzb24oKVxuICAgICAgLy8gRmlsdGVyIHBjYl9zaWxrc2NyZWVuX3RleHQgdG8gb25seSBrZWVwIGVudHJpZXMgd2l0aCB0ZXh0ID09PSBcIlJFRioqXCJcbiAgICAgIC8vIEFwcGx5IGZpbHRlcmluZyBvbmx5IHRvIGVsZW1lbnRzIGNvbWluZyBmcm9tIHRoZSBraWNhZF9tb2Rfc2VydmVyIHJlc3BvbnNlXG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IEFycmF5LmlzQXJyYXkocmF3KVxuICAgICAgICA/IHJhdy5maWx0ZXIoKGVsKSA9PlxuICAgICAgICAgICAgZWw/LnR5cGUgPT09IFwicGNiX3NpbGtzY3JlZW5fdGV4dFwiID8gZWw/LnRleHQgPT09IFwiUkVGKipcIiA6IHRydWUsXG4gICAgICAgICAgKVxuICAgICAgICA6IHJhd1xuICAgICAgY29uc3Qgd3JsVXJsID0gYCR7YmFzZVVybH0ud3JsYFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9vdHByaW50Q2lyY3VpdEpzb246IGZpbHRlcmVkLFxuICAgICAgICBjYWRNb2RlbDogeyB3cmxVcmwsIG1vZGVsVW5pdFRvTW1TY2FsZTogMi41NCB9LFxuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGZvb3RwcmludEZpbGVQYXJzZXJNYXA6IHtcbiAgICBraWNhZF9tb2Q6IHtcbiAgICAgIGxvYWRGcm9tVXJsOiBhc3luYyAodXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qga2ljYWRDb250ZW50ID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKChyZXMpID0+IHJlcy50ZXh0KCkpXG4gICAgICAgIGNvbnN0IGtpY2FkSnNvbiA9IGF3YWl0IHBhcnNlS2ljYWRNb2RUb0NpcmN1aXRKc29uKGtpY2FkQ29udGVudClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmb290cHJpbnRDaXJjdWl0SnNvbjogQXJyYXkuaXNBcnJheShraWNhZEpzb24pXG4gICAgICAgICAgICA/IGtpY2FkSnNvblxuICAgICAgICAgICAgOiBba2ljYWRKc29uXSxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSlcbiIsICJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICBsZXQgbm9ybUZpbGVQYXRoID0gZmlsZVBhdGhcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC50cmltKClcbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMilcbiAgfVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDEpXG4gIH1cbiAgcmV0dXJuIG5vcm1GaWxlUGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRnNNYXAoZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbZnNQYXRoLCBmaWxlQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKGZzUGF0aCldID0gZmlsZUNvbnRlbnRcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZEZzTWFwXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnID0ge1xuICBjb21waWxlck9wdGlvbnM/OiB7XG4gICAgYmFzZVVybD86IHN0cmluZ1xuICAgIHBhdGhzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIGV4dGVuZHM/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICBmaWxlcz86IHN0cmluZ1tdXG4gIHJlZmVyZW5jZXM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgaW5jbHVkZT86IHN0cmluZ1tdXG4gIGV4Y2x1ZGU/OiBzdHJpbmdbXVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZyhcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuKTogVHNDb25maWcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocykpIHJldHVybiBudWxsXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IGZzTWFwT3JBbGxGaWxlUGF0aHNbXCJ0c2NvbmZpZy5qc29uXCJdXG4gIGlmICghdHNjb25maWdDb250ZW50KSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0c2NvbmZpZ0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qL2csXG4gICAgICBcIlwiLFxuICAgICkgLy8gcmVtb3ZlIGNvbW1lbnRzXG5cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhbml0aXplZENvbnRlbnQpIGFzIFRzQ29uZmlnXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSB0c2NvbmZpZy5qc29uOiAke2UubWVzc2FnZX1gKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBpbXBvcnRQYXRoLCBub3JtYWxpemVkRmlsZVBhdGhNYXAsIGV4dGVuc2lvbnMsIHRzQ29uZmlnIH0gPSBvcHRzXG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIG51bGxcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmwgfHwgXCIuXCJcblxuICBjb25zdCB0cnlSZXNvbHZlQ2FuZGlkYXRlID0gKGNhbmRpZGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENhbmRpZGF0ZSA9IG5vcm1hbGl6ZUZpbGVQYXRoKGNhbmRpZGF0ZSlcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkQ2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZENhbmRpZGF0ZSkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkQ2FuZGlkYXRlfS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICAvLyBTdXBwb3J0IHBhdHRlcm5zIGxpa2UgXCJAc3JjLypcIiBvciBcInV0aWxzLypcIiBhbmQgYWxzbyBleGFjdCBtYXRjaGVzIHdpdGhvdXQgXCIqXCJcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKFxuICAgICAgICAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHxcbiAgICAgICAgIWltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJNYXRjaCA9IGltcG9ydFBhdGguc2xpY2UoXG4gICAgICAgIHByZWZpeC5sZW5ndGgsXG4gICAgICAgIGltcG9ydFBhdGgubGVuZ3RoIC0gKHN1ZmZpeCA/IHN1ZmZpeC5sZW5ndGggOiAwKSxcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSB0YXJnZXQucmVwbGFjZShcIipcIiwgc3Rhck1hdGNoKVxuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHtyZXBsYWNlZH1gXG4gICAgICAgICAgICA6IHJlcGxhY2VkXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoICE9PSBhbGlhcykgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi4vXCIpICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHt0YXJnZXR9YFxuICAgICAgICAgICAgOiB0YXJnZXRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgfSlcblxuICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aEJhc2VVcmwob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBpbXBvcnRQYXRoLCBub3JtYWxpemVkRmlsZVBhdGhNYXAsIGV4dGVuc2lvbnMsIHRzQ29uZmlnIH0gPSBvcHRzXG4gIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsXG4gIGlmICghYmFzZVVybCkgcmV0dXJuIG51bGxcblxuICBjb25zdCBmaWxlUGF0aFRvUmVzb2x2ZSA9IGAke2Jhc2VVcmx9LyR7aW1wb3J0UGF0aH1gXG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoVG9SZXNvbHZlKVxuXG4gIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRGaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkRmlsZVBhdGgpIVxuICB9XG5cbiAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQod2l0aEV4dCkhXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuKFxuICBpbXBvcnRQYXRoOiBzdHJpbmcsXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcGF0aHMgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5wYXRoc1xuICBpZiAoIXBhdGhzKSByZXR1cm4gZmFsc2VcblxuICBmb3IgKGNvbnN0IFthbGlhc10gb2YgT2JqZWN0LmVudHJpZXMocGF0aHMpKSB7XG4gICAgY29uc3QgaGFzV2lsZGNhcmQgPSBhbGlhcy5pbmNsdWRlcyhcIipcIilcbiAgICBpZiAoaGFzV2lsZGNhcmQpIHtcbiAgICAgIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBhbGlhcy5zcGxpdChcIipcIilcbiAgICAgIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgocHJlZml4KSAmJiBpbXBvcnRQYXRoLmVuZHNXaXRoKHN1ZmZpeCB8fCBcIlwiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW1wb3J0UGF0aCA9PT0gYWxpYXMpIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHR5cGUge1xuICBDaXJjdWl0UnVubmVyQXBpLFxuICBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IG5vcm1hbGl6ZUZzTWFwIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgZ2V0VHNDb25maWcgfSBmcm9tIFwiLi90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCJ3ZWJ3b3JrZXIvaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgfSBmcm9tIFwiLi9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIlxuaW1wb3J0IHsgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yIH0gZnJvbSBcImxpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvclwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IHNldFZhbHVlQXRQYXRoIH0gZnJvbSBcImxpYi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOkNpcmN1aXRSdW5uZXJcIilcblxuZXhwb3J0IGNsYXNzIENpcmN1aXRSdW5uZXIgaW1wbGVtZW50cyBDaXJjdWl0UnVubmVyQXBpIHtcbiAgX2V4ZWN1dGlvbkNvbnRleHQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQ+IHwgbnVsbCA9IG51bGxcbiAgX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uOiBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICBzbmlwcGV0c0FwaUJhc2VVcmw6IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiLFxuICAgIGNqc1JlZ2lzdHJ5VXJsOiBcImh0dHBzOi8vY2pzLnRzY2lyY3VpdC5jb21cIixcbiAgICB2ZXJib3NlOiBmYWxzZSxcbiAgfVxuICBfZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsICgoLi4uYXJnczogYW55W10pID0+IHZvaWQpW10+ID0ge31cbiAgX2RlYnVnTmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3Rvcihjb25maWd1cmF0aW9uOiBQYXJ0aWFsPENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uPiA9IHt9KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbilcbiAgfVxuXG4gIGFzeW5jIHZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gXCIwLjAuMFwiXG4gIH1cblxuICBhc3luYyBleGVjdXRlV2l0aEZzTWFwKG9nT3B0czoge1xuICAgIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gICAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBuYW1lPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3B0cyA9IHsgLi4ub2dPcHRzIH1cblxuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBEZWJ1Zy5lbmFibGUoXCJ0c2NpOmV2YWw6KlwiKVxuICAgIH1cblxuICAgIGRlYnVnKFwiZXhlY3V0ZVdpdGhGc01hcCBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgZW50cnlwb2ludDogb3B0cy5lbnRyeXBvaW50LFxuICAgICAgZnNNYXBLZXlzOiBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKSxcbiAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICB9KVxuXG4gICAgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkKG9wdHMpXG5cbiAgICBkZWJ1ZyhcImVudHJ5cG9pbnQgYWZ0ZXIgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgfSlcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXAgPSBub3JtYWxpemVGc01hcChvcHRzLmZzTWFwKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtvcHRzLmVudHJ5cG9pbnQhXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRyeXBvaW50IFwiJHtvcHRzLmVudHJ5cG9pbnR9XCIgbm90IGZvdW5kYClcbiAgICB9XG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuXG4gICAgY29uc3QgZW50cnlwb2ludCA9IG9wdHMuZW50cnlwb2ludCEuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IG9wdHMuZW50cnlwb2ludFxuICAgICAgOiBgLi8ke29wdHMuZW50cnlwb2ludH1gXG5cbiAgICBkZWJ1ZyhcImZpbmFsIGVudHJ5cG9pbnQ6XCIsIGVudHJ5cG9pbnQpXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoZW50cnlwb2ludCEsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKGNvZGU6IHN0cmluZywgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZSBjYWxsZWQgd2l0aCBjb2RlIGxlbmd0aDpcIixcbiAgICAgICAgY29kZS5sZW5ndGgsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbXCJlbnRyeXBvaW50LnRzeFwiXSA9IGNvZGVcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gZ2V0VHNDb25maWcodGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChcIi4vZW50cnlwb2ludC50c3hcIiwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21wb25lbnQoY29tcG9uZW50OiBhbnksIG9wdHM6IHsgbmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZUNvbXBvbmVudCBjYWxsZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBudWxsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiID8gY29tcG9uZW50KCkgOiBjb21wb25lbnRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuYWRkKGVsZW1lbnQgYXMgYW55KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5yZW5kZXJVbnRpbFNldHRsZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q2lyY3VpdEpzb24oKTogUHJvbWlzZTxBbnlDaXJjdWl0RWxlbWVudFtdPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuZ2V0Q2lyY3VpdEpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY2xlYXJFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyPzogKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBGdW5jdGlvbikgPT4gdm9pZFxuICAgICAgICAgIH1cbiAgICAgICAgICBjaXJjdWl0LnJlbW92ZUxpc3RlbmVyPy4oZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGtpbGwoKSB7XG4gICAgLy8gQ2xlYW51cCByZXNvdXJjZXNcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gbnVsbFxuICB9XG5cbiAgYXN5bmMgc2V0U25pcHBldHNBcGlCYXNlVXJsKGJhc2VVcmw6IHN0cmluZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnKHBsYXRmb3JtOiBQbGF0Zm9ybUNvbmZpZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sIHByb3BlcnR5LCB2YWx1ZSlcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWcocHJvamVjdDogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz4pIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0gcHJvamVjdFxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpIHtcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSB7fVxuICAgIH1cbiAgICBzZXRWYWx1ZUF0UGF0aChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIHZhbHVlLFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGVuYWJsZURlYnVnKG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVidWdOYW1lc3BhY2UgPSBuYW1lc3BhY2VcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgY29uc3QgY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdCBhcyBhbnlcbiAgICAgIGNpcmN1aXQuZW5hYmxlRGVidWc/LihuYW1lc3BhY2UpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYmluZEV2ZW50TGlzdGVuZXJzKGNpcmN1aXQ6IFJvb3RDaXJjdWl0KSB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgY2lyY3VpdC5vbihldmVudCBhcyBhbnksIGxpc3RlbmVyIGFzIGFueSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBuYW1lIG9mIGEgcGF0aCwgc2ltaWxhciB0byBOb2RlLmpzIHBhdGguZGlybmFtZVxuICogV29ya3Mgb24gYm90aCBVbml4IGFuZCBXaW5kb3dzIHBhdGhzXG4gKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBleHRyYWN0IHRoZSBkaXJlY3RvcnkgZnJvbVxuICogQHJldHVybnMgVGhlIGRpcmVjdG9yeSBwYXJ0IG9mIHRoZSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJuYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghcGF0aCkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gTm9ybWFsaXplIHBhdGggc2VwYXJhdG9ycyB0byBmb3J3YXJkIHNsYXNoZXNcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpXG5cbiAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXNcbiAgY29uc3QgY2xlYW5QYXRoID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuXG4gIC8vIElmIHRoZXJlIGFyZSBubyBzbGFzaGVzLCByZXR1cm4gXCIuXCJcbiAgaWYgKGNsZWFuUGF0aC5pbmRleE9mKFwiL1wiKSA9PT0gLTEpIHJldHVybiBcIi5cIlxuXG4gIC8vIFJldHVybiBldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0IHNsYXNoXG4gIHJldHVybiBjbGVhblBhdGguc3Vic3RyaW5nKDAsIGNsZWFuUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpIHx8IFwiL1wiXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG4vKipcbiAqIFJlc29sdmUgYW4gaW1wb3J0UGF0aCByZWxhdGl2ZSB0byBhIGN3ZCwgc3VwcG9ydGluZyAuLi8sIC4vIGFuZCBhYnNvbHV0ZSBwYXRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEhhbmRsZSBwYXJlbnQgZGlyZWN0b3J5IG5hdmlnYXRpb25cbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi4uL1wiKSkge1xuICAgIGNvbnN0IHBhcmVudERpciA9IGRpcm5hbWUoY3dkKVxuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMyksIHBhcmVudERpcilcbiAgfVxuICAvLyBIYW5kbGUgY3VycmVudCBkaXJlY3RvcnlcbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi4vXCIpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aC5zbGljZSgyKSwgY3dkKVxuICB9XG4gIC8vIEhhbmRsZSBhYnNvbHV0ZSBwYXRoXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgcmV0dXJuIGltcG9ydFBhdGguc2xpY2UoMSlcbiAgfVxuICAvLyBIYW5kbGUgcmVsYXRpdmUgcGF0aFxuICByZXR1cm4gYCR7Y3dkfS8ke2ltcG9ydFBhdGh9YFxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5pbXBvcnQge1xuICByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMsXG4gIHR5cGUgVHNDb25maWcsXG4gIHJlc29sdmVXaXRoQmFzZVVybCxcbn0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGggPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4gIGN3ZD86IHN0cmluZyxcbiAgb3B0czogeyB0c0NvbmZpZz86IFRzQ29uZmlnIHwgbnVsbCB9ID0ge30sXG4pID0+IHtcbiAgLy8gSGFuZGxlIHBhcmVudCBkaXJlY3RvcnkgbmF2aWdhdGlvbiBwcm9wZXJseVxuICBjb25zdCByZXNvbHZlZFBhdGggPSBjd2RcbiAgICA/IHJlc29sdmVSZWxhdGl2ZVBhdGgodW5rbm93bkZpbGVQYXRoLCBjd2QpXG4gICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpIVxuICB9XG5cbiAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgY29uc3QgZXh0ZW5zaW9uID0gW1widHN4XCIsIFwidHNcIiwgXCJqc29uXCIsIFwianNcIiwgXCJqc3hcIiwgXCJvYmpcIiwgXCJnbHRmXCIsIFwiZ2xiXCJdXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMocG9zc2libGVGaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgdXNpbmcgdHNjb25maWcgXCJwYXRoc1wiIG1hcHBpbmcgd2hlbiB0aGUgaW1wb3J0IGlzIG5vbi1yZWxhdGl2ZVxuICBjb25zdCB0c0NvbmZpZyA9IG9wdHMudHNDb25maWcgPz8gbnVsbFxuXG4gIGlmICghdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tUGF0aHMgPSByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMoe1xuICAgICAgaW1wb3J0UGF0aDogdW5rbm93bkZpbGVQYXRoLFxuICAgICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9uLFxuICAgICAgdHNDb25maWcsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbVBhdGhzKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbVBhdGhzXG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb24sXG4gICAgICB0c0NvbmZpZyxcbiAgICB9KVxuICAgIGlmIChyZXNvbHZlZFBhdGhGcm9tQmFzZVVybCkgcmV0dXJuIHJlc29sdmVkUGF0aEZyb21CYXNlVXJsXG4gIH1cblxuICAvLyBDaGVjayBpZiBpdCdzIGFuIGFic29sdXRlIGltcG9ydFxuICBpZiAoIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVua25vd25GaWxlUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHVua25vd25GaWxlUGF0aClcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGh9LiR7ZXh0fWBcbiAgICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHBvc3NpYmxlRmlsZVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGhPclRocm93ID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGwgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgdW5rbm93bkZpbGVQYXRoLFxuICAgIGZzTWFwT3JBbGxGaWxlUGF0aHMsXG4gICAgY3dkLFxuICAgIG9wdHMsXG4gIClcbiAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZpbGUgbm90IGZvdW5kIFwiJHt1bmtub3duRmlsZVBhdGh9XCIsIGF2YWlsYWJsZSBwYXRoczpcXG5cXG4ke09iamVjdC5rZXlzKGZzTWFwT3JBbGxGaWxlUGF0aHMpLmpvaW4oXCIsIFwiKX1gLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWRGaWxlUGF0aFxufVxuIiwgImV4cG9ydCBjb25zdCBnZXRJbXBvcnRzRnJvbUNvZGUgPSAoY29kZTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAvLyBNYXRjaCBiYXNpYyBpbXBvcnQgcGF0dGVybnMgaW5jbHVkaW5nIGNvbWJpbmVkIGRlZmF1bHQgYW5kIG5hbWVzcGFjZSBpbXBvcnRzXG4gIGNvbnN0IGltcG9ydFJlZ2V4ID1cbiAgICAvXlxccyppbXBvcnRcXHMrKD86KD86W1xcd1xcc10rLFxccyopPyg/OlxcKlxccythc1xccytbXFx3XFxzXSt8XFx7W1xcc1xcdyxdK1xcfXxcXHcrKVxccytmcm9tXFxzKik/WydcIl0oLis/KVsnXCJdL2dtXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChtYXRjaCA9IGltcG9ydFJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gbWF0Y2hbMF1cbiAgICBpZiAoL15cXHMqaW1wb3J0XFxzK3R5cGVcXGIvLnRlc3QoZnVsbE1hdGNoKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKVxuICB9XG5cbiAgLy8gTWF0Y2ggcmUtZXhwb3J0c1xuICBjb25zdCByZUV4cG9ydFJlZ2V4ID1cbiAgICAvXlxccypleHBvcnRcXHMrKD86dHlwZVxccyspPyg/OlxcKlxccythc1xccytbXFx3JF0rfFxcKnxcXHtbXn1dK1xcfSlcXHMrZnJvbVxccypbJ1wiXSguKz8pWydcIl0vZ21cbiAgbGV0IHJlRXhwb3J0TWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChyZUV4cG9ydE1hdGNoID0gcmVFeHBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGZ1bGxNYXRjaCA9IHJlRXhwb3J0TWF0Y2hbMF1cbiAgICBpZiAoL15cXHMqZXhwb3J0XFxzK3R5cGVcXGIvLnRlc3QoZnVsbE1hdGNoKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaW1wb3J0cy5wdXNoKHJlRXhwb3J0TWF0Y2hbMV0pXG4gIH1cblxuICByZXR1cm4gaW1wb3J0c1xufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsQ29tcGlsZWRKcyhcbiAgY29tcGlsZWRDb2RlOiBzdHJpbmcsXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PixcbiAgY3dkPzogc3RyaW5nLFxuKSB7XG4gIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X3JlcXVpcmUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChuYW1lLCBwcmVTdXBwbGllZEltcG9ydHMsIGN3ZClcblxuICAgIGNvbnN0IGhhc1Jlc29sdmVkRmlsZVBhdGggPVxuICAgICAgcmVzb2x2ZWRGaWxlUGF0aCAmJiBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aF1cblxuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW25hbWVdICYmICFoYXNSZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydCBcIiR7bmFtZX1cIiBub3QgZm91bmQgJHtjd2QgPyBgaW4gXCIke2N3ZH1cImAgOiBcIlwifWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSB8fCBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aCFdXG4gICAgcmV0dXJuIG5ldyBQcm94eShtb2QsIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiB0YXJnZXQpKSB7XG4gICAgICAgICAgaWYgKHByb3AgPT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmRlZmF1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5fX2VzTW9kdWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9wID09PSBcIl9fZXNNb2R1bGVcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ29tcG9uZW50IFwiJHtTdHJpbmcocHJvcCl9XCIgaXMgbm90IGV4cG9ydGVkIGJ5IFwiJHtuYW1lfVwiYCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIHRhcmdldF1cbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGZ1bmN0aW9uQm9keSA9IGBcbiAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgdmFyIHJlcXVpcmUgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X3JlcXVpcmU7XG4gIHZhciBtb2R1bGUgPSB7IGV4cG9ydHMgfTtcbiAgdmFyIGNpcmN1aXQgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X2NpcmN1aXQ7XG4gICR7Y29tcGlsZWRDb2RlfTtcbiAgcmV0dXJuIG1vZHVsZTtgLnRyaW0oKVxuICByZXR1cm4gRnVuY3Rpb24oZnVuY3Rpb25Cb2R5KS5jYWxsKGdsb2JhbFRoaXMpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBpc1N0YXRpY0Fzc2V0UGF0aCB9IGZyb20gXCJsaWIvc2hhcmVkL3N0YXRpYy1hc3NldC1leHRlbnNpb25zXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcIi4vdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWxvY2FsLWZpbGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydExvY2FsRmlsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBkZWJ1ZyhcImltcG9ydExvY2FsRmlsZSBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gIH0pXG5cbiAgY29uc3QgeyBmc01hcCwgcHJlU3VwcGxpZWRJbXBvcnRzLCBpbXBvcnRTdGFjaywgY3VycmVudGx5SW1wb3J0aW5nIH0gPSBjdHhcblxuICBjb25zdCBmc1BhdGggPSByZXNvbHZlRmlsZVBhdGhPclRocm93KGltcG9ydE5hbWUsIGZzTWFwLCB1bmRlZmluZWQsIHtcbiAgICB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLFxuICB9KVxuICBkZWJ1ZyhcImZzUGF0aDpcIiwgZnNQYXRoKVxuICBpZiAoY3VycmVudGx5SW1wb3J0aW5nLmhhcyhmc1BhdGgpKSB7XG4gICAgY29uc3QgY3ljbGVTdGFydEluZGV4ID0gaW1wb3J0U3RhY2suaW5kZXhPZihmc1BhdGgpXG4gICAgY29uc3QgY3ljbGVQYXRoID1cbiAgICAgIGN5Y2xlU3RhcnRJbmRleCA+PSAwXG4gICAgICAgID8gaW1wb3J0U3RhY2suc2xpY2UoY3ljbGVTdGFydEluZGV4KS5jb25jYXQoZnNQYXRoKVxuICAgICAgICA6IFsuLi5pbXBvcnRTdGFjaywgZnNQYXRoXVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIHdoaWxlIGltcG9ydGluZyBcIiR7ZnNQYXRofVwiLiBUaGUgZm9sbG93aW5nIGltcG9ydCBjaGFpbiBmb3JtcyBhIGN5Y2xlOlxcblxcbiR7Y3ljbGVQYXRoLmpvaW4oXG4gICAgICAgIFwiIC0+IFwiLFxuICAgICAgKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgY3VycmVudGx5SW1wb3J0aW5nLmFkZChmc1BhdGgpXG4gIGltcG9ydFN0YWNrLnB1c2goZnNQYXRoKVxuICB0cnkge1xuICAgIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTdGF0aWNBc3NldFBhdGgoZnNQYXRoKSkge1xuICAgICAgY29uc3QgcGxhdGZvcm1Db25maWcgPSBjdHguY2lyY3VpdC5wbGF0Zm9ybVxuICAgICAgLy8gVXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgICBjb25zdCBzdGF0aWNVcmwgPSBgJHtwbGF0Zm9ybUNvbmZpZz8ucHJvamVjdEJhc2VVcmwgPz8gXCJcIn0vJHtcbiAgICAgICAgZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aFxuICAgICAgfWBcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBkZWZhdWx0OiBzdGF0aWNVcmwsXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIudHN4XCIpIHx8IGZzUGF0aC5lbmRzV2l0aChcIi50c1wiKSkge1xuICAgICAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoZmlsZUNvbnRlbnQpXG5cbiAgICAgIGZvciAoY29uc3QgaW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgICAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgICAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKGltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgICAgICBjd2Q6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKGZpbGVDb250ZW50LCBmc1BhdGgpXG4gICAgICAgIGRlYnVnKFwiZXZhbENvbXBpbGVkSnMgY2FsbGVkIHdpdGg6XCIsIHtcbiAgICAgICAgICBjb2RlOiB0cmFuc2Zvcm1lZENvZGUuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICBkaXJuYW1lOiBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGltcG9ydFJ1blJlc3VsdCA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgICAgIHRyYW5zZm9ybWVkQ29kZSxcbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICAgICAgZGlybmFtZShmc1BhdGgpLFxuICAgICAgICApXG4gICAgICAgIGRlYnVnKFwiaW1wb3J0UnVuUmVzdWx0OlwiLCB7XG4gICAgICAgICAgZnNQYXRoLFxuICAgICAgICAgIGltcG9ydFJ1blJlc3VsdCxcbiAgICAgICAgfSlcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSBpbXBvcnRSdW5SZXN1bHQuZXhwb3J0c1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV2YWwgY29tcGlsZWQganMgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmpzXCIpKSB7XG4gICAgICAvLyBGb3IgLmpzIGZpbGVzLCBlc3BlY2lhbGx5IGZyb20gbm9kZV9tb2R1bGVzLCB3ZSBuZWVkIHRvIHRyYW5zZm9ybSB0aGVtXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgICB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKSxcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICApLmV4cG9ydHNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5zdXBwb3J0ZWQgZmlsZSBleHRlbnNpb24gXCIke2ZzUGF0aC5zcGxpdChcIi5cIikucG9wKCl9XCIgZm9yIFwiJHtmc1BhdGh9XCJgLFxuICAgICAgKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpbXBvcnRTdGFjay5wb3AoKVxuICAgIGN1cnJlbnRseUltcG9ydGluZy5kZWxldGUoZnNQYXRoKVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IFNUQVRJQ19BU1NFVF9FWFRFTlNJT05TID0gW1xuICBcIi5nbGJcIixcbiAgXCIua2ljYWRfbW9kXCIsXG4gIFwiLmdsdGZcIixcbiAgXCIub2JqXCIsXG4gIFwiLnN0bFwiLFxuXVxuXG5leHBvcnQgY29uc3QgaXNTdGF0aWNBc3NldFBhdGggPSAocGF0aDogc3RyaW5nKSA9PlxuICBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUy5zb21lKChleHQpID0+IHBhdGguZW5kc1dpdGgoZXh0KSlcbiIsICJpbXBvcnQgeyB0cmFuc2Zvcm0sIHR5cGUgVHJhbnNmb3JtIGFzIFN1Y3Jhc2VUcmFuc2Zvcm0gfSBmcm9tIFwic3VjcmFzZVwiXG5cbmNvbnN0IFRTX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFtcIi50c1wiLCBcIi50c3hcIiwgXCIubXRzXCIsIFwiLmN0c1wiXSlcbmNvbnN0IEpTWF9FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHN4XCIsIFwiLmpzeFwiLCBcIi50c1wiXSlcblxuY29uc3Qgc3RyaXBRdWVyeUFuZEhhc2ggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBxdWVyeUluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIj9cIilcbiAgY29uc3QgaGFzaEluZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIiNcIilcblxuICBsZXQgZW5kSW5kZXggPSBmaWxlUGF0aC5sZW5ndGhcblxuICBpZiAocXVlcnlJbmRleCAhPT0gLTEgJiYgaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gTWF0aC5taW4ocXVlcnlJbmRleCwgaGFzaEluZGV4KVxuICB9IGVsc2UgaWYgKHF1ZXJ5SW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBxdWVyeUluZGV4XG4gIH0gZWxzZSBpZiAoaGFzaEluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gaGFzaEluZGV4XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGguc2xpY2UoMCwgZW5kSW5kZXgpXG59XG5cbmNvbnN0IGdldEV4dGVuc2lvbiA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gc3RyaXBRdWVyeUFuZEhhc2goZmlsZVBhdGgpXG4gIGNvbnN0IGxhc3REb3RJbmRleCA9IG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiLlwiKVxuXG4gIGlmIChsYXN0RG90SW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IGxhc3RTbGFzaEluZGV4ID0gTWF0aC5tYXgoXG4gICAgbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCIvXCIpLFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiXFxcXFwiKSxcbiAgKVxuXG4gIGlmIChsYXN0U2xhc2hJbmRleCA+IGxhc3REb3RJbmRleCkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFBhdGguc2xpY2UobGFzdERvdEluZGV4KS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aCA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbihmaWxlUGF0aClcblxuICBjb25zdCB0cmFuc2Zvcm1zOiBTdWNyYXNlVHJhbnNmb3JtW10gPSBbXCJpbXBvcnRzXCJdXG5cbiAgaWYgKFRTX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnVuc2hpZnQoXCJ0eXBlc2NyaXB0XCIpXG4gIH1cblxuICBpZiAoSlNYX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICB0cmFuc2Zvcm1zLnB1c2goXCJqc3hcIilcbiAgfVxuXG4gIHJldHVybiB0cmFuc2Zvcm1zXG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1XaXRoU3VjcmFzZSA9IChjb2RlOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtcyA9IGdldFRyYW5zZm9ybXNGb3JGaWxlUGF0aChmaWxlUGF0aClcbiAgY29uc3QgeyBjb2RlOiB0cmFuc2Zvcm1lZENvZGUgfSA9IHRyYW5zZm9ybShjb2RlLCB7XG4gICAgZmlsZVBhdGgsXG4gICAgcHJvZHVjdGlvbjogdHJ1ZSxcbiAgICB0cmFuc2Zvcm1zLFxuICB9KVxuXG4gIHJldHVybiB0cmFuc2Zvcm1lZENvZGVcbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0U25pcHBldChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikge1xuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG4gIGNvbnN0IGZ1bGxTbmlwcGV0TmFtZSA9IGltcG9ydE5hbWUucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKS5yZXBsYWNlKFwiLlwiLCBcIi9cIilcblxuICBjb25zdCB7IGNqcywgZXJyb3IgfSA9IGF3YWl0IGdsb2JhbFRoaXNcbiAgICAuZmV0Y2goYCR7Y3R4LmNqc1JlZ2lzdHJ5VXJsfS8ke2Z1bGxTbmlwcGV0TmFtZX1gKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+ICh7IGNqczogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfSkpXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY2pzOiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgY2pzISxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICApLmV4cG9ydHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbXBvcnRpbmcgc25pcHBldFwiLCBlKVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG5pbnRlcmZhY2UgUGFja2FnZUpzb24ge1xuICBtYWluPzogc3RyaW5nXG4gIG1vZHVsZT86IHN0cmluZ1xuICBleHBvcnRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cbn1cblxuaW50ZXJmYWNlIE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIGJhc2VQYXRoOiBzdHJpbmdcbiAgbW9kdWxlUGF0aDogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGZzTWFwLFxuICAgIGV4dGVuc2lvbnM6IFtcIi5qc1wiLCBcIi5qc3hcIiwgXCIudHNcIiwgXCIudHN4XCIsIFwiLmpzb25cIl0sXG4gICAgYmFzZVBhdGgsXG4gICAgbW9kdWxlUGF0aCxcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0KSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vcGFja2FnZS5qc29uYFxuICBpZiAoIWN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGN0eC5mc01hcFtwYWNrYWdlSnNvblBhdGhdKSBhcyBQYWNrYWdlSnNvblxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhcbiAgcGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY3R4LmZzTWFwW3BhdGhdKSByZXR1cm4gcGF0aFxuXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgcGF0aFdpdGhFeHQgPSBwYXRoLnJlcGxhY2UoL1xcLmpzJHxcXC5qc3gkLywgXCJcIikgKyBleHRcbiAgICBpZiAoY3R4LmZzTWFwW3BhdGhXaXRoRXh0XSkgcmV0dXJuIHBhdGhXaXRoRXh0XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFBhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBleHBvcnRQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZ1bGxFeHBvcnRQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2V4cG9ydFBhdGgucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpfWBcbiAgcmV0dXJuIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsRXhwb3J0UGF0aCwgY3R4KVxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHJlbWFpbmluZ1BhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFwYWNrYWdlSnNvbi5leHBvcnRzKSByZXR1cm4gbnVsbFxuXG4gIC8vIEhhbmRsZSBkZWZhdWx0IGV4cG9ydCBjb25kaXRpb25cbiAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IHBhY2thZ2VKc29uLmV4cG9ydHNbXCIuXCJdXG4gIGlmIChyZW1haW5pbmdQYXRoID09PSBcIlwiICYmIGRlZmF1bHRFeHBvcnQpIHtcbiAgICBpZiAodHlwZW9mIGRlZmF1bHRFeHBvcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBkZWZhdWx0RXhwb3J0LCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBzdWJwYXRoIGV4cG9ydHNcbiAgY29uc3Qgc3VicGF0aEV4cG9ydCA9IHJlbWFpbmluZ1BhdGhcbiAgICA/IHBhY2thZ2VKc29uLmV4cG9ydHNbYC4vJHtyZW1haW5pbmdQYXRofWBdXG4gICAgOiBudWxsXG4gIGlmIChzdWJwYXRoRXhwb3J0ICYmIHR5cGVvZiBzdWJwYXRoRXhwb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIHN1YnBhdGhFeHBvcnQsIGN0eClcbiAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHNcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcImltcG9ydFwiXVxuICBpZiAoXG4gICAgcmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJlxuICAgIGltcG9ydEV4cG9ydCAmJlxuICAgIHR5cGVvZiBpbXBvcnRFeHBvcnQgPT09IFwic3RyaW5nXCJcbiAgKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGltcG9ydEV4cG9ydCwgY3R4KVxuICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBwYWNrYWdlSnNvbi5tb2R1bGUgfHwgcGFja2FnZUpzb24ubWFpbiB8fCBcImluZGV4LmpzXCJcbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZW50cnlQb2ludH1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gIG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcmVtYWluaW5nUGF0aCkge1xuICAgIC8vIFRyeSBpbmRleCBmaWxlcyBpbiB0aGUgbW9kdWxlIHJvb3RcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3QgaW5kZXhQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9pbmRleCR7ZXh0fWBcbiAgICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgZnVsbFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7cmVtYWluaW5nUGF0aH1gXG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG4gIGlmIChkaXJlY3RNYXRjaCkgcmV0dXJuIGRpcmVjdE1hdGNoXG5cbiAgLy8gVHJ5IGluZGV4IGZpbGVzXG4gIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgY29uc3QgaW5kZXhQYXRoID0gYCR7ZnVsbFBhdGh9L2luZGV4JHtleHR9YFxuICAgIGlmIChjdHguZnNNYXBbaW5kZXhQYXRoXSkgcmV0dXJuIGluZGV4UGF0aFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKFxuICBzZWFyY2hQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IG1vZHVsZVBhcnRzID0gY3R4Lm1vZHVsZVBhdGguc3BsaXQoXCIvXCIpXG4gIGNvbnN0IHNjb3BlID0gbW9kdWxlUGFydHNbMF0uc3RhcnRzV2l0aChcIkBcIilcbiAgICA/IG1vZHVsZVBhcnRzLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgOiBtb2R1bGVQYXJ0c1swXVxuICBjb25zdCByZW1haW5pbmdQYXRoID0gbW9kdWxlUGFydHMuc2xpY2Uoc2NvcGUuaW5jbHVkZXMoXCIvXCIpID8gMiA6IDEpLmpvaW4oXCIvXCIpXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aCA9IGAke3NlYXJjaFBhdGggPT0gXCIuXCIgPyBcIlwiIDogYCR7c2VhcmNoUGF0aH0vYH1ub2RlX21vZHVsZXMvJHtzY29wZX1gXG5cbiAgLy8gVHJ5IHRvIGZpbmQgcGFja2FnZS5qc29uXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aCwgY3R4KVxuICBpZiAocGFja2FnZUpzb24pIHtcbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggZXhwb3J0cyBmaWVsZFxuICAgIGNvbnN0IGV4cG9ydHNSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICByZW1haW5pbmdQYXRoLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZXhwb3J0c1Jlc29sdXRpb24pIHJldHVybiBleHBvcnRzUmVzb2x1dGlvblxuXG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIG1haW4vbW9kdWxlIGZpZWxkc1xuICAgIGNvbnN0IGVudHJ5UG9pbnRSZXNvbHV0aW9uID0gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICAgICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChlbnRyeVBvaW50UmVzb2x1dGlvbikgcmV0dXJuIGVudHJ5UG9pbnRSZXNvbHV0aW9uXG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHJlbWFpbmluZyBwYXRoXG4gIGNvbnN0IHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uID0gcmVzb2x2ZVJlbWFpbmluZ1BhdGgoXG4gICAgbm9kZU1vZHVsZXNQYXRoLFxuICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgY3R4LFxuICApXG4gIGlmIChyZW1haW5pbmdQYXRoUmVzb2x1dGlvbikgcmV0dXJuIHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uXG5cbiAgLy8gSWYgbm90IGZvdW5kIGFuZCB3ZSBoYXZlIGEgcGFyZW50IGRpcmVjdG9yeSwgdHJ5IHRoZXJlXG4gIGNvbnN0IHBhcmVudFBhdGggPSBkaXJuYW1lKHNlYXJjaFBhdGgpXG4gIGlmIChwYXJlbnRQYXRoICYmIHBhcmVudFBhdGggIT09IHNlYXJjaFBhdGgpIHtcbiAgICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgocGFyZW50UGF0aCwgY3R4KVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOb2RlTW9kdWxlKFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGN0eCA9IGNyZWF0ZUNvbnRleHQobW9kdWxlUGF0aCwgZnNNYXAsIGJhc2VQYXRoKVxuICByZXR1cm4gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgoY3R4LmJhc2VQYXRoLCBjdHgpXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuXG5leHBvcnQgY29uc3QgaW1wb3J0Tm9kZU1vZHVsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eC5mc01hcCwgXCJcIilcblxuICBpZiAoIXJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIG5vdCBmb3VuZGApXG4gIH1cblxuICAvLyBVc2UgaW1wb3J0TG9jYWxGaWxlIHRvIGhhbmRsZSB0aGUgbm9kZSBtb2R1bGVcbiAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgsIGN0eCwgZGVwdGgpXG5cbiAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlJ3MgZXhwb3J0c1xuICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBNYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4IGZvciBkaXJlY3QgaW1wb3J0c1xuICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIEhhbmRsZSBpbmRleCBmaWxlcyBzcGVjaWFsbHlcbiAgaWYgKFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHN4XCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c1wiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXguanNcIilcbiAgKSB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXFwvaW5kZXhcXC4odHN4P3xqcykkLywgXCJcIilcbiAgICBjb25zdCB1bnByZWZpeGVkRGlyUGF0aCA9IGRpclBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWREaXJQYXRoXSA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAgIC8vIEhhbmRsZSBzY29wZWQgcGFja2FnZXNcbiAgICBpZiAodW5wcmVmaXhlZERpclBhdGguc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgIGNvbnN0IHNjb3BlUGFydHMgPSB1bnByZWZpeGVkRGlyUGF0aC5zcGxpdChcIi9cIilcbiAgICAgIGlmIChzY29wZVBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlZE5hbWUgPSBgJHtzY29wZVBhcnRzWzBdfS8ke3Njb3BlUGFydHNbMV19YFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbc2NvcGVkTmFtZV0gPVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgZ2V0SW1wb3J0c0Zyb21Db2RlIH0gZnJvbSBcImxpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGVcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcIi4vdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5wbS1wYWNrYWdlXCIpXG5cbmZ1bmN0aW9uIGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cih1cmw6IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vXCJcbiAgaWYgKHVybC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgfVxuICByZXR1cm4gdXJsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnROcG1QYWNrYWdlKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSB7XG4gIGRlYnVnKGBpbXBvcnRpbmcgbnBtIHBhY2thZ2U6ICR7aW1wb3J0TmFtZX1gKVxuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkgcmV0dXJuXG5cbiAgY29uc3QgbnBtQ2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vJHtpbXBvcnROYW1lfS8rZXNtYFxuXG4gIGxldCBmaW5hbFVybDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGNvbnN0IHsgY29udGVudCwgZXJyb3IgfSA9IGF3YWl0IGdsb2JhbFRoaXNcbiAgICAuZmV0Y2gobnBtQ2RuVXJsKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+IHtcbiAgICAgIGZpbmFsVXJsID0gcmVzLnVybFxuICAgICAgaWYgKCFyZXMub2spXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGZldGNoIFwiJHtpbXBvcnROYW1lfVwiIGZyb20ganNkZWxpdnI6ICR7cmVzLnN0YXR1c1RleHR9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICApXG4gICAgICByZXR1cm4geyBjb250ZW50OiBhd2FpdCByZXMudGV4dCgpLCBlcnJvcjogbnVsbCB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGUpID0+ICh7IGVycm9yOiBlLCBjb250ZW50OiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBucG0gaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH1cblxuICBjb25zdCBmaW5hbEltcG9ydE5hbWUgPSBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIoZmluYWxVcmwhKVxuICBjb25zdCBjd2QgPSBkaXJuYW1lKGZpbmFsSW1wb3J0TmFtZSlcblxuICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShjb250ZW50ISlcbiAgZm9yIChjb25zdCBzdWJJbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbc3ViSW1wb3J0TmFtZV0pIHtcbiAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKHN1YkltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoXG4gICAgY29udGVudCEsXG4gICAgZmluYWxJbXBvcnROYW1lIHx8IGltcG9ydE5hbWUsXG4gIClcbiAgdHJ5IHtcbiAgICBjb25zdCBleHBvcnRzID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICB0cmFuc2Zvcm1lZENvZGUsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICBjd2QsXG4gICAgKS5leHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmaW5hbEltcG9ydE5hbWVdID0gZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmaW5hbFVybCFdID0gZXhwb3J0c1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXZhbCBucG0gcGFja2FnZSBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZS5tZXNzYWdlfVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICApXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRMb2NhbEZpbGUgfSBmcm9tIFwiLi9pbXBvcnQtbG9jYWwtZmlsZVwiXG5pbXBvcnQgeyBpbXBvcnRTbmlwcGV0IH0gZnJvbSBcIi4vaW1wb3J0LXNuaXBwZXRcIlxuaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoIH0gZnJvbSBcImxpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoXCJcbmltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5vZGVNb2R1bGUgfSBmcm9tIFwiLi9pbXBvcnQtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHsgaW1wb3J0TnBtUGFja2FnZSB9IGZyb20gXCIuL2ltcG9ydC1ucG0tcGFja2FnZVwiXG5pbXBvcnQge1xuICBnZXRUc0NvbmZpZyxcbiAgbWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4sXG59IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWV2YWwtcGF0aFwiKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RXZhbFBhdGgoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4gIG9wdHM6IHtcbiAgICBjd2Q/OiBzdHJpbmdcbiAgfSA9IHt9LFxuKSB7XG4gIGRlYnVnKFwiaW1wb3J0RXZhbFBhdGggY2FsbGVkIHdpdGg6XCIsIHtcbiAgICBpbXBvcnROYW1lLFxuICAgIGRlcHRoLFxuICAgIG9wdHMsXG4gIH0pXG4gIGN0eC5sb2dnZXIuaW5mbyhcbiAgICBgaW1wb3J0RXZhbFBhdGgoXCIke2ltcG9ydE5hbWV9XCIsIHtjd2Q6IFwiJHtvcHRzLmN3ZH1cIiwgZGVwdGg6ICR7ZGVwdGh9fSlgLFxuICApXG5cbiAgZGVidWcoYCR7XCIgIFwiLnJlcGVhdChkZXB0aCl9XHUyN0ExXHVGRTBGYCwgaW1wb3J0TmFtZSlcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBpbiBwcmVTdXBwbGllZEltcG9ydHNbMV1gKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZS5zbGljZSgyKV0pIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBpbiBwcmVTdXBwbGllZEltcG9ydHNbMl1gKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGRlcHRoID4gNSkge1xuICAgIGNvbnNvbGUubG9nKFwiTWF4IGRlcHRoIGZvciBpbXBvcnRzIHJlYWNoZWRcIilcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvbnBtL1wiKSkge1xuICAgIGNvbnN0IHBrZ05hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoL15cXC9ucG1cXC8vLCBcIlwiKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2UoXCIke3BrZ05hbWV9XCIpYClcbiAgICBhd2FpdCBpbXBvcnROcG1QYWNrYWdlKHBrZ05hbWUsIGN0eCwgZGVwdGgpXG4gICAgY29uc3QgcGtnID0gcHJlU3VwcGxpZWRJbXBvcnRzW3BrZ05hbWVdXG4gICAgaWYgKHBrZykge1xuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcGtnXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QsXG4gICAgeyB0c0NvbmZpZzogY3R4LnRzQ29uZmlnIH0sXG4gIClcbiAgaWYgKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRMb2NhbEZpbGUoXCIke3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRofVwiKWApXG4gICAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoLCBjdHgsIGRlcHRoKVxuICAgIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgKHdoaWNoIG1pZ2h0IGJlIGEgdHNjb25maWcgcGF0aCBhbGlhcykgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgIGlmIChpbXBvcnROYW1lICE9PSByZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID1cbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTG9jYWxJbXBvcnRQYXRoXVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggcGF0dGVybiBidXQgZmFpbGVkIHRvIHJlc29sdmVcbiAgLy8gSWYgc28sIHRocm93IGFuIGVycm9yIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIG5wbVxuICBjb25zdCB0c0NvbmZpZyA9IGN0eC50c0NvbmZpZyA/PyBnZXRUc0NvbmZpZyhjdHguZnNNYXApXG4gIGlmICghY3R4LnRzQ29uZmlnICYmIHRzQ29uZmlnKSB7XG4gICAgY3R4LnRzQ29uZmlnID0gdHNDb25maWdcbiAgfVxuICBpZiAobWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oaW1wb3J0TmFtZSwgdHNDb25maWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBhbGlhcyBidXQgY291bGQgbm90IGJlIHJlc29sdmVkIHRvIGFuIGV4aXN0aW5nIGZpbGUke29wdHMuY3dkID8gYCBmcm9tIGRpcmVjdG9yeSBcIiR7b3B0cy5jd2R9XCJgIDogXCJcIn1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG5cbiAgLy8gVHJ5IHRvIHJlc29sdmUgZnJvbSBub2RlX21vZHVsZXNcbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkIHx8IFwiXCIsXG4gIClcbiAgaWYgKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYHJlc29sdmVkTm9kZU1vZHVsZVBhdGg9XCIke3Jlc29sdmVkTm9kZU1vZHVsZVBhdGh9XCJgKVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0Tm9kZU1vZHVsZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRTbmlwcGV0KFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydFNuaXBwZXQoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIGlmICghaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJiAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TnBtUGFja2FnZShcIiR7aW1wb3J0TmFtZX1cIilgKVxuICAgIHJldHVybiBpbXBvcnROcG1QYWNrYWdlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVucmVzb2x2ZWQgaW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiICR7b3B0cy5jd2QgPyBgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICApXG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCIuL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIilcblxuZXhwb3J0IGNvbnN0IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCA9IChvcHRzOiB7XG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgbWFpbkNvbXBvbmVudFBhdGg/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59KSA9PiB7XG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmICFvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgaWYgKFwiaW5kZXgudHN4XCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHN4XCJcbiAgICB9IGVsc2UgaWYgKFwiaW5kZXgudHNcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c1wiXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLmZpbHRlcigoaykgPT4gay5lbmRzV2l0aChcIi50c3hcIikpLmxlbmd0aCA9PT0gMVxuICAgICkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApWzBdXG4gICAgfSBlbHNlIGlmIChcInRzY2lyY3VpdC5jb25maWcuanNvblwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBvcHRzLmZzTWFwW1widHNjaXJjdWl0LmNvbmZpZy5qc29uXCJdXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpXG4gICAgICAgIGlmIChjb25maWcubWFpbkVudHJ5cG9pbnQpIHtcbiAgICAgICAgICBvcHRzLmVudHJ5cG9pbnQgPSBjb25maWcubWFpbkVudHJ5cG9pbnRcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gcGFyc2UgdHNjaXJjdWl0LmNvbmZpZy5qc29uOlwiLCBlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRWl0aGVyIGVudHJ5cG9pbnQgb3IgbWFpbkNvbXBvbmVudFBhdGggbXVzdCBiZSBwcm92aWRlZCAobm8gaW5kZXggZmlsZSwgY291bGQgbm90IGluZmVyIGVudHJ5cG9pbnQpXCIsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIG9wdHMuZW50cnlwb2ludCA9IFwiZW50cnlwb2ludC50c3hcIlxuICAgIGNvbnN0IG1haW5Db21wb25lbnRDb2RlID1cbiAgICAgIG9wdHMuZnNNYXBbcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhvcHRzLm1haW5Db21wb25lbnRQYXRoLCBvcHRzLmZzTWFwKV1cbiAgICBpZiAoIW1haW5Db21wb25lbnRDb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYWluIGNvbXBvbmVudCBwYXRoIFwiJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiIG5vdCBmb3VuZCBpbiBmc01hcC4gQXZhaWxhYmxlIHBhdGhzOiAke09iamVjdC5rZXlzKG9wdHMuZnNNYXApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBvcHRzLmZzTWFwW29wdHMuZW50cnlwb2ludF0gPSBgXG4gICAgIGltcG9ydCAqIGFzIFVzZXJDb21wb25lbnRzIGZyb20gXCIuLyR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIjtcbiAgICAgICAgICBcbiAgICAgICR7XG4gICAgICAgIG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgICAgICAgICA/IGBcbiAgICAgICAgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50c1tcIiR7b3B0cy5tYWluQ29tcG9uZW50TmFtZX1cIl1cbiAgICAgICAgYFxuICAgICAgICAgIDogYGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHMuZGVmYXVsdCB8fCBcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhVc2VyQ29tcG9uZW50cylcbiAgICAgICAgICAuZmlsdGVyKChbbmFtZV0pID0+ICFuYW1lLnN0YXJ0c1dpdGgoXCJ1c2VcIikpXG4gICAgICAgICAgLm1hcCgoW18sIGNvbXBvbmVudF0pID0+IGNvbXBvbmVudClbMF0gfHwgKCgpID0+IG51bGwpO2BcbiAgICAgIH1cblxuICAgICAgICAgICAke1xuICAgICAgICAgICAgIGRlYnVnLmVuYWJsZWRcbiAgICAgICAgICAgICAgID8gYFxuICAgICBjb25zb2xlLmxvZyh7IFVzZXJDb21wb25lbnRzIH0pXG4gICAgIGNvbnNvbGUubG9nKFwiQ29tcG9uZW50VG9SZW5kZXIgXCIgKyBDb21wb25lbnRUb1JlbmRlci50b1N0cmluZygpLCAgeyBDb21wb25lbnRUb1JlbmRlciB9KVxuICAgICBgXG4gICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgfVxuXG4gICAgICBjaXJjdWl0LmFkZCggICAgICAgXG4gICAgICAgICAgPENvbXBvbmVudFRvUmVuZGVyICR7b3B0cy5tYWluQ29tcG9uZW50UHJvcHMgPyBgey4uLiR7SlNPTi5zdHJpbmdpZnkob3B0cy5tYWluQ29tcG9uZW50UHJvcHMsIG51bGwsIDIpfX1gIDogXCJcIn0gLz4gXG4gICAgICApO1xuYFxuICB9XG5cbiAgaWYgKCFvcHRzLm5hbWUgJiYgb3B0cy5tYWluQ29tcG9uZW50TmFtZSkge1xuICAgIG9wdHMubmFtZSA9IG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBlbnRyeXBvaW50Pzogc3RyaW5nLFxuKSA9PiB7XG4gIGlmIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgZW50cnlwb2ludCAmJlxuICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJSb290Q2lyY3VpdCBoYXMgbm8gY2hpbGRyZW5cIikgJiZcbiAgICAhZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnXCJlbnRyeXBvaW50XCI6JylcbiAgKSB7XG4gICAgY29uc3QgZW50cnlwb2ludE1lc3NhZ2UgPSBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCIuL1wiKVxuICAgICAgPyBlbnRyeXBvaW50LnNsaWNlKDIpXG4gICAgICA6IGVudHJ5cG9pbnRcbiAgICBlcnJvci5tZXNzYWdlID0gYCR7ZXJyb3IubWVzc2FnZX0uIFwiZW50cnlwb2ludFwiOiBcIiR7ZW50cnlwb2ludE1lc3NhZ2V9XCIgaXMgc2V0IGluIHRoZSBydW5uZXIgY29uZmlndXJhdGlvbiwgZW50cnlwb2ludHMgbXVzdCBjb250YWluIFwiY2lyY3VpdC5hZGQoLi4uKVwiLCB5b3UgbWlnaHQgYmUgbG9va2luZyB0byB1c2UgbWFpbkNvbXBvbmVudFBhdGggaW5zdGVhZCBpZiB5b3VyIGZpbGUgZXhwb3J0cyBhIGNvbXBvbmVudC5gXG4gIH1cblxuICByZXR1cm4gZXJyb3Jcbn1cbiIsICIvKipcbiAqIEdldCBhbGwgcGF0aHMgb2YgYW4gb2JqZWN0XG4gKlxuICogZ2V0T2JqZWN0UGF0aHMoeyBhOiB7IGI6IDIsIGM6IHsgZDogMyB9IH0sIGU6IDUgfSlcbiAqXG4gKiAvLyBPdXRwdXQ6IFsnYS5iJywgJ2EuYy5kJywgJ2UnXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JqZWN0UGF0aHMoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJlZml4ID0gXCJcIixcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuICAgIGNvbnN0IHBhdGggPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXlcblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBzdWJQYXRocyA9IGdldE9iamVjdFBhdGhzKHZhbHVlLCBwYXRoKVxuICAgICAgcGF0aHMucHVzaCguLi5zdWJQYXRocylcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aHMucHVzaChwYXRoKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXRoc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVBdFBhdGgob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuLyoqXG4gKiBTZXQgYSB2YWx1ZSBhdCBhIHBhdGggaW4gYW4gb2JqZWN0XG4gKlxuICogc2V0VmFsdWVBdFBhdGgoeyBhOiB7IGI6IDIgfSB9LCBcImEuYy5kXCIsIDUpXG4gKlxuICogLy8gT3V0cHV0OiB7IGE6IHsgYjogMiwgYzogeyBkOiA1IH0gfSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZUF0UGF0aChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4pIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpXG4gIGxldCBjdXJyZW50ID0gb2JqXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cblxuICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBsYXN0IGtleSwgc2V0IHRoZSB2YWx1ZS5cbiAgICBpZiAoaSA9PT0ga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB2YWx1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IGFuIG9iamVjdCAoYXZvaWQgb3ZlcndyaXRpbmcgYXJyYXlzKSwgY3JlYXRlIGEgbmV3IG9iamVjdFxuICAgICAgaWYgKFxuICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkgfHxcbiAgICAgICAgdHlwZW9mIGN1cnJlbnRba2V5XSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICBjdXJyZW50W2tleV0gPT09IG51bGwgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShjdXJyZW50W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgY3VycmVudFtrZXldID0ge31cbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDaXJjdWl0UnVubmVyIH0gZnJvbSBcIi4vQ2lyY3VpdFJ1bm5lclwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Uc2NpcmN1aXRDb2RlKFxuICBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nLFxuICBvcHRzPzogT21pdDxQYXJhbWV0ZXJzPENpcmN1aXRSdW5uZXJbXCJleGVjdXRlV2l0aEZzTWFwXCJdPlswXSwgXCJmc01hcFwiPixcbikge1xuICBpZiAoXG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCIgJiZcbiAgICAhZmlsZXN5c3RlbU9yQ29kZVN0cmluZy5pbmNsdWRlcyhcImV4cG9ydFwiKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIFwiZXhwb3J0XCIga2V5d29yZCB3YXNuJ3QgZm91bmQgaW4geW91ciBwcm92aWRlZCBjb2RlLiBZb3UgbmVlZCB0byBleHBvcnQgYSBjb21wb25lbnQgaW4geW91ciBjb2RlLCBlLmcuXFxuXFxuZXhwb3J0IGRlZmF1bHQgKCkgPT4gKFxcbiAgPHJlc2lzdG9yIG5hbWU9XCJSMVwiIHJlc2lzdGFuY2U9XCIxa1wiIC8+XFxuKWAsXG4gICAgKVxuICB9XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPVxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiXG4gICAgICA/IHsgXCJ1c2VyLWNvZGUudHN4XCI6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgfVxuICAgICAgOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nXG5cbiAgY29uc3QgY2lyY3VpdFJ1bm5lciA9IG5ldyBDaXJjdWl0UnVubmVyKClcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLmV4ZWN1dGVXaXRoRnNNYXAoe1xuICAgIGZzTWFwOiBmaWxlc3lzdGVtLFxuICAgIC4uLm9wdHMsXG4gIH0pXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5yZW5kZXJVbnRpbFNldHRsZWQoKVxuXG4gIHJldHVybiBhd2FpdCBjaXJjdWl0UnVubmVyLmdldENpcmN1aXRKc29uKClcbn1cbiIsICJpbXBvcnQgeyBydW5Uc2NpcmN1aXRDb2RlIH0gZnJvbSBcIi4vcnVuVHNjaXJjdWl0Q29kZVwiXG5cbmV4cG9ydCBjb25zdCBydW5Uc2NpcmN1aXRNb2R1bGUgPSBhc3luYyAoXG4gIG1vZHVsZTogc3RyaW5nLFxuICBvcHRzOiB7IHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjsgZXhwb3J0TmFtZT86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgaWYgKCFtb2R1bGUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICBtb2R1bGUgPSBgQHRzY2kvJHttb2R1bGUucmVwbGFjZSgvXFwvLywgXCIuXCIpfWBcbiAgfVxuICBjb25zdCBjaXJjdWl0SnNvbiA9IGF3YWl0IHJ1blRzY2lyY3VpdENvZGUoXG4gICAge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgZXhwb3J0cyB0aGF0IGFyZSBub3QgdGhlIGRlZmF1bHQgZXhwb3J0IGJ5IHNjYW5uaW5nXG4gICAgICAvLyBvdGhlckV4cG9ydHMgZm9yIGNvbXBvbmVudHNcbiAgICAgIFwidXNlci1jb2RlLnRzeFwiOiBgXG4gICAgaW1wb3J0IE1vZHVsZSwgKiBhcyBvdGhlckV4cG9ydHMgZnJvbSBcIiR7bW9kdWxlfVwiO1xuXG4gICAgbGV0IGV4cG9ydE5hbWUgPSBcIiR7b3B0cy5leHBvcnROYW1lID8/IFwiXCJ9XCJcblxuICAgIGlmICgoIU1vZHVsZSB8fCB0eXBlb2YgTW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpICYmICFCb29sZWFuKGV4cG9ydE5hbWUpKSB7XG4gICAgICBleHBvcnROYW1lID0gT2JqZWN0LmtleXMob3RoZXJFeHBvcnRzKS5maWx0ZXIoa2V5ID0+IGtleVswXSA9PT0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgJiYgdHlwZW9mIG90aGVyRXhwb3J0c1trZXldID09PSBcImZ1bmN0aW9uXCIpWzBdXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IGV4cG9ydE5hbWUgPyBvdGhlckV4cG9ydHNbZXhwb3J0TmFtZV0gOiBNb2R1bGVcblxuICAgIGlmICghZGVmYXVsdEV4cG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxcYE5vIGV4cG9ydCBmb3VuZCBmb3IgbW9kdWxlIFwiXFwke21vZHVsZX1cIiAodHJpZWQgXCJcXCR7ZXhwb3J0TmFtZSA/PyBcImRlZmF1bHRcIn1cIilcXGApXG4gICAgfVxuXG4gICAgZXhwb3J0IGRlZmF1bHQgZGVmYXVsdEV4cG9ydDtcbiAgICBgLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFpbkNvbXBvbmVudFByb3BzOiBvcHRzLnByb3BzLFxuICAgIH0sXG4gIClcbiAgcmV0dXJuIGNpcmN1aXRKc29uXG59XG4iLCAiaW1wb3J0ICogYXMgQ29tbGluayBmcm9tIFwiY29tbGlua1wiXG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9pbmRleFwiXG5pbXBvcnQgdHlwZSB7XG4gIEludGVybmFsV2ViV29ya2VyQXBpLFxuICBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBDaXJjdWl0V2ViV29ya2VyLFxufSBmcm9tIFwiLi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBSb290Q2lyY3VpdEV2ZW50TmFtZSB9IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgeyBnZXRPYmplY3RQYXRocywgZ2V0VmFsdWVBdFBhdGggfSBmcm9tIFwiLi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5leHBvcnQgdHlwZSB7IENpcmN1aXRXZWJXb3JrZXIsIFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIFRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVI6IENpcmN1aXRXZWJXb3JrZXIgfCB1bmRlZmluZWRcbiAgfVxuICB2YXIgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciA9IGFzeW5jIChcbiAgY29uZmlndXJhdGlvbjogUGFydGlhbDxXZWJXb3JrZXJDb25maWd1cmF0aW9uPixcbik6IFByb21pc2U8Q2lyY3VpdFdlYldvcmtlcj4gPT4ge1xuICAvLyBLaWxsIGV4aXN0aW5nIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UgaWYgcHJlc2VudFxuICBjb25zdCBleGlzdGluZ1dvcmtlciA9IGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUlxuICBpZiAoZXhpc3RpbmdXb3JrZXIgJiYgdHlwZW9mIGV4aXN0aW5nV29ya2VyLmtpbGwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gS2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlLi4uXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1dvcmtlci5raWxsKClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIltXb3JrZXJdIEVycm9yIGtpbGxpbmcgcHJldmlvdXMgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZTpcIixcbiAgICAgICAgICBlLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhlIGtleSBpcyBjbGVhcmVkIGV2ZW4gaWYga2lsbCB0aHJvd3MgYW4gZXJyb3JcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IGV4aXN0aW5nV29ya2VyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiW1dvcmtlcl0gQ3JlYXRpbmcgY2lyY3VpdCB3ZWIgd29ya2VyIHdpdGggY29uZmlnOlwiLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICApXG4gIH1cblxuICBsZXQgd29ya2VyQmxvYlVybCA9XG4gICAgY29uZmlndXJhdGlvbi53ZWJXb3JrZXJCbG9iVXJsID8/IGNvbmZpZ3VyYXRpb24ud2ViV29ya2VyVXJsXG5cbiAgaWYgKCF3b3JrZXJCbG9iVXJsKSB7XG4gICAgY29uc3QgY2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ldmFsQCR7Y29uZmlndXJhdGlvbi5ldmFsVmVyc2lvbiA/PyBcImxhdGVzdFwifS9kaXN0L3dlYndvcmtlci9lbnRyeXBvaW50LmpzYFxuXG4gICAgY29uc3Qgd29ya2VyQmxvYiA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goY2RuVXJsKS50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXG4gICAgd29ya2VyQmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwod29ya2VyQmxvYilcbiAgfVxuXG4gIGNvbnN0IHJhd1dvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyQmxvYlVybCwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pXG4gIGxldCB3b3JrZXJJbml0RXJyb3I6IGFueVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBFcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gICAgd29ya2VySW5pdEVycm9yID0gZXZlbnRcbiAgfSlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIFVuaGFuZGxlZCByZWplY3Rpb24gaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gTWVzc2FnZSBlcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIGNvbnN0IGVhcmx5TWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gTWVzc2FnZSBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH1cbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGFuZGxlIGZldGNoIHJlcXVlc3RzIGZyb20gdGhlIHdvcmtlclxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgYXN5bmMgKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YVxuICAgIGlmIChkYXRhPy50eXBlICE9PSBcIndvcmtlcl9mZXRjaFwiKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goZGF0YS5pbnB1dCwgZGF0YS5pbml0KVxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwid29ya2VyX2ZldGNoX3Jlc3VsdFwiLFxuICAgICAgICByZXF1ZXN0SWQ6IGRhdGEucmVxdWVzdElkLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBuYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHdvcmtlckluaXRFcnJvcikge1xuICAgIHRocm93IHdvcmtlckluaXRFcnJvclxuICB9XG5cbiAgY29uc3QgY29tbGlua1dvcmtlciA9IENvbWxpbmsud3JhcDxJbnRlcm5hbFdlYldvcmtlckFwaT4ocmF3V29ya2VyKVxuXG4gIHJhd1dvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlYXJseU1lc3NhZ2VIYW5kbGVyKVxuXG4gIC8vIEhlbHBlciB0byBzZXJpYWxpemUgUmVhY3QgZWxlbWVudHMgZm9yIGNyb3NzLXdvcmtlciBjb21tdW5pY2F0aW9uXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVJlYWN0RWxlbWVudChlbGVtZW50OiBhbnkpOiBhbnkge1xuICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBpcyBhIFJlYWN0IGVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9faXNTZXJpYWxpemVkUmVhY3RFbGVtZW50OiB0cnVlLFxuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIHByb3BzOiBzZXJpYWxpemVQcm9wcyhlbGVtZW50LnByb3BzKSxcbiAgICAgICAga2V5OiBlbGVtZW50LmtleSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplUHJvcHMocHJvcHM6IGFueSk6IGFueSB7XG4gICAgaWYgKCFwcm9wcyB8fCB0eXBlb2YgcHJvcHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBwcm9wc1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IGFueSA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNoaWxkcmVuXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHZhbHVlLm1hcChzZXJpYWxpemVSZWFjdEVsZW1lbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VyaWFsaXplZFtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRcbiAgfVxuXG4gIC8vIENvbmRpdGlvbmFsbHkgb3ZlcnJpZGUgZ2xvYmFsIGZldGNoIGluc2lkZSB0aGUgd29ya2VyIHRvIHJvdXRlIHRocm91Z2ggdGhlIHBhcmVudFxuICAvLyBPbmx5IGVuYWJsZSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHZpYSBjb25maWd1cmF0aW9uXG4gIGlmIChjb25maWd1cmF0aW9uLmVuYWJsZUZldGNoUHJveHkpIHtcbiAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIm92ZXJyaWRlX2dsb2JhbF9mZXRjaFwiIH0pXG4gIH1cblxuICBpZiAoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpIHtcbiAgICBhd2FpdCBjb21saW5rV29ya2VyLnNldFNuaXBwZXRzQXBpQmFzZVVybChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybClcbiAgfVxuXG4gIGNvbnN0IG1heWJlUHJveHkgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIENvbWxpbmsucHJveHkodmFsdWUpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIGlmIChjb25maWd1cmF0aW9uLnBsYXRmb3JtKSB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGdldE9iamVjdFBhdGhzKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pKSB7XG4gICAgICBhd2FpdCBjb21saW5rV29ya2VyXG4gICAgICAgIC5zZXRQbGF0Zm9ybUNvbmZpZ1Byb3BlcnR5KFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbWF5YmVQcm94eShnZXRWYWx1ZUF0UGF0aChjb25maWd1cmF0aW9uLnBsYXRmb3JtLCBwYXRoKSksXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yIHNldHRpbmcgcGxhdGZvcm0gY29uZmlnIHByb3BlcnR5ICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWAsXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGdldE9iamVjdFBhdGhzKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZykpIHtcbiAgICAgIGF3YWl0IGNvbWxpbmtXb3JrZXJcbiAgICAgICAgLnNldFByb2plY3RDb25maWdQcm9wZXJ0eShcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIG1heWJlUHJveHkoZ2V0VmFsdWVBdFBhdGgoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLCBwYXRoKSksXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yIHNldHRpbmcgcHJvamVjdCBjb25maWcgcHJvcGVydHkgJHtwYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgbGV0IGlzVGVybWluYXRlZCA9IGZhbHNlXG5cbiAgLy8gQ3JlYXRlIGEgd3JhcHBlciB0aGF0IGhhbmRsZXMgZXZlbnRzIGRpcmVjdGx5IHRocm91Z2ggY2lyY3VpdCBpbnN0YW5jZVxuICBjb25zdCB3cmFwcGVyOiBDaXJjdWl0V2ViV29ya2VyID0ge1xuICAgIGNsZWFyRXZlbnRMaXN0ZW5lcnM6IGNvbWxpbmtXb3JrZXIuY2xlYXJFdmVudExpc3RlbmVycy5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGVuYWJsZURlYnVnOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBlbmFibGVEZWJ1Z1wiKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZW5hYmxlRGVidWcuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgdmVyc2lvbjogY29tbGlua1dvcmtlci52ZXJzaW9uLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZXhlY3V0ZTogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZVwiKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZS5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICBleGVjdXRlQ29tcG9uZW50OiBhc3luYyAoY29tcG9uZW50OiBhbnkpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZUNvbXBvbmVudFwiLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgcGFzcyBpdCBhcy1pcyAod2lsbCBiZSBwcm94aWVkIGJ5IENvbWxpbmspXG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShjb21wb25lbnQpXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSBSZWFjdCBlbGVtZW50LCBzZXJpYWxpemUgaXQgdG8gYSByZWNvbnN0cnVjdGFibGUgZm9ybWF0XG4gICAgICBpZiAoY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQgPT09IFwib2JqZWN0XCIgJiYgY29tcG9uZW50LnR5cGUpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZEVsZW1lbnQgPSBzZXJpYWxpemVSZWFjdEVsZW1lbnQoY29tcG9uZW50KVxuICAgICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoXG4gICAgICAgICAgc2VyaWFsaXplZEVsZW1lbnQsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKGNvbXBvbmVudClcbiAgICB9LFxuICAgIGV4ZWN1dGVXaXRoRnNNYXA6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVXaXRoRnNNYXBcIixcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZVdpdGhGc01hcC5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICByZW5kZXJVbnRpbFNldHRsZWQ6IGNvbWxpbmtXb3JrZXIucmVuZGVyVW50aWxTZXR0bGVkLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZ2V0Q2lyY3VpdEpzb246IGNvbWxpbmtXb3JrZXIuZ2V0Q2lyY3VpdEpzb24uYmluZChjb21saW5rV29ya2VyKSxcbiAgICBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IHByb3hpZWRDYWxsYmFjayA9IENvbWxpbmsucHJveHkoY2FsbGJhY2spXG4gICAgICBjb21saW5rV29ya2VyLm9uKGV2ZW50IGFzIFJvb3RDaXJjdWl0RXZlbnROYW1lLCBwcm94aWVkQ2FsbGJhY2spXG4gICAgfSxcbiAgICBraWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb21saW5rV29ya2VyW0NvbWxpbmsucmVsZWFzZVByb3h5XSgpXG4gICAgICByYXdXb3JrZXIudGVybWluYXRlKClcbiAgICAgIGlzVGVybWluYXRlZCA9IHRydWVcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IHdyYXBwZXIpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgfVxuICA7KHdyYXBwZXIgYXMgYW55KS5fX3Jhd1dvcmtlciA9IHJhd1dvcmtlclxuICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB3cmFwcGVyXG4gIHJldHVybiB3cmFwcGVyXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ydW5uZXIvbm9ybWFsaXplRnNNYXBcIlxuXG5leHBvcnQgY29uc3QgZ2V0UG9zc2libGVFbnRyeXBvaW50Q29tcG9uZW50UGF0aHMgPSAoXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBub3JtYWxpemVkRnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IFtwYXRoLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmc01hcCkpIHtcbiAgICBub3JtYWxpemVkRnNNYXBbbm9ybWFsaXplRmlsZVBhdGgocGF0aCldID0gY29udGVudFxuICB9XG5cbiAgY29uc3QgcG9zc2libGUgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIGlmIChcInRzY2lyY3VpdC5jb25maWcuanNvblwiIGluIG5vcm1hbGl6ZWRGc01hcCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKG5vcm1hbGl6ZWRGc01hcFtcInRzY2lyY3VpdC5jb25maWcuanNvblwiXSlcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLm1haW5FbnRyeXBvaW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHBvc3NpYmxlLmFkZChub3JtYWxpemVGaWxlUGF0aChjb25maWcubWFpbkVudHJ5cG9pbnQpKVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRGc01hcFtcImluZGV4LnRzeFwiXSkgcG9zc2libGUuYWRkKFwiaW5kZXgudHN4XCIpXG4gIGlmIChub3JtYWxpemVkRnNNYXBbXCJpbmRleC50c1wiXSkgcG9zc2libGUuYWRkKFwiaW5kZXgudHNcIilcblxuICBjb25zdCBjaXJjdWl0RmlsZXMgPSBPYmplY3Qua2V5cyhub3JtYWxpemVkRnNNYXApLmZpbHRlcigoaykgPT5cbiAgICBrLmVuZHNXaXRoKFwiLmNpcmN1aXQudHN4XCIpLFxuICApXG4gIGZvciAoY29uc3QgZmlsZSBvZiBjaXJjdWl0RmlsZXMpIHtcbiAgICBwb3NzaWJsZS5hZGQoZmlsZSlcbiAgfVxuXG4gIGNvbnN0IHRzeEZpbGVzID0gT2JqZWN0LmtleXMobm9ybWFsaXplZEZzTWFwKS5maWx0ZXIoKGspID0+XG4gICAgay5lbmRzV2l0aChcIi50c3hcIiksXG4gIClcbiAgaWYgKHRzeEZpbGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHBvc3NpYmxlLmFkZCh0c3hGaWxlc1swXSlcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKHBvc3NpYmxlKVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsbUJBQW1CO0FBRTVCLFlBQVksbUJBQW1CO0FBQy9CLFlBQVksV0FBVztBQUN2QixZQUFZLHdCQUF3Qjs7O0FDQzdCLElBQU0sZ0NBQWdDLENBQzNDLG1CQUN1QjtBQUV2QixNQUFJLFFBQVEsZUFBZSxNQUFNLGdCQUFnQjtBQUNqRCxNQUFJLE1BQU8sUUFBTyxNQUFNLENBQUM7QUFJekIsVUFBUSxlQUFlO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBQ0EsTUFBSSxNQUFPLFFBQU8sTUFBTSxDQUFDO0FBRXpCLFNBQU87QUFDVDs7O0FDaEJPLElBQU0scUNBQXFDLENBQ2hELHNCQUNXO0FBQ1gsTUFBSSxrQkFBa0IsU0FBUyxLQUFLLEdBQUc7QUFDckMsV0FBTyxrQkFBa0IsUUFBUSxRQUFRLEVBQUU7QUFBQSxFQUM3QztBQUNBLFNBQU87QUFDVDs7O0FDSk8sSUFBTSx1QkFBdUIsQ0FDbEMsY0FDdUI7QUFDdkIsTUFBSSxDQUFDLFVBQVcsUUFBTztBQUV2QixNQUFJLFVBQVUsV0FBVyxRQUFRLEdB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QUksT0FBTyxPQUFPLG1CQUFtQixVQUFVO0FBQzdDLGlCQUFTLElBQUksa0JBQWtCLE9BQU8sY0FBYyxDQUFDO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLFFBQVE7QUFBQSxJQUVSO0FBQUEsRUFDRjtBQUVBLE1BQUksZ0JBQWdCLFdBQVcsRUFBRyxVQUFTLElBQUksV0FBVztBQUMxRCxNQUFJLGdCQUFnQixVQUFVLEVBQUcsVUFBUyxJQUFJLFVBQVU7QUFFeEQsUUFBTSxlQUFlLE9BQU8sS0FBSyxlQUFlLEVBQUU7QUFBQSxJQUFPLENBQUMsTUFDeEQsRUFBRSxTQUFTLGNBQWM7QUFBQSxFQUMzQjtBQUNBLGFBQVcsUUFBUSxjQUFjO0FBQy9CLGFBQVMsSUFBSSxJQUFJO0FBQUEsRUFDbkI7QUFFQSxRQUFNLFdBQVcsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUNwRCxFQUFFLFNBQVMsTUFBTTtBQUFBLEVBQ25CO0FBQ0EsTUFBSSxTQUFTLFdBQVcsR0FBRztBQUN6QixhQUFTLElBQUksU0FBUyxDQUFDLENBQUM7QUFBQSxFQUMxQjtBQUVBLFNBQU8sTUFBTSxLQUFLLFFBQVE7QUFDNUI7IiwKICAibmFtZXMiOiBbIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImltcG9ydE5hbWUiLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciXQp9Cg==
|