jsii-pacmak 1.43.0 → 1.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/targets/dotnet/dotnetdocgenerator.js +5 -5
- package/lib/targets/dotnet/dotnetgenerator.js +5 -2
- package/lib/targets/index.d.ts +1 -2
- package/lib/targets/index.js +3 -4
- package/lib/targets/java.js +6 -13
- package/lib/targets/python/requirements-dev.txt +2 -2
- package/lib/targets/python/type-name.d.ts +5 -0
- package/lib/targets/python/type-name.js +3 -2
- package/lib/targets/python.js +16 -5
- package/lib/version.d.ts +2 -2
- package/lib/version.js +4 -4
- package/package.json +12 -12
package/lib/targets/python.js
CHANGED
|
@@ -1141,7 +1141,21 @@ class PythonModule {
|
|
|
1141
1141
|
code.line();
|
|
1142
1142
|
code.line('# Loading modules to ensure their types are registered with the jsii runtime library');
|
|
1143
1143
|
for (const module of this.modules.sort((l, r) => l.pythonName.localeCompare(r.pythonName))) {
|
|
1144
|
-
|
|
1144
|
+
// Rather than generating an absolute import like
|
|
1145
|
+
// "import jsii_calc.submodule.nested_submodule.deeply_nested"
|
|
1146
|
+
// this builds a relative import like
|
|
1147
|
+
// "from .submodule.nested_submodule import deeply_nested"
|
|
1148
|
+
// This enables distributing python packages and using the
|
|
1149
|
+
// generated modules in the same codebase.
|
|
1150
|
+
const assemblyName = type_name_1.toPythonFqn(module.assembly.name, module.assembly).pythonFqn;
|
|
1151
|
+
const submodule = module.pythonName
|
|
1152
|
+
.replace(`${assemblyName}.`, '')
|
|
1153
|
+
.split('.');
|
|
1154
|
+
const submodulePath = submodule
|
|
1155
|
+
.slice(0, submodule.length - 1)
|
|
1156
|
+
.join('.');
|
|
1157
|
+
const submoduleName = submodule[submodule.length - 1];
|
|
1158
|
+
code.line(`from .${submodulePath} import ${submoduleName}`);
|
|
1145
1159
|
}
|
|
1146
1160
|
}
|
|
1147
1161
|
}
|
|
@@ -1641,9 +1655,6 @@ class PythonGenerator extends generator_1.Generator {
|
|
|
1641
1655
|
}));
|
|
1642
1656
|
}
|
|
1643
1657
|
prefixDisclaimer(translated) {
|
|
1644
|
-
if (translated.didCompile && _1.INCOMPLETE_DISCLAIMER_COMPILING) {
|
|
1645
|
-
return `# ${_1.INCOMPLETE_DISCLAIMER_COMPILING}\n${translated.source}`;
|
|
1646
|
-
}
|
|
1647
1658
|
if (!translated.didCompile && _1.INCOMPLETE_DISCLAIMER_NONCOMPILING) {
|
|
1648
1659
|
return `# ${_1.INCOMPLETE_DISCLAIMER_NONCOMPILING}\n${translated.source}`;
|
|
1649
1660
|
}
|
|
@@ -2069,4 +2080,4 @@ function nestedContext(context, fqn) {
|
|
|
2069
2080
|
};
|
|
2070
2081
|
}
|
|
2071
2082
|
const isDeprecated = (x) => { var _a; return ((_a = x.docs) === null || _a === void 0 ? void 0 : _a.deprecated) !== undefined; };
|
|
2072
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FNc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQTZEO0FBQzdELGtEQU00QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLHdCQUlXO0FBRVgsb0dBQW9HO0FBQ3BHLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDbkMsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsQ0FDdkIsQ0FBQztBQUVGLDJFQUEyRTtBQUMzRSwrRkFBK0Y7QUFDL0YsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0IsTUFBcUIsTUFBTyxTQUFRLGVBQU07SUFHeEMsWUFBbUIsT0FBc0I7UUFDdkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBYyxFQUFFLE9BQWU7UUFDdkQsTUFBTSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFpQixFQUFFLE1BQWM7UUFDbEQsNkJBQTZCO1FBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMs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WSxHQUFHLENBQUMsQ0FBYSxFQUFFLEVBQUUsV0FBQyxPQUFBLE9BQUEsQ0FBQyxDQUFDLElBQUksMENBQUUsVUFBVSxNQUFLLFNBQVMsQ0FBQSxFQUFBLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzcGVjIGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBDb2RlTWFrZXIsIHRvU25ha2VDYXNlIH0gZnJvbSAnY29kZW1ha2VyJztcbmltcG9ydCAqIGFzIGVzY2FwZVN0cmluZ1JlZ2V4cCBmcm9tICdlc2NhcGUtc3RyaW5nLXJlZ2V4cCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQge1xuICBUYXJnZXRMYW5ndWFnZSxcbiAgVHJhbnNsYXRpb24sXG4gIFJvc2V0dGEsXG4gIGVuZm9yY2VzU3RyaWN0TW9kZSxcbiAgQXBpTG9jYXRpb24sXG59IGZyb20gJ2pzaWktcm9zZXR0YSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBHZW5lcmF0b3IsIEdlbmVyYXRvck9wdGlvbnMgfSBmcm9tICcuLi9nZW5lcmF0b3InO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgbWQycnN0IH0gZnJvbSAnLi4vbWFya2Rvd24nO1xuaW1wb3J0IHsgVGFyZ2V0LCBUYXJnZXRPcHRpb25zIH0gZnJvbSAnLi4vdGFyZ2V0JztcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyByZW5kZXJTdW1tYXJ5LCBQcm9wZXJ0eURlZmluaXRpb24gfSBmcm9tICcuL191dGlscyc7XG5pbXBvcnQge1xuICBOYW1pbmdDb250ZXh0LFxuICB0b1R5cGVOYW1lLFxuICBQeXRob25JbXBvcnRzLFxuICBtZXJnZVB5dGhvbkltcG9ydHMsXG4gIHRvUGFja2FnZU5hbWUsXG59IGZyb20gJy4vcHl0aG9uL3R5cGUtbmFtZSc7XG5pbXBvcnQgeyBkaWUsIHRvUHl0aG9uSWRlbnRpZmllciB9IGZyb20gJy4vcHl0aG9uL3V0aWwnO1xuaW1wb3J0IHsgdG9QeXRob25WZXJzaW9uUmFuZ2UsIHRvUmVsZWFzZVZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24tdXRpbHMnO1xuXG5pbXBvcnQge1xuICBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfQ09NUElMSU5HLFxuICBJTkNPTVBMRVRFX0RJU0NMQUlNRVJfTk9OQ09NUElMSU5HLFxuICBUYXJnZXROYW1lLFxufSBmcm9tICcuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgcmVxdWlyZW1lbnRzRmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgX19kaXJuYW1lLFxuICAncHl0aG9uJyxcbiAgJ3JlcXVpcmVtZW50cy1kZXYudHh0Jyxcbik7XG5cbi8vIHdlIHVzZSBzaW5nbGUtcXVvdGVzIGZvciBtdWx0aS1saW5lIHN0cmluZ3MgdG8gYWxsb3cgZXhhbXBsZXMgd2l0aGluIHRoZVxuLy8gZG9jc3RyaW5ncyB0aGVtc2VsdmVzIHRvIGluY2x1ZGUgZG91YmxlLXF1b3RlcyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjU2OSlcbmNvbnN0IERPQ1NUUklOR19RVU9URVMgPSBcIicnJ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQeXRob24gZXh0ZW5kcyBUYXJnZXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IFB5dGhvbkdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ29kZShvdXREaXI6IHN0cmluZywgdGFyYmFsbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZ2VuZXJhdGVDb2RlKG91dERpciwgdGFyYmFsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoc291cmNlRGlyOiBzdHJpbmcsIG91dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggdmlydHVhbCBlbnZcbiAgICBjb25zdCB2ZW52ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4oc291cmNlRGlyLCAnLmVudi0nKSk7XG4gICAgY29uc3QgdmVudkJpbiA9IHBhdGguam9pbihcbiAgICAgIHZlbnYsXG4gICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ1NjcmlwdHMnIDogJ2JpbicsXG4gICAgKTtcbiAgICBhd2FpdCBzaGVsbCgncHl0aG9uMycsIFtcbiAgICAgICctbScsXG4gICAgICAndmVudicsXG4gICAgICAnLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlcycsIC8vIEFsbG93IHVzaW5nIGdsb2JhbGx5IGluc3RhbGxlZCBwYWNrYWdlcyAoc2F2ZXMgdGltZSAmIGRpc2sgc3BhY2UpXG4gICAgICB2ZW52LFxuICAgIF0pO1xuICAgIGNvbnN0IGVudiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgUEFUSDogYCR7dmVudkJpbn06JHtwcm9jZXNzLmVudi5QQVRIfWAsXG4gICAgICBWSVJUVUFMX0VOVjogdmVudixcbiAgICB9O1xuICAgIGNvbnN0IHB5dGhvbiA9IHBhdGguam9pbih2ZW52QmluLCAncHl0aG9uJyk7XG5cbiAgICAvLyBJbnN0YWxsIHRoZSBuZWNlc3NhcnkgdGhpbmdzXG4gICAgYXdhaXQgc2hlbGwoXG4gICAgICBweXRob24sXG4gICAgICBbJy1tJywgJ3BpcCcsICdpbnN0YWxsJywgJy0tbm8taW5wdXQnLCAnLXInLCByZXF1aXJlbWVudHNGaWxlXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICAgIGVudixcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFjdHVhbGx5IHBhY2thZ2UgdXAgb3VyIGNvZGUsIGJvdGggYXMgYSBzZGlzdCBhbmQgYSB3aGVlbCBmb3IgcHVibGlzaGluZy5cbiAgICBhd2FpdCBzaGVsbChweXRob24sIFsnc2V0dXAucHknLCAnc2Rpc3QnLCAnLS1kaXN0LWRpcicsIG91dERpcl0sIHtcbiAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgZW52LFxuICAgIH0pO1xuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgcHl0aG9uLFxuICAgICAgWyctbScsICdwaXAnLCAnd2hlZWwnLCAnLS1uby1kZXBzJywgJy0td2hlZWwtZGlyJywgb3V0RGlyLCBzb3VyY2VEaXJdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52LFxuICAgICAgICByZXRyeTogeyBtYXhBdHRlbXB0czogNSB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHNoZWxsKHB5dGhvbiwgWyctbScsICd0d2luZScsICdjaGVjaycsIHBhdGguam9pbihvdXREaXIsICcqJyldLCB7XG4gICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgIGVudixcbiAgICB9KTtcbiAgfVxufVxuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICMgQ09ERSBHRU5FUkFUT1IgI1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmludGVyZmFjZSBFbWl0Q29udGV4dCBleHRlbmRzIE5hbWluZ0NvbnRleHQge1xuICAvKiogQGRlcHJlY2F0ZWQgVGhlIFR5cGVSZXNvbHZlciAqL1xuICByZWFkb25seSByZXNvbHZlcjogVHlwZVJlc29sdmVyO1xufVxuXG5jb25zdCBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gcGF0aC5qb2luKC4uLm5hbWUuc3BsaXQoJy4nKSk7XG59O1xuXG5jb25zdCB0b1B5dGhvbk1ldGhvZE5hbWUgPSAobmFtZTogc3RyaW5nLCBwcm90ZWN0ZWRJdGVtID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xuICBsZXQgdmFsdWUgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgdG9QeXRob25Qcm9wZXJ0eU5hbWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgY29uc3RhbnQgPSBmYWxzZSxcbiAgcHJvdGVjdGVkSXRlbSA9IGZhbHNlLFxuKTogc3RyaW5nID0+IHtcbiAgbGV0IHZhbHVlID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcblxuICBpZiAoY29uc3RhbnQpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZ2l2ZW4gc2lnbmF0dXJlJ3MgcGFyYW1ldGVyIG5hbWUgdG8gd2hhdCBzaG91bGQgYmUgZW1pdHRlZCBpbiBQeXRob24uIEl0IHNsdWdpZmllcyB0aGVcbiAqIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG5hbWVzIHRoYXQgY29sbGlkZSB3aXRoIGEgbGlmdGVkIHByb3AgYnkgYXBwZW5kaW5nIHRyYWlsaW5nIGBfYC4gVGhlcmUgaXMgbm9cbiAqIHJpc2sgb2YgY29uZmxpY3Rpbmcgd2l0aCBhbiBvdGhlciBwb3NpdGlvbmFsIHBhcmFtZXRlciB0aGF0IGVuZHMgd2l0aCBhIGBfYCBjaGFyYWN0ZXIgYmVjYXVzZVxuICogdGhpcyBpcyBwcm9oaWJpdGVkIGJ5IHRoZSBganNpaWAgY29tcGlsZXIgKHBhcmFtZXRlciBuYW1lcyBNVVNUIGJlIGNhbWVsQ2FzZSwgYW5kIG9ubHkgYSBzaW5nbGVcbiAqIGBfYCBpcyBwZXJtaXR0ZWQgd2hlbiBpdCBpcyBvbiAqKmxlYWRpbmcqKiBwb3NpdGlvbilcbiAqXG4gKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0aGF0IG5lZWRzIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gbGlmdGVkUGFyYW1OYW1lcyAgdGhlIGxpc3Qgb2YgXCJsaWZ0ZWRcIiBrZXl3b3JkIHBhcmFtZXRlcnMgaW4gdGhpcyBzaWduYXR1cmUuIFRoaXMgbXVzdCBiZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQgd2hlbiBnZW5lcmF0aW5nIGEgbmFtZSBmb3IgYSBwYXJhbWV0ZXIgdGhhdCAqKmlzKiogbGlmdGVkLlxuICovXG5mdW5jdGlvbiB0b1B5dGhvblBhcmFtZXRlck5hbWUoXG4gIG5hbWU6IHN0cmluZyxcbiAgbGlmdGVkUGFyYW1OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG5cbiAgd2hpbGUgKGxpZnRlZFBhcmFtTmFtZXMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXN1bHQgKz0gJ18nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgc2V0RGlmZmVyZW5jZSA9IDxUPihzZXRBOiBTZXQ8VD4sIHNldEI6IFNldDxUPik6IFNldDxUPiA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8VD4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHNldEEpIHtcbiAgICBpZiAoIXNldEIuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQcmVwYXJlIHB5dGhvbiBtZW1iZXJzIGZvciBlbWlzc2lvbi5cbiAqXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lLCB0aGV5IHdpbGwgYWxsIG1hcCB0byB0aGUgc2FtZSBweXRob25cbiAqIG5hbWUsIHNvIHdlIHdpbGwgZmlsdGVyIGFsbCBkZXByZWNhdGVkIG1lbWJlcnMgYW5kIGV4cGVjdCB0aGF0IHRoZXJlIHdpbGwgYmUgb25seSBvbmVcbiAqIGxlZnQuXG4gKlxuICogUmV0dXJucyB0aGUgbWVtYmVycyBpbiBhIHNvcnRlZCBsaXN0LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTWVtYmVycyhtZW1iZXJzOiBQeXRob25CYXNlW10sIHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpIHtcbiAgLy8gY3JlYXRlIGEgbWFwIGZyb20gcHl0aG9uIG5hbWUgdG8gbGlzdCBvZiBtZW1iZXJzXG4gIGNvbnN0IG1hcDogeyBbcHl0aG9uTmFtZTogc3RyaW5nXTogUHl0aG9uQmFzZVtdIH0gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lbWJlcnMpIHtcbiAgICBsZXQgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdO1xuICAgIGlmICghbGlzdCkge1xuICAgICAgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdID0gW107XG4gICAgfVxuXG4gICAgbGlzdC5wdXNoKG0pO1xuICB9XG5cbiAgLy8gbm93IHJldHVybiBhbGwgdGhlIG1lbWJlcnNcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgbGlzdF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgIGxldCBtZW1iZXI7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgbWVtYmVyIGZvciB0aGlzIG5vcm1hbGl6ZWQgbmFtZSwgdGhlbiB1c2UgaXRcbiAgICAgIG1lbWJlciA9IGxpc3RbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlIGZvdW5kIG1vcmUgdGhhbiBvbmUgbWVtYmVyIHdpdGggdGhlIHNhbWUgcHl0aG9uIG5hbWUsIGZpbHRlciBhbGxcbiAgICAgIC8vIGRlcHJlY2F0ZWQgdmVyc2lvbnMgYW5kIGNoZWNrIHRoYXQgd2UgYXJlIGxlZnQgd2l0aCBleGFjdGx5IG9uZS5cbiAgICAgIC8vIG90aGVyd2lzZSwgdGhleSB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yNTA4XG4gICAgICBjb25zdCBub25EZXByZWNhdGVkID0gbGlzdC5maWx0ZXIoKHgpID0+ICFpc0RlcHJlY2F0ZWQoeCkpO1xuICAgICAgaWYgKG5vbkRlcHJlY2F0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG5vbi1kZXByZWNhdGVkIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub25EZXByZWNhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cIiwgYnV0IGFsbCBvZiB0aGVtIGFyZSBkZXByZWNhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWVtYmVyID0gbm9uRGVwcmVjYXRlZFswXTtcbiAgICB9XG5cbiAgICByZXQucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcmV0dXJuIHNvcnRNZW1iZXJzKHJldCwgcmVzb2x2ZXIpO1xufVxuXG5jb25zdCBzb3J0TWVtYmVycyA9IChcbiAgbWVtYmVyczogUHl0aG9uQmFzZVtdLFxuICByZXNvbHZlcjogVHlwZVJlc29sdmVyLFxuKTogUHl0aG9uQmFzZVtdID0+IHtcbiAgbGV0IHNvcnRhYmxlID0gbmV3IEFycmF5PHtcbiAgICBtZW1iZXI6IFB5dGhvbkJhc2UgJiBJU29ydGFibGVUeXBlO1xuICAgIGRlcGVuZHNPbjogU2V0PFB5dGhvblR5cGU+O1xuICB9PigpO1xuICBjb25zdCBzb3J0ZWQgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8UHl0aG9uQmFzZT4oKTtcblxuICAvLyBUaGUgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBkbywgaXMgcHVzaCBhbnkgaXRlbSB3aGljaCBpcyBub3Qgc29ydGFibGUgdG8gdGhlIHZlcnlcbiAgLy8gZnJvbnQgb2YgdGhlIGxpc3QuIFRoaXMgd2lsbCBiZSB0aGluZ3MgbGlrZSBtZXRob2RzLCBwcm9wZXJ0aWVzLCBldGMuXG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICBpZiAoIWlzU29ydGFibGVUeXBlKG1lbWJlcikpIHtcbiAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICBzZWVuLmFkZChtZW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3J0YWJsZS5wdXNoKHsgbWVtYmVyLCBkZXBlbmRzT246IG5ldyBTZXQobWVtYmVyLmRlcGVuZHNPbihyZXNvbHZlcikpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB0aGF0IHdlJ3ZlIHB1bGxlZCBvdXQgZXZlcnl0aGluZyB0aGF0IGNvdWxkbid0IHBvc3NpYmx5IGhhdmUgZGVwZW5kZW5jaWVzLFxuICAvLyB3ZSB3aWxsIGdvIHRocm91Z2ggdGhlIHJlbWFpbmluZyBpdGVtcywgYW5kIHB1bGwgb2ZmIGFueSBpdGVtcyB3aGljaCBoYXZlIG5vXG4gIC8vIGRlcGVuZGVuY2llcyB0aGF0IHdlIGhhdmVuJ3QgYWxyZWFkeSBzb3J0ZWQuXG4gIHdoaWxlIChzb3J0YWJsZS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCB7IG1lbWJlciwgZGVwZW5kc09uIH0gb2Ygc29ydGFibGUpIHtcbiAgICAgIGNvbnN0IGRpZmYgPSBzZXREaWZmZXJlbmNlKGRlcGVuZHNPbiwgc2Vlbik7XG4gICAgICBpZiAoWy4uLmRpZmZdLmZpbmQoKGRlcCkgPT4gIShkZXAgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSA9PSBudWxsKSB7XG4gICAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICAgIHNlZW4uYWRkKG1lbWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdG92ZXIgPSBzb3J0YWJsZS5maWx0ZXIoKHsgbWVtYmVyIH0pID0+ICFzZWVuLmhhcyhtZW1iZXIpKTtcbiAgICBpZiAobGVmdG92ZXIubGVuZ3RoID09PSBzb3J0YWJsZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBzb3J0IG1lbWJlcnMgKGNpcmN1bGFyIGRlcGVuZGVuY3k/KS4gTGVmdG92ZXI6ICR7bGVmdG92ZXJcbiAgICAgICAgICAubWFwKChsbykgPT4gbG8ubWVtYmVyLnB5dGhvbk5hbWUpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvcnRhYmxlID0gbGVmdG92ZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNvcnRlZDtcbn07XG5cbmludGVyZmFjZSBQeXRob25CYXNlIHtcbiAgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuXG4gIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCwgb3B0cz86IGFueSk6IHZvaWQ7XG5cbiAgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cztcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGUgZXh0ZW5kcyBQeXRob25CYXNlIHtcbiAgLy8gVGhlIEpTSUkgRlFOIGZvciB0aGlzIGl0ZW0sIGlmIHRoaXMgaXRlbSBkb2Vzbid0IGV4aXN0IGFzIGEgSlNJSSB0eXBlLCB0aGVuIGl0XG4gIC8vIGRvZXNuJ3QgaGF2ZSBhIEZRTiBhbmQgaXQgc2hvdWxkIGJlIG51bGw7XG4gIHJlYWRvbmx5IGZxbj86IHN0cmluZztcblxuICBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTb3J0YWJsZVR5cGUge1xuICBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXTtcbn1cblxuZnVuY3Rpb24gaXNTb3J0YWJsZVR5cGUoYXJnOiB1bmtub3duKTogYXJnIGlzIElTb3J0YWJsZVR5cGUge1xuICByZXR1cm4gKGFyZyBhcyBQYXJ0aWFsPElTb3J0YWJsZVR5cGU+KS5kZXBlbmRzT24gIT09IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGVPcHRzIHtcbiAgYmFzZXM/OiBzcGVjLlR5cGVSZWZlcmVuY2VbXTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZVB5dGhvbkNsYXNzVHlwZSBpbXBsZW1lbnRzIFB5dGhvblR5cGUsIElTb3J0YWJsZVR5cGUge1xuICBwcm90ZWN0ZWQgYmFzZXM6IHNwZWMuVHlwZVJlZmVyZW5jZVtdO1xuICBwcm90ZWN0ZWQgbWVtYmVyczogUHl0aG9uQmFzZVtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VwYXJhdGVNZW1iZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHNwZWM6IHNwZWMuVHlwZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0czogUHl0aG9uVHlwZU9wdHMsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgY29uc3QgeyBiYXNlcyA9IFtdIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5iYXNlcyA9IGJhc2VzO1xuICAgIHRoaXMubWVtYmVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHl0aG9uVHlwZVtdIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8UHl0aG9uVHlwZT4oKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBiYXNlcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBtb2R1bGUgYXQgdGhlIHNhbWUgbGV2ZWwgb2ZcbiAgICAvLyBuZXN0aW5nLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgdGhpcy5iYXNlcykge1xuICAgICAgaWYgKHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UoYmFzZSkpIHtcbiAgICAgICAgaWYgKHJlc29sdmVyLmlzSW5Nb2R1bGUoYmFzZSkpIHtcbiAgICAgICAgICAvLyBHaXZlbiBhIGJhc2UsIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBiYXNlJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWUgYXNcbiAgICAgICAgICAvLyBvdXIgcGFyZW50LCBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXQgdGhlXG4gICAgICAgICAgLy8gc2FtZSBsZXZlbCBvZiBvdXIgb3duLlxuICAgICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAgIC8vICAgICAgIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICBsZXQgYmFzZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGJhc2UpO1xuICAgICAgICAgIGxldCBiYXNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGJhc2UpO1xuICAgICAgICAgIHdoaWxlIChiYXNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgIGJhc2VJdGVtID0gYmFzZVBhcmVudDtcbiAgICAgICAgICAgIGJhc2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzZWVuLmhhcyhiYXNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYmFzZUl0ZW0pO1xuICAgICAgICAgICAgc2Vlbi5hZGQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgLi4udGhpcy5iYXNlcy5tYXAoKGJhc2UpID0+IHRvVHlwZU5hbWUoYmFzZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKSB7XG4gICAgdGhpcy5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIGlmICghdGhpcy5mcW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBtYWtlIGFwaUxvY2F0aW9uIGZvciAke3RoaXMucHl0aG9uTmFtZX0sIGRvZXMgbm90IGhhdmUgRlFOYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGFwaTogJ3R5cGUnLCBmcW46IHRoaXMuZnFuIH07XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuXG4gICAgY29uc3QgY2xhc3NQYXJhbXMgPSB0aGlzLmdldENsYXNzUGFyYW1zKGNvbnRleHQpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBjbGFzc1BhcmFtcyk7XG5cbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5ib3VuZFJlc29sdmVyKGNvbnRleHQucmVzb2x2ZXIpO1xuICAgICAgbGV0IHNob3VsZFNlcGFyYXRlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgICBpZiAoc2hvdWxkU2VwYXJhdGUpIHtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRTZXBhcmF0ZSA9IHRoaXMuc2VwYXJhdGVNZW1iZXJzO1xuICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCB7IC4uLmNvbnRleHQsIHJlc29sdmVyIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBib3VuZFJlc29sdmVyKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBUeXBlUmVzb2x2ZXIge1xuICAgIGlmICh0aGlzLmZxbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlci5iaW5kKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgQmFzZU1ldGhvZE9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG59XG5cbmludGVyZmFjZSBCYXNlTWV0aG9kRW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlTWV0aG9kIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJldHVybkZyb21KU0lJTWV0aG9kOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHNwZWMuUGFyYW1ldGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXR1cm5zOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW4sXG4gICAgb3B0czogQmFzZU1ldGhvZE9wdHMsXG4gICkge1xuICAgIHRoaXMuYWJzdHJhY3QgPSAhIW9wdHMuYWJzdHJhY3Q7XG4gICAgdGhpcy5saWZ0ZWRQcm9wID0gb3B0cy5saWZ0ZWRQcm9wO1xuICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogdGhpcy5wYXJlbnQuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogdGhpcy5qc05hbWUgPz8gJycsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgdG9UeXBlTmFtZSh0aGlzLnJldHVybnMpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKHBhcmFtKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICApLFxuICAgICAgLi4ubGlmdGVkUHJvcGVydGllcyh0aGlzLmxpZnRlZFByb3ApLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiogbGlmdGVkUHJvcGVydGllcyhcbiAgICAgIHN0cnVjdDogc3BlYy5JbnRlcmZhY2VUeXBlIHwgdW5kZWZpbmVkLFxuICAgICk6IEl0ZXJhYmxlSXRlcmF0b3I8UHl0aG9uSW1wb3J0cz4ge1xuICAgICAgaWYgKHN0cnVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBzdHJ1Y3QucHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICB5aWVsZCB0b1R5cGVOYW1lKHByb3AudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIHN0cnVjdC5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGlmYWNlID0gY29udGV4dC5yZXNvbHZlci5kZXJlZmVyZW5jZShiYXNlKSBhcyBzcGVjLkludGVyZmFjZVR5cGU7XG4gICAgICAgIGZvciAoY29uc3QgaW1wb3J0cyBvZiBsaWZ0ZWRQcm9wZXJ0aWVzKGlmYWNlKSkge1xuICAgICAgICAgIHlpZWxkIGltcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW1pdChcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgb3B0cz86IEJhc2VNZXRob2RFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcblxuICAgIGNvbnN0IHJldHVyblR5cGU6IHN0cmluZyA9IHRvVHlwZU5hbWUodGhpcy5yZXR1cm5zKS5weXRob25UeXBlKGNvbnRleHQpO1xuXG4gICAgLy8gV2UgY2Fubm90IChjdXJyZW50bHk/KSBibGluZGx5IHVzZSB0aGUgbmFtZXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIEpTSUkgZm9yXG4gICAgLy8gaW5pdGlhbGl6ZXJzLCBiZWNhdXNlIG91ciBrZXl3b3JkIGxpZnRpbmcgd2lsbCBhbGxvdyB0d28gbmFtZXMgdG8gY2xhc2guXG4gICAgLy8gVGhpcyBjYW4gaG9wZWZ1bGx5IGJlIHJlbW92ZWQgb25jZSB3ZSBnZXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yODhcbiAgICAvLyByZXNvbHZlZCwgc28gYnVpbGQgdXAgYSBsaXN0IG9mIGFsbCBvZiB0aGUgcHJvcCBuYW1lcyBzbyB3ZSBjYW4gY2hlY2sgYWdhaW5zdFxuICAgIC8vIHRoZW0gbGF0ZXIuXG4gICAgY29uc3QgbGlmdGVkUHJvcE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMubGlmdGVkUHJvcD8ucHJvcGVydGllcyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5saWZ0ZWRQcm9wLnByb3BlcnRpZXMpIHtcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLmFkZCh0b1B5dGhvblBhcmFtZXRlck5hbWUocHJvcC5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byB0dXJuIGEgbGlzdCBvZiBKU0lJIHBhcmFtZXRlcnMsIGludG8gUHl0aG9uIHN0eWxlIGFyZ3VtZW50cyB3aXRoXG4gICAgLy8gZ3JhZHVhbCB0eXBpbmcsIHNvIHdlJ2xsIGhhdmUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMsIGFuZFxuICAgIC8vIGJ1aWxkIHRoZSBsaXN0LCBjb252ZXJ0aW5nIGFzIHdlIGdvLlxuICAgIGNvbnN0IHB5dGhvblBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgLy8gV2UgY2Fubm90IChjdXJyZW50bHk/KSBibGluZGx5IHVzZSB0aGUgbmFtZXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIEpTSUkgZm9yXG4gICAgICAvLyBpbml0aWFsaXplcnMsIGJlY2F1c2Ugb3VyIGtleXdvcmQgbGlmdGluZyB3aWxsIGFsbG93IHR3byBuYW1lcyB0byBjbGFzaC5cbiAgICAgIC8vIFRoaXMgY2FuIGhvcGVmdWxseSBiZSByZW1vdmVkIG9uY2Ugd2UgZ2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjg4XG4gICAgICAvLyByZXNvbHZlZC5cbiAgICAgIGNvbnN0IHBhcmFtTmFtZTogc3RyaW5nID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKFxuICAgICAgICBwYXJhbS5uYW1lLFxuICAgICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBwYXJhbVR5cGUgPSB0b1R5cGVOYW1lKHBhcmFtKS5weXRob25UeXBlKHtcbiAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGFyYW1EZWZhdWx0ID0gcGFyYW0ub3B0aW9uYWwgPyAnID0gTm9uZScgOiAnJztcblxuICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9JHtwYXJhbURlZmF1bHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jdW1lbnRhYmxlQXJnczogRG9jdW1lbnRhYmxlQXJndW1lbnRbXSA9IHRoaXMucGFyYW1ldGVyc1xuICAgICAgLm1hcChcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgIGRvY3M6IHAuZG9jcyxcbiAgICAgICAgICAgIGRlZmluaW5nVHlwZTogdGhpcy5wYXJlbnQsXG4gICAgICAgICAgfSBhcyBEb2N1bWVudGFibGVBcmd1bWVudCksXG4gICAgICApXG4gICAgICAvLyBJZiB0aGVyZSdzIGxpZnRlZFByb3BzLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgc3RydWN0IGFuZCBpdCB3b24ndCBiZSBfYWN0dWFsbHlfIGVtaXR0ZWQuXG4gICAgICAuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgdGhpcy5saWZ0ZWRQcm9wICE9IG51bGwgPyBpbmRleCA8IHRoaXMucGFyYW1ldGVycy5sZW5ndGggLSAxIDogdHJ1ZSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHBhcmFtKSA9PiAoe1xuICAgICAgICAuLi5wYXJhbSxcbiAgICAgICAgbmFtZTogdG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUsIGxpZnRlZFByb3BOYW1lcyksXG4gICAgICB9KSk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgbGlmdGVkIHBhcmFtZXRlciwgdGhlbiB3ZSdsbCBkcm9wIHRoZSBsYXN0IGFyZ3VtZW50IHRvIG91ciBwYXJhbXNcbiAgICAvLyBhbmQgdGhlbiB3ZSdsbCBsaWZ0IGFsbCBvZiB0aGUgcGFyYW1zIG9mIHRoZSBsaWZ0ZWQgdHlwZSBhcyBrZXl3b3JkIGFyZ3VtZW50c1xuICAgIC8vIHRvIHRoZSBmdW5jdGlvbi5cbiAgICBpZiAodGhpcy5saWZ0ZWRQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlbW92ZSBvdXIgbGFzdCBpdGVtLlxuICAgICAgcHl0aG9uUGFyYW1zLnBvcCgpO1xuICAgICAgY29uc3QgbGlmdGVkUHJvcGVydGllcyA9IHRoaXMuZ2V0TGlmdGVkUHJvcGVydGllcyhjb250ZXh0LnJlc29sdmVyKTtcblxuICAgICAgaWYgKGxpZnRlZFByb3BlcnRpZXMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgLy8gQWxsIG9mIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGtleXdvcmQgb25seSBhcmd1bWVudHMsIHNvIHdlJ2xsIG1hcmsgdGhlbVxuICAgICAgICAvLyBhcyBzdWNoLlxuICAgICAgICBweXRob25QYXJhbXMucHVzaCgnKicpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgb2Ygb3VyIHByb3BzLCBhbmQgcmVmbGVjdCB0aGVtIGludG8gb3VyIHBhcmFtcy5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGxpZnRlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUocHJvcC5wcm9wLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUocHJvcC5wcm9wKS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICBwYXJhbWV0ZXJUeXBlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBhcmFtRGVmYXVsdCA9IHByb3AucHJvcC5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuXG4gICAgICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9JHtwYXJhbURlZmF1bHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRG9jdW1lbnQgdGhlbSBhcyBrZXl3b3JkIGFyZ3VtZW50c1xuICAgICAgZG9jdW1lbnRhYmxlQXJncy5wdXNoKFxuICAgICAgICAuLi5saWZ0ZWRQcm9wZXJ0aWVzLm1hcChcbiAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgIG5hbWU6IHAucHJvcC5uYW1lLFxuICAgICAgICAgICAgICBkb2NzOiBwLnByb3AuZG9jcyxcbiAgICAgICAgICAgICAgZGVmaW5pbmdUeXBlOiBwLmRlZmluaW5nVHlwZSxcbiAgICAgICAgICAgIH0gYXMgRG9jdW1lbnRhYmxlQXJndW1lbnQpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCA+PSAxICYmXG4gICAgICB0aGlzLnBhcmFtZXRlcnNbdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdLnZhcmlhZGljXG4gICAgKSB7XG4gICAgICAvLyBBbm90aGVyIHNpdHVhdGlvbiB3ZSBjb3VsZCBiZSBpbiwgaXMgdGhhdCBpbnN0ZWFkIG9mIGhhdmluZyBhIHBsYWluIHBhcmFtZXRlclxuICAgICAgLy8gd2UgaGF2ZSBhIHZhcmlhZGljIHBhcmFtZXRlciB3aGVyZSB3ZSBuZWVkIHRvIGV4cGFuZCB0aGUgbGFzdCBwYXJhbWV0ZXIgYXMgYVxuICAgICAgLy8gKmFyZ3MuXG4gICAgICBweXRob25QYXJhbXMucG9wKCk7XG5cbiAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnMuc2xpY2UoLTEpWzBdO1xuICAgICAgY29uc3QgcGFyYW1OYW1lID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKGxhc3RQYXJhbWV0ZXIubmFtZSk7XG4gICAgICBjb25zdCBwYXJhbVR5cGUgPSB0b1R5cGVOYW1lKGxhc3RQYXJhbWV0ZXIudHlwZSkucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCoke3BhcmFtTmFtZX06ICR7cGFyYW1UeXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29yYXRvcnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKHRoaXMuanNOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBuZWVkZWQgYmVjYXVzZSBteXB5IGRvZXMgbm90IGtub3cgaG93IHRvIGNoZWNrIGRlY29yYXRlZCBkZWNsYXJhdGlvbnNcbiAgICAgIGRlY29yYXRvcnMucHVzaChgQGpzaWkubWVtYmVyKGpzaWlfbmFtZT1cIiR7dGhpcy5qc05hbWV9XCIpYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVjb3JhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChgQCR7dGhpcy5kZWNvcmF0b3J9YCk7XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaCgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgIH1cblxuICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBuZWVkZWQgYmVjYXVzZSBteXB5IGRvZXMgbm90IGtub3cgaG93IHRvIGNoZWNrIGRlY29yYXRlZCBkZWNsYXJhdGlvbnNcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnNcbiAgICAgICAgLmpvaW4oJyAjIHR5cGU6IGlnbm9yZVttaXNjXVxcbicpXG4gICAgICAgIC5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgY29kZS5saW5lKGRlY29yYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHl0aG9uUGFyYW1zLnVuc2hpZnQoXG4gICAgICBzbHVnaWZ5QXNOZWVkZWQoXG4gICAgICAgIHRoaXMuaW1wbGljaXRQYXJhbWV0ZXIsXG4gICAgICAgIHB5dGhvblBhcmFtcy5tYXAoKHBhcmFtKSA9PiBwYXJhbS5zcGxpdCgnOicpWzBdLnRyaW0oKSksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBvcGVuU2lnbmF0dXJlKFxuICAgICAgY29kZSxcbiAgICAgICdkZWYnLFxuICAgICAgdGhpcy5weXRob25OYW1lLFxuICAgICAgcHl0aG9uUGFyYW1zLFxuICAgICAgZmFsc2UsXG4gICAgICByZXR1cm5UeXBlLFxuICAgICk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGFyZ3VtZW50czogZG9jdW1lbnRhYmxlQXJncyxcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBtZXRob2QtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRCb2R5KFxuICAgICAgY29kZSxcbiAgICAgIGNvbnRleHQsXG4gICAgICByZW5kZXJBYnN0cmFjdCxcbiAgICAgIGZvcmNlRW1pdEJvZHksXG4gICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICBweXRob25QYXJhbXNbMF0sXG4gICAgICByZXR1cm5UeXBlLFxuICAgICk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRCb2R5KFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICByZW5kZXJBYnN0cmFjdDogYm9vbGVhbixcbiAgICBmb3JjZUVtaXRCb2R5OiBib29sZWFuLFxuICAgIGxpZnRlZFByb3BOYW1lczogU2V0PHN0cmluZz4sXG4gICAgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyxcbiAgICByZXR1cm5UeXBlOiBzdHJpbmcsXG4gICkge1xuICAgIGlmIChcbiAgICAgICghdGhpcy5zaG91bGRFbWl0Qm9keSAmJiAhZm9yY2VFbWl0Qm9keSkgfHxcbiAgICAgIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKCcuLi4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubGlmdGVkUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW1pdEF1dG9Qcm9wcyhjb2RlLCBjb250ZXh0LCBsaWZ0ZWRQcm9wTmFtZXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXRKc2lpTWV0aG9kQ2FsbChcbiAgICAgICAgY29kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgICBpbXBsaWNpdFBhcmFtZXRlcixcbiAgICAgICAgcmV0dXJuVHlwZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXV0b1Byb3BzKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICApIHtcbiAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gdGhpcy5wYXJhbWV0ZXJzLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBhcmdOYW1lID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKGxhc3RQYXJhbWV0ZXIubmFtZSwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobGFzdFBhcmFtZXRlci50eXBlKS5weXRob25UeXBlKHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBwcm9wZXJ0aWVzLCB3aGljaCBhcmUgbWFuZGF0b3J5LCB0aGVzZSBhcmUgdGhlXG4gICAgLy8gb25lcyB3ZSB3aWxsIHNwZWNpZml5IHRvIHN0YXJ0IHdpdGggaW4gb3VyIGRpY3Rpb25hcnkgbGl0ZXJhbC5cbiAgICBjb25zdCBsaWZ0ZWRQcm9wcyA9IHRoaXMuZ2V0TGlmdGVkUHJvcGVydGllcyhjb250ZXh0LnJlc29sdmVyKS5tYXAoXG4gICAgICAocCkgPT4gbmV3IFN0cnVjdEZpZWxkKHRoaXMuZ2VuZXJhdG9yLCBwLnByb3AsIHAuZGVmaW5pbmdUeXBlKSxcbiAgICApO1xuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gbGlmdGVkUHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHAucHl0aG9uTmFtZSlcbiAgICAgIC5tYXAoKHYpID0+IGAke3Z9PSR7dn1gKTtcblxuICAgIGFzc2lnbkNhbGxSZXN1bHQoY29kZSwgYXJnTmFtZSwgdHlwZU5hbWUsIGFzc2lnbm1lbnRzKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEpzaWlNZXRob2RDYWxsKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICAgIGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZTogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBtZXRob2RQcmVmaXg6IHN0cmluZyA9IHRoaXMucmV0dXJuRnJvbUpTSUlNZXRob2QgPyAncmV0dXJuICcgOiAnJztcblxuICAgIGNvbnN0IGpzaWlNZXRob2RQYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuY2xhc3NBc0ZpcnN0UGFyYW1ldGVyKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBub3Qga25vd24uJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1N0YXRpYykge1xuICAgICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goXG4gICAgICAgICAgdG9UeXBlTmFtZSh0aGlzLnBhcmVudCkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNpbmcgdGhlIGR5bmFtaWMgY2xhc3Mgb2YgYHNlbGZgLlxuICAgICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll9fY2xhc3NfX2ApO1xuICAgICAgfVxuICAgIH1cbiAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goaW1wbGljaXRQYXJhbWV0ZXIpO1xuICAgIGlmICh0aGlzLmpzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goYFwiJHt0aGlzLmpzTmFtZX1cImApO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBsYXN0IGFyZyBpcyB2YXJpYWRpYywgZXhwYW5kIHRoZSB0dXBsZVxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgbGV0IGV4cHIgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICAgIGlmIChwYXJhbS52YXJpYWRpYykge1xuICAgICAgICBleHByID0gYCoke2V4cHJ9YDtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5wdXNoKGV4cHIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gYGpzaWkuJHt0aGlzLmpzaWlNZXRob2R9KCR7anNpaU1ldGhvZFBhcmFtcy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfSwgWyR7cGFyYW1zLmpvaW4oJywgJyl9XSlgO1xuICAgIGNvZGUubGluZShcbiAgICAgIGAke21ldGhvZFByZWZpeH0ke1xuICAgICAgICB0aGlzLnJldHVybkZyb21KU0lJTWV0aG9kICYmIHJldHVyblR5cGVcbiAgICAgICAgICA/IGB0eXBpbmcuY2FzdCgke3JldHVyblR5cGV9LCAke3ZhbHVlfSlgXG4gICAgICAgICAgOiB2YWx1ZVxuICAgICAgfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGlmdGVkUHJvcGVydGllcyhyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHJvcGVydHlEZWZpbml0aW9uW10ge1xuICAgIGNvbnN0IGxpZnRlZFByb3BlcnRpZXM6IFByb3BlcnR5RGVmaW5pdGlvbltdID0gW107XG5cbiAgICBjb25zdCBzdGFjayA9IFt0aGlzLmxpZnRlZFByb3BdO1xuICAgIGNvbnN0IGtub3duSWZhY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qga25vd25Qcm9wcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoXG4gICAgICBsZXQgY3VycmVudCA9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICBjdXJyZW50ICE9IG51bGw7XG4gICAgICBjdXJyZW50ID0gc3RhY2suc2hpZnQoKVxuICAgICkge1xuICAgICAga25vd25JZmFjZXMuYWRkKGN1cnJlbnQuZnFuKTtcblxuICAgICAgLy8gQWRkIGFueSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBpbnRlcmZhY2UgZGVwZW5kcyBvbiwgdG8gdGhlIGxpc3QuXG4gICAgICBpZiAoY3VycmVudC5pbnRlcmZhY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiBjdXJyZW50LmludGVyZmFjZXMpIHtcbiAgICAgICAgICBpZiAoa25vd25JZmFjZXMuaGFzKGlmYWNlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2gocmVzb2x2ZXIuZGVyZWZlcmVuY2UoaWZhY2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSk7XG4gICAgICAgICAga25vd25JZmFjZXMuYWRkKGlmYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgaW50ZXJmYWNlIHRvIG91ciBsaXN0IG9mIHByb3BlcnRpZXMuXG4gICAgICBpZiAoY3VycmVudC5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGN1cnJlbnQucHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChrbm93blByb3BzLmhhcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlmdGVkUHJvcGVydGllcy5wdXNoKHsgcHJvcCwgZGVmaW5pbmdUeXBlOiBjdXJyZW50IH0pO1xuICAgICAgICAgIGtub3duUHJvcHMuYWRkKHByb3AubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGlmdGVkUHJvcGVydGllcztcbiAgfVxufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5T3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgaXNTdGF0aWM/OiBib29sZWFuO1xuICBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5RW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlUHJvcGVydHkgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1tdXRhYmxlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpzTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZTogc3BlYy5PcHRpb25hbFZhbHVlLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgb3B0czogQmFzZVByb3BlcnR5T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbW11dGFibGUgPSBmYWxzZSwgaXNTdGF0aWMgPSBmYWxzZSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmltbXV0YWJsZSA9IGltbXV0YWJsZTtcbiAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7XG4gICAgdGhpcy5wYXJlbnQgPSBvcHRzLnBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7IGFwaTogJ21lbWJlcicsIGZxbjogdGhpcy5wYXJlbnQuZnFuLCBtZW1iZXJOYW1lOiB0aGlzLmpzTmFtZSB9O1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlUHJvcGVydHlFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcbiAgICBjb25zdCBweXRob25UeXBlID0gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgaXMgbmVlZGVkIGJlY2F1c2UgbXlweSBjYW5ub3QgY2hlY2sgZGVjb3JhdGVkIHRoaW5nc1xuICAgIGNvZGUubGluZShgQCR7dGhpcy5kZWNvcmF0b3J9ICMgdHlwZTogaWdub3JlW21pc2NdYCk7XG4gICAgY29kZS5saW5lKGBAanNpaS5tZW1iZXIoanNpaV9uYW1lPVwiJHt0aGlzLmpzTmFtZX1cIilgKTtcbiAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgY29kZS5saW5lKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgfVxuICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICBjb2RlLFxuICAgICAgJ2RlZicsXG4gICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICBbdGhpcy5pbXBsaWNpdFBhcmFtZXRlcl0sXG4gICAgICB0cnVlLFxuICAgICAgcHl0aG9uVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgcHJvcC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICh0aGlzLnNob3VsZEVtaXRCb2R5IHx8IGZvcmNlRW1pdEJvZHkpICYmXG4gICAgICAoIXJlbmRlckFic3RyYWN0IHx8ICF0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIGpzaWkuJHt0aGlzLmpzaWlHZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIikpYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfVxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKCF0aGlzLmltbXV0YWJsZSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBAJHt0aGlzLnB5dGhvbk5hbWV9LnNldHRlciR7XG4gICAgICAgICAgdGhpcy5pc1N0YXRpYyA/ICcgIyB0eXBlOiBpZ25vcmVbbm8tcmVkZWZdJyA6ICcnXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICAgIGNvZGUubGluZSgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgICAgfVxuICAgICAgb3BlblNpZ25hdHVyZShcbiAgICAgICAgY29kZSxcbiAgICAgICAgJ2RlZicsXG4gICAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgICAgW3RoaXMuaW1wbGljaXRQYXJhbWV0ZXIsIGB2YWx1ZTogJHtweXRob25UeXBlfWBdLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgJ05vbmUnLFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuc2hvdWxkRW1pdEJvZHkgfHwgZm9yY2VFbWl0Qm9keSkgJiZcbiAgICAgICAgKCFyZW5kZXJBYnN0cmFjdCB8fCAhdGhpcy5hYnN0cmFjdClcbiAgICAgICkge1xuICAgICAgICBjb2RlLmxpbmUoXG4gICAgICAgICAgYGpzaWkuJHt0aGlzLmpzaWlTZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIiwgdmFsdWUpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgICB9XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgSW50ZXJmYWNlIGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmludGVyZmFjZSgnLCBbYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgXSwgJyknKTtcblxuICAgIC8vIEZpcnN0IHdlIGRvIG91ciBub3JtYWwgY2xhc3MgbG9naWMgZm9yIGVtaXR0aW5nIG91ciBtZW1iZXJzLlxuICAgIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIC8vIFRoZW4sIHdlIGhhdmUgdG8gZW1pdCBhIFByb3h5IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgb3VyIHByb3h5IGludGVyZmFjZS5cbiAgICBjb25zdCBwcm94eUJhc2VzOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKFxuICAgICAgKGIpID0+XG4gICAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBiZWNhdXNlIE15UHkgY2Fubm90IGNoZWNrIGR5bmFtaWMgYmFzZSBjbGFzc2VzIChuYXR1cmFsbHkpXG4gICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7XG4gICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG4gICAgY29kZS5saW5lKGBfX2pzaWlfdHlwZV9fOiB0eXBpbmcuQ2xhc3NWYXJbc3RyXSA9IFwiJHt0aGlzLmZxbn1cImApO1xuXG4gICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLm1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VwYXJhdGVNZW1iZXJzKSB7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCwgeyBmb3JjZUVtaXRCb2R5OiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAnIyBBZGRpbmcgYSBcIl9fanNpaV9wcm94eV9jbGFzc19fKCk6IHR5cGluZy5UeXBlXCIgZnVuY3Rpb24gdG8gdGhlIGludGVyZmFjZScsXG4gICAgKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG5cbiAgICBwYXJhbXMucHVzaCgndHlwaW5nX2V4dGVuc2lvbnMuUHJvdG9jb2wnKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBJbnRlcmZhY2VNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnaW52b2tlJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmNsYXNzIEludGVyZmFjZVByb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2J1aWx0aW5zLnByb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kOiBzdHJpbmcgPSAnZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgU3RydWN0IGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHByb3RlY3RlZCBkaXJlY3RNZW1iZXJzID0gbmV3IEFycmF5PFN0cnVjdEZpZWxkPigpO1xuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZCB7XG4gICAgaWYgKCEobWVtYmVyIGluc3RhbmNlb2YgU3RydWN0RmllbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYWRkIFN0cnVjdEZpZWxkIHRvIFN0cnVjdCcpO1xuICAgIH1cbiAgICB0aGlzLmRpcmVjdE1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBjb25zdCBiYXNlSW50ZXJmYWNlcyA9IHRoaXMuZ2V0Q2xhc3NQYXJhbXMoY29udGV4dCk7XG5cbiAgICBjb2RlLmluZGVudCgnQGpzaWkuZGF0YV90eXBlKCcpO1xuICAgIGNvZGUubGluZShganNpaV90eXBlPSR7SlNPTi5zdHJpbmdpZnkodGhpcy5mcW4pfSxgKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnanNpaV9zdHJ1Y3RfYmFzZXM9WycsIGJhc2VJbnRlcmZhY2VzLCAnXSwnKTtcbiAgICBhc3NpZ25EaWN0aW9uYXJ5KGNvZGUsICduYW1lX21hcHBpbmcnLCB0aGlzLnByb3BlcnR5TWFwKCksICcsJywgdHJ1ZSk7XG4gICAgY29kZS51bmluZGVudCgnKScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBiYXNlSW50ZXJmYWNlcyk7XG4gICAgdGhpcy5lbWl0Q29uc3RydWN0b3IoY29kZSwgY29udGV4dCk7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgdGhpcy5lbWl0R2V0dGVyKG1lbWJlciwgY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0TWFnaWNNZXRob2RzKGNvZGUpO1xuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMuYWxsTWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCBmaWVsZHMgKGluaGVyaXRlZCBhcyB3ZWxsKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYWxsTWVtYmVycygpOiBTdHJ1Y3RGaWVsZFtdIHtcbiAgICByZXR1cm4gdGhpcy50aGlzSW50ZXJmYWNlLmFsbFByb3BlcnRpZXMubWFwKFxuICAgICAgKHgpID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgeC5zcGVjLCB4LmRlZmluaW5nVHlwZS5zcGVjKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdGhpc0ludGVyZmFjZSgpIHtcbiAgICBpZiAodGhpcy5mcW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGUU4gbm90IHNldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbS5maW5kSW50ZXJmYWNlKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5hbGxNZW1iZXJzO1xuXG4gICAgY29uc3Qga3dhcmdzID0gbWVtYmVycy5tYXAoKG0pID0+IG0uY29uc3RydWN0b3JEZWNsKGNvbnRleHQpKTtcblxuICAgIGNvbnN0IGltcGxpY2l0UGFyYW1ldGVyID0gc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgJ3NlbGYnLFxuICAgICAgbWVtYmVycy5tYXAoKG0pID0+IG0ucHl0aG9uTmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RvckFyZ3VtZW50cyA9XG4gICAgICBrd2FyZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IFtpbXBsaWNpdFBhcmFtZXRlciwgJyonLCAuLi5rd2FyZ3NdXG4gICAgICAgIDogW2ltcGxpY2l0UGFyYW1ldGVyXTtcblxuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsICdfX2luaXRfXycsIGNvbnN0cnVjdG9yQXJndW1lbnRzLCBmYWxzZSwgJ05vbmUnKTtcbiAgICB0aGlzLmVtaXRDb25zdHJ1Y3RvckRvY3N0cmluZyhjb2RlKTtcblxuICAgIC8vIFJlLXR5cGUgc3RydWN0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIFwiZGljdFwiXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0uaXNTdHJ1Y3QodGhpcy5nZW5lcmF0b3IpKSkge1xuICAgICAgLy8gTm90ZSB0aGF0IFwiTm9uZVwiIGlzIE5PVCBhbiBpbnN0YW5jZSBvZiBkaWN0ICh0aGF0J3MgY29udmVuaWVudCEpXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobWVtYmVyLnR5cGUudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29kZS5vcGVuQmxvY2soYGlmIGlzaW5zdGFuY2UoJHttZW1iZXIucHl0aG9uTmFtZX0sIGRpY3QpYCk7XG4gICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyLnB5dGhvbk5hbWV9ID0gJHt0eXBlTmFtZX0oKioke21lbWJlci5weXRob25OYW1lfSlgKTtcbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmVkIHByb3BlcnRpZXMsIHRob3NlIHdpbGwgYWx3YXlzIGJlIHB1dCBpbnRvIHRoZSBkaWN0XG4gICAgYXNzaWduRGljdGlvbmFyeShcbiAgICAgIGNvZGUsXG4gICAgICBgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX3ZhbHVlczogdHlwaW5nLkRpY3Rbc3RyLCB0eXBpbmcuQW55XWAsXG4gICAgICBtZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICFtLm9wdGlvbmFsKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChtZW1iZXIpID0+XG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke21lbWJlci5weXRob25OYW1lfWAsXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIE9wdGlvbmFsIHByb3BlcnRpZXMsIHdpbGwgb25seSBiZSBwdXQgaW50byB0aGUgZGljdCBpZiB0aGV5J3JlIG5vdCBOb25lXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0ub3B0aW9uYWwpKSB7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgaWYgJHttZW1iZXIucHl0aG9uTmFtZX0gaXMgbm90IE5vbmVgKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll92YWx1ZXNbXCIke21lbWJlci5weXRob25OYW1lfVwiXSA9ICR7bWVtYmVyLnB5dGhvbk5hbWV9YCxcbiAgICAgICk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yRG9jc3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvbnN0IGFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLmFsbE1lbWJlcnMubWFwKChtKSA9PiAoe1xuICAgICAgbmFtZTogbS5weXRob25OYW1lLFxuICAgICAgZG9jczogbS5kb2NzLFxuICAgICAgZGVmaW5pbmdUeXBlOiB0aGlzLnNwZWMsXG4gICAgfSkpO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgY2xhc3MtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEdldHRlcihcbiAgICBtZW1iZXI6IFN0cnVjdEZpZWxkLFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgKSB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9IG1lbWJlci50eXBlQW5ub3RhdGlvbihjb250ZXh0KTtcblxuICAgIGNvZGUubGluZSgnQGJ1aWx0aW5zLnByb3BlcnR5Jyk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnZGVmJywgbWVtYmVyLnB5dGhvbk5hbWUsIFsnc2VsZiddLCB0cnVlLCBweXRob25UeXBlKTtcbiAgICBtZW1iZXIuZW1pdERvY1N0cmluZyhjb2RlKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgcmVzdWx0ID0gc2VsZi5fdmFsdWVzLmdldCgke0pTT04uc3RyaW5naWZ5KG1lbWJlci5weXRob25OYW1lKX0pYCxcbiAgICApO1xuICAgIGlmICghbWVtYmVyLm9wdGlvbmFsKSB7XG4gICAgICAvLyBBZGQgYW4gYXNzZXJ0aW9uIHRvIG1heWUgTXlQWSBoYXBweSFcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYGFzc2VydCByZXN1bHQgaXMgbm90IE5vbmUsIFwiUmVxdWlyZWQgcHJvcGVydHkgJyR7bWVtYmVyLnB5dGhvbk5hbWV9JyBpcyBtaXNzaW5nXCJgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29kZS5saW5lKGByZXR1cm4gdHlwaW5nLmNhc3QoJHtweXRob25UeXBlfSwgcmVzdWx0KWApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TWFnaWNNZXRob2RzKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19lcV9fKHNlbGYsIHJoczogdHlwaW5nLkFueSkgLT4gYnVpbHRpbnMuYm9vbCcpO1xuICAgIGNvZGUubGluZShcbiAgICAgICdyZXR1cm4gaXNpbnN0YW5jZShyaHMsIHNlbGYuX19jbGFzc19fKSBhbmQgcmhzLl92YWx1ZXMgPT0gc2VsZi5fdmFsdWVzJyxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ2RlZiBfX25lX18oc2VsZiwgcmhzOiB0eXBpbmcuQW55KSAtPiBidWlsdGlucy5ib29sJyk7XG4gICAgY29kZS5saW5lKCdyZXR1cm4gbm90IChyaHMgPT0gc2VsZiknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19yZXByX18oc2VsZikgLT4gc3RyJyk7XG4gICAgY29kZS5pbmRlbnQoYHJldHVybiBcIiR7dGhpcy5weXRob25OYW1lfSglcylcIiAlIFwiLCBcIi5qb2luKGApO1xuICAgIGNvZGUubGluZSgnayArIFwiPVwiICsgcmVwcih2KSBmb3IgaywgdiBpbiBzZWxmLl92YWx1ZXMuaXRlbXMoKScpO1xuICAgIGNvZGUudW5pbmRlbnQoJyknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlNYXAoKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIHJldC5wdXNoKFxuICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIG1lbWJlci5qc2lpTmFtZSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuXG5jbGFzcyBTdHJ1Y3RGaWVsZCBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkganNpaU5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRvY3M/OiBzcGVjLkRvY3M7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBzcGVjLk9wdGlvbmFsVmFsdWU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWZpbmluZ1R5cGU6IHNwZWMuVHlwZSxcbiAgKSB7XG4gICAgdGhpcy5weXRob25OYW1lID0gdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcbiAgICB0aGlzLmpzaWlOYW1lID0gcHJvcC5uYW1lO1xuICAgIHRoaXMudHlwZSA9IHByb3A7XG4gICAgdGhpcy5kb2NzID0gcHJvcC5kb2NzO1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IHRoaXMuZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IHRoaXMuanNpaU5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3B0aW9uYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlLm9wdGlvbmFsO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGlzU3RydWN0KGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU3RydWN0KGdlbmVyYXRvci5yZWZsZWN0QXNzZW1ibHkuc3lzdGVtLCB0aGlzLnR5cGUudHlwZSk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3JEZWNsKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3Qgb3B0ID0gdGhpcy5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuICAgIHJldHVybiBgJHt0aGlzLnB5dGhvbk5hbWV9OiAke3RoaXMudHlwZUFubm90YXRpb24oe1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgfSl9JHtvcHR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFB5dGhvbiB0eXBlIGFubm90YXRpb24gZm9yIHRoaXMgdHlwZVxuICAgKi9cbiAgcHVibGljIHR5cGVBbm5vdGF0aW9uKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIHRvVHlwZU5hbWUodGhpcy50eXBlKS5weXRob25UeXBlKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXREb2NTdHJpbmcoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBwcm9wLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlQW5ub3RhdGlvbihjb250ZXh0KTtcbiAgICBjb2RlLmxpbmUoYCR7dGhpcy5weXRob25OYW1lfTogJHtyZXNvbHZlZFR5cGV9YCk7XG4gICAgdGhpcy5lbWl0RG9jU3RyaW5nKGNvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBDbGFzc09wdHMgZXh0ZW5kcyBQeXRob25UeXBlT3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW50ZXJmYWNlcz86IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG4gIGFic3RyYWN0QmFzZXM/OiBzcGVjLkNsYXNzVHlwZVtdO1xufVxuXG5jbGFzcyBDbGFzcyBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUgaW1wbGVtZW50cyBJU29ydGFibGVUeXBlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdEJhc2VzOiBzcGVjLkNsYXNzVHlwZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVyZmFjZXM6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzcGVjOiBzcGVjLlR5cGUsXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgb3B0czogQ2xhc3NPcHRzLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgc3VwZXIoZ2VuZXJhdG9yLCBuYW1lLCBzcGVjLCBmcW4sIG9wdHMsIGRvY3MpO1xuXG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbnRlcmZhY2VzID0gW10sIGFic3RyYWN0QmFzZXMgPSBbXSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzO1xuICAgIHRoaXMuYWJzdHJhY3RCYXNlcyA9IGFic3RyYWN0QmFzZXM7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQeXRob25UeXBlW10ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogUHl0aG9uVHlwZVtdID0gc3VwZXIuZGVwZW5kc09uKHJlc29sdmVyKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBpZmFjZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgbW9kdWxlIGF0IHRoZSBzYW1lIGxldmVsIG9mXG4gICAgLy8gbmVzdGluZy5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBpZmFjZSBvZiB0aGlzLmludGVyZmFjZXMpIHtcbiAgICAgIGlmIChyZXNvbHZlci5pc0luTW9kdWxlKGlmYWNlKSkge1xuICAgICAgICAvLyBHaXZlbiBhIGlmYWNlLCB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgaWZhY2VzJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWVcbiAgICAgICAgLy8gYXMgb3VyIHBhcmVudCwgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF0IHRoZVxuICAgICAgICAvLyBzYW1lIGxldmVsIG9mIG91ciBvd24uXG4gICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAvLyAgICAgICBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGxldCBpZmFjZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGlmYWNlKTtcbiAgICAgICAgbGV0IGlmYWNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGlmYWNlKTtcbiAgICAgICAgd2hpbGUgKGlmYWNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICBpZmFjZUl0ZW0gPSBpZmFjZVBhcmVudDtcbiAgICAgICAgICBpZmFjZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChpZmFjZUl0ZW0uZnFuISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlZW4uaGFzKGlmYWNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGlmYWNlSXRlbSk7XG4gICAgICAgICAgc2Vlbi5hZGQoaWZhY2VJdGVtLmZxbiEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgc3VwZXIucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLCAvLyBUYWtlcyBjYXJlIG9mIGJhc2UgJiBtZW1iZXJzXG4gICAgICAuLi50aGlzLmludGVyZmFjZXMubWFwKChiYXNlKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKGJhc2UpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICAvLyBGaXJzdCB3ZSBlbWl0IG91ciBpbXBsbWVudHMgZGVjb3JhdG9yXG4gICAgaWYgKHRoaXMuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzOiBzdHJpbmdbXSA9IHRoaXMuaW50ZXJmYWNlcy5tYXAoKGIpID0+XG4gICAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICAgICk7XG4gICAgICBjb2RlLmxpbmUoYEBqc2lpLmltcGxlbWVudHMoJHtpbnRlcmZhY2VzLmpvaW4oJywgJyl9KWApO1xuICAgIH1cblxuICAgIC8vIFRoZW4gd2UgZG8gb3VyIG5vcm1hbCBjbGFzcyBsb2dpYyBmb3IgZW1pdHRpbmcgb3VyIG1lbWJlcnMuXG4gICAgc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcblxuICAgIC8vIFRoZW4sIGlmIG91ciBjbGFzcyBpcyBBYnN0cmFjdCwgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIGFuZCByZWRvIGFsbCBvZlxuICAgIC8vIHRoaXMgbG9naWMsIGV4Y2VwdCBvbmx5IGVtaXRpbmcgYWJzdHJhY3QgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcyBub25cbiAgICAvLyBhYnN0cmFjdCwgYW5kIHN1YmNsYXNzaW5nIG91ciBpbml0aWFsIGNsYXNzLlxuICAgIGlmICh0aGlzLmFic3RyYWN0KSB7XG4gICAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG5cbiAgICAgIGNvbnN0IHByb3h5QmFzZXMgPSBbdGhpcy5weXRob25OYW1lXTtcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiB0aGlzLmFic3RyYWN0QmFzZXMpIHtcbiAgICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGJlY2F1c2UgTXlQeSBjYW5ub3QgY2hlY2sgZHluYW1pYyBiYXNlIGNsYXNzZXMgKG5hdHVyYWxseSlcbiAgICAgICAgcHJveHlCYXNlcy5wdXNoKFxuICAgICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYmFzZSkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcblxuICAgICAgLy8gRmlsdGVyIG91ciBsaXN0IG9mIG1lbWJlcnMgdG8gKm9ubHkqIGJlIGFic3RyYWN0IG1lbWJlcnMsIGFuZCBub3QgYW55XG4gICAgICAvLyBvdGhlciB0eXBlcy5cbiAgICAgIGNvbnN0IGFic3RyYWN0TWVtYmVycyA9IHRoaXMubWVtYmVycy5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIChtIGluc3RhbmNlb2YgQmFzZU1ldGhvZCB8fCBtIGluc3RhbmNlb2YgQmFzZVByb3BlcnR5KSAmJiBtLmFic3RyYWN0LFxuICAgICAgKTtcbiAgICAgIGlmIChhYnN0cmFjdE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhYnN0cmFjdE1lbWJlcnMpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZXBhcmF0ZU1lbWJlcnMpIHtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQsIHsgcmVuZGVyQWJzdHJhY3Q6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICAgIH1cblxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgQWRkaW5nIGEgXCJfX2pzaWlfcHJveHlfY2xhc3NfXygpOiB0eXBpbmcuVHlwZVwiIGZ1bmN0aW9uIHRvIHRoZSBhYnN0cmFjdCBjbGFzcycsXG4gICAgICApO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG4gICAgY29uc3QgbWV0YWNsYXNzOiBzdHJpbmcgPSB0aGlzLmFic3RyYWN0ID8gJ0pTSUlBYnN0cmFjdENsYXNzJyA6ICdKU0lJTWV0YSc7XG5cbiAgICBwYXJhbXMucHVzaChgbWV0YWNsYXNzPWpzaWkuJHttZXRhY2xhc3N9YCk7XG4gICAgcGFyYW1zLnB1c2goYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBTdGF0aWNNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcj86IHN0cmluZyA9ICdidWlsdGlucy5jbGFzc21ldGhvZCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ2Nscyc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnc2ludm9rZSc7XG59XG5cbmNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2NyZWF0ZSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmV0dXJuRnJvbUpTSUlNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2ludm9rZSc7XG59XG5cbmNsYXNzIEFzeW5jTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2FpbnZva2UnO1xufVxuXG5jbGFzcyBTdGF0aWNQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdqc2lpLnB5dGhvbi5jbGFzc3Byb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnY2xzJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdzZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzc2V0Jztcbn1cblxuY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBCYXNlUHJvcGVydHkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmcgPSAnYnVpbHRpbnMucHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NldCc7XG59XG5cbmNsYXNzIEVudW0gZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcGFyYXRlTWVtYmVycyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmVudW0oJywgW2Bqc2lpX3R5cGU9XCIke3RoaXMuZnFufVwiYF0sICcpJyk7XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoX2NvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2VudW0uRW51bSddO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cbn1cblxuY2xhc3MgRW51bU1lbWJlciBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsdWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5weXRob25OYW1lID0gcHl0aG9uTmFtZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4geyBhcGk6ICdtZW1iZXInLCBmcW46IHRoaXMucGFyZW50LmZxbiwgbWVtYmVyTmFtZTogdGhpcy52YWx1ZSB9O1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbk1vZHVsZXMoKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8c3RyaW5nPigpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBfY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb2RlLmxpbmUoYCR7dGhpcy5weXRob25OYW1lfSA9IFwiJHt0aGlzLnZhbHVlfVwiYCk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBlbnVtLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKF9jb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgTW9kdWxlT3B0cyB7XG4gIHJlYWRvbmx5IGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5O1xuICByZWFkb25seSBhc3NlbWJseUZpbGVuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvYWRBc3NlbWJseT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBhY2thZ2U/OiBQYWNrYWdlO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jc3RyaW5nIHRvIGVtaXQgYXQgdGhlIHRvcCBvZiB0aGlzIG1vZHVsZSwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlRG9jdW1lbnRhdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQeXRob24gbW9kdWxlXG4gKlxuICogV2lsbCBiZSBjYWxsZWQgZm9yIGpzaWkgc3VibW9kdWxlcyBhbmQgbmFtZXNwYWNlcy5cbiAqL1xuY2xhc3MgUHl0aG9uTW9kdWxlIGltcGxlbWVudHMgUHl0aG9uVHlwZSB7XG4gIC8qKlxuICAgKiBDb252ZXJ0ZWQgdG8gcHV0IG9uIHRoZSBtb2R1bGVcbiAgICpcbiAgICogVGhlIGZvcm1hdCBpcyBpbiBtYXJrZG93biwgd2l0aCBjb2RlIHNhbXBsZXMgY29udmVydGVkIGZyb20gVFMgdG8gUHl0aG9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZHVsZURvY3VtZW50YXRpb24/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseTogc3BlYy5Bc3NlbWJseTtcbiAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseUZpbGVuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEFzc2VtYmx5OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbWJlcnMgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXMgPSBuZXcgQXJyYXk8UHl0aG9uTW9kdWxlPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBmcW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiBNb2R1bGVPcHRzLFxuICApIHtcbiAgICB0aGlzLmFzc2VtYmx5ID0gb3B0cy5hc3NlbWJseTtcbiAgICB0aGlzLmFzc2VtYmx5RmlsZW5hbWUgPSBvcHRzLmFzc2VtYmx5RmlsZW5hbWU7XG4gICAgdGhpcy5sb2FkQXNzZW1ibHkgPSAhIW9wdHMubG9hZEFzc2VtYmx5O1xuICAgIHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbiA9IG9wdHMubW9kdWxlRG9jdW1lbnRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKSB7XG4gICAgdGhpcy5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQeXRob25Nb2R1bGUocHlNb2Q6IFB5dGhvbk1vZHVsZSkge1xuICAgIGFzc2VydChcbiAgICAgICF0aGlzLmxvYWRBc3NlbWJseSxcbiAgICAgICdQeXRob25Nb2R1bGUuYWRkUHl0aG9uTW9kdWxlIENBTk5PVCBiZSBjYWxsZWQgb24gYXNzZW1ibHktbG9hZGluZyBtb2R1bGVzIChpdCB3b3VsZCBjYXVzZSBhIGxvYWQgY3ljbGUpIScsXG4gICAgKTtcbiAgICB0aGlzLm1vZHVsZXMucHVzaChweU1vZCk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICB0aGlzLmVtaXRNb2R1bGVEb2N1bWVudGF0aW9uKGNvZGUpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmZxblxuICAgICAgPyBjb250ZXh0LnJlc29sdmVyLmJpbmQodGhpcy5mcW4sIHRoaXMucHl0aG9uTmFtZSlcbiAgICAgIDogY29udGV4dC5yZXNvbHZlcjtcbiAgICBjb250ZXh0ID0ge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHN1Ym1vZHVsZTogdGhpcy5mcW4gPz8gY29udGV4dC5zdWJtb2R1bGUsXG4gICAgICByZXNvbHZlcixcbiAgICB9O1xuXG4gICAgLy8gQmVmb3JlIHdlIHdyaXRlIGFueXRoaW5nIGVsc2UsIHdlIG5lZWQgdG8gd3JpdGUgb3V0IG91ciBtb2R1bGUgaGVhZGVycywgdGhpc1xuICAgIC8vIGlzIHdoZXJlIHdlIGhhbmRsZSBzdHVmZiBsaWtlIGltcG9ydHMsIGFueSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiwgZXRjLlxuICAgIGNvZGUubGluZSgnaW1wb3J0IGFiYycpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGJ1aWx0aW5zJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgZGF0ZXRpbWUnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBlbnVtJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQganNpaScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHB1YmxpY2F0aW9uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nX2V4dGVuc2lvbnMnKTtcblxuICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIG91dCB0aGUga2VybmVsIGxvYWQgbGluZS5cbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIHRoaXMuZW1pdERlcGVuZGVuY3lJbXBvcnRzKGNvZGUpO1xuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGVtaXRMaXN0KFxuICAgICAgICBjb2RlLFxuICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgIFtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgJ19fbmFtZV9fWzA6LTZdJyxcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgIF0sXG4gICAgICAgICcpJyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gd2UgbXVzdCBpbXBvcnQgdGhlIC5fanNpaSBzdWJwYWNrYWdlLlxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBsZXQgZGlzdGFuY2VGcm9tUm9vdCA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgY3VyciA9IHRoaXMuZnFuITtcbiAgICAgICAgY3VyciAhPT0gdGhpcy5hc3NlbWJseS5uYW1lO1xuICAgICAgICBjdXJyID0gY3Vyci5zdWJzdHJpbmcoMCwgY3Vyci5sYXN0SW5kZXhPZignLicpKVxuICAgICAgKSB7XG4gICAgICAgIGRpc3RhbmNlRnJvbVJvb3QrKztcbiAgICAgIH1cbiAgICAgIGNvZGUubGluZShgZnJvbSAkeycuJy5yZXBlYXQoZGlzdGFuY2VGcm9tUm9vdCArIDEpfV9qc2lpIGltcG9ydCAqYCk7XG5cbiAgICAgIHRoaXMuZW1pdFJlcXVpcmVkSW1wb3J0cyhjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGFsbCBvZiBvdXIgbWVtYmVycy5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIG5hbWVzIHdlJ3ZlIGV4cG9ydGVkLCB3ZSdsbCB3cml0ZSBvdXQgb3VyIF9fYWxsX18gdGhhdCBsaXN0cyB0aGVtLlxuICAgIGNvbnN0IGV4cG9ydGVkTWVtYmVycyA9IHRoaXMubWVtYmVycy5tYXAoKG0pID0+IGBcIiR7bS5weXRob25OYW1lfVwiYCk7XG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICBleHBvcnRlZE1lbWJlcnMucHVzaCgnXCJfX2pzaWlfYXNzZW1ibHlfX1wiJyk7XG4gICAgfVxuXG4gICAgLy8gRGVjbGFyZSB0aGUgbGlzdCBvZiBcInB1YmxpY1wiIG1lbWJlcnMgdGhpcyBtb2R1bGUgZXhwb3J0c1xuICAgIGlmICh0aGlzLm1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgfVxuICAgIGNvZGUubGluZSgpO1xuXG4gICAgaWYgKGV4cG9ydGVkTWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmluZGVudCgnX19hbGxfXyA9IFsnKTtcbiAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIGV4cG9ydGVkTWVtYmVycy5zb3J0KCkpIHtcbiAgICAgICAgLy8gV3JpdGluZyBvbmUgYnkgbGluZSBtaWdodCBiZSBfYSBsb3RfIG9mIGxpbmVzLCBidXQgaXQnbGwgbWFrZSByZXZpZXdpbmcgY2hhbmdlcyB0byB0aGUgbGlzdCBlYXNpZXIuIFRydXN0IG1lLlxuICAgICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyfSxgKTtcbiAgICAgIH1cbiAgICAgIGNvZGUudW5pbmRlbnQoJ10nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKCdfX2FsbF9fOiB0eXBpbmcuTGlzdFt0eXBpbmcuQW55XSA9IFtdJyk7XG4gICAgfVxuXG4gICAgLy8gTmV4dCB1cCwgd2UnbGwgdXNlIHB1YmxpY2F0aW9uIHRvIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGUgbm9uLXB1YmxpYyBuYW1lc1xuICAgIC8vIGdldCBoaWRkZW4gZnJvbSBkaXIoKSwgdGFiLWNvbXBsZXRlLCBldGMuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdwdWJsaWNhdGlvbi5wdWJsaXNoKCknKTtcblxuICAgIC8vIEZpbmFsbHksIHdlJ2xsIGxvYWQgYWxsIHJlZ2lzdGVyZWQgcHl0aG9uIG1vZHVsZXNcbiAgICBpZiAodGhpcy5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICAnIyBMb2FkaW5nIG1vZHVsZXMgdG8gZW5zdXJlIHRoZWlyIHR5cGVzIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGpzaWkgcnVudGltZSBsaWJyYXJ5JyxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiB0aGlzLm1vZHVsZXMuc29ydCgobCwgcikgPT5cbiAgICAgICAgbC5weXRob25OYW1lLmxvY2FsZUNvbXBhcmUoci5weXRob25OYW1lKSxcbiAgICAgICkpIHtcbiAgICAgICAgY29kZS5saW5lKGBpbXBvcnQgJHttb2R1bGUucHl0aG9uTmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdCB0aGUgYmluIHNjcmlwdHMgaWYgYmluIHNlY3Rpb24gZGVmaW5lZC5cbiAgICovXG4gIHB1YmxpYyBlbWl0QmluU2NyaXB0cyhjb2RlOiBDb2RlTWFrZXIpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2NyaXB0cyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICBpZiAodGhpcy5hc3NlbWJseS5iaW4gIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS5iaW4pKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0X2ZpbGUgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAnc3JjJyxcbiAgICAgICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKHRoaXMucHl0aG9uTmFtZSksXG4gICAgICAgICAgICAnYmluJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLm9wZW5GaWxlKHNjcmlwdF9maWxlKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJyMhL3Vzci9iaW4vZW52IHB5dGhvbicpO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGNvZGUubGluZSgnaW1wb3J0IGpzaWknKTtcbiAgICAgICAgICBjb2RlLmxpbmUoJ2ltcG9ydCBzeXMnKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBlbWl0TGlzdChcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkubmFtZSksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMucHl0aG9uTmFtZS5yZXBsYWNlKCcuX2pzaWknLCAnJykpLFxuICAgICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJyknLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgZW1pdExpc3QoXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgJ19fanNpaV9hc3NlbWJseV9fLmludm9rZUJpblNjcmlwdCgnLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSxcbiAgICAgICAgICAgICAgJ3N5cy5hcmd2WzE6XScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgJyknLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29kZS5jbG9zZUZpbGUoc2NyaXB0X2ZpbGUpO1xuICAgICAgICAgIHNjcmlwdHMucHVzaChzY3JpcHRfZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIFJFQURNRSBhcyBtb2R1bGUgZG9jc3RyaW5nIGlmIHRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG1vZHVsZSAoaXQgbG9hZHMgdGhlIGFzc2VtYmx5KVxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0TW9kdWxlRG9jdW1lbnRhdGlvbihjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICBpZiAodGhpcy5tb2R1bGVEb2N1bWVudGF0aW9uKSB7XG4gICAgICBjb2RlLmxpbmUoRE9DU1RSSU5HX1FVT1RFUyk7XG4gICAgICBjb2RlLmxpbmUodGhpcy5tb2R1bGVEb2N1bWVudGF0aW9uKTtcbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXREZXBlbmRlbmN5SW1wb3J0cyhjb2RlOiBDb2RlTWFrZXIpIHtcbiAgICAvLyBDb2xsZWN0IGFsbCB0aGUgKGRpcmVjdCkgZGVwZW5kZW5jaWVzJyAuX2pzaWkgcGFja2FnZXMuXG4gICAgY29uc3QgZGVwcyA9IE9iamVjdC5rZXlzKHRoaXMuYXNzZW1ibHkuZGVwZW5kZW5jaWVzID8/IHt9KVxuICAgICAgLm1hcChcbiAgICAgICAgKGRlcCkgPT5cbiAgICAgICAgICB0aGlzLmFzc2VtYmx5LmRlcGVuZGVuY3lDbG9zdXJlPy5bZGVwXT8udGFyZ2V0cz8ucHl0aG9uPy5tb2R1bGUgPz9cbiAgICAgICAgICBkaWUoYE5vIFB5dGhvbiB0YXJnZXQgd2FzIGNvbmZpZ3J1ZWQgZm9yIHRoZSBkZXBlbmRlbmN5IFwiJHtkZXB9XCIuYCksXG4gICAgICApXG4gICAgICAubWFwKChtb2QpID0+IGAke21vZH0uX2pzaWlgKVxuICAgICAgLnNvcnQoKTtcblxuICAgIC8vIE5vdyBhY3R1YWxseSB3cml0ZSB0aGUgaW1wb3J0IHN0YXRlbWVudHMuLi5cbiAgICBpZiAoZGVwcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGZvciAoY29uc3QgbW9kdWxlTmFtZSBvZiBkZXBzKSB7XG4gICAgICAgIGNvZGUubGluZShgaW1wb3J0ICR7bW9kdWxlTmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRSZXF1aXJlZEltcG9ydHMoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnN0IHJlcXVpcmVkSW1wb3J0cyA9IHRoaXMucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSBPYmplY3QuZW50cmllcyhyZXF1aXJlZEltcG9ydHMpXG4gICAgICAubWFwKChbc291cmNlUGFja2FnZSwgaXRlbXNdKSA9PiB0b0ltcG9ydFN0YXRlbWVudHMoc291cmNlUGFja2FnZSwgaXRlbXMpKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGFjYywgZWx0KSA9PiBbLi4uYWNjLCAuLi5lbHRdLFxuICAgICAgICBuZXcgQXJyYXk8eyBlbWl0OiAoKSA9PiB2b2lkOyBjb21wYXJpc29uQmFzZTogc3RyaW5nIH0+KCksXG4gICAgICApXG4gICAgICAuc29ydChpbXBvcnRDb21wYXJhdG9yKTtcblxuICAgIGlmIChzdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgICBzdGF0ZW1lbnQuZW1pdChjb2RlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0ltcG9ydFN0YXRlbWVudHMoXG4gICAgICBzb3VyY2VQa2c6IHN0cmluZyxcbiAgICAgIGl0ZW1zOiBSZWFkb25seVNldDxzdHJpbmc+LFxuICAgICk6IEFycmF5PHsgZW1pdDogKGNvZGU6IENvZGVNYWtlcikgPT4gdm9pZDsgY29tcGFyaXNvbkJhc2U6IHN0cmluZyB9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8e1xuICAgICAgICBlbWl0OiAoY29kZTogQ29kZU1ha2VyKSA9PiB2b2lkO1xuICAgICAgICBjb21wYXJpc29uQmFzZTogc3RyaW5nO1xuICAgICAgfT4oKTtcbiAgICAgIGlmIChpdGVtcy5oYXMoJycpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBjb21wYXJpc29uQmFzZTogYGltcG9ydCAke3NvdXJjZVBrZ31gLFxuICAgICAgICAgIGVtaXQoY29kZSkge1xuICAgICAgICAgICAgY29kZS5saW5lKHRoaXMuY29tcGFyaXNvbkJhc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcGllY2VNZWFsID0gQXJyYXkuZnJvbShpdGVtcylcbiAgICAgICAgLmZpbHRlcigoaSkgPT4gaSAhPT0gJycpXG4gICAgICAgIC5zb3J0KCk7XG4gICAgICBpZiAocGllY2VNZWFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGNvbXBhcmlzb25CYXNlOiBgZnJvbSAke3NvdXJjZVBrZ30gaW1wb3J0YCxcbiAgICAgICAgICBlbWl0OiAoY29kZSkgPT5cbiAgICAgICAgICAgIGVtaXRMaXN0KGNvZGUsIGBmcm9tICR7c291cmNlUGtnfSBpbXBvcnQgYCwgcGllY2VNZWFsLCAnJywge1xuICAgICAgICAgICAgICBpZk11bHRpOiBbJygnLCAnKSddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbXBvcnRDb21wYXJhdG9yKFxuICAgICAgbGVmdDogeyBjb21wYXJpc29uQmFzZTogc3RyaW5nIH0sXG4gICAgICByaWdodDogeyBjb21wYXJpc29uQmFzZTogc3RyaW5nIH0sXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGxlZnQuY29tcGFyaXNvbkJhc2Uuc3RhcnRzV2l0aCgnaW1wb3J0JykgPT09XG4gICAgICAgIHJpZ2h0LmNvbXBhcmlzb25CYXNlLnN0YXJ0c1dpdGgoJ2ltcG9ydCcpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGxlZnQuY29tcGFyaXNvbkJhc2UubG9jYWxlQ29tcGFyZShyaWdodC5jb21wYXJpc29uQmFzZSk7XG4gICAgICB9XG4gICAgICAvLyBXZSB3YW50IFwiZnJvbSAuZm9vIGltcG9ydCAoLi4uKVwiIHRvIGJlICphZnRlciogXCJpbXBvcnQgYmFyXCJcbiAgICAgIHJldHVybiByaWdodC5jb21wYXJpc29uQmFzZS5sb2NhbGVDb21wYXJlKGxlZnQuY29tcGFyaXNvbkJhc2UpO1xuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgUGFja2FnZURhdGEge1xuICBmaWxlbmFtZTogc3RyaW5nO1xuICBkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmNsYXNzIFBhY2thZ2Uge1xuICAvKipcbiAgICogVGhlIFB5dGhvbk1vZHVsZSB0aGF0IHJlcHJlc2VudHMgdGhlIHJvb3QgbW9kdWxlIG9mIHRoZSBwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgcm9vdE1vZHVsZT86IFB5dGhvbk1vZHVsZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IHNwZWMuQXNzZW1ibHk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVzID0gbmV3IE1hcDxzdHJpbmcsIFB5dGhvbk1vZHVsZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhID0gbmV3IE1hcDxzdHJpbmcsIFBhY2thZ2VEYXRhW10+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBtZXRhZGF0YTogc3BlYy5Bc3NlbWJseSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gIH1cblxuICBwdWJsaWMgYWRkTW9kdWxlKG1vZHVsZTogUHl0aG9uTW9kdWxlKSB7XG4gICAgdGhpcy5tb2R1bGVzLnNldChtb2R1bGUucHl0aG9uTmFtZSwgbW9kdWxlKTtcblxuICAgIC8vIFRoaXMgaXMgdGhlIG1vZHVsZSB0aGF0IHJlcHJlc2VudHMgdGhlIGFzc2VtYmx5XG4gICAgaWYgKG1vZHVsZS5mcW4gPT09IHRoaXMubWV0YWRhdGEubmFtZSkge1xuICAgICAgdGhpcy5yb290TW9kdWxlID0gbW9kdWxlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGREYXRhKFxuICAgIG1vZHVsZTogUHl0aG9uTW9kdWxlLFxuICAgIGZpbGVuYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5oYXMobW9kdWxlLnB5dGhvbk5hbWUpKSB7XG4gICAgICB0aGlzLmRhdGEuc2V0KG1vZHVsZS5weXRob25OYW1lLCBbXSk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhLmdldChtb2R1bGUucHl0aG9uTmFtZSkhLnB1c2goeyBmaWxlbmFtZSwgZGF0YSB9KTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZShjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgbW9kdWxlcyA9IFsuLi50aGlzLm1vZHVsZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+XG4gICAgICBhLnB5dGhvbk5hbWUubG9jYWxlQ29tcGFyZShiLnB5dGhvbk5hbWUpLFxuICAgICk7XG5cbiAgICBjb25zdCBzY3JpcHRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgb2Ygb3VyIG1vZHVsZXMsIGFuZCB3cml0ZSB0aGVtIG91dCB0byBkaXNrLlxuICAgIGZvciAoY29uc3QgbW9kIG9mIG1vZHVsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5qb2luKFxuICAgICAgICAnc3JjJyxcbiAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUobW9kLnB5dGhvbk5hbWUpLFxuICAgICAgICAnX19pbml0X18ucHknLFxuICAgICAgKTtcblxuICAgICAgY29kZS5vcGVuRmlsZShmaWxlbmFtZSk7XG4gICAgICBtb2QuZW1pdChjb2RlLCBjb250ZXh0KTtcbiAgICAgIGNvZGUuY2xvc2VGaWxlKGZpbGVuYW1lKTtcblxuICAgICAgc2NyaXB0cy5wdXNoKC4uLm1vZC5lbWl0QmluU2NyaXB0cyhjb2RlKSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG91ciBwYWNrYWdlIGRhdGEuXG4gICAgY29uc3QgcGFja2FnZURhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW21vZCwgcGRhdGFdIG9mIHRoaXMuZGF0YSkge1xuICAgICAgZm9yIChjb25zdCBkYXRhIG9mIHBkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgJ3NyYycsXG4gICAgICAgICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZShtb2QpLFxuICAgICAgICAgICAgZGF0YS5maWxlbmFtZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29kZS5vcGVuRmlsZShmaWxlcGF0aCk7XG4gICAgICAgICAgY29kZS5saW5lKGRhdGEuZGF0YSk7XG4gICAgICAgICAgY29kZS5jbG9zZUZpbGUoZmlsZXBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBhY2thZ2VEYXRhW21vZF0gPSBwZGF0YS5tYXAoKHBkKSA9PiBwZC5maWxlbmFtZSk7XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSBvdXIgbGlzdCBvZiBkZXBlbmRlbmNpZXNcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBbZGVwTmFtZSwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICB0aGlzLm1ldGFkYXRhLmRlcGVuZGVuY2llcyA/PyB7fSxcbiAgICApKSB7XG4gICAgICBjb25zdCBkZXBJbmZvID0gdGhpcy5tZXRhZGF0YS5kZXBlbmRlbmN5Q2xvc3VyZSFbZGVwTmFtZV07XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChcbiAgICAgICAgYCR7ZGVwSW5mby50YXJnZXRzIS5weXRob24hLmRpc3ROYW1lfSR7dG9QeXRob25WZXJzaW9uUmFuZ2UodmVyc2lvbil9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTmVlZCB0byBhbHdheXMgd3JpdGUgdGhpcyBmaWxlIGFzIHRoZSBidWlsZCBwcm9jZXNzIGRlcGVuZHMgb24gaXQuXG4gICAgLy8gTWFrZSB1cCBzb21lIGNvbnRlbnRzIGlmIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdXNlZnVsIHRvIHNheS5cbiAgICBjb2RlLm9wZW5GaWxlKCdSRUFETUUubWQnKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICB0aGlzLnJvb3RNb2R1bGU/Lm1vZHVsZURvY3VtZW50YXRpb24gPz9cbiAgICAgICAgYCR7dGhpcy5uYW1lfVxcbiR7Jz0nLnJlcGVhdCh0aGlzLm5hbWUubGVuZ3RoKX1gLFxuICAgICk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ1JFQURNRS5tZCcpO1xuXG4gICAgLy8gU3RyaXAgXCIgKGJ1aWxkIGFiY2RlZilcIiBmcm9tIHRoZSBqc2lpIHZlcnNpb25cbiAgICBjb25zdCBqc2lpVmVyc2lvblNpbXBsZSA9IHRoaXMubWV0YWRhdGEuanNpaVZlcnNpb24ucmVwbGFjZSgvIC4qJC8sICcnKTtcblxuICAgIGNvbnN0IHNldHVwS3dhcmdzID0ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMubWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICBsaWNlbnNlOiB0aGlzLm1ldGFkYXRhLmxpY2Vuc2UsXG4gICAgICB1cmw6IHRoaXMubWV0YWRhdGEuaG9tZXBhZ2UsXG4gICAgICBsb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZTogJ3RleHQvbWFya2Rvd24nLFxuICAgICAgYXV0aG9yOlxuICAgICAgICB0aGlzLm1ldGFkYXRhLmF1dGhvci5uYW1lICtcbiAgICAgICAgKHRoaXMubWV0YWRhdGEuYXV0aG9yLmVtYWlsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGA8JHt0aGlzLm1ldGFkYXRhLmF1dGhvci5lbWFpbH0+YFxuICAgICAgICAgIDogJycpLFxuICAgICAgYmRpc3Rfd2hlZWw6IHtcbiAgICAgICAgdW5pdmVyc2FsOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHByb2plY3RfdXJsczoge1xuICAgICAgICBTb3VyY2U6IHRoaXMubWV0YWRhdGEucmVwb3NpdG9yeS51cmwsXG4gICAgICB9LFxuICAgICAgcGFja2FnZV9kaXI6IHsgJyc6ICdzcmMnIH0sXG4gICAgICBwYWNrYWdlczogbW9kdWxlcy5tYXAoKG0pID0+IG0ucHl0aG9uTmFtZSksXG4gICAgICBwYWNrYWdlX2RhdGE6IHBhY2thZ2VEYXRhLFxuICAgICAgcHl0aG9uX3JlcXVpcmVzOiAnPj0zLjYnLFxuICAgICAgaW5zdGFsbF9yZXF1aXJlczogW1xuICAgICAgICBganNpaSR7dG9QeXRob25WZXJzaW9uUmFuZ2UoYF4ke2pzaWlWZXJzaW9uU2ltcGxlfWApfWAsXG4gICAgICAgICdwdWJsaWNhdGlvbj49MC4wLjMnLFxuICAgICAgXVxuICAgICAgICAuY29uY2F0KGRlcGVuZGVuY2llcylcbiAgICAgICAgLnNvcnQoKSxcbiAgICAgIGNsYXNzaWZpZXJzOiBbXG4gICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJyxcbiAgICAgICAgJ09wZXJhdGluZyBTeXN0ZW0gOjogT1MgSW5kZXBlbmRlbnQnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogSmF2YVNjcmlwdCcsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMyA6OiBPbmx5JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjYnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNycsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy44JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjknLFxuICAgICAgICAnVHlwaW5nIDo6IFR5cGVkJyxcbiAgICAgIF0sXG4gICAgICBzY3JpcHRzLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMubWV0YWRhdGEuZG9jcz8uc3RhYmlsaXR5KSB7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LkV4cGVyaW1lbnRhbDpcbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaCgnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDQgLSBCZXRhJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5TdGFibGU6XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goXG4gICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuRGVwcmVjYXRlZDpcbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaCgnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDcgLSBJbmFjdGl2ZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBObyAnRGV2ZWxvcG1lbnQgU3RhdHVzJyB0cm92ZSBjbGFzc2lmaWVyIGZvciB5b3UhXG4gICAgfVxuXG4gICAgaWYgKHNwZHhMaWNlbnNlTGlzdFt0aGlzLm1ldGFkYXRhLmxpY2Vuc2VdPy5vc2lBcHByb3ZlZCkge1xuICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaCgnTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhZGRpdGlvbmFsQ2xhc3NpZmllcnMgPSB0aGlzLm1ldGFkYXRhLnRhcmdldHM/LnB5dGhvbj8uY2xhc3NpZmllcnM7XG4gICAgaWYgKGFkZGl0aW9uYWxDbGFzc2lmaWVycyAhPSBudWxsKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWRkaXRpb25hbENsYXNzaWZpZXJzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRoZSBcImpzaWkudGFyZ2V0cy5weXRob24uY2xhc3NpZmllcnNcIiB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgaWYgcHJvdmlkZWQsIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYWRkaXRpb25hbENsYXNzaWZpZXJzLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gV2UgZGlzY291cmFnZSB1c2luZyB0aG9zZSBzaW5jZSB3ZSBhdXRvbWF0aWNhbGx5IHNldCBhIHZhbHVlIGZvciB0aGVtXG4gICAgICBmb3IgKGxldCBjbGFzc2lmaWVyIG9mIGFkZGl0aW9uYWxDbGFzc2lmaWVycy5zb3J0KCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGFzc2lmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUaGUgXCJqc2lpLnRhcmdldHMucHl0aG9uLmNsYXNzaWZpZXJzXCIgdmFsdWUgY2FuIG9ubHkgY29udGFpbiBzdHJpbmdzLCBidXQgZm91bmQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgY2xhc3NpZmllcixcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlJ2xsIHNwbGl0IG9uIGA6OmAgYW5kIHJlLWpvaW4gbGF0ZXIgc28gY2xhc3NpZmllcnMgYXJlIFwibm9ybWFsaXplZFwiIHRvIGEgc3RhbmRhcmQgc3BhY2luZ1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGNsYXNzaWZpZXIuc3BsaXQoJzo6JykubWFwKChwYXJ0KSA9PiBwYXJ0LnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IHJlc2VydmVkQ2xhc3NpZmllcnMgPSBbXG4gICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cycsXG4gICAgICAgICAgJ0xpY2Vuc2UnLFxuICAgICAgICAgICdPcGVyYXRpbmcgU3lzdGVtJyxcbiAgICAgICAgICAnVHlwaW5nJyxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHJlc2VydmVkQ2xhc3NpZmllcnMuaW5jbHVkZXMocGFydHNbMF0pKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIGBDbGFzc2lmaWVycyBzdGFydGluZyB3aXRoICR7cmVzZXJ2ZWRDbGFzc2lmaWVyc1xuICAgICAgICAgICAgICAubWFwKCh4KSA9PiBgXCIke3h9IDo6XCJgKVxuICAgICAgICAgICAgICAuam9pbihcbiAgICAgICAgICAgICAgICAnLCAnLFxuICAgICAgICAgICAgICApfSBhcmUgYXV0b21hdGljYWxseSBzZXQgYW5kIHNob3VsZCBub3QgYmUgbWFudWFsbHkgY29uZmlndXJlZGAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjbGFzc2lmaWVyID0gcGFydHMuam9pbignIDo6ICcpO1xuICAgICAgICBpZiAoc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMuaW5jbHVkZXMoY2xhc3NpZmllcikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKGNsYXNzaWZpZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIE5lZWQgYSBzZXR1cC5weSB0byBtYWtlIHRoaXMgUGFja2FnZSwgYWN0dWFsbHkgYSBQYWNrYWdlLlxuICAgIGNvZGUub3BlbkZpbGUoJ3NldHVwLnB5Jyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQganNvbicpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHNldHVwdG9vbHMnKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoJ2t3YXJncyA9IGpzb24ubG9hZHMoJyk7XG4gICAgY29kZS5saW5lKCcgICAgXCJcIlwiJyk7XG4gICAgY29kZS5saW5lKEpTT04uc3RyaW5naWZ5KHNldHVwS3dhcmdzLCBudWxsLCA0KSk7XG4gICAgY29kZS5saW5lKCdcIlwiXCInKTtcbiAgICBjb2RlLmxpbmUoJyknKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLm9wZW5CbG9jaygnd2l0aCBvcGVuKFwiUkVBRE1FLm1kXCIsIGVuY29kaW5nPVwidXRmOFwiKSBhcyBmcCcpO1xuICAgIGNvZGUubGluZSgna3dhcmdzW1wibG9uZ19kZXNjcmlwdGlvblwiXSA9IGZwLnJlYWQoKScpO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgnc2V0dXB0b29scy5zZXR1cCgqKmt3YXJncyknKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgnc2V0dXAucHknKTtcblxuICAgIC8vIEJlY2F1c2Ugd2UncmUgZ29vZCBjaXRpemVucywgd2UncmUgZ29pbmcgdG8gZ28gYWhlYWQgYW5kIHN1cHBvcnQgcHlwcm9qZWN0LnRvbWxcbiAgICAvLyBhcyB3ZWxsLlxuICAgIC8vIFRPRE86IE1pZ2h0IGJlIGVhc2llciB0byBqdXN0IHVzZSBhIFRPTUwgbGlicmFyeSB0byB3cml0ZSB0aGlzIG91dC5cbiAgICBjb2RlLm9wZW5GaWxlKCdweXByb2plY3QudG9tbCcpO1xuICAgIGNvZGUubGluZSgnW2J1aWxkLXN5c3RlbV0nKTtcbiAgICBjb25zdCBidWlsZFRvb2xzID0gZnNcbiAgICAgIC5yZWFkRmlsZVN5bmMocmVxdWlyZW1lbnRzRmlsZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgobGluZSkgPT4gL15cXHMqKC4rKVxccyojXFxzKmJ1aWxkLXN5c3RlbVxccyokLy5leGVjKGxpbmUpPy5bMV0/LnRyaW0oKSlcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChidWlsZFRvb2xzLCBlbnRyeSkgPT4gKGVudHJ5ID8gWy4uLmJ1aWxkVG9vbHMsIGVudHJ5XSA6IGJ1aWxkVG9vbHMpLFxuICAgICAgICBuZXcgQXJyYXk8c3RyaW5nPigpLFxuICAgICAgKTtcbiAgICBjb2RlLmxpbmUoYHJlcXVpcmVzID0gWyR7YnVpbGRUb29scy5tYXAoKHgpID0+IGBcIiR7eH1cImApLmpvaW4oJywgJyl9XWApO1xuICAgIGNvZGUubGluZSgnYnVpbGQtYmFja2VuZCA9IFwic2V0dXB0b29scy5idWlsZF9tZXRhXCInKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgncHlwcm9qZWN0LnRvbWwnKTtcblxuICAgIC8vIFdlIGFsc28gbmVlZCB0byB3cml0ZSBvdXQgYSBNQU5JRkVTVC5pbiB0byBlbnN1cmUgdGhhdCBhbGwgb2Ygb3VyIHJlcXVpcmVkXG4gICAgLy8gZmlsZXMgYXJlIGluY2x1ZGVkLlxuICAgIGNvZGUub3BlbkZpbGUoJ01BTklGRVNULmluJyk7XG4gICAgY29kZS5saW5lKCdpbmNsdWRlIHB5cHJvamVjdC50b21sJyk7XG4gICAgY29kZS5jbG9zZUZpbGUoJ01BTklGRVNULmluJyk7XG4gIH1cbn1cblxudHlwZSBGaW5kTW9kdWxlQ2FsbGJhY2sgPSAoZnFuOiBzdHJpbmcpID0+IHNwZWMuQXNzZW1ibHlDb25maWd1cmF0aW9uO1xudHlwZSBGaW5kVHlwZUNhbGxiYWNrID0gKGZxbjogc3RyaW5nKSA9PiBzcGVjLlR5cGU7XG5cbmNsYXNzIFR5cGVSZXNvbHZlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHlwZXM6IE1hcDxzdHJpbmcsIFB5dGhvblR5cGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kVG8/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRSZSE6IFJlZ0V4cDtcbiAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVOYW1lPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZVJlITogUmVnRXhwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbmRNb2R1bGU6IEZpbmRNb2R1bGVDYWxsYmFjaztcbiAgcHJpdmF0ZSByZWFkb25seSBmaW5kVHlwZTogRmluZFR5cGVDYWxsYmFjaztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgdHlwZXM6IE1hcDxzdHJpbmcsIFB5dGhvblR5cGU+LFxuICAgIGZpbmRNb2R1bGU6IEZpbmRNb2R1bGVDYWxsYmFjayxcbiAgICBmaW5kVHlwZTogRmluZFR5cGVDYWxsYmFjayxcbiAgICBib3VuZFRvPzogc3RyaW5nLFxuICAgIG1vZHVsZU5hbWU/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMudHlwZXMgPSB0eXBlcztcbiAgICB0aGlzLmZpbmRNb2R1bGUgPSBmaW5kTW9kdWxlO1xuICAgIHRoaXMuZmluZFR5cGUgPSBmaW5kVHlwZTtcbiAgICB0aGlzLm1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lO1xuICAgIHRoaXMuYm91bmRUbyA9IGJvdW5kVG8gIT09IHVuZGVmaW5lZCA/IHRoaXMudG9QeXRob25GUU4oYm91bmRUbykgOiBib3VuZFRvO1xuXG4gICAgaWYgKHRoaXMubW9kdWxlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm1vZHVsZVJlID0gbmV3IFJlZ0V4cChcbiAgICAgICAgYF4oJHtlc2NhcGVTdHJpbmdSZWdleHAodGhpcy5tb2R1bGVOYW1lKX0pXFxcXC4oLispJGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJvdW5kVG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ib3VuZFJlID0gbmV3IFJlZ0V4cChcbiAgICAgICAgYF4oJHtlc2NhcGVTdHJpbmdSZWdleHAodGhpcy5ib3VuZFRvKX0pXFxcXC4oLispJGAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBiaW5kKGZxbjogc3RyaW5nLCBtb2R1bGVOYW1lPzogc3RyaW5nKTogVHlwZVJlc29sdmVyIHtcbiAgICByZXR1cm4gbmV3IFR5cGVSZXNvbHZlcihcbiAgICAgIHRoaXMudHlwZXMsXG4gICAgICB0aGlzLmZpbmRNb2R1bGUsXG4gICAgICB0aGlzLmZpbmRUeXBlLFxuICAgICAgZnFuLFxuICAgICAgbW9kdWxlTmFtZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbW9kdWxlTmFtZS5zdGFydHNXaXRoKCcuJylcbiAgICAgICAgICA/IGAke3RoaXMubW9kdWxlTmFtZX0ke21vZHVsZU5hbWV9YFxuICAgICAgICAgIDogbW9kdWxlTmFtZVxuICAgICAgICA6IHRoaXMubW9kdWxlTmFtZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGlzSW5Nb2R1bGUodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBweXRob25UeXBlID1cbiAgICAgIHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJyA/IHRoaXMudG9QeXRob25GUU4odHlwZVJlZi5mcW4pIDogdHlwZVJlZjtcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVSZS50ZXN0KHB5dGhvblR5cGUpO1xuICB9XG5cbiAgcHVibGljIGlzSW5OYW1lc3BhY2UodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBweXRob25UeXBlID1cbiAgICAgIHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJyA/IHRoaXMudG9QeXRob25GUU4odHlwZVJlZi5mcW4pIDogdHlwZVJlZjtcbiAgICByZXR1cm4gdGhpcy5ib3VuZFJlLnRlc3QocHl0aG9uVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyZW50KHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nKTogUHl0aG9uVHlwZSB7XG4gICAgY29uc3QgZnFuID0gdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdHlwZVJlZi5mcW4gOiB0eXBlUmVmO1xuICAgIGNvbnN0IG1hdGNoZXMgPSAvXiguKylcXC5bXi5dKyQvLmV4ZWMoZnFuKTtcbiAgICBpZiAobWF0Y2hlcyA9PSBudWxsIHx8ICFBcnJheS5pc0FycmF5KG1hdGNoZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgRlFOOiAke2Zxbn1gKTtcbiAgICB9XG4gICAgY29uc3QgWywgcGFyZW50RlFOXSA9IG1hdGNoZXM7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy50eXBlcy5nZXQocGFyZW50RlFOKTtcblxuICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBwYXJlbnQ6ICAke3BhcmVudEZRTn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50O1xuICB9XG5cbiAgcHVibGljIGdldERlZmluaW5nUHl0aG9uTW9kdWxlKFxuICAgIHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlIHwgc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGZxbiA9IHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJyA/IHR5cGVSZWYuZnFuIDogdHlwZVJlZjtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnR5cGVzLmdldChmcW4pO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgbGV0IG1vZCA9IHBhcmVudDtcbiAgICAgIHdoaWxlICghKG1vZCBpbnN0YW5jZW9mIFB5dGhvbk1vZHVsZSkpIHtcbiAgICAgICAgbW9kID0gdGhpcy5nZXRQYXJlbnQobW9kLmZxbiEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1vZC5weXRob25OYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoZXMgPSAvXihbXi5dKylcXC4vLmV4ZWMoZnFuKTtcbiAgICBpZiAobWF0Y2hlcyA9PSBudWxsIHx8ICFBcnJheS5pc0FycmF5KG1hdGNoZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgRlFOOiAke2Zxbn1gKTtcbiAgICB9XG4gICAgY29uc3QgWywgYXNzbV0gPSBtYXRjaGVzO1xuICAgIHJldHVybiB0aGlzLmZpbmRNb2R1bGUoYXNzbSkudGFyZ2V0cyEucHl0aG9uIS5tb2R1bGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHlwZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSk6IFB5dGhvblR5cGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVzLmdldCh0eXBlUmVmLmZxbik7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBsb2NhdGUgdHlwZTogXCIke3R5cGVSZWYuZnFufVwiYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBwdWJsaWMgZGVyZWZlcmVuY2UodHlwZVJlZjogc3RyaW5nIHwgc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UpOiBzcGVjLlR5cGUge1xuICAgIGlmICh0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHR5cGVSZWYgPSB0eXBlUmVmLmZxbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluZFR5cGUodHlwZVJlZik7XG4gIH1cblxuICBwcml2YXRlIHRvUHl0aG9uRlFOKGZxbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBbYXNzZW1ibHlOYW1lLCAuLi5xdWFsaWZpZWRJZGVudGlmaWVyc10gPSBmcW4uc3BsaXQoJy4nKTtcbiAgICBjb25zdCBmcW5QYXJ0czogc3RyaW5nW10gPSBbXG4gICAgICB0aGlzLmZpbmRNb2R1bGUoYXNzZW1ibHlOYW1lKS50YXJnZXRzIS5weXRob24hLm1vZHVsZSxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHF1YWxpZmllZElkZW50aWZpZXJzKSB7XG4gICAgICBmcW5QYXJ0cy5wdXNoKHRvUHl0aG9uSWRlbnRpZmllcihwYXJ0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZxblBhcnRzLmpvaW4oJy4nKTtcbiAgfVxufVxuXG5jbGFzcyBQeXRob25HZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3Ige1xuICBwcml2YXRlIHBhY2thZ2UhOiBQYWNrYWdlO1xuICBwcml2YXRlIHJvb3RNb2R1bGU/OiBQeXRob25Nb2R1bGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHlwZXM6IE1hcDxzdHJpbmcsIFB5dGhvblR5cGU+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvc2V0dGE6IFJvc2V0dGEsXG4gICAgb3B0aW9uczogR2VuZXJhdG9yT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuY29kZS5vcGVuQmxvY2tGb3JtYXR0ZXIgPSAocykgPT4gYCR7c306YDtcbiAgICB0aGlzLmNvZGUuY2xvc2VCbG9ja0Zvcm1hdHRlciA9IChfcykgPT4gZmFsc2U7XG5cbiAgICB0aGlzLnR5cGVzID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgcHVibGljIGVtaXREb2NTdHJpbmcoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGFwaUxvY2F0aW9uOiBBcGlMb2NhdGlvbixcbiAgICBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczoge1xuICAgICAgYXJndW1lbnRzPzogRG9jdW1lbnRhYmxlQXJndW1lbnRbXTtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW0/OiBzdHJpbmc7XG4gICAgICB0cmFpbGluZ05ld0xpbmU/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgaWYgKCghZG9jcyB8fCBPYmplY3Qua2V5cyhkb2NzKS5sZW5ndGggPT09IDApICYmICFvcHRpb25zLmFyZ3VtZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRvY3MpIHtcbiAgICAgIGRvY3MgPSB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAoZG9jcy5zdW1tYXJ5KSB7XG4gICAgICBsaW5lcy5wdXNoKG1kMnJzdChyZW5kZXJTdW1tYXJ5KGRvY3MpKSk7XG4gICAgICBicmsoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnJrKCkge1xuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0udHJpbSgpICE9PSAnJykge1xuICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBibG9jayhoZWFkaW5nOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZG9CcmsgPSB0cnVlKSB7XG4gICAgICBpZiAoZG9CcmspIHtcbiAgICAgICAgYnJrKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb250ZW50TGluZXMgPSBtZDJyc3QoY29udGVudCkuc3BsaXQoJ1xcbicpO1xuICAgICAgaWYgKGNvbnRlbnRMaW5lcy5sZW5ndGggPD0gMSkge1xuICAgICAgICBsaW5lcy5wdXNoKGA6JHtoZWFkaW5nfTogJHtjb250ZW50TGluZXMuam9pbignJyl9YC50cmltKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgOiR7aGVhZGluZ306YCk7XG4gICAgICAgIGJyaygpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudExpbmVzKSB7XG4gICAgICAgICAgbGluZXMucHVzaChsaW5lLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkb0Jyaykge1xuICAgICAgICBicmsoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZG9jcy5yZW1hcmtzKSB7XG4gICAgICBicmsoKTtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIC4uLm1kMnJzdCh0aGlzLmNvbnZlcnRNYXJrZG93bihkb2NzLnJlbWFya3MgPz8gJycsIGFwaUxvY2F0aW9uKSkuc3BsaXQoXG4gICAgICAgICAgJ1xcbicsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXJndW1lbnRzPy5sZW5ndGggPz8gMCA+IDApIHtcbiAgICAgIGJyaygpO1xuICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBvcHRpb25zLmFyZ3VtZW50cyEpIHtcbiAgICAgICAgLy8gQWRkIGEgbGluZSBmb3IgZXZlcnkgYXJndW1lbnQuIEV2ZW4gaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRpb24sIHdlIG5lZWRcbiAgICAgICAgLy8gdGhlIGRvY3N0cmluZyBzbyB0aGF0IHRoZSBTcGhpbnggZXh0ZW5zaW9uIGNhbiBhZGQgdGhlIHR5cGUgYW5ub3RhdGlvbnMuXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYDpwYXJhbSAke3RvUHl0aG9uUGFyYW1ldGVyTmFtZShwYXJhbS5uYW1lKX06ICR7b25lbGluZURlc2NyaXB0aW9uKFxuICAgICAgICAgICAgcGFyYW0uZG9jcyxcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5kZWZhdWx0KSB7XG4gICAgICBibG9jaygnZGVmYXVsdCcsIGRvY3MuZGVmYXVsdCk7XG4gICAgfVxuICAgIGlmIChkb2NzLnJldHVybnMpIHtcbiAgICAgIGJsb2NrKCdyZXR1cm4nLCBkb2NzLnJldHVybnMpO1xuICAgIH1cbiAgICBpZiAoZG9jcy5kZXByZWNhdGVkKSB7XG4gICAgICBibG9jaygnZGVwcmVjYXRlZCcsIGRvY3MuZGVwcmVjYXRlZCk7XG4gICAgfVxuICAgIGlmIChkb2NzLnNlZSkge1xuICAgICAgYmxvY2soJ3NlZScsIGRvY3Muc2VlLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkb2NzLnN0YWJpbGl0eSAmJiBzaG91bGRNZW50aW9uU3RhYmlsaXR5KGRvY3Muc3RhYmlsaXR5KSkge1xuICAgICAgYmxvY2soJ3N0YWJpbGl0eScsIGRvY3Muc3RhYmlsaXR5LCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChkb2NzLnN1YmNsYXNzYWJsZSkge1xuICAgICAgYmxvY2soJ3N1YmNsYXNzYWJsZScsICdZZXMnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhkb2NzLmN1c3RvbSA/PyB7fSkpIHtcbiAgICAgIGJsb2NrKGssIHYsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jcy5leGFtcGxlKSB7XG4gICAgICBicmsoKTtcbiAgICAgIGxpbmVzLnB1c2goJ0V4YW1wbGU6OicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBjb25zdCBleGFtcGxlVGV4dCA9IHRoaXMuY29udmVydEV4YW1wbGUoZG9jcy5leGFtcGxlLCBhcGlMb2NhdGlvbik7XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBleGFtcGxlVGV4dC5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgbGluZXMucHVzaChgICAgICR7bGluZX1gKTtcbiAgICAgIH1cbiAgICAgIGJyaygpO1xuICAgIH1cblxuICAgIHdoaWxlIChsaW5lcy5sZW5ndGggPiAwICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09PSAnJykge1xuICAgICAgbGluZXMucG9wKCk7XG4gICAgfVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvZGUubGluZShgJHtET0NTVFJJTkdfUVVPVEVTfSR7bGluZXNbMF19JHtET0NTVFJJTkdfUVVPVEVTfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoYCR7RE9DU1RSSU5HX1FVT1RFU30ke2xpbmVzWzBdfWApO1xuICAgICAgbGluZXMuc3BsaWNlKDAsIDEpO1xuXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgY29kZS5saW5lKGxpbmUpO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmxpbmUoRE9DU1RSSU5HX1FVT1RFUyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRyYWlsaW5nTmV3TGluZSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbnZlcnRFeGFtcGxlKGV4YW1wbGU6IHN0cmluZywgYXBpTG9jOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMucm9zZXR0YS50cmFuc2xhdGVFeGFtcGxlKFxuICAgICAgYXBpTG9jLFxuICAgICAgZXhhbXBsZSxcbiAgICAgIFRhcmdldExhbmd1YWdlLlBZVEhPTixcbiAgICAgIGVuZm9yY2VzU3RyaWN0TW9kZSh0aGlzLmFzc2VtYmx5KSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByZWZpeERpc2NsYWltZXIodHJhbnNsYXRlZCk7XG4gIH1cblxuICBwdWJsaWMgY29udmVydE1hcmtkb3duKG1hcmtkb3duOiBzdHJpbmcsIGFwaUxvYzogQXBpTG9jYXRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJvc2V0dGEudHJhbnNsYXRlU25pcHBldHNJbk1hcmtkb3duKFxuICAgICAgYXBpTG9jLFxuICAgICAgbWFya2Rvd24sXG4gICAgICBUYXJnZXRMYW5ndWFnZS5QWVRIT04sXG4gICAgICBlbmZvcmNlc1N0cmljdE1vZGUodGhpcy5hc3NlbWJseSksXG4gICAgICAodHJhbnMpID0+ICh7XG4gICAgICAgIGxhbmd1YWdlOiB0cmFucy5sYW5ndWFnZSxcbiAgICAgICAgc291cmNlOiB0aGlzLnByZWZpeERpc2NsYWltZXIodHJhbnMpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlZml4RGlzY2xhaW1lcih0cmFuc2xhdGVkOiBUcmFuc2xhdGlvbikge1xuICAgIGlmICh0cmFuc2xhdGVkLmRpZENvbXBpbGUgJiYgSU5DT01QTEVURV9ESVNDTEFJTUVSX0NPTVBJTElORykge1xuICAgICAgcmV0dXJuIGAjICR7SU5DT01QTEVURV9ESVNDTEFJTUVSX0NPTVBJTElOR31cXG4ke3RyYW5zbGF0ZWQuc291cmNlfWA7XG4gICAgfVxuICAgIGlmICghdHJhbnNsYXRlZC5kaWRDb21waWxlICYmIElOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkcpIHtcbiAgICAgIHJldHVybiBgIyAke0lOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkd9XFxuJHt0cmFuc2xhdGVkLnNvdXJjZX1gO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlZC5zb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHl0aG9uVHlwZShmcW46IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVzLmdldChmcW4pO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIHR5cGU6IFwiJHtmcW59XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBc3NlbWJseU91dHB1dERpcihhc3NtOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihcbiAgICAgICdzcmMnLFxuICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUodGhpcy5nZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbSkpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIF9maW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIHRoaXMucGFja2FnZSA9IG5ldyBQYWNrYWdlKFxuICAgICAgYXNzbS50YXJnZXRzIS5weXRob24hLmRpc3ROYW1lLFxuICAgICAgdG9SZWxlYXNlVmVyc2lvbihhc3NtLnZlcnNpb24sIFRhcmdldE5hbWUuUFlUSE9OKSxcbiAgICAgIGFzc20sXG4gICAgKTtcblxuICAgIC8vIFRoaXMgaXMgdGhlICc8cGFja2FnZW5hbWU+Ll9qc2lpJyBtb2R1bGUgZm9yIHRoaXMgYXNzZW1ibHlcbiAgICBjb25zdCBhc3NlbWJseU1vZHVsZSA9IG5ldyBQeXRob25Nb2R1bGUoXG4gICAgICB0aGlzLmdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtKSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgYXNzZW1ibHk6IGFzc20sXG4gICAgICAgIGFzc2VtYmx5RmlsZW5hbWU6IHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLFxuICAgICAgICBsb2FkQXNzZW1ibHk6IHRydWUsXG4gICAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMucGFja2FnZS5hZGRNb2R1bGUoYXNzZW1ibHlNb2R1bGUpO1xuICAgIHRoaXMucGFja2FnZS5hZGREYXRhKGFzc2VtYmx5TW9kdWxlLCB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVuZEFzc2VtYmx5KGFzc206IHNwZWMuQXNzZW1ibHksIF9maW5nZXJwcmludDogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlc29sdmVyID0gbmV3IFR5cGVSZXNvbHZlcihcbiAgICAgIHRoaXMudHlwZXMsXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZE1vZHVsZShmcW4pLFxuICAgICAgKGZxbjogc3RyaW5nKSA9PiB0aGlzLmZpbmRUeXBlKGZxbiksXG4gICAgKTtcbiAgICB0aGlzLnBhY2thZ2Uud3JpdGUodGhpcy5jb2RlLCB7XG4gICAgICBhc3NlbWJseTogYXNzbSxcbiAgICAgIGVtaXR0ZWRUeXBlczogbmV3IFNldCgpLFxuICAgICAgcmVzb2x2ZXIsXG4gICAgICBzdWJtb2R1bGU6IGFzc20ubmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaWxsIGJlIGNhbGxlZCBmb3IgYXNzZW1ibHkgcm9vdCwgbmFtZXNwYWNlcyBhbmQgc3VibW9kdWxlcyAoYW55dGhpbmcgdGhhdCBjb250YWlucyBvdGhlciB0eXBlcywgYmFzZWQgb24gaXRzIEZRTilcbiAgICovXG4gIHByb3RlY3RlZCBvbkJlZ2luTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICAvLyAnbnMnIGNvbnRhaW5zIHNvbWV0aGluZyBsaWtlICdAc2NvcGUvanNpaS1jYWxjLWJhc2Utb2YtYmFzZSdcbiAgICBjb25zdCBzdWJtb2R1bGVMaWtlID1cbiAgICAgIG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWVcbiAgICAgICAgPyB0aGlzLmFzc2VtYmx5XG4gICAgICAgIDogdGhpcy5hc3NlbWJseS5zdWJtb2R1bGVzPy5bbnNdO1xuXG4gICAgY29uc3QgcmVhZG1lTG9jYXRpb246IEFwaUxvY2F0aW9uID0geyBhcGk6ICdtb2R1bGVSZWFkbWUnLCBtb2R1bGVGcW46IG5zIH07XG5cbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgUHl0aG9uTW9kdWxlKHRvUGFja2FnZU5hbWUobnMsIHRoaXMuYXNzZW1ibHkpLCBucywge1xuICAgICAgYXNzZW1ibHk6IHRoaXMuYXNzZW1ibHksXG4gICAgICBhc3NlbWJseUZpbGVuYW1lOiB0aGlzLmdldEFzc2VtYmx5RmlsZU5hbWUoKSxcbiAgICAgIHBhY2thZ2U6IHRoaXMucGFja2FnZSxcbiAgICAgIG1vZHVsZURvY3VtZW50YXRpb246IHN1Ym1vZHVsZUxpa2U/LnJlYWRtZVxuICAgICAgICA/IHRoaXMuY29udmVydE1hcmtkb3duKFxuICAgICAgICAgICAgc3VibW9kdWxlTGlrZS5yZWFkbWU/Lm1hcmtkb3duLFxuICAgICAgICAgICAgcmVhZG1lTG9jYXRpb24sXG4gICAgICAgICAgKS50cmltKClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2UuYWRkTW9kdWxlKG1vZHVsZSk7XG4gICAgdGhpcy50eXBlcy5zZXQobnMsIG1vZHVsZSk7XG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIC8vIFRoaXMgYXBwbGllcyByZWN1cnNpdmVseSB0byBzdWJtb2R1bGVzLCBzbyBubyBuZWVkIHRvIGR1cGxpY2F0ZSFcbiAgICAgIHRoaXMucGFja2FnZS5hZGREYXRhKG1vZHVsZSwgJ3B5LnR5cGVkJywgJycpO1xuICAgIH1cblxuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSEuYWRkUHl0aG9uTW9kdWxlKG1vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kTmFtZXNwYWNlKG5zOiBzdHJpbmcpIHtcbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgZGVsZXRlIHRoaXMucm9vdE1vZHVsZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkNsYXNzKGNsczogc3BlYy5DbGFzc1R5cGUsIGFic3RyYWN0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2xhc3MgPSBuZXcgQ2xhc3MoXG4gICAgICB0aGlzLFxuICAgICAgdG9QeXRob25JZGVudGlmaWVyKGNscy5uYW1lKSxcbiAgICAgIGNscyxcbiAgICAgIGNscy5mcW4sXG4gICAgICB7XG4gICAgICAgIGFic3RyYWN0LFxuICAgICAgICBiYXNlczogY2xzLmJhc2UgPyBbdGhpcy5maW5kVHlwZShjbHMuYmFzZSldIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcmZhY2VzOiBjbHMuaW50ZXJmYWNlcz8ubWFwKChiYXNlKSA9PiB0aGlzLmZpbmRUeXBlKGJhc2UpKSxcbiAgICAgICAgYWJzdHJhY3RCYXNlczogYWJzdHJhY3QgPyB0aGlzLmdldEFic3RyYWN0QmFzZXMoY2xzKSA6IFtdLFxuICAgICAgfSxcbiAgICAgIGNscy5kb2NzLFxuICAgICk7XG5cbiAgICBpZiAoY2xzLmluaXRpYWxpemVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBjbHMuaW5pdGlhbGl6ZXI7XG5cbiAgICAgIGtsYXNzLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEluaXRpYWxpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgJ19faW5pdF9fJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY2xzLmluaXRpYWxpemVyLmRvY3MsXG4gICAgICAgICAgZmFsc2UsIC8vIE5ldmVyIHN0YXRpY1xuICAgICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKGNscy5pbml0aWFsaXplciksIHBhcmVudDogY2xzIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShrbGFzcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY01ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgdHJ1ZSwgLy8gQWx3YXlzIHN0YXRpY1xuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY1Byb3BlcnR5KGNsczogc3BlYy5DbGFzc1R5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IFN0YXRpY1Byb3BlcnR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUsIHByb3AuY29uc3QpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kKGNsczogc3BlYy5DbGFzc1R5cGUsIG1ldGhvZDogc3BlYy5NZXRob2QpIHtcbiAgICBjb25zdCB7IHBhcmFtZXRlcnMgPSBbXSB9ID0gbWV0aG9kO1xuXG4gICAgaWYgKG1ldGhvZC5hc3luYykge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IEFzeW5jTWV0aG9kKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgICAgbmV3IE1ldGhvZChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRvUHl0aG9uTWV0aG9kTmFtZShtZXRob2QubmFtZSwgbWV0aG9kLnByb3RlY3RlZCksXG4gICAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICBtZXRob2QucmV0dXJucyxcbiAgICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWJzdHJhY3Q6IG1ldGhvZC5hYnN0cmFjdCxcbiAgICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCwgcHJvcC5wcm90ZWN0ZWQpLFxuICAgICAgICBwcm9wLm5hbWUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIHByb3AuZG9jcyxcbiAgICAgICAge1xuICAgICAgICAgIGFic3RyYWN0OiBwcm9wLmFic3RyYWN0LFxuICAgICAgICAgIGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsXG4gICAgICAgICAgaXNTdGF0aWM6IHByb3Auc3RhdGljLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVW5pb25Qcm9wZXJ0eShcbiAgICBjbHM6IHNwZWMuQ2xhc3NUeXBlLFxuICAgIHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgX3VuaW9uOiBzcGVjLlVuaW9uVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5vblByb3BlcnR5KGNscywgcHJvcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWdpbkludGVyZmFjZShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIGxldCBpZmFjZTogSW50ZXJmYWNlIHwgU3RydWN0O1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2UgPSBuZXcgU3RydWN0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMsXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICAgIHsgYmFzZXM6IGlmYy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpIH0sXG4gICAgICAgIGlmYy5kb2NzLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2UgPSBuZXcgSW50ZXJmYWNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIoaWZjLm5hbWUpLFxuICAgICAgICBpZmMsXG4gICAgICAgIGlmYy5mcW4sXG4gICAgICAgIHsgYmFzZXM6IGlmYy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpIH0sXG4gICAgICAgIGlmYy5kb2NzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoaWZhY2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kSW50ZXJmYWNlKF9pZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZChpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoaWZjLmZxbikuYWRkTWVtYmVyKFxuICAgICAgbmV3IEludGVyZmFjZU1ldGhvZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgbWV0aG9kLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICBtZXRob2QuZG9jcyxcbiAgICAgICAgISFtZXRob2Quc3RhdGljLFxuICAgICAgICB7IGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLCBwYXJlbnQ6IGlmYyB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlUHJvcGVydHkoaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsIHByb3A6IHNwZWMuUHJvcGVydHkpIHtcbiAgICBsZXQgaWZhY2VQcm9wZXJ0eTogSW50ZXJmYWNlUHJvcGVydHkgfCBTdHJ1Y3RGaWVsZDtcblxuICAgIGlmIChpZmMuZGF0YXR5cGUpIHtcbiAgICAgIGlmYWNlUHJvcGVydHkgPSBuZXcgU3RydWN0RmllbGQodGhpcywgcHJvcCwgaWZjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBJbnRlcmZhY2VQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0LCBwcm9wLnByb3RlY3RlZCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7IGltbXV0YWJsZTogcHJvcC5pbW11dGFibGUsIGlzU3RhdGljOiBwcm9wLnN0YXRpYywgcGFyZW50OiBpZmMgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGlmYy5mcW4pLmFkZE1lbWJlcihpZmFjZVByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luRW51bShlbm06IHNwZWMuRW51bVR5cGUpIHtcbiAgICB0aGlzLmFkZFB5dGhvblR5cGUoXG4gICAgICBuZXcgRW51bSh0aGlzLCB0b1B5dGhvbklkZW50aWZpZXIoZW5tLm5hbWUpLCBlbm0sIGVubS5mcW4sIHt9LCBlbm0uZG9jcyksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkVudW1NZW1iZXIoZW5tOiBzcGVjLkVudW1UeXBlLCBtZW1iZXI6IHNwZWMuRW51bU1lbWJlcikge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShlbm0uZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgRW51bU1lbWJlcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25JZGVudGlmaWVyKG1lbWJlci5uYW1lKSxcbiAgICAgICAgbWVtYmVyLm5hbWUsXG4gICAgICAgIG1lbWJlci5kb2NzLFxuICAgICAgICBlbm0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VNZXRob2RPdmVybG9hZChcbiAgICBfaWZjOiBzcGVjLkludGVyZmFjZVR5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBJbnRlcmZhY2VNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTWV0aG9kT3ZlcmxvYWQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljTWV0aG9kT3ZlcmxvYWQoXG4gICAgX2Nsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgX292ZXJsb2FkOiBzcGVjLk1ldGhvZCxcbiAgICBfb3JpZ2luYWxNZXRob2Q6IHNwZWMuTWV0aG9kLFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBUeXBlOiBTdGF0aWNNZXRob2RPdmVybG9hZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBc3NlbWJseU1vZHVsZU5hbWUoYXNzbTogc3BlYy5Bc3NlbWJseSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Fzc20udGFyZ2V0cyEucHl0aG9uIS5tb2R1bGV9Ll9qc2lpYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyZW50RlFOKGZxbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtID0gL14oLispXFwuW14uXSskLy5leGVjKGZxbik7XG5cbiAgICBpZiAobSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcGFyZW50IEZRTiBvZjogJHtmcW59YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1bMV07XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmVudChmcW46IHN0cmluZyk6IFB5dGhvblR5cGUge1xuICAgIHJldHVybiB0aGlzLmdldFB5dGhvblR5cGUodGhpcy5nZXRQYXJlbnRGUU4oZnFuKSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFB5dGhvblR5cGUodHlwZTogUHl0aG9uVHlwZSkge1xuICAgIGlmICh0eXBlLmZxbiA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgYSBQeXRob24gdHlwZSB3aXRob3V0IGEgRlFOLicpO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0UGFyZW50KHR5cGUuZnFuKS5hZGRNZW1iZXIodHlwZSk7XG4gICAgdGhpcy50eXBlcy5zZXQodHlwZS5mcW4sIHR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRsaWZ0ZWRQcm9wKFxuICAgIG1ldGhvZDogc3BlYy5NZXRob2QgfCBzcGVjLkluaXRpYWxpemVyLFxuICApOiBzcGVjLkludGVyZmFjZVR5cGUgfCB1bmRlZmluZWQge1xuICAgIC8vIElmIHRoZXJlIGFyZSBwYXJhbWV0ZXJzIHRvIHRoaXMgbWV0aG9kLCBhbmQgaWYgdGhlIGxhc3QgcGFyYW1ldGVyJ3MgdHlwZSBpc1xuICAgIC8vIGEgZGF0YXR5cGUgaW50ZXJmYWNlLCB0aGVuIHdlIHdhbnQgdG8gbGlmdCB0aGUgbWVtYmVycyBvZiB0aGF0IGxhc3QgcGFyYW10ZXJcbiAgICAvLyBhcyBrZXl3b3JkIGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgIGlmIChtZXRob2QucGFyYW1ldGVycz8ubGVuZ3RoID8/IDAgPj0gMSkge1xuICAgICAgY29uc3QgbGFzdFBhcmFtZXRlciA9IG1ldGhvZC5wYXJhbWV0ZXJzIS5zbGljZSgtMSlbMF07XG4gICAgICBpZiAoXG4gICAgICAgICFsYXN0UGFyYW1ldGVyLnZhcmlhZGljICYmXG4gICAgICAgIHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UobGFzdFBhcmFtZXRlci50eXBlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXJUeXBlID0gdGhpcy5maW5kVHlwZShsYXN0UGFyYW1ldGVyLnR5cGUuZnFuKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNwZWMuaXNJbnRlcmZhY2VUeXBlKGxhc3RQYXJhbWV0ZXJUeXBlKSAmJlxuICAgICAgICAgIGxhc3RQYXJhbWV0ZXJUeXBlLmRhdGF0eXBlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBsYXN0UGFyYW1ldGVyVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldEFic3RyYWN0QmFzZXMoY2xzOiBzcGVjLkNsYXNzVHlwZSk6IHNwZWMuQ2xhc3NUeXBlW10ge1xuICAgIGNvbnN0IGFic3RyYWN0QmFzZXM6IHNwZWMuQ2xhc3NUeXBlW10gPSBbXTtcblxuICAgIGlmIChjbHMuYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5maW5kVHlwZShjbHMuYmFzZSk7XG5cbiAgICAgIGlmICghc3BlYy5pc0NsYXNzVHlwZShiYXNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDbGFzcyBpbmhlcml0ZW5jZSB0aGF0IGlzbid0IGEgY2xhc3M/XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmFzZS5hYnN0cmFjdCkge1xuICAgICAgICBhYnN0cmFjdEJhc2VzLnB1c2goYmFzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFic3RyYWN0QmFzZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBQb3NpdGlvbmFsIGFyZ3VtZW50IG9yIGtleXdvcmQgcGFyYW1ldGVyXG4gKi9cbmludGVyZmFjZSBEb2N1bWVudGFibGVBcmd1bWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVmaW5pbmdUeXBlOiBzcGVjLlR5cGU7XG4gIGRvY3M/OiBzcGVjLkRvY3M7XG59XG5cbi8qKlxuICogUmVuZGVyIGEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIGdpdmVuIGRvY3MsIHVzZWQgZm9yIG1ldGhvZCBhcmd1bWVudHMgYW5kIGlubGluZWQgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBvbmVsaW5lRGVzY3JpcHRpb24oZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkKSB7XG4gIC8vIE9ubHkgY29uc2lkZXIgYSBzdWJzZXQgb2YgZmllbGRzIGhlcmUsIHdlIGRvbid0IGhhdmUgYSBsb3Qgb2YgZm9ybWF0dGluZyBzcGFjZVxuICBpZiAoIWRvY3MgfHwgT2JqZWN0LmtleXMoZG9jcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICctJztcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gW107XG4gIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICBwYXJ0cy5wdXNoKG1kMnJzdChyZW5kZXJTdW1tYXJ5KGRvY3MpKSk7XG4gIH1cbiAgaWYgKGRvY3MucmVtYXJrcykge1xuICAgIHBhcnRzLnB1c2gobWQycnN0KGRvY3MucmVtYXJrcykpO1xuICB9XG4gIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICBwYXJ0cy5wdXNoKGBEZWZhdWx0OiAke21kMnJzdChkb2NzLmRlZmF1bHQpfWApO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKCcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRNZW50aW9uU3RhYmlsaXR5KHM6IHNwZWMuU3RhYmlsaXR5KSB7XG4gIC8vIERvbid0IHJlbmRlciBcInN0YWJsZVwiIG9yIFwiZXh0ZXJuYWxcIiwgdGhvc2UgYXJlIGJvdGggc3RhYmxlIGJ5IGltcGxpY2F0aW9uLlxuICByZXR1cm4gcyA9PT0gc3BlYy5TdGFiaWxpdHkuRGVwcmVjYXRlZCB8fCBzID09PSBzcGVjLlN0YWJpbGl0eS5FeHBlcmltZW50YWw7XG59XG5cbmZ1bmN0aW9uIGlzU3RydWN0KFxuICB0eXBlU3lzdGVtOiByZWZsZWN0LlR5cGVTeXN0ZW0sXG4gIHJlZjogc3BlYy5UeXBlUmVmZXJlbmNlLFxuKTogYm9vbGVhbiB7XG4gIGlmICghc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShyZWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHR5cGUgPSB0eXBlU3lzdGVtLnRyeUZpbmRGcW4ocmVmLmZxbik7XG4gIHJldHVybiAhISh0eXBlPy5pc0ludGVyZmFjZVR5cGUoKSAmJiB0eXBlPy5pc0RhdGFUeXBlKCkpO1xufVxuXG4vKipcbiAqIEFwcGVuZHMgYF9gIGF0IHRoZSBlbmQgb2YgYG5hbWVgIHVudGlsIGl0IG5vIGxvbmdlciBjb25mbGljdHMgd2l0aCBhbnkgb2YgdGhlXG4gKiBlbnRyaWVzIGluIGBpblVzZWAuXG4gKlxuICogQHBhcmFtIG5hbWUgIHRoZSBuYW1lIHRvIGJlIHNsdWdpZmllZC5cbiAqIEBwYXJhbSBpblVzZSB0aGUgbmFtZXMgdGhhdCBhcmUgYWxyZWFkeSBiZWluZyB1c2VkLlxuICpcbiAqIEByZXR1cm5zIHRoZSBzbHVnaWZpZWQgbmFtZS5cbiAqL1xuZnVuY3Rpb24gc2x1Z2lmeUFzTmVlZGVkKG5hbWU6IHN0cmluZywgaW5Vc2U6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaW5Vc2VTZXQgPSBuZXcgU2V0KGluVXNlKTtcbiAgd2hpbGUgKGluVXNlU2V0LmhhcyhuYW1lKSkge1xuICAgIG5hbWUgPSBgJHtuYW1lfV9gO1xuICB9XG4gIHJldHVybiBuYW1lO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQkVIT0xEOiBIZWxwZXJzIHRvIG91dHB1dCBjb2RlIHRoYXQgbG9va3MgbGlrZSB3aGF0IEJsYWNrIHdvdWxkIGZvcm1hdCBpbnRvLi4uXG4vL1xuLy8gQHNlZSBodHRwczovL2JsYWNrLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS90aGVfYmxhY2tfY29kZV9zdHlsZS5odG1sXG5cbmNvbnN0IFRBUkdFVF9MSU5FX0xFTkdUSCA9IDg4O1xuXG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdjbGFzcycsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbik6IHZvaWQ7XG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdkZWYnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHRyYWlsaW5nQ29tbWE6IGJvb2xlYW4sXG4gIHJldHVyblR5cGU6IHN0cmluZyxcbik6IHZvaWQ7XG5mdW5jdGlvbiBvcGVuU2lnbmF0dXJlKFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIGtleXdvcmQ6ICdjbGFzcycgfCAnZGVmJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZ0NvbW1hID0gZmFsc2UsXG4gIHJldHVyblR5cGU/OiBzdHJpbmcsXG4pIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7a2V5d29yZH0gJHtuYW1lfWA7XG4gIGNvbnN0IHN1ZmZpeCA9IHJldHVyblR5cGUgPyBgIC0+ICR7cmV0dXJuVHlwZX1gIDogJyc7XG4gIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5vcGVuQmxvY2soYCR7cHJlZml4fSR7cmV0dXJuVHlwZSA/ICcoKScgOiAnJ30ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihwYXJhbXMsIGpvaW4pO1xuXG4gIGNvbnN0IGhhc0NvbW1lbnRzID0gIXBhcmFtcy5zb21lKChwYXJhbSkgPT4gLyMgLiskLy5leGVjKHBhcmFtKSk7XG5cbiAgaWYgKFxuICAgIGhhc0NvbW1lbnRzICYmXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgIHN1ZmZpeC5sZW5ndGggK1xuICAgICAgICAyXG4gICkge1xuICAgIGNvZGUub3BlbkJsb2NrKGAke3ByZWZpeH0oJHtwYXJhbXMuam9pbihqb2luKX0pJHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29kZS5pbmRlbnQoYCR7cHJlZml4fShgKTtcbiAgaWYgKFxuICAgICFoYXNDb21tZW50cyAmJlxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgICh0cmFpbGluZ0NvbW1hID8gMSA6IDApXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwYXJhbXMuam9pbihqb2luKX0ke3RyYWlsaW5nQ29tbWEgPyAnLCcgOiAnJ31gKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgY29kZS5saW5lKHBhcmFtLnJlcGxhY2UoLyhcXHMqIyAuKyk/JC8sICcsJDEnKSk7XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoZmFsc2UpO1xuICBjb2RlLm9wZW5CbG9jayhgKSR7c3VmZml4fWApO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DYWxsUmVzdWx0KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHZhcmlhYmxlOiBzdHJpbmcsXG4gIGZ1bmN0OiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4pIHtcbiAgY29uc3QgcHJlZml4ID0gYCR7dmFyaWFibGV9ID0gJHtmdW5jdH0oYDtcbiAgY29uc3Qgc3VmZml4ID0gJyknO1xuXG4gIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBqb2luID0gJywgJztcbiAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihwYXJhbXMsIGpvaW4pO1xuXG4gIGlmIChcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICBwcmVmaXgubGVuZ3RoICtcbiAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICBqb2luU2l6ZSArXG4gICAgICBzdWZmaXgubGVuZ3RoXG4gICkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtwYXJhbXMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb2RlLmluZGVudChwcmVmaXgpO1xuICBpZiAoVEFSR0VUX0xJTkVfTEVOR1RIID4gY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICsgZWxlbWVudHNTaXplICsgam9pblNpemUpIHtcbiAgICBjb2RlLmxpbmUocGFyYW1zLmpvaW4oam9pbikpO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICBjb2RlLmxpbmUoYCR7cGFyYW19LGApO1xuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KHN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkRpY3Rpb25hcnkoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgdmFyaWFibGU6IHN0cmluZyxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB0cmFpbGluZz86IHN0cmluZyxcbiAgY29tcGFjdCA9IGZhbHNlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHNwYWNlID0gY29tcGFjdCA/ICcnIDogJyAnO1xuXG4gIGNvbnN0IHByZWZpeCA9IGAke3ZhcmlhYmxlfSR7c3BhY2V9PSR7c3BhY2V9e2A7XG4gIGNvbnN0IHN1ZmZpeCA9IGB9JHt0cmFpbGluZyA/PyAnJ31gO1xuXG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjb21wYWN0KSB7XG4gICAgY29uc3Qgam9pbiA9ICcsICc7XG4gICAgY29uc3QgeyBlbGVtZW50c1NpemUsIGpvaW5TaXplIH0gPSB0b3RhbFNpemVPZihlbGVtZW50cywgam9pbik7XG4gICAgaWYgKFxuICAgICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgICBqb2luU2l6ZSArXG4gICAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgICApIHtcbiAgICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtlbGVtZW50cy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGNvZGUuaW5kZW50KHByZWZpeCk7XG4gIGZvciAoY29uc3QgZWx0IG9mIGVsZW1lbnRzKSB7XG4gICAgY29kZS5saW5lKGAke2VsdH0sYCk7XG4gIH1cbiAgY29kZS51bmluZGVudChzdWZmaXgpO1xufVxuXG5mdW5jdGlvbiBlbWl0TGlzdChcbiAgY29kZTogQ29kZU1ha2VyLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBzdWZmaXg6IHN0cmluZyxcbiAgb3B0cz86IHsgaWZNdWx0aTogW3N0cmluZywgc3RyaW5nXSB9LFxuKSB7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGpvaW4gPSAnLCAnO1xuICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKGVsZW1lbnRzLCBqb2luKTtcbiAgaWYgKFxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgIGpvaW5TaXplICtcbiAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke2VsZW1lbnRzLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgW2JlZm9yZSwgYWZ0ZXJdID0gb3B0cz8uaWZNdWx0aSA/PyBbJycsICcnXTtcblxuICBjb2RlLmluZGVudChgJHtwcmVmaXh9JHtiZWZvcmV9YCk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb2RlLmxpbmUoZWxlbWVudHNbMF0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChcbiAgICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggKyBlbGVtZW50c1NpemUgKyBqb2luU2l6ZVxuICAgICkge1xuICAgICAgY29kZS5saW5lKGVsZW1lbnRzLmpvaW4oam9pbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGVsdCBvZiBlbGVtZW50cykge1xuICAgICAgICBjb2RlLmxpbmUoYCR7ZWx0fSxgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChgJHthZnRlcn0ke3N1ZmZpeH1gKTtcbn1cblxuZnVuY3Rpb24gdG90YWxTaXplT2Yoc3RyaW5nczogcmVhZG9ubHkgc3RyaW5nW10sIGpvaW46IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIGVsZW1lbnRzU2l6ZTogc3RyaW5nc1xuICAgICAgLm1hcCgoc3RyKSA9PiBzdHIubGVuZ3RoKVxuICAgICAgLnJlZHVjZSgoYWNjLCBlbHQpID0+IGFjYyArIGVsdCwgMCksXG4gICAgam9pblNpemU6IHN0cmluZ3MubGVuZ3RoID4gMSA/IGpvaW4ubGVuZ3RoICogKHN0cmluZ3MubGVuZ3RoIC0gMSkgOiAwLFxuICB9O1xufVxuXG5mdW5jdGlvbiBuZXN0ZWRDb250ZXh0KFxuICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBFbWl0Q29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgLi4uY29udGV4dCxcbiAgICBzdXJyb3VuZGluZ1R5cGVGcW5zOlxuICAgICAgZnFuICE9IG51bGxcbiAgICAgICAgPyBbLi4uKGNvbnRleHQuc3Vycm91bmRpbmdUeXBlRnFucyA/PyBbXSksIGZxbl1cbiAgICAgICAgOiBjb250ZXh0LnN1cnJvdW5kaW5nVHlwZUZxbnMsXG4gIH07XG59XG5cbmNvbnN0IGlzRGVwcmVjYXRlZCA9ICh4OiBQeXRob25CYXNlKSA9PiB4LmRvY3M/LmRlcHJlY2F0ZWQgIT09IHVuZGVmaW5lZDtcbiJdfQ==
|
|
2083
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQW1DO0FBQ25DLGlDQUFpQztBQUNqQyx5Q0FBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELCtCQUErQjtBQUUvQiwrQ0FNc0I7QUFDdEIsNkJBQTZCO0FBRTdCLDRDQUEyRDtBQUMzRCx3Q0FBa0M7QUFDbEMsMENBQXFDO0FBQ3JDLHNDQUFrRDtBQUNsRCxrQ0FBZ0M7QUFDaEMscUNBQTZEO0FBQzdELGtEQU80QjtBQUM1Qix3Q0FBd0Q7QUFDeEQsbURBQXlFO0FBRXpFLHdCQUFtRTtBQUVuRSxvR0FBb0c7QUFDcEcsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFckQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNuQyxTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixDQUN2QixDQUFDO0FBRUYsMkVBQTJFO0FBQzNFLCtGQUErRjtBQUMvRixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUUvQixNQUFxQixNQUFPLFNBQVEsZUFBTTtJQUd4QyxZQUFtQixPQUFzQjtRQUN2QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFjLEVBQUUsT0FBZTtRQUN2RCxNQUFNLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQWlCLEVBQUUsTUFBYztRQUNsRCw2QkFBNkI7UUFDN0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FB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RSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEUsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FDcEIsT0FBb0IsRUFDcEIsR0FBdUI7O0lBRXZCLE9BQU87UUFDTCxHQUFHLE9BQU87UUFDVixtQkFBbUIsRUFDakIsR0FBRyxJQUFJLElBQUk7WUFDVCxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQUMsT0FBTyxDQUFDLG1CQUFtQixtQ0FBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDL0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUI7S0FDbEMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQWEsRUFBRSxFQUFFLFdBQUMsT0FBQSxPQUFBLENBQUMsQ0FBQyxJQUFJLDBDQUFFLFVBQVUsTUFBSyxTQUFTLENBQUEsRUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc3BlYyBmcm9tICdAanNpaS9zcGVjJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQ29kZU1ha2VyLCB0b1NuYWtlQ2FzZSB9IGZyb20gJ2NvZGVtYWtlcic7XG5pbXBvcnQgKiBhcyBlc2NhcGVTdHJpbmdSZWdleHAgZnJvbSAnZXNjYXBlLXN0cmluZy1yZWdleHAnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHtcbiAgVGFyZ2V0TGFuZ3VhZ2UsXG4gIFRyYW5zbGF0aW9uLFxuICBSb3NldHRhLFxuICBlbmZvcmNlc1N0cmljdE1vZGUsXG4gIEFwaUxvY2F0aW9uLFxufSBmcm9tICdqc2lpLXJvc2V0dGEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgR2VuZXJhdG9yLCBHZW5lcmF0b3JPcHRpb25zIH0gZnJvbSAnLi4vZ2VuZXJhdG9yJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuLi9sb2dnaW5nJztcbmltcG9ydCB7IG1kMnJzdCB9IGZyb20gJy4uL21hcmtkb3duJztcbmltcG9ydCB7IFRhcmdldCwgVGFyZ2V0T3B0aW9ucyB9IGZyb20gJy4uL3RhcmdldCc7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgcmVuZGVyU3VtbWFyeSwgUHJvcGVydHlEZWZpbml0aW9uIH0gZnJvbSAnLi9fdXRpbHMnO1xuaW1wb3J0IHtcbiAgTmFtaW5nQ29udGV4dCxcbiAgdG9UeXBlTmFtZSxcbiAgUHl0aG9uSW1wb3J0cyxcbiAgbWVyZ2VQeXRob25JbXBvcnRzLFxuICB0b1BhY2thZ2VOYW1lLFxuICB0b1B5dGhvbkZxbixcbn0gZnJvbSAnLi9weXRob24vdHlwZS1uYW1lJztcbmltcG9ydCB7IGRpZSwgdG9QeXRob25JZGVudGlmaWVyIH0gZnJvbSAnLi9weXRob24vdXRpbCc7XG5pbXBvcnQgeyB0b1B5dGhvblZlcnNpb25SYW5nZSwgdG9SZWxlYXNlVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi11dGlscyc7XG5cbmltcG9ydCB7IElOQ09NUExFVEVfRElTQ0xBSU1FUl9OT05DT01QSUxJTkcsIFRhcmdldE5hbWUgfSBmcm9tICcuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXMsQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3Qgc3BkeExpY2Vuc2VMaXN0ID0gcmVxdWlyZSgnc3BkeC1saWNlbnNlLWxpc3QnKTtcblxuY29uc3QgcmVxdWlyZW1lbnRzRmlsZSA9IHBhdGgucmVzb2x2ZShcbiAgX19kaXJuYW1lLFxuICAncHl0aG9uJyxcbiAgJ3JlcXVpcmVtZW50cy1kZXYudHh0Jyxcbik7XG5cbi8vIHdlIHVzZSBzaW5nbGUtcXVvdGVzIGZvciBtdWx0aS1saW5lIHN0cmluZ3MgdG8gYWxsb3cgZXhhbXBsZXMgd2l0aGluIHRoZVxuLy8gZG9jc3RyaW5ncyB0aGVtc2VsdmVzIHRvIGluY2x1ZGUgZG91YmxlLXF1b3RlcyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjU2OSlcbmNvbnN0IERPQ1NUUklOR19RVU9URVMgPSBcIicnJ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQeXRob24gZXh0ZW5kcyBUYXJnZXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRhcmdldE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IFB5dGhvbkdlbmVyYXRvcihvcHRpb25zLnJvc2V0dGEpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlbmVyYXRlQ29kZShvdXREaXI6IHN0cmluZywgdGFyYmFsbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuZ2VuZXJhdGVDb2RlKG91dERpciwgdGFyYmFsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoc291cmNlRGlyOiBzdHJpbmcsIG91dERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIGEgZnJlc2ggdmlydHVhbCBlbnZcbiAgICBjb25zdCB2ZW52ID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4oc291cmNlRGlyLCAnLmVudi0nKSk7XG4gICAgY29uc3QgdmVudkJpbiA9IHBhdGguam9pbihcbiAgICAgIHZlbnYsXG4gICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ1NjcmlwdHMnIDogJ2JpbicsXG4gICAgKTtcbiAgICBhd2FpdCBzaGVsbCgncHl0aG9uMycsIFtcbiAgICAgICctbScsXG4gICAgICAndmVudicsXG4gICAgICAnLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlcycsIC8vIEFsbG93IHVzaW5nIGdsb2JhbGx5IGluc3RhbGxlZCBwYWNrYWdlcyAoc2F2ZXMgdGltZSAmIGRpc2sgc3BhY2UpXG4gICAgICB2ZW52LFxuICAgIF0pO1xuICAgIGNvbnN0IGVudiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgUEFUSDogYCR7dmVudkJpbn06JHtwcm9jZXNzLmVudi5QQVRIfWAsXG4gICAgICBWSVJUVUFMX0VOVjogdmVudixcbiAgICB9O1xuICAgIGNvbnN0IHB5dGhvbiA9IHBhdGguam9pbih2ZW52QmluLCAncHl0aG9uJyk7XG5cbiAgICAvLyBJbnN0YWxsIHRoZSBuZWNlc3NhcnkgdGhpbmdzXG4gICAgYXdhaXQgc2hlbGwoXG4gICAgICBweXRob24sXG4gICAgICBbJy1tJywgJ3BpcCcsICdpbnN0YWxsJywgJy0tbm8taW5wdXQnLCAnLXInLCByZXF1aXJlbWVudHNGaWxlXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgICAgIGVudixcbiAgICAgICAgcmV0cnk6IHsgbWF4QXR0ZW1wdHM6IDUgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFjdHVhbGx5IHBhY2thZ2UgdXAgb3VyIGNvZGUsIGJvdGggYXMgYSBzZGlzdCBhbmQgYSB3aGVlbCBmb3IgcHVibGlzaGluZy5cbiAgICBhd2FpdCBzaGVsbChweXRob24sIFsnc2V0dXAucHknLCAnc2Rpc3QnLCAnLS1kaXN0LWRpcicsIG91dERpcl0sIHtcbiAgICAgIGN3ZDogc291cmNlRGlyLFxuICAgICAgZW52LFxuICAgIH0pO1xuICAgIGF3YWl0IHNoZWxsKFxuICAgICAgcHl0aG9uLFxuICAgICAgWyctbScsICdwaXAnLCAnd2hlZWwnLCAnLS1uby1kZXBzJywgJy0td2hlZWwtZGlyJywgb3V0RGlyLCBzb3VyY2VEaXJdLFxuICAgICAge1xuICAgICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgICAgZW52LFxuICAgICAgICByZXRyeTogeyBtYXhBdHRlbXB0czogNSB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHNoZWxsKHB5dGhvbiwgWyctbScsICd0d2luZScsICdjaGVjaycsIHBhdGguam9pbihvdXREaXIsICcqJyldLCB7XG4gICAgICBjd2Q6IHNvdXJjZURpcixcbiAgICAgIGVudixcbiAgICB9KTtcbiAgfVxufVxuXG4vLyAjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICMgQ09ERSBHRU5FUkFUT1IgI1xuLy8gIyMjIyMjIyMjIyMjIyMjIyMjXG5cbmludGVyZmFjZSBFbWl0Q29udGV4dCBleHRlbmRzIE5hbWluZ0NvbnRleHQge1xuICAvKiogQGRlcHJlY2F0ZWQgVGhlIFR5cGVSZXNvbHZlciAqL1xuICByZWFkb25seSByZXNvbHZlcjogVHlwZVJlc29sdmVyO1xufVxuXG5jb25zdCBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gcGF0aC5qb2luKC4uLm5hbWUuc3BsaXQoJy4nKSk7XG59O1xuXG5jb25zdCB0b1B5dGhvbk1ldGhvZE5hbWUgPSAobmFtZTogc3RyaW5nLCBwcm90ZWN0ZWRJdGVtID0gZmFsc2UpOiBzdHJpbmcgPT4ge1xuICBsZXQgdmFsdWUgPSB0b1B5dGhvbklkZW50aWZpZXIodG9TbmFrZUNhc2UobmFtZSkpO1xuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuY29uc3QgdG9QeXRob25Qcm9wZXJ0eU5hbWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgY29uc3RhbnQgPSBmYWxzZSxcbiAgcHJvdGVjdGVkSXRlbSA9IGZhbHNlLFxuKTogc3RyaW5nID0+IHtcbiAgbGV0IHZhbHVlID0gdG9QeXRob25JZGVudGlmaWVyKHRvU25ha2VDYXNlKG5hbWUpKTtcblxuICBpZiAoY29uc3RhbnQpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBpZiAocHJvdGVjdGVkSXRlbSkge1xuICAgIHZhbHVlID0gYF8ke3ZhbHVlfWA7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZ2l2ZW4gc2lnbmF0dXJlJ3MgcGFyYW1ldGVyIG5hbWUgdG8gd2hhdCBzaG91bGQgYmUgZW1pdHRlZCBpbiBQeXRob24uIEl0IHNsdWdpZmllcyB0aGVcbiAqIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG5hbWVzIHRoYXQgY29sbGlkZSB3aXRoIGEgbGlmdGVkIHByb3AgYnkgYXBwZW5kaW5nIHRyYWlsaW5nIGBfYC4gVGhlcmUgaXMgbm9cbiAqIHJpc2sgb2YgY29uZmxpY3Rpbmcgd2l0aCBhbiBvdGhlciBwb3NpdGlvbmFsIHBhcmFtZXRlciB0aGF0IGVuZHMgd2l0aCBhIGBfYCBjaGFyYWN0ZXIgYmVjYXVzZVxuICogdGhpcyBpcyBwcm9oaWJpdGVkIGJ5IHRoZSBganNpaWAgY29tcGlsZXIgKHBhcmFtZXRlciBuYW1lcyBNVVNUIGJlIGNhbWVsQ2FzZSwgYW5kIG9ubHkgYSBzaW5nbGVcbiAqIGBfYCBpcyBwZXJtaXR0ZWQgd2hlbiBpdCBpcyBvbiAqKmxlYWRpbmcqKiBwb3NpdGlvbilcbiAqXG4gKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0aGF0IG5lZWRzIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gbGlmdGVkUGFyYW1OYW1lcyAgdGhlIGxpc3Qgb2YgXCJsaWZ0ZWRcIiBrZXl3b3JkIHBhcmFtZXRlcnMgaW4gdGhpcyBzaWduYXR1cmUuIFRoaXMgbXVzdCBiZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQgd2hlbiBnZW5lcmF0aW5nIGEgbmFtZSBmb3IgYSBwYXJhbWV0ZXIgdGhhdCAqKmlzKiogbGlmdGVkLlxuICovXG5mdW5jdGlvbiB0b1B5dGhvblBhcmFtZXRlck5hbWUoXG4gIG5hbWU6IHN0cmluZyxcbiAgbGlmdGVkUGFyYW1OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9IHRvUHl0aG9uSWRlbnRpZmllcih0b1NuYWtlQ2FzZShuYW1lKSk7XG5cbiAgd2hpbGUgKGxpZnRlZFBhcmFtTmFtZXMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXN1bHQgKz0gJ18nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3Qgc2V0RGlmZmVyZW5jZSA9IDxUPihzZXRBOiBTZXQ8VD4sIHNldEI6IFNldDxUPik6IFNldDxUPiA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQ8VD4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHNldEEpIHtcbiAgICBpZiAoIXNldEIuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQcmVwYXJlIHB5dGhvbiBtZW1iZXJzIGZvciBlbWlzc2lvbi5cbiAqXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lLCB0aGV5IHdpbGwgYWxsIG1hcCB0byB0aGUgc2FtZSBweXRob25cbiAqIG5hbWUsIHNvIHdlIHdpbGwgZmlsdGVyIGFsbCBkZXByZWNhdGVkIG1lbWJlcnMgYW5kIGV4cGVjdCB0aGF0IHRoZXJlIHdpbGwgYmUgb25seSBvbmVcbiAqIGxlZnQuXG4gKlxuICogUmV0dXJucyB0aGUgbWVtYmVycyBpbiBhIHNvcnRlZCBsaXN0LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTWVtYmVycyhtZW1iZXJzOiBQeXRob25CYXNlW10sIHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpIHtcbiAgLy8gY3JlYXRlIGEgbWFwIGZyb20gcHl0aG9uIG5hbWUgdG8gbGlzdCBvZiBtZW1iZXJzXG4gIGNvbnN0IG1hcDogeyBbcHl0aG9uTmFtZTogc3RyaW5nXTogUHl0aG9uQmFzZVtdIH0gPSB7fTtcbiAgZm9yIChjb25zdCBtIG9mIG1lbWJlcnMpIHtcbiAgICBsZXQgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdO1xuICAgIGlmICghbGlzdCkge1xuICAgICAgbGlzdCA9IG1hcFttLnB5dGhvbk5hbWVdID0gW107XG4gICAgfVxuXG4gICAgbGlzdC5wdXNoKG0pO1xuICB9XG5cbiAgLy8gbm93IHJldHVybiBhbGwgdGhlIG1lbWJlcnNcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFB5dGhvbkJhc2U+KCk7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgbGlzdF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgIGxldCBtZW1iZXI7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgbWVtYmVyIGZvciB0aGlzIG5vcm1hbGl6ZWQgbmFtZSwgdGhlbiB1c2UgaXRcbiAgICAgIG1lbWJlciA9IGxpc3RbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlIGZvdW5kIG1vcmUgdGhhbiBvbmUgbWVtYmVyIHdpdGggdGhlIHNhbWUgcHl0aG9uIG5hbWUsIGZpbHRlciBhbGxcbiAgICAgIC8vIGRlcHJlY2F0ZWQgdmVyc2lvbnMgYW5kIGNoZWNrIHRoYXQgd2UgYXJlIGxlZnQgd2l0aCBleGFjdGx5IG9uZS5cbiAgICAgIC8vIG90aGVyd2lzZSwgdGhleSB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yNTA4XG4gICAgICBjb25zdCBub25EZXByZWNhdGVkID0gbGlzdC5maWx0ZXIoKHgpID0+ICFpc0RlcHJlY2F0ZWQoeCkpO1xuICAgICAgaWYgKG5vbkRlcHJlY2F0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG5vbi1kZXByZWNhdGVkIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cImAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub25EZXByZWNhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE11bHRpcGxlIG1lbWJlcnMgd2hpY2ggbWFwIHRvIHRoZSBQeXRob24gbmFtZSBcIiR7bmFtZX1cIiwgYnV0IGFsbCBvZiB0aGVtIGFyZSBkZXByZWNhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWVtYmVyID0gbm9uRGVwcmVjYXRlZFswXTtcbiAgICB9XG5cbiAgICByZXQucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcmV0dXJuIHNvcnRNZW1iZXJzKHJldCwgcmVzb2x2ZXIpO1xufVxuXG5jb25zdCBzb3J0TWVtYmVycyA9IChcbiAgbWVtYmVyczogUHl0aG9uQmFzZVtdLFxuICByZXNvbHZlcjogVHlwZVJlc29sdmVyLFxuKTogUHl0aG9uQmFzZVtdID0+IHtcbiAgbGV0IHNvcnRhYmxlID0gbmV3IEFycmF5PHtcbiAgICBtZW1iZXI6IFB5dGhvbkJhc2UgJiBJU29ydGFibGVUeXBlO1xuICAgIGRlcGVuZHNPbjogU2V0PFB5dGhvblR5cGU+O1xuICB9PigpO1xuICBjb25zdCBzb3J0ZWQgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8UHl0aG9uQmFzZT4oKTtcblxuICAvLyBUaGUgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBkbywgaXMgcHVzaCBhbnkgaXRlbSB3aGljaCBpcyBub3Qgc29ydGFibGUgdG8gdGhlIHZlcnlcbiAgLy8gZnJvbnQgb2YgdGhlIGxpc3QuIFRoaXMgd2lsbCBiZSB0aGluZ3MgbGlrZSBtZXRob2RzLCBwcm9wZXJ0aWVzLCBldGMuXG4gIGZvciAoY29uc3QgbWVtYmVyIG9mIG1lbWJlcnMpIHtcbiAgICBpZiAoIWlzU29ydGFibGVUeXBlKG1lbWJlcikpIHtcbiAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICBzZWVuLmFkZChtZW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3J0YWJsZS5wdXNoKHsgbWVtYmVyLCBkZXBlbmRzT246IG5ldyBTZXQobWVtYmVyLmRlcGVuZHNPbihyZXNvbHZlcikpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB0aGF0IHdlJ3ZlIHB1bGxlZCBvdXQgZXZlcnl0aGluZyB0aGF0IGNvdWxkbid0IHBvc3NpYmx5IGhhdmUgZGVwZW5kZW5jaWVzLFxuICAvLyB3ZSB3aWxsIGdvIHRocm91Z2ggdGhlIHJlbWFpbmluZyBpdGVtcywgYW5kIHB1bGwgb2ZmIGFueSBpdGVtcyB3aGljaCBoYXZlIG5vXG4gIC8vIGRlcGVuZGVuY2llcyB0aGF0IHdlIGhhdmVuJ3QgYWxyZWFkeSBzb3J0ZWQuXG4gIHdoaWxlIChzb3J0YWJsZS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCB7IG1lbWJlciwgZGVwZW5kc09uIH0gb2Ygc29ydGFibGUpIHtcbiAgICAgIGNvbnN0IGRpZmYgPSBzZXREaWZmZXJlbmNlKGRlcGVuZHNPbiwgc2Vlbik7XG4gICAgICBpZiAoWy4uLmRpZmZdLmZpbmQoKGRlcCkgPT4gIShkZXAgaW5zdGFuY2VvZiBQeXRob25Nb2R1bGUpKSA9PSBudWxsKSB7XG4gICAgICAgIHNvcnRlZC5wdXNoKG1lbWJlcik7XG4gICAgICAgIHNlZW4uYWRkKG1lbWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdG92ZXIgPSBzb3J0YWJsZS5maWx0ZXIoKHsgbWVtYmVyIH0pID0+ICFzZWVuLmhhcyhtZW1iZXIpKTtcbiAgICBpZiAobGVmdG92ZXIubGVuZ3RoID09PSBzb3J0YWJsZS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBzb3J0IG1lbWJlcnMgKGNpcmN1bGFyIGRlcGVuZGVuY3k/KS4gTGVmdG92ZXI6ICR7bGVmdG92ZXJcbiAgICAgICAgICAubWFwKChsbykgPT4gbG8ubWVtYmVyLnB5dGhvbk5hbWUpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvcnRhYmxlID0gbGVmdG92ZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNvcnRlZDtcbn07XG5cbmludGVyZmFjZSBQeXRob25CYXNlIHtcbiAgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb2NzPzogc3BlYy5Eb2NzO1xuXG4gIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCwgb3B0cz86IGFueSk6IHZvaWQ7XG5cbiAgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cztcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGUgZXh0ZW5kcyBQeXRob25CYXNlIHtcbiAgLy8gVGhlIEpTSUkgRlFOIGZvciB0aGlzIGl0ZW0sIGlmIHRoaXMgaXRlbSBkb2Vzbid0IGV4aXN0IGFzIGEgSlNJSSB0eXBlLCB0aGVuIGl0XG4gIC8vIGRvZXNuJ3QgaGF2ZSBhIEZRTiBhbmQgaXQgc2hvdWxkIGJlIG51bGw7XG4gIHJlYWRvbmx5IGZxbj86IHN0cmluZztcblxuICBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTb3J0YWJsZVR5cGUge1xuICBkZXBlbmRzT24ocmVzb2x2ZXI6IFR5cGVSZXNvbHZlcik6IFB5dGhvblR5cGVbXTtcbn1cblxuZnVuY3Rpb24gaXNTb3J0YWJsZVR5cGUoYXJnOiB1bmtub3duKTogYXJnIGlzIElTb3J0YWJsZVR5cGUge1xuICByZXR1cm4gKGFyZyBhcyBQYXJ0aWFsPElTb3J0YWJsZVR5cGU+KS5kZXBlbmRzT24gIT09IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIFB5dGhvblR5cGVPcHRzIHtcbiAgYmFzZXM/OiBzcGVjLlR5cGVSZWZlcmVuY2VbXTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZVB5dGhvbkNsYXNzVHlwZSBpbXBsZW1lbnRzIFB5dGhvblR5cGUsIElTb3J0YWJsZVR5cGUge1xuICBwcm90ZWN0ZWQgYmFzZXM6IHNwZWMuVHlwZVJlZmVyZW5jZVtdO1xuICBwcm90ZWN0ZWQgbWVtYmVyczogUHl0aG9uQmFzZVtdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VwYXJhdGVNZW1iZXJzOiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHNwZWM6IHNwZWMuVHlwZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZnFuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgb3B0czogUHl0aG9uVHlwZU9wdHMsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgY29uc3QgeyBiYXNlcyA9IFtdIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5iYXNlcyA9IGJhc2VzO1xuICAgIHRoaXMubWVtYmVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbihyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHl0aG9uVHlwZVtdIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8UHl0aG9uVHlwZT4oKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBiYXNlcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBtb2R1bGUgYXQgdGhlIHNhbWUgbGV2ZWwgb2ZcbiAgICAvLyBuZXN0aW5nLlxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGJhc2Ugb2YgdGhpcy5iYXNlcykge1xuICAgICAgaWYgKHNwZWMuaXNOYW1lZFR5cGVSZWZlcmVuY2UoYmFzZSkpIHtcbiAgICAgICAgaWYgKHJlc29sdmVyLmlzSW5Nb2R1bGUoYmFzZSkpIHtcbiAgICAgICAgICAvLyBHaXZlbiBhIGJhc2UsIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBiYXNlJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWUgYXNcbiAgICAgICAgICAvLyBvdXIgcGFyZW50LCBiZWNhdXNlIHdlIG9ubHkgY2FyZSBhYm91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXQgdGhlXG4gICAgICAgICAgLy8gc2FtZSBsZXZlbCBvZiBvdXIgb3duLlxuICAgICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAgIC8vICAgICAgIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICBsZXQgYmFzZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGJhc2UpO1xuICAgICAgICAgIGxldCBiYXNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGJhc2UpO1xuICAgICAgICAgIHdoaWxlIChiYXNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgIGJhc2VJdGVtID0gYmFzZVBhcmVudDtcbiAgICAgICAgICAgIGJhc2VQYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzZWVuLmhhcyhiYXNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYmFzZUl0ZW0pO1xuICAgICAgICAgICAgc2Vlbi5hZGQoYmFzZUl0ZW0uZnFuISk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgLi4udGhpcy5iYXNlcy5tYXAoKGJhc2UpID0+IHRvVHlwZU5hbWUoYmFzZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpKSxcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKSB7XG4gICAgdGhpcy5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIGlmICghdGhpcy5mcW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBtYWtlIGFwaUxvY2F0aW9uIGZvciAke3RoaXMucHl0aG9uTmFtZX0sIGRvZXMgbm90IGhhdmUgRlFOYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGFwaTogJ3R5cGUnLCBmcW46IHRoaXMuZnFuIH07XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29udGV4dCA9IG5lc3RlZENvbnRleHQoY29udGV4dCwgdGhpcy5mcW4pO1xuXG4gICAgY29uc3QgY2xhc3NQYXJhbXMgPSB0aGlzLmdldENsYXNzUGFyYW1zKGNvbnRleHQpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBjbGFzc1BhcmFtcyk7XG5cbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tZW1iZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gdGhpcy5ib3VuZFJlc29sdmVyKGNvbnRleHQucmVzb2x2ZXIpO1xuICAgICAgbGV0IHNob3VsZFNlcGFyYXRlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgICBpZiAoc2hvdWxkU2VwYXJhdGUpIHtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRTZXBhcmF0ZSA9IHRoaXMuc2VwYXJhdGVNZW1iZXJzO1xuICAgICAgICBtZW1iZXIuZW1pdChjb2RlLCB7IC4uLmNvbnRleHQsIHJlc29sdmVyIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGlmICh0aGlzLmZxbiAhPSBudWxsKSB7XG4gICAgICBjb250ZXh0LmVtaXR0ZWRUeXBlcy5hZGQodGhpcy5mcW4pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBib3VuZFJlc29sdmVyKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBUeXBlUmVzb2x2ZXIge1xuICAgIGlmICh0aGlzLmZxbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlci5iaW5kKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgQmFzZU1ldGhvZE9wdHMge1xuICBhYnN0cmFjdD86IGJvb2xlYW47XG4gIGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG59XG5cbmludGVyZmFjZSBCYXNlTWV0aG9kRW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlTWV0aG9kIGltcGxlbWVudHMgUHl0aG9uQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJldHVybkZyb21KU0lJTWV0aG9kOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpZnRlZFByb3A/OiBzcGVjLkludGVyZmFjZVR5cGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIHB1YmxpYyByZWFkb25seSBweXRob25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHNwZWMuUGFyYW1ldGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXR1cm5zOiBzcGVjLk9wdGlvbmFsVmFsdWUgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW4sXG4gICAgb3B0czogQmFzZU1ldGhvZE9wdHMsXG4gICkge1xuICAgIHRoaXMuYWJzdHJhY3QgPSAhIW9wdHMuYWJzdHJhY3Q7XG4gICAgdGhpcy5saWZ0ZWRQcm9wID0gb3B0cy5saWZ0ZWRQcm9wO1xuICAgIHRoaXMucGFyZW50ID0gb3B0cy5wYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBpOiAnbWVtYmVyJyxcbiAgICAgIGZxbjogdGhpcy5wYXJlbnQuZnFuLFxuICAgICAgbWVtYmVyTmFtZTogdGhpcy5qc05hbWUgPz8gJycsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgdG9UeXBlTmFtZSh0aGlzLnJldHVybnMpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKHBhcmFtKS5yZXF1aXJlZEltcG9ydHMoY29udGV4dCksXG4gICAgICApLFxuICAgICAgLi4ubGlmdGVkUHJvcGVydGllcyh0aGlzLmxpZnRlZFByb3ApLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiogbGlmdGVkUHJvcGVydGllcyhcbiAgICAgIHN0cnVjdDogc3BlYy5JbnRlcmZhY2VUeXBlIHwgdW5kZWZpbmVkLFxuICAgICk6IEl0ZXJhYmxlSXRlcmF0b3I8UHl0aG9uSW1wb3J0cz4ge1xuICAgICAgaWYgKHN0cnVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBzdHJ1Y3QucHJvcGVydGllcyA/PyBbXSkge1xuICAgICAgICB5aWVsZCB0b1R5cGVOYW1lKHByb3AudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBiYXNlIG9mIHN0cnVjdC5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IGlmYWNlID0gY29udGV4dC5yZXNvbHZlci5kZXJlZmVyZW5jZShiYXNlKSBhcyBzcGVjLkludGVyZmFjZVR5cGU7XG4gICAgICAgIGZvciAoY29uc3QgaW1wb3J0cyBvZiBsaWZ0ZWRQcm9wZXJ0aWVzKGlmYWNlKSkge1xuICAgICAgICAgIHlpZWxkIGltcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW1pdChcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgY29udGV4dDogRW1pdENvbnRleHQsXG4gICAgb3B0cz86IEJhc2VNZXRob2RFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcblxuICAgIGNvbnN0IHJldHVyblR5cGU6IHN0cmluZyA9IHRvVHlwZU5hbWUodGhpcy5yZXR1cm5zKS5weXRob25UeXBlKGNvbnRleHQpO1xuXG4gICAgLy8gV2UgY2Fubm90IChjdXJyZW50bHk/KSBibGluZGx5IHVzZSB0aGUgbmFtZXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIEpTSUkgZm9yXG4gICAgLy8gaW5pdGlhbGl6ZXJzLCBiZWNhdXNlIG91ciBrZXl3b3JkIGxpZnRpbmcgd2lsbCBhbGxvdyB0d28gbmFtZXMgdG8gY2xhc2guXG4gICAgLy8gVGhpcyBjYW4gaG9wZWZ1bGx5IGJlIHJlbW92ZWQgb25jZSB3ZSBnZXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2lzc3Vlcy8yODhcbiAgICAvLyByZXNvbHZlZCwgc28gYnVpbGQgdXAgYSBsaXN0IG9mIGFsbCBvZiB0aGUgcHJvcCBuYW1lcyBzbyB3ZSBjYW4gY2hlY2sgYWdhaW5zdFxuICAgIC8vIHRoZW0gbGF0ZXIuXG4gICAgY29uc3QgbGlmdGVkUHJvcE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMubGlmdGVkUHJvcD8ucHJvcGVydGllcyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5saWZ0ZWRQcm9wLnByb3BlcnRpZXMpIHtcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLmFkZCh0b1B5dGhvblBhcmFtZXRlck5hbWUocHJvcC5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgbmVlZCB0byB0dXJuIGEgbGlzdCBvZiBKU0lJIHBhcmFtZXRlcnMsIGludG8gUHl0aG9uIHN0eWxlIGFyZ3VtZW50cyB3aXRoXG4gICAgLy8gZ3JhZHVhbCB0eXBpbmcsIHNvIHdlJ2xsIGhhdmUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMsIGFuZFxuICAgIC8vIGJ1aWxkIHRoZSBsaXN0LCBjb252ZXJ0aW5nIGFzIHdlIGdvLlxuICAgIGNvbnN0IHB5dGhvblBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgLy8gV2UgY2Fubm90IChjdXJyZW50bHk/KSBibGluZGx5IHVzZSB0aGUgbmFtZXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIEpTSUkgZm9yXG4gICAgICAvLyBpbml0aWFsaXplcnMsIGJlY2F1c2Ugb3VyIGtleXdvcmQgbGlmdGluZyB3aWxsIGFsbG93IHR3byBuYW1lcyB0byBjbGFzaC5cbiAgICAgIC8vIFRoaXMgY2FuIGhvcGVmdWxseSBiZSByZW1vdmVkIG9uY2Ugd2UgZ2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvanNpaS9pc3N1ZXMvMjg4XG4gICAgICAvLyByZXNvbHZlZC5cbiAgICAgIGNvbnN0IHBhcmFtTmFtZTogc3RyaW5nID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKFxuICAgICAgICBwYXJhbS5uYW1lLFxuICAgICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBwYXJhbVR5cGUgPSB0b1R5cGVOYW1lKHBhcmFtKS5weXRob25UeXBlKHtcbiAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgcGFyYW1ldGVyVHlwZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGFyYW1EZWZhdWx0ID0gcGFyYW0ub3B0aW9uYWwgPyAnID0gTm9uZScgOiAnJztcblxuICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9JHtwYXJhbURlZmF1bHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jdW1lbnRhYmxlQXJnczogRG9jdW1lbnRhYmxlQXJndW1lbnRbXSA9IHRoaXMucGFyYW1ldGVyc1xuICAgICAgLm1hcChcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgIGRvY3M6IHAuZG9jcyxcbiAgICAgICAgICAgIGRlZmluaW5nVHlwZTogdGhpcy5wYXJlbnQsXG4gICAgICAgICAgfSBhcyBEb2N1bWVudGFibGVBcmd1bWVudCksXG4gICAgICApXG4gICAgICAvLyBJZiB0aGVyZSdzIGxpZnRlZFByb3BzLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgc3RydWN0IGFuZCBpdCB3b24ndCBiZSBfYWN0dWFsbHlfIGVtaXR0ZWQuXG4gICAgICAuZmlsdGVyKChfLCBpbmRleCkgPT5cbiAgICAgICAgdGhpcy5saWZ0ZWRQcm9wICE9IG51bGwgPyBpbmRleCA8IHRoaXMucGFyYW1ldGVycy5sZW5ndGggLSAxIDogdHJ1ZSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHBhcmFtKSA9PiAoe1xuICAgICAgICAuLi5wYXJhbSxcbiAgICAgICAgbmFtZTogdG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUsIGxpZnRlZFByb3BOYW1lcyksXG4gICAgICB9KSk7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgbGlmdGVkIHBhcmFtZXRlciwgdGhlbiB3ZSdsbCBkcm9wIHRoZSBsYXN0IGFyZ3VtZW50IHRvIG91ciBwYXJhbXNcbiAgICAvLyBhbmQgdGhlbiB3ZSdsbCBsaWZ0IGFsbCBvZiB0aGUgcGFyYW1zIG9mIHRoZSBsaWZ0ZWQgdHlwZSBhcyBrZXl3b3JkIGFyZ3VtZW50c1xuICAgIC8vIHRvIHRoZSBmdW5jdGlvbi5cbiAgICBpZiAodGhpcy5saWZ0ZWRQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlbW92ZSBvdXIgbGFzdCBpdGVtLlxuICAgICAgcHl0aG9uUGFyYW1zLnBvcCgpO1xuICAgICAgY29uc3QgbGlmdGVkUHJvcGVydGllcyA9IHRoaXMuZ2V0TGlmdGVkUHJvcGVydGllcyhjb250ZXh0LnJlc29sdmVyKTtcblxuICAgICAgaWYgKGxpZnRlZFByb3BlcnRpZXMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgLy8gQWxsIG9mIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGtleXdvcmQgb25seSBhcmd1bWVudHMsIHNvIHdlJ2xsIG1hcmsgdGhlbVxuICAgICAgICAvLyBhcyBzdWNoLlxuICAgICAgICBweXRob25QYXJhbXMucHVzaCgnKicpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgb2Ygb3VyIHByb3BzLCBhbmQgcmVmbGVjdCB0aGVtIGludG8gb3VyIHBhcmFtcy5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGxpZnRlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUocHJvcC5wcm9wLm5hbWUpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvVHlwZU5hbWUocHJvcC5wcm9wKS5weXRob25UeXBlKHtcbiAgICAgICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgICAgICBwYXJhbWV0ZXJUeXBlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBhcmFtRGVmYXVsdCA9IHByb3AucHJvcC5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuXG4gICAgICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCR7cGFyYW1OYW1lfTogJHtwYXJhbVR5cGV9JHtwYXJhbURlZmF1bHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRG9jdW1lbnQgdGhlbSBhcyBrZXl3b3JkIGFyZ3VtZW50c1xuICAgICAgZG9jdW1lbnRhYmxlQXJncy5wdXNoKFxuICAgICAgICAuLi5saWZ0ZWRQcm9wZXJ0aWVzLm1hcChcbiAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgIG5hbWU6IHAucHJvcC5uYW1lLFxuICAgICAgICAgICAgICBkb2NzOiBwLnByb3AuZG9jcyxcbiAgICAgICAgICAgICAgZGVmaW5pbmdUeXBlOiBwLmRlZmluaW5nVHlwZSxcbiAgICAgICAgICAgIH0gYXMgRG9jdW1lbnRhYmxlQXJndW1lbnQpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCA+PSAxICYmXG4gICAgICB0aGlzLnBhcmFtZXRlcnNbdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdLnZhcmlhZGljXG4gICAgKSB7XG4gICAgICAvLyBBbm90aGVyIHNpdHVhdGlvbiB3ZSBjb3VsZCBiZSBpbiwgaXMgdGhhdCBpbnN0ZWFkIG9mIGhhdmluZyBhIHBsYWluIHBhcmFtZXRlclxuICAgICAgLy8gd2UgaGF2ZSBhIHZhcmlhZGljIHBhcmFtZXRlciB3aGVyZSB3ZSBuZWVkIHRvIGV4cGFuZCB0aGUgbGFzdCBwYXJhbWV0ZXIgYXMgYVxuICAgICAgLy8gKmFyZ3MuXG4gICAgICBweXRob25QYXJhbXMucG9wKCk7XG5cbiAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnMuc2xpY2UoLTEpWzBdO1xuICAgICAgY29uc3QgcGFyYW1OYW1lID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKGxhc3RQYXJhbWV0ZXIubmFtZSk7XG4gICAgICBjb25zdCBwYXJhbVR5cGUgPSB0b1R5cGVOYW1lKGxhc3RQYXJhbWV0ZXIudHlwZSkucHl0aG9uVHlwZShjb250ZXh0KTtcblxuICAgICAgcHl0aG9uUGFyYW1zLnB1c2goYCoke3BhcmFtTmFtZX06ICR7cGFyYW1UeXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29yYXRvcnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKHRoaXMuanNOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBuZWVkZWQgYmVjYXVzZSBteXB5IGRvZXMgbm90IGtub3cgaG93IHRvIGNoZWNrIGRlY29yYXRlZCBkZWNsYXJhdGlvbnNcbiAgICAgIGRlY29yYXRvcnMucHVzaChgQGpzaWkubWVtYmVyKGpzaWlfbmFtZT1cIiR7dGhpcy5qc05hbWV9XCIpYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVjb3JhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChgQCR7dGhpcy5kZWNvcmF0b3J9YCk7XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlckFic3RyYWN0ICYmIHRoaXMuYWJzdHJhY3QpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaCgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgIH1cblxuICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBuZWVkZWQgYmVjYXVzZSBteXB5IGRvZXMgbm90IGtub3cgaG93IHRvIGNoZWNrIGRlY29yYXRlZCBkZWNsYXJhdGlvbnNcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnNcbiAgICAgICAgLmpvaW4oJyAjIHR5cGU6IGlnbm9yZVttaXNjXVxcbicpXG4gICAgICAgIC5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgY29kZS5saW5lKGRlY29yYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHl0aG9uUGFyYW1zLnVuc2hpZnQoXG4gICAgICBzbHVnaWZ5QXNOZWVkZWQoXG4gICAgICAgIHRoaXMuaW1wbGljaXRQYXJhbWV0ZXIsXG4gICAgICAgIHB5dGhvblBhcmFtcy5tYXAoKHBhcmFtKSA9PiBwYXJhbS5zcGxpdCgnOicpWzBdLnRyaW0oKSksXG4gICAgICApLFxuICAgICk7XG5cbiAgICBvcGVuU2lnbmF0dXJlKFxuICAgICAgY29kZSxcbiAgICAgICdkZWYnLFxuICAgICAgdGhpcy5weXRob25OYW1lLFxuICAgICAgcHl0aG9uUGFyYW1zLFxuICAgICAgZmFsc2UsXG4gICAgICByZXR1cm5UeXBlLFxuICAgICk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGFyZ3VtZW50czogZG9jdW1lbnRhYmxlQXJncyxcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBtZXRob2QtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRCb2R5KFxuICAgICAgY29kZSxcbiAgICAgIGNvbnRleHQsXG4gICAgICByZW5kZXJBYnN0cmFjdCxcbiAgICAgIGZvcmNlRW1pdEJvZHksXG4gICAgICBsaWZ0ZWRQcm9wTmFtZXMsXG4gICAgICBweXRob25QYXJhbXNbMF0sXG4gICAgICByZXR1cm5UeXBlLFxuICAgICk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRCb2R5KFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICByZW5kZXJBYnN0cmFjdDogYm9vbGVhbixcbiAgICBmb3JjZUVtaXRCb2R5OiBib29sZWFuLFxuICAgIGxpZnRlZFByb3BOYW1lczogU2V0PHN0cmluZz4sXG4gICAgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyxcbiAgICByZXR1cm5UeXBlOiBzdHJpbmcsXG4gICkge1xuICAgIGlmIChcbiAgICAgICghdGhpcy5zaG91bGRFbWl0Qm9keSAmJiAhZm9yY2VFbWl0Qm9keSkgfHxcbiAgICAgIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKCcuLi4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubGlmdGVkUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW1pdEF1dG9Qcm9wcyhjb2RlLCBjb250ZXh0LCBsaWZ0ZWRQcm9wTmFtZXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXRKc2lpTWV0aG9kQ2FsbChcbiAgICAgICAgY29kZSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbGlmdGVkUHJvcE5hbWVzLFxuICAgICAgICBpbXBsaWNpdFBhcmFtZXRlcixcbiAgICAgICAgcmV0dXJuVHlwZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXV0b1Byb3BzKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICApIHtcbiAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gdGhpcy5wYXJhbWV0ZXJzLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBhcmdOYW1lID0gdG9QeXRob25QYXJhbWV0ZXJOYW1lKGxhc3RQYXJhbWV0ZXIubmFtZSwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobGFzdFBhcmFtZXRlci50eXBlKS5weXRob25UeXBlKHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBwcm9wZXJ0aWVzLCB3aGljaCBhcmUgbWFuZGF0b3J5LCB0aGVzZSBhcmUgdGhlXG4gICAgLy8gb25lcyB3ZSB3aWxsIHNwZWNpZml5IHRvIHN0YXJ0IHdpdGggaW4gb3VyIGRpY3Rpb25hcnkgbGl0ZXJhbC5cbiAgICBjb25zdCBsaWZ0ZWRQcm9wcyA9IHRoaXMuZ2V0TGlmdGVkUHJvcGVydGllcyhjb250ZXh0LnJlc29sdmVyKS5tYXAoXG4gICAgICAocCkgPT4gbmV3IFN0cnVjdEZpZWxkKHRoaXMuZ2VuZXJhdG9yLCBwLnByb3AsIHAuZGVmaW5pbmdUeXBlKSxcbiAgICApO1xuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gbGlmdGVkUHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHAucHl0aG9uTmFtZSlcbiAgICAgIC5tYXAoKHYpID0+IGAke3Z9PSR7dn1gKTtcblxuICAgIGFzc2lnbkNhbGxSZXN1bHQoY29kZSwgYXJnTmFtZSwgdHlwZU5hbWUsIGFzc2lnbm1lbnRzKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEpzaWlNZXRob2RDYWxsKFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgICBsaWZ0ZWRQcm9wTmFtZXM6IFNldDxzdHJpbmc+LFxuICAgIGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZTogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBtZXRob2RQcmVmaXg6IHN0cmluZyA9IHRoaXMucmV0dXJuRnJvbUpTSUlNZXRob2QgPyAncmV0dXJuICcgOiAnJztcblxuICAgIGNvbnN0IGpzaWlNZXRob2RQYXJhbXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuY2xhc3NBc0ZpcnN0UGFyYW1ldGVyKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBub3Qga25vd24uJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1N0YXRpYykge1xuICAgICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goXG4gICAgICAgICAgdG9UeXBlTmFtZSh0aGlzLnBhcmVudCkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNpbmcgdGhlIGR5bmFtaWMgY2xhc3Mgb2YgYHNlbGZgLlxuICAgICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll9fY2xhc3NfX2ApO1xuICAgICAgfVxuICAgIH1cbiAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goaW1wbGljaXRQYXJhbWV0ZXIpO1xuICAgIGlmICh0aGlzLmpzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBqc2lpTWV0aG9kUGFyYW1zLnB1c2goYFwiJHt0aGlzLmpzTmFtZX1cImApO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBsYXN0IGFyZyBpcyB2YXJpYWRpYywgZXhwYW5kIHRoZSB0dXBsZVxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHRoaXMucGFyYW1ldGVycykge1xuICAgICAgbGV0IGV4cHIgPSB0b1B5dGhvblBhcmFtZXRlck5hbWUocGFyYW0ubmFtZSwgbGlmdGVkUHJvcE5hbWVzKTtcbiAgICAgIGlmIChwYXJhbS52YXJpYWRpYykge1xuICAgICAgICBleHByID0gYCoke2V4cHJ9YDtcbiAgICAgIH1cbiAgICAgIHBhcmFtcy5wdXNoKGV4cHIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gYGpzaWkuJHt0aGlzLmpzaWlNZXRob2R9KCR7anNpaU1ldGhvZFBhcmFtcy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfSwgWyR7cGFyYW1zLmpvaW4oJywgJyl9XSlgO1xuICAgIGNvZGUubGluZShcbiAgICAgIGAke21ldGhvZFByZWZpeH0ke1xuICAgICAgICB0aGlzLnJldHVybkZyb21KU0lJTWV0aG9kICYmIHJldHVyblR5cGVcbiAgICAgICAgICA/IGB0eXBpbmcuY2FzdCgke3JldHVyblR5cGV9LCAke3ZhbHVlfSlgXG4gICAgICAgICAgOiB2YWx1ZVxuICAgICAgfWAsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGlmdGVkUHJvcGVydGllcyhyZXNvbHZlcjogVHlwZVJlc29sdmVyKTogUHJvcGVydHlEZWZpbml0aW9uW10ge1xuICAgIGNvbnN0IGxpZnRlZFByb3BlcnRpZXM6IFByb3BlcnR5RGVmaW5pdGlvbltdID0gW107XG5cbiAgICBjb25zdCBzdGFjayA9IFt0aGlzLmxpZnRlZFByb3BdO1xuICAgIGNvbnN0IGtub3duSWZhY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qga25vd25Qcm9wcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoXG4gICAgICBsZXQgY3VycmVudCA9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICBjdXJyZW50ICE9IG51bGw7XG4gICAgICBjdXJyZW50ID0gc3RhY2suc2hpZnQoKVxuICAgICkge1xuICAgICAga25vd25JZmFjZXMuYWRkKGN1cnJlbnQuZnFuKTtcblxuICAgICAgLy8gQWRkIGFueSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBpbnRlcmZhY2UgZGVwZW5kcyBvbiwgdG8gdGhlIGxpc3QuXG4gICAgICBpZiAoY3VycmVudC5pbnRlcmZhY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZmFjZSBvZiBjdXJyZW50LmludGVyZmFjZXMpIHtcbiAgICAgICAgICBpZiAoa25vd25JZmFjZXMuaGFzKGlmYWNlKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2gocmVzb2x2ZXIuZGVyZWZlcmVuY2UoaWZhY2UpIGFzIHNwZWMuSW50ZXJmYWNlVHlwZSk7XG4gICAgICAgICAga25vd25JZmFjZXMuYWRkKGlmYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgaW50ZXJmYWNlIHRvIG91ciBsaXN0IG9mIHByb3BlcnRpZXMuXG4gICAgICBpZiAoY3VycmVudC5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGN1cnJlbnQucHJvcGVydGllcykge1xuICAgICAgICAgIGlmIChrbm93blByb3BzLmhhcyhwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlmdGVkUHJvcGVydGllcy5wdXNoKHsgcHJvcCwgZGVmaW5pbmdUeXBlOiBjdXJyZW50IH0pO1xuICAgICAgICAgIGtub3duUHJvcHMuYWRkKHByb3AubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGlmdGVkUHJvcGVydGllcztcbiAgfVxufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5T3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgaXNTdGF0aWM/OiBib29sZWFuO1xuICBwYXJlbnQ6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlO1xufVxuXG5pbnRlcmZhY2UgQmFzZVByb3BlcnR5RW1pdE9wdHMge1xuICByZW5kZXJBYnN0cmFjdD86IGJvb2xlYW47XG4gIGZvcmNlRW1pdEJvZHk/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCYXNlUHJvcGVydHkgaW1wbGVtZW50cyBQeXRob25CYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFic3RyYWN0OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNTdGF0aWM6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2QhOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpU2V0TWV0aG9kITogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW1tdXRhYmxlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudDogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2U7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHB5dGhvbk5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpzTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZTogc3BlYy5PcHRpb25hbFZhbHVlLFxuICAgIHB1YmxpYyByZWFkb25seSBkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQsXG4gICAgb3B0czogQmFzZVByb3BlcnR5T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbW11dGFibGUgPSBmYWxzZSwgaXNTdGF0aWMgPSBmYWxzZSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmltbXV0YWJsZSA9IGltbXV0YWJsZTtcbiAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7XG4gICAgdGhpcy5wYXJlbnQgPSBvcHRzLnBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBpTG9jYXRpb24oKTogQXBpTG9jYXRpb24ge1xuICAgIHJldHVybiB7IGFwaTogJ21lbWJlcicsIGZxbjogdGhpcy5wYXJlbnQuZnFuLCBtZW1iZXJOYW1lOiB0aGlzLmpzTmFtZSB9O1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoXG4gICAgY29kZTogQ29kZU1ha2VyLFxuICAgIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICAgIG9wdHM/OiBCYXNlUHJvcGVydHlFbWl0T3B0cyxcbiAgKSB7XG4gICAgY29uc3QgeyByZW5kZXJBYnN0cmFjdCA9IHRydWUsIGZvcmNlRW1pdEJvZHkgPSBmYWxzZSB9ID0gb3B0cyA/PyB7fTtcbiAgICBjb25zdCBweXRob25UeXBlID0gdG9UeXBlTmFtZSh0aGlzLnR5cGUpLnB5dGhvblR5cGUoY29udGV4dCk7XG5cbiAgICAvLyBcIiMgdHlwZTogaWdub3JlW21pc2NdXCIgaXMgbmVlZGVkIGJlY2F1c2UgbXlweSBjYW5ub3QgY2hlY2sgZGVjb3JhdGVkIHRoaW5nc1xuICAgIGNvZGUubGluZShgQCR7dGhpcy5kZWNvcmF0b3J9ICMgdHlwZTogaWdub3JlW21pc2NdYCk7XG4gICAgY29kZS5saW5lKGBAanNpaS5tZW1iZXIoanNpaV9uYW1lPVwiJHt0aGlzLmpzTmFtZX1cIilgKTtcbiAgICBpZiAocmVuZGVyQWJzdHJhY3QgJiYgdGhpcy5hYnN0cmFjdCkge1xuICAgICAgY29kZS5saW5lKCdAYWJjLmFic3RyYWN0bWV0aG9kJyk7XG4gICAgfVxuICAgIG9wZW5TaWduYXR1cmUoXG4gICAgICBjb2RlLFxuICAgICAgJ2RlZicsXG4gICAgICB0aGlzLnB5dGhvbk5hbWUsXG4gICAgICBbdGhpcy5pbXBsaWNpdFBhcmFtZXRlcl0sXG4gICAgICB0cnVlLFxuICAgICAgcHl0aG9uVHlwZSxcbiAgICApO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgcHJvcC0ke3RoaXMucHl0aG9uTmFtZX1gLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICh0aGlzLnNob3VsZEVtaXRCb2R5IHx8IGZvcmNlRW1pdEJvZHkpICYmXG4gICAgICAoIXJlbmRlckFic3RyYWN0IHx8ICF0aGlzLmFic3RyYWN0KVxuICAgICkge1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgcmV0dXJuIHR5cGluZy5jYXN0KCR7cHl0aG9uVHlwZX0sIGpzaWkuJHt0aGlzLmpzaWlHZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIikpYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgfVxuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgaWYgKCF0aGlzLmltbXV0YWJsZSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoXG4gICAgICAgIGBAJHt0aGlzLnB5dGhvbk5hbWV9LnNldHRlciR7XG4gICAgICAgICAgdGhpcy5pc1N0YXRpYyA/ICcgIyB0eXBlOiBpZ25vcmVbbm8tcmVkZWZdJyA6ICcnXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICAgIGlmIChyZW5kZXJBYnN0cmFjdCAmJiB0aGlzLmFic3RyYWN0KSB7XG4gICAgICAgIGNvZGUubGluZSgnQGFiYy5hYnN0cmFjdG1ldGhvZCcpO1xuICAgICAgfVxuICAgICAgb3BlblNpZ25hdHVyZShcbiAgICAgICAgY29kZSxcbiAgICAgICAgJ2RlZicsXG4gICAgICAgIHRoaXMucHl0aG9uTmFtZSxcbiAgICAgICAgW3RoaXMuaW1wbGljaXRQYXJhbWV0ZXIsIGB2YWx1ZTogJHtweXRob25UeXBlfWBdLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgJ05vbmUnLFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuc2hvdWxkRW1pdEJvZHkgfHwgZm9yY2VFbWl0Qm9keSkgJiZcbiAgICAgICAgKCFyZW5kZXJBYnN0cmFjdCB8fCAhdGhpcy5hYnN0cmFjdClcbiAgICAgICkge1xuICAgICAgICBjb2RlLmxpbmUoXG4gICAgICAgICAgYGpzaWkuJHt0aGlzLmpzaWlTZXRNZXRob2R9KCR7dGhpcy5pbXBsaWNpdFBhcmFtZXRlcn0sIFwiJHt0aGlzLmpzTmFtZX1cIiwgdmFsdWUpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvZGUubGluZSgnLi4uJyk7XG4gICAgICB9XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgSW50ZXJmYWNlIGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmludGVyZmFjZSgnLCBbYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgXSwgJyknKTtcblxuICAgIC8vIEZpcnN0IHdlIGRvIG91ciBub3JtYWwgY2xhc3MgbG9naWMgZm9yIGVtaXR0aW5nIG91ciBtZW1iZXJzLlxuICAgIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG5cbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoKTtcblxuICAgIC8vIFRoZW4sIHdlIGhhdmUgdG8gZW1pdCBhIFByb3h5IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgb3VyIHByb3h5IGludGVyZmFjZS5cbiAgICBjb25zdCBwcm94eUJhc2VzOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKFxuICAgICAgKGIpID0+XG4gICAgICAgIC8vIFwiIyB0eXBlOiBpZ25vcmVbbWlzY11cIiBiZWNhdXNlIE15UHkgY2Fubm90IGNoZWNrIGR5bmFtaWMgYmFzZSBjbGFzc2VzIChuYXR1cmFsbHkpXG4gICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7XG4gICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICB0eXBlQW5ub3RhdGlvbjogZmFsc2UsXG4gICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcbiAgICB0aGlzLmdlbmVyYXRvci5lbWl0RG9jU3RyaW5nKGNvZGUsIHRoaXMuYXBpTG9jYXRpb24sIHRoaXMuZG9jcywge1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbTogYGNsYXNzLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgICB0cmFpbGluZ05ld0xpbmU6IHRydWUsXG4gICAgfSk7XG4gICAgY29kZS5saW5lKGBfX2pzaWlfdHlwZV9fOiB0eXBpbmcuQ2xhc3NWYXJbc3RyXSA9IFwiJHt0aGlzLmZxbn1cImApO1xuXG4gICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLm1lbWJlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VwYXJhdGVNZW1iZXJzKSB7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVtYmVyLmVtaXQoY29kZSwgY29udGV4dCwgeyBmb3JjZUVtaXRCb2R5OiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICBjb2RlLmxpbmUoKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICAnIyBBZGRpbmcgYSBcIl9fanNpaV9wcm94eV9jbGFzc19fKCk6IHR5cGluZy5UeXBlXCIgZnVuY3Rpb24gdG8gdGhlIGludGVyZmFjZScsXG4gICAgKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG5cbiAgICBwYXJhbXMucHVzaCgndHlwaW5nX2V4dGVuc2lvbnMuUHJvdG9jb2wnKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBJbnRlcmZhY2VNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnaW52b2tlJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZEVtaXRCb2R5OiBib29sZWFuID0gZmFsc2U7XG59XG5cbmNsYXNzIEludGVyZmFjZVByb3BlcnR5IGV4dGVuZHMgQmFzZVByb3BlcnR5IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcjogc3RyaW5nID0gJ2J1aWx0aW5zLnByb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnc2VsZic7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpR2V0TWV0aG9kOiBzdHJpbmcgPSAnZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkRW1pdEJvZHk6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgU3RydWN0IGV4dGVuZHMgQmFzZVB5dGhvbkNsYXNzVHlwZSB7XG4gIHByb3RlY3RlZCBkaXJlY3RNZW1iZXJzID0gbmV3IEFycmF5PFN0cnVjdEZpZWxkPigpO1xuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKTogdm9pZCB7XG4gICAgaWYgKCEobWVtYmVyIGluc3RhbmNlb2YgU3RydWN0RmllbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYWRkIFN0cnVjdEZpZWxkIHRvIFN0cnVjdCcpO1xuICAgIH1cbiAgICB0aGlzLmRpcmVjdE1lbWJlcnMucHVzaChtZW1iZXIpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBjb250ZXh0OiBFbWl0Q29udGV4dCkge1xuICAgIGNvbnRleHQgPSBuZXN0ZWRDb250ZXh0KGNvbnRleHQsIHRoaXMuZnFuKTtcbiAgICBjb25zdCBiYXNlSW50ZXJmYWNlcyA9IHRoaXMuZ2V0Q2xhc3NQYXJhbXMoY29udGV4dCk7XG5cbiAgICBjb2RlLmluZGVudCgnQGpzaWkuZGF0YV90eXBlKCcpO1xuICAgIGNvZGUubGluZShganNpaV90eXBlPSR7SlNPTi5zdHJpbmdpZnkodGhpcy5mcW4pfSxgKTtcbiAgICBlbWl0TGlzdChjb2RlLCAnanNpaV9zdHJ1Y3RfYmFzZXM9WycsIGJhc2VJbnRlcmZhY2VzLCAnXSwnKTtcbiAgICBhc3NpZ25EaWN0aW9uYXJ5KGNvZGUsICduYW1lX21hcHBpbmcnLCB0aGlzLnByb3BlcnR5TWFwKCksICcsJywgdHJ1ZSk7XG4gICAgY29kZS51bmluZGVudCgnKScpO1xuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2NsYXNzJywgdGhpcy5weXRob25OYW1lLCBiYXNlSW50ZXJmYWNlcyk7XG4gICAgdGhpcy5lbWl0Q29uc3RydWN0b3IoY29kZSwgY29udGV4dCk7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgdGhpcy5lbWl0R2V0dGVyKG1lbWJlciwgY29kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbWl0TWFnaWNNZXRob2RzKGNvZGUpO1xuXG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAodGhpcy5mcW4gIT0gbnVsbCkge1xuICAgICAgY29udGV4dC5lbWl0dGVkVHlwZXMuYWRkKHRoaXMuZnFuKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIHN1cGVyLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgIC4uLnRoaXMuYWxsTWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDbGFzc1BhcmFtcyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlcy5tYXAoKGIpID0+XG4gICAgICB0b1R5cGVOYW1lKGIpLnB5dGhvblR5cGUoeyAuLi5jb250ZXh0LCB0eXBlQW5ub3RhdGlvbjogZmFsc2UgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCBmaWVsZHMgKGluaGVyaXRlZCBhcyB3ZWxsKVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYWxsTWVtYmVycygpOiBTdHJ1Y3RGaWVsZFtdIHtcbiAgICByZXR1cm4gdGhpcy50aGlzSW50ZXJmYWNlLmFsbFByb3BlcnRpZXMubWFwKFxuICAgICAgKHgpID0+IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLmdlbmVyYXRvciwgeC5zcGVjLCB4LmRlZmluaW5nVHlwZS5zcGVjKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgdGhpc0ludGVyZmFjZSgpIHtcbiAgICBpZiAodGhpcy5mcW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGUU4gbm90IHNldCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3IucmVmbGVjdEFzc2VtYmx5LnN5c3RlbS5maW5kSW50ZXJmYWNlKHRoaXMuZnFuKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtZW1iZXJzID0gdGhpcy5hbGxNZW1iZXJzO1xuXG4gICAgY29uc3Qga3dhcmdzID0gbWVtYmVycy5tYXAoKG0pID0+IG0uY29uc3RydWN0b3JEZWNsKGNvbnRleHQpKTtcblxuICAgIGNvbnN0IGltcGxpY2l0UGFyYW1ldGVyID0gc2x1Z2lmeUFzTmVlZGVkKFxuICAgICAgJ3NlbGYnLFxuICAgICAgbWVtYmVycy5tYXAoKG0pID0+IG0ucHl0aG9uTmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBjb25zdHJ1Y3RvckFyZ3VtZW50cyA9XG4gICAgICBrd2FyZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IFtpbXBsaWNpdFBhcmFtZXRlciwgJyonLCAuLi5rd2FyZ3NdXG4gICAgICAgIDogW2ltcGxpY2l0UGFyYW1ldGVyXTtcblxuICAgIG9wZW5TaWduYXR1cmUoY29kZSwgJ2RlZicsICdfX2luaXRfXycsIGNvbnN0cnVjdG9yQXJndW1lbnRzLCBmYWxzZSwgJ05vbmUnKTtcbiAgICB0aGlzLmVtaXRDb25zdHJ1Y3RvckRvY3N0cmluZyhjb2RlKTtcblxuICAgIC8vIFJlLXR5cGUgc3RydWN0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIFwiZGljdFwiXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0uaXNTdHJ1Y3QodGhpcy5nZW5lcmF0b3IpKSkge1xuICAgICAgLy8gTm90ZSB0aGF0IFwiTm9uZVwiIGlzIE5PVCBhbiBpbnN0YW5jZSBvZiBkaWN0ICh0aGF0J3MgY29udmVuaWVudCEpXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRvVHlwZU5hbWUobWVtYmVyLnR5cGUudHlwZSkucHl0aG9uVHlwZSh7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29kZS5vcGVuQmxvY2soYGlmIGlzaW5zdGFuY2UoJHttZW1iZXIucHl0aG9uTmFtZX0sIGRpY3QpYCk7XG4gICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyLnB5dGhvbk5hbWV9ID0gJHt0eXBlTmFtZX0oKioke21lbWJlci5weXRob25OYW1lfSlgKTtcbiAgICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICAgIH1cblxuICAgIC8vIFJlcXVpcmVkIHByb3BlcnRpZXMsIHRob3NlIHdpbGwgYWx3YXlzIGJlIHB1dCBpbnRvIHRoZSBkaWN0XG4gICAgYXNzaWduRGljdGlvbmFyeShcbiAgICAgIGNvZGUsXG4gICAgICBgJHtpbXBsaWNpdFBhcmFtZXRlcn0uX3ZhbHVlczogdHlwaW5nLkRpY3Rbc3RyLCB0eXBpbmcuQW55XWAsXG4gICAgICBtZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICFtLm9wdGlvbmFsKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChtZW1iZXIpID0+XG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke21lbWJlci5weXRob25OYW1lfWAsXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIE9wdGlvbmFsIHByb3BlcnRpZXMsIHdpbGwgb25seSBiZSBwdXQgaW50byB0aGUgZGljdCBpZiB0aGV5J3JlIG5vdCBOb25lXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycy5maWx0ZXIoKG0pID0+IG0ub3B0aW9uYWwpKSB7XG4gICAgICBjb2RlLm9wZW5CbG9jayhgaWYgJHttZW1iZXIucHl0aG9uTmFtZX0gaXMgbm90IE5vbmVgKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYCR7aW1wbGljaXRQYXJhbWV0ZXJ9Ll92YWx1ZXNbXCIke21lbWJlci5weXRob25OYW1lfVwiXSA9ICR7bWVtYmVyLnB5dGhvbk5hbWV9YCxcbiAgICAgICk7XG4gICAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgICB9XG5cbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENvbnN0cnVjdG9yRG9jc3RyaW5nKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvbnN0IGFyZ3M6IERvY3VtZW50YWJsZUFyZ3VtZW50W10gPSB0aGlzLmFsbE1lbWJlcnMubWFwKChtKSA9PiAoe1xuICAgICAgbmFtZTogbS5weXRob25OYW1lLFxuICAgICAgZG9jczogbS5kb2NzLFxuICAgICAgZGVmaW5pbmdUeXBlOiB0aGlzLnNwZWMsXG4gICAgfSkpO1xuICAgIHRoaXMuZ2VuZXJhdG9yLmVtaXREb2NTdHJpbmcoY29kZSwgdGhpcy5hcGlMb2NhdGlvbiwgdGhpcy5kb2NzLCB7XG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgICBkb2N1bWVudGFibGVJdGVtOiBgY2xhc3MtJHt0aGlzLnB5dGhvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEdldHRlcihcbiAgICBtZW1iZXI6IFN0cnVjdEZpZWxkLFxuICAgIGNvZGU6IENvZGVNYWtlcixcbiAgICBjb250ZXh0OiBFbWl0Q29udGV4dCxcbiAgKSB7XG4gICAgY29uc3QgcHl0aG9uVHlwZSA9IG1lbWJlci50eXBlQW5ub3RhdGlvbihjb250ZXh0KTtcblxuICAgIGNvZGUubGluZSgnQGJ1aWx0aW5zLnByb3BlcnR5Jyk7XG4gICAgb3BlblNpZ25hdHVyZShjb2RlLCAnZGVmJywgbWVtYmVyLnB5dGhvbk5hbWUsIFsnc2VsZiddLCB0cnVlLCBweXRob25UeXBlKTtcbiAgICBtZW1iZXIuZW1pdERvY1N0cmluZyhjb2RlKTtcbiAgICBjb2RlLmxpbmUoXG4gICAgICBgcmVzdWx0ID0gc2VsZi5fdmFsdWVzLmdldCgke0pTT04uc3RyaW5naWZ5KG1lbWJlci5weXRob25OYW1lKX0pYCxcbiAgICApO1xuICAgIGlmICghbWVtYmVyLm9wdGlvbmFsKSB7XG4gICAgICAvLyBBZGQgYW4gYXNzZXJ0aW9uIHRvIG1heWUgTXlQWSBoYXBweSFcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgYGFzc2VydCByZXN1bHQgaXMgbm90IE5vbmUsIFwiUmVxdWlyZWQgcHJvcGVydHkgJyR7bWVtYmVyLnB5dGhvbk5hbWV9JyBpcyBtaXNzaW5nXCJgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29kZS5saW5lKGByZXR1cm4gdHlwaW5nLmNhc3QoJHtweXRob25UeXBlfSwgcmVzdWx0KWApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TWFnaWNNZXRob2RzKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19lcV9fKHNlbGYsIHJoczogdHlwaW5nLkFueSkgLT4gYnVpbHRpbnMuYm9vbCcpO1xuICAgIGNvZGUubGluZShcbiAgICAgICdyZXR1cm4gaXNpbnN0YW5jZShyaHMsIHNlbGYuX19jbGFzc19fKSBhbmQgcmhzLl92YWx1ZXMgPT0gc2VsZi5fdmFsdWVzJyxcbiAgICApO1xuICAgIGNvZGUuY2xvc2VCbG9jaygpO1xuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5vcGVuQmxvY2soJ2RlZiBfX25lX18oc2VsZiwgcmhzOiB0eXBpbmcuQW55KSAtPiBidWlsdGlucy5ib29sJyk7XG4gICAgY29kZS5saW5lKCdyZXR1cm4gbm90IChyaHMgPT0gc2VsZiknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcblxuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCdkZWYgX19yZXByX18oc2VsZikgLT4gc3RyJyk7XG4gICAgY29kZS5pbmRlbnQoYHJldHVybiBcIiR7dGhpcy5weXRob25OYW1lfSglcylcIiAlIFwiLCBcIi5qb2luKGApO1xuICAgIGNvZGUubGluZSgnayArIFwiPVwiICsgcmVwcih2KSBmb3IgaywgdiBpbiBzZWxmLl92YWx1ZXMuaXRlbXMoKScpO1xuICAgIGNvZGUudW5pbmRlbnQoJyknKTtcbiAgICBjb2RlLmNsb3NlQmxvY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlNYXAoKSB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiB0aGlzLmFsbE1lbWJlcnMpIHtcbiAgICAgIHJldC5wdXNoKFxuICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShtZW1iZXIucHl0aG9uTmFtZSl9OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIG1lbWJlci5qc2lpTmFtZSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuXG5jbGFzcyBTdHJ1Y3RGaWVsZCBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkganNpaU5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRvY3M/OiBzcGVjLkRvY3M7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBzcGVjLk9wdGlvbmFsVmFsdWU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdG9yOiBQeXRob25HZW5lcmF0b3IsXG4gICAgcHVibGljIHJlYWRvbmx5IHByb3A6IHNwZWMuUHJvcGVydHksXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWZpbmluZ1R5cGU6IHNwZWMuVHlwZSxcbiAgKSB7XG4gICAgdGhpcy5weXRob25OYW1lID0gdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lKTtcbiAgICB0aGlzLmpzaWlOYW1lID0gcHJvcC5uYW1lO1xuICAgIHRoaXMudHlwZSA9IHByb3A7XG4gICAgdGhpcy5kb2NzID0gcHJvcC5kb2NzO1xuICB9XG5cbiAgcHVibGljIGdldCBhcGlMb2NhdGlvbigpOiBBcGlMb2NhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaTogJ21lbWJlcicsXG4gICAgICBmcW46IHRoaXMuZGVmaW5pbmdUeXBlLmZxbixcbiAgICAgIG1lbWJlck5hbWU6IHRoaXMuanNpaU5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb3B0aW9uYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlLm9wdGlvbmFsO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB0b1R5cGVOYW1lKHRoaXMudHlwZSkucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGlzU3RydWN0KGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU3RydWN0KGdlbmVyYXRvci5yZWZsZWN0QXNzZW1ibHkuc3lzdGVtLCB0aGlzLnR5cGUudHlwZSk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3JEZWNsKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3Qgb3B0ID0gdGhpcy5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnO1xuICAgIHJldHVybiBgJHt0aGlzLnB5dGhvbk5hbWV9OiAke3RoaXMudHlwZUFubm90YXRpb24oe1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHBhcmFtZXRlclR5cGU6IHRydWUsXG4gICAgfSl9JHtvcHR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFB5dGhvbiB0eXBlIGFubm90YXRpb24gZm9yIHRoaXMgdHlwZVxuICAgKi9cbiAgcHVibGljIHR5cGVBbm5vdGF0aW9uKGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgcmV0dXJuIHRvVHlwZU5hbWUodGhpcy50eXBlKS5weXRob25UeXBlKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGVtaXREb2NTdHJpbmcoY29kZTogQ29kZU1ha2VyKSB7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBwcm9wLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdChjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gdGhpcy50eXBlQW5ub3RhdGlvbihjb250ZXh0KTtcbiAgICBjb2RlLmxpbmUoYCR7dGhpcy5weXRob25OYW1lfTogJHtyZXNvbHZlZFR5cGV9YCk7XG4gICAgdGhpcy5lbWl0RG9jU3RyaW5nKGNvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBDbGFzc09wdHMgZXh0ZW5kcyBQeXRob25UeXBlT3B0cyB7XG4gIGFic3RyYWN0PzogYm9vbGVhbjtcbiAgaW50ZXJmYWNlcz86IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG4gIGFic3RyYWN0QmFzZXM/OiBzcGVjLkNsYXNzVHlwZVtdO1xufVxuXG5jbGFzcyBDbGFzcyBleHRlbmRzIEJhc2VQeXRob25DbGFzc1R5cGUgaW1wbGVtZW50cyBJU29ydGFibGVUeXBlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBhYnN0cmFjdEJhc2VzOiBzcGVjLkNsYXNzVHlwZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVyZmFjZXM6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGdlbmVyYXRvcjogUHl0aG9uR2VuZXJhdG9yLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzcGVjOiBzcGVjLlR5cGUsXG4gICAgZnFuOiBzdHJpbmcsXG4gICAgb3B0czogQ2xhc3NPcHRzLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgc3VwZXIoZ2VuZXJhdG9yLCBuYW1lLCBzcGVjLCBmcW4sIG9wdHMsIGRvY3MpO1xuXG4gICAgY29uc3QgeyBhYnN0cmFjdCA9IGZhbHNlLCBpbnRlcmZhY2VzID0gW10sIGFic3RyYWN0QmFzZXMgPSBbXSB9ID0gb3B0cztcblxuICAgIHRoaXMuYWJzdHJhY3QgPSBhYnN0cmFjdDtcbiAgICB0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzO1xuICAgIHRoaXMuYWJzdHJhY3RCYXNlcyA9IGFic3RyYWN0QmFzZXM7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kc09uKHJlc29sdmVyOiBUeXBlUmVzb2x2ZXIpOiBQeXRob25UeXBlW10ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogUHl0aG9uVHlwZVtdID0gc3VwZXIuZGVwZW5kc09uKHJlc29sdmVyKTtcbiAgICBjb25zdCBwYXJlbnQgPSByZXNvbHZlci5nZXRQYXJlbnQodGhpcy5mcW4hKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIGFueSBpZmFjZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgbW9kdWxlIGF0IHRoZSBzYW1lIGxldmVsIG9mXG4gICAgLy8gbmVzdGluZy5cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBpZmFjZSBvZiB0aGlzLmludGVyZmFjZXMpIHtcbiAgICAgIGlmIChyZXNvbHZlci5pc0luTW9kdWxlKGlmYWNlKSkge1xuICAgICAgICAvLyBHaXZlbiBhIGlmYWNlLCB3ZSBuZWVkIHRvIGxvY2F0ZSB0aGUgaWZhY2VzJ3MgcGFyZW50IHRoYXQgaXMgdGhlIHNhbWVcbiAgICAgICAgLy8gYXMgb3VyIHBhcmVudCwgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGF0IHRoZVxuICAgICAgICAvLyBzYW1lIGxldmVsIG9mIG91ciBvd24uXG4gICAgICAgIC8vIFRPRE86IFdlIG1pZ2h0IG5lZWQgdG8gcmVjdXJzZSBpbnRvIG91ciBtZW1iZXJzIHRvIGFsc28gZmluZCB0aGVpclxuICAgICAgICAvLyAgICAgICBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGxldCBpZmFjZUl0ZW0gPSByZXNvbHZlci5nZXRUeXBlKGlmYWNlKTtcbiAgICAgICAgbGV0IGlmYWNlUGFyZW50ID0gcmVzb2x2ZXIuZ2V0UGFyZW50KGlmYWNlKTtcbiAgICAgICAgd2hpbGUgKGlmYWNlUGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgICAgICBpZmFjZUl0ZW0gPSBpZmFjZVBhcmVudDtcbiAgICAgICAgICBpZmFjZVBhcmVudCA9IHJlc29sdmVyLmdldFBhcmVudChpZmFjZUl0ZW0uZnFuISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlZW4uaGFzKGlmYWNlSXRlbS5mcW4hKSkge1xuICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGlmYWNlSXRlbSk7XG4gICAgICAgICAgc2Vlbi5hZGQoaWZhY2VJdGVtLmZxbiEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHB1YmxpYyByZXF1aXJlZEltcG9ydHMoY29udGV4dDogRW1pdENvbnRleHQpOiBQeXRob25JbXBvcnRzIHtcbiAgICByZXR1cm4gbWVyZ2VQeXRob25JbXBvcnRzKFxuICAgICAgc3VwZXIucmVxdWlyZWRJbXBvcnRzKGNvbnRleHQpLCAvLyBUYWtlcyBjYXJlIG9mIGJhc2UgJiBtZW1iZXJzXG4gICAgICAuLi50aGlzLmludGVyZmFjZXMubWFwKChiYXNlKSA9PlxuICAgICAgICB0b1R5cGVOYW1lKGJhc2UpLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICAvLyBGaXJzdCB3ZSBlbWl0IG91ciBpbXBsbWVudHMgZGVjb3JhdG9yXG4gICAgaWYgKHRoaXMuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbnRlcmZhY2VzOiBzdHJpbmdbXSA9IHRoaXMuaW50ZXJmYWNlcy5tYXAoKGIpID0+XG4gICAgICAgIHRvVHlwZU5hbWUoYikucHl0aG9uVHlwZSh7IC4uLmNvbnRleHQsIHR5cGVBbm5vdGF0aW9uOiBmYWxzZSB9KSxcbiAgICAgICk7XG4gICAgICBjb2RlLmxpbmUoYEBqc2lpLmltcGxlbWVudHMoJHtpbnRlcmZhY2VzLmpvaW4oJywgJyl9KWApO1xuICAgIH1cblxuICAgIC8vIFRoZW4gd2UgZG8gb3VyIG5vcm1hbCBjbGFzcyBsb2dpYyBmb3IgZW1pdHRpbmcgb3VyIG1lbWJlcnMuXG4gICAgc3VwZXIuZW1pdChjb2RlLCBjb250ZXh0KTtcblxuICAgIC8vIFRoZW4sIGlmIG91ciBjbGFzcyBpcyBBYnN0cmFjdCwgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIGFuZCByZWRvIGFsbCBvZlxuICAgIC8vIHRoaXMgbG9naWMsIGV4Y2VwdCBvbmx5IGVtaXRpbmcgYWJzdHJhY3QgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcyBub25cbiAgICAvLyBhYnN0cmFjdCwgYW5kIHN1YmNsYXNzaW5nIG91ciBpbml0aWFsIGNsYXNzLlxuICAgIGlmICh0aGlzLmFic3RyYWN0KSB7XG4gICAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG5cbiAgICAgIGNvbnN0IHByb3h5QmFzZXMgPSBbdGhpcy5weXRob25OYW1lXTtcbiAgICAgIGZvciAoY29uc3QgYmFzZSBvZiB0aGlzLmFic3RyYWN0QmFzZXMpIHtcbiAgICAgICAgLy8gXCIjIHR5cGU6IGlnbm9yZVttaXNjXVwiIGJlY2F1c2UgTXlQeSBjYW5ub3QgY2hlY2sgZHluYW1pYyBiYXNlIGNsYXNzZXMgKG5hdHVyYWxseSlcbiAgICAgICAgcHJveHlCYXNlcy5wdXNoKFxuICAgICAgICAgIGBqc2lpLnByb3h5X2Zvcigke3RvVHlwZU5hbWUoYmFzZSkucHl0aG9uVHlwZSh7XG4gICAgICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICAgICAgdHlwZUFubm90YXRpb246IGZhbHNlLFxuICAgICAgICAgIH0pfSkgIyB0eXBlOiBpZ25vcmVbbWlzY11gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgb3BlblNpZ25hdHVyZShjb2RlLCAnY2xhc3MnLCB0aGlzLnByb3h5Q2xhc3NOYW1lLCBwcm94eUJhc2VzKTtcblxuICAgICAgLy8gRmlsdGVyIG91ciBsaXN0IG9mIG1lbWJlcnMgdG8gKm9ubHkqIGJlIGFic3RyYWN0IG1lbWJlcnMsIGFuZCBub3QgYW55XG4gICAgICAvLyBvdGhlciB0eXBlcy5cbiAgICAgIGNvbnN0IGFic3RyYWN0TWVtYmVycyA9IHRoaXMubWVtYmVycy5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIChtIGluc3RhbmNlb2YgQmFzZU1ldGhvZCB8fCBtIGluc3RhbmNlb2YgQmFzZVByb3BlcnR5KSAmJiBtLmFic3RyYWN0LFxuICAgICAgKTtcbiAgICAgIGlmIChhYnN0cmFjdE1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBhYnN0cmFjdE1lbWJlcnMpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZXBhcmF0ZU1lbWJlcnMpIHtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQsIHsgcmVuZGVyQWJzdHJhY3Q6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlLmxpbmUoJ3Bhc3MnKTtcbiAgICAgIH1cblxuICAgICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGNvZGUubGluZShcbiAgICAgICAgJyMgQWRkaW5nIGEgXCJfX2pzaWlfcHJveHlfY2xhc3NfXygpOiB0eXBpbmcuVHlwZVwiIGZ1bmN0aW9uIHRvIHRoZSBhYnN0cmFjdCBjbGFzcycsXG4gICAgICApO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICBgdHlwaW5nLmNhc3QodHlwaW5nLkFueSwgJHt0aGlzLnB5dGhvbk5hbWV9KS5fX2pzaWlfcHJveHlfY2xhc3NfXyA9IGxhbWJkYSA6ICR7dGhpcy5wcm94eUNsYXNzTmFtZX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoY29udGV4dDogRW1pdENvbnRleHQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IHRoaXMuYmFzZXMubWFwKChiKSA9PlxuICAgICAgdG9UeXBlTmFtZShiKS5weXRob25UeXBlKHsgLi4uY29udGV4dCwgdHlwZUFubm90YXRpb246IGZhbHNlIH0pLFxuICAgICk7XG4gICAgY29uc3QgbWV0YWNsYXNzOiBzdHJpbmcgPSB0aGlzLmFic3RyYWN0ID8gJ0pTSUlBYnN0cmFjdENsYXNzJyA6ICdKU0lJTWV0YSc7XG5cbiAgICBwYXJhbXMucHVzaChgbWV0YWNsYXNzPWpzaWkuJHttZXRhY2xhc3N9YCk7XG4gICAgcGFyYW1zLnB1c2goYGpzaWlfdHlwZT1cIiR7dGhpcy5mcW59XCJgKTtcblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBwcm94eUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXyR7dGhpcy5weXRob25OYW1lfVByb3h5YDtcbiAgfVxufVxuXG5jbGFzcyBTdGF0aWNNZXRob2QgZXh0ZW5kcyBCYXNlTWV0aG9kIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlY29yYXRvcj86IHN0cmluZyA9ICdidWlsdGlucy5jbGFzc21ldGhvZCc7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ2Nscyc7XG4gIHByb3RlY3RlZCByZWFkb25seSBqc2lpTWV0aG9kOiBzdHJpbmcgPSAnc2ludm9rZSc7XG59XG5cbmNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2NyZWF0ZSc7XG4gIHByb3RlY3RlZCByZWFkb25seSBjbGFzc0FzRmlyc3RQYXJhbWV0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmV0dXJuRnJvbUpTSUlNZXRob2Q6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuY2xhc3MgTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2ludm9rZSc7XG59XG5cbmNsYXNzIEFzeW5jTWV0aG9kIGV4dGVuZHMgQmFzZU1ldGhvZCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbXBsaWNpdFBhcmFtZXRlcjogc3RyaW5nID0gJ3NlbGYnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaU1ldGhvZDogc3RyaW5nID0gJ2FpbnZva2UnO1xufVxuXG5jbGFzcyBTdGF0aWNQcm9wZXJ0eSBleHRlbmRzIEJhc2VQcm9wZXJ0eSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWNvcmF0b3I6IHN0cmluZyA9ICdqc2lpLnB5dGhvbi5jbGFzc3Byb3BlcnR5JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGltcGxpY2l0UGFyYW1ldGVyOiBzdHJpbmcgPSAnY2xzJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdzZ2V0JztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlTZXRNZXRob2Q6IHN0cmluZyA9ICdzc2V0Jztcbn1cblxuY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBCYXNlUHJvcGVydHkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVjb3JhdG9yOiBzdHJpbmcgPSAnYnVpbHRpbnMucHJvcGVydHknO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW1wbGljaXRQYXJhbWV0ZXI6IHN0cmluZyA9ICdzZWxmJztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGpzaWlHZXRNZXRob2Q6IHN0cmluZyA9ICdnZXQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkganNpaVNldE1ldGhvZDogc3RyaW5nID0gJ3NldCc7XG59XG5cbmNsYXNzIEVudW0gZXh0ZW5kcyBCYXNlUHl0aG9uQ2xhc3NUeXBlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcGFyYXRlTWVtYmVycyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gbmVzdGVkQ29udGV4dChjb250ZXh0LCB0aGlzLmZxbik7XG4gICAgZW1pdExpc3QoY29kZSwgJ0Bqc2lpLmVudW0oJywgW2Bqc2lpX3R5cGU9XCIke3RoaXMuZnFufVwiYF0sICcpJyk7XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoY29kZSwgY29udGV4dCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2xhc3NQYXJhbXMoX2NvbnRleHQ6IEVtaXRDb250ZXh0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2VudW0uRW51bSddO1xuICB9XG5cbiAgcHVibGljIHJlcXVpcmVkSW1wb3J0cyhjb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiBzdXBlci5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gIH1cbn1cblxuY2xhc3MgRW51bU1lbWJlciBpbXBsZW1lbnRzIFB5dGhvbkJhc2Uge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmF0b3I6IFB5dGhvbkdlbmVyYXRvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsdWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZG9jczogc3BlYy5Eb2NzIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50OiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSxcbiAgKSB7XG4gICAgdGhpcy5weXRob25OYW1lID0gcHl0aG9uTmFtZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaUxvY2F0aW9uKCk6IEFwaUxvY2F0aW9uIHtcbiAgICByZXR1cm4geyBhcGk6ICdtZW1iZXInLCBmcW46IHRoaXMucGFyZW50LmZxbiwgbWVtYmVyTmFtZTogdGhpcy52YWx1ZSB9O1xuICB9XG5cbiAgcHVibGljIGRlcGVuZHNPbk1vZHVsZXMoKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8c3RyaW5nPigpO1xuICB9XG5cbiAgcHVibGljIGVtaXQoY29kZTogQ29kZU1ha2VyLCBfY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb2RlLmxpbmUoYCR7dGhpcy5weXRob25OYW1lfSA9IFwiJHt0aGlzLnZhbHVlfVwiYCk7XG4gICAgdGhpcy5nZW5lcmF0b3IuZW1pdERvY1N0cmluZyhjb2RlLCB0aGlzLmFwaUxvY2F0aW9uLCB0aGlzLmRvY3MsIHtcbiAgICAgIGRvY3VtZW50YWJsZUl0ZW06IGBlbnVtLSR7dGhpcy5weXRob25OYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKF9jb250ZXh0OiBFbWl0Q29udGV4dCk6IFB5dGhvbkltcG9ydHMge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgTW9kdWxlT3B0cyB7XG4gIHJlYWRvbmx5IGFzc2VtYmx5OiBzcGVjLkFzc2VtYmx5O1xuICByZWFkb25seSBhc3NlbWJseUZpbGVuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvYWRBc3NlbWJseT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHBhY2thZ2U/OiBQYWNrYWdlO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jc3RyaW5nIHRvIGVtaXQgYXQgdGhlIHRvcCBvZiB0aGlzIG1vZHVsZSwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlRG9jdW1lbnRhdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQeXRob24gbW9kdWxlXG4gKlxuICogV2lsbCBiZSBjYWxsZWQgZm9yIGpzaWkgc3VibW9kdWxlcyBhbmQgbmFtZXNwYWNlcy5cbiAqL1xuY2xhc3MgUHl0aG9uTW9kdWxlIGltcGxlbWVudHMgUHl0aG9uVHlwZSB7XG4gIC8qKlxuICAgKiBDb252ZXJ0ZWQgdG8gcHV0IG9uIHRoZSBtb2R1bGVcbiAgICpcbiAgICogVGhlIGZvcm1hdCBpcyBpbiBtYXJrZG93biwgd2l0aCBjb2RlIHNhbXBsZXMgY29udmVydGVkIGZyb20gVFMgdG8gUHl0aG9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZHVsZURvY3VtZW50YXRpb24/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseTogc3BlYy5Bc3NlbWJseTtcbiAgcHJpdmF0ZSByZWFkb25seSBhc3NlbWJseUZpbGVuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZEFzc2VtYmx5OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbWJlcnMgPSBuZXcgQXJyYXk8UHl0aG9uQmFzZT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXMgPSBuZXcgQXJyYXk8UHl0aG9uTW9kdWxlPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHl0aG9uTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBmcW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRzOiBNb2R1bGVPcHRzLFxuICApIHtcbiAgICB0aGlzLmFzc2VtYmx5ID0gb3B0cy5hc3NlbWJseTtcbiAgICB0aGlzLmFzc2VtYmx5RmlsZW5hbWUgPSBvcHRzLmFzc2VtYmx5RmlsZW5hbWU7XG4gICAgdGhpcy5sb2FkQXNzZW1ibHkgPSAhIW9wdHMubG9hZEFzc2VtYmx5O1xuICAgIHRoaXMubW9kdWxlRG9jdW1lbnRhdGlvbiA9IG9wdHMubW9kdWxlRG9jdW1lbnRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNZW1iZXIobWVtYmVyOiBQeXRob25CYXNlKSB7XG4gICAgdGhpcy5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRQeXRob25Nb2R1bGUocHlNb2Q6IFB5dGhvbk1vZHVsZSkge1xuICAgIGFzc2VydChcbiAgICAgICF0aGlzLmxvYWRBc3NlbWJseSxcbiAgICAgICdQeXRob25Nb2R1bGUuYWRkUHl0aG9uTW9kdWxlIENBTk5PVCBiZSBjYWxsZWQgb24gYXNzZW1ibHktbG9hZGluZyBtb2R1bGVzIChpdCB3b3VsZCBjYXVzZSBhIGxvYWQgY3ljbGUpIScsXG4gICAgKTtcbiAgICB0aGlzLm1vZHVsZXMucHVzaChweU1vZCk7XG4gIH1cblxuICBwdWJsaWMgcmVxdWlyZWRJbXBvcnRzKGNvbnRleHQ6IEVtaXRDb250ZXh0KTogUHl0aG9uSW1wb3J0cyB7XG4gICAgcmV0dXJuIG1lcmdlUHl0aG9uSW1wb3J0cyhcbiAgICAgIC4uLnRoaXMubWVtYmVycy5tYXAoKG1lbSkgPT4gbWVtLnJlcXVpcmVkSW1wb3J0cyhjb250ZXh0KSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICB0aGlzLmVtaXRNb2R1bGVEb2N1bWVudGF0aW9uKGNvZGUpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmZxblxuICAgICAgPyBjb250ZXh0LnJlc29sdmVyLmJpbmQodGhpcy5mcW4sIHRoaXMucHl0aG9uTmFtZSlcbiAgICAgIDogY29udGV4dC5yZXNvbHZlcjtcbiAgICBjb250ZXh0ID0ge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIHN1Ym1vZHVsZTogdGhpcy5mcW4gPz8gY29udGV4dC5zdWJtb2R1bGUsXG4gICAgICByZXNvbHZlcixcbiAgICB9O1xuXG4gICAgLy8gQmVmb3JlIHdlIHdyaXRlIGFueXRoaW5nIGVsc2UsIHdlIG5lZWQgdG8gd3JpdGUgb3V0IG91ciBtb2R1bGUgaGVhZGVycywgdGhpc1xuICAgIC8vIGlzIHdoZXJlIHdlIGhhbmRsZSBzdHVmZiBsaWtlIGltcG9ydHMsIGFueSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiwgZXRjLlxuICAgIGNvZGUubGluZSgnaW1wb3J0IGFiYycpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IGJ1aWx0aW5zJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgZGF0ZXRpbWUnKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBlbnVtJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nJyk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQganNpaScpO1xuICAgIGNvZGUubGluZSgnaW1wb3J0IHB1YmxpY2F0aW9uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgdHlwaW5nX2V4dGVuc2lvbnMnKTtcblxuICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIG91dCB0aGUga2VybmVsIGxvYWQgbGluZS5cbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIHRoaXMuZW1pdERlcGVuZGVuY3lJbXBvcnRzKGNvZGUpO1xuXG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIGVtaXRMaXN0KFxuICAgICAgICBjb2RlLFxuICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18gPSBqc2lpLkpTSUlBc3NlbWJseS5sb2FkKCcsXG4gICAgICAgIFtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5Lm5hbWUpLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkudmVyc2lvbiksXG4gICAgICAgICAgJ19fbmFtZV9fWzA6LTZdJyxcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFzc2VtYmx5RmlsZW5hbWUpfWAsXG4gICAgICAgIF0sXG4gICAgICAgICcpJyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gd2UgbXVzdCBpbXBvcnQgdGhlIC5fanNpaSBzdWJwYWNrYWdlLlxuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBsZXQgZGlzdGFuY2VGcm9tUm9vdCA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgY3VyciA9IHRoaXMuZnFuITtcbiAgICAgICAgY3VyciAhPT0gdGhpcy5hc3NlbWJseS5uYW1lO1xuICAgICAgICBjdXJyID0gY3Vyci5zdWJzdHJpbmcoMCwgY3Vyci5sYXN0SW5kZXhPZignLicpKVxuICAgICAgKSB7XG4gICAgICAgIGRpc3RhbmNlRnJvbVJvb3QrKztcbiAgICAgIH1cbiAgICAgIGNvZGUubGluZShgZnJvbSAkeycuJy5yZXBlYXQoZGlzdGFuY2VGcm9tUm9vdCArIDEpfV9qc2lpIGltcG9ydCAqYCk7XG5cbiAgICAgIHRoaXMuZW1pdFJlcXVpcmVkSW1wb3J0cyhjb2RlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBFbWl0IGFsbCBvZiBvdXIgbWVtYmVycy5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwcmVwYXJlTWVtYmVycyh0aGlzLm1lbWJlcnMsIHJlc29sdmVyKSkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICAgIG1lbWJlci5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFdoYXRldmVyIG5hbWVzIHdlJ3ZlIGV4cG9ydGVkLCB3ZSdsbCB3cml0ZSBvdXQgb3VyIF9fYWxsX18gdGhhdCBsaXN0cyB0aGVtLlxuICAgIGNvbnN0IGV4cG9ydGVkTWVtYmVycyA9IHRoaXMubWVtYmVycy5tYXAoKG0pID0+IGBcIiR7bS5weXRob25OYW1lfVwiYCk7XG4gICAgaWYgKHRoaXMubG9hZEFzc2VtYmx5KSB7XG4gICAgICBleHBvcnRlZE1lbWJlcnMucHVzaCgnXCJfX2pzaWlfYXNzZW1ibHlfX1wiJyk7XG4gICAgfVxuXG4gICAgLy8gRGVjbGFyZSB0aGUgbGlzdCBvZiBcInB1YmxpY1wiIG1lbWJlcnMgdGhpcyBtb2R1bGUgZXhwb3J0c1xuICAgIGlmICh0aGlzLm1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgfVxuICAgIGNvZGUubGluZSgpO1xuXG4gICAgaWYgKGV4cG9ydGVkTWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb2RlLmluZGVudCgnX19hbGxfXyA9IFsnKTtcbiAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIGV4cG9ydGVkTWVtYmVycy5zb3J0KCkpIHtcbiAgICAgICAgLy8gV3JpdGluZyBvbmUgYnkgbGluZSBtaWdodCBiZSBfYSBsb3RfIG9mIGxpbmVzLCBidXQgaXQnbGwgbWFrZSByZXZpZXdpbmcgY2hhbmdlcyB0byB0aGUgbGlzdCBlYXNpZXIuIFRydXN0IG1lLlxuICAgICAgICBjb2RlLmxpbmUoYCR7bWVtYmVyfSxgKTtcbiAgICAgIH1cbiAgICAgIGNvZGUudW5pbmRlbnQoJ10nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZS5saW5lKCdfX2FsbF9fOiB0eXBpbmcuTGlzdFt0eXBpbmcuQW55XSA9IFtdJyk7XG4gICAgfVxuXG4gICAgLy8gTmV4dCB1cCwgd2UnbGwgdXNlIHB1YmxpY2F0aW9uIHRvIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGUgbm9uLXB1YmxpYyBuYW1lc1xuICAgIC8vIGdldCBoaWRkZW4gZnJvbSBkaXIoKSwgdGFiLWNvbXBsZXRlLCBldGMuXG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdwdWJsaWNhdGlvbi5wdWJsaXNoKCknKTtcblxuICAgIC8vIEZpbmFsbHksIHdlJ2xsIGxvYWQgYWxsIHJlZ2lzdGVyZWQgcHl0aG9uIG1vZHVsZXNcbiAgICBpZiAodGhpcy5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgY29kZS5saW5lKFxuICAgICAgICAnIyBMb2FkaW5nIG1vZHVsZXMgdG8gZW5zdXJlIHRoZWlyIHR5cGVzIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIGpzaWkgcnVudGltZSBsaWJyYXJ5JyxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiB0aGlzLm1vZHVsZXMuc29ydCgobCwgcikgPT5cbiAgICAgICAgbC5weXRob25OYW1lLmxvY2FsZUNvbXBhcmUoci5weXRob25OYW1lKSxcbiAgICAgICkpIHtcbiAgICAgICAgLy8gUmF0aGVyIHRoYW4gZ2VuZXJhdGluZyBhbiBhYnNvbHV0ZSBpbXBvcnQgbGlrZVxuICAgICAgICAvLyBcImltcG9ydCBqc2lpX2NhbGMuc3VibW9kdWxlLm5lc3RlZF9zdWJtb2R1bGUuZGVlcGx5X25lc3RlZFwiXG4gICAgICAgIC8vIHRoaXMgYnVpbGRzIGEgcmVsYXRpdmUgaW1wb3J0IGxpa2VcbiAgICAgICAgLy8gXCJmcm9tIC5zdWJtb2R1bGUubmVzdGVkX3N1Ym1vZHVsZSBpbXBvcnQgZGVlcGx5X25lc3RlZFwiXG4gICAgICAgIC8vIFRoaXMgZW5hYmxlcyBkaXN0cmlidXRpbmcgcHl0aG9uIHBhY2thZ2VzIGFuZCB1c2luZyB0aGVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIG1vZHVsZXMgaW4gdGhlIHNhbWUgY29kZWJhc2UuXG4gICAgICAgIGNvbnN0IGFzc2VtYmx5TmFtZSA9IHRvUHl0aG9uRnFuKFxuICAgICAgICAgIG1vZHVsZS5hc3NlbWJseS5uYW1lLFxuICAgICAgICAgIG1vZHVsZS5hc3NlbWJseSxcbiAgICAgICAgKS5weXRob25GcW47XG5cbiAgICAgICAgY29uc3Qgc3VibW9kdWxlID0gbW9kdWxlLnB5dGhvbk5hbWVcbiAgICAgICAgICAucmVwbGFjZShgJHthc3NlbWJseU5hbWV9LmAsICcnKVxuICAgICAgICAgIC5zcGxpdCgnLicpO1xuXG4gICAgICAgIGNvbnN0IHN1Ym1vZHVsZVBhdGggPSBzdWJtb2R1bGVcbiAgICAgICAgICAuc2xpY2UoMCwgc3VibW9kdWxlLmxlbmd0aCAtIDEpXG4gICAgICAgICAgLmpvaW4oJy4nKTtcbiAgICAgICAgY29uc3Qgc3VibW9kdWxlTmFtZSA9IHN1Ym1vZHVsZVtzdWJtb2R1bGUubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvZGUubGluZShgZnJvbSAuJHtzdWJtb2R1bGVQYXRofSBpbXBvcnQgJHtzdWJtb2R1bGVOYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBiaW4gc2NyaXB0cyBpZiBiaW4gc2VjdGlvbiBkZWZpbmVkLlxuICAgKi9cbiAgcHVibGljIGVtaXRCaW5TY3JpcHRzKGNvZGU6IENvZGVNYWtlcik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzY3JpcHRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBpZiAodGhpcy5sb2FkQXNzZW1ibHkpIHtcbiAgICAgIGlmICh0aGlzLmFzc2VtYmx5LmJpbiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLmFzc2VtYmx5LmJpbikpIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHRfZmlsZSA9IHBhdGguam9pbihcbiAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgcHl0aG9uTW9kdWxlTmFtZVRvRmlsZW5hbWUodGhpcy5weXRob25OYW1lKSxcbiAgICAgICAgICAgICdiaW4nLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvZGUub3BlbkZpbGUoc2NyaXB0X2ZpbGUpO1xuICAgICAgICAgIGNvZGUubGluZSgnIyEvdXNyL2Jpbi9lbnYgcHl0aG9uJyk7XG4gICAgICAgICAgY29kZS5saW5lKCk7XG4gICAgICAgICAgY29kZS5saW5lKCdpbXBvcnQganNpaScpO1xuICAgICAgICAgIGNvZGUubGluZSgnaW1wb3J0IHN5cycpO1xuICAgICAgICAgIGNvZGUubGluZSgpO1xuICAgICAgICAgIGVtaXRMaXN0KFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICdfX2pzaWlfYXNzZW1ibHlfXyA9IGpzaWkuSlNJSUFzc2VtYmx5LmxvYWQoJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS5uYW1lKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hc3NlbWJseS52ZXJzaW9uKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5weXRob25OYW1lLnJlcGxhY2UoJy5fanNpaScsICcnKSksXG4gICAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHlGaWxlbmFtZSl9YCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLmxpbmUoKTtcbiAgICAgICAgICBlbWl0TGlzdChcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnX19qc2lpX2Fzc2VtYmx5X18uaW52b2tlQmluU2NyaXB0KCcsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYXNzZW1ibHkubmFtZSksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpLFxuICAgICAgICAgICAgICAnc3lzLmFyZ3ZbMTpdJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb2RlLmNsb3NlRmlsZShzY3JpcHRfZmlsZSk7XG4gICAgICAgICAgc2NyaXB0cy5wdXNoKHNjcmlwdF9maWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCB0aGUgUkVBRE1FIGFzIG1vZHVsZSBkb2NzdHJpbmcgaWYgdGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgbW9kdWxlIChpdCBsb2FkcyB0aGUgYXNzZW1ibHkpXG4gICAqL1xuICBwcml2YXRlIGVtaXRNb2R1bGVEb2N1bWVudGF0aW9uKGNvZGU6IENvZGVNYWtlcikge1xuICAgIGlmICh0aGlzLm1vZHVsZURvY3VtZW50YXRpb24pIHtcbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICAgIGNvZGUubGluZSh0aGlzLm1vZHVsZURvY3VtZW50YXRpb24pO1xuICAgICAgY29kZS5saW5lKERPQ1NUUklOR19RVU9URVMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdERlcGVuZGVuY3lJbXBvcnRzKGNvZGU6IENvZGVNYWtlcikge1xuICAgIC8vIENvbGxlY3QgYWxsIHRoZSAoZGlyZWN0KSBkZXBlbmRlbmNpZXMnIC5fanNpaSBwYWNrYWdlcy5cbiAgICBjb25zdCBkZXBzID0gT2JqZWN0LmtleXModGhpcy5hc3NlbWJseS5kZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAubWFwKFxuICAgICAgICAoZGVwKSA9PlxuICAgICAgICAgIHRoaXMuYXNzZW1ibHkuZGVwZW5kZW5jeUNsb3N1cmU/LltkZXBdPy50YXJnZXRzPy5weXRob24/Lm1vZHVsZSA/P1xuICAgICAgICAgIGRpZShgTm8gUHl0aG9uIHRhcmdldCB3YXMgY29uZmlncnVlZCBmb3IgdGhlIGRlcGVuZGVuY3kgXCIke2RlcH1cIi5gKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKG1vZCkgPT4gYCR7bW9kfS5fanNpaWApXG4gICAgICAuc29ydCgpO1xuXG4gICAgLy8gTm93IGFjdHVhbGx5IHdyaXRlIHRoZSBpbXBvcnQgc3RhdGVtZW50cy4uLlxuICAgIGlmIChkZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvZGUubGluZSgpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGVOYW1lIG9mIGRlcHMpIHtcbiAgICAgICAgY29kZS5saW5lKGBpbXBvcnQgJHttb2R1bGVOYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdFJlcXVpcmVkSW1wb3J0cyhjb2RlOiBDb2RlTWFrZXIsIGNvbnRleHQ6IEVtaXRDb250ZXh0KSB7XG4gICAgY29uc3QgcmVxdWlyZWRJbXBvcnRzID0gdGhpcy5yZXF1aXJlZEltcG9ydHMoY29udGV4dCk7XG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkSW1wb3J0cylcbiAgICAgIC5tYXAoKFtzb3VyY2VQYWNrYWdlLCBpdGVtc10pID0+IHRvSW1wb3J0U3RhdGVtZW50cyhzb3VyY2VQYWNrYWdlLCBpdGVtcykpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBlbHQpID0+IFsuLi5hY2MsIC4uLmVsdF0sXG4gICAgICAgIG5ldyBBcnJheTx7IGVtaXQ6ICgpID0+IHZvaWQ7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfT4oKSxcbiAgICAgIClcbiAgICAgIC5zb3J0KGltcG9ydENvbXBhcmF0b3IpO1xuXG4gICAgaWYgKHN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgY29kZS5saW5lKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHN0YXRlbWVudHMpIHtcbiAgICAgIHN0YXRlbWVudC5lbWl0KGNvZGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW1wb3J0U3RhdGVtZW50cyhcbiAgICAgIHNvdXJjZVBrZzogc3RyaW5nLFxuICAgICAgaXRlbXM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gICAgKTogQXJyYXk8eyBlbWl0OiAoY29kZTogQ29kZU1ha2VyKSA9PiB2b2lkOyBjb21wYXJpc29uQmFzZTogc3RyaW5nIH0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTx7XG4gICAgICAgIGVtaXQ6IChjb2RlOiBDb2RlTWFrZXIpID0+IHZvaWQ7XG4gICAgICAgIGNvbXBhcmlzb25CYXNlOiBzdHJpbmc7XG4gICAgICB9PigpO1xuICAgICAgaWYgKGl0ZW1zLmhhcygnJykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIGNvbXBhcmlzb25CYXNlOiBgaW1wb3J0ICR7c291cmNlUGtnfWAsXG4gICAgICAgICAgZW1pdChjb2RlKSB7XG4gICAgICAgICAgICBjb2RlLmxpbmUodGhpcy5jb21wYXJpc29uQmFzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwaWVjZU1lYWwgPSBBcnJheS5mcm9tKGl0ZW1zKVxuICAgICAgICAuZmlsdGVyKChpKSA9PiBpICE9PSAnJylcbiAgICAgICAgLnNvcnQoKTtcbiAgICAgIGlmIChwaWVjZU1lYWwubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY29tcGFyaXNvbkJhc2U6IGBmcm9tICR7c291cmNlUGtnfSBpbXBvcnRgLFxuICAgICAgICAgIGVtaXQ6IChjb2RlKSA9PlxuICAgICAgICAgICAgZW1pdExpc3QoY29kZSwgYGZyb20gJHtzb3VyY2VQa2d9IGltcG9ydCBgLCBwaWVjZU1lYWwsICcnLCB7XG4gICAgICAgICAgICAgIGlmTXVsdGk6IFsnKCcsICcpJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGltcG9ydENvbXBhcmF0b3IoXG4gICAgICBsZWZ0OiB7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfSxcbiAgICAgIHJpZ2h0OiB7IGNvbXBhcmlzb25CYXNlOiBzdHJpbmcgfSxcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGVmdC5jb21wYXJpc29uQmFzZS5zdGFydHNXaXRoKCdpbXBvcnQnKSA9PT1cbiAgICAgICAgcmlnaHQuY29tcGFyaXNvbkJhc2Uuc3RhcnRzV2l0aCgnaW1wb3J0JylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbGVmdC5jb21wYXJpc29uQmFzZS5sb2NhbGVDb21wYXJlKHJpZ2h0LmNvbXBhcmlzb25CYXNlKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIHdhbnQgXCJmcm9tIC5mb28gaW1wb3J0ICguLi4pXCIgdG8gYmUgKmFmdGVyKiBcImltcG9ydCBiYXJcIlxuICAgICAgcmV0dXJuIHJpZ2h0LmNvbXBhcmlzb25CYXNlLmxvY2FsZUNvbXBhcmUobGVmdC5jb21wYXJpc29uQmFzZSk7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBQYWNrYWdlRGF0YSB7XG4gIGZpbGVuYW1lOiBzdHJpbmc7XG4gIGRhdGE6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuY2xhc3MgUGFja2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgUHl0aG9uTW9kdWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBtb2R1bGUgb2YgdGhlIHBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyByb290TW9kdWxlPzogUHl0aG9uTW9kdWxlO1xuXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YTogc3BlYy5Bc3NlbWJseTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXMgPSBuZXcgTWFwPHN0cmluZywgUHl0aG9uTW9kdWxlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGEgPSBuZXcgTWFwPHN0cmluZywgUGFja2FnZURhdGFbXT4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIG1ldGFkYXRhOiBzcGVjLkFzc2VtYmx5KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNb2R1bGUobW9kdWxlOiBQeXRob25Nb2R1bGUpIHtcbiAgICB0aGlzLm1vZHVsZXMuc2V0KG1vZHVsZS5weXRob25OYW1lLCBtb2R1bGUpO1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgbW9kdWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgYXNzZW1ibHlcbiAgICBpZiAobW9kdWxlLmZxbiA9PT0gdGhpcy5tZXRhZGF0YS5uYW1lKSB7XG4gICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZERhdGEoXG4gICAgbW9kdWxlOiBQeXRob25Nb2R1bGUsXG4gICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICBkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGlmICghdGhpcy5kYXRhLmhhcyhtb2R1bGUucHl0aG9uTmFtZSkpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXQobW9kdWxlLnB5dGhvbk5hbWUsIFtdKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEuZ2V0KG1vZHVsZS5weXRob25OYW1lKSEucHVzaCh7IGZpbGVuYW1lLCBkYXRhIH0pO1xuICB9XG5cbiAgcHVibGljIHdyaXRlKGNvZGU6IENvZGVNYWtlciwgY29udGV4dDogRW1pdENvbnRleHQpIHtcbiAgICBjb25zdCBtb2R1bGVzID0gWy4uLnRoaXMubW9kdWxlcy52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT5cbiAgICAgIGEucHl0aG9uTmFtZS5sb2NhbGVDb21wYXJlKGIucHl0aG9uTmFtZSksXG4gICAgKTtcblxuICAgIGNvbnN0IHNjcmlwdHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiBvdXIgbW9kdWxlcywgYW5kIHdyaXRlIHRoZW0gb3V0IHRvIGRpc2suXG4gICAgZm9yIChjb25zdCBtb2Qgb2YgbW9kdWxlcykge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmpvaW4oXG4gICAgICAgICdzcmMnLFxuICAgICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZShtb2QucHl0aG9uTmFtZSksXG4gICAgICAgICdfX2luaXRfXy5weScsXG4gICAgICApO1xuXG4gICAgICBjb2RlLm9wZW5GaWxlKGZpbGVuYW1lKTtcbiAgICAgIG1vZC5lbWl0KGNvZGUsIGNvbnRleHQpO1xuICAgICAgY29kZS5jbG9zZUZpbGUoZmlsZW5hbWUpO1xuXG4gICAgICBzY3JpcHRzLnB1c2goLi4ubW9kLmVtaXRCaW5TY3JpcHRzKGNvZGUpKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgb3VyIHBhY2thZ2UgZGF0YS5cbiAgICBjb25zdCBwYWNrYWdlRGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgZm9yIChjb25zdCBbbW9kLCBwZGF0YV0gb2YgdGhpcy5kYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IGRhdGEgb2YgcGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAnc3JjJyxcbiAgICAgICAgICAgIHB5dGhvbk1vZHVsZU5hbWVUb0ZpbGVuYW1lKG1vZCksXG4gICAgICAgICAgICBkYXRhLmZpbGVuYW1lLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb2RlLm9wZW5GaWxlKGZpbGVwYXRoKTtcbiAgICAgICAgICBjb2RlLmxpbmUoZGF0YS5kYXRhKTtcbiAgICAgICAgICBjb2RlLmNsb3NlRmlsZShmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFja2FnZURhdGFbbW9kXSA9IHBkYXRhLm1hcCgocGQpID0+IHBkLmZpbGVuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIG91ciBsaXN0IG9mIGRlcGVuZGVuY2llc1xuICAgIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtkZXBOYW1lLCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIHRoaXMubWV0YWRhdGEuZGVwZW5kZW5jaWVzID8/IHt9LFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGRlcEluZm8gPSB0aGlzLm1ldGFkYXRhLmRlcGVuZGVuY3lDbG9zdXJlIVtkZXBOYW1lXTtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgICBgJHtkZXBJbmZvLnRhcmdldHMhLnB5dGhvbiEuZGlzdE5hbWV9JHt0b1B5dGhvblZlcnNpb25SYW5nZSh2ZXJzaW9uKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOZWVkIHRvIGFsd2F5cyB3cml0ZSB0aGlzIGZpbGUgYXMgdGhlIGJ1aWxkIHByb2Nlc3MgZGVwZW5kcyBvbiBpdC5cbiAgICAvLyBNYWtlIHVwIHNvbWUgY29udGVudHMgaWYgd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB1c2VmdWwgdG8gc2F5LlxuICAgIGNvZGUub3BlbkZpbGUoJ1JFQURNRS5tZCcpO1xuICAgIGNvZGUubGluZShcbiAgICAgIHRoaXMucm9vdE1vZHVsZT8ubW9kdWxlRG9jdW1lbnRhdGlvbiA/P1xuICAgICAgICBgJHt0aGlzLm5hbWV9XFxuJHsnPScucmVwZWF0KHRoaXMubmFtZS5sZW5ndGgpfWAsXG4gICAgKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgnUkVBRE1FLm1kJyk7XG5cbiAgICAvLyBTdHJpcCBcIiAoYnVpbGQgYWJjZGVmKVwiIGZyb20gdGhlIGpzaWkgdmVyc2lvblxuICAgIGNvbnN0IGpzaWlWZXJzaW9uU2ltcGxlID0gdGhpcy5tZXRhZGF0YS5qc2lpVmVyc2lvbi5yZXBsYWNlKC8gLiokLywgJycpO1xuXG4gICAgY29uc3Qgc2V0dXBLd2FyZ3MgPSB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGxpY2Vuc2U6IHRoaXMubWV0YWRhdGEubGljZW5zZSxcbiAgICAgIHVybDogdGhpcy5tZXRhZGF0YS5ob21lcGFnZSxcbiAgICAgIGxvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlOiAndGV4dC9tYXJrZG93bicsXG4gICAgICBhdXRob3I6XG4gICAgICAgIHRoaXMubWV0YWRhdGEuYXV0aG9yLm5hbWUgK1xuICAgICAgICAodGhpcy5tZXRhZGF0YS5hdXRob3IuZW1haWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYDwke3RoaXMubWV0YWRhdGEuYXV0aG9yLmVtYWlsfT5gXG4gICAgICAgICAgOiAnJyksXG4gICAgICBiZGlzdF93aGVlbDoge1xuICAgICAgICB1bml2ZXJzYWw6IHRydWUsXG4gICAgICB9LFxuICAgICAgcHJvamVjdF91cmxzOiB7XG4gICAgICAgIFNvdXJjZTogdGhpcy5tZXRhZGF0YS5yZXBvc2l0b3J5LnVybCxcbiAgICAgIH0sXG4gICAgICBwYWNrYWdlX2RpcjogeyAnJzogJ3NyYycgfSxcbiAgICAgIHBhY2thZ2VzOiBtb2R1bGVzLm1hcCgobSkgPT4gbS5weXRob25OYW1lKSxcbiAgICAgIHBhY2thZ2VfZGF0YTogcGFja2FnZURhdGEsXG4gICAgICBweXRob25fcmVxdWlyZXM6ICc+PTMuNicsXG4gICAgICBpbnN0YWxsX3JlcXVpcmVzOiBbXG4gICAgICAgIGBqc2lpJHt0b1B5dGhvblZlcnNpb25SYW5nZShgXiR7anNpaVZlcnNpb25TaW1wbGV9YCl9YCxcbiAgICAgICAgJ3B1YmxpY2F0aW9uPj0wLjAuMycsXG4gICAgICBdXG4gICAgICAgIC5jb25jYXQoZGVwZW5kZW5jaWVzKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgY2xhc3NpZmllcnM6IFtcbiAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLFxuICAgICAgICAnT3BlcmF0aW5nIFN5c3RlbSA6OiBPUyBJbmRlcGVuZGVudCcsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBKYXZhU2NyaXB0JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzIDo6IE9ubHknLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNicsXG4gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy43JyxcbiAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjgnLFxuICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOScsXG4gICAgICAgICdUeXBpbmcgOjogVHlwZWQnLFxuICAgICAgXSxcbiAgICAgIHNjcmlwdHMsXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5tZXRhZGF0YS5kb2NzPy5zdGFiaWxpdHkpIHtcbiAgICAgIGNhc2Ugc3BlYy5TdGFiaWxpdHkuRXhwZXJpbWVudGFsOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHNwZWMuU3RhYmlsaXR5LlN0YWJsZTpcbiAgICAgICAgc2V0dXBLd2FyZ3MuY2xhc3NpZmllcnMucHVzaChcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkOlxuICAgICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdEZXZlbG9wbWVudCBTdGF0dXMgOjogNyAtIEluYWN0aXZlJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIE5vICdEZXZlbG9wbWVudCBTdGF0dXMnIHRyb3ZlIGNsYXNzaWZpZXIgZm9yIHlvdSFcbiAgICB9XG5cbiAgICBpZiAoc3BkeExpY2Vuc2VMaXN0W3RoaXMubWV0YWRhdGEubGljZW5zZV0/Lm9zaUFwcHJvdmVkKSB7XG4gICAgICBzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5wdXNoKCdMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZGl0aW9uYWxDbGFzc2lmaWVycyA9IHRoaXMubWV0YWRhdGEudGFyZ2V0cz8ucHl0aG9uPy5jbGFzc2lmaWVycztcbiAgICBpZiAoYWRkaXRpb25hbENsYXNzaWZpZXJzICE9IG51bGwpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhZGRpdGlvbmFsQ2xhc3NpZmllcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIFwianNpaS50YXJnZXRzLnB5dGhvbi5jbGFzc2lmaWVyc1wiIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpZiBwcm92aWRlZCwgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBhZGRpdGlvbmFsQ2xhc3NpZmllcnMsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBXZSBkaXNjb3VyYWdlIHVzaW5nIHRob3NlIHNpbmNlIHdlIGF1dG9tYXRpY2FsbHkgc2V0IGEgdmFsdWUgZm9yIHRoZW1cbiAgICAgIGZvciAobGV0IGNsYXNzaWZpZXIgb2YgYWRkaXRpb25hbENsYXNzaWZpZXJzLnNvcnQoKSkge1xuICAgICAgICBpZiAodHlwZW9mIGNsYXNzaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBcImpzaWkudGFyZ2V0cy5weXRob24uY2xhc3NpZmllcnNcIiB2YWx1ZSBjYW4gb25seSBjb250YWluIHN0cmluZ3MsIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBjbGFzc2lmaWVyLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UnbGwgc3BsaXQgb24gYDo6YCBhbmQgcmUtam9pbiBsYXRlciBzbyBjbGFzc2lmaWVycyBhcmUgXCJub3JtYWxpemVkXCIgdG8gYSBzdGFuZGFyZCBzcGFjaW5nXG4gICAgICAgIGNvbnN0IHBhcnRzID0gY2xhc3NpZmllci5zcGxpdCgnOjonKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKTtcbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRDbGFzc2lmaWVycyA9IFtcbiAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzJyxcbiAgICAgICAgICAnTGljZW5zZScsXG4gICAgICAgICAgJ09wZXJhdGluZyBTeXN0ZW0nLFxuICAgICAgICAgICdUeXBpbmcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAocmVzZXJ2ZWRDbGFzc2lmaWVycy5pbmNsdWRlcyhwYXJ0c1swXSkpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYENsYXNzaWZpZXJzIHN0YXJ0aW5nIHdpdGggJHtyZXNlcnZlZENsYXNzaWZpZXJzXG4gICAgICAgICAgICAgIC5tYXAoKHgpID0+IGBcIiR7eH0gOjpcImApXG4gICAgICAgICAgICAgIC5qb2luKFxuICAgICAgICAgICAgICAgICcsICcsXG4gICAgICAgICAgICAgICl9IGFyZSBhdXRvbWF0aWNhbGx5IHNldCBhbmQgc2hvdWxkIG5vdCBiZSBtYW51YWxseSBjb25maWd1cmVkYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzaWZpZXIgPSBwYXJ0cy5qb2luKCcgOjogJyk7XG4gICAgICAgIGlmIChzZXR1cEt3YXJncy5jbGFzc2lmaWVycy5pbmNsdWRlcyhjbGFzc2lmaWVyKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHNldHVwS3dhcmdzLmNsYXNzaWZpZXJzLnB1c2goY2xhc3NpZmllcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgTmVlZCBhIHNldHVwLnB5IHRvIG1ha2UgdGhpcyBQYWNrYWdlLCBhY3R1YWxseSBhIFBhY2thZ2UuXG4gICAgY29kZS5vcGVuRmlsZSgnc2V0dXAucHknKTtcbiAgICBjb2RlLmxpbmUoJ2ltcG9ydCBqc29uJyk7XG4gICAgY29kZS5saW5lKCdpbXBvcnQgc2V0dXB0b29scycpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUubGluZSgna3dhcmdzID0ganNvbi5sb2FkcygnKTtcbiAgICBjb2RlLmxpbmUoJyAgICBcIlwiXCInKTtcbiAgICBjb2RlLmxpbmUoSlNPTi5zdHJpbmdpZnkoc2V0dXBLd2FyZ3MsIG51bGwsIDQpKTtcbiAgICBjb2RlLmxpbmUoJ1wiXCJcIicpO1xuICAgIGNvZGUubGluZSgnKScpO1xuICAgIGNvZGUubGluZSgpO1xuICAgIGNvZGUub3BlbkJsb2NrKCd3aXRoIG9wZW4oXCJSRUFETUUubWRcIiwgZW5jb2Rpbmc9XCJ1dGY4XCIpIGFzIGZwJyk7XG4gICAgY29kZS5saW5lKCdrd2FyZ3NbXCJsb25nX2Rlc2NyaXB0aW9uXCJdID0gZnAucmVhZCgpJyk7XG4gICAgY29kZS5jbG9zZUJsb2NrKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCk7XG4gICAgY29kZS5saW5lKCdzZXR1cHRvb2xzLnNldHVwKCoqa3dhcmdzKScpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdzZXR1cC5weScpO1xuXG4gICAgLy8gQmVjYXVzZSB3ZSdyZSBnb29kIGNpdGl6ZW5zLCB3ZSdyZSBnb2luZyB0byBnbyBhaGVhZCBhbmQgc3VwcG9ydCBweXByb2plY3QudG9tbFxuICAgIC8vIGFzIHdlbGwuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgZWFzaWVyIHRvIGp1c3QgdXNlIGEgVE9NTCBsaWJyYXJ5IHRvIHdyaXRlIHRoaXMgb3V0LlxuICAgIGNvZGUub3BlbkZpbGUoJ3B5cHJvamVjdC50b21sJyk7XG4gICAgY29kZS5saW5lKCdbYnVpbGQtc3lzdGVtXScpO1xuICAgIGNvbnN0IGJ1aWxkVG9vbHMgPSBmc1xuICAgICAgLnJlYWRGaWxlU3luYyhyZXF1aXJlbWVudHNGaWxlLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAubWFwKChsaW5lKSA9PiAvXlxccyooLispXFxzKiNcXHMqYnVpbGQtc3lzdGVtXFxzKiQvLmV4ZWMobGluZSk/LlsxXT8udHJpbSgpKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGJ1aWxkVG9vbHMsIGVudHJ5KSA9PiAoZW50cnkgPyBbLi4uYnVpbGRUb29scywgZW50cnldIDogYnVpbGRUb29scyksXG4gICAgICAgIG5ldyBBcnJheTxzdHJpbmc+KCksXG4gICAgICApO1xuICAgIGNvZGUubGluZShgcmVxdWlyZXMgPSBbJHtidWlsZFRvb2xzLm1hcCgoeCkgPT4gYFwiJHt4fVwiYCkuam9pbignLCAnKX1dYCk7XG4gICAgY29kZS5saW5lKCdidWlsZC1iYWNrZW5kID0gXCJzZXR1cHRvb2xzLmJ1aWxkX21ldGFcIicpO1xuICAgIGNvZGUuY2xvc2VGaWxlKCdweXByb2plY3QudG9tbCcpO1xuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdyaXRlIG91dCBhIE1BTklGRVNULmluIHRvIGVuc3VyZSB0aGF0IGFsbCBvZiBvdXIgcmVxdWlyZWRcbiAgICAvLyBmaWxlcyBhcmUgaW5jbHVkZWQuXG4gICAgY29kZS5vcGVuRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgICBjb2RlLmxpbmUoJ2luY2x1ZGUgcHlwcm9qZWN0LnRvbWwnKTtcbiAgICBjb2RlLmNsb3NlRmlsZSgnTUFOSUZFU1QuaW4nKTtcbiAgfVxufVxuXG50eXBlIEZpbmRNb2R1bGVDYWxsYmFjayA9IChmcW46IHN0cmluZykgPT4gc3BlYy5Bc3NlbWJseUNvbmZpZ3VyYXRpb247XG50eXBlIEZpbmRUeXBlQ2FsbGJhY2sgPSAoZnFuOiBzdHJpbmcpID0+IHNwZWMuVHlwZTtcblxuY2xhc3MgVHlwZVJlc29sdmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRUbz86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZFJlITogUmVnRXhwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZU5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmUhOiBSZWdFeHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT4sXG4gICAgZmluZE1vZHVsZTogRmluZE1vZHVsZUNhbGxiYWNrLFxuICAgIGZpbmRUeXBlOiBGaW5kVHlwZUNhbGxiYWNrLFxuICAgIGJvdW5kVG8/OiBzdHJpbmcsXG4gICAgbW9kdWxlTmFtZT86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgIHRoaXMuZmluZE1vZHVsZSA9IGZpbmRNb2R1bGU7XG4gICAgdGhpcy5maW5kVHlwZSA9IGZpbmRUeXBlO1xuICAgIHRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7XG4gICAgdGhpcy5ib3VuZFRvID0gYm91bmRUbyAhPT0gdW5kZWZpbmVkID8gdGhpcy50b1B5dGhvbkZRTihib3VuZFRvKSA6IGJvdW5kVG87XG5cbiAgICBpZiAodGhpcy5tb2R1bGVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubW9kdWxlUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLm1vZHVsZU5hbWUpfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYm91bmRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJvdW5kUmUgPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXigke2VzY2FwZVN0cmluZ1JlZ2V4cCh0aGlzLmJvdW5kVG8pfSlcXFxcLiguKykkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJpbmQoZnFuOiBzdHJpbmcsIG1vZHVsZU5hbWU/OiBzdHJpbmcpOiBUeXBlUmVzb2x2ZXIge1xuICAgIHJldHVybiBuZXcgVHlwZVJlc29sdmVyKFxuICAgICAgdGhpcy50eXBlcyxcbiAgICAgIHRoaXMuZmluZE1vZHVsZSxcbiAgICAgIHRoaXMuZmluZFR5cGUsXG4gICAgICBmcW4sXG4gICAgICBtb2R1bGVOYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJy4nKVxuICAgICAgICAgID8gYCR7dGhpcy5tb2R1bGVOYW1lfSR7bW9kdWxlTmFtZX1gXG4gICAgICAgICAgOiBtb2R1bGVOYW1lXG4gICAgICAgIDogdGhpcy5tb2R1bGVOYW1lLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk1vZHVsZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLm1vZHVsZVJlLnRlc3QocHl0aG9uVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgaXNJbk5hbWVzcGFjZSh0eXBlUmVmOiBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHB5dGhvblR5cGUgPVxuICAgICAgdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdGhpcy50b1B5dGhvbkZRTih0eXBlUmVmLmZxbikgOiB0eXBlUmVmO1xuICAgIHJldHVybiB0aGlzLmJvdW5kUmUudGVzdChweXRob25UeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJlbnQodHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcpOiBQeXRob25UeXBlIHtcbiAgICBjb25zdCBmcW4gPSB0eXBlb2YgdHlwZVJlZiAhPT0gJ3N0cmluZycgPyB0eXBlUmVmLmZxbiA6IHR5cGVSZWY7XG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKC4rKVxcLlteLl0rJC8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBwYXJlbnRGUU5dID0gbWF0Y2hlcztcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnR5cGVzLmdldChwYXJlbnRGUU4pO1xuXG4gICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhcmVudDogICR7cGFyZW50RlFOfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmaW5pbmdQeXRob25Nb2R1bGUoXG4gICAgdHlwZVJlZjogc3BlYy5OYW1lZFR5cGVSZWZlcmVuY2UgfCBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZnFuID0gdHlwZW9mIHR5cGVSZWYgIT09ICdzdHJpbmcnID8gdHlwZVJlZi5mcW4gOiB0eXBlUmVmO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHlwZXMuZ2V0KGZxbik7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBsZXQgbW9kID0gcGFyZW50O1xuICAgICAgd2hpbGUgKCEobW9kIGluc3RhbmNlb2YgUHl0aG9uTW9kdWxlKSkge1xuICAgICAgICBtb2QgPSB0aGlzLmdldFBhcmVudChtb2QuZnFuISk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbW9kLnB5dGhvbk5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlcyA9IC9eKFteLl0rKVxcLi8uZXhlYyhmcW4pO1xuICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBGUU46ICR7ZnFufWApO1xuICAgIH1cbiAgICBjb25zdCBbLCBhc3NtXSA9IG1hdGNoZXM7XG4gICAgcmV0dXJuIHRoaXMuZmluZE1vZHVsZShhc3NtKS50YXJnZXRzIS5weXRob24hLm1vZHVsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUeXBlKHR5cGVSZWY6IHNwZWMuTmFtZWRUeXBlUmVmZXJlbmNlKTogUHl0aG9uVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KHR5cGVSZWYuZnFuKTtcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvY2F0ZSB0eXBlOiBcIiR7dHlwZVJlZi5mcW59XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBkZXJlZmVyZW5jZSh0eXBlUmVmOiBzdHJpbmcgfCBzcGVjLk5hbWVkVHlwZVJlZmVyZW5jZSk6IHNwZWMuVHlwZSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgdHlwZVJlZiA9IHR5cGVSZWYuZnFuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5kVHlwZSh0eXBlUmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9QeXRob25GUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IFthc3NlbWJseU5hbWUsIC4uLnF1YWxpZmllZElkZW50aWZpZXJzXSA9IGZxbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGZxblBhcnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgIHRoaXMuZmluZE1vZHVsZShhc3NlbWJseU5hbWUpLnRhcmdldHMhLnB5dGhvbiEubW9kdWxlLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcXVhbGlmaWVkSWRlbnRpZmllcnMpIHtcbiAgICAgIGZxblBhcnRzLnB1c2godG9QeXRob25JZGVudGlmaWVyKHBhcnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnFuUGFydHMuam9pbignLicpO1xuICB9XG59XG5cbmNsYXNzIFB5dGhvbkdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7XG4gIHByaXZhdGUgcGFja2FnZSE6IFBhY2thZ2U7XG4gIHByaXZhdGUgcm9vdE1vZHVsZT86IFB5dGhvbk1vZHVsZTtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlczogTWFwPHN0cmluZywgUHl0aG9uVHlwZT47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9zZXR0YTogUm9zZXR0YSxcbiAgICBvcHRpb25zOiBHZW5lcmF0b3JPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5jb2RlLm9wZW5CbG9ja0Zvcm1hdHRlciA9IChzKSA9PiBgJHtzfTpgO1xuICAgIHRoaXMuY29kZS5jbG9zZUJsb2NrRm9ybWF0dGVyID0gKF9zKSA9PiBmYWxzZTtcblxuICAgIHRoaXMudHlwZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICBwdWJsaWMgZW1pdERvY1N0cmluZyhcbiAgICBjb2RlOiBDb2RlTWFrZXIsXG4gICAgYXBpTG9jYXRpb246IEFwaUxvY2F0aW9uLFxuICAgIGRvY3M6IHNwZWMuRG9jcyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhcmd1bWVudHM/OiBEb2N1bWVudGFibGVBcmd1bWVudFtdO1xuICAgICAgZG9jdW1lbnRhYmxlSXRlbT86IHN0cmluZztcbiAgICAgIHRyYWlsaW5nTmV3TGluZT86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBpZiAoKCFkb2NzIHx8IE9iamVjdC5rZXlzKGRvY3MpLmxlbmd0aCA9PT0gMCkgJiYgIW9wdGlvbnMuYXJndW1lbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZG9jcykge1xuICAgICAgZG9jcyA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmIChkb2NzLnN1bW1hcnkpIHtcbiAgICAgIGxpbmVzLnB1c2gobWQycnN0KHJlbmRlclN1bW1hcnkoZG9jcykpKTtcbiAgICAgIGJyaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBicmsoKSB7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID4gMCAmJiBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJsb2NrKGhlYWRpbmc6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBkb0JyayA9IHRydWUpIHtcbiAgICAgIGlmIChkb0Jyaykge1xuICAgICAgICBicmsoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRlbnRMaW5lcyA9IG1kMnJzdChjb250ZW50KS5zcGxpdCgnXFxuJyk7XG4gICAgICBpZiAoY29udGVudExpbmVzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYDoke2hlYWRpbmd9OiAke2NvbnRlbnRMaW5lcy5qb2luKCcnKX1gLnRyaW0oKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGA6JHtoZWFkaW5nfTpgKTtcbiAgICAgICAgYnJrKCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjb250ZW50TGluZXMpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUudHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRvQnJrKSB7XG4gICAgICAgIGJyaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgLi4ubWQycnN0KHRoaXMuY29udmVydE1hcmtkb3duKGRvY3MucmVtYXJrcyA/PyAnJywgYXBpTG9jYXRpb24pKS5zcGxpdChcbiAgICAgICAgICAnXFxuJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBicmsoKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hcmd1bWVudHM/Lmxlbmd0aCA/PyAwID4gMCkge1xuICAgICAgYnJrKCk7XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIG9wdGlvbnMuYXJndW1lbnRzISkge1xuICAgICAgICAvLyBBZGQgYSBsaW5lIGZvciBldmVyeSBhcmd1bWVudC4gRXZlbiBpZiB0aGVyZSBpcyBubyBkZXNjcmlwdGlvbiwgd2UgbmVlZFxuICAgICAgICAvLyB0aGUgZG9jc3RyaW5nIHNvIHRoYXQgdGhlIFNwaGlueCBleHRlbnNpb24gY2FuIGFkZCB0aGUgdHlwZSBhbm5vdGF0aW9ucy5cbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgOnBhcmFtICR7dG9QeXRob25QYXJhbWV0ZXJOYW1lKHBhcmFtLm5hbWUpfTogJHtvbmVsaW5lRGVzY3JpcHRpb24oXG4gICAgICAgICAgICBwYXJhbS5kb2NzLFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyaygpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmRlZmF1bHQpIHtcbiAgICAgIGJsb2NrKCdkZWZhdWx0JywgZG9jcy5kZWZhdWx0KTtcbiAgICB9XG4gICAgaWYgKGRvY3MucmV0dXJucykge1xuICAgICAgYmxvY2soJ3JldHVybicsIGRvY3MucmV0dXJucyk7XG4gICAgfVxuICAgIGlmIChkb2NzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIGJsb2NrKCdkZXByZWNhdGVkJywgZG9jcy5kZXByZWNhdGVkKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc2VlKSB7XG4gICAgICBibG9jaygnc2VlJywgZG9jcy5zZWUsIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3RhYmlsaXR5ICYmIHNob3VsZE1lbnRpb25TdGFiaWxpdHkoZG9jcy5zdGFiaWxpdHkpKSB7XG4gICAgICBibG9jaygnc3RhYmlsaXR5JywgZG9jcy5zdGFiaWxpdHksIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGRvY3Muc3ViY2xhc3NhYmxlKSB7XG4gICAgICBibG9jaygnc3ViY2xhc3NhYmxlJywgJ1llcycpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRvY3MuY3VzdG9tID8/IHt9KSkge1xuICAgICAgYmxvY2soaywgdiwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmV4YW1wbGUpIHtcbiAgICAgIGJyaygpO1xuICAgICAgbGluZXMucHVzaCgnRXhhbXBsZTo6Jyk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGNvbnN0IGV4YW1wbGVUZXh0ID0gdGhpcy5jb252ZXJ0RXhhbXBsZShkb2NzLmV4YW1wbGUsIGFwaUxvY2F0aW9uKTtcblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGV4YW1wbGVUZXh0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAgICAgJHtsaW5lfWApO1xuICAgICAgfVxuICAgICAgYnJrKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGxpbmVzLmxlbmd0aCA+IDAgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09ICcnKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29kZS5saW5lKGAke0RPQ1NUUklOR19RVU9URVN9JHtsaW5lc1swXX0ke0RPQ1NUUklOR19RVU9URVN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvZGUubGluZShgJHtET0NTVFJJTkdfUVVPVEVTfSR7bGluZXNbMF19YCk7XG4gICAgICBsaW5lcy5zcGxpY2UoMCwgMSk7XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb2RlLmxpbmUobGluZSk7XG4gICAgICB9XG5cbiAgICAgIGNvZGUubGluZShET0NTVFJJTkdfUVVPVEVTKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudHJhaWxpbmdOZXdMaW5lKSB7XG4gICAgICBjb2RlLmxpbmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29udmVydEV4YW1wbGUoZXhhbXBsZTogc3RyaW5nLCBhcGlMb2M6IEFwaUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdGhpcy5yb3NldHRhLnRyYW5zbGF0ZUV4YW1wbGUoXG4gICAgICBhcGlMb2MsXG4gICAgICBleGFtcGxlLFxuICAgICAgVGFyZ2V0TGFuZ3VhZ2UuUFlUSE9OLFxuICAgICAgZW5mb3JjZXNTdHJpY3RNb2RlKHRoaXMuYXNzZW1ibHkpLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMucHJlZml4RGlzY2xhaW1lcih0cmFuc2xhdGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBjb252ZXJ0TWFya2Rvd24obWFya2Rvd246IHN0cmluZywgYXBpTG9jOiBBcGlMb2NhdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9zZXR0YS50cmFuc2xhdGVTbmlwcGV0c0luTWFya2Rvd24oXG4gICAgICBhcGlMb2MsXG4gICAgICBtYXJrZG93bixcbiAgICAgIFRhcmdldExhbmd1YWdlLlBZVEhPTixcbiAgICAgIGVuZm9yY2VzU3RyaWN0TW9kZSh0aGlzLmFzc2VtYmx5KSxcbiAgICAgICh0cmFucykgPT4gKHtcbiAgICAgICAgbGFuZ3VhZ2U6IHRyYW5zLmxhbmd1YWdlLFxuICAgICAgICBzb3VyY2U6IHRoaXMucHJlZml4RGlzY2xhaW1lcih0cmFucyksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVmaXhEaXNjbGFpbWVyKHRyYW5zbGF0ZWQ6IFRyYW5zbGF0aW9uKSB7XG4gICAgaWYgKCF0cmFuc2xhdGVkLmRpZENvbXBpbGUgJiYgSU5DT01QTEVURV9ESVNDTEFJTUVSX05PTkNPTVBJTElORykge1xuICAgICAgcmV0dXJuIGAjICR7SU5DT01QTEVURV9ESVNDTEFJTUVSX05PTkNPTVBJTElOR31cXG4ke3RyYW5zbGF0ZWQuc291cmNlfWA7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkLnNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQeXRob25UeXBlKGZxbjogc3RyaW5nKTogUHl0aG9uVHlwZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KGZxbik7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBsb2NhdGUgdHlwZTogXCIke2Zxbn1cImApO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEFzc2VtYmx5T3V0cHV0RGlyKGFzc206IHNwZWMuQXNzZW1ibHkpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKFxuICAgICAgJ3NyYycsXG4gICAgICBweXRob25Nb2R1bGVOYW1lVG9GaWxlbmFtZSh0aGlzLmdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtKSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgX2ZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5wYWNrYWdlID0gbmV3IFBhY2thZ2UoXG4gICAgICBhc3NtLnRhcmdldHMhLnB5dGhvbiEuZGlzdE5hbWUsXG4gICAgICB0b1JlbGVhc2VWZXJzaW9uKGFzc20udmVyc2lvbiwgVGFyZ2V0TmFtZS5QWVRIT04pLFxuICAgICAgYXNzbSxcbiAgICApO1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgJzxwYWNrYWdlbmFtZT4uX2pzaWknIG1vZHVsZSBmb3IgdGhpcyBhc3NlbWJseVxuICAgIGNvbnN0IGFzc2VtYmx5TW9kdWxlID0gbmV3IFB5dGhvbk1vZHVsZShcbiAgICAgIHRoaXMuZ2V0QXNzZW1ibHlNb2R1bGVOYW1lKGFzc20pLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBhc3NlbWJseTogYXNzbSxcbiAgICAgICAgYXNzZW1ibHlGaWxlbmFtZTogdGhpcy5nZXRBc3NlbWJseUZpbGVOYW1lKCksXG4gICAgICAgIGxvYWRBc3NlbWJseTogdHJ1ZSxcbiAgICAgICAgcGFja2FnZTogdGhpcy5wYWNrYWdlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5wYWNrYWdlLmFkZE1vZHVsZShhc3NlbWJseU1vZHVsZSk7XG4gICAgdGhpcy5wYWNrYWdlLmFkZERhdGEoYXNzZW1ibHlNb2R1bGUsIHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW5kQXNzZW1ibHkoYXNzbTogc3BlYy5Bc3NlbWJseSwgX2ZpbmdlcnByaW50OiBib29sZWFuKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSBuZXcgVHlwZVJlc29sdmVyKFxuICAgICAgdGhpcy50eXBlcyxcbiAgICAgIChmcW46IHN0cmluZykgPT4gdGhpcy5maW5kTW9kdWxlKGZxbiksXG4gICAgICAoZnFuOiBzdHJpbmcpID0+IHRoaXMuZmluZFR5cGUoZnFuKSxcbiAgICApO1xuICAgIHRoaXMucGFja2FnZS53cml0ZSh0aGlzLmNvZGUsIHtcbiAgICAgIGFzc2VtYmx5OiBhc3NtLFxuICAgICAgZW1pdHRlZFR5cGVzOiBuZXcgU2V0KCksXG4gICAgICByZXNvbHZlcixcbiAgICAgIHN1Ym1vZHVsZTogYXNzbS5uYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgYmUgY2FsbGVkIGZvciBhc3NlbWJseSByb290LCBuYW1lc3BhY2VzIGFuZCBzdWJtb2R1bGVzIChhbnl0aGluZyB0aGF0IGNvbnRhaW5zIG90aGVyIHR5cGVzLCBiYXNlZCBvbiBpdHMgRlFOKVxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQmVnaW5OYW1lc3BhY2UobnM6IHN0cmluZykge1xuICAgIC8vICducycgY29udGFpbnMgc29tZXRoaW5nIGxpa2UgJ0BzY29wZS9qc2lpLWNhbGMtYmFzZS1vZi1iYXNlJ1xuICAgIGNvbnN0IHN1Ym1vZHVsZUxpa2UgPVxuICAgICAgbnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZVxuICAgICAgICA/IHRoaXMuYXNzZW1ibHlcbiAgICAgICAgOiB0aGlzLmFzc2VtYmx5LnN1Ym1vZHVsZXM/Lltuc107XG5cbiAgICBjb25zdCByZWFkbWVMb2NhdGlvbjogQXBpTG9jYXRpb24gPSB7IGFwaTogJ21vZHVsZVJlYWRtZScsIG1vZHVsZUZxbjogbnMgfTtcblxuICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBQeXRob25Nb2R1bGUodG9QYWNrYWdlTmFtZShucywgdGhpcy5hc3NlbWJseSksIG5zLCB7XG4gICAgICBhc3NlbWJseTogdGhpcy5hc3NlbWJseSxcbiAgICAgIGFzc2VtYmx5RmlsZW5hbWU6IHRoaXMuZ2V0QXNzZW1ibHlGaWxlTmFtZSgpLFxuICAgICAgcGFja2FnZTogdGhpcy5wYWNrYWdlLFxuICAgICAgbW9kdWxlRG9jdW1lbnRhdGlvbjogc3VibW9kdWxlTGlrZT8ucmVhZG1lXG4gICAgICAgID8gdGhpcy5jb252ZXJ0TWFya2Rvd24oXG4gICAgICAgICAgICBzdWJtb2R1bGVMaWtlLnJlYWRtZT8ubWFya2Rvd24sXG4gICAgICAgICAgICByZWFkbWVMb2NhdGlvbixcbiAgICAgICAgICApLnRyaW0oKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHRoaXMucGFja2FnZS5hZGRNb2R1bGUobW9kdWxlKTtcbiAgICB0aGlzLnR5cGVzLnNldChucywgbW9kdWxlKTtcbiAgICBpZiAobnMgPT09IHRoaXMuYXNzZW1ibHkubmFtZSkge1xuICAgICAgLy8gVGhpcyBhcHBsaWVzIHJlY3Vyc2l2ZWx5IHRvIHN1Ym1vZHVsZXMsIHNvIG5vIG5lZWQgdG8gZHVwbGljYXRlIVxuICAgICAgdGhpcy5wYWNrYWdlLmFkZERhdGEobW9kdWxlLCAncHkudHlwZWQnLCAnJyk7XG4gICAgfVxuXG4gICAgaWYgKG5zID09PSB0aGlzLmFzc2VtYmx5Lm5hbWUpIHtcbiAgICAgIHRoaXMucm9vdE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb290TW9kdWxlIS5hZGRQeXRob25Nb2R1bGUobW9kdWxlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmROYW1lc3BhY2UobnM6IHN0cmluZykge1xuICAgIGlmIChucyA9PT0gdGhpcy5hc3NlbWJseS5uYW1lKSB7XG4gICAgICBkZWxldGUgdGhpcy5yb290TW9kdWxlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luQ2xhc3MoY2xzOiBzcGVjLkNsYXNzVHlwZSwgYWJzdHJhY3Q6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBrbGFzcyA9IG5ldyBDbGFzcyhcbiAgICAgIHRoaXMsXG4gICAgICB0b1B5dGhvbklkZW50aWZpZXIoY2xzLm5hbWUpLFxuICAgICAgY2xzLFxuICAgICAgY2xzLmZxbixcbiAgICAgIHtcbiAgICAgICAgYWJzdHJhY3QsXG4gICAgICAgIGJhc2VzOiBjbHMuYmFzZSA/IFt0aGlzLmZpbmRUeXBlKGNscy5iYXNlKV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVyZmFjZXM6IGNscy5pbnRlcmZhY2VzPy5tYXAoKGJhc2UpID0+IHRoaXMuZmluZFR5cGUoYmFzZSkpLFxuICAgICAgICBhYnN0cmFjdEJhc2VzOiBhYnN0cmFjdCA/IHRoaXMuZ2V0QWJzdHJhY3RCYXNlcyhjbHMpIDogW10sXG4gICAgICB9LFxuICAgICAgY2xzLmRvY3MsXG4gICAgKTtcblxuICAgIGlmIChjbHMuaW5pdGlhbGl6ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IGNscy5pbml0aWFsaXplcjtcblxuICAgICAga2xhc3MuYWRkTWVtYmVyKFxuICAgICAgICBuZXcgSW5pdGlhbGl6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICAnX19pbml0X18nLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBjbHMuaW5pdGlhbGl6ZXIuZG9jcyxcbiAgICAgICAgICBmYWxzZSwgLy8gTmV2ZXIgc3RhdGljXG4gICAgICAgICAgeyBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AoY2xzLmluaXRpYWxpemVyKSwgcGFyZW50OiBjbHMgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRQeXRob25UeXBlKGtsYXNzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN0YXRpY01ldGhvZChjbHM6IHNwZWMuQ2xhc3NUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IG1ldGhvZDtcblxuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgU3RhdGljTWV0aG9kKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUpLFxuICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICB0cnVlLCAvLyBBbHdheXMgc3RhdGljXG4gICAgICAgIHtcbiAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgIGxpZnRlZFByb3A6IHRoaXMuZ2V0bGlmdGVkUHJvcChtZXRob2QpLFxuICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU3RhdGljUHJvcGVydHkoY2xzOiBzcGVjLkNsYXNzVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShjbHMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgU3RhdGljUHJvcGVydHkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uUHJvcGVydHlOYW1lKHByb3AubmFtZSwgcHJvcC5jb25zdCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IHByb3AuYWJzdHJhY3QsXG4gICAgICAgICAgaW1tdXRhYmxlOiBwcm9wLmltbXV0YWJsZSxcbiAgICAgICAgICBpc1N0YXRpYzogcHJvcC5zdGF0aWMsXG4gICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2QoY2xzOiBzcGVjLkNsYXNzVHlwZSwgbWV0aG9kOiBzcGVjLk1ldGhvZCkge1xuICAgIGNvbnN0IHsgcGFyYW1ldGVycyA9IFtdIH0gPSBtZXRob2Q7XG5cbiAgICBpZiAobWV0aG9kLmFzeW5jKSB7XG4gICAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgICBuZXcgQXN5bmNNZXRob2QoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUsIG1ldGhvZC5wcm90ZWN0ZWQpLFxuICAgICAgICAgIG1ldGhvZC5uYW1lLFxuICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgICAgbWV0aG9kLmRvY3MsXG4gICAgICAgICAgISFtZXRob2Quc3RhdGljLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFic3RyYWN0OiBtZXRob2QuYWJzdHJhY3QsXG4gICAgICAgICAgICBsaWZ0ZWRQcm9wOiB0aGlzLmdldGxpZnRlZFByb3AobWV0aG9kKSxcbiAgICAgICAgICAgIHBhcmVudDogY2xzLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFB5dGhvblR5cGUoY2xzLmZxbikuYWRkTWVtYmVyKFxuICAgICAgICBuZXcgTWV0aG9kKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdG9QeXRob25NZXRob2ROYW1lKG1ldGhvZC5uYW1lLCBtZXRob2QucHJvdGVjdGVkKSxcbiAgICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgIG1ldGhvZC5yZXR1cm5zLFxuICAgICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAgICEhbWV0aG9kLnN0YXRpYyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhYnN0cmFjdDogbWV0aG9kLmFic3RyYWN0LFxuICAgICAgICAgICAgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksXG4gICAgICAgICAgICBwYXJlbnQ6IGNscyxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eShjbHM6IHNwZWMuQ2xhc3NUeXBlLCBwcm9wOiBzcGVjLlByb3BlcnR5KSB7XG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGNscy5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBQcm9wZXJ0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdG9QeXRob25Qcm9wZXJ0eU5hbWUocHJvcC5uYW1lLCBwcm9wLmNvbnN0LCBwcm9wLnByb3RlY3RlZCksXG4gICAgICAgIHByb3AubmFtZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgcHJvcC5kb2NzLFxuICAgICAgICB7XG4gICAgICAgICAgYWJzdHJhY3Q6IHByb3AuYWJzdHJhY3QsXG4gICAgICAgICAgaW1tdXRhYmxlOiBwcm9wLmltbXV0YWJsZSxcbiAgICAgICAgICBpc1N0YXRpYzogcHJvcC5zdGF0aWMsXG4gICAgICAgICAgcGFyZW50OiBjbHMsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25VbmlvblByb3BlcnR5KFxuICAgIGNsczogc3BlYy5DbGFzc1R5cGUsXG4gICAgcHJvcDogc3BlYy5Qcm9wZXJ0eSxcbiAgICBfdW5pb246IHNwZWMuVW5pb25UeXBlUmVmZXJlbmNlLFxuICApIHtcbiAgICB0aGlzLm9uUHJvcGVydHkoY2xzLCBwcm9wKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJlZ2luSW50ZXJmYWNlKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgbGV0IGlmYWNlOiBJbnRlcmZhY2UgfCBTdHJ1Y3Q7XG5cbiAgICBpZiAoaWZjLmRhdGF0eXBlKSB7XG4gICAgICBpZmFjZSA9IG5ldyBTdHJ1Y3QoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uSWRlbnRpZmllcihpZmMubmFtZSksXG4gICAgICAgIGlmYyxcbiAgICAgICAgaWZjLmZxbixcbiAgICAgICAgeyBiYXNlczogaWZjLmludGVyZmFjZXM/Lm1hcCgoYmFzZSkgPT4gdGhpcy5maW5kVHlwZShiYXNlKSkgfSxcbiAgICAgICAgaWZjLmRvY3MsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZmFjZSA9IG5ldyBJbnRlcmZhY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRvUHl0aG9uSWRlbnRpZmllcihpZmMubmFtZSksXG4gICAgICAgIGlmYyxcbiAgICAgICAgaWZjLmZxbixcbiAgICAgICAgeyBiYXNlczogaWZjLmludGVyZmFjZXM/Lm1hcCgoYmFzZSkgPT4gdGhpcy5maW5kVHlwZShiYXNlKSkgfSxcbiAgICAgICAgaWZjLmRvY3MsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShpZmFjZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25FbmRJbnRlcmZhY2UoX2lmYzogc3BlYy5JbnRlcmZhY2VUeXBlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW50ZXJmYWNlTWV0aG9kKGlmYzogc3BlYy5JbnRlcmZhY2VUeXBlLCBtZXRob2Q6IHNwZWMuTWV0aG9kKSB7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJzID0gW10gfSA9IG1ldGhvZDtcblxuICAgIHRoaXMuZ2V0UHl0aG9uVHlwZShpZmMuZnFuKS5hZGRNZW1iZXIoXG4gICAgICBuZXcgSW50ZXJmYWNlTWV0aG9kKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbk1ldGhvZE5hbWUobWV0aG9kLm5hbWUsIG1ldGhvZC5wcm90ZWN0ZWQpLFxuICAgICAgICBtZXRob2QubmFtZSxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgbWV0aG9kLnJldHVybnMsXG4gICAgICAgIG1ldGhvZC5kb2NzLFxuICAgICAgICAhIW1ldGhvZC5zdGF0aWMsXG4gICAgICAgIHsgbGlmdGVkUHJvcDogdGhpcy5nZXRsaWZ0ZWRQcm9wKG1ldGhvZCksIHBhcmVudDogaWZjIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnRlcmZhY2VQcm9wZXJ0eShpZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSwgcHJvcDogc3BlYy5Qcm9wZXJ0eSkge1xuICAgIGxldCBpZmFjZVByb3BlcnR5OiBJbnRlcmZhY2VQcm9wZXJ0eSB8IFN0cnVjdEZpZWxkO1xuXG4gICAgaWYgKGlmYy5kYXRhdHlwZSkge1xuICAgICAgaWZhY2VQcm9wZXJ0eSA9IG5ldyBTdHJ1Y3RGaWVsZCh0aGlzLCBwcm9wLCBpZmMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZmFjZVByb3BlcnR5ID0gbmV3IEludGVyZmFjZVByb3BlcnR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvblByb3BlcnR5TmFtZShwcm9wLm5hbWUsIHByb3AuY29uc3QsIHByb3AucHJvdGVjdGVkKSxcbiAgICAgICAgcHJvcC5uYW1lLFxuICAgICAgICBwcm9wLFxuICAgICAgICBwcm9wLmRvY3MsXG4gICAgICAgIHsgaW1tdXRhYmxlOiBwcm9wLmltbXV0YWJsZSwgaXNTdGF0aWM6IHByb3Auc3RhdGljLCBwYXJlbnQ6IGlmYyB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmdldFB5dGhvblR5cGUoaWZjLmZxbikuYWRkTWVtYmVyKGlmYWNlUHJvcGVydHkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQmVnaW5FbnVtKGVubTogc3BlYy5FbnVtVHlwZSkge1xuICAgIHRoaXMuYWRkUHl0aG9uVHlwZShcbiAgICAgIG5ldyBFbnVtKHRoaXMsIHRvUHl0aG9uSWRlbnRpZmllcihlbm0ubmFtZSksIGVubSwgZW5tLmZxbiwge30sIGVubS5kb2NzKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRW51bU1lbWJlcihlbm06IHNwZWMuRW51bVR5cGUsIG1lbWJlcjogc3BlYy5FbnVtTWVtYmVyKSB7XG4gICAgdGhpcy5nZXRQeXRob25UeXBlKGVubS5mcW4pLmFkZE1lbWJlcihcbiAgICAgIG5ldyBFbnVtTWVtYmVyKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0b1B5dGhvbklkZW50aWZpZXIobWVtYmVyLm5hbWUpLFxuICAgICAgICBtZW1iZXIubmFtZSxcbiAgICAgICAgbWVtYmVyLmRvY3MsXG4gICAgICAgIGVubSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkludGVyZmFjZU1ldGhvZE92ZXJsb2FkKFxuICAgIF9pZmM6IHNwZWMuSW50ZXJmYWNlVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IEludGVyZmFjZU1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IE1ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TdGF0aWNNZXRob2RPdmVybG9hZChcbiAgICBfY2xzOiBzcGVjLkNsYXNzVHlwZSxcbiAgICBfb3ZlcmxvYWQ6IHNwZWMuTWV0aG9kLFxuICAgIF9vcmlnaW5hbE1ldGhvZDogc3BlYy5NZXRob2QsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIFR5cGU6IFN0YXRpY01ldGhvZE92ZXJsb2FkJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzc2VtYmx5TW9kdWxlTmFtZShhc3NtOiBzcGVjLkFzc2VtYmx5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXNzbS50YXJnZXRzIS5weXRob24hLm1vZHVsZX0uX2pzaWlgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJlbnRGUU4oZnFuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG0gPSAvXiguKylcXC5bXi5dKyQvLmV4ZWMoZnFuKTtcblxuICAgIGlmIChtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwYXJlbnQgRlFOIG9mOiAke2Zxbn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbVsxXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyZW50KGZxbjogc3RyaW5nKTogUHl0aG9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHl0aG9uVHlwZSh0aGlzLmdldFBhcmVudEZRTihmcW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHl0aG9uVHlwZSh0eXBlOiBQeXRob25UeXBlKSB7XG4gICAgaWYgKHR5cGUuZnFuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBhIFB5dGhvbiB0eXBlIHdpdGhvdXQgYSBGUU4uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQYXJlbnQodHlwZS5mcW4pLmFkZE1lbWJlcih0eXBlKTtcbiAgICB0aGlzLnR5cGVzLnNldCh0eXBlLmZxbiwgdHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldGxpZnRlZFByb3AoXG4gICAgbWV0aG9kOiBzcGVjLk1ldGhvZCB8IHNwZWMuSW5pdGlhbGl6ZXIsXG4gICk6IHNwZWMuSW50ZXJmYWNlVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gSWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gdGhpcyBtZXRob2QsIGFuZCBpZiB0aGUgbGFzdCBwYXJhbWV0ZXIncyB0eXBlIGlzXG4gICAgLy8gYSBkYXRhdHlwZSBpbnRlcmZhY2UsIHRoZW4gd2Ugd2FudCB0byBsaWZ0IHRoZSBtZW1iZXJzIG9mIHRoYXQgbGFzdCBwYXJhbXRlclxuICAgIC8vIGFzIGtleXdvcmQgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgaWYgKG1ldGhvZC5wYXJhbWV0ZXJzPy5sZW5ndGggPz8gMCA+PSAxKSB7XG4gICAgICBjb25zdCBsYXN0UGFyYW1ldGVyID0gbWV0aG9kLnBhcmFtZXRlcnMhLnNsaWNlKC0xKVswXTtcbiAgICAgIGlmIChcbiAgICAgICAgIWxhc3RQYXJhbWV0ZXIudmFyaWFkaWMgJiZcbiAgICAgICAgc3BlYy5pc05hbWVkVHlwZVJlZmVyZW5jZShsYXN0UGFyYW1ldGVyLnR5cGUpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbGFzdFBhcmFtZXRlclR5cGUgPSB0aGlzLmZpbmRUeXBlKGxhc3RQYXJhbWV0ZXIudHlwZS5mcW4pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc3BlYy5pc0ludGVyZmFjZVR5cGUobGFzdFBhcmFtZXRlclR5cGUpICYmXG4gICAgICAgICAgbGFzdFBhcmFtZXRlclR5cGUuZGF0YXR5cGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGxhc3RQYXJhbWV0ZXJUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWJzdHJhY3RCYXNlcyhjbHM6IHNwZWMuQ2xhc3NUeXBlKTogc3BlYy5DbGFzc1R5cGVbXSB7XG4gICAgY29uc3QgYWJzdHJhY3RCYXNlczogc3BlYy5DbGFzc1R5cGVbXSA9IFtdO1xuXG4gICAgaWYgKGNscy5iYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmZpbmRUeXBlKGNscy5iYXNlKTtcblxuICAgICAgaWYgKCFzcGVjLmlzQ2xhc3NUeXBlKGJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIGluaGVyaXRlbmNlIHRoYXQgaXNuJ3QgYSBjbGFzcz9cIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChiYXNlLmFic3RyYWN0KSB7XG4gICAgICAgIGFic3RyYWN0QmFzZXMucHVzaChiYXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWJzdHJhY3RCYXNlcztcbiAgfVxufVxuXG4vKipcbiAqIFBvc2l0aW9uYWwgYXJndW1lbnQgb3Iga2V5d29yZCBwYXJhbWV0ZXJcbiAqL1xuaW50ZXJmYWNlIERvY3VtZW50YWJsZUFyZ3VtZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZWZpbmluZ1R5cGU6IHNwZWMuVHlwZTtcbiAgZG9jcz86IHNwZWMuRG9jcztcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgZ2l2ZW4gZG9jcywgdXNlZCBmb3IgbWV0aG9kIGFyZ3VtZW50cyBhbmQgaW5saW5lZCBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG9uZWxpbmVEZXNjcmlwdGlvbihkb2NzOiBzcGVjLkRvY3MgfCB1bmRlZmluZWQpIHtcbiAgLy8gT25seSBjb25zaWRlciBhIHN1YnNldCBvZiBmaWVsZHMgaGVyZSwgd2UgZG9uJ3QgaGF2ZSBhIGxvdCBvZiBmb3JtYXR0aW5nIHNwYWNlXG4gIGlmICghZG9jcyB8fCBPYmplY3Qua2V5cyhkb2NzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJy0nO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBbXTtcbiAgaWYgKGRvY3Muc3VtbWFyeSkge1xuICAgIHBhcnRzLnB1c2gobWQycnN0KHJlbmRlclN1bW1hcnkoZG9jcykpKTtcbiAgfVxuICBpZiAoZG9jcy5yZW1hcmtzKSB7XG4gICAgcGFydHMucHVzaChtZDJyc3QoZG9jcy5yZW1hcmtzKSk7XG4gIH1cbiAgaWYgKGRvY3MuZGVmYXVsdCkge1xuICAgIHBhcnRzLnB1c2goYERlZmF1bHQ6ICR7bWQycnN0KGRvY3MuZGVmYXVsdCl9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZE1lbnRpb25TdGFiaWxpdHkoczogc3BlYy5TdGFiaWxpdHkpIHtcbiAgLy8gRG9uJ3QgcmVuZGVyIFwic3RhYmxlXCIgb3IgXCJleHRlcm5hbFwiLCB0aG9zZSBhcmUgYm90aCBzdGFibGUgYnkgaW1wbGljYXRpb24uXG4gIHJldHVybiBzID09PSBzcGVjLlN0YWJpbGl0eS5EZXByZWNhdGVkIHx8IHMgPT09IHNwZWMuU3RhYmlsaXR5LkV4cGVyaW1lbnRhbDtcbn1cblxuZnVuY3Rpb24gaXNTdHJ1Y3QoXG4gIHR5cGVTeXN0ZW06IHJlZmxlY3QuVHlwZVN5c3RlbSxcbiAgcmVmOiBzcGVjLlR5cGVSZWZlcmVuY2UsXG4pOiBib29sZWFuIHtcbiAgaWYgKCFzcGVjLmlzTmFtZWRUeXBlUmVmZXJlbmNlKHJlZikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgdHlwZSA9IHR5cGVTeXN0ZW0udHJ5RmluZEZxbihyZWYuZnFuKTtcbiAgcmV0dXJuICEhKHR5cGU/LmlzSW50ZXJmYWNlVHlwZSgpICYmIHR5cGU/LmlzRGF0YVR5cGUoKSk7XG59XG5cbi8qKlxuICogQXBwZW5kcyBgX2AgYXQgdGhlIGVuZCBvZiBgbmFtZWAgdW50aWwgaXQgbm8gbG9uZ2VyIGNvbmZsaWN0cyB3aXRoIGFueSBvZiB0aGVcbiAqIGVudHJpZXMgaW4gYGluVXNlYC5cbiAqXG4gKiBAcGFyYW0gbmFtZSAgdGhlIG5hbWUgdG8gYmUgc2x1Z2lmaWVkLlxuICogQHBhcmFtIGluVXNlIHRoZSBuYW1lcyB0aGF0IGFyZSBhbHJlYWR5IGJlaW5nIHVzZWQuXG4gKlxuICogQHJldHVybnMgdGhlIHNsdWdpZmllZCBuYW1lLlxuICovXG5mdW5jdGlvbiBzbHVnaWZ5QXNOZWVkZWQobmFtZTogc3RyaW5nLCBpblVzZTogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBpblVzZVNldCA9IG5ldyBTZXQoaW5Vc2UpO1xuICB3aGlsZSAoaW5Vc2VTZXQuaGFzKG5hbWUpKSB7XG4gICAgbmFtZSA9IGAke25hbWV9X2A7XG4gIH1cbiAgcmV0dXJuIG5hbWU7XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBCRUhPTEQ6IEhlbHBlcnMgdG8gb3V0cHV0IGNvZGUgdGhhdCBsb29rcyBsaWtlIHdoYXQgQmxhY2sgd291bGQgZm9ybWF0IGludG8uLi5cbi8vXG4vLyBAc2VlIGh0dHBzOi8vYmxhY2sucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL3RoZV9ibGFja19jb2RlX3N0eWxlLmh0bWxcblxuY29uc3QgVEFSR0VUX0xJTkVfTEVOR1RIID0gODg7XG5cbmZ1bmN0aW9uIG9wZW5TaWduYXR1cmUoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAga2V5d29yZDogJ2NsYXNzJyxcbiAgbmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogdm9pZDtcbmZ1bmN0aW9uIG9wZW5TaWduYXR1cmUoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAga2V5d29yZDogJ2RlZicsXG4gIG5hbWU6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgdHJhaWxpbmdDb21tYTogYm9vbGVhbixcbiAgcmV0dXJuVHlwZTogc3RyaW5nLFxuKTogdm9pZDtcbmZ1bmN0aW9uIG9wZW5TaWduYXR1cmUoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAga2V5d29yZDogJ2NsYXNzJyB8ICdkZWYnLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBhcmFtczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHRyYWlsaW5nQ29tbWEgPSBmYWxzZSxcbiAgcmV0dXJuVHlwZT86IHN0cmluZyxcbikge1xuICBjb25zdCBwcmVmaXggPSBgJHtrZXl3b3JkfSAke25hbWV9YDtcbiAgY29uc3Qgc3VmZml4ID0gcmV0dXJuVHlwZSA/IGAgLT4gJHtyZXR1cm5UeXBlfWAgOiAnJztcbiAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLm9wZW5CbG9jayhgJHtwcmVmaXh9JHtyZXR1cm5UeXBlID8gJygpJyA6ICcnfSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGpvaW4gPSAnLCAnO1xuICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKHBhcmFtcywgam9pbik7XG5cbiAgY29uc3QgaGFzQ29tbWVudHMgPSAhcGFyYW1zLnNvbWUoKHBhcmFtKSA9PiAvIyAuKyQvLmV4ZWMocGFyYW0pKTtcblxuICBpZiAoXG4gICAgaGFzQ29tbWVudHMgJiZcbiAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICAgIGpvaW5TaXplICtcbiAgICAgICAgc3VmZml4Lmxlbmd0aCArXG4gICAgICAgIDJcbiAgKSB7XG4gICAgY29kZS5vcGVuQmxvY2soYCR7cHJlZml4fSgke3BhcmFtcy5qb2luKGpvaW4pfSkke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb2RlLmluZGVudChgJHtwcmVmaXh9KGApO1xuICBpZiAoXG4gICAgIWhhc0NvbW1lbnRzICYmXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICAgIGpvaW5TaXplICtcbiAgICAgICAgKHRyYWlsaW5nQ29tbWEgPyAxIDogMClcbiAgKSB7XG4gICAgY29kZS5saW5lKGAke3BhcmFtcy5qb2luKGpvaW4pfSR7dHJhaWxpbmdDb21tYSA/ICcsJyA6ICcnfWApO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICBjb2RlLmxpbmUocGFyYW0ucmVwbGFjZSgvKFxccyojIC4rKT8kLywgJywkMScpKTtcbiAgICB9XG4gIH1cbiAgY29kZS51bmluZGVudChmYWxzZSk7XG4gIGNvZGUub3BlbkJsb2NrKGApJHtzdWZmaXh9YCk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkNhbGxSZXN1bHQoXG4gIGNvZGU6IENvZGVNYWtlcixcbiAgdmFyaWFibGU6IHN0cmluZyxcbiAgZnVuY3Q6IHN0cmluZyxcbiAgcGFyYW1zOiByZWFkb25seSBzdHJpbmdbXSxcbikge1xuICBjb25zdCBwcmVmaXggPSBgJHt2YXJpYWJsZX0gPSAke2Z1bmN0fShgO1xuICBjb25zdCBzdWZmaXggPSAnKSc7XG5cbiAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGpvaW4gPSAnLCAnO1xuICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKHBhcmFtcywgam9pbik7XG5cbiAgaWYgKFxuICAgIFRBUkdFVF9MSU5FX0xFTkdUSCA+XG4gICAgY29kZS5jdXJyZW50SW5kZW50TGVuZ3RoICtcbiAgICAgIHByZWZpeC5sZW5ndGggK1xuICAgICAgZWxlbWVudHNTaXplICtcbiAgICAgIGpvaW5TaXplICtcbiAgICAgIHN1ZmZpeC5sZW5ndGhcbiAgKSB7XG4gICAgY29kZS5saW5lKGAke3ByZWZpeH0ke3BhcmFtcy5qb2luKGpvaW4pfSR7c3VmZml4fWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvZGUuaW5kZW50KHByZWZpeCk7XG4gIGlmIChUQVJHRVRfTElORV9MRU5HVEggPiBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggKyBlbGVtZW50c1NpemUgKyBqb2luU2l6ZSkge1xuICAgIGNvZGUubGluZShwYXJhbXMuam9pbihqb2luKSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgIGNvZGUubGluZShgJHtwYXJhbX0sYCk7XG4gICAgfVxuICB9XG4gIGNvZGUudW5pbmRlbnQoc3VmZml4KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduRGljdGlvbmFyeShcbiAgY29kZTogQ29kZU1ha2VyLFxuICB2YXJpYWJsZTogc3RyaW5nLFxuICBlbGVtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHRyYWlsaW5nPzogc3RyaW5nLFxuICBjb21wYWN0ID0gZmFsc2UsXG4pOiB2b2lkIHtcbiAgY29uc3Qgc3BhY2UgPSBjb21wYWN0ID8gJycgOiAnICc7XG5cbiAgY29uc3QgcHJlZml4ID0gYCR7dmFyaWFibGV9JHtzcGFjZX09JHtzcGFjZX17YDtcbiAgY29uc3Qgc3VmZml4ID0gYH0ke3RyYWlsaW5nID8/ICcnfWA7XG5cbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNvbXBhY3QpIHtcbiAgICBjb25zdCBqb2luID0gJywgJztcbiAgICBjb25zdCB7IGVsZW1lbnRzU2l6ZSwgam9pblNpemUgfSA9IHRvdGFsU2l6ZU9mKGVsZW1lbnRzLCBqb2luKTtcbiAgICBpZiAoXG4gICAgICBUQVJHRVRfTElORV9MRU5HVEggPlxuICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArXG4gICAgICAgIGVsZW1lbnRzU2l6ZSArXG4gICAgICAgIGpvaW5TaXplICtcbiAgICAgICAgc3VmZml4Lmxlbmd0aFxuICAgICkge1xuICAgICAgY29kZS5saW5lKGAke3ByZWZpeH0ke2VsZW1lbnRzLmpvaW4oam9pbil9JHtzdWZmaXh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY29kZS5pbmRlbnQocHJlZml4KTtcbiAgZm9yIChjb25zdCBlbHQgb2YgZWxlbWVudHMpIHtcbiAgICBjb2RlLmxpbmUoYCR7ZWx0fSxgKTtcbiAgfVxuICBjb2RlLnVuaW5kZW50KHN1ZmZpeCk7XG59XG5cbmZ1bmN0aW9uIGVtaXRMaXN0KFxuICBjb2RlOiBDb2RlTWFrZXIsXG4gIHByZWZpeDogc3RyaW5nLFxuICBlbGVtZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHN1ZmZpeDogc3RyaW5nLFxuICBvcHRzPzogeyBpZk11bHRpOiBbc3RyaW5nLCBzdHJpbmddIH0sXG4pIHtcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvZGUubGluZShgJHtwcmVmaXh9JHtzdWZmaXh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgam9pbiA9ICcsICc7XG4gIGNvbnN0IHsgZWxlbWVudHNTaXplLCBqb2luU2l6ZSB9ID0gdG90YWxTaXplT2YoZWxlbWVudHMsIGpvaW4pO1xuICBpZiAoXG4gICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICBjb2RlLmN1cnJlbnRJbmRlbnRMZW5ndGggK1xuICAgICAgcHJlZml4Lmxlbmd0aCArXG4gICAgICBlbGVtZW50c1NpemUgK1xuICAgICAgam9pblNpemUgK1xuICAgICAgc3VmZml4Lmxlbmd0aFxuICApIHtcbiAgICBjb2RlLmxpbmUoYCR7cHJlZml4fSR7ZWxlbWVudHMuam9pbihqb2luKX0ke3N1ZmZpeH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBbYmVmb3JlLCBhZnRlcl0gPSBvcHRzPy5pZk11bHRpID8/IFsnJywgJyddO1xuXG4gIGNvZGUuaW5kZW50KGAke3ByZWZpeH0ke2JlZm9yZX1gKTtcbiAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvZGUubGluZShlbGVtZW50c1swXSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKFxuICAgICAgVEFSR0VUX0xJTkVfTEVOR1RIID5cbiAgICAgIGNvZGUuY3VycmVudEluZGVudExlbmd0aCArIGVsZW1lbnRzU2l6ZSArIGpvaW5TaXplXG4gICAgKSB7XG4gICAgICBjb2RlLmxpbmUoZWxlbWVudHMuam9pbihqb2luKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZWx0IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGNvZGUubGluZShgJHtlbHR9LGApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb2RlLnVuaW5kZW50KGAke2FmdGVyfSR7c3VmZml4fWApO1xufVxuXG5mdW5jdGlvbiB0b3RhbFNpemVPZihzdHJpbmdzOiByZWFkb25seSBzdHJpbmdbXSwgam9pbjogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgZWxlbWVudHNTaXplOiBzdHJpbmdzXG4gICAgICAubWFwKChzdHIpID0+IHN0ci5sZW5ndGgpXG4gICAgICAucmVkdWNlKChhY2MsIGVsdCkgPT4gYWNjICsgZWx0LCAwKSxcbiAgICBqb2luU2l6ZTogc3RyaW5ncy5sZW5ndGggPiAxID8gam9pbi5sZW5ndGggKiAoc3RyaW5ncy5sZW5ndGggLSAxKSA6IDAsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5lc3RlZENvbnRleHQoXG4gIGNvbnRleHQ6IEVtaXRDb250ZXh0LFxuICBmcW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IEVtaXRDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb250ZXh0LFxuICAgIHN1cnJvdW5kaW5nVHlwZUZxbnM6XG4gICAgICBmcW4gIT0gbnVsbFxuICAgICAgICA/IFsuLi4oY29udGV4dC5zdXJyb3VuZGluZ1R5cGVGcW5zID8/IFtdKSwgZnFuXVxuICAgICAgICA6IGNvbnRleHQuc3Vycm91bmRpbmdUeXBlRnFucyxcbiAgfTtcbn1cblxuY29uc3QgaXNEZXByZWNhdGVkID0gKHg6IFB5dGhvbkJhc2UpID0+IHguZG9jcz8uZGVwcmVjYXRlZCAhPT0gdW5kZWZpbmVkO1xuIl19
|