@bitgo-beta/sdk-api 1.10.1-beta.1697 → 1.10.1-beta.1699
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +9 -7
- package/dist/src/bitgoAPI.d.ts +5 -0
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +22 -1
- package/dist/src/encrypt.d.ts +39 -0
- package/dist/src/encrypt.d.ts.map +1 -1
- package/dist/src/encrypt.js +134 -1
- package/dist/test/unit/encrypt.js +117 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -7
package/dist/src/bitgoAPI.js
CHANGED
|
@@ -559,6 +559,27 @@ class BitGoAPI {
|
|
|
559
559
|
throw error;
|
|
560
560
|
}
|
|
561
561
|
}
|
|
562
|
+
/**
|
|
563
|
+
* Async decrypt that auto-detects v1 (SJCL) or v2 (Argon2id).
|
|
564
|
+
* Migration path from sync decrypt() -- use this before the breaking release.
|
|
565
|
+
*/
|
|
566
|
+
async decryptAsync(params) {
|
|
567
|
+
params = params || {};
|
|
568
|
+
sdk_core_1.common.validateParams(params, ['input', 'password'], []);
|
|
569
|
+
if (!params.password) {
|
|
570
|
+
throw new Error(`cannot decrypt without password`);
|
|
571
|
+
}
|
|
572
|
+
try {
|
|
573
|
+
return await (0, encrypt_1.decryptAsync)(params.password, params.input);
|
|
574
|
+
}
|
|
575
|
+
catch (error) {
|
|
576
|
+
if (error.message.includes("ccm: tag doesn't match") ||
|
|
577
|
+
error.message.includes('The operation failed for an operation-specific reason')) {
|
|
578
|
+
throw new Error('incorrect password');
|
|
579
|
+
}
|
|
580
|
+
throw error;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
562
583
|
/**
|
|
563
584
|
* Attempt to decrypt multiple wallet keys with the provided passphrase
|
|
564
585
|
* @param {DecryptKeysOptions} params - Parameters object containing wallet key pairs and password
|
|
@@ -2013,4 +2034,4 @@ class BitGoAPI {
|
|
|
2013
2034
|
}
|
|
2014
2035
|
exports.BitGoAPI = BitGoAPI;
|
|
2015
2036
|
BitGoAPI._testnetWarningMessage = false;
|
|
2016
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Z29BUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBdUI4QjtBQUM5Qiw4REFBZ0Q7QUFDaEQsbURBQXVGO0FBQ3ZGLDhEQUFnRDtBQUNoRCxtREFBOEQ7QUFDOUQsa0VBQW9EO0FBRXBELGtEQUE2QjtBQUM3QiwwQ0FBNEI7QUFDNUIscURBQXVDO0FBQ3ZDLHVEQUF5QztBQUN6QywrQkFPZTtBQUNmLHVDQUE2QztBQUM3QyxzREFBbUQ7QUE0Q25ELDRDQUE2QztBQUM3Qyx5Q0FBMEM7QUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFRLEVBQUMsV0FBVyxDQUFDLENBQUM7QUFFcEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDOUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDNUMsc0NBQXVDO0FBRXZDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN4QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztBQUMxRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM5QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBRTlELE1BQWEsUUFBUTtJQXNDbkIsWUFBWSxTQUEwQixFQUFFO1FBcEJyQixpQkFBWSxHQUF1RCxDQUFDLENBQUM7UUFDOUUsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBTXpCLGFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBY2pDLElBQUksQ0FBQyxzQkFBc0IsR0FB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UUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDN0YsQ0FBQztvQkFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsVUFBVSxFQUFFLENBQUM7b0JBRWIsSUFBSSxVQUFVLElBQUksVUFBVSxFQUFFLENBQUM7d0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsVUFBVSxhQUFhLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUN6RixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBdHZFSCw0QkF1dkVDO0FBNXVFa0IsK0JBQXNCLEdBQUcsS0FBSyxBQUFSLENBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBbGlhc0Vudmlyb25tZW50cyxcbiAgQmFzZUNvaW4sXG4gIGJpdGNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgQml0R29SZXF1ZXN0LFxuICBDb2luQ29uc3RydWN0b3IsXG4gIGNvbW1vbixcbiAgRGVjcnlwdEtleXNPcHRpb25zLFxuICBEZWNyeXB0T3B0aW9ucyxcbiAgZGVmYXVsdENvbnN0YW50cyxcbiAgRWNkaERlcml2ZWRLZXlwYWlyLFxuICBFbmNyeXB0T3B0aW9ucyxcbiAgRW52aXJvbm1lbnROYW1lLFxuICBnZW5lcmF0ZVJhbmRvbVBhc3N3b3JkLFxuICBnZXRBZGRyZXNzUDJQS0gsXG4gIGdldFNoYXJlZFNlY3JldCxcbiAgR2V0U2hhcmluZ0tleU9wdGlvbnMsXG4gIEdldFNpZ25pbmdLZXlBcGksXG4gIEdsb2JhbENvaW5GYWN0b3J5LFxuICBJUmVxdWVzdFRyYWNlcixcbiAgbWFrZVJhbmRvbUtleSxcbiAgc2FuaXRpemVMZWdhY3lQYXRoLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBzZGtIbWFjIGZyb20gJ0BiaXRnby1iZXRhL3Nkay1obWFjJztcbmltcG9ydCB7IERlZmF1bHRIbWFjQXV0aFN0cmF0ZWd5LCB0eXBlIElIbWFjQXV0aFN0cmF0ZWd5IH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWhtYWMnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiwgRUNQYWlySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0ICogYXMgYml0Y29pbk1lc3NhZ2UgZnJvbSAnYml0Y29pbmpzLW1lc3NhZ2UnO1xuaW1wb3J0IHsgdHlwZSBBZ2VudCB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IGRlYnVnTGliIGZyb20gJ2RlYnVnJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHNlY3AyNTZrMSBmcm9tICdzZWNwMjU2azEnO1xuaW1wb3J0ICogYXMgc3VwZXJhZ2VudCBmcm9tICdzdXBlcmFnZW50JztcbmltcG9ydCB7XG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IsXG4gIGhhbmRsZVJlc3BvbnNlUmVzdWx0LFxuICBzZXJpYWxpemVSZXF1ZXN0RGF0YSxcbiAgc2V0UmVxdWVzdFF1ZXJ5U3RyaW5nLFxuICB0b0JpdGdvUmVxdWVzdCxcbiAgdmVyaWZ5UmVzcG9uc2VBc3luYyxcbn0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgZGVjcnlwdCwgZW5jcnlwdCB9IGZyb20gJy4vZW5jcnlwdCc7XG5pbXBvcnQgeyB2ZXJpZnlBZGRyZXNzIH0gZnJvbSAnLi92MS92ZXJpZnlBZGRyZXNzJztcbmltcG9ydCB7XG4gIEFjY2Vzc1Rva2VuT3B0aW9ucyxcbiAgQWRkQWNjZXNzVG9rZW5PcHRpb25zLFxuICBBZGRBY2Nlc3NUb2tlblJlc3BvbnNlLFxuICBBZGRpdGlvbmFsSGVhZGVyc0NhbGxiYWNrLFxuICBBdXRoZW50aWNhdGVPcHRpb25zLFxuICBBdXRoZW50aWNhdGVXaXRoQXV0aENvZGVPcHRpb25zLFxuICBCaXRHb0FQSU9wdGlvbnMsXG4gIEJpdEdvSnNvbixcbiAgQml0R29TaW11bGF0ZVdlYmhvb2tPcHRpb25zLFxuICBDYWxjdWxhdGVIbWFjU3ViamVjdE9wdGlvbnMsXG4gIENhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzT3B0aW9ucyxcbiAgQ2FsY3VsYXRlUmVxdWVzdEhtYWNPcHRpb25zLFxuICBDaGFuZ2VQYXNzd29yZE9wdGlvbnMsXG4gIENvbnN0YW50cyxcbiAgRGVwcmVjYXRlZFZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBFc3RpbWF0ZUZlZU9wdGlvbnMsXG4gIEV4dGVuZFRva2VuT3B0aW9ucyxcbiAgR2V0RWNkaFNlY3JldE9wdGlvbnMsXG4gIEdldFVzZXJPcHRpb25zLFxuICBMaXN0V2ViaG9va05vdGlmaWNhdGlvbnNPcHRpb25zLFxuICBMb2dpblJlc3BvbnNlLFxuICBQaW5nT3B0aW9ucyxcbiAgUHJvY2Vzc2VkQXV0aGVudGljYXRpb25PcHRpb25zLFxuICBSZWNvbnN0aXR1dGVkU2VjcmV0LFxuICBSZWNvbnN0aXR1dGVTZWNyZXRPcHRpb25zLFxuICBSZWdpc3RlclB1c2hUb2tlbk9wdGlvbnMsXG4gIFJlbW92ZUFjY2Vzc1Rva2VuT3B0aW9ucyxcbiAgUmVxdWVzdEhlYWRlcnMsXG4gIFJlcXVlc3RNZXRob2RzLFxuICBTcGxpdFNlY3JldCxcbiAgU3BsaXRTZWNyZXRPcHRpb25zLFxuICBUb2tlbklzc3VhbmNlLFxuICBUb2tlbklzc3VhbmNlUmVzcG9uc2UsXG4gIFVubG9ja09wdGlvbnMsXG4gIFVzZXIsXG4gIFZlcmlmeVBhc3N3b3JkT3B0aW9ucyxcbiAgVmVyaWZ5UHVzaFRva2VuT3B0aW9ucyxcbiAgVmVyaWZ5UmVzcG9uc2VJbmZvLFxuICBWZXJpZnlSZXNwb25zZU9wdGlvbnMsXG4gIFZlcmlmeVNoYXJkc09wdGlvbnMsXG4gIFdlYmhvb2tPcHRpb25zLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBzaGFtaXIgPSByZXF1aXJlKCdzZWNyZXRzLmpzLWdyZW1wZScpO1xuaW1wb3J0IHBqc29uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzphcGknKTtcblxuY29uc3QgQmxvY2tjaGFpbiA9IHJlcXVpcmUoJy4vdjEvYmxvY2tjaGFpbicpO1xuY29uc3QgS2V5Y2hhaW5zID0gcmVxdWlyZSgnLi92MS9rZXljaGFpbnMnKTtcbmltcG9ydCBXYWxsZXQgPSByZXF1aXJlKCcuL3YxL3dhbGxldCcpO1xuXG5jb25zdCBXYWxsZXRzID0gcmVxdWlyZSgnLi92MS93YWxsZXRzJyk7XG5jb25zdCBNYXJrZXRzID0gcmVxdWlyZSgnLi92MS9tYXJrZXRzJyk7XG5jb25zdCBQZW5kaW5nQXBwcm92YWxzID0gcmVxdWlyZSgnLi92MS9wZW5kaW5nYXBwcm92YWxzJyk7XG5jb25zdCBUcmF2ZWxSdWxlID0gcmVxdWlyZSgnLi92MS90cmF2ZWxSdWxlJyk7XG5jb25zdCBUcmFuc2FjdGlvbkJ1aWxkZXIgPSByZXF1aXJlKCcuL3YxL3RyYW5zYWN0aW9uQnVpbGRlcicpO1xuXG5leHBvcnQgY2xhc3MgQml0R29BUEkgaW1wbGVtZW50cyBCaXRHb0Jhc2Uge1xuICAvLyB2MSB0eXBlc1xuICBwcm90ZWN0ZWQgX2tleWNoYWluczogYW55O1xuICBwcm90ZWN0ZWQgX3dhbGxldHM6IGFueTtcbiAgcHJvdGVjdGVkIF9tYXJrZXRzPzogYW55O1xuICBwcm90ZWN0ZWQgX2Jsb2NrY2hhaW4/OiBhbnk7XG4gIHByb3RlY3RlZCBfdHJhdmVsUnVsZT86IGFueTtcbiAgcHJvdGVjdGVkIF9wZW5kaW5nQXBwcm92YWxzPzogYW55O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgX2NvbnN0YW50czogYW55O1xuICBwcm90ZWN0ZWQgc3RhdGljIF9jb25zdGFudHNFeHBpcmU6IGFueTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfdGVzdG5ldFdhcm5pbmdNZXNzYWdlID0gZmFsc2U7XG4gIHB1YmxpYyByZWFkb25seSBlbnY6IEVudmlyb25tZW50TmFtZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYXNlVXJsOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYmFzZUFwaVVybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Jhc2VBcGlVcmxWMjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Jhc2VBcGlVcmxWMzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2VudjogRW52aXJvbm1lbnROYW1lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2F1dGhWZXJzaW9uOiBFeGNsdWRlPEJpdEdvQVBJT3B0aW9uc1snYXV0aFZlcnNpb24nXSwgdW5kZWZpbmVkPiA9IDI7XG4gIHByb3RlY3RlZCBfaG1hY1ZlcmlmaWNhdGlvbiA9IHRydWU7XG4gIHByb3RlY3RlZCByZWFkb25seSBfcHJveHk/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdXNlcj86IFVzZXI7XG4gIHByb3RlY3RlZCBfZXh0ZW5zaW9uS2V5PzogRUNQYWlySW50ZXJmYWNlO1xuICBwcm90ZWN0ZWQgX3JlcUlkPzogSVJlcXVlc3RUcmFjZXI7XG4gIHByb3RlY3RlZCBfdG9rZW4/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdmVyc2lvbiA9IHBqc29uLnZlcnNpb247XG4gIHByb3RlY3RlZCBfdXNlckFnZW50Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2VjZGhYcHJ2Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3JlZnJlc2hUb2tlbj86IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jbGllbnRJZD86IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jbGllbnRTZWNyZXQ/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdmFsaWRhdGU6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBjb29raWVzUHJvcGFnYXRpb25FbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jdXN0b21Qcm94eUFnZW50PzogQWdlbnQ7XG4gIHByaXZhdGUgX3JlcXVlc3RJZFByZWZpeD86IHN0cmluZztcbiAgcHJpdmF0ZSBnZXRBZGRpdGlvbmFsSGVhZGVyc0NiPzogQWRkaXRpb25hbEhlYWRlcnNDYWxsYmFjaztcbiAgcHJvdGVjdGVkIF9obWFjQXV0aFN0cmF0ZWd5OiBJSG1hY0F1dGhTdHJhdGVneTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IEJpdEdvQVBJT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5nZXRBZGRpdGlvbmFsSGVhZGVyc0NiID0gcGFyYW1zLmdldEFkZGl0aW9uYWxIZWFkZXJzQ2I7XG4gICAgdGhpcy5fcmVxdWVzdElkUHJlZml4ID0gcGFyYW1zLnJlcXVlc3RJZFByZWZpeDtcbiAgICB0aGlzLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICAhY29tbW9uLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIFtdLFxuICAgICAgICBbXG4gICAgICAgICAgJ2FjY2Vzc1Rva2VuJyxcbiAgICAgICAgICAndXNlckFnZW50JyxcbiAgICAgICAgICAnY3VzdG9tUm9vdFVSSScsXG4gICAgICAgICAgJ2N1c3RvbUJpdGNvaW5OZXR3b3JrJyxcbiAgICAgICAgICAnc2VydmVyWHB1YicsXG4gICAgICAgICAgJ3N0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsJyxcbiAgICAgICAgXVxuICAgICAgKSB8fFxuICAgICAgKHBhcmFtcy51c2VQcm9kdWN0aW9uICYmICFfLmlzQm9vbGVhbihwYXJhbXMudXNlUHJvZHVjdGlvbikpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB3ZSBvcGVyYXRlIG9uIHRoZSB0ZXN0IHNlcnZlci5cbiAgICAvLyBEZXByZWNhdGUgdXNlUHJvZHVjdGlvbiBpbiB0aGUgZnV0dXJlXG4gICAgbGV0IGVudjogRW52aXJvbm1lbnROYW1lO1xuXG4gICAgaWYgKHBhcmFtcy51c2VQcm9kdWN0aW9uKSB7XG4gICAgICBpZiAocGFyYW1zLmVudiAmJiBwYXJhbXMuZW52ICE9PSAncHJvZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgdXNlIHVzZVByb2R1Y3Rpb24gd2hlbiBlbnY9JyArIHBhcmFtcy5lbnYpO1xuICAgICAgfVxuICAgICAgZW52ID0gJ3Byb2QnO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBwYXJhbXMuY3VzdG9tUm9vdFVSSSB8fFxuICAgICAgcGFyYW1zLmN1c3RvbUJpdGNvaW5OZXR3b3JrIHx8XG4gICAgICBwYXJhbXMuY3VzdG9tU2lnbmluZ0FkZHJlc3MgfHxcbiAgICAgIHBhcmFtcy5zZXJ2ZXJYcHViIHx8XG4gICAgICBwcm9jZXNzLmVudi5CSVRHT19DVVNUT01fUk9PVF9VUkkgfHxcbiAgICAgIHByb2Nlc3MuZW52LkJJVEdPX0NVU1RPTV9CSVRDT0lOX05FVFdPUktcbiAgICApIHtcbiAgICAgIC8vIGZvciBicmFuY2ggZGVwbG95cywgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgY3VzdG9tIGVuZHBvaW50cyB3aGlsZSBzdGlsbFxuICAgICAgLy8gbWFpbnRhaW5pbmcgdGhlIG5hbWUgb2Ygc3BlY2lmaWVkIHRoZSBlbnZpcm9ubWVudFxuICAgICAgZW52ID0gcGFyYW1zLmVudiA9PT0gJ2JyYW5jaCcgPyAnYnJhbmNoJyA6ICdjdXN0b20nO1xuICAgICAgaWYgKHBhcmFtcy5jdXN0b21Sb290VVJJKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmkgPSBwYXJhbXMuY3VzdG9tUm9vdFVSSTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuY3VzdG9tQml0Y29pbk5ldHdvcmspIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLm5ldHdvcmsgPSBwYXJhbXMuY3VzdG9tQml0Y29pbk5ldHdvcms7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmN1c3RvbVNpZ25pbmdBZGRyZXNzKSB7XG4gICAgICAgIChjb21tb24uRW52aXJvbm1lbnRzW2Vudl0gYXMgYW55KS5jdXN0b21TaWduaW5nQWRkcmVzcyA9IHBhcmFtcy5jdXN0b21TaWduaW5nQWRkcmVzcztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuc2VydmVyWHB1Yikge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0uc2VydmVyWHB1YiA9IHBhcmFtcy5zZXJ2ZXJYcHViO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zdGVsbGFyRmVkZXJhdGlvblNlcnZlclVybCkge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0uc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmwgPSBwYXJhbXMuc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmw7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gcGFyYW1zLmVudiB8fCAocHJvY2Vzcy5lbnYuQklUR09fRU5WIGFzIEVudmlyb25tZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBoYXNuJ3QgYmVlbiBzZXQgdG8gdHJ1ZSBhbHJlYWR5IHNvbWUgY29uZGl0aW9ucyBhcmUgbm90IG1ldFxuICAgIGlmIChwYXJhbXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCAmJiAhdGhpcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvb2tpZXMgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIGN1c3RvbSBVUklzIGFyZSBpbiB1c2UnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmF1dGhWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2F1dGhWZXJzaW9uID0gcGFyYW1zLmF1dGhWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgZW52IGlzIGFuIGFsaWFzLCBzd2FwIGl0IG91dCB3aXRoIHRoZSBlcXVpdmFsZW50IHN1cHBvcnRlZCBlbnZpcm9ubWVudFxuICAgIGlmIChlbnYgaW4gQWxpYXNFbnZpcm9ubWVudHMpIHtcbiAgICAgIGVudiA9IEFsaWFzRW52aXJvbm1lbnRzW2Vudl07XG4gICAgfVxuXG4gICAgaWYgKGVudiA9PT0gJ2N1c3RvbScgJiYgXy5pc1VuZGVmaW5lZChjb21tb24uRW52aXJvbm1lbnRzW2Vudl0udXJpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnbXVzdCB1c2UgLS1jdXN0b21yb290dXJpIG9yIHNldCB0aGUgQklUR09fQ1VTVE9NX1JPT1RfVVJJIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gdXNpbmcgdGhlIGN1c3RvbSBlbnZpcm9ubWVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVudikge1xuICAgICAgaWYgKGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XSkge1xuICAgICAgICB0aGlzLl9iYXNlVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnVyaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnZpcm9ubWVudCAnICsgZW52ICsgJy4gU3VwcG9ydGVkIGVudmlyb25tZW50czogcHJvZCwgdGVzdCwgZGV2LCBsYXRlc3QnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gJ3Rlc3QnO1xuICAgICAgaWYgKCFCaXRHb0FQSS5fdGVzdG5ldFdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIEJpdEdvQVBJLl90ZXN0bmV0V2FybmluZ01lc3NhZ2UgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZygnQml0R28gU0RLIGVudiBub3Qgc2V0IC0gZGVmYXVsdGluZyB0byB0ZXN0IGF0IHRlc3QuYml0Z28uY29tLicpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmk7XG4gICAgfVxuICAgIHRoaXMuX2VudiA9IHRoaXMuZW52ID0gZW52O1xuXG4gICAgY29uc3Qgc3VwcG9ydGVkQXBpVG9rZW5zID0gW1xuICAgICAgJ2V0aGVyc2NhbkFwaVRva2VuJyxcbiAgICAgICdwb2x5Z29uc2NhbkFwaVRva2VuJyxcbiAgICAgICdhcmJpc2NhbkFwaVRva2VuJyxcbiAgICAgICdvcHRpbWlzdGljRXRoZXJzY2FuQXBpVG9rZW4nLFxuICAgICAgJ3prc3luY0V4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ2JzY3NjYW5BcGlUb2tlbicsXG4gICAgICAnY29yZWRhb0V4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ29hc0V4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ2Jhc2VldGhBcGlUb2tlbicsXG4gICAgICAnc2diRXhwbG9yZXJBcGlUb2tlbicsXG4gICAgICAnZmxyRXhwbG9yZXJBcGlUb2tlbicsXG4gICAgICAneGRjRXhwbG9yZXJBcGlUb2tlbicsXG4gICAgICAnd2VtaXhFeHBsb3JlckFwaVRva2VuJyxcbiAgICAgICdtb25FeHBsb3JlckFwaVRva2VuJyxcbiAgICAgICd3b3JsZEV4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ3NvbW5pYUV4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ3NvbmVpdW1FeHBsb3JlckFwaVRva2VuJyxcbiAgICBdO1xuXG4gICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChzdXBwb3J0ZWRBcGlUb2tlbnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl1ba2V5XSA9IHBhcmFtc1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHBhcmFtcy5ldm0pIHtcbiAgICAgIGNvbnN0IGV2bUNvbmZpZyA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XVsnZXZtJ10gfHwge307XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMuZXZtKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKHBhcmFtcy5ldm0/LltrZXldICYmIHBhcmFtcy5ldm1ba2V5XVsnYXBpVG9rZW4nXSkge1xuICAgICAgICAgIGV2bUNvbmZpZ1trZXldID0gZXZtQ29uZmlnW2tleV0gfHwge307XG4gICAgICAgICAgZXZtQ29uZmlnW2tleV1bJ2FwaVRva2VuJ10gPSBwYXJhbXMuZXZtW2tleV1bJ2FwaVRva2VuJ107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdWydldm0nXSA9IGV2bUNvbmZpZztcbiAgICB9XG5cbiAgICBjb21tb24uc2V0TmV0d29yayhjb21tb24uRW52aXJvbm1lbnRzW2Vudl0ubmV0d29yayk7XG5cbiAgICB0aGlzLl9iYXNlQXBpVXJsID0gdGhpcy5fYmFzZVVybCArICcvYXBpL3YxJztcbiAgICB0aGlzLl9iYXNlQXBpVXJsVjIgPSB0aGlzLl9iYXNlVXJsICsgJy9hcGkvdjInO1xuICAgIHRoaXMuX2Jhc2VBcGlVcmxWMyA9IHRoaXMuX2Jhc2VVcmwgKyAnL2FwaS92Myc7XG4gICAgdGhpcy5fdG9rZW4gPSBwYXJhbXMuYWNjZXNzVG9rZW47XG5cbiAgICBjb25zdCBjbGllbnRDb25zdGFudHMgPSBwYXJhbXMuY2xpZW50Q29uc3RhbnRzO1xuICAgIHRoaXMuX2luaXRpYWxpemVDbGllbnRDb25zdGFudHMoY2xpZW50Q29uc3RhbnRzKTtcblxuICAgIHRoaXMuX3VzZXJBZ2VudCA9IHBhcmFtcy51c2VyQWdlbnQgfHwgJ0JpdEdvSlMtYXBpLycgKyB0aGlzLnZlcnNpb24oKTtcbiAgICB0aGlzLl9yZXFJZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSBwYXJhbXMucmVmcmVzaFRva2VuO1xuICAgIHRoaXMuX2NsaWVudElkID0gcGFyYW1zLmNsaWVudElkO1xuICAgIHRoaXMuX2NsaWVudFNlY3JldCA9IHBhcmFtcy5jbGllbnRTZWNyZXQ7XG4gICAgdGhpcy5fa2V5Y2hhaW5zID0gbnVsbDtcbiAgICB0aGlzLl93YWxsZXRzID0gbnVsbDtcblxuICAgIC8vIHdoZXRoZXIgdG8gcGVyZm9ybSBleHRyYSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGZvciBzb21lIHRoaW5ncywgc3VjaCBhc1xuICAgIC8vIGFkZHJlc3MgdmFsaWRhdGlvbiBvciBzaWduYXR1cmUgdmFsaWRhdGlvbi4gZGVmYXVsdHMgdG8gdHJ1ZSwgYnV0IGNhbiBiZVxuICAgIC8vIHR1cm5lZCBvZmYgYnkgc2V0dGluZyB0byBmYWxzZS4gY2FuIGFsc28gYmUgb3ZlcnJpZGRlbiBpbmRpdmlkdWFsbHkgaW4gdGhlXG4gICAgLy8gZnVuY3Rpb25zIHRoYXQgdXNlIGl0LlxuICAgIHRoaXMuX3ZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuXG4gICAgaWYgKCFwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbiAmJiBwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoKGVudiA9PSAncHJvZCcgfHwgZW52ID09ICdhZG1pblByb2QnKSAmJiBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0uaG1hY1ZlcmlmaWNhdGlvbkVuZm9yY2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRpc2FibGUgcmVxdWVzdCBITUFDIHZlcmlmaWNhdGlvbiBpbiBlbnZpcm9ubWVudCAke3RoaXMuZ2V0RW52KCl9YCk7XG4gICAgICB9XG4gICAgICBkZWJ1ZygnSE1BQyB2ZXJpZmljYXRpb24gZXhwbGljaXRseSBkaXNhYmxlZCBieSBjb25zdHJ1Y3RvciBvcHRpb24nKTtcbiAgICAgIHRoaXMuX2htYWNWZXJpZmljYXRpb24gPSBwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoKHByb2Nlc3MgYXMgYW55KS5icm93c2VyICYmIHBhcmFtcy5jdXN0b21Qcm94eUFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgdXNlIGh0dHBzIHByb3h5IHdoaWxlIGluIGJyb3dzZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXN0b21Qcm94eUFnZW50ID0gcGFyYW1zLmN1c3RvbVByb3h5QWdlbnQ7XG4gICAgdGhpcy5faG1hY0F1dGhTdHJhdGVneSA9IHBhcmFtcy5obWFjQXV0aFN0cmF0ZWd5ID8/IG5ldyBEZWZhdWx0SG1hY0F1dGhTdHJhdGVneSgpO1xuXG4gICAgLy8gT25seSBmZXRjaCBjb25zdGFudHMgZnJvbSBjb25zdHJ1Y3RvciBpZiBjbGllbnRDb25zdGFudHMgd2FzIG5vdCBwcm92aWRlZFxuICAgIGlmICghY2xpZW50Q29uc3RhbnRzKSB7XG4gICAgICAvLyBjYXB0dXJlIG91dGVyIHN0YWNrIHNvIHdlIGhhdmUgdXNlZnVsIGRlYnVnIGluZm9ybWF0aW9uIGlmIGZldGNoIGNvbnN0YW50cyBmYWlsc1xuICAgICAgY29uc3QgZSA9IG5ldyBFcnJvcigpO1xuXG4gICAgICAvLyBLaWNrIG9mZiBmaXJzdCBsb2FkIG9mIGNvbnN0YW50c1xuICAgICAgdGhpcy5mZXRjaENvbnN0YW50cygpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhbiBlcnJvciBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIGVudGlyZSBzY3JpcHRcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gZmV0Y2ggaW5pdGlhbCBjbGllbnQgY29uc3RhbnRzIGZyb20gQml0R28nKTtcbiAgICAgICAgICBkZWJ1ZyhlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgY2xpZW50IGNvbnN0YW50cyBpZiBwcm92aWRlZC5cbiAgICogQHBhcmFtIGNsaWVudENvbnN0YW50cyAtIFRoZSBjbGllbnQgY29uc3RhbnRzIGZyb20gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pbml0aWFsaXplQ2xpZW50Q29uc3RhbnRzKGNsaWVudENvbnN0YW50czogYW55KTogdm9pZCB7XG4gICAgaWYgKGNsaWVudENvbnN0YW50cykge1xuICAgICAgaWYgKCFCaXRHb0FQSS5fY29uc3RhbnRzKSB7XG4gICAgICAgIEJpdEdvQVBJLl9jb25zdGFudHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIEJpdEdvQVBJLl9jb25zdGFudHNbdGhpcy5lbnZdID0gJ2NvbnN0YW50cycgaW4gY2xpZW50Q29uc3RhbnRzID8gY2xpZW50Q29uc3RhbnRzLmNvbnN0YW50cyA6IGNsaWVudENvbnN0YW50cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3VwZXJhZ2VudCByZXF1ZXN0IGZvciBzcGVjaWZpZWQgaHR0cCBtZXRob2QgYW5kIFVSTCBjb25maWd1cmVkIHRvIHRoZSBTREsgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gaHR0cCBtZXRob2QgZm9yIHRoZSBuZXcgcmVxdWVzdFxuICAgKiBAcGFyYW0gdXJsIC0gVVJMIGZvciB0aGUgbmV3IHJlcXVlc3RcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBZ2VudFJlcXVlc3QobWV0aG9kOiBSZXF1ZXN0TWV0aG9kcywgdXJsOiBzdHJpbmcpOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0IHtcbiAgICBsZXQgcmVxOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0ID0gc3VwZXJhZ2VudFttZXRob2RdKHVybCk7XG4gICAgaWYgKHRoaXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCkge1xuICAgICAgcmVxID0gcmVxLndpdGhDcmVkZW50aWFscygpO1xuICAgIH1cbiAgICByZXR1cm4gcmVxO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBiYXNlY29pbiBvYmplY3RcbiAgICogQHBhcmFtIG5hbWVcbiAgICovXG4gIHB1YmxpYyBjb2luKG5hbWU6IHN0cmluZyk6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gR2xvYmFsQ29pbkZhY3RvcnkuZ2V0SW5zdGFuY2UodGhpcywgbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IEJpdEdvIGVudmlyb25tZW50XG4gICAqL1xuICBnZXRFbnYoKTogRW52aXJvbm1lbnROYW1lIHtcbiAgICByZXR1cm4gdGhpcy5fZW52O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBhdXRoIHZlcnNpb24gdXNlZCBmb3IgcmVxdWVzdHMgdG8gdGhlIEJpdEdvIHNlcnZlclxuICAgKi9cbiAgZ2V0QXV0aFZlcnNpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aFZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYW5kIHNlbmRzIGEgdjItYXV0aGVudGljYXRlZCByZXF1ZXN0LCB0aGVuIHZlcmlmaWVzIHRoZSByZXNwb25zZSBITUFDLlxuICAgKiBFeHRyYWN0ZWQgZnJvbSB0aGUgcmVxLnRoZW4gb3ZlcnJpZGUgaW4gcmVxdWVzdFBhdGNoIHRvIGtlZXAgdGhhdCBtZXRob2QgcmVhZGFibGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZW5kUmVxdWVzdFdpdGhIbWFjKHtcbiAgICByZXEsXG4gICAgbWV0aG9kLFxuICAgIHVybCxcbiAgICBkYXRhLFxuICAgIHN0cmF0ZWd5QXV0aGVudGljYXRlZCxcbiAgICBvbmZ1bGZpbGxlZCxcbiAgICBvcmlnaW5hbFRoZW4sXG4gIH06IHtcbiAgICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3Q7XG4gICAgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kcztcbiAgICB1cmw6IHN0cmluZztcbiAgICBkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3RyYXRlZ3lBdXRoZW50aWNhdGVkOiBib29sZWFuO1xuICAgIG9uZnVsZmlsbGVkOiAoKHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlKSA9PiBhbnkpIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBvcmlnaW5hbFRoZW46IChvbmZ1bGZpbGxlZDogYW55LCBvbnJlamVjdGVkPzogYW55KSA9PiBQcm9taXNlPGFueT47XG4gIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLl90b2tlbiB8fCBzdHJhdGVneUF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHNldFJlcXVlc3RRdWVyeVN0cmluZyhyZXEpO1xuXG4gICAgICBjb25zdCByZXF1ZXN0UHJvcGVydGllcyA9IGF3YWl0IHRoaXMuX2htYWNBdXRoU3RyYXRlZ3kuY2FsY3VsYXRlUmVxdWVzdEhlYWRlcnMoe1xuICAgICAgICB1cmw6IHJlcS51cmwsXG4gICAgICAgIHRva2VuOiB0aGlzLl90b2tlbiA/PyAnJyxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICB0ZXh0OiBkYXRhIHx8ICcnLFxuICAgICAgICBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24sXG4gICAgICB9KTtcbiAgICAgIHJlcS5zZXQoJ0F1dGgtVGltZXN0YW1wJywgcmVxdWVzdFByb3BlcnRpZXMudGltZXN0YW1wLnRvU3RyaW5nKCkpO1xuXG4gICAgICByZXEuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgcmVxdWVzdFByb3BlcnRpZXMudG9rZW5IYXNoKTtcbiAgICAgIGRlYnVnKFxuICAgICAgICAnc2VuZGluZyB2JWQgJXMgcmVxdWVzdCB0byAlcyB3aXRoIHRva2VuICVzJyxcbiAgICAgICAgdGhpcy5fYXV0aFZlcnNpb24sXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgdXJsLFxuICAgICAgICB0aGlzLl90b2tlbj8uc3Vic3RyKDAsIDgpID8/ICcoc3RyYXRlZ3ktbWFuYWdlZCknXG4gICAgICApO1xuXG4gICAgICByZXEuc2V0KCdITUFDJywgcmVxdWVzdFByb3BlcnRpZXMuaG1hYyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2V0QWRkaXRpb25hbEhlYWRlcnNDYikge1xuICAgICAgY29uc3QgYWRkaXRpb25hbEhlYWRlcnMgPSB0aGlzLmdldEFkZGl0aW9uYWxIZWFkZXJzQ2IobWV0aG9kLCB1cmwsIGRhdGEpO1xuICAgICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmeSB0aGUgcmVzcG9uc2UgYmVmb3JlIGNhbGxpbmcgdGhlIG9yaWdpbmFsIG9uZnVsZmlsbGVkIGhhbmRsZXIsXG4gICAgICogYW5kIG1ha2Ugc3VyZSBvbnJlamVjdGVkIGlzIGNhbGxlZCBpZiBhIHZlcmlmaWNhdGlvbiBlcnJvciBpcyBlbmNvdW50ZXJlZFxuICAgICAqL1xuICAgIGNvbnN0IG5ld09uRnVsZmlsbGVkID0gb25mdWxmaWxsZWRcbiAgICAgID8gYXN5bmMgKHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgLy8gSE1BQyB2ZXJpZmljYXRpb24gaXMgb25seSBhbGxvd2VkIHRvIGJlIHNraXBwZWQgaW4gY2VydGFpbiBlbnZpcm9ubWVudHMuXG4gICAgICAgICAgLy8gVGhpcyBpcyBjaGVja2VkIGluIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGNoZWNraW5nIGl0IGFnYWluIGF0IHJlcXVlc3QgdGltZVxuICAgICAgICAgIC8vIHdpbGwgaGVscCBwcmV2ZW50IGFnYWluc3QgdGFtcGVyaW5nIG9mIHRoaXMgcHJvcGVydHkgYWZ0ZXIgdGhlIG9iamVjdCBpcyBjcmVhdGVkXG4gICAgICAgICAgaWYgKCF0aGlzLl9obWFjVmVyaWZpY2F0aW9uICYmICFjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLmhtYWNWZXJpZmljYXRpb25FbmZvcmNlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uZnVsZmlsbGVkKHJlc3BvbnNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB2ZXJpZmllZFJlc3BvbnNlID0gYXdhaXQgdmVyaWZ5UmVzcG9uc2VBc3luYyhcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLl90b2tlbixcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgdGhpcy5fYXV0aFZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBvbmZ1bGZpbGxlZCh2ZXJpZmllZFJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgOiBudWxsO1xuICAgIHJldHVybiBvcmlnaW5hbFRoZW4obmV3T25GdWxmaWxsZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBwYXRjaGluZyBmdW5jdGlvbiB3aGljaCBjYW4gYXBwbHkgb3VyIGF1dGhvcml6YXRpb25cbiAgICogaGVhZGVycyB0byBhbnkgb3V0Ym91bmQgcmVxdWVzdC5cbiAgICogQHBhcmFtIG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSByZXF1ZXN0UGF0Y2gobWV0aG9kOiBSZXF1ZXN0TWV0aG9kcywgdXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXEgPSB0aGlzLmdldEFnZW50UmVxdWVzdChtZXRob2QsIHVybCk7XG4gICAgaWYgKHRoaXMuX2N1c3RvbVByb3h5QWdlbnQpIHtcbiAgICAgIGRlYnVnKCd1c2luZyBjdXN0b20gcHJveHkgYWdlbnQnKTtcbiAgICAgIGlmICh0aGlzLl9jdXN0b21Qcm94eUFnZW50KSB7XG4gICAgICAgIHJlcS5hZ2VudCh0aGlzLl9jdXN0b21Qcm94eUFnZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbFRoZW4gPSByZXEudGhlbi5iaW5kKHJlcSk7XG4gICAgcmVxLnRoZW4gPSAob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+IHtcbiAgICAgIC8vIGludGVyY2VwdCBhIHJlcXVlc3QgYmVmb3JlIGl0J3Mgc3VibWl0dGVkIHRvIHRoZSBzZXJ2ZXIgZm9yIHYyIGF1dGhlbnRpY2F0aW9uIChiYXNlZCBvbiB0b2tlbilcbiAgICAgIGlmICh0aGlzLl92ZXJzaW9uKSB7XG4gICAgICAgIC8vIFRPRE8gLSBkZWNpZGUgd2hlcmUgdG8gZ2V0IHZlcnNpb25cbiAgICAgICAgcmVxLnNldCgnQml0R28tU0RLLVZlcnNpb24nLCB0aGlzLl92ZXJzaW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuX3JlcUlkKSkge1xuICAgICAgICBjb25zdCByZXFJZCA9IHRoaXMuX3JlcUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuX3JlcXVlc3RJZFByZWZpeCA/IGAke3RoaXMuX3JlcXVlc3RJZFByZWZpeH0ke3JlcUlkfWAgOiByZXFJZDtcbiAgICAgICAgcmVxLnNldCgnUmVxdWVzdC1JRCcsIHJlcXVlc3RJZCk7XG5cbiAgICAgICAgLy8gaW5jcmVtZW50IGFmdGVyIHNldHRpbmcgdGhlIGhlYWRlciBzbyB0aGUgc2VxdWVuY2UgbnVtYmVycyBzdGFydCBhdCAwXG4gICAgICAgIHRoaXMuX3JlcUlkLmluYygpO1xuXG4gICAgICAgIC8vIHJlcXVlc3QgaWRzIG11c3QgYmUgc2V0IGJlZm9yZSBlYWNoIHJlcXVlc3QgaW5zdGVhZCBvZiBiZWluZyBrZXB0XG4gICAgICAgIC8vIGluc2lkZSB0aGUgYml0Z28gb2JqZWN0LiBUaGlzIGlzIHRvIHByZXZlbnQgcmVlbnRyYW5jeSBpc3N1ZXMgd2hlcmVcbiAgICAgICAgLy8gbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlcXVlc3RzIGNvdWxkIGNhdXNlIGluY29ycmVjdCByZXFJZHMgdG8gYmUgdXNlZFxuICAgICAgICBkZWxldGUgdGhpcy5fcmVxSWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHByZXZlbnQgSUUgZnJvbSBjYWNoaW5nIHJlcXVlc3RzXG4gICAgICByZXEuc2V0KCdJZi1Nb2RpZmllZC1TaW5jZScsICdNb24sIDI2IEp1bCAxOTk3IDA1OjAwOjAwIEdNVCcpO1xuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5fdXNlckFnZW50KSB7XG4gICAgICAgIC8vIElmIG5vdCBpbiB0aGUgYnJvd3Nlciwgc2V0IHRoZSBVc2VyLUFnZW50LiBCcm93c2VycyBkb24ndCBhbGxvd1xuICAgICAgICAvLyBzZXR0aW5nIG9mIFVzZXItQWdlbnQsIHNvIHdlIG11c3QgZGlzYWJsZSB0aGlzIHdoZW4gcnVuIGluIHRoZVxuICAgICAgICAvLyBicm93c2VyIChicm93c2VyaWZ5IHNldHMgcHJvY2Vzcy5icm93c2VyKS5cbiAgICAgICAgcmVxLnNldCgnVXNlci1BZ2VudCcsIHRoaXMuX3VzZXJBZ2VudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IHRvIGp1c3QgYWJvdmUgNSBtaW51dGVzIGJ5IGRlZmF1bHRcbiAgICAgIHJlcS50aW1lb3V0KChwcm9jZXNzLmVudi5CSVRHT19USU1FT1VUIGFzIGFueSkgKiAxMDAwIHx8IDMwNSAqIDEwMDApO1xuXG4gICAgICAvLyBUaGUgc3RyYXRlZ3kgbWF5IGhhdmUgaXRzIG93biBzaWduaW5nIG1hdGVyaWFsIChlLmcuIGEgQ3J5cHRvS2V5XG4gICAgICAvLyByZXN0b3JlZCBmcm9tIEluZGV4ZWREQikgaW5kZXBlbmRlbnQgb2YgdGhpcy5fdG9rZW4uXG4gICAgICBjb25zdCBzdHJhdGVneUF1dGhlbnRpY2F0ZWQgPSB0aGlzLl9obWFjQXV0aFN0cmF0ZWd5LmlzQXV0aGVudGljYXRlZD8uKCkgPz8gZmFsc2U7XG5cbiAgICAgIHJlcS5pc1YyQXV0aGVudGljYXRlZCA9IHRydWU7XG4gICAgICByZXEuYXV0aGVudGljYXRpb25Ub2tlbiA9IHRoaXMuX3Rva2VuID8/IChzdHJhdGVneUF1dGhlbnRpY2F0ZWQgPyAnc3RyYXRlZ3ktYXV0aGVudGljYXRlZCcgOiB1bmRlZmluZWQpO1xuICAgICAgLy8gc29tZSBvZiB0aGUgb2xkZXIgdG9rZW5zIGFwcGVhciB0byBiZSBvbmx5IDQwIGNoYXJhY3RlcnMgbG9uZ1xuICAgICAgaWYgKCh0aGlzLl90b2tlbiAmJiB0aGlzLl90b2tlbi5sZW5ndGggIT09IDY3ICYmIHRoaXMuX3Rva2VuLmluZGV4T2YoJ3YyeCcpICE9PSAwKSB8fCByZXEuZm9yY2VWMUF1dGgpIHtcbiAgICAgICAgLy8gdXNlIHRoZSBvbGQgbWV0aG9kXG4gICAgICAgIHJlcS5pc1YyQXV0aGVudGljYXRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJlcS5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0aGlzLl90b2tlbik7XG4gICAgICAgIGRlYnVnKCdzZW5kaW5nIHYxICVzIHJlcXVlc3QgdG8gJXMgd2l0aCB0b2tlbiAlcycsIG1ldGhvZCwgdXJsLCB0aGlzLl90b2tlbj8uc3Vic3RyKDAsIDgpKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsVGhlbihvbmZ1bGZpbGxlZCkuY2F0Y2gob25yZWplY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHJlcS5zZXQoJ0JpdEdvLUF1dGgtVmVyc2lvbicsIHRoaXMuX2F1dGhWZXJzaW9uID09PSAzID8gJzMuMCcgOiAnMi4wJyk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBzZXJpYWxpemVSZXF1ZXN0RGF0YShyZXEpO1xuXG4gICAgICByZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3RXaXRoSG1hYyh7XG4gICAgICAgIHJlcSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICB1cmwsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHN0cmF0ZWd5QXV0aGVudGljYXRlZCxcbiAgICAgICAgb25mdWxmaWxsZWQsXG4gICAgICAgIG9yaWdpbmFsVGhlbixcbiAgICAgIH0pLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICAgIH07XG4gICAgcmV0dXJuIHRvQml0Z29SZXF1ZXN0KHJlcSk7XG4gIH1cblxuICBnZXQodXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgnZ2V0JywgdXJsKTtcbiAgfVxuICBwb3N0KHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3Bvc3QnLCB1cmwpO1xuICB9XG4gIHB1dCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdwdXQnLCB1cmwpO1xuICB9XG4gIGRlbCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdkZWwnLCB1cmwpO1xuICB9XG4gIHBhdGNoKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3BhdGNoJywgdXJsKTtcbiAgfVxuICBvcHRpb25zKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ29wdGlvbnMnLCB1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgSE1BQyBmb3IgdGhlIGdpdmVuIGtleSBhbmQgbWVzc2FnZVxuICAgKiBAcGFyYW0ga2V5IHtTdHJpbmd9IC0gdGhlIGtleSB0byB1c2UgZm9yIHRoZSBITUFDXG4gICAqIEBwYXJhbSBtZXNzYWdlIHtTdHJpbmd9IC0gdGhlIGFjdHVhbCBtZXNzYWdlIHRvIEhNQUNcbiAgICogQHJldHVybnMgeyp9IC0gdGhlIHJlc3VsdCBvZiB0aGUgSE1BQyBvcGVyYXRpb25cbiAgICovXG4gIGNhbGN1bGF0ZUhNQUMoa2V5OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNka0htYWMuY2FsY3VsYXRlSE1BQyhrZXksIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgc3ViamVjdCBzdHJpbmcgdGhhdCBpcyB0byBiZSBITUFDJ2VkIGZvciBhIEhUVFAgcmVxdWVzdCBvciByZXNwb25zZVxuICAgKiBAcGFyYW0gdXJsUGF0aCByZXF1ZXN0IHVybCwgaW5jbHVkaW5nIHF1ZXJ5IHBhcmFtc1xuICAgKiBAcGFyYW0gdGV4dCByZXF1ZXN0IGJvZHkgdGV4dFxuICAgKiBAcGFyYW0gdGltZXN0YW1wIHJlcXVlc3QgdGltZXN0YW1wIGZyb20gYERhdGUubm93KClgXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIE9ubHkgc2V0IGZvciBIVFRQIHJlc3BvbnNlcywgbGVhdmUgYmxhbmsgZm9yIHJlcXVlc3RzXG4gICAqIEBwYXJhbSBtZXRob2QgcmVxdWVzdCBtZXRob2RcbiAgICogQHJldHVybnMge3N0cmluZyB8IEJ1ZmZlcn1cbiAgICovXG4gIGNhbGN1bGF0ZUhNQUNTdWJqZWN0PFQgZXh0ZW5kcyBzdHJpbmcgfCBCdWZmZXIgPSBzdHJpbmc+KHBhcmFtczogQ2FsY3VsYXRlSG1hY1N1YmplY3RPcHRpb25zPFQ+KTogVCB7XG4gICAgcmV0dXJuIHNka0htYWMuY2FsY3VsYXRlSE1BQ1N1YmplY3QoeyAuLi5wYXJhbXMsIGF1dGhWZXJzaW9uOiB0aGlzLl9hdXRoVmVyc2lvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIEhNQUMgZm9yIGFuIEhUVFAgcmVxdWVzdFxuICAgKi9cbiAgY2FsY3VsYXRlUmVxdWVzdEhNQUMocGFyYW1zOiBDYWxjdWxhdGVSZXF1ZXN0SG1hY09wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZGtIbWFjLmNhbGN1bGF0ZVJlcXVlc3RITUFDKHsgLi4ucGFyYW1zLCBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHJlcXVlc3QgaGVhZGVycyB3aXRoIEhNQUNcbiAgICovXG4gIGNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzKHBhcmFtczogQ2FsY3VsYXRlUmVxdWVzdEhlYWRlcnNPcHRpb25zKTogUmVxdWVzdEhlYWRlcnMge1xuICAgIHJldHVybiBzZGtIbWFjLmNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzKHsgLi4ucGFyYW1zLCBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBITUFDIGZvciBhbiBIVFRQIHJlc3BvbnNlIChzeW5jaHJvbm91cywgdXNlcyBzZGstaG1hYyBkaXJlY3RseSkuXG4gICAqIEtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleHRlcm5hbCBjYWxsZXJzLlxuICAgKi9cbiAgdmVyaWZ5UmVzcG9uc2UocGFyYW1zOiBWZXJpZnlSZXNwb25zZU9wdGlvbnMpOiBWZXJpZnlSZXNwb25zZUluZm8ge1xuICAgIHJldHVybiBzZGtIbWFjLnZlcmlmeVJlc3BvbnNlKHsgLi4ucGFyYW1zLCBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBITUFDIGZvciBhbiBIVFRQIHJlc3BvbnNlIHZpYSB0aGUgY29uZmlndXJlZCBzdHJhdGVneSAoYXN5bmMpLlxuICAgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIHJlcXVlc3QgcGlwZWxpbmUuXG4gICAqL1xuICB2ZXJpZnlSZXNwb25zZUFzeW5jKHBhcmFtczogVmVyaWZ5UmVzcG9uc2VPcHRpb25zKTogUHJvbWlzZTxWZXJpZnlSZXNwb25zZUluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5faG1hY0F1dGhTdHJhdGVneS52ZXJpZnlSZXNwb25zZSh7IC4uLnBhcmFtcywgYXV0aFZlcnNpb246IHRoaXMuX2F1dGhWZXJzaW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHVzZWZ1bCBjb25zdGFudCB2YWx1ZXMgZnJvbSB0aGUgQml0R28gc2VydmVyLlxuICAgKiBUaGVzZSB2YWx1ZXMgZG8gY2hhbmdlIGluZnJlcXVlbnRseSwgc28gdGhleSBuZWVkIHRvIGJlIGZldGNoZWQsXG4gICAqIGJ1dCBhcmUgdW5saWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYSBCaXRHbyBvYmplY3QsXG4gICAqIHNvIHRoZXkgY2FuIHNhZmVseSBjYWNoZWQuXG4gICAqL1xuICBhc3luYyBmZXRjaENvbnN0YW50cygpOiBQcm9taXNlPENvbnN0YW50cz4ge1xuICAgIGNvbnN0IGVudiA9IHRoaXMuZ2V0RW52KCk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGNhY2hlZCBjb25zdGFudHMgdGhhdCBoYXZlbid0IGV4cGlyZWRcbiAgICBpZiAoXG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzICYmXG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl0gJiZcbiAgICAgICghQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZSB8fCAhQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZVtlbnZdIHx8IG5ldyBEYXRlKCkgPCBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlW2Vudl0pXG4gICAgKSB7XG4gICAgICByZXR1cm4gQml0R29BUEkuX2NvbnN0YW50c1tlbnZdO1xuICAgIH1cblxuICAgIC8vIGNsaWVudCBjb25zdGFudHMgY2FsbCBjYW5ub3QgYmUgYXV0aGVudGljYXRlZCB1c2luZyB0aGUgbm9ybWFsIEhNQUMgdmFsaWRhdGlvblxuICAgIC8vIHNjaGVtZSwgc28gd2UgbmVlZCB0byB1c2UgYSByYXcgc3VwZXJhZ2VudCBpbnN0YW5jZSB0byBkbyB0aGlzIHJlcXVlc3QuXG4gICAgLy8gUHJveHkgc2V0dGluZ3MgbXVzdCBzdGlsbCBiZSByZXNwZWN0ZWQgaG93ZXZlclxuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmdldEFnZW50UmVxdWVzdCgnZ2V0JywgdGhpcy51cmwoJy9jbGllbnQvY29uc3RhbnRzJykpO1xuICAgIHJlc3VsdFByb21pc2Uuc2V0KCdCaXRHby1TREstVmVyc2lvbicsIHRoaXMuX3ZlcnNpb24pO1xuICAgIGlmICh0aGlzLl9jdXN0b21Qcm94eUFnZW50KSB7XG4gICAgICByZXN1bHRQcm9taXNlLmFnZW50KHRoaXMuX2N1c3RvbVByb3h5QWdlbnQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRBZGRpdGlvbmFsSGVhZGVyc0NiKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsSGVhZGVycyA9IHRoaXMuZ2V0QWRkaXRpb25hbEhlYWRlcnNDYignZ2V0JywgdGhpcy51cmwoJy9jbGllbnQvY29uc3RhbnRzJykpO1xuICAgICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXN1bHRQcm9taXNlLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzdWx0UHJvbWlzZTtcblxuICAgIGlmICghQml0R29BUEkuX2NvbnN0YW50cykge1xuICAgICAgQml0R29BUEkuX2NvbnN0YW50cyA9IHt9O1xuICAgIH1cbiAgICBCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl0gPSByZXN1bHQuYm9keS5jb25zdGFudHM7XG5cbiAgICBpZiAocmVzdWx0LmJvZHk/LnR0bCAmJiB0eXBlb2YgcmVzdWx0LmJvZHk/LnR0bCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICghQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZSkge1xuICAgICAgICBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlID0ge307XG4gICAgICB9XG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlW2Vudl0gPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSArIChyZXN1bHQuYm9keS50dGwgYXMgbnVtYmVyKSAqIDEwMDApO1xuICAgIH1cblxuICAgIHJldHVybiBCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdXJsIGZvciBjYWxsaW5nIEJpdEdvIHBsYXRmb3JtIEFQSXNcbiAgICogQHBhcmFtIHBhdGhcbiAgICogQHBhcmFtIHZlcnNpb25cbiAgICovXG4gIHVybChwYXRoOiBzdHJpbmcsIHZlcnNpb24gPSAxKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlVXJsID0gdmVyc2lvbiA9PT0gMyA/IHRoaXMuX2Jhc2VBcGlVcmxWMyA6IHZlcnNpb24gPT09IDIgPyB0aGlzLl9iYXNlQXBpVXJsVjIgOiB0aGlzLl9iYXNlQXBpVXJsO1xuICAgIHJldHVybiBiYXNlVXJsICsgcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB1cmwgZm9yIGNhbGxpbmcgQml0R28gbWljcm9zZXJ2aWNlIEFQSXNcbiAgICovXG4gIG1pY3Jvc2VydmljZXNVcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYmFzZVVybCArIHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmVyc2lvbiBvZiB0aGUgQml0R29KUyBwYWNrYWdlXG4gICAqL1xuICB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBjb25uZWN0aXZpdHkgdG8gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBwaW5nKHsgcmVxSWQgfTogUGluZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHJlcUlkKSB7XG4gICAgICB0aGlzLl9yZXFJZCA9IHJlcUlkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL3BpbmcnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgcmVxdWVzdCB0cmFjZXIgdG8gcHJvdmlkZSByZXF1ZXN0IElEcyBkdXJpbmcgbXVsdGktcmVxdWVzdCB3b3JrZmxvd3NcbiAgICovXG4gIHNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyOiBJUmVxdWVzdFRyYWNlcik6IHZvaWQge1xuICAgIGlmIChyZXFUcmFjZXIpIHtcbiAgICAgIHRoaXMuX3JlcUlkID0gcmVxVHJhY2VyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVuY3J5cHQgbG9jYWxseS5cbiAgICovXG4gIGVuY3J5cHQocGFyYW1zOiBFbmNyeXB0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpbnB1dCcsICdwYXNzd29yZCddLCBbJ2FkYXRhJ10pO1xuICAgIGlmICghcGFyYW1zLnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBlbmNyeXB0IHdpdGhvdXQgcGFzc3dvcmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuY3J5cHQocGFyYW1zLnBhc3N3b3JkLCBwYXJhbXMuaW5wdXQsIHsgYWRhdGE6IHBhcmFtcy5hZGF0YSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNyeXB0IGFuIGVuY3J5cHRlZCBzdHJpbmcgbG9jYWxseS5cbiAgICovXG4gIGRlY3J5cHQocGFyYW1zOiBEZWNyeXB0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaW5wdXQnLCAncGFzc3dvcmQnXSwgW10pO1xuICAgIGlmICghcGFyYW1zLnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBkZWNyeXB0IHdpdGhvdXQgcGFzc3dvcmRgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBkZWNyeXB0KHBhcmFtcy5wYXNzd29yZCwgcGFyYW1zLmlucHV0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJjY206IHRhZyBkb2Vzbid0IG1hdGNoXCIpKSB7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgPSAncGFzc3dvcmQgZXJyb3IgLSAnICsgZXJyb3IubWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIGRlY3J5cHQgbXVsdGlwbGUgd2FsbGV0IGtleXMgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge0RlY3J5cHRLZXlzT3B0aW9uc30gcGFyYW1zIC0gUGFyYW1ldGVycyBvYmplY3QgY29udGFpbmluZyB3YWxsZXQga2V5IHBhaXJzIGFuZCBwYXNzd29yZFxuICAgKiBAcGFyYW0ge0FycmF5PHt3YWxsZXRJZDogc3RyaW5nLCBlbmNyeXB0ZWRQcnY6IHN0cmluZ30+fSBwYXJhbXMud2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycyAtIEFycmF5IG9mIHdhbGxldCBJRCBhbmQgZW5jcnlwdGVkIHByaXZhdGUga2V5IHBhaXJzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucGFzc3dvcmQgLSBUaGUgcGFzc3BocmFzZSB0byBhdHRlbXB0IGRlY3J5cHRpb24gd2l0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gQXJyYXkgb2Ygd2FsbGV0IElEcyBmb3Igd2hpY2ggZGVjcnlwdGlvbiBmYWlsZWRcbiAgICovXG4gIGRlY3J5cHRLZXlzKHBhcmFtczogRGVjcnlwdEtleXNPcHRpb25zKTogc3RyaW5nW10ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBpZiAoIXBhcmFtcy53YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyOiB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucGFzc3dvcmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXI6IHBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy53YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLndhbGxldElkRW5jcnlwdGVkS2V5UGFpcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZmFpbGVkV2FsbGV0SWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrZXlQYWlyIG9mIHBhcmFtcy53YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzKSB7XG4gICAgICBpZiAoIWtleVBhaXIud2FsbGV0SWQgfHwgdHlwZW9mIGtleVBhaXIud2FsbGV0SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZWFjaCBrZXkgcGFpciBtdXN0IGhhdmUgYSBzdHJpbmcgd2FsbGV0SWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFrZXlQYWlyLmVuY3J5cHRlZFBydiB8fCB0eXBlb2Yga2V5UGFpci5lbmNyeXB0ZWRQcnYgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZWFjaCBrZXkgcGFpciBtdXN0IGhhdmUgYSBzdHJpbmcgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVjcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IGtleVBhaXIuZW5jcnlwdGVkUHJ2LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMucGFzc3dvcmQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJZiBubyBlcnJvciB3YXMgdGhyb3duLCBkZWNyeXB0aW9uIHdhcyBzdWNjZXNzZnVsXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBkZWNyeXB0aW9uIGZhaWxzLCBhZGQgdGhlIHdhbGxldElkIHRvIHRoZSBmYWlsZWQgbGlzdFxuICAgICAgICBmYWlsZWRXYWxsZXRJZHMucHVzaChrZXlQYWlyLndhbGxldElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFpbGVkV2FsbGV0SWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGlzIEJpdEdvIG9iamVjdCB0byBhIEpTT04gb2JqZWN0LlxuICAgKlxuICAgKiBDYXV0aW9uOiBjb250YWlucyBzZW5zaXRpdmUgZGF0YVxuICAgKi9cbiAgdG9KU09OKCk6IEJpdEdvSnNvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXIsXG4gICAgICB0b2tlbjogdGhpcy5fdG9rZW4sXG4gICAgICBleHRlbnNpb25LZXk6IHRoaXMuX2V4dGVuc2lvbktleSA/IHRoaXMuX2V4dGVuc2lvbktleS50b1dJRigpIDogdW5kZWZpbmVkLFxuICAgICAgZWNkaFhwcnY6IHRoaXMuX2VjZGhYcHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHVzZXJcbiAgICovXG4gIHVzZXIoKTogVXNlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYSBKU09OIHNlcmlhbGl6ZWQgQml0R28gb2JqZWN0LlxuICAgKlxuICAgKiBPdmVyd3JpdGVzIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBjdXJyZW50IEJpdEdvIG9iamVjdCB3aXRoXG4gICAqIHRob3NlIG9mIHRoZSBkZXNlcmlhbHplZCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSBqc29uXG4gICAqL1xuICBmcm9tSlNPTihqc29uOiBCaXRHb0pzb24pOiB2b2lkIHtcbiAgICB0aGlzLl91c2VyID0ganNvbi51c2VyO1xuICAgIHRoaXMuX3Rva2VuID0ganNvbi50b2tlbjtcbiAgICB0aGlzLl9lY2RoWHBydiA9IGpzb24uZWNkaFhwcnY7XG4gICAgaWYgKGpzb24uZXh0ZW5zaW9uS2V5KSB7XG4gICAgICBjb25zdCBuZXR3b3JrID0gY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5uZXR3b3JrO1xuICAgICAgdGhpcy5fZXh0ZW5zaW9uS2V5ID0gdXR4b2xpYi5FQ1BhaXIuZnJvbVdJRihcbiAgICAgICAganNvbi5leHRlbnNpb25LZXksXG4gICAgICAgIHV0eG9saWIubmV0d29ya3NbbmV0d29ya10gYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoZSB1c2VybmFtZSwgcGFzc3dvcmQgYW5kIG90cCBpbnRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB1c2VybmFtZSBhbmQgaGFzaGVkIHBhc3N3b3JkLCByZWFkeSB0b1xuICAgKiBzZW5kIHRvIGJpdGdvIGZvciBhdXRoZW50aWNhdGlvbi5cbiAgICovXG4gIGFzeW5jIHByZXByb2Nlc3NBdXRoZW50aWNhdGlvblBhcmFtcyh7XG4gICAgdXNlcm5hbWUsXG4gICAgcGFzc3dvcmQsXG4gICAgb3RwLFxuICAgIGZvcmNlU01TLFxuICAgIGV4dGVuc2libGUsXG4gICAgdHJ1c3QsXG4gICAgZm9yUmVzZXQyRkEsXG4gICAgaW5pdGlhbEhhc2gsXG4gICAgZmluZ2VycHJpbnRIYXNoLFxuICB9OiBBdXRoZW50aWNhdGVPcHRpb25zKTogUHJvbWlzZTxQcm9jZXNzZWRBdXRoZW50aWNhdGlvbk9wdGlvbnM+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcodXNlcm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyB1c2VybmFtZScpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIHBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbG93ZXJOYW1lID0gdXNlcm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBhc3N3b3JkIEhNQUMgc28gd2UgZG9uJ3Qgc2VuZCBjbGVhci10ZXh0IHBhc3N3b3Jkc1xuICAgIGNvbnN0IGhtYWNQYXNzd29yZCA9IGF3YWl0IHRoaXMuX2htYWNBdXRoU3RyYXRlZ3kuY2FsY3VsYXRlSE1BQyhsb3dlck5hbWUsIHBhc3N3b3JkKTtcblxuICAgIGNvbnN0IGF1dGhQYXJhbXM6IFByb2Nlc3NlZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyA9IHtcbiAgICAgIGVtYWlsOiBsb3dlck5hbWUsXG4gICAgICBwYXNzd29yZDogaG1hY1Bhc3N3b3JkLFxuICAgICAgZm9yY2VTTVM6ICEhZm9yY2VTTVMsXG4gICAgfTtcblxuICAgIGlmIChvdHApIHtcbiAgICAgIGF1dGhQYXJhbXMub3RwID0gb3RwO1xuICAgICAgaWYgKHRydXN0KSB7XG4gICAgICAgIGF1dGhQYXJhbXMudHJ1c3QgPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleHRlbnNpYmxlKSB7XG4gICAgICB0aGlzLl9leHRlbnNpb25LZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gICAgICBhdXRoUGFyYW1zLmV4dGVuc2libGUgPSB0cnVlO1xuICAgICAgYXV0aFBhcmFtcy5leHRlbnNpb25BZGRyZXNzID0gZ2V0QWRkcmVzc1AyUEtIKHRoaXMuX2V4dGVuc2lvbktleSk7XG4gICAgfVxuXG4gICAgaWYgKGZvclJlc2V0MkZBKSB7XG4gICAgICBhdXRoUGFyYW1zLmZvclJlc2V0MkZBID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5pdGlhbEhhc2gpIHtcbiAgICAgIGF1dGhQYXJhbXMuaW5pdGlhbEhhc2ggPSBpbml0aWFsSGFzaDtcbiAgICB9XG5cbiAgICBpZiAoZmluZ2VycHJpbnRIYXNoKSB7XG4gICAgICBhdXRoUGFyYW1zLmZpbmdlcnByaW50SGFzaCA9IGZpbmdlcnByaW50SGFzaDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXV0aFBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgcGFzc2tleSByZXNwb25zZSBpcyBpbiB0aGUgZXhwZWN0ZWQgZm9ybWF0XG4gICAqIFNob3VsZCBiZSBhcyBpcyByZXR1cm5lZCBmcm9tIG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoKVxuICAgKi9cbiAgdmFsaWRhdGVQYXNza2V5UmVzcG9uc2UocGFzc2tleVJlc3BvbnNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWRQYXNza2V5UmVzcG9uc2UgPSBKU09OLnBhcnNlKHBhc3NrZXlSZXNwb25zZSk7XG4gICAgaWYgKCFwYXJzZWRQYXNza2V5UmVzcG9uc2UgJiYgIXBhcnNlZFBhc3NrZXlSZXNwb25zZS5yZXNwb25zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIHdlYmF1dGhuUmVzcG9uc2UnKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcnNlZFBhc3NrZXlSZXNwb25zZS5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaWQgaXMgbWlzc2luZycpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyc2VkUGFzc2tleVJlc3BvbnNlLnJlc3BvbnNlLmF1dGhlbnRpY2F0b3JEYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdXRoZW50aWNhdG9yRGF0YSBpcyBtaXNzaW5nJyk7XG4gICAgfVxuICAgIGlmICghXy5pc1N0cmluZyhwYXJzZWRQYXNza2V5UmVzcG9uc2UucmVzcG9uc2UuY2xpZW50RGF0YUpTT04pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsaWVudERhdGFKU09OIGlzIG1pc3NpbmcnKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcnNlZFBhc3NrZXlSZXNwb25zZS5yZXNwb25zZS5zaWduYXR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25hdHVyZSBpcyBtaXNzaW5nJyk7XG4gICAgfVxuICAgIGlmICghXy5pc1N0cmluZyhwYXJzZWRQYXNza2V5UmVzcG9uc2UucmVzcG9uc2UudXNlckhhbmRsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckhhbmRsZSBpcyBtaXNzaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIG1ldGhvZCBmb3IgYWN0aXZhdGluZyBhbiBhY2Nlc3MgdG9rZW4uXG4gICAqL1xuICBhdXRoZW50aWNhdGVXaXRoQWNjZXNzVG9rZW4oeyBhY2Nlc3NUb2tlbiB9OiBBY2Nlc3NUb2tlbk9wdGlvbnMpOiB2b2lkIHtcbiAgICBkZWJ1Zygnbm93IGF1dGhlbnRpY2F0aW5nIHdpdGggYWNjZXNzIHRva2VuICVzJywgYWNjZXNzVG9rZW4uc3Vic3RyaW5nKDAsIDgpKTtcbiAgICB0aGlzLl90b2tlbiA9IGFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgRUNESCBrZXljaGFpbiBmb3IgdGhlIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpblBhc3N3b3JkIC0gVGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgRUNESCBrZXljaGFpbiBkYXRhLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlcmUgaXMgYW4gaXNzdWUgY3JlYXRpbmcgdGhlIGtleWNoYWluLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVVzZXJFY2RoS2V5Y2hhaW4obG9naW5QYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBrZXlEYXRhID0gdGhpcy5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICBjb25zdCBoZE5vZGUgPSBiaXRjb2luLkhETm9kZS5mcm9tQmFzZTU4KGtleURhdGEueHBydik7XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIG5ldyBFQ0RIIGtleWNoYWluIHRvIHRoZSB1c2VyJ3MgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTxhbnk+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG5ldyBFQ0RIIGtleWNoYWluLlxuICAgICAqL1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmtleWNoYWlucygpLmFkZCh7XG4gICAgICBzb3VyY2U6ICdlY2RoJyxcbiAgICAgIHhwdWI6IGhkTm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICBlbmNyeXB0ZWRYcHJ2OiB0aGlzLmVuY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogbG9naW5QYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IGhkTm9kZS50b0Jhc2U1OCgpLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdXNlcidzIHNldHRpbmdzIHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byB1cGRhdGUgdGhlIHVzZXIncyBzZXR0aW5ncyB3aXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlcmUgaXMgYW4gaXNzdWUgdXBkYXRpbmcgdGhlIHVzZXIncyBzZXR0aW5ncy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzKHBhcmFtczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wdXQodGhpcy51cmwoJy91c2VyL3NldHRpbmdzJywgMikpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgdGhlIHVzZXIncyBFQ0RIIGtleWNoYWluIGlzIGNyZWF0ZWQgZm9yIHdhbGxldCBzaGFyaW5nIGFuZCBUU1Mgd2FsbGV0cy5cbiAgICogSWYgdGhlIGtleWNoYWluIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSB1c2VyJ3Mgc2V0dGluZ3Mgd2lsbCBiZSB1cGRhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naW5QYXNzd29yZCAtIFRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdXNlcidzIHNldHRpbmdzIGVuc3VyaW5nIHdlIGhhdmUgdGhlIGVjZGhLZXljaGFpbiBpbiB0aGVyZS5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFuIGlzc3VlIGNyZWF0aW5nIHRoZSBrZXljaGFpbiBvciB1cGRhdGluZyB0aGUgdXNlcidzIHNldHRpbmdzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVVc2VyRWNkaEtleWNoYWluSXNDcmVhdGVkKGxvZ2luUGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB1c2VyJ3MgY3VycmVudCBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBjb25zdCB1c2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldCh0aGlzLnVybCgnL3VzZXIvc2V0dGluZ3MnKSkucmVzdWx0KCk7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHVzZXIncyBFQ0RIIGtleWNoYWluIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYSBuZXcga2V5Y2hhaW4gYW5kIHVwZGF0ZSB0aGUgdXNlcidzIHNldHRpbmdzLlxuICAgICAqL1xuICAgIGlmICghdXNlclNldHRpbmdzLnNldHRpbmdzLmVjZGhLZXljaGFpbikge1xuICAgICAgY29uc3QgbmV3S2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmNyZWF0ZVVzZXJFY2RoS2V5Y2hhaW4obG9naW5QYXNzd29yZCk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJTZXR0aW5ncyh7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgZWNkaEtleWNoYWluOiBuZXdLZXljaGFpbi54cHViLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSB0aGUgdXNlcidzIHNldHRpbmdzIG9iamVjdCB3aXRoIHRoZSBuZXcgRUNESCBrZXljaGFpbi5cbiAgICAgICAqL1xuICAgICAgdXNlclNldHRpbmdzLnNldHRpbmdzLmVjZGhLZXljaGFpbiA9IG5ld0tleWNoYWluLnhwdWI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgdXNlcidzIEVDREgga2V5Y2hhaW4gc2V0dGluZ3MuXG4gICAgICovXG4gICAgcmV0dXJuIHVzZXJTZXR0aW5ncy5zZXR0aW5ncztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dpbiB0byB0aGUgYml0Z28gcGxhdGZvcm0uXG4gICAqL1xuICBhc3luYyBhdXRoZW50aWNhdGUocGFyYW1zOiBBdXRoZW50aWNhdGVPcHRpb25zKTogUHJvbWlzZTxMb2dpblJlc3BvbnNlIHwgYW55PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghXy5pc09iamVjdChwYXJhbXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgb2JqZWN0IHBhcmFtcycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnBhc3N3b3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBwYXNzd29yZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JjZVYxQXV0aCA9ICEhcGFyYW1zLmZvcmNlVjFBdXRoO1xuICAgICAgY29uc3QgYXV0aFBhcmFtcyA9IGF3YWl0IHRoaXMucHJlcHJvY2Vzc0F1dGhlbnRpY2F0aW9uUGFyYW1zKHBhcmFtcyk7XG4gICAgICBjb25zdCBwYXNzd29yZCA9IHBhcmFtcy5wYXNzd29yZDtcblxuICAgICAgaWYgKHRoaXMuX3Rva2VuKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ2FscmVhZHkgbG9nZ2VkIGluJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhVcmwgPSB0aGlzLm1pY3Jvc2VydmljZXNVcmwoJy9hcGkvYXV0aC92MS9zZXNzaW9uJyk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wb3N0KGF1dGhVcmwpO1xuXG4gICAgICBpZiAoZm9yY2VWMUF1dGgpIHtcbiAgICAgICAgcmVxdWVzdC5mb3JjZVYxQXV0aCA9IHRydWU7XG4gICAgICAgIC8vIHRlbGwgdGhlIHNlcnZlciB0aGF0IHRoZSBjbGllbnQgd2FzIGZvcmNlZCB0byBkb3duZ3JhZGUgdGhlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sXG4gICAgICAgIGF1dGhQYXJhbXMuZm9yY2VWMUF1dGggPSB0cnVlO1xuICAgICAgICBkZWJ1ZygnZm9yY2luZyB2MSBhdXRoIGZvciBjYWxsIHRvIGF1dGhlbnRpY2F0ZScpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LnNlbmQoYXV0aFBhcmFtcyk7XG4gICAgICAvLyBleHRyYWN0IGJvZHkgYW5kIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgIGNvbnN0IGJvZHkgPSByZXNwb25zZS5ib2R5O1xuICAgICAgdGhpcy5fdXNlciA9IGJvZHkudXNlcjtcblxuICAgICAgaWYgKGJvZHkuYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gYm9keS5hY2Nlc3NfdG9rZW47XG4gICAgICAgIC8vIGlmIHRoZSBkb3duZ3JhZGUgd2FzIGZvcmNlZCwgYWRkaW5nIGEgd2FybmluZyBtZXNzYWdlIG1pZ2h0IGJlIHBydWRlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiBhbiBlbmNyeXB0ZWQgRUNESCB4cHJ2XG4gICAgICAgIC8vIGlmIG5vdCBwcmVzZW50LCBsZWdhY3kgYWNjb3VudFxuICAgICAgICBjb25zdCBlbmNyeXB0ZWRYcHJ2ID0gYm9keS5lbmNyeXB0ZWRFQ0RIWHBydjtcbiAgICAgICAgaWYgKCFlbmNyeXB0ZWRYcHJ2KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdLZXljaGFpbiBuZWVkcyBlbmNyeXB0ZWRYcHJ2IHByb3BlcnR5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZURldGFpbHMgPSB0aGlzLmhhbmRsZVRva2VuSXNzdWFuY2UocmVzcG9uc2UuYm9keSwgcGFzc3dvcmQpO1xuICAgICAgICB0aGlzLl90b2tlbiA9IHJlc3BvbnNlRGV0YWlscy50b2tlbjtcbiAgICAgICAgdGhpcy5fZWNkaFhwcnYgPSByZXNwb25zZURldGFpbHMuZWNkaFhwcnY7XG5cbiAgICAgICAgLy8gdmVyaWZ5IHRoZSByZXNwb25zZSdzIGF1dGhlbnRpY2l0eVxuICAgICAgICBhd2FpdCB2ZXJpZnlSZXNwb25zZUFzeW5jKHRoaXMsIHJlc3BvbnNlRGV0YWlscy50b2tlbiwgJ3Bvc3QnLCByZXF1ZXN0LCByZXNwb25zZSwgdGhpcy5fYXV0aFZlcnNpb24pO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgcmVtYWluaW5nIGNvbXBvbmVudCBmb3IgZWFzaWVyIGFjY2Vzc1xuICAgICAgICByZXNwb25zZS5ib2R5LmFjY2Vzc190b2tlbiA9IHRoaXMuX3Rva2VuO1xuICAgICAgfVxuXG4gICAgICAvLyBTeW5jIHRoZSB0b2tlbiBpbnRvIHRoZSBzdHJhdGVneSBzbyB0aGF0IHN0cmF0ZWdpZXMgd2hpY2ggbWFuYWdlIHRoZWlyXG4gICAgICAvLyBvd24ga2V5IG1hdGVyaWFsIChlLmcuIFdlYkNyeXB0b0htYWNTdHJhdGVneSkgY2FuIHNpZ24gdGhlIHN1YnNlcXVlbnRcbiAgICAgIC8vIGVuc3VyZVVzZXJFY2RoS2V5Y2hhaW5Jc0NyZWF0ZWQgcmVxdWVzdHMuICBNdXN0IGJlIGF3YWl0ZWQg4oCUIHRoZSBjYWxsXG4gICAgICAvLyBtYXkgcGVyZm9ybSBhc3luYyBrZXkgZGVyaXZhdGlvbiAoY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkpLlxuICAgICAgaWYgKHRoaXMuX3Rva2VuKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2htYWNBdXRoU3RyYXRlZ3kuc2V0VG9rZW4/Lih0aGlzLl90b2tlbik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXJTZXR0aW5ncyA9IHBhcmFtcy5lbnN1cmVFY2RoS2V5Y2hhaW4gPyBhd2FpdCB0aGlzLmVuc3VyZVVzZXJFY2RoS2V5Y2hhaW5Jc0NyZWF0ZWQocGFzc3dvcmQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHVzZXJTZXR0aW5ncz8uZWNkaEtleWNoYWluKSB7XG4gICAgICAgIHJlc3BvbnNlLmJvZHkudXNlci5lY2RoS2V5Y2hhaW4gPSB1c2VyU2V0dGluZ3MuZWNkaEtleWNoYWluO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8TG9naW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gdG8gdGhlIGJpdGdvIHBsYXRmb3JtIHdpdGggcGFzc2tleS5cbiAgICovXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZVdpdGhQYXNza2V5KFxuICAgIHBhc3NrZXk6IHN0cmluZyxcbiAgICBpbml0aWFsSGFzaD86IHN0cmluZyxcbiAgICBmaW5nZXJwcmludEhhc2g/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxMb2dpblJlc3BvbnNlIHwgYW55PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl90b2tlbikge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdhbHJlYWR5IGxvZ2dlZCBpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL2F1dGgvdjEvc2Vzc2lvbicpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucG9zdChhdXRoVXJsKTtcblxuICAgICAgdGhpcy52YWxpZGF0ZVBhc3NrZXlSZXNwb25zZShwYXNza2V5KTtcbiAgICAgIGNvbnN0IHVzZXJJZCA9IEpTT04ucGFyc2UocGFzc2tleSkucmVzcG9uc2UudXNlckhhbmRsZTtcblxuICAgICAgY29uc3QgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LnNlbmQoe1xuICAgICAgICBwYXNza2V5OiBwYXNza2V5LFxuICAgICAgICB1c2VySWQ6IHVzZXJJZCxcbiAgICAgICAgaW5pdGlhbEhhc2gsXG4gICAgICAgIGZpbmdlcnByaW50SGFzaCxcbiAgICAgIH0pO1xuICAgICAgLy8gZXh0cmFjdCBib2R5IGFuZCB1c2VyIGluZm9ybWF0aW9uXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuYm9keTtcbiAgICAgIHRoaXMuX3VzZXIgPSBib2R5LnVzZXI7XG5cbiAgICAgIGlmIChib2R5LmFjY2Vzc190b2tlbikge1xuICAgICAgICB0aGlzLl90b2tlbiA9IGJvZHkuYWNjZXNzX3Rva2VuO1xuICAgICAgICByZXNwb25zZS5ib2R5LmFjY2Vzc190b2tlbiA9IGJvZHkuYWNjZXNzX3Rva2VuO1xuICAgICAgICBhd2FpdCB0aGlzLl9obWFjQXV0aFN0cmF0ZWd5LnNldFRva2VuPy4oYm9keS5hY2Nlc3NfdG9rZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9naW4uIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoYW5kbGVSZXNwb25zZVJlc3VsdDxMb2dpblJlc3BvbnNlPigpKHJlc3BvbnNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVSZXNwb25zZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2VCb2R5IFJlc3BvbnNlIGJvZHkgb2JqZWN0XG4gICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBmb3IgdGhlIHN5bW1ldHJpYyBkZWNyeXB0aW9uXG4gICAqL1xuICBoYW5kbGVUb2tlbklzc3VhbmNlKHJlc3BvbnNlQm9keTogVG9rZW5Jc3N1YW5jZVJlc3BvbnNlLCBwYXNzd29yZD86IHN0cmluZyk6IFRva2VuSXNzdWFuY2Uge1xuICAgIC8vIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgYm9keSBjb250YWlucyB0aGUgbmVjZXNzYXJ5IHByb3BlcnRpZXNcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocmVzcG9uc2VCb2R5LCBbJ2Rlcml2YXRpb25QYXRoJ10sIFsnZW5jcnlwdGVkRUNESFhwcnYnXSk7XG5cbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuX2VudjtcbiAgICBjb25zdCBlbnZpcm9ubWVudENvbmZpZyA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52aXJvbm1lbnRdO1xuICAgIGNvbnN0IHNlcnZlclhwdWIgPSBlbnZpcm9ubWVudENvbmZpZy5zZXJ2ZXJYcHViO1xuICAgIGxldCBlY2RoWHBydiA9IHRoaXMuX2VjZGhYcHJ2O1xuICAgIGlmICghZWNkaFhwcnYpIHtcbiAgICAgIGlmICghcGFzc3dvcmQgfHwgIXJlc3BvbnNlQm9keS5lbmNyeXB0ZWRFQ0RIWHBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VjZGhYcHJ2IHByb3BlcnR5IG11c3QgYmUgc2V0IG9yIHBhc3N3b3JkIGFuZCBlbmNyeXB0ZWQgZW5jcnlwdGVkRUNESFhwcnYgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgZWNkaFhwcnYgPSB0aGlzLmRlY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiByZXNwb25zZUJvZHkuZW5jcnlwdGVkRUNESFhwcnYsXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZS5lcnJvckNvZGUgPSAnZWNkaF94cHJ2X2RlY3J5cHRpb25fZmFpbHVyZSc7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWNyeXB0IGVuY3J5cHRlZEVDREhYcHJ2LicpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBIRE5vZGUgb2JqZWN0cyBmb3IgY2xpZW50J3MgeHBydiBhbmQgc2VydmVyJ3MgeHB1YlxuICAgIGNvbnN0IGNsaWVudEhETm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoZWNkaFhwcnYpO1xuICAgIGNvbnN0IHNlcnZlckhETm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoc2VydmVyWHB1Yik7XG5cbiAgICAvLyBCSVAzMiBkZXJpdmF0aW9uIHBhdGggaXMgYXBwbGllZCB0byBib3RoIGNsaWVudCBhbmQgc2VydmVyIG1hc3RlciBrZXlzXG4gICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSBzYW5pdGl6ZUxlZ2FjeVBhdGgocmVzcG9uc2VCb2R5LmRlcml2YXRpb25QYXRoKTtcbiAgICBjb25zdCBjbGllbnREZXJpdmVkTm9kZSA9IGNsaWVudEhETm9kZS5kZXJpdmVQYXRoKGRlcml2YXRpb25QYXRoKTtcbiAgICBjb25zdCBzZXJ2ZXJEZXJpdmVkTm9kZSA9IHNlcnZlckhETm9kZS5kZXJpdmVQYXRoKGRlcml2YXRpb25QYXRoKTtcblxuICAgIGNvbnN0IHB1YmxpY0tleSA9IHNlcnZlckRlcml2ZWROb2RlLnB1YmxpY0tleTtcbiAgICBjb25zdCBzZWNyZXRLZXkgPSBjbGllbnREZXJpdmVkTm9kZS5wcml2YXRlS2V5O1xuICAgIGlmICghc2VjcmV0S2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNsaWVudCBwcml2YXRlIEtleScpO1xuICAgIH1cbiAgICBjb25zdCBzZWNyZXQgPSBCdWZmZXIuZnJvbShcbiAgICAgIC8vIEZJWE1FKEJHLTM0Mzg2KTogd2Ugc2hvdWxkIHVzZSBgc2VjcDI1NmsxLmVjZGgoKWAgaW4gdGhlIGZ1dHVyZVxuICAgICAgLy8gICAgICAgICAgICAgICAgICBzZWUgZGlzY3Vzc2lvbiBoZXJlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luLWNvcmUvc2VjcDI1NmsxL2lzc3Vlcy8zNTJcbiAgICAgIHNlY3AyNTZrMS5wdWJsaWNLZXlUd2Vha011bChwdWJsaWNLZXksIHNlY3JldEtleSlcbiAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIC8vIGRlY3J5cHQgdG9rZW4gd2l0aCBzeW1tZXRyaWMgRUNESCBrZXlcbiAgICBsZXQgcmVzcG9uc2U6IFRva2VuSXNzdWFuY2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICB0b2tlbjogdGhpcy5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcmVzcG9uc2VCb2R5LmVuY3J5cHRlZFRva2VuLFxuICAgICAgICAgIHBhc3N3b3JkOiBzZWNyZXQsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlLmVycm9yQ29kZSA9ICd0b2tlbl9kZWNyeXB0aW9uX2ZhaWx1cmUnO1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRlY3J5cHQgdG9rZW4uJyk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2VjZGhYcHJ2KSB7XG4gICAgICByZXNwb25zZS5lY2RoWHBydiA9IGVjZGhYcHJ2O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICovXG4gIGFzeW5jIHZlcmlmeVBhc3N3b3JkKHBhcmFtczogVmVyaWZ5UGFzc3dvcmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VyIHx8ICF0aGlzLl91c2VyLnVzZXJuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGN1cnJlbnQgdXNlcicpO1xuICAgIH1cbiAgICBjb25zdCBobWFjUGFzc3dvcmQgPSBhd2FpdCB0aGlzLl9obWFjQXV0aFN0cmF0ZWd5LmNhbGN1bGF0ZUhNQUModGhpcy5fdXNlci51c2VybmFtZSwgcGFyYW1zLnBhc3N3b3JkKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL3ZlcmlmeXBhc3N3b3JkJykpLnNlbmQoeyBwYXNzd29yZDogaG1hY1Bhc3N3b3JkIH0pLnJlc3VsdCgndmFsaWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBvdXQgYWxsIHN0YXRlIGZyb20gdGhpcyBCaXRHbyBvYmplY3QsIGVmZmVjdGl2ZWx5IGxvZ2dpbmcgb3V0IHRoZSBjdXJyZW50IHVzZXIuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBUT0RPOiBhcmUgdGhlcmUgYW55IG90aGVyIGZpZWxkcyB3aGljaCBzaG91bGQgYmUgY2xlYXJlZD9cbiAgICB0aGlzLl91c2VyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Rva2VuID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3JlZnJlc2hUb2tlbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9lY2RoWHBydiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIGF3YWl0IHRoaXMuX2htYWNBdXRoU3RyYXRlZ3kuY2xlYXJUb2tlbj8uKCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlIHJlZnJlc2ggdG9rZW4gdG8gZ2V0IG5ldyBhY2Nlc3MgdG9rZW4uXG4gICAqIElmIHRoZSByZWZyZXNoIHRva2VuIGlzIG51bGwvZGVmaW5lZCwgdGhlbiB3ZSB1c2UgdGhlIHN0b3JlZCB0b2tlbiBmcm9tIGF1dGhcbiAgICovXG4gIGFzeW5jIHJlZnJlc2hUb2tlbihwYXJhbXM6IHsgcmVmcmVzaFRva2VuPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsncmVmcmVzaFRva2VuJ10pO1xuXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gcGFyYW1zLnJlZnJlc2hUb2tlbiB8fCB0aGlzLl9yZWZyZXNoVG9rZW47XG5cbiAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgcmVmcmVzaCB0b2tlbiBvciBoYXZlIGF1dGhlbnRpY2F0ZWQgd2l0aCBPYXV0aCBiZWZvcmUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2NsaWVudElkIHx8ICF0aGlzLl9jbGllbnRTZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBjbGllbnQgaWQgYW5kIHNlY3JldCBzZXQgZmlyc3QgdG8gdXNlIHRoaXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5wb3N0KHRoaXMuX2Jhc2VVcmwgKyAnL29hdXRoL3Rva2VuJylcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5fY2xpZW50SWQsXG4gICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuX2NsaWVudFNlY3JldCxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgdGhpcy5fdG9rZW4gPSBib2R5LmFjY2Vzc190b2tlbjtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSBib2R5LnJlZnJlc2hfdG9rZW47XG4gICAgYXdhaXQgdGhpcy5faG1hY0F1dGhTdHJhdGVneT8uc2V0VG9rZW4/Lihib2R5LmFjY2Vzc190b2tlbik7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogbGlzdEFjY2Vzc1Rva2Vuc1xuICAgKiBHZXQgaW5mb3JtYXRpb24gb24gYWxsIG9mIHRoZSBCaXRHbyBhY2Nlc3MgdG9rZW5zIG9uIHRoZSB1c2VyXG4gICAqIEByZXR1cm4ge1xuICAgKiAgaWQ6IDxpZCBvZiB0aGUgdG9rZW4+XG4gICAqICBsYWJlbDogPHRoZSB1c2VyLXByb3ZpZGVkIGxhYmVsIGZvciB0aGlzIHRva2VuPlxuICAgKiAgdXNlcjogPGlkIG9mIHRoZSB1c2VyIG9uIHRoZSB0b2tlbj5cbiAgICogIGVudGVycHJpc2UgPGlkIG9mIHRoZSBlbnRlcnByaXNlIHRoaXMgdG9rZW4gaXMgdmFsaWQgZm9yPlxuICAgKiAgY2xpZW50OiA8dGhlIGF1dGggY2xpZW50IHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvPlxuICAgKiAgc2NvcGU6IDxsaXN0IG9mIGFsbG93ZWQgT0F1dGggc2NvcGUgdmFsdWVzPlxuICAgKiAgY3JlYXRlZDogPGRhdGUgdGhlIHRva2VuIHdhcyBjcmVhdGVkPlxuICAgKiAgZXhwaXJlczogPGRhdGUgdGhlIHRva2VuIHdpbGwgZXhwaXJlPlxuICAgKiAgb3JpZ2luOiA8dGhlIG9yaWdpbiBmb3Igd2hpY2ggdGhpcyB0b2tlbiBpcyB2YWxpZD5cbiAgICogIGlzRXh0ZW5zaWJsZTogPGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdG9rZW4gY2FuIGJlIGV4dGVuZGVkPlxuICAgKiAgZXh0ZW5zaW9uQWRkcmVzczogPGFkZHJlc3Mgd2hvc2UgcHJpdmF0ZSBrZXkncyBzaWduYXR1cmUgaXMgbmVjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiAgdW5sb2NrOiA8aW5mbyBmb3IgYWN0aW9ucyB0aGF0IHJlcXVpcmUgYW4gdW5sb2NrIGJlZm9yZSBmaXJpbmc+XG4gICAqIH1cbiAgICovXG4gIGFzeW5jIGxpc3RBY2Nlc3NUb2tlbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL2FjY2Vzc3Rva2VuJykpLnNlbmQoKS5yZXN1bHQoJ2FjY2Vzc1Rva2VucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZEFjY2Vzc1Rva2VuXG4gICAqIEFkZCBhIEJpdEdvIEFQSSBBY2Nlc3MgVG9rZW4gdG8gdGhlIGN1cnJlbnQgdXNlciBhY2NvdW50XG4gICAqIEBwYXJhbSBwYXJhbXMge1xuICAgKiAgICBvdHA6IChyZXF1aXJlZCkgPHZhbGlkIG90cCBjb2RlPlxuICAgKiAgICBsYWJlbDogKHJlcXVpcmVkKSA8bGFiZWwgZm9yIHRoZSB0b2tlbj5cbiAgICogICAgZHVyYXRpb246IDxsZW5ndGggb2YgdGltZSBpbiBzZWNvbmRzIHRoZSB0b2tlbiB3aWxsIGJlIHZhbGlkIGZvcj5cbiAgICogICAgaXBSZXN0cmljdDogPGFycmF5IG9mIElQIGFkZHJlc3Mgc3RyaW5ncyB0byB3aGl0ZWxpc3Q+XG4gICAqICAgIHR4VmFsdWVMaW1pdDogPG51bWJlciBvZiBvdXRnb2luZyBzYXRvc2hpcyBhbGxvd2VkIG9uIHRoaXMgdG9rZW4+XG4gICAqICAgIHNjb3BlOiAocmVxdWlyZWQpIDxhdXRob3JpemF0aW9uIHNjb3BlIG9mIHRoZSByZXF1ZXN0ZWQgdG9rZW4+XG4gICAqIH1cbiAgICogQHJldHVybiB7XG4gICAqICAgIGlkOiA8aWQgb2YgdGhlIHRva2VuPlxuICAgKiAgICB0b2tlbjogPGFjY2VzcyB0b2tlbiBoZXggc3RyaW5nIHRvIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSByZXF1ZXN0IHZlcmlmaWNhdGlvbj5cbiAgICogICAgbGFiZWw6IDx1c2VyLXByb3ZpZGVkIGxhYmVsIGZvciB0aGlzIHRva2VuPlxuICAgKiAgICB1c2VyOiA8aWQgb2YgdGhlIHVzZXIgb24gdGhlIHRva2VuPlxuICAgKiAgICBlbnRlcnByaXNlIDxpZCBvZiB0aGUgZW50ZXJwcmlzZSB0aGlzIHRva2VuIGlzIHZhbGlkIGZvcj5cbiAgICogICAgY2xpZW50OiA8dGhlIGF1dGggY2xpZW50IHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvPlxuICAgKiAgICBzY29wZTogPGxpc3Qgb2YgYWxsb3dlZCBPQXV0aCBzY29wZSB2YWx1ZXM+XG4gICAqICAgIGNyZWF0ZWQ6IDxkYXRlIHRoZSB0b2tlbiB3YXMgY3JlYXRlZD5cbiAgICogICAgZXhwaXJlczogPGRhdGUgdGhlIHRva2VuIHdpbGwgZXhwaXJlPlxuICAgKiAgICBvcmlnaW46IDx0aGUgb3JpZ2luIGZvciB3aGljaCB0aGlzIHRva2VuIGlzIHZhbGlkPlxuICAgKiAgICBpc0V4dGVuc2libGU6IDxmbGFnIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIGNhbiBiZSBleHRlbmRlZD5cbiAgICogICAgZXh0ZW5zaW9uQWRkcmVzczogPGFkZHJlc3Mgd2hvc2UgcHJpdmF0ZSBrZXkncyBzaWduYXR1cmUgaXMgbmVjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiAgICB1bmxvY2s6IDxpbmZvIGZvciBhY3Rpb25zIHRoYXQgcmVxdWlyZSBhbiB1bmxvY2sgYmVmb3JlIGZpcmluZz5cbiAgICogfVxuICAgKi9cbiAgYXN5bmMgYWRkQWNjZXNzVG9rZW4ocGFyYW1zOiBBZGRBY2Nlc3NUb2tlbk9wdGlvbnMpOiBQcm9taXNlPEFkZEFjY2Vzc1Rva2VuUmVzcG9uc2U+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5sYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgbGFiZWwnKTtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgbm9uLXN0cmluZyBwYXJhbXNcbiAgICAgIGlmIChwYXJhbXMuZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikgfHwgcGFyYW1zLmR1cmF0aW9uIDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZHVyYXRpb24gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5pcFJlc3RyaWN0KSB7XG4gICAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5pcFJlc3RyaWN0KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaXBSZXN0cmljdCBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgXy5mb3JFYWNoKHBhcmFtcy5pcFJlc3RyaWN0LCAoaXBBZGRyKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGlwQWRkcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaXBSZXN0cmljdCBtdXN0IGJlIGFuIGFycmF5IG9mIElQIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR4VmFsdWVMaW1pdCkge1xuICAgICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnR4VmFsdWVMaW1pdCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4VmFsdWVMaW1pdCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy50eFZhbHVlTGltaXQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFZhbHVlTGltaXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zY29wZSAmJiBwYXJhbXMuc2NvcGUubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuc2NvcGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzY29wZSBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzcGVjaWZ5IHNjb3BlIGZvciB0b2tlbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL2F1dGgvdjEvYWNjZXNzdG9rZW4nKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBvc3QoYXV0aFVybCk7XG5cbiAgICAgIGlmICghdGhpcy5fZWNkaFhwcnYpIHtcbiAgICAgICAgLy8gd2l0aG91dCBhIHByaXZhdGUga2V5LCB0aGUgdXNlciBjYW5ub3QgZGVjcnlwdCB0aGUgbmV3IGFjY2VzcyB0b2tlbiB0aGUgc2VydmVyIHdpbGwgc2VuZFxuICAgICAgICByZXF1ZXN0LmZvcmNlVjFBdXRoID0gdHJ1ZTtcbiAgICAgICAgZGVidWcoJ2ZvcmNpbmcgdjEgYXV0aCBmb3IgYWRkaW5nIGFjY2VzcyB0b2tlbiB1c2luZyB0b2tlbiAlcycsIHRoaXMuX3Rva2VuPy5zdWJzdHIoMCwgOCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3Quc2VuZChwYXJhbXMpO1xuICAgICAgaWYgKHJlcXVlc3QuZm9yY2VWMUF1dGgpIHtcbiAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuYm9keS53YXJuaW5nID0gJ0EgcHJvdG9jb2wgZG93bmdyYWRlIGhhcyBvY2N1cnJlZCBiZWNhdXNlIHRoaXMgaXMgYSBsZWdhY3kgYWNjb3VudC4nO1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8QWRkQWNjZXNzVG9rZW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBiZWZvcmUgcHJvY2VlZGluZyBhbnkgZnVydGhlclxuICAgICAgYXdhaXQgdmVyaWZ5UmVzcG9uc2VBc3luYyh0aGlzLCB0aGlzLl90b2tlbiwgJ3Bvc3QnLCByZXF1ZXN0LCByZXNwb25zZSwgdGhpcy5fYXV0aFZlcnNpb24pO1xuXG4gICAgICBjb25zdCByZXNwb25zZURldGFpbHMgPSB0aGlzLmhhbmRsZVRva2VuSXNzdWFuY2UocmVzcG9uc2UuYm9keSk7XG4gICAgICByZXNwb25zZS5ib2R5LnRva2VuID0gcmVzcG9uc2VEZXRhaWxzLnRva2VuO1xuXG4gICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8QWRkQWNjZXNzVG9rZW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXhwaXJlIHRpbWUgb2YgYW4gYWNjZXNzIHRva2VuIG1hdGNoaW5nIGVpdGhlciB0aGUgaWQgb3IgbGFiZWwgdG8gdGhlIGN1cnJlbnQgZGF0ZSwgZWZmZWN0aXZlbHkgZGVsZXRpbmcgaXRcbiAgICpcbiAgICogUGFyYW1zOlxuICAgKiBpZDogPGlkIG9mIHRoZSBhY2Nlc3MgdG9rZW4gdG8gYmUgZGVsZXRlZD5cbiAgICogbGFiZWw6IDxsYWJlbCBvZiB0aGUgYWNjZXNzIHRva2VuIHRvIGJlIGRlbGV0ZWQ+XG4gICAqXG4gICAqIFJldHVybnM6XG4gICAqIGlkOiA8aWQgb2YgdGhlIHRva2VuPlxuICAgKiBsYWJlbDogPHVzZXItcHJvdmlkZWQgbGFiZWwgZm9yIHRoaXMgdG9rZW4+XG4gICAqIHVzZXI6IDxpZCBvZiB0aGUgdXNlciBvbiB0aGUgdG9rZW4+XG4gICAqIGVudGVycHJpc2UgPGlkIG9mIHRoZSBlbnRlcnByaXNlIHRoaXMgdG9rZW4gaXMgdmFsaWQgZm9yPlxuICAgKiBjbGllbnQ6IDx0aGUgYXV0aCBjbGllbnQgdGhhdCB0aGlzIHRva2VuIGJlbG9uZ3MgdG8+XG4gICAqIHNjb3BlOiA8bGlzdCBvZiBhbGxvd2VkIE9BdXRoIHNjb3BlIHZhbHVlcz5cbiAgICogY3JlYXRlZDogPGRhdGUgdGhlIHRva2VuIHdhcyBjcmVhdGVkPlxuICAgKiBleHBpcmVzOiA8ZGF0ZSB0aGUgdG9rZW4gd2lsbCBleHBpcmU+XG4gICAqIG9yaWdpbjogPHRoZSBvcmlnaW4gZm9yIHdoaWNoIHRoaXMgdG9rZW4gaXMgdmFsaWQ+XG4gICAqIGlzRXh0ZW5zaWJsZTogPGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdG9rZW4gY2FuIGJlIGV4dGVuZGVkPlxuICAgKiBleHRlbnNpb25BZGRyZXNzOiA8YWRkcmVzcyB3aG9zZSBwcml2YXRlIGtleSdzIHNpZ25hdHVyZSBpcyBuZSpjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiB1bmxvY2s6IDxpbmZvIGZvciBhY3Rpb25zIHRoYXQgcmVxdWlyZSBhbiB1bmxvY2sgYmVmb3JlIGZpcmluZz5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQWNjZXNzVG9rZW4oeyBpZCwgbGFiZWwgfTogUmVtb3ZlQWNjZXNzVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoKCFpZCAmJiAhbGFiZWwpIHx8IChpZCAmJiBsYWJlbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIG9mIGlkIG9yIGxhYmVsJyk7XG4gICAgfVxuICAgIGlmIChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsKHRoaXMudXJsKGAvdXNlci9hY2Nlc3N0b2tlbi8ke2lkfWApKVxuICAgICAgICAuc2VuZCgpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCB0aGlzLmxpc3RBY2Nlc3NUb2tlbnMoKTtcblxuICAgIGlmICghdG9rZW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHdpdGggdGhpcyBsYWJlbCBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoaW5nVG9rZW5zID0gXy5maWx0ZXIodG9rZW5zLCB7IGxhYmVsIH0pO1xuICAgIGlmIChtYXRjaGluZ1Rva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FtYmlndW91cyBjYWxsOiBtdWx0aXBsZSB0b2tlbnMgbWF0Y2hpbmcgdGhpcyBsYWJlbCcpO1xuICAgIH1cbiAgICBpZiAobWF0Y2hpbmdUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHdpdGggdGhpcyBsYWJlbCBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlbCh0aGlzLnVybChgL3VzZXIvYWNjZXNzdG9rZW4vJHttYXRjaGluZ1Rva2Vuc1swXS5pZH1gKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHJhbmRvbSBwYXNzd29yZFxuICAgKiBAcGFyYW0gICB7TnVtYmVyfSBudW1Xb3JkcyAgICAgTnVtYmVyIG9mIDMyLWJpdCB3b3Jkc1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSAgICAgICAgICBiYXNlNTggcmFuZG9tIHBhc3N3b3JkXG4gICAqL1xuICBnZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKG51bVdvcmRzID0gNSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdlbmVyYXRlUmFuZG9tUGFzc3dvcmQobnVtV29yZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBvZiBCaXRHb1xuICAgKi9cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL2xvZ291dCcpKS5yZXN1bHQoKTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB1c2VyIGJ5IElEIChuYW1lL2VtYWlsIG9ubHkpXG4gICAqIEBwYXJhbSBpZFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcih7IGlkIH06IEdldFVzZXJPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoYC91c2VyLyR7aWR9YCkpLnJlc3VsdCgndXNlcicpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgbG9nZ2VkIGluIHVzZXJcbiAgICovXG4gIGFzeW5jIG1lKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VXNlcih7IGlkOiAnbWUnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubG9jayB0aGUgc2Vzc2lvbiBieSBwcm92aWRpbmcgT1RQXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvdHAgUmVxdWlyZWQgT1RQIGNvZGUgZm9yIHRoZSBhY2NvdW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gRGVzaXJlZCBkdXJhdGlvbiBvZiB0aGUgdW5sb2NrIGluIHNlY29uZHMgKGRlZmF1bHQ9NjAwLCBtYXg9MzYwMCkuXG4gICAqL1xuICBhc3luYyB1bmxvY2soeyBvdHAsIGR1cmF0aW9uIH06IFVubG9ja09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChvdHAgJiYgIV8uaXNTdHJpbmcob3RwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgb3IgdW5kZWZpbmVkIG90cCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci91bmxvY2snKSkuc2VuZCh7IG90cCwgZHVyYXRpb24gfSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9jayB0aGUgc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgbG9jaygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL2xvY2snKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICovXG4gIGFzeW5jIHNlc3Npb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL3Nlc3Npb24nKSkucmVzdWx0KCdzZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhIHB1c2gvc21zIGZvciB0aGUgT1RQIGNvZGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuZm9yY2VTTVMgSWYgc2V0IHRvIHRydWUsIHdpbGwgdXNlIFNNUyB0byBzZW5kIHRoZSBPVFAgdG8gdGhlIHVzZXIgZXZlbiBpZiB0aGV5IGhhdmUgb3RoZXIgMkZBIG1ldGhvZCBzZXQgdXAuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBzZW5kT1RQKHBhcmFtczogeyBmb3JjZVNNUz86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9zZW5kb3RwJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmQgdG9rZW4sIHByb3ZpZGVkIHRoZSBjdXJyZW50IHRva2VuIGlzIGV4dGVuZGFibGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIGR1cmF0aW9uOiBkdXJhdGlvbiBpbiBzZWNvbmRzIGJ5IHdoaWNoIHRvIGV4dGVuZCB0aGUgdG9rZW4sIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHRpbWVcbiAgICovXG4gIGFzeW5jIGV4dGVuZFRva2VuKHBhcmFtczogRXh0ZW5kVG9rZW5PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5fZXh0ZW5zaW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgX2V4dGVuc2lvbktleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb247XG4gICAgY29uc3QgbWVzc2FnZSA9IHRpbWVzdGFtcCArICd8JyArIHRoaXMuX3Rva2VuICsgJ3wnICsgZHVyYXRpb247XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IHRoaXMuX2V4dGVuc2lvbktleS5wcml2YXRlS2V5O1xuICAgIGlmICghcHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBwcml2YXRlS2V5IG9uIGV4dGVuc2lvbktleScpO1xuICAgIH1cbiAgICBjb25zdCBpc0NvbXByZXNzZWQgPSB0aGlzLl9leHRlbnNpb25LZXkuY29tcHJlc3NlZDtcbiAgICBjb25zdCBwcmVmaXggPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4ubWVzc2FnZVByZWZpeDtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBiaXRjb2luTWVzc2FnZS5zaWduKG1lc3NhZ2UsIHByaXZhdGVLZXksIGlzQ29tcHJlc3NlZCwgcHJlZml4KS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9leHRlbmR0b2tlbicpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnNldCgndGltZXN0YW1wJywgdGltZXN0YW1wLnRvU3RyaW5nKCkpXG4gICAgICAuc2V0KCdzaWduYXR1cmUnLCBzaWduYXR1cmUpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEga2V5IGZvciBzaGFyaW5nIGEgd2FsbGV0IHdpdGggYSB1c2VyXG4gICAqIEBwYXJhbSBlbWFpbCBlbWFpbCBvZiB1c2VyIHRvIHNoYXJlIHdhbGxldCB3aXRoXG4gICAqL1xuICBhc3luYyBnZXRTaGFyaW5nS2V5KHsgZW1haWwgfTogR2V0U2hhcmluZ0tleU9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhlbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGVtYWlsJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvc2hhcmluZ2tleScpKS5zZW5kKHsgZW1haWwgfSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlcnMgdGhhdCB3YW50IHRvIHNpZ24gd2l0aCBhIGtleSB3aWxsIHVzZSB0aGlzIGFwaSB0byBmZXRjaCB0aGUga2V5Y2hhaW4gYW5kIHRoZSBwYXRoLlxuICAgKiBVc2VycyB0aGF0IHdhbnQgdG8gdmVyaWZ5IGEgc2lnbmF0dXJlIHdpbGwgdXNlIHRoaXMgYXBpIHRvIGZldGNoIGFub3RoZXIgdXNlcnMgZWNkaCBwdWJrZXkuXG4gICAqIE5vdGU6IElmIHRoZSB1c2VyIGlkIGlzIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIGdldHRpbmcgdGhlIGN1cnJlbnQgdXNlcidzIGtleWNoYWluLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudGVycHJpc2VJZFxuICAgKiBAcGFyYW0gdXNlcklkXG4gICAqL1xuICBhc3luYyBnZXRTaWduaW5nS2V5Rm9yVXNlcihlbnRlcnByaXNlSWQ6IHN0cmluZywgdXNlcklkPzogc3RyaW5nKTogUHJvbWlzZTxHZXRTaWduaW5nS2V5QXBpPiB7XG4gICAgY29uc3QgdXNlciA9IHVzZXJJZCA/PyAnbWUnO1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybChgL2VudGVycHJpc2UvJHtlbnRlcnByaXNlSWR9L3VzZXIvJHt1c2VyfS9zaWduaW5na2V5YCwgMikpXG4gICAgICAucXVlcnkoe30pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIGdldFZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgc2V0VmFsaWRhdGUodmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHZhbGlkYXRlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIHRoaXMuX3ZhbGlkYXRlID0gdmFsaWRhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBuZXcgY29pbiBpbnN0YW5jZSB3aXRoIGl0cyBidWlsZGVyIGZhY3RvcnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgY29pbiBuYW1lIGFzIGl0IHdhcyByZWdpc3RlcmVkIGluIEBiaXRnby1iZXRhL3N0YXRpY3NcbiAgICogQHBhcmFtIHtDb2luQ29uc3RydWN0b3J9IGNvaW4gdGhlIGJ1aWxkZXIgZmFjdG9yeSBjbGFzcyBmb3IgdGhhdCBjb2luXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyKG5hbWU6IHN0cmluZywgY29pbjogQ29pbkNvbnN0cnVjdG9yKTogdm9pZCB7XG4gICAgR2xvYmFsQ29pbkZhY3RvcnkucmVnaXN0ZXIobmFtZSwgY29pbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJpdGNvaW4gbWFya2V0IGRhdGFcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG1hcmtldHMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX21hcmtldHMpIHtcbiAgICAgIHRoaXMuX21hcmtldHMgPSBuZXcgTWFya2V0cyh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX21hcmtldHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXRlc3QgYml0Y29pbiBwcmljZXNcbiAgICogKERlcHJlY2F0ZWQ6IFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlKSB1c2UgYGJpdGdvLm1hcmtldHMoKS5sYXRlc3QoKWBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIC8vIGNiLWNvbXBhdFxuICBhc3luYyBtYXJrZXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy9tYXJrZXQvbGF0ZXN0JykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtYXJrZXQgZGF0YSBmcm9tIHllc3RlcmRheVxuICAgKiAoRGVwcmVjYXRlZDogV2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUpIHVzZSBiaXRnby5tYXJrZXRzKCkueWVzdGVyZGF5KClcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHllc3RlcmRheSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL21hcmtldC95ZXN0ZXJkYXknKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBibG9ja2NoYWluIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGJsb2NrY2hhaW4oKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX2Jsb2NrY2hhaW4pIHtcbiAgICAgIHRoaXMuX2Jsb2NrY2hhaW4gPSBuZXcgQmxvY2tjaGFpbih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Jsb2NrY2hhaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyJ3Mga2V5Y2hhaW5zIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGtleWNoYWlucygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fa2V5Y2hhaW5zKSB7XG4gICAgICB0aGlzLl9rZXljaGFpbnMgPSBuZXcgS2V5Y2hhaW5zKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fa2V5Y2hhaW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdHJhdmVsIHJ1bGUgb2JqZWN0XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICB0cmF2ZWxSdWxlKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl90cmF2ZWxSdWxlKSB7XG4gICAgICB0aGlzLl90cmF2ZWxSdWxlID0gbmV3IFRyYXZlbFJ1bGUodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90cmF2ZWxSdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcidzIHdhbGxldHMgb2JqZWN0LlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgd2FsbGV0cygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fd2FsbGV0cykge1xuICAgICAgdGhpcy5fd2FsbGV0cyA9IG5ldyBXYWxsZXRzKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGVuZGluZyBhcHByb3ZhbHMgdGhhdCBjYW4gYmUgYXBwcm92ZWQvIG9yIHJlamVjdGVkXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwZW5kaW5nQXBwcm92YWxzKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nQXBwcm92YWxzKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nQXBwcm92YWxzID0gbmV3IFBlbmRpbmdBcHByb3ZhbHModGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQXBwcm92YWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFdhbGxldCBvYmplY3QsIGluaXRpYWxpemVkIHdpdGggdGhlIHdhbGxldCBwYXJhbXNcbiAgICogQ2FuIGJlIHVzZWQgdG8gcmVjb25zdGl0dXRlIGEgd2FsbGV0IGZyb20gY2FjaGVkIGRhdGFcbiAgICogQHBhcmFtIHdhbGxldFBhcmFtc1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgbmV3V2FsbGV0T2JqZWN0KHdhbGxldFBhcmFtcyk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcywgd2FsbGV0UGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWMSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIG1pbmVyIGZlZSBhbW91bnRzLCBnaXZlbiB0aGUgbnVtYmVyIGFuZFxuICAgKiB0eXBlIG9mIHRyYW5zYWN0aW9uIGlucHV0cywgYWxvbmcgd2l0aCBhIGZlZSByYXRlIGluIHNhdG9zaGlzIHBlciB2a0IuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgbmV3IGNvZGUuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybiB7YW55fVxuICAgKi9cbiAgYXN5bmMgY2FsY3VsYXRlTWluZXJGZWVJbmZvKHBhcmFtczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNhbGN1bGF0ZU1pbmVyRmVlSW5mbyhwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBhIEJpdGNvaW4gYWRkcmVzcyBpcyBhIHZhbGlkIGJhc2U1OCBhZGRyZXNzXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICB2ZXJpZnlBZGRyZXNzKHBhcmFtczogRGVwcmVjYXRlZFZlcmlmeUFkZHJlc3NPcHRpb25zID0ge30pOiBib29sZWFuIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgW10pO1xuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV0d29ya05hbWUgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcms7XG4gICAgY29uc3QgbmV0d29yayA9IHV0eG9saWIubmV0d29ya3NbbmV0d29ya05hbWVdO1xuXG4gICAgcmV0dXJuIHZlcmlmeUFkZHJlc3MocGFyYW1zLmFkZHJlc3MsIG5ldHdvcmspO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IGEgc2VjcmV0IGludG8gc2hhcmRzIHVzaW5nIFNoYW1pciBTZWNyZXQgU2hhcmluZy5cbiAgICogQHBhcmFtIHNlZWQgQSBoZXhhZGVjaW1hbCBzZWNyZXQgdG8gc3BsaXRcbiAgICogQHBhcmFtIHBhc3N3b3JkcyBBbiBhcnJheSBvZiB0aGUgcGFzc3dvcmRzIHVzZWQgdG8gZW5jcnlwdCBlYWNoIHNoYXJlXG4gICAqIEBwYXJhbSBtIFRoZSB0aHJlc2hvbGQgbnVtYmVyIG9mIHNoYXJkcyBuZWNlc3NhcnkgdG8gcmVjb25zdGl0dXRlIHRoZSBzZWNyZXRcbiAgICovXG4gIHNwbGl0U2VjcmV0KHsgc2VlZCwgcGFzc3dvcmRzLCBtIH06IFNwbGl0U2VjcmV0T3B0aW9ucyk6IFNwbGl0U2VjcmV0IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFzc3dvcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzd29yZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKG0pIHx8IG0gPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ20gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDInKTtcbiAgICB9XG5cbiAgICBpZiAocGFzc3dvcmRzLmxlbmd0aCA8IG0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmRzIGFycmF5IGxlbmd0aCBjYW5ub3QgYmUgbGVzcyB0aGFuIG0nKTtcbiAgICB9XG5cbiAgICBjb25zdCBuID0gcGFzc3dvcmRzLmxlbmd0aDtcbiAgICBjb25zdCBzZWNyZXRzOiBzdHJpbmdbXSA9IHNoYW1pci5zaGFyZShzZWVkLCBuLCBtKTtcbiAgICBjb25zdCBzaGFyZHMgPSBfLnppcFdpdGgoc2VjcmV0cywgcGFzc3dvcmRzLCAoc2hhcmQsIHBhc3N3b3JkKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5lbmNyeXB0KHsgaW5wdXQ6IHNoYXJkLCBwYXNzd29yZCB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBub2RlID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgeHB1Yjogbm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICBtLFxuICAgICAgbixcbiAgICAgIHNlZWRTaGFyZXM6IHNoYXJkcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29uc3RpdHV0ZSBhIHNlY3JldCB3aGljaCB3YXMgc2hhcmRlZCB3aXRoIGBzcGxpdFNlY3JldGAuXG4gICAqIEBwYXJhbSBzaGFyZHNcbiAgICogQHBhcmFtIHBhc3N3b3Jkc1xuICAgKi9cbiAgcmVjb25zdGl0dXRlU2VjcmV0KHsgc2hhcmRzLCBwYXNzd29yZHMgfTogUmVjb25zdGl0dXRlU2VjcmV0T3B0aW9ucyk6IFJlY29uc3RpdHV0ZWRTZWNyZXQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGFyZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJkcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXNzd29yZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3N3b3JkcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJkcy5sZW5ndGggIT09IHBhc3N3b3Jkcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hhcmRzIGFuZCBwYXNzd29yZHMgYXJyYXlzIG11c3QgaGF2ZSBzYW1lIGxlbmd0aCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlY3JldHMgPSBfLnppcFdpdGgoc2hhcmRzLCBwYXNzd29yZHMsIChzaGFyZCwgcGFzc3dvcmQpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRlY3J5cHQoeyBpbnB1dDogc2hhcmQsIHBhc3N3b3JkIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNlZWQ6IHN0cmluZyA9IHNoYW1pci5jb21iaW5lKHNlY3JldHMpO1xuICAgIGNvbnN0IG5vZGUgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbShzZWVkLCAnaGV4JykpO1xuICAgIHJldHVybiB7XG4gICAgICB4cHViOiBub2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKSBhcyBzdHJpbmcsXG4gICAgICB4cHJ2OiBub2RlLnRvQmFzZTU4KCkgYXMgc3RyaW5nLFxuICAgICAgc2VlZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBzaGFyZHNcbiAgICogQHBhcmFtIHBhc3N3b3Jkc1xuICAgKiBAcGFyYW0gbVxuICAgKiBAcGFyYW0geHB1YiBPcHRpb25hbCB4cHViIHRvIHZlcmlmeSB0aGUgcmVzdWx0cyBhZ2FpbnN0XG4gICAqL1xuICB2ZXJpZnlTaGFyZHMoeyBzaGFyZHMsIHBhc3N3b3JkcywgbSwgeHB1YiB9OiBWZXJpZnlTaGFyZHNPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBhIGdpdmVuIGFycmF5J3MgdmFsdWVzIGdpdmVuIHN1YnNldCBzaXplIG1cbiAgICAgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHdob3NlIHZhbHVlcyBhcmUgdG8gYmUgYXJyYW5nZWQgaW4gYWxsIGNvbWJpbmF0aW9uc1xuICAgICAqIEBwYXJhbSBtIFRoZSBzaXplIG9mIGVhY2ggc3Vic2V0XG4gICAgICogQHBhcmFtIGVudHJ5SW5kaWNlcyBSZWN1cnNpdmVseSB0cmFpbGluZyBzZXQgb2YgY3VycmVudGx5IGNob3NlbiBhcnJheSBpbmRpY2VzIGZvciB0aGUgY29tYmluYXRpb24gc3Vic2V0IHVuZGVyIGNvbnN0cnVjdGlvblxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBjb25zdCBnZW5lcmF0ZUNvbWJpbmF0aW9ucyA9IChhcnJheTogc3RyaW5nW10sIG06IG51bWJlciwgZW50cnlJbmRpY2VzOiBudW1iZXJbXSA9IFtdKTogc3RyaW5nW11bXSA9PiB7XG4gICAgICBsZXQgY29tYmluYXRpb25zOiBzdHJpbmdbXVtdID0gW107XG5cbiAgICAgIGlmIChlbnRyeUluZGljZXMubGVuZ3RoID09PSBtKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb21iaW5hdGlvbiA9IF8uYXQoYXJyYXksIGVudHJ5SW5kaWNlcyk7XG4gICAgICAgIHJldHVybiBbY3VycmVudENvbWJpbmF0aW9uXTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGhpZ2hlc3QgaW5kZXhcbiAgICAgIGxldCBlbnRyeUluZGV4ID0gXy5sYXN0KGVudHJ5SW5kaWNlcyk7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGluZGljZXMsIGFzc3VtZSAtMVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQoZW50cnlJbmRleCkpIHtcbiAgICAgICAgZW50cnlJbmRleCA9IC0xO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IGVudHJ5SW5kZXggKyAxOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gYXBwZW5kIHRoZSBjdXJyZW50IGluZGV4IHRvIHRoZSB0cmFpbGluZyBpbmRpY2VzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbnRyeUluZGljZXMgPSBbLi4uZW50cnlJbmRpY2VzLCBpXTtcbiAgICAgICAgY29uc3QgbmV3Q29tYmluYXRpb25zID0gZ2VuZXJhdGVDb21iaW5hdGlvbnMoYXJyYXksIG0sIGN1cnJlbnRFbnRyeUluZGljZXMpO1xuICAgICAgICBjb21iaW5hdGlvbnMgPSBbLi4uY29tYmluYXRpb25zLCAuLi5uZXdDb21iaW5hdGlvbnNdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tYmluYXRpb25zO1xuICAgIH07XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2hhcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFzc3dvcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzd29yZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChzaGFyZHMubGVuZ3RoICE9PSBwYXNzd29yZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJkcyBhbmQgcGFzc3dvcmRzIGFycmF5cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNyZXRzID0gXy56aXBXaXRoKHNoYXJkcywgcGFzc3dvcmRzLCAoc2hhcmQsIHBhc3N3b3JkKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kZWNyeXB0KHsgaW5wdXQ6IHNoYXJkLCBwYXNzd29yZCB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBzZWNyZXRDb21iaW5hdGlvbnMgPSBnZW5lcmF0ZUNvbWJpbmF0aW9ucyhzZWNyZXRzLCBtKTtcbiAgICBjb25zdCBzZWVkcyA9IHNlY3JldENvbWJpbmF0aW9ucy5tYXAoKGN1cnJlbnRDb21iaW5hdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHNoYW1pci5jb21iaW5lKGN1cnJlbnRDb21iaW5hdGlvbik7XG4gICAgfSk7XG4gICAgY29uc3QgdW5pcXVlU2VlZHMgPSBfLnVuaXEoc2VlZHMpO1xuICAgIGlmICh1bmlxdWVTZWVkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2VlZCA9IF8uZmlyc3QodW5pcXVlU2VlZHMpO1xuICAgIGNvbnN0IG5vZGUgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbShzZWVkLCAnaGV4JykpO1xuICAgIGNvbnN0IHJlc3RvcmVkWHB1YiA9IG5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHhwdWIpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoeHB1YikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd4cHViIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN0b3JlZFhwdWIgIT09IHhwdWIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIGBnZXRTaGFyZWRTZWNyZXQoKWBcbiAgICovXG4gIGdldEVDREhTZWNyZXQoeyBvdGhlclB1YktleUhleCwgZWNrZXkgfTogR2V0RWNkaFNlY3JldE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghXy5pc1N0cmluZyhvdGhlclB1YktleUhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3RoZXJQdWJLZXlIZXggc3RyaW5nIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmICghXy5pc09iamVjdChlY2tleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZWNrZXkgb2JqZWN0IHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20ob3RoZXJQdWJLZXlIZXgsICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIncyBwcml2YXRlIEVDREgga2V5Y2hhaW5cbiAgICovXG4gIGFzeW5jIGdldEVDREhLZXljaGFpbihlY2RoS2V5Y2hhaW5QdWI/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghZWNkaEtleWNoYWluUHViKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldCh0aGlzLnVybCgnL3VzZXIvc2V0dGluZ3MnKSkucmVzdWx0KCk7XG4gICAgICBpZiAoIXJlc3VsdC5zZXR0aW5ncy5lY2RoS2V5Y2hhaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignZWNkaCBrZXljaGFpbiBub3QgZm91bmQgZm9yIHVzZXInKTtcbiAgICAgIH1cbiAgICAgIGVjZGhLZXljaGFpblB1YiA9IHJlc3VsdC5zZXR0aW5ncy5lY2RoS2V5Y2hhaW47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmtleWNoYWlucygpLmdldCh7IHhwdWI6IGVjZGhLZXljaGFpblB1YiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB1c2VyIGRlcml2ZWQgcHVibGljIGFuZCBwcml2YXRlIEVDREgga2V5cGFpclxuICAgKiBAcGFyYW0gcGFzc3dvcmQgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgdXNlcidzIEVDREggZW5jcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSBlbnRJZD8gb3B0aW9uYWwgZW50ZXJwcmlzZSBpZCB0byBjaGVjayBmb3IgcGVybWlzc2lvbnNcbiAgICovXG4gIGFzeW5jIGdldEVjZGhLZXlwYWlyUHJpdmF0ZShwYXNzd29yZDogc3RyaW5nLCBlbnRJZDogc3RyaW5nKTogUHJvbWlzZTxFY2RoRGVyaXZlZEtleXBhaXI+IHtcbiAgICBjb25zdCB1c2VyU2lnbmluZ0tleSA9IGF3YWl0IHRoaXMuZ2V0U2lnbmluZ0tleUZvclVzZXIoZW50SWQpO1xuICAgIGNvbnN0IHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4ID0gdXNlclNpZ25pbmdLZXkuZGVyaXZlZFB1YmtleTtcbiAgICBpZiAoIXVzZXJTaWduaW5nS2V5LmVjZGhLZXljaGFpbiB8fCAhdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgdXNlciBrZXljaGFpbi4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydEBiaXRnby5jb20uJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJFY2RoS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmdldEVDREhLZXljaGFpbih1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4pO1xuICAgIGxldCB4cHJ2O1xuICAgIHRyeSB7XG4gICAgICB4cHJ2ID0gdGhpcy5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogdXNlckVjZGhLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgcGFzc3dvcmQuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBkZXJpdmVkUHViS2V5OiBwdWJrZXlPZkFkbWluRWNkaEtleUhleCxcbiAgICAgIGRlcml2YXRpb25QYXRoOiB1c2VyU2lnbmluZ0tleS5kZXJpdmF0aW9uUGF0aCxcbiAgICAgIHhwcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gb3BlcmF0aW5nU3lzdGVtOiBvbmUgb2YgaW9zLCBhbmRyb2lkXG4gICAqIC0gcHVzaFRva2VuOiBoZXgtZm9ybWF0dGVkIHRva2VuIGZvciB0aGUgcmVzcGVjdGl2ZSBuYXRpdmUgcHVzaCBub3RpZmljYXRpb24gc2VydmljZVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyUHVzaFRva2VuKHBhcmFtczogUmVnaXN0ZXJQdXNoVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydwdXNoVG9rZW4nLCAnb3BlcmF0aW5nU3lzdGVtJ10sIFtdKTtcblxuICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgIC8vIHRoaXMgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHRvIGFuIGV4dGVuc2libGUgc2Vzc2lvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgbG9nZ2VkIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsncHVzaFRva2VuJywgJ29wZXJhdGluZ1N5c3RlbSddKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy9kZXZpY2VzJykpLnNlbmQocG9zdFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHB1c2hWZXJpZmljYXRpb25Ub2tlbjogdGhlIHRva2VuIHJlY2VpdmVkIHZpYSBwdXNoIG5vdGlmaWNhdGlvbiB0byBjb25maXJtIHRoZSBkZXZpY2UncyBtb2JpbGl0eVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgdmVyaWZ5UHVzaFRva2VuKHBhcmFtczogVmVyaWZ5UHVzaFRva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgb2JqZWN0IHBhcmFtcycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHVzaFZlcmlmaWNhdGlvblRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgcHVzaFZlcmlmaWNhdGlvblRva2VuJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgLy8gdGhpcyBkZXZpY2UgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgdG8gYW4gZXh0ZW5zaWJsZSBzZXNzaW9uXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBsb2dnZWQgaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgJ3B1c2hWZXJpZmljYXRpb25Ub2tlbicpO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL2RldmljZXMvdmVyaWZ5JykpLnNlbmQocG9zdFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gdG8gdGhlIGJpdGdvIHN5c3RlbSB1c2luZyBhbiBhdXRoY29kZSBnZW5lcmF0ZWQgdmlhIE9hdXRoXG4gICAqL1xuICBhc3luYyBhdXRoZW50aWNhdGVXaXRoQXV0aENvZGUocGFyYW1zOiBBdXRoZW50aWNhdGVXaXRoQXV0aENvZGVPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBvYmplY3QgcGFyYW1zJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5hdXRoQ29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGF1dGhDb2RlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9jbGllbnRJZCB8fCAhdGhpcy5fY2xpZW50U2VjcmV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgY2xpZW50IGlkIGFuZCBzZWNyZXQgc2V0IGZpcnN0IHRvIHVzZSB0aGlzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXV0aENvZGUgPSBwYXJhbXMuYXV0aENvZGU7XG5cbiAgICBpZiAodGhpcy5fdG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBsb2dnZWQgaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wb3N0KHRoaXMuX2Jhc2VVcmwgKyAnL29hdXRoL3Rva2VuJyk7XG4gICAgcmVxdWVzdC5mb3JjZVYxQXV0aCA9IHRydWU7IC8vIE9BdXRoIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHYxIGF1dGhlbnRpY2F0aW9uXG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcXVlc3RcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgZ3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsXG4gICAgICAgIGNvZGU6IGF1dGhDb2RlLFxuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuX2NsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9jbGllbnRTZWNyZXQsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgdGhpcy5fdG9rZW4gPSBib2R5LmFjY2Vzc190b2tlbjtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSBib2R5LnJlZnJlc2hfdG9rZW47XG5cbiAgICBhd2FpdCB0aGlzLl9obWFjQXV0aFN0cmF0ZWd5Py5zZXRUb2tlbj8uKGJvZHkuYWNjZXNzX3Rva2VuKTtcblxuICAgIHRoaXMuX3VzZXIgPSBhd2FpdCB0aGlzLm1lKCk7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBwYXNzd29yZCBvZiB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyLlxuICAgKiBBbHNvIGNoYW5nZSBhbGwgdjEgYW5kIHYyIGtleWNoYWluIHBhc3N3b3JkcyBpZiB0aGV5IG1hdGNoIHRoZVxuICAgKiBnaXZlbiBvbGRQYXNzd29yZC4gUmV0dXJucyBub3RoaW5nIG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSBvbGRQYXNzd29yZCB7U3RyaW5nfSAtIHRoZSBjdXJyZW50IHBhc3N3b3JkXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCB7U3RyaW5nfSAtIHRoZSBuZXcgcGFzc3dvcmRcbiAgICovXG4gIGFzeW5jIGNoYW5nZVBhc3N3b3JkKHsgb2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkIH06IENoYW5nZVBhc3N3b3JkT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKG9sZFBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgb2xkUGFzc3dvcmQnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcobmV3UGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBuZXdQYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoKTtcbiAgICBpZiAodHlwZW9mIHVzZXIgIT09ICdvYmplY3QnIHx8ICF1c2VyLnVzZXJuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHVzZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uID0gYXdhaXQgdGhpcy52ZXJpZnlQYXNzd29yZCh7IHBhc3N3b3JkOiBvbGRQYXNzd29yZCB9KTtcbiAgICBpZiAoIXZhbGlkYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHByb3ZpZGVkIG9sZFBhc3N3b3JkIGlzIGluY29ycmVjdCcpO1xuICAgIH1cblxuICAgIC8vIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGNvaW4gd2UgY2hvb3NlIGJlY2F1c2UgdGhlIHYyIHVwZGF0ZVBhc3N3b3JkIGZ1bmN0aW9ucyB1cGRhdGVzIGFsbCB2MiBrZXljaGFpbnNcbiAgICAvLyB3ZSBqdXN0IG5lZWQgdG8gY2hvb3NlIGEgY29pbiB0aGF0IGV4aXN0cyBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudFxuICAgIGNvbnN0IGNvaW4gPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcmsgPT09ICdiaXRjb2luJyA/ICdidGMnIDogJ3RidGMnO1xuXG4gICAgY29uc3QgdXBkYXRlS2V5Y2hhaW5QYXNzd29yZFBhcmFtcyA9IHsgb2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkIH07XG4gICAgY29uc3QgdjFLZXljaGFpblVwZGF0ZVBXUmVzdWx0ID0gYXdhaXQgdGhpcy5rZXljaGFpbnMoKS51cGRhdGVQYXNzd29yZCh1cGRhdGVLZXljaGFpblBhc3N3b3JkUGFyYW1zKTtcbiAgICBjb25zdCB2MktleWNoYWlucyA9IGF3YWl0IHRoaXMuY29pbihjb2luKS5rZXljaGFpbnMoKS51cGRhdGVQYXNzd29yZCh1cGRhdGVLZXljaGFpblBhc3N3b3JkUGFyYW1zKTtcblxuICAgIGNvbnN0IFtobWFjT2xkUGFzc3dvcmQsIGhtYWNOZXdQYXNzd29yZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLl9obWFjQXV0aFN0cmF0ZWd5LmNhbGN1bGF0ZUhNQUModXNlci51c2VybmFtZSwgb2xkUGFzc3dvcmQpLFxuICAgICAgdGhpcy5faG1hY0F1dGhTdHJhdGVneS5jYWxjdWxhdGVITUFDKHVzZXIudXNlcm5hbWUsIG5ld1Bhc3N3b3JkKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHVwZGF0ZVBhc3N3b3JkUGFyYW1zID0ge1xuICAgICAga2V5Y2hhaW5zOiB2MUtleWNoYWluVXBkYXRlUFdSZXN1bHQua2V5Y2hhaW5zLFxuICAgICAgdjJfa2V5Y2hhaW5zOiB2MktleWNoYWlucyxcbiAgICAgIHZlcnNpb246IHYxS2V5Y2hhaW5VcGRhdGVQV1Jlc3VsdC52ZXJzaW9uLFxuICAgICAgb2xkUGFzc3dvcmQ6IGhtYWNPbGRQYXNzd29yZCxcbiAgICAgIHBhc3N3b3JkOiBobWFjTmV3UGFzc3dvcmQsXG4gICAgfTtcblxuICAgIC8vIENhbGN1bGF0ZSBwYXlsb2FkIHNpemUgaW4gS0JcbiAgICBjb25zdCBwYXlsb2FkU2l6ZUJ5dGVzID0gSlNPTi5zdHJpbmdpZnkodXBkYXRlUGFzc3dvcmRQYXJhbXMpLmxlbmd0aDtcbiAgICBjb25zdCBwYXlsb2FkU2l6ZUtCID0gTWF0aC5jZWlsKHBheWxvYWRTaXplQnl0ZXMgLyAxMDI0KTtcblxuICAgIC8vIENoZWNrIGlmIGJhdGNoaW5nIGZsb3cgaXMgZW5hYmxlZFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXRjaGluZ0Zsb3dDaGVjayA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9jaGVja0JhdGNoaW5nUGFzc3dvcmRGbG93JywgMikpXG4gICAgICAgIC5xdWVyeSh7IHBheWxvYWRTaXplOiBwYXlsb2FkU2l6ZUtCLnRvU3RyaW5nKCkgfSlcbiAgICAgICAgLnJlc3VsdCgpO1xuXG4gICAgICBpZiAoYmF0Y2hpbmdGbG93Q2hlY2suaXNCYXRjaGluZ0Zsb3dFbmFibGVkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0tleWNoYWluUGFzc3dvcmRVcGRhdGVzSW5CYXRjaGVzKFxuICAgICAgICAgIHVwZGF0ZVBhc3N3b3JkUGFyYW1zLmtleWNoYWlucyxcbiAgICAgICAgICB1cGRhdGVQYXNzd29yZFBhcmFtcy52Ml9rZXljaGFpbnMsXG4gICAgICAgICAgYmF0Y2hpbmdGbG93Q2hlY2subWF4QmF0Y2hTaXplS0IsXG4gICAgICAgICAgM1xuICAgICAgICApO1xuICAgICAgICAvLyBDYWxsIGNoYW5nZXBhc3N3b3JkIEFQSSB3aXRob3V0IGtleWNoYWlucyBmb3IgYmF0Y2hpbmcgZmxvd1xuICAgICAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9jaGFuZ2VwYXNzd29yZCcpKVxuICAgICAgICAgIC5zZW5kKHtcbiAgICAgICAgICAgIHZlcnNpb246IHVwZGF0ZVBhc3N3b3JkUGFyYW1zLnZlcnNpb24sXG4gICAgICAgICAgICBvbGRQYXNzd29yZDogdXBkYXRlUGFzc3dvcmRQYXJhbXMub2xkUGFzc3dvcmQsXG4gICAgICAgICAgICBwYXNzd29yZDogdXBkYXRlUGFzc3dvcmRQYXJhbXMucGFzc3dvcmQsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmVzdWx0KCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGJhdGNoaW5nIGZsb3cgY2hlY2sgZmFpbGVkXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvY2hhbmdlcGFzc3dvcmQnKSkuc2VuZCh1cGRhdGVQYXNzd29yZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgYWRkcmVzcyBsYWJlbHMgb24gYWxsIG9mIHRoZSB1c2VyJ3Mgd2FsbGV0c1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgbGFiZWxzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvbGFiZWxzJykpLnJlc3VsdCgnbGFiZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVzIGFwcHJveGltYXRlIGZlZSBwZXIga2IgbmVlZGVkIGZvciBhIHR4IHRvIGdldCBpbnRvIGEgYmxvY2tcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy5udW1CbG9ja3MgdGFyZ2V0IGJsb2NrcyBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGJlIGNvbmZpcm1lZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLm1heEZlZSBtYXhpbXVtIGZlZSB3aWxsaW5nIHRvIGJlIHBhaWQgKGZvciBzYWZldHkpXG4gICAqIEBwYXJhbSB7YXJyYXlbc3RyaW5nXX0gcGFyYW1zLmlucHV0cyBsaXN0IG9mIHVuY29uZmlybWVkIHR4SWRzIGZyb20gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiB1c2VzIGlucHV0c1xuICAgKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLnR4U2l6ZSBlc3RpbWF0ZWQgdHJhbnNhY3Rpb24gc2l6ZSBpbiBieXRlcywgb3B0aW9uYWwgcGFyYW1ldGVyIHVzZWQgZm9yIENQRlAgZXN0aW1hdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuY3BmcEF3YXJlIGZsYWcgaW5kaWNhdGluZyBmZWUgc2hvdWxkIHRha2UgaW50byBhY2NvdW50IENQRlBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGVzdGltYXRlRmVlKHBhcmFtczogRXN0aW1hdGVGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBhbnkgPSB7IHZlcnNpb246IDEyIH07XG4gICAgaWYgKHBhcmFtcy5udW1CbG9ja3MpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubnVtQmxvY2tzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLm51bUJsb2NrcyA9IHBhcmFtcy5udW1CbG9ja3M7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubWF4RmVlKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLm1heEZlZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBxdWVyeVBhcmFtcy5tYXhGZWUgPSBwYXJhbXMubWF4RmVlO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmlucHV0cykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5pbnB1dHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuICAgICAgcXVlcnlQYXJhbXMuaW5wdXRzID0gcGFyYW1zLmlucHV0cztcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eFNpemUpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudHhTaXplKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLnR4U2l6ZSA9IHBhcmFtcy50eFNpemU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuY3BmcEF3YXJlKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5jcGZwQXdhcmUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuICAgICAgcXVlcnlQYXJhbXMuY3BmcEF3YXJlID0gcGFyYW1zLmNwZnBBd2FyZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy90eC9mZWUnKSkucXVlcnkocXVlcnlQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBCaXRHbydzIGd1YXJhbnRlZSB1c2luZyBhbiBpbnN0YW50IGlkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGluc3RhbnRHdWFyYW50ZWUocGFyYW1zOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGlkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvaW5zdGFudC8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gICAgaWYgKCFib2R5Lmd1YXJhbnRlZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBndWFyYW50ZWUgZm91bmQgaW4gcmVzcG9uc2UgYm9keScpO1xuICAgIH1cbiAgICBpZiAoIWJvZHkuc2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHNpZ25hdHVyZSBmb3VuZCBpbiBndWFyYW50ZWUgcmVzcG9uc2UgYm9keScpO1xuICAgIH1cbiAgICBjb25zdCBzaWduaW5nQWRkcmVzcyA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0uc2lnbmluZ0FkZHJlc3M7XG4gICAgY29uc3Qgc2lnbmF0dXJlQnVmZmVyID0gQnVmZmVyLmZyb20oYm9keS5zaWduYXR1cmUsICdoZXgnKTtcbiAgICBjb25zdCBwcmVmaXggPSB1dHhvbGliLm5ldHdvcmtzW2NvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0ubmV0d29ya10ubWVzc2FnZVByZWZpeDtcbiAgICBjb25zdCBpc1ZhbGlkU2lnbmF0dXJlID0gYml0Y29pbk1lc3NhZ2UudmVyaWZ5KGJvZHkuZ3VhcmFudGVlLCBzaWduaW5nQWRkcmVzcywgc2lnbmF0dXJlQnVmZmVyLCBwcmVmaXgpO1xuICAgIGlmICghaXNWYWxpZFNpZ25hdHVyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmNvcnJlY3Qgc2lnbmF0dXJlJyk7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRhcmdldCBhZGRyZXNzIGZvciBwYXltZW50IG9mIGEgQml0R28gZmVlXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRCaXRHb0ZlZUFkZHJlc3MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvYmlsbGluZy9hZGRyZXNzJykpLnNlbmQoe30pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gYWRkcmVzcyBvYmplY3QgKGluY2x1ZGluZyB0aGUgd2FsbGV0IGlkKSBmb3IgYSBnaXZlbiBhZGRyZXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gbG9vayB1cC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFdhbGxldEFkZHJlc3MoeyBhZGRyZXNzIH06IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybChgL3dhbGxldGFkZHJlc3MvJHthZGRyZXNzfWApKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBsaXN0IG9mIHVzZXIgd2ViaG9va3NcbiAgICpcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBsaXN0V2ViaG9va3MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy93ZWJob29rcycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbmV3IHVzZXIgd2ViaG9va1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IFdlYmhvb2tPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnVybCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHVybCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHR5cGUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1c2VyIHdlYmhvb2tcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHJlbW92ZVdlYmhvb2socGFyYW1zOiBXZWJob29rT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy51cmwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB1cmwnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB0eXBlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGxpc3Qgb2Ygd2ViaG9vayBub3RpZmljYXRpb25zIGZvciB0aGUgdXNlclxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tOb3RpZmljYXRpb25zKHBhcmFtczogTGlzdFdlYmhvb2tOb3RpZmljYXRpb25zT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogYW55ID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzL25vdGlmaWNhdGlvbnMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIGEgdXNlciB3ZWJob29rXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBCaXRHb1NpbXVsYXRlV2ViaG9va09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJywgJ2Jsb2NrSWQnXSwgW10pO1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMud2ViaG9va0lkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgd2ViaG9va0lkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5ibG9ja0lkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgYmxvY2tJZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoYC93ZWJob29rcy8ke3BhcmFtcy53ZWJob29rSWR9L3NpbXVsYXRlYCkpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBnZXQgY29uc3RhbnRzIHdoaWNoIGFyZSByZWxldmFudCB0byB0aGUgY2xpZW50LlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGhhcyBhIGtub3duIHJhY2UgY29uZGl0aW9uLiBJdCBtYXkgcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgb3ZlciB0aW1lLFxuICAgKiBlc3BlY2lhbGx5IGlmIGNhbGxlZCBzaG9ydGx5IGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBCaXRHbyBvYmplY3QuXG4gICAqXG4gICAqIE5ldyBjb2RlIHNob3VsZCBjYWxsIGZldGNoQ29uc3RhbnRzKCkgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xpZW50IGNvbnN0YW50cyBvYmplY3RcbiAgICovXG4gIGdldENvbnN0YW50cygpOiBhbnkge1xuICAgIC8vIGtpY2sgb2ZmIGEgZnJlc2ggcmVxdWVzdCBmb3IgdGhlIGNsaWVudCBjb25zdGFudHNcbiAgICB0aGlzLmZldGNoQ29uc3RhbnRzKCkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICAvLyBtYWtlIHN1cmUgYW4gZXJyb3IgZG9lcyBub3QgdGVybWluYXRlIHRoZSBlbnRpcmUgc2NyaXB0XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBjbGllbnQgY29uc3RhbnRzIGZyb20gQml0R28nKTtcbiAgICAgICAgY29uc29sZS50cmFjZShlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gdXNlIGRlZmF1bHRDb25zdGFudHMgYXMgdGhlIGJhY2t1cCBmb3Iga2V5cyB0aGF0IGFyZSBub3Qgc2V0IGluIEJpdEdvQVBJLl9jb25zdGFudHNcbiAgICByZXR1cm4gXy5tZXJnZSh7fSwgZGVmYXVsdENvbnN0YW50cyh0aGlzLmdldEVudigpKSwgQml0R29BUEkuX2NvbnN0YW50cz8uW3RoaXMuZ2V0RW52KCldIHx8IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFzc2V0IHJlcXVlc3Qgd2hpY2ggZG9lcyBub3QgbmVlZCBITUFDIHZhbGlkYXRpb25cbiAgICogQHBhcmFtIHVybCBUaGUgVVJMIGZvciB0aGUgYXNzZXQgcmVxdWVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBUaGUgcmVzcG9uc2UgYm9keVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGV4ZWN1dGVBc3NldFJlcXVlc3QodXJsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlcSA9IHRoaXMuZ2V0QWdlbnRSZXF1ZXN0KCdnZXQnLCB1cmwpO1xuICAgIHJlcS5zZXQoJ0JpdEdvLVNESy1WZXJzaW9uJywgdGhpcy5fdmVyc2lvbik7XG4gICAgaWYgKHRoaXMuX2N1c3RvbVByb3h5QWdlbnQpIHtcbiAgICAgIHJlcS5hZ2VudCh0aGlzLl9jdXN0b21Qcm94eUFnZW50KTtcbiAgICB9XG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgdG8ganVzdCBhYm92ZSA1IG1pbnV0ZXMgYnkgZGVmYXVsdFxuICAgIHJlcS50aW1lb3V0KChwcm9jZXNzLmVudi5CSVRHT19USU1FT1VUIGFzIGFueSkgKiAxMDAwIHx8IDMwNSAqIDEwMDApO1xuICAgIGlmICh0aGlzLmdldEFkZGl0aW9uYWxIZWFkZXJzQ2IpIHtcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxIZWFkZXJzID0gdGhpcy5nZXRBZGRpdGlvbmFsSGVhZGVyc0NiKCdnZXQnLCB1cmwpO1xuICAgICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXE7XG4gICAgcmV0dXJuIHJlc3VsdC5ib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhY2sga2V5Y2hhaW5zIGludG8gYmF0Y2hlcyB1c2luZyBGaXJzdCBGaXQgRGVjcmVhc2luZyAoRkZEKSBhbGdvcml0aG0uXG4gICAqXG4gICAqIEBwYXJhbSBrZXljaGFpbnMgLSBWMSBrZXljaGFpbnNcbiAgICogQHBhcmFtIHYyS2V5Y2hhaW5zIC0gVjIga2V5Y2hhaW5zXG4gICAqIEBwYXJhbSBtYXhCYXRjaFNpemVCeXRlcyAtIE1heGltdW0gYnl0ZSBzaXplIHBlciBiYXRjaFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYWNrS2V5Y2hhaW5zRkZEKFxuICAgIGtleWNoYWluczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICB2MktleWNoYWluczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBtYXhCYXRjaFNpemVCeXRlczogbnVtYmVyXG4gICk6IEFycmF5PHsgdjFCYXRjaDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgdjJCYXRjaDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc2l6ZUJ5dGVzOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGVudHJ5U2l6ZSA9IChpZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiBCdWZmZXIuYnl0ZUxlbmd0aChpZCwgJ3V0ZjgnKSArIEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlLCAndXRmOCcpO1xuXG4gICAgY29uc3QgaXRlbXMgPSBbXG4gICAgICAuLi5PYmplY3QuZW50cmllcyhrZXljaGFpbnMpLm1hcCgoW2lkLCB2YWx1ZV0pID0+ICh7IGlkLCB2YWx1ZSwgc2l6ZUJ5dGVzOiBlbnRyeVNpemUoaWQsIHZhbHVlKSwgaXNWMjogZmFsc2UgfSkpLFxuICAgICAgLi4uT2JqZWN0LmVudHJpZXModjJLZXljaGFpbnMpLm1hcCgoW2lkLCB2YWx1ZV0pID0+ICh7IGlkLCB2YWx1ZSwgc2l6ZUJ5dGVzOiBlbnRyeVNpemUoaWQsIHZhbHVlKSwgaXNWMjogdHJ1ZSB9KSksXG4gICAgXS5zb3J0KChhLCBiKSA9PiBiLnNpemVCeXRlcyAtIGEuc2l6ZUJ5dGVzKTtcblxuICAgIGNvbnN0IGJpbnM6IEFycmF5PHsgdjFCYXRjaDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgdjJCYXRjaDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc2l6ZUJ5dGVzOiBudW1iZXIgfT4gPSBbXTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgaWYgKGl0ZW0uc2l6ZUJ5dGVzID4gbWF4QmF0Y2hTaXplQnl0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBLZXljaGFpbiB3aXRoIGlkICR7aXRlbS5pZH0gZXhjZWVkcyB0aGUgbWF4aW11bSBiYXRjaCBzaXplIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGJpbnMuZmluZCgoYmluKSA9PiBiaW4uc2l6ZUJ5dGVzICsgaXRlbS5zaXplQnl0ZXMgPD0gbWF4QmF0Y2hTaXplQnl0ZXMpO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpZiAoaXRlbS5pc1YyKSB7XG4gICAgICAgICAgdGFyZ2V0LnYyQmF0Y2hbaXRlbS5pZF0gPSBpdGVtLnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC52MUJhdGNoW2l0ZW0uaWRdID0gaXRlbS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuc2l6ZUJ5dGVzICs9IGl0ZW0uc2l6ZUJ5dGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3QmluID0ge1xuICAgICAgICAgIHYxQmF0Y2g6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICAgICAgdjJCYXRjaDoge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICAgICAgICBzaXplQnl0ZXM6IGl0ZW0uc2l6ZUJ5dGVzLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaXRlbS5pc1YyKSB7XG4gICAgICAgICAgbmV3QmluLnYyQmF0Y2hbaXRlbS5pZF0gPSBpdGVtLnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0Jpbi52MUJhdGNoW2l0ZW0uaWRdID0gaXRlbS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBiaW5zLnB1c2gobmV3QmluKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmlucztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGtleWNoYWluIHBhc3N3b3JkIHVwZGF0ZXMgaW4gYmF0Y2hlcyB3aXRoIHJldHJ5IGxvZ2ljLlxuICAgKiBVc2VzIEZpcnN0IEZpdCBEZWNyZWFzaW5nIChGRkQpIGJpbiBwYWNraW5nIHRvIGVuc3VyZSBubyBiYXRjaCBleGNlZWRzXG4gICAqIG1heEJhdGNoU2l6ZUtCXG4gICAqXG4gICAqIEBwYXJhbSBrZXljaGFpbnMgLSBUaGUgdjEga2V5Y2hhaW5zIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gdjJLZXljaGFpbnMgLSBUaGUgdjIga2V5Y2hhaW5zIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gbWF4QmF0Y2hTaXplS0IgLSBNYXhpbXVtIHBheWxvYWQgc2l6ZSBwZXIgYmF0Y2ggaW4ga2lsb2J5dGVzXG4gICAqIEBwYXJhbSBtYXhSZXRyaWVzIC0gTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBwZXIgYmF0Y2hcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc0tleWNoYWluUGFzc3dvcmRVcGRhdGVzSW5CYXRjaGVzKFxuICAgIGtleWNoYWluczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICB2MktleWNoYWluczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBtYXhCYXRjaFNpemVLQjogbnVtYmVyLFxuICAgIG1heFJldHJpZXM6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYXhCYXRjaFNpemVCeXRlcyA9IG1heEJhdGNoU2l6ZUtCICogMTAyNDtcbiAgICBjb25zdCBiaW5zID0gdGhpcy5wYWNrS2V5Y2hhaW5zRkZEKGtleWNoYWlucywgdjJLZXljaGFpbnMsIG1heEJhdGNoU2l6ZUJ5dGVzKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmlucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgeyB2MUJhdGNoLCB2MkJhdGNoIH0gPSBiaW5zW2ldO1xuXG4gICAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG4gICAgICBsZXQgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAocmV0cnlDb3VudCA8IG1heFJldHJpZXMgJiYgIXN1Y2Nlc3MpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucHV0KHRoaXMudXJsKCcvdXNlci9rZXljaGFpbnMnLCAyKSlcbiAgICAgICAgICAgIC5zZW5kKHtcbiAgICAgICAgICAgICAga2V5Y2hhaW5zOiB2MUJhdGNoLFxuICAgICAgICAgICAgICB2Ml9rZXljaGFpbnM6IHYyQmF0Y2gsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJlc3VsdCgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBmYWlsZWQga2V5Y2hhaW5zIGluIHRoZSByZXNwb25zZVxuICAgICAgICAgIGNvbnN0IGhhc0ZhaWxlZCA9XG4gICAgICAgICAgICAocmVzcG9uc2UuZmFpbGVkPy52MSAmJiBPYmplY3Qua2V5cyhyZXNwb25zZS5mYWlsZWQudjEpLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAocmVzcG9uc2UuZmFpbGVkPy52MiAmJiBPYmplY3Qua2V5cyhyZXNwb25zZS5mYWlsZWQudjIpLmxlbmd0aCA+IDApO1xuXG4gICAgICAgICAgaWYgKGhhc0ZhaWxlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYXRjaCAke2kgKyAxfSBoYWQgZmFpbGVkIGtleWNoYWluczogJHtKU09OLnN0cmluZ2lmeShyZXNwb25zZS5mYWlsZWQpfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHJ5Q291bnQrKztcblxuICAgICAgICAgIGlmIChyZXRyeUNvdW50ID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmF0Y2ggJHtpICsgMX0gZmFpbGVkIGFmdGVyICR7bWF4UmV0cmllc30gcmV0cmllczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
2037
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Z29BUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBdUI4QjtBQUM5Qiw4REFBZ0Q7QUFDaEQsbURBQXVGO0FBQ3ZGLDhEQUFnRDtBQUNoRCxtREFBOEQ7QUFDOUQsa0VBQW9EO0FBRXBELGtEQUE2QjtBQUM3QiwwQ0FBNEI7QUFDNUIscURBQXVDO0FBQ3ZDLHVEQUF5QztBQUN6QywrQkFPZTtBQUNmLHVDQUEyRDtBQUMzRCxzREFBbUQ7QUE0Q25ELDRDQUE2QztBQUM3Qyx5Q0FBMEM7QUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFRLEVBQUMsV0FBVyxDQUFDLENBQUM7QUFFcEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDOUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDNUMsc0NBQXVDO0FBRXZDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN4QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztBQUMxRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM5QyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBRTlELE1BQWEsUUFBUTtJQXNDbkIsWUFBWSxTQUEwQixFQUFFO1FBcEJyQixpQkFBWSxHQUF1RCxDQUFDLENBQUM7UUFDOUUsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBTXpCLGFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBY2pDLElBQUksQ0FBQyxzQkFBc0IsR0FB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QUFDOztBQTd3RUgsNEJBOHdFQztBQW53RWtCLCtCQUFzQixHQUFHLEtBQUssQUFBUixDQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWxpYXNFbnZpcm9ubWVudHMsXG4gIEJhc2VDb2luLFxuICBiaXRjb2luLFxuICBCaXRHb0Jhc2UsXG4gIEJpdEdvUmVxdWVzdCxcbiAgQ29pbkNvbnN0cnVjdG9yLFxuICBjb21tb24sXG4gIERlY3J5cHRLZXlzT3B0aW9ucyxcbiAgRGVjcnlwdE9wdGlvbnMsXG4gIGRlZmF1bHRDb25zdGFudHMsXG4gIEVjZGhEZXJpdmVkS2V5cGFpcixcbiAgRW5jcnlwdE9wdGlvbnMsXG4gIEVudmlyb25tZW50TmFtZSxcbiAgZ2VuZXJhdGVSYW5kb21QYXNzd29yZCxcbiAgZ2V0QWRkcmVzc1AyUEtILFxuICBnZXRTaGFyZWRTZWNyZXQsXG4gIEdldFNoYXJpbmdLZXlPcHRpb25zLFxuICBHZXRTaWduaW5nS2V5QXBpLFxuICBHbG9iYWxDb2luRmFjdG9yeSxcbiAgSVJlcXVlc3RUcmFjZXIsXG4gIG1ha2VSYW5kb21LZXksXG4gIHNhbml0aXplTGVnYWN5UGF0aCxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgc2RrSG1hYyBmcm9tICdAYml0Z28tYmV0YS9zZGstaG1hYyc7XG5pbXBvcnQgeyBEZWZhdWx0SG1hY0F1dGhTdHJhdGVneSwgdHlwZSBJSG1hY0F1dGhTdHJhdGVneSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1obWFjJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgYmlwMzIsIEVDUGFpckludGVyZmFjZSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIGJpdGNvaW5NZXNzYWdlIGZyb20gJ2JpdGNvaW5qcy1tZXNzYWdlJztcbmltcG9ydCB7IHR5cGUgQWdlbnQgfSBmcm9tICdodHRwJztcbmltcG9ydCBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBzZWNwMjU2azEgZnJvbSAnc2VjcDI1NmsxJztcbmltcG9ydCAqIGFzIHN1cGVyYWdlbnQgZnJvbSAnc3VwZXJhZ2VudCc7XG5pbXBvcnQge1xuICBoYW5kbGVSZXNwb25zZUVycm9yLFxuICBoYW5kbGVSZXNwb25zZVJlc3VsdCxcbiAgc2VyaWFsaXplUmVxdWVzdERhdGEsXG4gIHNldFJlcXVlc3RRdWVyeVN0cmluZyxcbiAgdG9CaXRnb1JlcXVlc3QsXG4gIHZlcmlmeVJlc3BvbnNlQXN5bmMsXG59IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IGRlY3J5cHQsIGRlY3J5cHRBc3luYywgZW5jcnlwdCB9IGZyb20gJy4vZW5jcnlwdCc7XG5pbXBvcnQgeyB2ZXJpZnlBZGRyZXNzIH0gZnJvbSAnLi92MS92ZXJpZnlBZGRyZXNzJztcbmltcG9ydCB7XG4gIEFjY2Vzc1Rva2VuT3B0aW9ucyxcbiAgQWRkQWNjZXNzVG9rZW5PcHRpb25zLFxuICBBZGRBY2Nlc3NUb2tlblJlc3BvbnNlLFxuICBBZGRpdGlvbmFsSGVhZGVyc0NhbGxiYWNrLFxuICBBdXRoZW50aWNhdGVPcHRpb25zLFxuICBBdXRoZW50aWNhdGVXaXRoQXV0aENvZGVPcHRpb25zLFxuICBCaXRHb0FQSU9wdGlvbnMsXG4gIEJpdEdvSnNvbixcbiAgQml0R29TaW11bGF0ZVdlYmhvb2tPcHRpb25zLFxuICBDYWxjdWxhdGVIbWFjU3ViamVjdE9wdGlvbnMsXG4gIENhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzT3B0aW9ucyxcbiAgQ2FsY3VsYXRlUmVxdWVzdEhtYWNPcHRpb25zLFxuICBDaGFuZ2VQYXNzd29yZE9wdGlvbnMsXG4gIENvbnN0YW50cyxcbiAgRGVwcmVjYXRlZFZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBFc3RpbWF0ZUZlZU9wdGlvbnMsXG4gIEV4dGVuZFRva2VuT3B0aW9ucyxcbiAgR2V0RWNkaFNlY3JldE9wdGlvbnMsXG4gIEdldFVzZXJPcHRpb25zLFxuICBMaXN0V2ViaG9va05vdGlmaWNhdGlvbnNPcHRpb25zLFxuICBMb2dpblJlc3BvbnNlLFxuICBQaW5nT3B0aW9ucyxcbiAgUHJvY2Vzc2VkQXV0aGVudGljYXRpb25PcHRpb25zLFxuICBSZWNvbnN0aXR1dGVkU2VjcmV0LFxuICBSZWNvbnN0aXR1dGVTZWNyZXRPcHRpb25zLFxuICBSZWdpc3RlclB1c2hUb2tlbk9wdGlvbnMsXG4gIFJlbW92ZUFjY2Vzc1Rva2VuT3B0aW9ucyxcbiAgUmVxdWVzdEhlYWRlcnMsXG4gIFJlcXVlc3RNZXRob2RzLFxuICBTcGxpdFNlY3JldCxcbiAgU3BsaXRTZWNyZXRPcHRpb25zLFxuICBUb2tlbklzc3VhbmNlLFxuICBUb2tlbklzc3VhbmNlUmVzcG9uc2UsXG4gIFVubG9ja09wdGlvbnMsXG4gIFVzZXIsXG4gIFZlcmlmeVBhc3N3b3JkT3B0aW9ucyxcbiAgVmVyaWZ5UHVzaFRva2VuT3B0aW9ucyxcbiAgVmVyaWZ5UmVzcG9uc2VJbmZvLFxuICBWZXJpZnlSZXNwb25zZU9wdGlvbnMsXG4gIFZlcmlmeVNoYXJkc09wdGlvbnMsXG4gIFdlYmhvb2tPcHRpb25zLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBzaGFtaXIgPSByZXF1aXJlKCdzZWNyZXRzLmpzLWdyZW1wZScpO1xuaW1wb3J0IHBqc29uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzphcGknKTtcblxuY29uc3QgQmxvY2tjaGFpbiA9IHJlcXVpcmUoJy4vdjEvYmxvY2tjaGFpbicpO1xuY29uc3QgS2V5Y2hhaW5zID0gcmVxdWlyZSgnLi92MS9rZXljaGFpbnMnKTtcbmltcG9ydCBXYWxsZXQgPSByZXF1aXJlKCcuL3YxL3dhbGxldCcpO1xuXG5jb25zdCBXYWxsZXRzID0gcmVxdWlyZSgnLi92MS93YWxsZXRzJyk7XG5jb25zdCBNYXJrZXRzID0gcmVxdWlyZSgnLi92MS9tYXJrZXRzJyk7XG5jb25zdCBQZW5kaW5nQXBwcm92YWxzID0gcmVxdWlyZSgnLi92MS9wZW5kaW5nYXBwcm92YWxzJyk7XG5jb25zdCBUcmF2ZWxSdWxlID0gcmVxdWlyZSgnLi92MS90cmF2ZWxSdWxlJyk7XG5jb25zdCBUcmFuc2FjdGlvbkJ1aWxkZXIgPSByZXF1aXJlKCcuL3YxL3RyYW5zYWN0aW9uQnVpbGRlcicpO1xuXG5leHBvcnQgY2xhc3MgQml0R29BUEkgaW1wbGVtZW50cyBCaXRHb0Jhc2Uge1xuICAvLyB2MSB0eXBlc1xuICBwcm90ZWN0ZWQgX2tleWNoYWluczogYW55O1xuICBwcm90ZWN0ZWQgX3dhbGxldHM6IGFueTtcbiAgcHJvdGVjdGVkIF9tYXJrZXRzPzogYW55O1xuICBwcm90ZWN0ZWQgX2Jsb2NrY2hhaW4/OiBhbnk7XG4gIHByb3RlY3RlZCBfdHJhdmVsUnVsZT86IGFueTtcbiAgcHJvdGVjdGVkIF9wZW5kaW5nQXBwcm92YWxzPzogYW55O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgX2NvbnN0YW50czogYW55O1xuICBwcm90ZWN0ZWQgc3RhdGljIF9jb25zdGFudHNFeHBpcmU6IGFueTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfdGVzdG5ldFdhcm5pbmdNZXNzYWdlID0gZmFsc2U7XG4gIHB1YmxpYyByZWFkb25seSBlbnY6IEVudmlyb25tZW50TmFtZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYXNlVXJsOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYmFzZUFwaVVybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Jhc2VBcGlVcmxWMjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Jhc2VBcGlVcmxWMzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2VudjogRW52aXJvbm1lbnROYW1lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2F1dGhWZXJzaW9uOiBFeGNsdWRlPEJpdEdvQVBJT3B0aW9uc1snYXV0aFZlcnNpb24nXSwgdW5kZWZpbmVkPiA9IDI7XG4gIHByb3RlY3RlZCBfaG1hY1ZlcmlmaWNhdGlvbiA9IHRydWU7XG4gIHByb3RlY3RlZCByZWFkb25seSBfcHJveHk/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdXNlcj86IFVzZXI7XG4gIHByb3RlY3RlZCBfZXh0ZW5zaW9uS2V5PzogRUNQYWlySW50ZXJmYWNlO1xuICBwcm90ZWN0ZWQgX3JlcUlkPzogSVJlcXVlc3RUcmFjZXI7XG4gIHByb3RlY3RlZCBfdG9rZW4/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdmVyc2lvbiA9IHBqc29uLnZlcnNpb247XG4gIHByb3RlY3RlZCBfdXNlckFnZW50Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2VjZGhYcHJ2Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3JlZnJlc2hUb2tlbj86IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jbGllbnRJZD86IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jbGllbnRTZWNyZXQ/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfdmFsaWRhdGU6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBjb29raWVzUHJvcGFnYXRpb25FbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIF9jdXN0b21Qcm94eUFnZW50PzogQWdlbnQ7XG4gIHByaXZhdGUgX3JlcXVlc3RJZFByZWZpeD86IHN0cmluZztcbiAgcHJpdmF0ZSBnZXRBZGRpdGlvbmFsSGVhZGVyc0NiPzogQWRkaXRpb25hbEhlYWRlcnNDYWxsYmFjaztcbiAgcHJvdGVjdGVkIF9obWFjQXV0aFN0cmF0ZWd5OiBJSG1hY0F1dGhTdHJhdGVneTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IEJpdEdvQVBJT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5nZXRBZGRpdGlvbmFsSGVhZGVyc0NiID0gcGFyYW1zLmdldEFkZGl0aW9uYWxIZWFkZXJzQ2I7XG4gICAgdGhpcy5fcmVxdWVzdElkUHJlZml4ID0gcGFyYW1zLnJlcXVlc3RJZFByZWZpeDtcbiAgICB0aGlzLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICAhY29tbW9uLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIFtdLFxuICAgICAgICBbXG4gICAgICAgICAgJ2FjY2Vzc1Rva2VuJyxcbiAgICAgICAgICAndXNlckFnZW50JyxcbiAgICAgICAgICAnY3VzdG9tUm9vdFVSSScsXG4gICAgICAgICAgJ2N1c3RvbUJpdGNvaW5OZXR3b3JrJyxcbiAgICAgICAgICAnc2VydmVyWHB1YicsXG4gICAgICAgICAgJ3N0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsJyxcbiAgICAgICAgXVxuICAgICAgKSB8fFxuICAgICAgKHBhcmFtcy51c2VQcm9kdWN0aW9uICYmICFfLmlzQm9vbGVhbihwYXJhbXMudXNlUHJvZHVjdGlvbikpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB3ZSBvcGVyYXRlIG9uIHRoZSB0ZXN0IHNlcnZlci5cbiAgICAvLyBEZXByZWNhdGUgdXNlUHJvZHVjdGlvbiBpbiB0aGUgZnV0dXJlXG4gICAgbGV0IGVudjogRW52aXJvbm1lbnROYW1lO1xuXG4gICAgaWYgKHBhcmFtcy51c2VQcm9kdWN0aW9uKSB7XG4gICAgICBpZiAocGFyYW1zLmVudiAmJiBwYXJhbXMuZW52ICE9PSAncHJvZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgdXNlIHVzZVByb2R1Y3Rpb24gd2hlbiBlbnY9JyArIHBhcmFtcy5lbnYpO1xuICAgICAgfVxuICAgICAgZW52ID0gJ3Byb2QnO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBwYXJhbXMuY3VzdG9tUm9vdFVSSSB8fFxuICAgICAgcGFyYW1zLmN1c3RvbUJpdGNvaW5OZXR3b3JrIHx8XG4gICAgICBwYXJhbXMuY3VzdG9tU2lnbmluZ0FkZHJlc3MgfHxcbiAgICAgIHBhcmFtcy5zZXJ2ZXJYcHViIHx8XG4gICAgICBwcm9jZXNzLmVudi5CSVRHT19DVVNUT01fUk9PVF9VUkkgfHxcbiAgICAgIHByb2Nlc3MuZW52LkJJVEdPX0NVU1RPTV9CSVRDT0lOX05FVFdPUktcbiAgICApIHtcbiAgICAgIC8vIGZvciBicmFuY2ggZGVwbG95cywgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgY3VzdG9tIGVuZHBvaW50cyB3aGlsZSBzdGlsbFxuICAgICAgLy8gbWFpbnRhaW5pbmcgdGhlIG5hbWUgb2Ygc3BlY2lmaWVkIHRoZSBlbnZpcm9ubWVudFxuICAgICAgZW52ID0gcGFyYW1zLmVudiA9PT0gJ2JyYW5jaCcgPyAnYnJhbmNoJyA6ICdjdXN0b20nO1xuICAgICAgaWYgKHBhcmFtcy5jdXN0b21Sb290VVJJKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmkgPSBwYXJhbXMuY3VzdG9tUm9vdFVSSTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuY3VzdG9tQml0Y29pbk5ldHdvcmspIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLm5ldHdvcmsgPSBwYXJhbXMuY3VzdG9tQml0Y29pbk5ldHdvcms7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmN1c3RvbVNpZ25pbmdBZGRyZXNzKSB7XG4gICAgICAgIChjb21tb24uRW52aXJvbm1lbnRzW2Vudl0gYXMgYW55KS5jdXN0b21TaWduaW5nQWRkcmVzcyA9IHBhcmFtcy5jdXN0b21TaWduaW5nQWRkcmVzcztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuc2VydmVyWHB1Yikge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0uc2VydmVyWHB1YiA9IHBhcmFtcy5zZXJ2ZXJYcHViO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zdGVsbGFyRmVkZXJhdGlvblNlcnZlclVybCkge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0uc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmwgPSBwYXJhbXMuc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmw7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gcGFyYW1zLmVudiB8fCAocHJvY2Vzcy5lbnYuQklUR09fRU5WIGFzIEVudmlyb25tZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBoYXNuJ3QgYmVlbiBzZXQgdG8gdHJ1ZSBhbHJlYWR5IHNvbWUgY29uZGl0aW9ucyBhcmUgbm90IG1ldFxuICAgIGlmIChwYXJhbXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCAmJiAhdGhpcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvb2tpZXMgYXJlIG9ubHkgYWxsb3dlZCB3aGVuIGN1c3RvbSBVUklzIGFyZSBpbiB1c2UnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmF1dGhWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2F1dGhWZXJzaW9uID0gcGFyYW1zLmF1dGhWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgZW52IGlzIGFuIGFsaWFzLCBzd2FwIGl0IG91dCB3aXRoIHRoZSBlcXVpdmFsZW50IHN1cHBvcnRlZCBlbnZpcm9ubWVudFxuICAgIGlmIChlbnYgaW4gQWxpYXNFbnZpcm9ubWVudHMpIHtcbiAgICAgIGVudiA9IEFsaWFzRW52aXJvbm1lbnRzW2Vudl07XG4gICAgfVxuXG4gICAgaWYgKGVudiA9PT0gJ2N1c3RvbScgJiYgXy5pc1VuZGVmaW5lZChjb21tb24uRW52aXJvbm1lbnRzW2Vudl0udXJpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnbXVzdCB1c2UgLS1jdXN0b21yb290dXJpIG9yIHNldCB0aGUgQklUR09fQ1VTVE9NX1JPT1RfVVJJIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gdXNpbmcgdGhlIGN1c3RvbSBlbnZpcm9ubWVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVudikge1xuICAgICAgaWYgKGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XSkge1xuICAgICAgICB0aGlzLl9iYXNlVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnVyaTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnZpcm9ubWVudCAnICsgZW52ICsgJy4gU3VwcG9ydGVkIGVudmlyb25tZW50czogcHJvZCwgdGVzdCwgZGV2LCBsYXRlc3QnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gJ3Rlc3QnO1xuICAgICAgaWYgKCFCaXRHb0FQSS5fdGVzdG5ldFdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIEJpdEdvQVBJLl90ZXN0bmV0V2FybmluZ01lc3NhZ2UgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZygnQml0R28gU0RLIGVudiBub3Qgc2V0IC0gZGVmYXVsdGluZyB0byB0ZXN0IGF0IHRlc3QuYml0Z28uY29tLicpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmk7XG4gICAgfVxuICAgIHRoaXMuX2VudiA9IHRoaXMuZW52ID0gZW52O1xuXG4gICAgY29uc3Qgc3VwcG9ydGVkQXBpVG9rZW5zID0gW1xuICAgICAgJ2V0aGVyc2NhbkFwaVRva2VuJyxcbiAgICAgICdwb2x5Z29uc2NhbkFwaVRva2VuJyxcbiAgICAgICdhcmJpc2NhbkFwaVRva2VuJyxcbiAgICAgICdvcHRpbWlzdGljRXRoZXJzY2FuQXBpVG9rZW4nLFxuICAgICAgJ3prc3luY0V4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ2JzY3NjYW5BcGlUb2tlbicsXG4gICAgICAnY29yZWRhb0V4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ29hc0V4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ2Jhc2VldGhBcGlUb2tlbicsXG4gICAgICAnc2diRXhwbG9yZXJBcGlUb2tlbicsXG4gICAgICAnZmxyRXhwbG9yZXJBcGlUb2tlbicsXG4gICAgICAneGRjRXhwbG9yZXJBcGlUb2tlbicsXG4gICAgICAnd2VtaXhFeHBsb3JlckFwaVRva2VuJyxcbiAgICAgICdtb25FeHBsb3JlckFwaVRva2VuJyxcbiAgICAgICd3b3JsZEV4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ3NvbW5pYUV4cGxvcmVyQXBpVG9rZW4nLFxuICAgICAgJ3NvbmVpdW1FeHBsb3JlckFwaVRva2VuJyxcbiAgICBdO1xuXG4gICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChzdXBwb3J0ZWRBcGlUb2tlbnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl1ba2V5XSA9IHBhcmFtc1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHBhcmFtcy5ldm0pIHtcbiAgICAgIGNvbnN0IGV2bUNvbmZpZyA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XVsnZXZtJ10gfHwge307XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMuZXZtKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKHBhcmFtcy5ldm0/LltrZXldICYmIHBhcmFtcy5ldm1ba2V5XVsnYXBpVG9rZW4nXSkge1xuICAgICAgICAgIGV2bUNvbmZpZ1trZXldID0gZXZtQ29uZmlnW2tleV0gfHwge307XG4gICAgICAgICAgZXZtQ29uZmlnW2tleV1bJ2FwaVRva2VuJ10gPSBwYXJhbXMuZXZtW2tleV1bJ2FwaVRva2VuJ107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdWydldm0nXSA9IGV2bUNvbmZpZztcbiAgICB9XG5cbiAgICBjb21tb24uc2V0TmV0d29yayhjb21tb24uRW52aXJvbm1lbnRzW2Vudl0ubmV0d29yayk7XG5cbiAgICB0aGlzLl9iYXNlQXBpVXJsID0gdGhpcy5fYmFzZVVybCArICcvYXBpL3YxJztcbiAgICB0aGlzLl9iYXNlQXBpVXJsVjIgPSB0aGlzLl9iYXNlVXJsICsgJy9hcGkvdjInO1xuICAgIHRoaXMuX2Jhc2VBcGlVcmxWMyA9IHRoaXMuX2Jhc2VVcmwgKyAnL2FwaS92Myc7XG4gICAgdGhpcy5fdG9rZW4gPSBwYXJhbXMuYWNjZXNzVG9rZW47XG5cbiAgICBjb25zdCBjbGllbnRDb25zdGFudHMgPSBwYXJhbXMuY2xpZW50Q29uc3RhbnRzO1xuICAgIHRoaXMuX2luaXRpYWxpemVDbGllbnRDb25zdGFudHMoY2xpZW50Q29uc3RhbnRzKTtcblxuICAgIHRoaXMuX3VzZXJBZ2VudCA9IHBhcmFtcy51c2VyQWdlbnQgfHwgJ0JpdEdvSlMtYXBpLycgKyB0aGlzLnZlcnNpb24oKTtcbiAgICB0aGlzLl9yZXFJZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSBwYXJhbXMucmVmcmVzaFRva2VuO1xuICAgIHRoaXMuX2NsaWVudElkID0gcGFyYW1zLmNsaWVudElkO1xuICAgIHRoaXMuX2NsaWVudFNlY3JldCA9IHBhcmFtcy5jbGllbnRTZWNyZXQ7XG4gICAgdGhpcy5fa2V5Y2hhaW5zID0gbnVsbDtcbiAgICB0aGlzLl93YWxsZXRzID0gbnVsbDtcblxuICAgIC8vIHdoZXRoZXIgdG8gcGVyZm9ybSBleHRyYSBjbGllbnQtc2lkZSB2YWxpZGF0aW9uIGZvciBzb21lIHRoaW5ncywgc3VjaCBhc1xuICAgIC8vIGFkZHJlc3MgdmFsaWRhdGlvbiBvciBzaWduYXR1cmUgdmFsaWRhdGlvbi4gZGVmYXVsdHMgdG8gdHJ1ZSwgYnV0IGNhbiBiZVxuICAgIC8vIHR1cm5lZCBvZmYgYnkgc2V0dGluZyB0byBmYWxzZS4gY2FuIGFsc28gYmUgb3ZlcnJpZGRlbiBpbmRpdmlkdWFsbHkgaW4gdGhlXG4gICAgLy8gZnVuY3Rpb25zIHRoYXQgdXNlIGl0LlxuICAgIHRoaXMuX3ZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuXG4gICAgaWYgKCFwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbiAmJiBwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoKGVudiA9PSAncHJvZCcgfHwgZW52ID09ICdhZG1pblByb2QnKSAmJiBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0uaG1hY1ZlcmlmaWNhdGlvbkVuZm9yY2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRpc2FibGUgcmVxdWVzdCBITUFDIHZlcmlmaWNhdGlvbiBpbiBlbnZpcm9ubWVudCAke3RoaXMuZ2V0RW52KCl9YCk7XG4gICAgICB9XG4gICAgICBkZWJ1ZygnSE1BQyB2ZXJpZmljYXRpb24gZXhwbGljaXRseSBkaXNhYmxlZCBieSBjb25zdHJ1Y3RvciBvcHRpb24nKTtcbiAgICAgIHRoaXMuX2htYWNWZXJpZmljYXRpb24gPSBwYXJhbXMuaG1hY1ZlcmlmaWNhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoKHByb2Nlc3MgYXMgYW55KS5icm93c2VyICYmIHBhcmFtcy5jdXN0b21Qcm94eUFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBub3QgdXNlIGh0dHBzIHByb3h5IHdoaWxlIGluIGJyb3dzZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXN0b21Qcm94eUFnZW50ID0gcGFyYW1zLmN1c3RvbVByb3h5QWdlbnQ7XG4gICAgdGhpcy5faG1hY0F1dGhTdHJhdGVneSA9IHBhcmFtcy5obWFjQXV0aFN0cmF0ZWd5ID8/IG5ldyBEZWZhdWx0SG1hY0F1dGhTdHJhdGVneSgpO1xuXG4gICAgLy8gT25seSBmZXRjaCBjb25zdGFudHMgZnJvbSBjb25zdHJ1Y3RvciBpZiBjbGllbnRDb25zdGFudHMgd2FzIG5vdCBwcm92aWRlZFxuICAgIGlmICghY2xpZW50Q29uc3RhbnRzKSB7XG4gICAgICAvLyBjYXB0dXJlIG91dGVyIHN0YWNrIHNvIHdlIGhhdmUgdXNlZnVsIGRlYnVnIGluZm9ybWF0aW9uIGlmIGZldGNoIGNvbnN0YW50cyBmYWlsc1xuICAgICAgY29uc3QgZSA9IG5ldyBFcnJvcigpO1xuXG4gICAgICAvLyBLaWNrIG9mZiBmaXJzdCBsb2FkIG9mIGNvbnN0YW50c1xuICAgICAgdGhpcy5mZXRjaENvbnN0YW50cygpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhbiBlcnJvciBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlIGVudGlyZSBzY3JpcHRcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gZmV0Y2ggaW5pdGlhbCBjbGllbnQgY29uc3RhbnRzIGZyb20gQml0R28nKTtcbiAgICAgICAgICBkZWJ1ZyhlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgY2xpZW50IGNvbnN0YW50cyBpZiBwcm92aWRlZC5cbiAgICogQHBhcmFtIGNsaWVudENvbnN0YW50cyAtIFRoZSBjbGllbnQgY29uc3RhbnRzIGZyb20gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9pbml0aWFsaXplQ2xpZW50Q29uc3RhbnRzKGNsaWVudENvbnN0YW50czogYW55KTogdm9pZCB7XG4gICAgaWYgKGNsaWVudENvbnN0YW50cykge1xuICAgICAgaWYgKCFCaXRHb0FQSS5fY29uc3RhbnRzKSB7XG4gICAgICAgIEJpdEdvQVBJLl9jb25zdGFudHMgPSB7fTtcbiAgICAgIH1cbiAgICAgIEJpdEdvQVBJLl9jb25zdGFudHNbdGhpcy5lbnZdID0gJ2NvbnN0YW50cycgaW4gY2xpZW50Q29uc3RhbnRzID8gY2xpZW50Q29uc3RhbnRzLmNvbnN0YW50cyA6IGNsaWVudENvbnN0YW50cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3VwZXJhZ2VudCByZXF1ZXN0IGZvciBzcGVjaWZpZWQgaHR0cCBtZXRob2QgYW5kIFVSTCBjb25maWd1cmVkIHRvIHRoZSBTREsgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gaHR0cCBtZXRob2QgZm9yIHRoZSBuZXcgcmVxdWVzdFxuICAgKiBAcGFyYW0gdXJsIC0gVVJMIGZvciB0aGUgbmV3IHJlcXVlc3RcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBZ2VudFJlcXVlc3QobWV0aG9kOiBSZXF1ZXN0TWV0aG9kcywgdXJsOiBzdHJpbmcpOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0IHtcbiAgICBsZXQgcmVxOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0ID0gc3VwZXJhZ2VudFttZXRob2RdKHVybCk7XG4gICAgaWYgKHRoaXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCkge1xuICAgICAgcmVxID0gcmVxLndpdGhDcmVkZW50aWFscygpO1xuICAgIH1cbiAgICByZXR1cm4gcmVxO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBiYXNlY29pbiBvYmplY3RcbiAgICogQHBhcmFtIG5hbWVcbiAgICovXG4gIHB1YmxpYyBjb2luKG5hbWU6IHN0cmluZyk6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gR2xvYmFsQ29pbkZhY3RvcnkuZ2V0SW5zdGFuY2UodGhpcywgbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IEJpdEdvIGVudmlyb25tZW50XG4gICAqL1xuICBnZXRFbnYoKTogRW52aXJvbm1lbnROYW1lIHtcbiAgICByZXR1cm4gdGhpcy5fZW52O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBhdXRoIHZlcnNpb24gdXNlZCBmb3IgcmVxdWVzdHMgdG8gdGhlIEJpdEdvIHNlcnZlclxuICAgKi9cbiAgZ2V0QXV0aFZlcnNpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aFZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYW5kIHNlbmRzIGEgdjItYXV0aGVudGljYXRlZCByZXF1ZXN0LCB0aGVuIHZlcmlmaWVzIHRoZSByZXNwb25zZSBITUFDLlxuICAgKiBFeHRyYWN0ZWQgZnJvbSB0aGUgcmVxLnRoZW4gb3ZlcnJpZGUgaW4gcmVxdWVzdFBhdGNoIHRvIGtlZXAgdGhhdCBtZXRob2QgcmVhZGFibGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZW5kUmVxdWVzdFdpdGhIbWFjKHtcbiAgICByZXEsXG4gICAgbWV0aG9kLFxuICAgIHVybCxcbiAgICBkYXRhLFxuICAgIHN0cmF0ZWd5QXV0aGVudGljYXRlZCxcbiAgICBvbmZ1bGZpbGxlZCxcbiAgICBvcmlnaW5hbFRoZW4sXG4gIH06IHtcbiAgICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3Q7XG4gICAgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kcztcbiAgICB1cmw6IHN0cmluZztcbiAgICBkYXRhOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3RyYXRlZ3lBdXRoZW50aWNhdGVkOiBib29sZWFuO1xuICAgIG9uZnVsZmlsbGVkOiAoKHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlKSA9PiBhbnkpIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBvcmlnaW5hbFRoZW46IChvbmZ1bGZpbGxlZDogYW55LCBvbnJlamVjdGVkPzogYW55KSA9PiBQcm9taXNlPGFueT47XG4gIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLl90b2tlbiB8fCBzdHJhdGVneUF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHNldFJlcXVlc3RRdWVyeVN0cmluZyhyZXEpO1xuXG4gICAgICBjb25zdCByZXF1ZXN0UHJvcGVydGllcyA9IGF3YWl0IHRoaXMuX2htYWNBdXRoU3RyYXRlZ3kuY2FsY3VsYXRlUmVxdWVzdEhlYWRlcnMoe1xuICAgICAgICB1cmw6IHJlcS51cmwsXG4gICAgICAgIHRva2VuOiB0aGlzLl90b2tlbiA/PyAnJyxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICB0ZXh0OiBkYXRhIHx8ICcnLFxuICAgICAgICBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24sXG4gICAgICB9KTtcbiAgICAgIHJlcS5zZXQoJ0F1dGgtVGltZXN0YW1wJywgcmVxdWVzdFByb3BlcnRpZXMudGltZXN0YW1wLnRvU3RyaW5nKCkpO1xuXG4gICAgICByZXEuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgcmVxdWVzdFByb3BlcnRpZXMudG9rZW5IYXNoKTtcbiAgICAgIGRlYnVnKFxuICAgICAgICAnc2VuZGluZyB2JWQgJXMgcmVxdWVzdCB0byAlcyB3aXRoIHRva2VuICVzJyxcbiAgICAgICAgdGhpcy5fYXV0aFZlcnNpb24sXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgdXJsLFxuICAgICAgICB0aGlzLl90b2tlbj8uc3Vic3RyKDAsIDgpID8/ICcoc3RyYXRlZ3ktbWFuYWdlZCknXG4gICAgICApO1xuXG4gICAgICByZXEuc2V0KCdITUFDJywgcmVxdWVzdFByb3BlcnRpZXMuaG1hYyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2V0QWRkaXRpb25hbEhlYWRlcnNDYikge1xuICAgICAgY29uc3QgYWRkaXRpb25hbEhlYWRlcnMgPSB0aGlzLmdldEFkZGl0aW9uYWxIZWFkZXJzQ2IobWV0aG9kLCB1cmwsIGRhdGEpO1xuICAgICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmeSB0aGUgcmVzcG9uc2UgYmVmb3JlIGNhbGxpbmcgdGhlIG9yaWdpbmFsIG9uZnVsZmlsbGVkIGhhbmRsZXIsXG4gICAgICogYW5kIG1ha2Ugc3VyZSBvbnJlamVjdGVkIGlzIGNhbGxlZCBpZiBhIHZlcmlmaWNhdGlvbiBlcnJvciBpcyBlbmNvdW50ZXJlZFxuICAgICAqL1xuICAgIGNvbnN0IG5ld09uRnVsZmlsbGVkID0gb25mdWxmaWxsZWRcbiAgICAgID8gYXN5bmMgKHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgLy8gSE1BQyB2ZXJpZmljYXRpb24gaXMgb25seSBhbGxvd2VkIHRvIGJlIHNraXBwZWQgaW4gY2VydGFpbiBlbnZpcm9ubWVudHMuXG4gICAgICAgICAgLy8gVGhpcyBpcyBjaGVja2VkIGluIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGNoZWNraW5nIGl0IGFnYWluIGF0IHJlcXVlc3QgdGltZVxuICAgICAgICAgIC8vIHdpbGwgaGVscCBwcmV2ZW50IGFnYWluc3QgdGFtcGVyaW5nIG9mIHRoaXMgcHJvcGVydHkgYWZ0ZXIgdGhlIG9iamVjdCBpcyBjcmVhdGVkXG4gICAgICAgICAgaWYgKCF0aGlzLl9obWFjVmVyaWZpY2F0aW9uICYmICFjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLmhtYWNWZXJpZmljYXRpb25FbmZvcmNlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uZnVsZmlsbGVkKHJlc3BvbnNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB2ZXJpZmllZFJlc3BvbnNlID0gYXdhaXQgdmVyaWZ5UmVzcG9uc2VBc3luYyhcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLl90b2tlbixcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgdGhpcy5fYXV0aFZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBvbmZ1bGZpbGxlZCh2ZXJpZmllZFJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgOiBudWxsO1xuICAgIHJldHVybiBvcmlnaW5hbFRoZW4obmV3T25GdWxmaWxsZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBwYXRjaGluZyBmdW5jdGlvbiB3aGljaCBjYW4gYXBwbHkgb3VyIGF1dGhvcml6YXRpb25cbiAgICogaGVhZGVycyB0byBhbnkgb3V0Ym91bmQgcmVxdWVzdC5cbiAgICogQHBhcmFtIG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSByZXF1ZXN0UGF0Y2gobWV0aG9kOiBSZXF1ZXN0TWV0aG9kcywgdXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXEgPSB0aGlzLmdldEFnZW50UmVxdWVzdChtZXRob2QsIHVybCk7XG4gICAgaWYgKHRoaXMuX2N1c3RvbVByb3h5QWdlbnQpIHtcbiAgICAgIGRlYnVnKCd1c2luZyBjdXN0b20gcHJveHkgYWdlbnQnKTtcbiAgICAgIGlmICh0aGlzLl9jdXN0b21Qcm94eUFnZW50KSB7XG4gICAgICAgIHJlcS5hZ2VudCh0aGlzLl9jdXN0b21Qcm94eUFnZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbFRoZW4gPSByZXEudGhlbi5iaW5kKHJlcSk7XG4gICAgcmVxLnRoZW4gPSAob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+IHtcbiAgICAgIC8vIGludGVyY2VwdCBhIHJlcXVlc3QgYmVmb3JlIGl0J3Mgc3VibWl0dGVkIHRvIHRoZSBzZXJ2ZXIgZm9yIHYyIGF1dGhlbnRpY2F0aW9uIChiYXNlZCBvbiB0b2tlbilcbiAgICAgIGlmICh0aGlzLl92ZXJzaW9uKSB7XG4gICAgICAgIC8vIFRPRE8gLSBkZWNpZGUgd2hlcmUgdG8gZ2V0IHZlcnNpb25cbiAgICAgICAgcmVxLnNldCgnQml0R28tU0RLLVZlcnNpb24nLCB0aGlzLl92ZXJzaW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuX3JlcUlkKSkge1xuICAgICAgICBjb25zdCByZXFJZCA9IHRoaXMuX3JlcUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuX3JlcXVlc3RJZFByZWZpeCA/IGAke3RoaXMuX3JlcXVlc3RJZFByZWZpeH0ke3JlcUlkfWAgOiByZXFJZDtcbiAgICAgICAgcmVxLnNldCgnUmVxdWVzdC1JRCcsIHJlcXVlc3RJZCk7XG5cbiAgICAgICAgLy8gaW5jcmVtZW50IGFmdGVyIHNldHRpbmcgdGhlIGhlYWRlciBzbyB0aGUgc2VxdWVuY2UgbnVtYmVycyBzdGFydCBhdCAwXG4gICAgICAgIHRoaXMuX3JlcUlkLmluYygpO1xuXG4gICAgICAgIC8vIHJlcXVlc3QgaWRzIG11c3QgYmUgc2V0IGJlZm9yZSBlYWNoIHJlcXVlc3QgaW5zdGVhZCBvZiBiZWluZyBrZXB0XG4gICAgICAgIC8vIGluc2lkZSB0aGUgYml0Z28gb2JqZWN0LiBUaGlzIGlzIHRvIHByZXZlbnQgcmVlbnRyYW5jeSBpc3N1ZXMgd2hlcmVcbiAgICAgICAgLy8gbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlcXVlc3RzIGNvdWxkIGNhdXNlIGluY29ycmVjdCByZXFJZHMgdG8gYmUgdXNlZFxuICAgICAgICBkZWxldGUgdGhpcy5fcmVxSWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHByZXZlbnQgSUUgZnJvbSBjYWNoaW5nIHJlcXVlc3RzXG4gICAgICByZXEuc2V0KCdJZi1Nb2RpZmllZC1TaW5jZScsICdNb24sIDI2IEp1bCAxOTk3IDA1OjAwOjAwIEdNVCcpO1xuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5fdXNlckFnZW50KSB7XG4gICAgICAgIC8vIElmIG5vdCBpbiB0aGUgYnJvd3Nlciwgc2V0IHRoZSBVc2VyLUFnZW50LiBCcm93c2VycyBkb24ndCBhbGxvd1xuICAgICAgICAvLyBzZXR0aW5nIG9mIFVzZXItQWdlbnQsIHNvIHdlIG11c3QgZGlzYWJsZSB0aGlzIHdoZW4gcnVuIGluIHRoZVxuICAgICAgICAvLyBicm93c2VyIChicm93c2VyaWZ5IHNldHMgcHJvY2Vzcy5icm93c2VyKS5cbiAgICAgICAgcmVxLnNldCgnVXNlci1BZ2VudCcsIHRoaXMuX3VzZXJBZ2VudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IHRvIGp1c3QgYWJvdmUgNSBtaW51dGVzIGJ5IGRlZmF1bHRcbiAgICAgIHJlcS50aW1lb3V0KChwcm9jZXNzLmVudi5CSVRHT19USU1FT1VUIGFzIGFueSkgKiAxMDAwIHx8IDMwNSAqIDEwMDApO1xuXG4gICAgICAvLyBUaGUgc3RyYXRlZ3kgbWF5IGhhdmUgaXRzIG93biBzaWduaW5nIG1hdGVyaWFsIChlLmcuIGEgQ3J5cHRvS2V5XG4gICAgICAvLyByZXN0b3JlZCBmcm9tIEluZGV4ZWREQikgaW5kZXBlbmRlbnQgb2YgdGhpcy5fdG9rZW4uXG4gICAgICBjb25zdCBzdHJhdGVneUF1dGhlbnRpY2F0ZWQgPSB0aGlzLl9obWFjQXV0aFN0cmF0ZWd5LmlzQXV0aGVudGljYXRlZD8uKCkgPz8gZmFsc2U7XG5cbiAgICAgIHJlcS5pc1YyQXV0aGVudGljYXRlZCA9IHRydWU7XG4gICAgICByZXEuYXV0aGVudGljYXRpb25Ub2tlbiA9IHRoaXMuX3Rva2VuID8/IChzdHJhdGVneUF1dGhlbnRpY2F0ZWQgPyAnc3RyYXRlZ3ktYXV0aGVudGljYXRlZCcgOiB1bmRlZmluZWQpO1xuICAgICAgLy8gc29tZSBvZiB0aGUgb2xkZXIgdG9rZW5zIGFwcGVhciB0byBiZSBvbmx5IDQwIGNoYXJhY3RlcnMgbG9uZ1xuICAgICAgaWYgKCh0aGlzLl90b2tlbiAmJiB0aGlzLl90b2tlbi5sZW5ndGggIT09IDY3ICYmIHRoaXMuX3Rva2VuLmluZGV4T2YoJ3YyeCcpICE9PSAwKSB8fCByZXEuZm9yY2VWMUF1dGgpIHtcbiAgICAgICAgLy8gdXNlIHRoZSBvbGQgbWV0aG9kXG4gICAgICAgIHJlcS5pc1YyQXV0aGVudGljYXRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJlcS5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0aGlzLl90b2tlbik7XG4gICAgICAgIGRlYnVnKCdzZW5kaW5nIHYxICVzIHJlcXVlc3QgdG8gJXMgd2l0aCB0b2tlbiAlcycsIG1ldGhvZCwgdXJsLCB0aGlzLl90b2tlbj8uc3Vic3RyKDAsIDgpKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsVGhlbihvbmZ1bGZpbGxlZCkuY2F0Y2gob25yZWplY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHJlcS5zZXQoJ0JpdEdvLUF1dGgtVmVyc2lvbicsIHRoaXMuX2F1dGhWZXJzaW9uID09PSAzID8gJzMuMCcgOiAnMi4wJyk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBzZXJpYWxpemVSZXF1ZXN0RGF0YShyZXEpO1xuXG4gICAgICByZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3RXaXRoSG1hYyh7XG4gICAgICAgIHJlcSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICB1cmwsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHN0cmF0ZWd5QXV0aGVudGljYXRlZCxcbiAgICAgICAgb25mdWxmaWxsZWQsXG4gICAgICAgIG9yaWdpbmFsVGhlbixcbiAgICAgIH0pLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICAgIH07XG4gICAgcmV0dXJuIHRvQml0Z29SZXF1ZXN0KHJlcSk7XG4gIH1cblxuICBnZXQodXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgnZ2V0JywgdXJsKTtcbiAgfVxuICBwb3N0KHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3Bvc3QnLCB1cmwpO1xuICB9XG4gIHB1dCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdwdXQnLCB1cmwpO1xuICB9XG4gIGRlbCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdkZWwnLCB1cmwpO1xuICB9XG4gIHBhdGNoKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3BhdGNoJywgdXJsKTtcbiAgfVxuICBvcHRpb25zKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ29wdGlvbnMnLCB1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgSE1BQyBmb3IgdGhlIGdpdmVuIGtleSBhbmQgbWVzc2FnZVxuICAgKiBAcGFyYW0ga2V5IHtTdHJpbmd9IC0gdGhlIGtleSB0byB1c2UgZm9yIHRoZSBITUFDXG4gICAqIEBwYXJhbSBtZXNzYWdlIHtTdHJpbmd9IC0gdGhlIGFjdHVhbCBtZXNzYWdlIHRvIEhNQUNcbiAgICogQHJldHVybnMgeyp9IC0gdGhlIHJlc3VsdCBvZiB0aGUgSE1BQyBvcGVyYXRpb25cbiAgICovXG4gIGNhbGN1bGF0ZUhNQUMoa2V5OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNka0htYWMuY2FsY3VsYXRlSE1BQyhrZXksIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgc3ViamVjdCBzdHJpbmcgdGhhdCBpcyB0byBiZSBITUFDJ2VkIGZvciBhIEhUVFAgcmVxdWVzdCBvciByZXNwb25zZVxuICAgKiBAcGFyYW0gdXJsUGF0aCByZXF1ZXN0IHVybCwgaW5jbHVkaW5nIHF1ZXJ5IHBhcmFtc1xuICAgKiBAcGFyYW0gdGV4dCByZXF1ZXN0IGJvZHkgdGV4dFxuICAgKiBAcGFyYW0gdGltZXN0YW1wIHJlcXVlc3QgdGltZXN0YW1wIGZyb20gYERhdGUubm93KClgXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIE9ubHkgc2V0IGZvciBIVFRQIHJlc3BvbnNlcywgbGVhdmUgYmxhbmsgZm9yIHJlcXVlc3RzXG4gICAqIEBwYXJhbSBtZXRob2QgcmVxdWVzdCBtZXRob2RcbiAgICogQHJldHVybnMge3N0cmluZyB8IEJ1ZmZlcn1cbiAgICovXG4gIGNhbGN1bGF0ZUhNQUNTdWJqZWN0PFQgZXh0ZW5kcyBzdHJpbmcgfCBCdWZmZXIgPSBzdHJpbmc+KHBhcmFtczogQ2FsY3VsYXRlSG1hY1N1YmplY3RPcHRpb25zPFQ+KTogVCB7XG4gICAgcmV0dXJuIHNka0htYWMuY2FsY3VsYXRlSE1BQ1N1YmplY3QoeyAuLi5wYXJhbXMsIGF1dGhWZXJzaW9uOiB0aGlzLl9hdXRoVmVyc2lvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIEhNQUMgZm9yIGFuIEhUVFAgcmVxdWVzdFxuICAgKi9cbiAgY2FsY3VsYXRlUmVxdWVzdEhNQUMocGFyYW1zOiBDYWxjdWxhdGVSZXF1ZXN0SG1hY09wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZGtIbWFjLmNhbGN1bGF0ZVJlcXVlc3RITUFDKHsgLi4ucGFyYW1zLCBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHJlcXVlc3QgaGVhZGVycyB3aXRoIEhNQUNcbiAgICovXG4gIGNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzKHBhcmFtczogQ2FsY3VsYXRlUmVxdWVzdEhlYWRlcnNPcHRpb25zKTogUmVxdWVzdEhlYWRlcnMge1xuICAgIHJldHVybiBzZGtIbWFjLmNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzKHsgLi4ucGFyYW1zLCBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBITUFDIGZvciBhbiBIVFRQIHJlc3BvbnNlIChzeW5jaHJvbm91cywgdXNlcyBzZGstaG1hYyBkaXJlY3RseSkuXG4gICAqIEtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleHRlcm5hbCBjYWxsZXJzLlxuICAgKi9cbiAgdmVyaWZ5UmVzcG9uc2UocGFyYW1zOiBWZXJpZnlSZXNwb25zZU9wdGlvbnMpOiBWZXJpZnlSZXNwb25zZUluZm8ge1xuICAgIHJldHVybiBzZGtIbWFjLnZlcmlmeVJlc3BvbnNlKHsgLi4ucGFyYW1zLCBhdXRoVmVyc2lvbjogdGhpcy5fYXV0aFZlcnNpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBITUFDIGZvciBhbiBIVFRQIHJlc3BvbnNlIHZpYSB0aGUgY29uZmlndXJlZCBzdHJhdGVneSAoYXN5bmMpLlxuICAgKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIHJlcXVlc3QgcGlwZWxpbmUuXG4gICAqL1xuICB2ZXJpZnlSZXNwb25zZUFzeW5jKHBhcmFtczogVmVyaWZ5UmVzcG9uc2VPcHRpb25zKTogUHJvbWlzZTxWZXJpZnlSZXNwb25zZUluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5faG1hY0F1dGhTdHJhdGVneS52ZXJpZnlSZXNwb25zZSh7IC4uLnBhcmFtcywgYXV0aFZlcnNpb246IHRoaXMuX2F1dGhWZXJzaW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHVzZWZ1bCBjb25zdGFudCB2YWx1ZXMgZnJvbSB0aGUgQml0R28gc2VydmVyLlxuICAgKiBUaGVzZSB2YWx1ZXMgZG8gY2hhbmdlIGluZnJlcXVlbnRseSwgc28gdGhleSBuZWVkIHRvIGJlIGZldGNoZWQsXG4gICAqIGJ1dCBhcmUgdW5saWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYSBCaXRHbyBvYmplY3QsXG4gICAqIHNvIHRoZXkgY2FuIHNhZmVseSBjYWNoZWQuXG4gICAqL1xuICBhc3luYyBmZXRjaENvbnN0YW50cygpOiBQcm9taXNlPENvbnN0YW50cz4ge1xuICAgIGNvbnN0IGVudiA9IHRoaXMuZ2V0RW52KCk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGNhY2hlZCBjb25zdGFudHMgdGhhdCBoYXZlbid0IGV4cGlyZWRcbiAgICBpZiAoXG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzICYmXG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl0gJiZcbiAgICAgICghQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZSB8fCAhQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZVtlbnZdIHx8IG5ldyBEYXRlKCkgPCBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlW2Vudl0pXG4gICAgKSB7XG4gICAgICByZXR1cm4gQml0R29BUEkuX2NvbnN0YW50c1tlbnZdO1xuICAgIH1cblxuICAgIC8vIGNsaWVudCBjb25zdGFudHMgY2FsbCBjYW5ub3QgYmUgYXV0aGVudGljYXRlZCB1c2luZyB0aGUgbm9ybWFsIEhNQUMgdmFsaWRhdGlvblxuICAgIC8vIHNjaGVtZSwgc28gd2UgbmVlZCB0byB1c2UgYSByYXcgc3VwZXJhZ2VudCBpbnN0YW5jZSB0byBkbyB0aGlzIHJlcXVlc3QuXG4gICAgLy8gUHJveHkgc2V0dGluZ3MgbXVzdCBzdGlsbCBiZSByZXNwZWN0ZWQgaG93ZXZlclxuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmdldEFnZW50UmVxdWVzdCgnZ2V0JywgdGhpcy51cmwoJy9jbGllbnQvY29uc3RhbnRzJykpO1xuICAgIHJlc3VsdFByb21pc2Uuc2V0KCdCaXRHby1TREstVmVyc2lvbicsIHRoaXMuX3ZlcnNpb24pO1xuICAgIGlmICh0aGlzLl9jdXN0b21Qcm94eUFnZW50KSB7XG4gICAgICByZXN1bHRQcm9taXNlLmFnZW50KHRoaXMuX2N1c3RvbVByb3h5QWdlbnQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRBZGRpdGlvbmFsSGVhZGVyc0NiKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsSGVhZGVycyA9IHRoaXMuZ2V0QWRkaXRpb25hbEhlYWRlcnNDYignZ2V0JywgdGhpcy51cmwoJy9jbGllbnQvY29uc3RhbnRzJykpO1xuICAgICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXN1bHRQcm9taXNlLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzdWx0UHJvbWlzZTtcblxuICAgIGlmICghQml0R29BUEkuX2NvbnN0YW50cykge1xuICAgICAgQml0R29BUEkuX2NvbnN0YW50cyA9IHt9O1xuICAgIH1cbiAgICBCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl0gPSByZXN1bHQuYm9keS5jb25zdGFudHM7XG5cbiAgICBpZiAocmVzdWx0LmJvZHk/LnR0bCAmJiB0eXBlb2YgcmVzdWx0LmJvZHk/LnR0bCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICghQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZSkge1xuICAgICAgICBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlID0ge307XG4gICAgICB9XG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlW2Vudl0gPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSArIChyZXN1bHQuYm9keS50dGwgYXMgbnVtYmVyKSAqIDEwMDApO1xuICAgIH1cblxuICAgIHJldHVybiBCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdXJsIGZvciBjYWxsaW5nIEJpdEdvIHBsYXRmb3JtIEFQSXNcbiAgICogQHBhcmFtIHBhdGhcbiAgICogQHBhcmFtIHZlcnNpb25cbiAgICovXG4gIHVybChwYXRoOiBzdHJpbmcsIHZlcnNpb24gPSAxKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlVXJsID0gdmVyc2lvbiA9PT0gMyA/IHRoaXMuX2Jhc2VBcGlVcmxWMyA6IHZlcnNpb24gPT09IDIgPyB0aGlzLl9iYXNlQXBpVXJsVjIgOiB0aGlzLl9iYXNlQXBpVXJsO1xuICAgIHJldHVybiBiYXNlVXJsICsgcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB1cmwgZm9yIGNhbGxpbmcgQml0R28gbWljcm9zZXJ2aWNlIEFQSXNcbiAgICovXG4gIG1pY3Jvc2VydmljZXNVcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYmFzZVVybCArIHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmVyc2lvbiBvZiB0aGUgQml0R29KUyBwYWNrYWdlXG4gICAqL1xuICB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBjb25uZWN0aXZpdHkgdG8gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBwaW5nKHsgcmVxSWQgfTogUGluZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHJlcUlkKSB7XG4gICAgICB0aGlzLl9yZXFJZCA9IHJlcUlkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL3BpbmcnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgcmVxdWVzdCB0cmFjZXIgdG8gcHJvdmlkZSByZXF1ZXN0IElEcyBkdXJpbmcgbXVsdGktcmVxdWVzdCB3b3JrZmxvd3NcbiAgICovXG4gIHNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyOiBJUmVxdWVzdFRyYWNlcik6IHZvaWQge1xuICAgIGlmIChyZXFUcmFjZXIpIHtcbiAgICAgIHRoaXMuX3JlcUlkID0gcmVxVHJhY2VyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVuY3J5cHQgbG9jYWxseS5cbiAgICovXG4gIGVuY3J5cHQocGFyYW1zOiBFbmNyeXB0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpbnB1dCcsICdwYXNzd29yZCddLCBbJ2FkYXRhJ10pO1xuICAgIGlmICghcGFyYW1zLnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBlbmNyeXB0IHdpdGhvdXQgcGFzc3dvcmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuY3J5cHQocGFyYW1zLnBhc3N3b3JkLCBwYXJhbXMuaW5wdXQsIHsgYWRhdGE6IHBhcmFtcy5hZGF0YSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNyeXB0IGFuIGVuY3J5cHRlZCBzdHJpbmcgbG9jYWxseS5cbiAgICovXG4gIGRlY3J5cHQocGFyYW1zOiBEZWNyeXB0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaW5wdXQnLCAncGFzc3dvcmQnXSwgW10pO1xuICAgIGlmICghcGFyYW1zLnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBkZWNyeXB0IHdpdGhvdXQgcGFzc3dvcmRgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBkZWNyeXB0KHBhcmFtcy5wYXNzd29yZCwgcGFyYW1zLmlucHV0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJjY206IHRhZyBkb2Vzbid0IG1hdGNoXCIpKSB7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgPSAncGFzc3dvcmQgZXJyb3IgLSAnICsgZXJyb3IubWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBkZWNyeXB0IHRoYXQgYXV0by1kZXRlY3RzIHYxIChTSkNMKSBvciB2MiAoQXJnb24yaWQpLlxuICAgKiBNaWdyYXRpb24gcGF0aCBmcm9tIHN5bmMgZGVjcnlwdCgpIC0tIHVzZSB0aGlzIGJlZm9yZSB0aGUgYnJlYWtpbmcgcmVsZWFzZS5cbiAgICovXG4gIGFzeW5jIGRlY3J5cHRBc3luYyhwYXJhbXM6IERlY3J5cHRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpbnB1dCcsICdwYXNzd29yZCddLCBbXSk7XG4gICAgaWYgKCFwYXJhbXMucGFzc3dvcmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGRlY3J5cHQgd2l0aG91dCBwYXNzd29yZGApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGRlY3J5cHRBc3luYyhwYXJhbXMucGFzc3dvcmQsIHBhcmFtcy5pbnB1dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcImNjbTogdGFnIGRvZXNuJ3QgbWF0Y2hcIikgfHxcbiAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yIGFuIG9wZXJhdGlvbi1zcGVjaWZpYyByZWFzb24nKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IHBhc3N3b3JkJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byBkZWNyeXB0IG11bHRpcGxlIHdhbGxldCBrZXlzIHdpdGggdGhlIHByb3ZpZGVkIHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtEZWNyeXB0S2V5c09wdGlvbnN9IHBhcmFtcyAtIFBhcmFtZXRlcnMgb2JqZWN0IGNvbnRhaW5pbmcgd2FsbGV0IGtleSBwYWlycyBhbmQgcGFzc3dvcmRcbiAgICogQHBhcmFtIHtBcnJheTx7d2FsbGV0SWQ6IHN0cmluZywgZW5jcnlwdGVkUHJ2OiBzdHJpbmd9Pn0gcGFyYW1zLndhbGxldElkRW5jcnlwdGVkS2V5UGFpcnMgLSBBcnJheSBvZiB3YWxsZXQgSUQgYW5kIGVuY3J5cHRlZCBwcml2YXRlIGtleSBwYWlyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBhc3N3b3JkIC0gVGhlIHBhc3NwaHJhc2UgdG8gYXR0ZW1wdCBkZWNyeXB0aW9uIHdpdGhcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIEFycmF5IG9mIHdhbGxldCBJRHMgZm9yIHdoaWNoIGRlY3J5cHRpb24gZmFpbGVkXG4gICAqL1xuICBkZWNyeXB0S2V5cyhwYXJhbXM6IERlY3J5cHRLZXlzT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgaWYgKCFwYXJhbXMud2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyOiBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMud2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy53YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGZhaWxlZFdhbGxldElkczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5UGFpciBvZiBwYXJhbXMud2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycykge1xuICAgICAgaWYgKCFrZXlQYWlyLndhbGxldElkIHx8IHR5cGVvZiBrZXlQYWlyLndhbGxldElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VhY2gga2V5IHBhaXIgbXVzdCBoYXZlIGEgc3RyaW5nIHdhbGxldElkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgha2V5UGFpci5lbmNyeXB0ZWRQcnYgfHwgdHlwZW9mIGtleVBhaXIuZW5jcnlwdGVkUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VhY2gga2V5IHBhaXIgbXVzdCBoYXZlIGEgc3RyaW5nIGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRlY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBrZXlQYWlyLmVuY3J5cHRlZFBydixcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3N3b3JkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSWYgbm8gZXJyb3Igd2FzIHRocm93biwgZGVjcnlwdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgZGVjcnlwdGlvbiBmYWlscywgYWRkIHRoZSB3YWxsZXRJZCB0byB0aGUgZmFpbGVkIGxpc3RcbiAgICAgICAgZmFpbGVkV2FsbGV0SWRzLnB1c2goa2V5UGFpci53YWxsZXRJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhaWxlZFdhbGxldElkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhpcyBCaXRHbyBvYmplY3QgdG8gYSBKU09OIG9iamVjdC5cbiAgICpcbiAgICogQ2F1dGlvbjogY29udGFpbnMgc2Vuc2l0aXZlIGRhdGFcbiAgICovXG4gIHRvSlNPTigpOiBCaXRHb0pzb24ge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VyOiB0aGlzLl91c2VyLFxuICAgICAgdG9rZW46IHRoaXMuX3Rva2VuLFxuICAgICAgZXh0ZW5zaW9uS2V5OiB0aGlzLl9leHRlbnNpb25LZXkgPyB0aGlzLl9leHRlbnNpb25LZXkudG9XSUYoKSA6IHVuZGVmaW5lZCxcbiAgICAgIGVjZGhYcHJ2OiB0aGlzLl9lY2RoWHBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB1c2VyXG4gICAqL1xuICB1c2VyKCk6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGEgSlNPTiBzZXJpYWxpemVkIEJpdEdvIG9iamVjdC5cbiAgICpcbiAgICogT3ZlcndyaXRlcyB0aGUgcHJvcGVydGllcyBvbiB0aGUgY3VycmVudCBCaXRHbyBvYmplY3Qgd2l0aFxuICAgKiB0aG9zZSBvZiB0aGUgZGVzZXJpYWx6ZWQgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ganNvblxuICAgKi9cbiAgZnJvbUpTT04oanNvbjogQml0R29Kc29uKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlciA9IGpzb24udXNlcjtcbiAgICB0aGlzLl90b2tlbiA9IGpzb24udG9rZW47XG4gICAgdGhpcy5fZWNkaFhwcnYgPSBqc29uLmVjZGhYcHJ2O1xuICAgIGlmIChqc29uLmV4dGVuc2lvbktleSkge1xuICAgICAgY29uc3QgbmV0d29yayA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0ubmV0d29yaztcbiAgICAgIHRoaXMuX2V4dGVuc2lvbktleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYoXG4gICAgICAgIGpzb24uZXh0ZW5zaW9uS2V5LFxuICAgICAgICB1dHhvbGliLm5ldHdvcmtzW25ldHdvcmtdIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29ya1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgdXNlcm5hbWUsIHBhc3N3b3JkIGFuZCBvdHAgaW50byBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgdXNlcm5hbWUgYW5kIGhhc2hlZCBwYXNzd29yZCwgcmVhZHkgdG9cbiAgICogc2VuZCB0byBiaXRnbyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqL1xuICBhc3luYyBwcmVwcm9jZXNzQXV0aGVudGljYXRpb25QYXJhbXMoe1xuICAgIHVzZXJuYW1lLFxuICAgIHBhc3N3b3JkLFxuICAgIG90cCxcbiAgICBmb3JjZVNNUyxcbiAgICBleHRlbnNpYmxlLFxuICAgIHRydXN0LFxuICAgIGZvclJlc2V0MkZBLFxuICAgIGluaXRpYWxIYXNoLFxuICAgIGZpbmdlcnByaW50SGFzaCxcbiAgfTogQXV0aGVudGljYXRlT3B0aW9ucyk6IFByb21pc2U8UHJvY2Vzc2VkQXV0aGVudGljYXRpb25PcHRpb25zPiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHVzZXJuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgdXNlcm5hbWUnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvd2VyTmFtZSA9IHVzZXJuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwYXNzd29yZCBITUFDIHNvIHdlIGRvbid0IHNlbmQgY2xlYXItdGV4dCBwYXNzd29yZHNcbiAgICBjb25zdCBobWFjUGFzc3dvcmQgPSBhd2FpdCB0aGlzLl9obWFjQXV0aFN0cmF0ZWd5LmNhbGN1bGF0ZUhNQUMobG93ZXJOYW1lLCBwYXNzd29yZCk7XG5cbiAgICBjb25zdCBhdXRoUGFyYW1zOiBQcm9jZXNzZWRBdXRoZW50aWNhdGlvbk9wdGlvbnMgPSB7XG4gICAgICBlbWFpbDogbG93ZXJOYW1lLFxuICAgICAgcGFzc3dvcmQ6IGhtYWNQYXNzd29yZCxcbiAgICAgIGZvcmNlU01TOiAhIWZvcmNlU01TLFxuICAgIH07XG5cbiAgICBpZiAob3RwKSB7XG4gICAgICBhdXRoUGFyYW1zLm90cCA9IG90cDtcbiAgICAgIGlmICh0cnVzdCkge1xuICAgICAgICBhdXRoUGFyYW1zLnRydXN0ID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0ZW5zaWJsZSkge1xuICAgICAgdGhpcy5fZXh0ZW5zaW9uS2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgICAgYXV0aFBhcmFtcy5leHRlbnNpYmxlID0gdHJ1ZTtcbiAgICAgIGF1dGhQYXJhbXMuZXh0ZW5zaW9uQWRkcmVzcyA9IGdldEFkZHJlc3NQMlBLSCh0aGlzLl9leHRlbnNpb25LZXkpO1xuICAgIH1cblxuICAgIGlmIChmb3JSZXNldDJGQSkge1xuICAgICAgYXV0aFBhcmFtcy5mb3JSZXNldDJGQSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGluaXRpYWxIYXNoKSB7XG4gICAgICBhdXRoUGFyYW1zLmluaXRpYWxIYXNoID0gaW5pdGlhbEhhc2g7XG4gICAgfVxuXG4gICAgaWYgKGZpbmdlcnByaW50SGFzaCkge1xuICAgICAgYXV0aFBhcmFtcy5maW5nZXJwcmludEhhc2ggPSBmaW5nZXJwcmludEhhc2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF1dGhQYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIHBhc3NrZXkgcmVzcG9uc2UgaXMgaW4gdGhlIGV4cGVjdGVkIGZvcm1hdFxuICAgKiBTaG91bGQgYmUgYXMgaXMgcmV0dXJuZWQgZnJvbSBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KClcbiAgICovXG4gIHZhbGlkYXRlUGFzc2tleVJlc3BvbnNlKHBhc3NrZXlSZXNwb25zZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGFyc2VkUGFzc2tleVJlc3BvbnNlID0gSlNPTi5wYXJzZShwYXNza2V5UmVzcG9uc2UpO1xuICAgIGlmICghcGFyc2VkUGFzc2tleVJlc3BvbnNlICYmICFwYXJzZWRQYXNza2V5UmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCB3ZWJhdXRoblJlc3BvbnNlJyk7XG4gICAgfVxuICAgIGlmICghXy5pc1N0cmluZyhwYXJzZWRQYXNza2V5UmVzcG9uc2UuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lkIGlzIG1pc3NpbmcnKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcnNlZFBhc3NrZXlSZXNwb25zZS5yZXNwb25zZS5hdXRoZW50aWNhdG9yRGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXV0aGVudGljYXRvckRhdGEgaXMgbWlzc2luZycpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyc2VkUGFzc2tleVJlc3BvbnNlLnJlc3BvbnNlLmNsaWVudERhdGFKU09OKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGllbnREYXRhSlNPTiBpcyBtaXNzaW5nJyk7XG4gICAgfVxuICAgIGlmICghXy5pc1N0cmluZyhwYXJzZWRQYXNza2V5UmVzcG9uc2UucmVzcG9uc2Uuc2lnbmF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduYXR1cmUgaXMgbWlzc2luZycpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyc2VkUGFzc2tleVJlc3BvbnNlLnJlc3BvbnNlLnVzZXJIYW5kbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJIYW5kbGUgaXMgbWlzc2luZycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBtZXRob2QgZm9yIGFjdGl2YXRpbmcgYW4gYWNjZXNzIHRva2VuLlxuICAgKi9cbiAgYXV0aGVudGljYXRlV2l0aEFjY2Vzc1Rva2VuKHsgYWNjZXNzVG9rZW4gfTogQWNjZXNzVG9rZW5PcHRpb25zKTogdm9pZCB7XG4gICAgZGVidWcoJ25vdyBhdXRoZW50aWNhdGluZyB3aXRoIGFjY2VzcyB0b2tlbiAlcycsIGFjY2Vzc1Rva2VuLnN1YnN0cmluZygwLCA4KSk7XG4gICAgdGhpcy5fdG9rZW4gPSBhY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEVDREgga2V5Y2hhaW4gZm9yIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naW5QYXNzd29yZCAtIFRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IEVDREgga2V5Y2hhaW4gZGF0YS5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFuIGlzc3VlIGNyZWF0aW5nIHRoZSBrZXljaGFpbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVVc2VyRWNkaEtleWNoYWluKGxvZ2luUGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qga2V5RGF0YSA9IHRoaXMua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgY29uc3QgaGROb2RlID0gYml0Y29pbi5IRE5vZGUuZnJvbUJhc2U1OChrZXlEYXRhLnhwcnYpO1xuXG4gICAgLyoqXG4gICAgICogQWRkIHRoZSBuZXcgRUNESCBrZXljaGFpbiB0byB0aGUgdXNlcidzIGFjY291bnQuXG4gICAgICogQHR5cGUge1Byb21pc2U8YW55Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgRUNESCBrZXljaGFpbi5cbiAgICAgKi9cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5rZXljaGFpbnMoKS5hZGQoe1xuICAgICAgc291cmNlOiAnZWNkaCcsXG4gICAgICB4cHViOiBoZE5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgZW5jcnlwdGVkWHBydjogdGhpcy5lbmNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IGxvZ2luUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiBoZE5vZGUudG9CYXNlNTgoKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHVzZXIncyBzZXR0aW5ncyB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gdXBkYXRlIHRoZSB1c2VyJ3Mgc2V0dGluZ3Mgd2l0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICogQHRocm93cyB7RXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFuIGlzc3VlIHVwZGF0aW5nIHRoZSB1c2VyJ3Mgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVVzZXJTZXR0aW5ncyhwYXJhbXM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucHV0KHRoaXMudXJsKCcvdXNlci9zZXR0aW5ncycsIDIpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGF0IHRoZSB1c2VyJ3MgRUNESCBrZXljaGFpbiBpcyBjcmVhdGVkIGZvciB3YWxsZXQgc2hhcmluZyBhbmQgVFNTIHdhbGxldHMuXG4gICAqIElmIHRoZSBrZXljaGFpbiBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgdXNlcidzIHNldHRpbmdzIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2luUGFzc3dvcmQgLSBUaGUgdXNlcidzIGxvZ2luIHBhc3N3b3JkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHVzZXIncyBzZXR0aW5ncyBlbnN1cmluZyB3ZSBoYXZlIHRoZSBlY2RoS2V5Y2hhaW4gaW4gdGhlcmUuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGVyZSBpcyBhbiBpc3N1ZSBjcmVhdGluZyB0aGUga2V5Y2hhaW4gb3IgdXBkYXRpbmcgdGhlIHVzZXIncyBzZXR0aW5ncy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVXNlckVjZGhLZXljaGFpbklzQ3JlYXRlZChsb2dpblBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdXNlcidzIGN1cnJlbnQgc2V0dGluZ3MuXG4gICAgICovXG4gICAgY29uc3QgdXNlclNldHRpbmdzID0gYXdhaXQgdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL3NldHRpbmdzJykpLnJlc3VsdCgpO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSB1c2VyJ3MgRUNESCBrZXljaGFpbiBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGEgbmV3IGtleWNoYWluIGFuZCB1cGRhdGUgdGhlIHVzZXIncyBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBpZiAoIXVzZXJTZXR0aW5ncy5zZXR0aW5ncy5lY2RoS2V5Y2hhaW4pIHtcbiAgICAgIGNvbnN0IG5ld0tleWNoYWluID0gYXdhaXQgdGhpcy5jcmVhdGVVc2VyRWNkaEtleWNoYWluKGxvZ2luUGFzc3dvcmQpO1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVVc2VyU2V0dGluZ3Moe1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIGVjZGhLZXljaGFpbjogbmV3S2V5Y2hhaW4ueHB1YixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGUgdGhlIHVzZXIncyBzZXR0aW5ncyBvYmplY3Qgd2l0aCB0aGUgbmV3IEVDREgga2V5Y2hhaW4uXG4gICAgICAgKi9cbiAgICAgIHVzZXJTZXR0aW5ncy5zZXR0aW5ncy5lY2RoS2V5Y2hhaW4gPSBuZXdLZXljaGFpbi54cHViO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHVzZXIncyBFQ0RIIGtleWNoYWluIHNldHRpbmdzLlxuICAgICAqL1xuICAgIHJldHVybiB1c2VyU2V0dGluZ3Muc2V0dGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gdG8gdGhlIGJpdGdvIHBsYXRmb3JtLlxuICAgKi9cbiAgYXN5bmMgYXV0aGVudGljYXRlKHBhcmFtczogQXV0aGVudGljYXRlT3B0aW9ucyk6IFByb21pc2U8TG9naW5SZXNwb25zZSB8IGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIG9iamVjdCBwYXJhbXMnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wYXNzd29yZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgcGFzc3dvcmQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9yY2VWMUF1dGggPSAhIXBhcmFtcy5mb3JjZVYxQXV0aDtcbiAgICAgIGNvbnN0IGF1dGhQYXJhbXMgPSBhd2FpdCB0aGlzLnByZXByb2Nlc3NBdXRoZW50aWNhdGlvblBhcmFtcyhwYXJhbXMpO1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSBwYXJhbXMucGFzc3dvcmQ7XG5cbiAgICAgIGlmICh0aGlzLl90b2tlbikge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdhbHJlYWR5IGxvZ2dlZCBpbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL2F1dGgvdjEvc2Vzc2lvbicpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucG9zdChhdXRoVXJsKTtcblxuICAgICAgaWYgKGZvcmNlVjFBdXRoKSB7XG4gICAgICAgIHJlcXVlc3QuZm9yY2VWMUF1dGggPSB0cnVlO1xuICAgICAgICAvLyB0ZWxsIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgY2xpZW50IHdhcyBmb3JjZWQgdG8gZG93bmdyYWRlIHRoZSBhdXRoZW50aWNhdGlvbiBwcm90b2NvbFxuICAgICAgICBhdXRoUGFyYW1zLmZvcmNlVjFBdXRoID0gdHJ1ZTtcbiAgICAgICAgZGVidWcoJ2ZvcmNpbmcgdjEgYXV0aCBmb3IgY2FsbCB0byBhdXRoZW50aWNhdGUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5zZW5kKGF1dGhQYXJhbXMpO1xuICAgICAgLy8gZXh0cmFjdCBib2R5IGFuZCB1c2VyIGluZm9ybWF0aW9uXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UuYm9keTtcbiAgICAgIHRoaXMuX3VzZXIgPSBib2R5LnVzZXI7XG5cbiAgICAgIGlmIChib2R5LmFjY2Vzc190b2tlbikge1xuICAgICAgICB0aGlzLl90b2tlbiA9IGJvZHkuYWNjZXNzX3Rva2VuO1xuICAgICAgICAvLyBpZiB0aGUgZG93bmdyYWRlIHdhcyBmb3JjZWQsIGFkZGluZyBhIHdhcm5pbmcgbWVzc2FnZSBtaWdodCBiZSBwcnVkZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgYW4gZW5jcnlwdGVkIEVDREggeHBydlxuICAgICAgICAvLyBpZiBub3QgcHJlc2VudCwgbGVnYWN5IGFjY291bnRcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkWHBydiA9IGJvZHkuZW5jcnlwdGVkRUNESFhwcnY7XG4gICAgICAgIGlmICghZW5jcnlwdGVkWHBydikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignS2V5Y2hhaW4gbmVlZHMgZW5jcnlwdGVkWHBydiBwcm9wZXJ0eScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VEZXRhaWxzID0gdGhpcy5oYW5kbGVUb2tlbklzc3VhbmNlKHJlc3BvbnNlLmJvZHksIHBhc3N3b3JkKTtcbiAgICAgICAgdGhpcy5fdG9rZW4gPSByZXNwb25zZURldGFpbHMudG9rZW47XG4gICAgICAgIHRoaXMuX2VjZGhYcHJ2ID0gcmVzcG9uc2VEZXRhaWxzLmVjZGhYcHJ2O1xuXG4gICAgICAgIC8vIHZlcmlmeSB0aGUgcmVzcG9uc2UncyBhdXRoZW50aWNpdHlcbiAgICAgICAgYXdhaXQgdmVyaWZ5UmVzcG9uc2VBc3luYyh0aGlzLCByZXNwb25zZURldGFpbHMudG9rZW4sICdwb3N0JywgcmVxdWVzdCwgcmVzcG9uc2UsIHRoaXMuX2F1dGhWZXJzaW9uKTtcblxuICAgICAgICAvLyBhZGQgdGhlIHJlbWFpbmluZyBjb21wb25lbnQgZm9yIGVhc2llciBhY2Nlc3NcbiAgICAgICAgcmVzcG9uc2UuYm9keS5hY2Nlc3NfdG9rZW4gPSB0aGlzLl90b2tlbjtcbiAgICAgIH1cblxuICAgICAgLy8gU3luYyB0aGUgdG9rZW4gaW50byB0aGUgc3RyYXRlZ3kgc28gdGhhdCBzdHJhdGVnaWVzIHdoaWNoIG1hbmFnZSB0aGVpclxuICAgICAgLy8gb3duIGtleSBtYXRlcmlhbCAoZS5nLiBXZWJDcnlwdG9IbWFjU3RyYXRlZ3kpIGNhbiBzaWduIHRoZSBzdWJzZXF1ZW50XG4gICAgICAvLyBlbnN1cmVVc2VyRWNkaEtleWNoYWluSXNDcmVhdGVkIHJlcXVlc3RzLiAgTXVzdCBiZSBhd2FpdGVkIOKAlCB0aGUgY2FsbFxuICAgICAgLy8gbWF5IHBlcmZvcm0gYXN5bmMga2V5IGRlcml2YXRpb24gKGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KS5cbiAgICAgIGlmICh0aGlzLl90b2tlbikge1xuICAgICAgICBhd2FpdCB0aGlzLl9obWFjQXV0aFN0cmF0ZWd5LnNldFRva2VuPy4odGhpcy5fdG9rZW4pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1c2VyU2V0dGluZ3MgPSBwYXJhbXMuZW5zdXJlRWNkaEtleWNoYWluID8gYXdhaXQgdGhpcy5lbnN1cmVVc2VyRWNkaEtleWNoYWluSXNDcmVhdGVkKHBhc3N3b3JkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh1c2VyU2V0dGluZ3M/LmVjZGhLZXljaGFpbikge1xuICAgICAgICByZXNwb25zZS5ib2R5LnVzZXIuZWNkaEtleWNoYWluID0gdXNlclNldHRpbmdzLmVjZGhLZXljaGFpbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhhbmRsZVJlc3BvbnNlUmVzdWx0PExvZ2luUmVzcG9uc2U+KCkocmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhhbmRsZVJlc3BvbnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ2luIHRvIHRoZSBiaXRnbyBwbGF0Zm9ybSB3aXRoIHBhc3NrZXkuXG4gICAqL1xuICBhc3luYyBhdXRoZW50aWNhdGVXaXRoUGFzc2tleShcbiAgICBwYXNza2V5OiBzdHJpbmcsXG4gICAgaW5pdGlhbEhhc2g/OiBzdHJpbmcsXG4gICAgZmluZ2VycHJpbnRIYXNoPzogc3RyaW5nXG4gICk6IFByb21pc2U8TG9naW5SZXNwb25zZSB8IGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5fdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignYWxyZWFkeSBsb2dnZWQgaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aFVybCA9IHRoaXMubWljcm9zZXJ2aWNlc1VybCgnL2FwaS9hdXRoL3YxL3Nlc3Npb24nKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBvc3QoYXV0aFVybCk7XG5cbiAgICAgIHRoaXMudmFsaWRhdGVQYXNza2V5UmVzcG9uc2UocGFzc2tleSk7XG4gICAgICBjb25zdCB1c2VySWQgPSBKU09OLnBhcnNlKHBhc3NrZXkpLnJlc3BvbnNlLnVzZXJIYW5kbGU7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdC5zZW5kKHtcbiAgICAgICAgcGFzc2tleTogcGFzc2tleSxcbiAgICAgICAgdXNlcklkOiB1c2VySWQsXG4gICAgICAgIGluaXRpYWxIYXNoLFxuICAgICAgICBmaW5nZXJwcmludEhhc2gsXG4gICAgICB9KTtcbiAgICAgIC8vIGV4dHJhY3QgYm9keSBhbmQgdXNlciBpbmZvcm1hdGlvblxuICAgICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmJvZHk7XG4gICAgICB0aGlzLl91c2VyID0gYm9keS51c2VyO1xuXG4gICAgICBpZiAoYm9keS5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhpcy5fdG9rZW4gPSBib2R5LmFjY2Vzc190b2tlbjtcbiAgICAgICAgcmVzcG9uc2UuYm9keS5hY2Nlc3NfdG9rZW4gPSBib2R5LmFjY2Vzc190b2tlbjtcbiAgICAgICAgYXdhaXQgdGhpcy5faG1hY0F1dGhTdHJhdGVneS5zZXRUb2tlbj8uKGJvZHkuYWNjZXNzX3Rva2VuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGxvZ2luLiBQbGVhc2UgY29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbScpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8TG9naW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlc3BvbnNlQm9keSBSZXNwb25zZSBib2R5IG9iamVjdFxuICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgZm9yIHRoZSBzeW1tZXRyaWMgZGVjcnlwdGlvblxuICAgKi9cbiAgaGFuZGxlVG9rZW5Jc3N1YW5jZShyZXNwb25zZUJvZHk6IFRva2VuSXNzdWFuY2VSZXNwb25zZSwgcGFzc3dvcmQ/OiBzdHJpbmcpOiBUb2tlbklzc3VhbmNlIHtcbiAgICAvLyBtYWtlIHN1cmUgdGhlIHJlc3BvbnNlIGJvZHkgY29udGFpbnMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHJlc3BvbnNlQm9keSwgWydkZXJpdmF0aW9uUGF0aCddLCBbJ2VuY3J5cHRlZEVDREhYcHJ2J10pO1xuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLl9lbnY7XG4gICAgY29uc3QgZW52aXJvbm1lbnRDb25maWcgPSBjb21tb24uRW52aXJvbm1lbnRzW2Vudmlyb25tZW50XTtcbiAgICBjb25zdCBzZXJ2ZXJYcHViID0gZW52aXJvbm1lbnRDb25maWcuc2VydmVyWHB1YjtcbiAgICBsZXQgZWNkaFhwcnYgPSB0aGlzLl9lY2RoWHBydjtcbiAgICBpZiAoIWVjZGhYcHJ2KSB7XG4gICAgICBpZiAoIXBhc3N3b3JkIHx8ICFyZXNwb25zZUJvZHkuZW5jcnlwdGVkRUNESFhwcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlY2RoWHBydiBwcm9wZXJ0eSBtdXN0IGJlIHNldCBvciBwYXNzd29yZCBhbmQgZW5jcnlwdGVkIGVuY3J5cHRlZEVDREhYcHJ2IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGVjZGhYcHJ2ID0gdGhpcy5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcmVzcG9uc2VCb2R5LmVuY3J5cHRlZEVDREhYcHJ2LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGUuZXJyb3JDb2RlID0gJ2VjZGhfeHBydl9kZWNyeXB0aW9uX2ZhaWx1cmUnO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWRFQ0RIWHBydi4nKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgSEROb2RlIG9iamVjdHMgZm9yIGNsaWVudCdzIHhwcnYgYW5kIHNlcnZlcidzIHhwdWJcbiAgICBjb25zdCBjbGllbnRIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGVjZGhYcHJ2KTtcbiAgICBjb25zdCBzZXJ2ZXJIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KHNlcnZlclhwdWIpO1xuXG4gICAgLy8gQklQMzIgZGVyaXZhdGlvbiBwYXRoIGlzIGFwcGxpZWQgdG8gYm90aCBjbGllbnQgYW5kIHNlcnZlciBtYXN0ZXIga2V5c1xuICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gc2FuaXRpemVMZWdhY3lQYXRoKHJlc3BvbnNlQm9keS5kZXJpdmF0aW9uUGF0aCk7XG4gICAgY29uc3QgY2xpZW50RGVyaXZlZE5vZGUgPSBjbGllbnRIRE5vZGUuZGVyaXZlUGF0aChkZXJpdmF0aW9uUGF0aCk7XG4gICAgY29uc3Qgc2VydmVyRGVyaXZlZE5vZGUgPSBzZXJ2ZXJIRE5vZGUuZGVyaXZlUGF0aChkZXJpdmF0aW9uUGF0aCk7XG5cbiAgICBjb25zdCBwdWJsaWNLZXkgPSBzZXJ2ZXJEZXJpdmVkTm9kZS5wdWJsaWNLZXk7XG4gICAgY29uc3Qgc2VjcmV0S2V5ID0gY2xpZW50RGVyaXZlZE5vZGUucHJpdmF0ZUtleTtcbiAgICBpZiAoIXNlY3JldEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjbGllbnQgcHJpdmF0ZSBLZXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0ID0gQnVmZmVyLmZyb20oXG4gICAgICAvLyBGSVhNRShCRy0zNDM4Nik6IHdlIHNob3VsZCB1c2UgYHNlY3AyNTZrMS5lY2RoKClgIGluIHRoZSBmdXR1cmVcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgc2VlIGRpc2N1c3Npb24gaGVyZSBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi1jb3JlL3NlY3AyNTZrMS9pc3N1ZXMvMzUyXG4gICAgICBzZWNwMjU2azEucHVibGljS2V5VHdlYWtNdWwocHVibGljS2V5LCBzZWNyZXRLZXkpXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAvLyBkZWNyeXB0IHRva2VuIHdpdGggc3ltbWV0cmljIEVDREgga2V5XG4gICAgbGV0IHJlc3BvbnNlOiBUb2tlbklzc3VhbmNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgdG9rZW46IHRoaXMuZGVjcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHJlc3BvbnNlQm9keS5lbmNyeXB0ZWRUb2tlbixcbiAgICAgICAgICBwYXNzd29yZDogc2VjcmV0LFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZS5lcnJvckNvZGUgPSAndG9rZW5fZGVjcnlwdGlvbl9mYWlsdXJlJztcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWNyeXB0IHRva2VuLicpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9lY2RoWHBydikge1xuICAgICAgcmVzcG9uc2UuZWNkaFhwcnYgPSBlY2RoWHBydjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqL1xuICBhc3luYyB2ZXJpZnlQYXNzd29yZChwYXJhbXM6IFZlcmlmeVBhc3N3b3JkT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdXNlciB8fCAhdGhpcy5fdXNlci51c2VybmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjdXJyZW50IHVzZXInKTtcbiAgICB9XG4gICAgY29uc3QgaG1hY1Bhc3N3b3JkID0gYXdhaXQgdGhpcy5faG1hY0F1dGhTdHJhdGVneS5jYWxjdWxhdGVITUFDKHRoaXMuX3VzZXIudXNlcm5hbWUsIHBhcmFtcy5wYXNzd29yZCk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci92ZXJpZnlwYXNzd29yZCcpKS5zZW5kKHsgcGFzc3dvcmQ6IGhtYWNQYXNzd29yZCB9KS5yZXN1bHQoJ3ZhbGlkJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgb3V0IGFsbCBzdGF0ZSBmcm9tIHRoaXMgQml0R28gb2JqZWN0LCBlZmZlY3RpdmVseSBsb2dnaW5nIG91dCB0aGUgY3VycmVudCB1c2VyLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciBmaWVsZHMgd2hpY2ggc2hvdWxkIGJlIGNsZWFyZWQ/XG4gICAgdGhpcy5fdXNlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl90b2tlbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZWNkaFhwcnYgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBhc3luYyBjbGVhckFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICBhd2FpdCB0aGlzLl9obWFjQXV0aFN0cmF0ZWd5LmNsZWFyVG9rZW4/LigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSByZWZyZXNoIHRva2VuIHRvIGdldCBuZXcgYWNjZXNzIHRva2VuLlxuICAgKiBJZiB0aGUgcmVmcmVzaCB0b2tlbiBpcyBudWxsL2RlZmluZWQsIHRoZW4gd2UgdXNlIHRoZSBzdG9yZWQgdG9rZW4gZnJvbSBhdXRoXG4gICAqL1xuICBhc3luYyByZWZyZXNoVG9rZW4ocGFyYW1zOiB7IHJlZnJlc2hUb2tlbj86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3JlZnJlc2hUb2tlbiddKTtcblxuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHBhcmFtcy5yZWZyZXNoVG9rZW4gfHwgdGhpcy5fcmVmcmVzaFRva2VuO1xuXG4gICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIHJlZnJlc2ggdG9rZW4gb3IgaGF2ZSBhdXRoZW50aWNhdGVkIHdpdGggT2F1dGggYmVmb3JlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9jbGllbnRJZCB8fCAhdGhpcy5fY2xpZW50U2VjcmV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgY2xpZW50IGlkIGFuZCBzZWNyZXQgc2V0IGZpcnN0IHRvIHVzZSB0aGlzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMucG9zdCh0aGlzLl9iYXNlVXJsICsgJy9vYXV0aC90b2tlbicpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuX2NsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9jbGllbnRTZWNyZXQsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICAgIHRoaXMuX3Rva2VuID0gYm9keS5hY2Nlc3NfdG9rZW47XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuID0gYm9keS5yZWZyZXNoX3Rva2VuO1xuICAgIGF3YWl0IHRoaXMuX2htYWNBdXRoU3RyYXRlZ3k/LnNldFRva2VuPy4oYm9keS5hY2Nlc3NfdG9rZW4pO1xuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIGxpc3RBY2Nlc3NUb2tlbnNcbiAgICogR2V0IGluZm9ybWF0aW9uIG9uIGFsbCBvZiB0aGUgQml0R28gYWNjZXNzIHRva2VucyBvbiB0aGUgdXNlclxuICAgKiBAcmV0dXJuIHtcbiAgICogIGlkOiA8aWQgb2YgdGhlIHRva2VuPlxuICAgKiAgbGFiZWw6IDx0aGUgdXNlci1wcm92aWRlZCBsYWJlbCBmb3IgdGhpcyB0b2tlbj5cbiAgICogIHVzZXI6IDxpZCBvZiB0aGUgdXNlciBvbiB0aGUgdG9rZW4+XG4gICAqICBlbnRlcnByaXNlIDxpZCBvZiB0aGUgZW50ZXJwcmlzZSB0aGlzIHRva2VuIGlzIHZhbGlkIGZvcj5cbiAgICogIGNsaWVudDogPHRoZSBhdXRoIGNsaWVudCB0aGF0IHRoaXMgdG9rZW4gYmVsb25ncyB0bz5cbiAgICogIHNjb3BlOiA8bGlzdCBvZiBhbGxvd2VkIE9BdXRoIHNjb3BlIHZhbHVlcz5cbiAgICogIGNyZWF0ZWQ6IDxkYXRlIHRoZSB0b2tlbiB3YXMgY3JlYXRlZD5cbiAgICogIGV4cGlyZXM6IDxkYXRlIHRoZSB0b2tlbiB3aWxsIGV4cGlyZT5cbiAgICogIG9yaWdpbjogPHRoZSBvcmlnaW4gZm9yIHdoaWNoIHRoaXMgdG9rZW4gaXMgdmFsaWQ+XG4gICAqICBpc0V4dGVuc2libGU6IDxmbGFnIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIGNhbiBiZSBleHRlbmRlZD5cbiAgICogIGV4dGVuc2lvbkFkZHJlc3M6IDxhZGRyZXNzIHdob3NlIHByaXZhdGUga2V5J3Mgc2lnbmF0dXJlIGlzIG5lY2Vzc2FyeSBmb3IgZXh0ZW5zaW9ucz5cbiAgICogIHVubG9jazogPGluZm8gZm9yIGFjdGlvbnMgdGhhdCByZXF1aXJlIGFuIHVubG9jayBiZWZvcmUgZmlyaW5nPlxuICAgKiB9XG4gICAqL1xuICBhc3luYyBsaXN0QWNjZXNzVG9rZW5zKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9hY2Nlc3N0b2tlbicpKS5zZW5kKCkucmVzdWx0KCdhY2Nlc3NUb2tlbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGRBY2Nlc3NUb2tlblxuICAgKiBBZGQgYSBCaXRHbyBBUEkgQWNjZXNzIFRva2VuIHRvIHRoZSBjdXJyZW50IHVzZXIgYWNjb3VudFxuICAgKiBAcGFyYW0gcGFyYW1zIHtcbiAgICogICAgb3RwOiAocmVxdWlyZWQpIDx2YWxpZCBvdHAgY29kZT5cbiAgICogICAgbGFiZWw6IChyZXF1aXJlZCkgPGxhYmVsIGZvciB0aGUgdG9rZW4+XG4gICAqICAgIGR1cmF0aW9uOiA8bGVuZ3RoIG9mIHRpbWUgaW4gc2Vjb25kcyB0aGUgdG9rZW4gd2lsbCBiZSB2YWxpZCBmb3I+XG4gICAqICAgIGlwUmVzdHJpY3Q6IDxhcnJheSBvZiBJUCBhZGRyZXNzIHN0cmluZ3MgdG8gd2hpdGVsaXN0PlxuICAgKiAgICB0eFZhbHVlTGltaXQ6IDxudW1iZXIgb2Ygb3V0Z29pbmcgc2F0b3NoaXMgYWxsb3dlZCBvbiB0aGlzIHRva2VuPlxuICAgKiAgICBzY29wZTogKHJlcXVpcmVkKSA8YXV0aG9yaXphdGlvbiBzY29wZSBvZiB0aGUgcmVxdWVzdGVkIHRva2VuPlxuICAgKiB9XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICBpZDogPGlkIG9mIHRoZSB0b2tlbj5cbiAgICogICAgdG9rZW46IDxhY2Nlc3MgdG9rZW4gaGV4IHN0cmluZyB0byBiZSB1c2VkIGZvciBCaXRHbyBBUEkgcmVxdWVzdCB2ZXJpZmljYXRpb24+XG4gICAqICAgIGxhYmVsOiA8dXNlci1wcm92aWRlZCBsYWJlbCBmb3IgdGhpcyB0b2tlbj5cbiAgICogICAgdXNlcjogPGlkIG9mIHRoZSB1c2VyIG9uIHRoZSB0b2tlbj5cbiAgICogICAgZW50ZXJwcmlzZSA8aWQgb2YgdGhlIGVudGVycHJpc2UgdGhpcyB0b2tlbiBpcyB2YWxpZCBmb3I+XG4gICAqICAgIGNsaWVudDogPHRoZSBhdXRoIGNsaWVudCB0aGF0IHRoaXMgdG9rZW4gYmVsb25ncyB0bz5cbiAgICogICAgc2NvcGU6IDxsaXN0IG9mIGFsbG93ZWQgT0F1dGggc2NvcGUgdmFsdWVzPlxuICAgKiAgICBjcmVhdGVkOiA8ZGF0ZSB0aGUgdG9rZW4gd2FzIGNyZWF0ZWQ+XG4gICAqICAgIGV4cGlyZXM6IDxkYXRlIHRoZSB0b2tlbiB3aWxsIGV4cGlyZT5cbiAgICogICAgb3JpZ2luOiA8dGhlIG9yaWdpbiBmb3Igd2hpY2ggdGhpcyB0b2tlbiBpcyB2YWxpZD5cbiAgICogICAgaXNFeHRlbnNpYmxlOiA8ZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB0b2tlbiBjYW4gYmUgZXh0ZW5kZWQ+XG4gICAqICAgIGV4dGVuc2lvbkFkZHJlc3M6IDxhZGRyZXNzIHdob3NlIHByaXZhdGUga2V5J3Mgc2lnbmF0dXJlIGlzIG5lY2Vzc2FyeSBmb3IgZXh0ZW5zaW9ucz5cbiAgICogICAgdW5sb2NrOiA8aW5mbyBmb3IgYWN0aW9ucyB0aGF0IHJlcXVpcmUgYW4gdW5sb2NrIGJlZm9yZSBmaXJpbmc+XG4gICAqIH1cbiAgICovXG4gIGFzeW5jIGFkZEFjY2Vzc1Rva2VuKHBhcmFtczogQWRkQWNjZXNzVG9rZW5PcHRpb25zKTogUHJvbWlzZTxBZGRBY2Nlc3NUb2tlblJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMubGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGxhYmVsJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIG5vbi1zdHJpbmcgcGFyYW1zXG4gICAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuZHVyYXRpb24pIHx8IHBhcmFtcy5kdXJhdGlvbiA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2R1cmF0aW9uIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuaXBSZXN0cmljdCkge1xuICAgICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuaXBSZXN0cmljdCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lwUmVzdHJpY3QgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIF8uZm9yRWFjaChwYXJhbXMuaXBSZXN0cmljdCwgKGlwQWRkcikgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhpcEFkZHIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lwUmVzdHJpY3QgbXVzdCBiZSBhbiBhcnJheSBvZiBJUCBhZGRyZXNzIHN0cmluZ3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eFZhbHVlTGltaXQpIHtcbiAgICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy50eFZhbHVlTGltaXQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFZhbHVlTGltaXQgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMudHhWYWx1ZUxpbWl0IDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndHhWYWx1ZUxpbWl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuc2NvcGUgJiYgcGFyYW1zLnNjb3BlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLnNjb3BlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2NvcGUgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3BlY2lmeSBzY29wZSBmb3IgdG9rZW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aFVybCA9IHRoaXMubWljcm9zZXJ2aWNlc1VybCgnL2FwaS9hdXRoL3YxL2FjY2Vzc3Rva2VuJyk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wb3N0KGF1dGhVcmwpO1xuXG4gICAgICBpZiAoIXRoaXMuX2VjZGhYcHJ2KSB7XG4gICAgICAgIC8vIHdpdGhvdXQgYSBwcml2YXRlIGtleSwgdGhlIHVzZXIgY2Fubm90IGRlY3J5cHQgdGhlIG5ldyBhY2Nlc3MgdG9rZW4gdGhlIHNlcnZlciB3aWxsIHNlbmRcbiAgICAgICAgcmVxdWVzdC5mb3JjZVYxQXV0aCA9IHRydWU7XG4gICAgICAgIGRlYnVnKCdmb3JjaW5nIHYxIGF1dGggZm9yIGFkZGluZyBhY2Nlc3MgdG9rZW4gdXNpbmcgdG9rZW4gJXMnLCB0aGlzLl90b2tlbj8uc3Vic3RyKDAsIDgpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LnNlbmQocGFyYW1zKTtcbiAgICAgIGlmIChyZXF1ZXN0LmZvcmNlVjFBdXRoKSB7XG4gICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmJvZHkud2FybmluZyA9ICdBIHByb3RvY29sIGRvd25ncmFkZSBoYXMgb2NjdXJyZWQgYmVjYXVzZSB0aGlzIGlzIGEgbGVnYWN5IGFjY291bnQuJztcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3BvbnNlUmVzdWx0PEFkZEFjY2Vzc1Rva2VuUmVzcG9uc2U+KCkocmVzcG9uc2UpO1xuICAgICAgfVxuXG4gICAgICAvLyB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgYmVmb3JlIHByb2NlZWRpbmcgYW55IGZ1cnRoZXJcbiAgICAgIGF3YWl0IHZlcmlmeVJlc3BvbnNlQXN5bmModGhpcywgdGhpcy5fdG9rZW4sICdwb3N0JywgcmVxdWVzdCwgcmVzcG9uc2UsIHRoaXMuX2F1dGhWZXJzaW9uKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2VEZXRhaWxzID0gdGhpcy5oYW5kbGVUb2tlbklzc3VhbmNlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgcmVzcG9uc2UuYm9keS50b2tlbiA9IHJlc3BvbnNlRGV0YWlscy50b2tlbjtcblxuICAgICAgcmV0dXJuIGhhbmRsZVJlc3BvbnNlUmVzdWx0PEFkZEFjY2Vzc1Rva2VuUmVzcG9uc2U+KCkocmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhhbmRsZVJlc3BvbnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV4cGlyZSB0aW1lIG9mIGFuIGFjY2VzcyB0b2tlbiBtYXRjaGluZyBlaXRoZXIgdGhlIGlkIG9yIGxhYmVsIHRvIHRoZSBjdXJyZW50IGRhdGUsIGVmZmVjdGl2ZWx5IGRlbGV0aW5nIGl0XG4gICAqXG4gICAqIFBhcmFtczpcbiAgICogaWQ6IDxpZCBvZiB0aGUgYWNjZXNzIHRva2VuIHRvIGJlIGRlbGV0ZWQ+XG4gICAqIGxhYmVsOiA8bGFiZWwgb2YgdGhlIGFjY2VzcyB0b2tlbiB0byBiZSBkZWxldGVkPlxuICAgKlxuICAgKiBSZXR1cm5zOlxuICAgKiBpZDogPGlkIG9mIHRoZSB0b2tlbj5cbiAgICogbGFiZWw6IDx1c2VyLXByb3ZpZGVkIGxhYmVsIGZvciB0aGlzIHRva2VuPlxuICAgKiB1c2VyOiA8aWQgb2YgdGhlIHVzZXIgb24gdGhlIHRva2VuPlxuICAgKiBlbnRlcnByaXNlIDxpZCBvZiB0aGUgZW50ZXJwcmlzZSB0aGlzIHRva2VuIGlzIHZhbGlkIGZvcj5cbiAgICogY2xpZW50OiA8dGhlIGF1dGggY2xpZW50IHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvPlxuICAgKiBzY29wZTogPGxpc3Qgb2YgYWxsb3dlZCBPQXV0aCBzY29wZSB2YWx1ZXM+XG4gICAqIGNyZWF0ZWQ6IDxkYXRlIHRoZSB0b2tlbiB3YXMgY3JlYXRlZD5cbiAgICogZXhwaXJlczogPGRhdGUgdGhlIHRva2VuIHdpbGwgZXhwaXJlPlxuICAgKiBvcmlnaW46IDx0aGUgb3JpZ2luIGZvciB3aGljaCB0aGlzIHRva2VuIGlzIHZhbGlkPlxuICAgKiBpc0V4dGVuc2libGU6IDxmbGFnIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIGNhbiBiZSBleHRlbmRlZD5cbiAgICogZXh0ZW5zaW9uQWRkcmVzczogPGFkZHJlc3Mgd2hvc2UgcHJpdmF0ZSBrZXkncyBzaWduYXR1cmUgaXMgbmUqY2Vzc2FyeSBmb3IgZXh0ZW5zaW9ucz5cbiAgICogdW5sb2NrOiA8aW5mbyBmb3IgYWN0aW9ucyB0aGF0IHJlcXVpcmUgYW4gdW5sb2NrIGJlZm9yZSBmaXJpbmc+XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlbW92ZUFjY2Vzc1Rva2VuKHsgaWQsIGxhYmVsIH06IFJlbW92ZUFjY2Vzc1Rva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCghaWQgJiYgIWxhYmVsKSB8fCAoaWQgJiYgbGFiZWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBleGFjdGx5IG9uZSBvZiBpZCBvciBsYWJlbCcpO1xuICAgIH1cbiAgICBpZiAoaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlbCh0aGlzLnVybChgL3VzZXIvYWNjZXNzdG9rZW4vJHtpZH1gKSlcbiAgICAgICAgLnNlbmQoKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gYXdhaXQgdGhpcy5saXN0QWNjZXNzVG9rZW5zKCk7XG5cbiAgICBpZiAoIXRva2Vucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b2tlbiB3aXRoIHRoaXMgbGFiZWwgZG9lcyBub3QgZXhpc3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaGluZ1Rva2VucyA9IF8uZmlsdGVyKHRva2VucywgeyBsYWJlbCB9KTtcbiAgICBpZiAobWF0Y2hpbmdUb2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbWJpZ3VvdXMgY2FsbDogbXVsdGlwbGUgdG9rZW5zIG1hdGNoaW5nIHRoaXMgbGFiZWwnKTtcbiAgICB9XG4gICAgaWYgKG1hdGNoaW5nVG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b2tlbiB3aXRoIHRoaXMgbGFiZWwgZG9lcyBub3QgZXhpc3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWwodGhpcy51cmwoYC91c2VyL2FjY2Vzc3Rva2VuLyR7bWF0Y2hpbmdUb2tlbnNbMF0uaWR9YCkpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSByYW5kb20gcGFzc3dvcmRcbiAgICogQHBhcmFtICAge051bWJlcn0gbnVtV29yZHMgICAgIE51bWJlciBvZiAzMi1iaXQgd29yZHNcbiAgICogQHJldHVybnMge1N0cmluZ30gICAgICAgICAgYmFzZTU4IHJhbmRvbSBwYXNzd29yZFxuICAgKi9cbiAgZ2VuZXJhdGVSYW5kb21QYXNzd29yZChudW1Xb3JkcyA9IDUpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKG51bVdvcmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgb2YgQml0R29cbiAgICovXG4gIGFzeW5jIGxvZ291dCgpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9sb2dvdXQnKSkucmVzdWx0KCk7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdXNlciBieSBJRCAobmFtZS9lbWFpbCBvbmx5KVxuICAgKiBAcGFyYW0gaWRcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFVzZXIoeyBpZCB9OiBHZXRVc2VyT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKGlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgaWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKGAvdXNlci8ke2lkfWApKS5yZXN1bHQoJ3VzZXInKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGxvZ2dlZCBpbiB1c2VyXG4gICAqL1xuICBhc3luYyBtZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFVzZXIoeyBpZDogJ21lJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvY2sgdGhlIHNlc3Npb24gYnkgcHJvdmlkaW5nIE9UUFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3RwIFJlcXVpcmVkIE9UUCBjb2RlIGZvciB0aGUgYWNjb3VudC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIERlc2lyZWQgZHVyYXRpb24gb2YgdGhlIHVubG9jayBpbiBzZWNvbmRzIChkZWZhdWx0PTYwMCwgbWF4PTM2MDApLlxuICAgKi9cbiAgYXN5bmMgdW5sb2NrKHsgb3RwLCBkdXJhdGlvbiB9OiBVbmxvY2tPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAob3RwICYmICFfLmlzU3RyaW5nKG90cCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIG9yIHVuZGVmaW5lZCBvdHAnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvdW5sb2NrJykpLnNlbmQoeyBvdHAsIGR1cmF0aW9uIH0pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2sgdGhlIHNlc3Npb25cbiAgICovXG4gIGFzeW5jIGxvY2soKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9sb2NrJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAqL1xuICBhc3luYyBzZXNzaW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9zZXNzaW9uJykpLnJlc3VsdCgnc2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYSBwdXNoL3NtcyBmb3IgdGhlIE9UUCBjb2RlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmZvcmNlU01TIElmIHNldCB0byB0cnVlLCB3aWxsIHVzZSBTTVMgdG8gc2VuZCB0aGUgT1RQIHRvIHRoZSB1c2VyIGV2ZW4gaWYgdGhleSBoYXZlIG90aGVyIDJGQSBtZXRob2Qgc2V0IHVwLlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgc2VuZE9UUChwYXJhbXM6IHsgZm9yY2VTTVM/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvc2VuZG90cCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHRva2VuLCBwcm92aWRlZCB0aGUgY3VycmVudCB0b2tlbiBpcyBleHRlbmRhYmxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBkdXJhdGlvbjogZHVyYXRpb24gaW4gc2Vjb25kcyBieSB3aGljaCB0byBleHRlbmQgdGhlIHRva2VuLCBzdGFydGluZyBhdCB0aGUgY3VycmVudCB0aW1lXG4gICAqL1xuICBhc3luYyBleHRlbmRUb2tlbihwYXJhbXM6IEV4dGVuZFRva2VuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuX2V4dGVuc2lvbktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IF9leHRlbnNpb25LZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGR1cmF0aW9uID0gcGFyYW1zLmR1cmF0aW9uO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aW1lc3RhbXAgKyAnfCcgKyB0aGlzLl90b2tlbiArICd8JyArIGR1cmF0aW9uO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSB0aGlzLl9leHRlbnNpb25LZXkucHJpdmF0ZUtleTtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gcHJpdmF0ZUtleSBvbiBleHRlbnNpb25LZXknKTtcbiAgICB9XG4gICAgY29uc3QgaXNDb21wcmVzc2VkID0gdGhpcy5fZXh0ZW5zaW9uS2V5LmNvbXByZXNzZWQ7XG4gICAgY29uc3QgcHJlZml4ID0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLm1lc3NhZ2VQcmVmaXg7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYml0Y29pbk1lc3NhZ2Uuc2lnbihtZXNzYWdlLCBwcml2YXRlS2V5LCBpc0NvbXByZXNzZWQsIHByZWZpeCkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvZXh0ZW5kdG9rZW4nKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5zZXQoJ3RpbWVzdGFtcCcsIHRpbWVzdGFtcC50b1N0cmluZygpKVxuICAgICAgLnNldCgnc2lnbmF0dXJlJywgc2lnbmF0dXJlKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleSBmb3Igc2hhcmluZyBhIHdhbGxldCB3aXRoIGEgdXNlclxuICAgKiBAcGFyYW0gZW1haWwgZW1haWwgb2YgdXNlciB0byBzaGFyZSB3YWxsZXQgd2l0aFxuICAgKi9cbiAgYXN5bmMgZ2V0U2hhcmluZ0tleSh7IGVtYWlsIH06IEdldFNoYXJpbmdLZXlPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcoZW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBlbWFpbCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL3NoYXJpbmdrZXknKSkuc2VuZCh7IGVtYWlsIH0pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXJzIHRoYXQgd2FudCB0byBzaWduIHdpdGggYSBrZXkgd2lsbCB1c2UgdGhpcyBhcGkgdG8gZmV0Y2ggdGhlIGtleWNoYWluIGFuZCB0aGUgcGF0aC5cbiAgICogVXNlcnMgdGhhdCB3YW50IHRvIHZlcmlmeSBhIHNpZ25hdHVyZSB3aWxsIHVzZSB0aGlzIGFwaSB0byBmZXRjaCBhbm90aGVyIHVzZXJzIGVjZGggcHVia2V5LlxuICAgKiBOb3RlOiBJZiB0aGUgdXNlciBpZCBpcyBub3QgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byBnZXR0aW5nIHRoZSBjdXJyZW50IHVzZXIncyBrZXljaGFpbi5cbiAgICogQHBhcmFtIGJpdGdvXG4gICAqIEBwYXJhbSBlbnRlcnByaXNlSWRcbiAgICogQHBhcmFtIHVzZXJJZFxuICAgKi9cbiAgYXN5bmMgZ2V0U2lnbmluZ0tleUZvclVzZXIoZW50ZXJwcmlzZUlkOiBzdHJpbmcsIHVzZXJJZD86IHN0cmluZyk6IFByb21pc2U8R2V0U2lnbmluZ0tleUFwaT4ge1xuICAgIGNvbnN0IHVzZXIgPSB1c2VySWQgPz8gJ21lJztcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoYC9lbnRlcnByaXNlLyR7ZW50ZXJwcmlzZUlkfS91c2VyLyR7dXNlcn0vc2lnbmluZ2tleWAsIDIpKVxuICAgICAgLnF1ZXJ5KHt9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBnZXRWYWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHNldFZhbGlkYXRlKHZhbGlkYXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbih2YWxpZGF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgIH1cbiAgICB0aGlzLl92YWxpZGF0ZSA9IHZhbGlkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbmV3IGNvaW4gaW5zdGFuY2Ugd2l0aCBpdHMgYnVpbGRlciBmYWN0b3J5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIGNvaW4gbmFtZSBhcyBpdCB3YXMgcmVnaXN0ZXJlZCBpbiBAYml0Z28tYmV0YS9zdGF0aWNzXG4gICAqIEBwYXJhbSB7Q29pbkNvbnN0cnVjdG9yfSBjb2luIHRoZSBidWlsZGVyIGZhY3RvcnkgY2xhc3MgZm9yIHRoYXQgY29pblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlcihuYW1lOiBzdHJpbmcsIGNvaW46IENvaW5Db25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgIEdsb2JhbENvaW5GYWN0b3J5LnJlZ2lzdGVyKG5hbWUsIGNvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBiaXRjb2luIG1hcmtldCBkYXRhXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBtYXJrZXRzKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9tYXJrZXRzKSB7XG4gICAgICB0aGlzLl9tYXJrZXRzID0gbmV3IE1hcmtldHModGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tYXJrZXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGF0ZXN0IGJpdGNvaW4gcHJpY2VzXG4gICAqIChEZXByZWNhdGVkOiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSkgdXNlIGBiaXRnby5tYXJrZXRzKCkubGF0ZXN0KClgXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICAvLyBjYi1jb21wYXRcbiAgYXN5bmMgbWFya2V0KCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvbWFya2V0L2xhdGVzdCcpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWFya2V0IGRhdGEgZnJvbSB5ZXN0ZXJkYXlcbiAgICogKERlcHJlY2F0ZWQ6IFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlKSB1c2UgYml0Z28ubWFya2V0cygpLnllc3RlcmRheSgpXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyB5ZXN0ZXJkYXkoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy9tYXJrZXQveWVzdGVyZGF5JykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYmxvY2tjaGFpbiBvYmplY3QuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBibG9ja2NoYWluKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9ibG9ja2NoYWluKSB7XG4gICAgICB0aGlzLl9ibG9ja2NoYWluID0gbmV3IEJsb2NrY2hhaW4odGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ibG9ja2NoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcidzIGtleWNoYWlucyBvYmplY3QuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBrZXljaGFpbnMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX2tleWNoYWlucykge1xuICAgICAgdGhpcy5fa2V5Y2hhaW5zID0gbmV3IEtleWNoYWlucyh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2tleWNoYWlucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRyYXZlbCBydWxlIG9iamVjdFxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgdHJhdmVsUnVsZSgpOiBhbnkge1xuICAgIGlmICghdGhpcy5fdHJhdmVsUnVsZSkge1xuICAgICAgdGhpcy5fdHJhdmVsUnVsZSA9IG5ldyBUcmF2ZWxSdWxlKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdHJhdmVsUnVsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIncyB3YWxsZXRzIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHdhbGxldHMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX3dhbGxldHMpIHtcbiAgICAgIHRoaXMuX3dhbGxldHMgPSBuZXcgV2FsbGV0cyh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlbmRpbmcgYXBwcm92YWxzIHRoYXQgY2FuIGJlIGFwcHJvdmVkLyBvciByZWplY3RlZFxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ0FwcHJvdmFscykge1xuICAgICAgdGhpcy5fcGVuZGluZ0FwcHJvdmFscyA9IG5ldyBQZW5kaW5nQXBwcm92YWxzKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0FwcHJvdmFscztcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBXYWxsZXQgb2JqZWN0LCBpbml0aWFsaXplZCB3aXRoIHRoZSB3YWxsZXQgcGFyYW1zXG4gICAqIENhbiBiZSB1c2VkIHRvIHJlY29uc3RpdHV0ZSBhIHdhbGxldCBmcm9tIGNhY2hlZCBkYXRhXG4gICAqIEBwYXJhbSB3YWxsZXRQYXJhbXNcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG5ld1dhbGxldE9iamVjdCh3YWxsZXRQYXJhbXMpOiBhbnkge1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMsIHdhbGxldFBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogVjEgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBtaW5lciBmZWUgYW1vdW50cywgZ2l2ZW4gdGhlIG51bWJlciBhbmRcbiAgICogdHlwZSBvZiB0cmFuc2FjdGlvbiBpbnB1dHMsIGFsb25nIHdpdGggYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcyBwZXIgdmtCLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG5ldyBjb2RlLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGFzeW5jIGNhbGN1bGF0ZU1pbmVyRmVlSW5mbyhwYXJhbXM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uQnVpbGRlci5jYWxjdWxhdGVNaW5lckZlZUluZm8ocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgYSBCaXRjb2luIGFkZHJlc3MgaXMgYSB2YWxpZCBiYXNlNTggYWRkcmVzc1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgdmVyaWZ5QWRkcmVzcyhwYXJhbXM6IERlcHJlY2F0ZWRWZXJpZnlBZGRyZXNzT3B0aW9ucyA9IHt9KTogYm9vbGVhbiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdKTtcblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ldHdvcmtOYW1lID0gY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5uZXR3b3JrO1xuICAgIGNvbnN0IG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzW25ldHdvcmtOYW1lXTtcblxuICAgIHJldHVybiB2ZXJpZnlBZGRyZXNzKHBhcmFtcy5hZGRyZXNzLCBuZXR3b3JrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCBhIHNlY3JldCBpbnRvIHNoYXJkcyB1c2luZyBTaGFtaXIgU2VjcmV0IFNoYXJpbmcuXG4gICAqIEBwYXJhbSBzZWVkIEEgaGV4YWRlY2ltYWwgc2VjcmV0IHRvIHNwbGl0XG4gICAqIEBwYXJhbSBwYXNzd29yZHMgQW4gYXJyYXkgb2YgdGhlIHBhc3N3b3JkcyB1c2VkIHRvIGVuY3J5cHQgZWFjaCBzaGFyZVxuICAgKiBAcGFyYW0gbSBUaGUgdGhyZXNob2xkIG51bWJlciBvZiBzaGFyZHMgbmVjZXNzYXJ5IHRvIHJlY29uc3RpdHV0ZSB0aGUgc2VjcmV0XG4gICAqL1xuICBzcGxpdFNlY3JldCh7IHNlZWQsIHBhc3N3b3JkcywgbSB9OiBTcGxpdFNlY3JldE9wdGlvbnMpOiBTcGxpdFNlY3JldCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhc3N3b3JkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzSW50ZWdlcihtKSB8fCBtIDwgMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAyJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhc3N3b3Jkcy5sZW5ndGggPCBtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3N3b3JkcyBhcnJheSBsZW5ndGggY2Fubm90IGJlIGxlc3MgdGhhbiBtJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbiA9IHBhc3N3b3Jkcy5sZW5ndGg7XG4gICAgY29uc3Qgc2VjcmV0czogc3RyaW5nW10gPSBzaGFtaXIuc2hhcmUoc2VlZCwgbiwgbSk7XG4gICAgY29uc3Qgc2hhcmRzID0gXy56aXBXaXRoKHNlY3JldHMsIHBhc3N3b3JkcywgKHNoYXJkLCBwYXNzd29yZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdCh7IGlucHV0OiBzaGFyZCwgcGFzc3dvcmQgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgbm9kZSA9IGJpcDMyLmZyb21TZWVkKEJ1ZmZlci5mcm9tKHNlZWQsICdoZXgnKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHhwdWI6IG5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgbSxcbiAgICAgIG4sXG4gICAgICBzZWVkU2hhcmVzOiBzaGFyZHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbnN0aXR1dGUgYSBzZWNyZXQgd2hpY2ggd2FzIHNoYXJkZWQgd2l0aCBgc3BsaXRTZWNyZXRgLlxuICAgKiBAcGFyYW0gc2hhcmRzXG4gICAqIEBwYXJhbSBwYXNzd29yZHNcbiAgICovXG4gIHJlY29uc3RpdHV0ZVNlY3JldCh7IHNoYXJkcywgcGFzc3dvcmRzIH06IFJlY29uc3RpdHV0ZVNlY3JldE9wdGlvbnMpOiBSZWNvbnN0aXR1dGVkU2VjcmV0IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2hhcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFzc3dvcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzd29yZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChzaGFyZHMubGVuZ3RoICE9PSBwYXNzd29yZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJkcyBhbmQgcGFzc3dvcmRzIGFycmF5cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNyZXRzID0gXy56aXBXaXRoKHNoYXJkcywgcGFzc3dvcmRzLCAoc2hhcmQsIHBhc3N3b3JkKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kZWNyeXB0KHsgaW5wdXQ6IHNoYXJkLCBwYXNzd29yZCB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBzZWVkOiBzdHJpbmcgPSBzaGFtaXIuY29tYmluZShzZWNyZXRzKTtcbiAgICBjb25zdCBub2RlID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgeHB1Yjogbm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgYXMgc3RyaW5nLFxuICAgICAgeHBydjogbm9kZS50b0Jhc2U1OCgpIGFzIHN0cmluZyxcbiAgICAgIHNlZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gc2hhcmRzXG4gICAqIEBwYXJhbSBwYXNzd29yZHNcbiAgICogQHBhcmFtIG1cbiAgICogQHBhcmFtIHhwdWIgT3B0aW9uYWwgeHB1YiB0byB2ZXJpZnkgdGhlIHJlc3VsdHMgYWdhaW5zdFxuICAgKi9cbiAgdmVyaWZ5U2hhcmRzKHsgc2hhcmRzLCBwYXNzd29yZHMsIG0sIHhwdWIgfTogVmVyaWZ5U2hhcmRzT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgYSBnaXZlbiBhcnJheSdzIHZhbHVlcyBnaXZlbiBzdWJzZXQgc2l6ZSBtXG4gICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB3aG9zZSB2YWx1ZXMgYXJlIHRvIGJlIGFycmFuZ2VkIGluIGFsbCBjb21iaW5hdGlvbnNcbiAgICAgKiBAcGFyYW0gbSBUaGUgc2l6ZSBvZiBlYWNoIHN1YnNldFxuICAgICAqIEBwYXJhbSBlbnRyeUluZGljZXMgUmVjdXJzaXZlbHkgdHJhaWxpbmcgc2V0IG9mIGN1cnJlbnRseSBjaG9zZW4gYXJyYXkgaW5kaWNlcyBmb3IgdGhlIGNvbWJpbmF0aW9uIHN1YnNldCB1bmRlciBjb25zdHJ1Y3Rpb25cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVDb21iaW5hdGlvbnMgPSAoYXJyYXk6IHN0cmluZ1tdLCBtOiBudW1iZXIsIGVudHJ5SW5kaWNlczogbnVtYmVyW10gPSBbXSk6IHN0cmluZ1tdW10gPT4ge1xuICAgICAgbGV0IGNvbWJpbmF0aW9uczogc3RyaW5nW11bXSA9IFtdO1xuXG4gICAgICBpZiAoZW50cnlJbmRpY2VzLmxlbmd0aCA9PT0gbSkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q29tYmluYXRpb24gPSBfLmF0KGFycmF5LCBlbnRyeUluZGljZXMpO1xuICAgICAgICByZXR1cm4gW2N1cnJlbnRDb21iaW5hdGlvbl07XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBoaWdoZXN0IGluZGV4XG4gICAgICBsZXQgZW50cnlJbmRleCA9IF8ubGFzdChlbnRyeUluZGljZXMpO1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBpbmRpY2VzLCBhc3N1bWUgLTFcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKGVudHJ5SW5kZXgpKSB7XG4gICAgICAgIGVudHJ5SW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBlbnRyeUluZGV4ICsgMTsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIGFwcGVuZCB0aGUgY3VycmVudCBpbmRleCB0byB0aGUgdHJhaWxpbmcgaW5kaWNlc1xuICAgICAgICBjb25zdCBjdXJyZW50RW50cnlJbmRpY2VzID0gWy4uLmVudHJ5SW5kaWNlcywgaV07XG4gICAgICAgIGNvbnN0IG5ld0NvbWJpbmF0aW9ucyA9IGdlbmVyYXRlQ29tYmluYXRpb25zKGFycmF5LCBtLCBjdXJyZW50RW50cnlJbmRpY2VzKTtcbiAgICAgICAgY29tYmluYXRpb25zID0gWy4uLmNvbWJpbmF0aW9ucywgLi4ubmV3Q29tYmluYXRpb25zXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbWJpbmF0aW9ucztcbiAgICB9O1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNoYXJkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hhcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhc3N3b3JkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmRzLmxlbmd0aCAhPT0gcGFzc3dvcmRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZHMgYW5kIHBhc3N3b3JkcyBhcnJheXMgbXVzdCBoYXZlIHNhbWUgbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjcmV0cyA9IF8uemlwV2l0aChzaGFyZHMsIHBhc3N3b3JkcywgKHNoYXJkLCBwYXNzd29yZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdCh7IGlucHV0OiBzaGFyZCwgcGFzc3dvcmQgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2VjcmV0Q29tYmluYXRpb25zID0gZ2VuZXJhdGVDb21iaW5hdGlvbnMoc2VjcmV0cywgbSk7XG4gICAgY29uc3Qgc2VlZHMgPSBzZWNyZXRDb21iaW5hdGlvbnMubWFwKChjdXJyZW50Q29tYmluYXRpb24pID0+IHtcbiAgICAgIHJldHVybiBzaGFtaXIuY29tYmluZShjdXJyZW50Q29tYmluYXRpb24pO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuaXF1ZVNlZWRzID0gXy51bmlxKHNlZWRzKTtcbiAgICBpZiAodW5pcXVlU2VlZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHNlZWQgPSBfLmZpcnN0KHVuaXF1ZVNlZWRzKTtcbiAgICBjb25zdCBub2RlID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKTtcbiAgICBjb25zdCByZXN0b3JlZFhwdWIgPSBub2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh4cHViKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHhwdWIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigneHB1YiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdG9yZWRYcHViICE9PSB4cHViKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBgZ2V0U2hhcmVkU2VjcmV0KClgXG4gICAqL1xuICBnZXRFQ0RIU2VjcmV0KHsgb3RoZXJQdWJLZXlIZXgsIGVja2V5IH06IEdldEVjZGhTZWNyZXRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIV8uaXNTdHJpbmcob3RoZXJQdWJLZXlIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ290aGVyUHViS2V5SGV4IHN0cmluZyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNPYmplY3QoZWNrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vja2V5IG9iamVjdCByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKG90aGVyUHViS2V5SGV4LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyJ3MgcHJpdmF0ZSBFQ0RIIGtleWNoYWluXG4gICAqL1xuICBhc3luYyBnZXRFQ0RIS2V5Y2hhaW4oZWNkaEtleWNoYWluUHViPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWVjZGhLZXljaGFpblB1Yikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL3NldHRpbmdzJykpLnJlc3VsdCgpO1xuICAgICAgaWYgKCFyZXN1bHQuc2V0dGluZ3MuZWNkaEtleWNoYWluKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ2VjZGgga2V5Y2hhaW4gbm90IGZvdW5kIGZvciB1c2VyJyk7XG4gICAgICB9XG4gICAgICBlY2RoS2V5Y2hhaW5QdWIgPSByZXN1bHQuc2V0dGluZ3MuZWNkaEtleWNoYWluO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXljaGFpbnMoKS5nZXQoeyB4cHViOiBlY2RoS2V5Y2hhaW5QdWIgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdXNlciBkZXJpdmVkIHB1YmxpYyBhbmQgcHJpdmF0ZSBFQ0RIIGtleXBhaXJcbiAgICogQHBhcmFtIHBhc3N3b3JkIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHVzZXIncyBFQ0RIIGVuY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0gZW50SWQ/IG9wdGlvbmFsIGVudGVycHJpc2UgaWQgdG8gY2hlY2sgZm9yIHBlcm1pc3Npb25zXG4gICAqL1xuICBhc3luYyBnZXRFY2RoS2V5cGFpclByaXZhdGUocGFzc3dvcmQ6IHN0cmluZywgZW50SWQ6IHN0cmluZyk6IFByb21pc2U8RWNkaERlcml2ZWRLZXlwYWlyPiB7XG4gICAgY29uc3QgdXNlclNpZ25pbmdLZXkgPSBhd2FpdCB0aGlzLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudElkKTtcbiAgICBjb25zdCBwdWJrZXlPZkFkbWluRWNkaEtleUhleCA9IHVzZXJTaWduaW5nS2V5LmRlcml2ZWRQdWJrZXk7XG4gICAgaWYgKCF1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4gfHwgIXVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHVzZXIga2V5Y2hhaW4uIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tLicpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyRWNkaEtleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFQ0RIS2V5Y2hhaW4odXNlclNpZ25pbmdLZXkuZWNkaEtleWNoYWluKTtcbiAgICBsZXQgeHBydjtcbiAgICB0cnkge1xuICAgICAgeHBydiA9IHRoaXMuZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHVzZXJFY2RoS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IHBhc3N3b3JkLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGVyaXZlZFB1YktleTogcHVia2V5T2ZBZG1pbkVjZGhLZXlIZXgsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGgsXG4gICAgICB4cHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIG9wZXJhdGluZ1N5c3RlbTogb25lIG9mIGlvcywgYW5kcm9pZFxuICAgKiAtIHB1c2hUb2tlbjogaGV4LWZvcm1hdHRlZCB0b2tlbiBmb3IgdGhlIHJlc3BlY3RpdmUgbmF0aXZlIHB1c2ggbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyByZWdpc3RlclB1c2hUb2tlbihwYXJhbXM6IFJlZ2lzdGVyUHVzaFRva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsncHVzaFRva2VuJywgJ29wZXJhdGluZ1N5c3RlbSddLCBbXSk7XG5cbiAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAvLyB0aGlzIGRldmljZSBoYXMgdG8gYmUgcmVnaXN0ZXJlZCB0byBhbiBleHRlbnNpYmxlIHNlc3Npb25cbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGxvZ2dlZCBpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3B1c2hUb2tlbicsICdvcGVyYXRpbmdTeXN0ZW0nXSk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvZGV2aWNlcycpKS5zZW5kKHBvc3RQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBwdXNoVmVyaWZpY2F0aW9uVG9rZW46IHRoZSB0b2tlbiByZWNlaXZlZCB2aWEgcHVzaCBub3RpZmljYXRpb24gdG8gY29uZmlybSB0aGUgZGV2aWNlJ3MgbW9iaWxpdHlcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHZlcmlmeVB1c2hUb2tlbihwYXJhbXM6IFZlcmlmeVB1c2hUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIG9iamVjdCBwYXJhbXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnB1c2hWZXJpZmljYXRpb25Ub2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHB1c2hWZXJpZmljYXRpb25Ub2tlbicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgIC8vIHRoaXMgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHRvIGFuIGV4dGVuc2libGUgc2Vzc2lvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgbG9nZ2VkIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsICdwdXNoVmVyaWZpY2F0aW9uVG9rZW4nKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy9kZXZpY2VzL3ZlcmlmeScpKS5zZW5kKHBvc3RQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ2luIHRvIHRoZSBiaXRnbyBzeXN0ZW0gdXNpbmcgYW4gYXV0aGNvZGUgZ2VuZXJhdGVkIHZpYSBPYXV0aFxuICAgKi9cbiAgYXN5bmMgYXV0aGVudGljYXRlV2l0aEF1dGhDb2RlKHBhcmFtczogQXV0aGVudGljYXRlV2l0aEF1dGhDb2RlT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgb2JqZWN0IHBhcmFtcycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuYXV0aENvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBhdXRoQ29kZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fY2xpZW50SWQgfHwgIXRoaXMuX2NsaWVudFNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIGNsaWVudCBpZCBhbmQgc2VjcmV0IHNldCBmaXJzdCB0byB1c2UgdGhpcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGF1dGhDb2RlID0gcGFyYW1zLmF1dGhDb2RlO1xuXG4gICAgaWYgKHRoaXMuX3Rva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FscmVhZHkgbG9nZ2VkIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucG9zdCh0aGlzLl9iYXNlVXJsICsgJy9vYXV0aC90b2tlbicpO1xuICAgIHJlcXVlc3QuZm9yY2VWMUF1dGggPSB0cnVlOyAvLyBPQXV0aCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB2MSBhdXRoZW50aWNhdGlvblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXF1ZXN0XG4gICAgICAuc2VuZCh7XG4gICAgICAgIGdyYW50X3R5cGU6ICdhdXRob3JpemF0aW9uX2NvZGUnLFxuICAgICAgICBjb2RlOiBhdXRoQ29kZSxcbiAgICAgICAgY2xpZW50X2lkOiB0aGlzLl9jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5fY2xpZW50U2VjcmV0LFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIHRoaXMuX3Rva2VuID0gYm9keS5hY2Nlc3NfdG9rZW47XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuID0gYm9keS5yZWZyZXNoX3Rva2VuO1xuXG4gICAgYXdhaXQgdGhpcy5faG1hY0F1dGhTdHJhdGVneT8uc2V0VG9rZW4/Lihib2R5LmFjY2Vzc190b2tlbik7XG5cbiAgICB0aGlzLl91c2VyID0gYXdhaXQgdGhpcy5tZSgpO1xuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgcGFzc3dvcmQgb2YgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci5cbiAgICogQWxzbyBjaGFuZ2UgYWxsIHYxIGFuZCB2MiBrZXljaGFpbiBwYXNzd29yZHMgaWYgdGhleSBtYXRjaCB0aGVcbiAgICogZ2l2ZW4gb2xkUGFzc3dvcmQuIFJldHVybnMgbm90aGluZyBvbiBzdWNjZXNzLlxuICAgKiBAcGFyYW0gb2xkUGFzc3dvcmQge1N0cmluZ30gLSB0aGUgY3VycmVudCBwYXNzd29yZFxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQge1N0cmluZ30gLSB0aGUgbmV3IHBhc3N3b3JkXG4gICAqL1xuICBhc3luYyBjaGFuZ2VQYXNzd29yZCh7IG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9OiBDaGFuZ2VQYXNzd29yZE9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhvbGRQYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIG9sZFBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKG5ld1Bhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgbmV3UGFzc3dvcmQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKCk7XG4gICAgaWYgKHR5cGVvZiB1c2VyICE9PSAnb2JqZWN0JyB8fCAhdXNlci51c2VybmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIG9iamVjdCB1c2VyJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMudmVyaWZ5UGFzc3dvcmQoeyBwYXNzd29yZDogb2xkUGFzc3dvcmQgfSk7XG4gICAgaWYgKCF2YWxpZGF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBwcm92aWRlZCBvbGRQYXNzd29yZCBpcyBpbmNvcnJlY3QnKTtcbiAgICB9XG5cbiAgICAvLyBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBjb2luIHdlIGNob29zZSBiZWNhdXNlIHRoZSB2MiB1cGRhdGVQYXNzd29yZCBmdW5jdGlvbnMgdXBkYXRlcyBhbGwgdjIga2V5Y2hhaW5zXG4gICAgLy8gd2UganVzdCBuZWVkIHRvIGNob29zZSBhIGNvaW4gdGhhdCBleGlzdHMgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnRcbiAgICBjb25zdCBjb2luID0gY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5uZXR3b3JrID09PSAnYml0Y29pbicgPyAnYnRjJyA6ICd0YnRjJztcblxuICAgIGNvbnN0IHVwZGF0ZUtleWNoYWluUGFzc3dvcmRQYXJhbXMgPSB7IG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9O1xuICAgIGNvbnN0IHYxS2V5Y2hhaW5VcGRhdGVQV1Jlc3VsdCA9IGF3YWl0IHRoaXMua2V5Y2hhaW5zKCkudXBkYXRlUGFzc3dvcmQodXBkYXRlS2V5Y2hhaW5QYXNzd29yZFBhcmFtcyk7XG4gICAgY29uc3QgdjJLZXljaGFpbnMgPSBhd2FpdCB0aGlzLmNvaW4oY29pbikua2V5Y2hhaW5zKCkudXBkYXRlUGFzc3dvcmQodXBkYXRlS2V5Y2hhaW5QYXNzd29yZFBhcmFtcyk7XG5cbiAgICBjb25zdCBbaG1hY09sZFBhc3N3b3JkLCBobWFjTmV3UGFzc3dvcmRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5faG1hY0F1dGhTdHJhdGVneS5jYWxjdWxhdGVITUFDKHVzZXIudXNlcm5hbWUsIG9sZFBhc3N3b3JkKSxcbiAgICAgIHRoaXMuX2htYWNBdXRoU3RyYXRlZ3kuY2FsY3VsYXRlSE1BQyh1c2VyLnVzZXJuYW1lLCBuZXdQYXNzd29yZCksXG4gICAgXSk7XG5cbiAgICBjb25zdCB1cGRhdGVQYXNzd29yZFBhcmFtcyA9IHtcbiAgICAgIGtleWNoYWluczogdjFLZXljaGFpblVwZGF0ZVBXUmVzdWx0LmtleWNoYWlucyxcbiAgICAgIHYyX2tleWNoYWluczogdjJLZXljaGFpbnMsXG4gICAgICB2ZXJzaW9uOiB2MUtleWNoYWluVXBkYXRlUFdSZXN1bHQudmVyc2lvbixcbiAgICAgIG9sZFBhc3N3b3JkOiBobWFjT2xkUGFzc3dvcmQsXG4gICAgICBwYXNzd29yZDogaG1hY05ld1Bhc3N3b3JkLFxuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgcGF5bG9hZCBzaXplIGluIEtCXG4gICAgY29uc3QgcGF5bG9hZFNpemVCeXRlcyA9IEpTT04uc3RyaW5naWZ5KHVwZGF0ZVBhc3N3b3JkUGFyYW1zKS5sZW5ndGg7XG4gICAgY29uc3QgcGF5bG9hZFNpemVLQiA9IE1hdGguY2VpbChwYXlsb2FkU2l6ZUJ5dGVzIC8gMTAyNCk7XG5cbiAgICAvLyBDaGVjayBpZiBiYXRjaGluZyBmbG93IGlzIGVuYWJsZWRcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmF0Y2hpbmdGbG93Q2hlY2sgPSBhd2FpdCB0aGlzLmdldCh0aGlzLnVybCgnL3VzZXIvY2hlY2tCYXRjaGluZ1Bhc3N3b3JkRmxvdycsIDIpKVxuICAgICAgICAucXVlcnkoeyBwYXlsb2FkU2l6ZTogcGF5bG9hZFNpemVLQi50b1N0cmluZygpIH0pXG4gICAgICAgIC5yZXN1bHQoKTtcblxuICAgICAgaWYgKGJhdGNoaW5nRmxvd0NoZWNrLmlzQmF0Y2hpbmdGbG93RW5hYmxlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NLZXljaGFpblBhc3N3b3JkVXBkYXRlc0luQmF0Y2hlcyhcbiAgICAgICAgICB1cGRhdGVQYXNzd29yZFBhcmFtcy5rZXljaGFpbnMsXG4gICAgICAgICAgdXBkYXRlUGFzc3dvcmRQYXJhbXMudjJfa2V5Y2hhaW5zLFxuICAgICAgICAgIGJhdGNoaW5nRmxvd0NoZWNrLm1heEJhdGNoU2l6ZUtCLFxuICAgICAgICAgIDNcbiAgICAgICAgKTtcbiAgICAgICAgLy8gQ2FsbCBjaGFuZ2VwYXNzd29yZCBBUEkgd2l0aG91dCBrZXljaGFpbnMgZm9yIGJhdGNoaW5nIGZsb3dcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvY2hhbmdlcGFzc3dvcmQnKSlcbiAgICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgICB2ZXJzaW9uOiB1cGRhdGVQYXNzd29yZFBhcmFtcy52ZXJzaW9uLFxuICAgICAgICAgICAgb2xkUGFzc3dvcmQ6IHVwZGF0ZVBhc3N3b3JkUGFyYW1zLm9sZFBhc3N3b3JkLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHVwZGF0ZVBhc3N3b3JkUGFyYW1zLnBhc3N3b3JkLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBiYXRjaGluZyBmbG93IGNoZWNrIGZhaWxlZFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL2NoYW5nZXBhc3N3b3JkJykpLnNlbmQodXBkYXRlUGFzc3dvcmRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhlIGFkZHJlc3MgbGFiZWxzIG9uIGFsbCBvZiB0aGUgdXNlcidzIHdhbGxldHNcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGxhYmVscygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL2xhYmVscycpKS5yZXN1bHQoJ2xhYmVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlcyBhcHByb3hpbWF0ZSBmZWUgcGVyIGtiIG5lZWRlZCBmb3IgYSB0eCB0byBnZXQgaW50byBhIGJsb2NrXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIHRhcmdldCBibG9ja3MgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZSBjb25maXJtZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy5tYXhGZWUgbWF4aW11bSBmZWUgd2lsbGluZyB0byBiZSBwYWlkIChmb3Igc2FmZXR5KVxuICAgKiBAcGFyYW0ge2FycmF5W3N0cmluZ119IHBhcmFtcy5pbnB1dHMgbGlzdCBvZiB1bmNvbmZpcm1lZCB0eElkcyBmcm9tIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gdXNlcyBpbnB1dHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy50eFNpemUgZXN0aW1hdGVkIHRyYW5zYWN0aW9uIHNpemUgaW4gYnl0ZXMsIG9wdGlvbmFsIHBhcmFtZXRlciB1c2VkIGZvciBDUEZQIGVzdGltYXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmNwZnBBd2FyZSBmbGFnIGluZGljYXRpbmcgZmVlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCBDUEZQXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBlc3RpbWF0ZUZlZShwYXJhbXM6IEVzdGltYXRlRmVlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeVBhcmFtczogYW55ID0geyB2ZXJzaW9uOiAxMiB9O1xuICAgIGlmIChwYXJhbXMubnVtQmxvY2tzKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLm51bUJsb2NrcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBxdWVyeVBhcmFtcy5udW1CbG9ja3MgPSBwYXJhbXMubnVtQmxvY2tzO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLm1heEZlZSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuICAgICAgcXVlcnlQYXJhbXMubWF4RmVlID0gcGFyYW1zLm1heEZlZTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5pbnB1dHMpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuaW5wdXRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLmlucHV0cyA9IHBhcmFtcy5pbnB1dHM7XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHhTaXplKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnR4U2l6ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBxdWVyeVBhcmFtcy50eFNpemUgPSBwYXJhbXMudHhTaXplO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmNwZnBBd2FyZSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuY3BmcEF3YXJlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLmNwZnBBd2FyZSA9IHBhcmFtcy5jcGZwQXdhcmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvdHgvZmVlJykpLnF1ZXJ5KHF1ZXJ5UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQml0R28ncyBndWFyYW50ZWUgdXNpbmcgYW4gaW5zdGFudCBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBpbnN0YW50R3VhcmFudGVlKHBhcmFtczogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBpZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCB0aGlzLmdldCh0aGlzLnVybCgnL2luc3RhbnQvJyArIHBhcmFtcy5pZCkpLnJlc3VsdCgpO1xuICAgIGlmICghYm9keS5ndWFyYW50ZWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZ3VhcmFudGVlIGZvdW5kIGluIHJlc3BvbnNlIGJvZHknKTtcbiAgICB9XG4gICAgaWYgKCFib2R5LnNpZ25hdHVyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBzaWduYXR1cmUgZm91bmQgaW4gZ3VhcmFudGVlIHJlc3BvbnNlIGJvZHknKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmluZ0FkZHJlc3MgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLnNpZ25pbmdBZGRyZXNzO1xuICAgIGNvbnN0IHNpZ25hdHVyZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJvZHkuc2lnbmF0dXJlLCAnaGV4Jyk7XG4gICAgY29uc3QgcHJlZml4ID0gdXR4b2xpYi5uZXR3b3Jrc1tjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcmtdLm1lc3NhZ2VQcmVmaXg7XG4gICAgY29uc3QgaXNWYWxpZFNpZ25hdHVyZSA9IGJpdGNvaW5NZXNzYWdlLnZlcmlmeShib2R5Lmd1YXJhbnRlZSwgc2lnbmluZ0FkZHJlc3MsIHNpZ25hdHVyZUJ1ZmZlciwgcHJlZml4KTtcbiAgICBpZiAoIWlzVmFsaWRTaWduYXR1cmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IHNpZ25hdHVyZScpO1xuICAgIH1cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0YXJnZXQgYWRkcmVzcyBmb3IgcGF5bWVudCBvZiBhIEJpdEdvIGZlZVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgZ2V0Qml0R29GZWVBZGRyZXNzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL2JpbGxpbmcvYWRkcmVzcycpKS5zZW5kKHt9KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGFkZHJlc3Mgb2JqZWN0IChpbmNsdWRpbmcgdGhlIHdhbGxldCBpZCkgZm9yIGEgZ2l2ZW4gYWRkcmVzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGxvb2sgdXAuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRXYWxsZXRBZGRyZXNzKHsgYWRkcmVzcyB9OiB7IGFkZHJlc3M6IHN0cmluZyB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoYC93YWxsZXRhZGRyZXNzLyR7YWRkcmVzc31gKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggbGlzdCBvZiB1c2VyIHdlYmhvb2tzXG4gICAqXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG5ldyB1c2VyIHdlYmhvb2tcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGFkZFdlYmhvb2socGFyYW1zOiBXZWJob29rT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy51cmwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB1cmwnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB0eXBlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdXNlciB3ZWJob29rXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyByZW1vdmVXZWJob29rKHBhcmFtczogV2ViaG9va09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudXJsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgdXJsJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgdHlwZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlbCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBsaXN0IG9mIHdlYmhvb2sgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHVzZXJcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGxpc3RXZWJob29rTm90aWZpY2F0aW9ucyhwYXJhbXM6IExpc3RXZWJob29rTm90aWZpY2F0aW9uc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IGFueSA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy93ZWJob29rcy9ub3RpZmljYXRpb25zJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSBhIHVzZXIgd2ViaG9va1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2ltdWxhdGVXZWJob29rKHBhcmFtczogQml0R29TaW11bGF0ZVdlYmhvb2tPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCcsICdibG9ja0lkJ10sIFtdKTtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLndlYmhvb2tJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHdlYmhvb2tJZCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuYmxvY2tJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGJsb2NrSWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKGAvd2ViaG9va3MvJHtwYXJhbXMud2ViaG9va0lkfS9zaW11bGF0ZWApKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgZ2V0IGNvbnN0YW50cyB3aGljaCBhcmUgcmVsZXZhbnQgdG8gdGhlIGNsaWVudC5cbiAgICpcbiAgICogTm90ZTogVGhpcyBmdW5jdGlvbiBoYXMgYSBrbm93biByYWNlIGNvbmRpdGlvbi4gSXQgbWF5IHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIG92ZXIgdGltZSxcbiAgICogZXNwZWNpYWxseSBpZiBjYWxsZWQgc2hvcnRseSBhZnRlciBjcmVhdGlvbiBvZiB0aGUgQml0R28gb2JqZWN0LlxuICAgKlxuICAgKiBOZXcgY29kZSBzaG91bGQgY2FsbCBmZXRjaENvbnN0YW50cygpIGRpcmVjdGx5IGluc3RlYWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsaWVudCBjb25zdGFudHMgb2JqZWN0XG4gICAqL1xuICBnZXRDb25zdGFudHMoKTogYW55IHtcbiAgICAvLyBraWNrIG9mZiBhIGZyZXNoIHJlcXVlc3QgZm9yIHRoZSBjbGllbnQgY29uc3RhbnRzXG4gICAgdGhpcy5mZXRjaENvbnN0YW50cygpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGFuIGVycm9yIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgZW50aXJlIHNjcmlwdFxuICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gZmV0Y2ggY2xpZW50IGNvbnN0YW50cyBmcm9tIEJpdEdvJyk7XG4gICAgICAgIGNvbnNvbGUudHJhY2UoZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHVzZSBkZWZhdWx0Q29uc3RhbnRzIGFzIHRoZSBiYWNrdXAgZm9yIGtleXMgdGhhdCBhcmUgbm90IHNldCBpbiBCaXRHb0FQSS5fY29uc3RhbnRzXG4gICAgcmV0dXJuIF8ubWVyZ2Uoe30sIGRlZmF1bHRDb25zdGFudHModGhpcy5nZXRFbnYoKSksIEJpdEdvQVBJLl9jb25zdGFudHM/Llt0aGlzLmdldEVudigpXSB8fCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhbiBhc3NldCByZXF1ZXN0IHdoaWNoIGRvZXMgbm90IG5lZWQgSE1BQyB2YWxpZGF0aW9uXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBmb3IgdGhlIGFzc2V0IHJlcXVlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gVGhlIHJlc3BvbnNlIGJvZHlcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBleGVjdXRlQXNzZXRSZXF1ZXN0KHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCByZXEgPSB0aGlzLmdldEFnZW50UmVxdWVzdCgnZ2V0JywgdXJsKTtcbiAgICByZXEuc2V0KCdCaXRHby1TREstVmVyc2lvbicsIHRoaXMuX3ZlcnNpb24pO1xuICAgIGlmICh0aGlzLl9jdXN0b21Qcm94eUFnZW50KSB7XG4gICAgICByZXEuYWdlbnQodGhpcy5fY3VzdG9tUHJveHlBZ2VudCk7XG4gICAgfVxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IHRvIGp1c3QgYWJvdmUgNSBtaW51dGVzIGJ5IGRlZmF1bHRcbiAgICByZXEudGltZW91dCgocHJvY2Vzcy5lbnYuQklUR09fVElNRU9VVCBhcyBhbnkpICogMTAwMCB8fCAzMDUgKiAxMDAwKTtcbiAgICBpZiAodGhpcy5nZXRBZGRpdGlvbmFsSGVhZGVyc0NiKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsSGVhZGVycyA9IHRoaXMuZ2V0QWRkaXRpb25hbEhlYWRlcnNDYignZ2V0JywgdXJsKTtcbiAgICAgIGZvciAoY29uc3QgeyBrZXksIHZhbHVlIH0gb2YgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmVxLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxO1xuICAgIHJldHVybiByZXN1bHQuYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYWNrIGtleWNoYWlucyBpbnRvIGJhdGNoZXMgdXNpbmcgRmlyc3QgRml0IERlY3JlYXNpbmcgKEZGRCkgYWxnb3JpdGhtLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5Y2hhaW5zIC0gVjEga2V5Y2hhaW5zXG4gICAqIEBwYXJhbSB2MktleWNoYWlucyAtIFYyIGtleWNoYWluc1xuICAgKiBAcGFyYW0gbWF4QmF0Y2hTaXplQnl0ZXMgLSBNYXhpbXVtIGJ5dGUgc2l6ZSBwZXIgYmF0Y2hcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcGFja0tleWNoYWluc0ZGRChcbiAgICBrZXljaGFpbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgdjJLZXljaGFpbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgbWF4QmF0Y2hTaXplQnl0ZXM6IG51bWJlclxuICApOiBBcnJheTx7IHYxQmF0Y2g6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHYyQmF0Y2g6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHNpemVCeXRlczogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBlbnRyeVNpemUgPSAoaWQ6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gQnVmZmVyLmJ5dGVMZW5ndGgoaWQsICd1dGY4JykgKyBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSwgJ3V0ZjgnKTtcblxuICAgIGNvbnN0IGl0ZW1zID0gW1xuICAgICAgLi4uT2JqZWN0LmVudHJpZXMoa2V5Y2hhaW5zKS5tYXAoKFtpZCwgdmFsdWVdKSA9PiAoeyBpZCwgdmFsdWUsIHNpemVCeXRlczogZW50cnlTaXplKGlkLCB2YWx1ZSksIGlzVjI6IGZhbHNlIH0pKSxcbiAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHYyS2V5Y2hhaW5zKS5tYXAoKFtpZCwgdmFsdWVdKSA9PiAoeyBpZCwgdmFsdWUsIHNpemVCeXRlczogZW50cnlTaXplKGlkLCB2YWx1ZSksIGlzVjI6IHRydWUgfSkpLFxuICAgIF0uc29ydCgoYSwgYikgPT4gYi5zaXplQnl0ZXMgLSBhLnNpemVCeXRlcyk7XG5cbiAgICBjb25zdCBiaW5zOiBBcnJheTx7IHYxQmF0Y2g6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHYyQmF0Y2g6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHNpemVCeXRlczogbnVtYmVyIH0+ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmIChpdGVtLnNpemVCeXRlcyA+IG1heEJhdGNoU2l6ZUJ5dGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgS2V5Y2hhaW4gd2l0aCBpZCAke2l0ZW0uaWR9IGV4Y2VlZHMgdGhlIG1heGltdW0gYmF0Y2ggc2l6ZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZGApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBiaW5zLmZpbmQoKGJpbikgPT4gYmluLnNpemVCeXRlcyArIGl0ZW0uc2l6ZUJ5dGVzIDw9IG1heEJhdGNoU2l6ZUJ5dGVzKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaWYgKGl0ZW0uaXNWMikge1xuICAgICAgICAgIHRhcmdldC52MkJhdGNoW2l0ZW0uaWRdID0gaXRlbS52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQudjFCYXRjaFtpdGVtLmlkXSA9IGl0ZW0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LnNpemVCeXRlcyArPSBpdGVtLnNpemVCeXRlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld0JpbiA9IHtcbiAgICAgICAgICB2MUJhdGNoOiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgICAgIHYyQmF0Y2g6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgICAgICAgc2l6ZUJ5dGVzOiBpdGVtLnNpemVCeXRlcyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGl0ZW0uaXNWMikge1xuICAgICAgICAgIG5ld0Jpbi52MkJhdGNoW2l0ZW0uaWRdID0gaXRlbS52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdCaW4udjFCYXRjaFtpdGVtLmlkXSA9IGl0ZW0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYmlucy5wdXNoKG5ld0Jpbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJpbnM7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBrZXljaGFpbiBwYXNzd29yZCB1cGRhdGVzIGluIGJhdGNoZXMgd2l0aCByZXRyeSBsb2dpYy5cbiAgICogVXNlcyBGaXJzdCBGaXQgRGVjcmVhc2luZyAoRkZEKSBiaW4gcGFja2luZyB0byBlbnN1cmUgbm8gYmF0Y2ggZXhjZWVkc1xuICAgKiBtYXhCYXRjaFNpemVLQlxuICAgKlxuICAgKiBAcGFyYW0ga2V5Y2hhaW5zIC0gVGhlIHYxIGtleWNoYWlucyB0byB1cGRhdGVcbiAgICogQHBhcmFtIHYyS2V5Y2hhaW5zIC0gVGhlIHYyIGtleWNoYWlucyB0byB1cGRhdGVcbiAgICogQHBhcmFtIG1heEJhdGNoU2l6ZUtCIC0gTWF4aW11bSBwYXlsb2FkIHNpemUgcGVyIGJhdGNoIGluIGtpbG9ieXRlc1xuICAgKiBAcGFyYW0gbWF4UmV0cmllcyAtIE1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgcGVyIGJhdGNoXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NLZXljaGFpblBhc3N3b3JkVXBkYXRlc0luQmF0Y2hlcyhcbiAgICBrZXljaGFpbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgdjJLZXljaGFpbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgbWF4QmF0Y2hTaXplS0I6IG51bWJlcixcbiAgICBtYXhSZXRyaWVzOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF4QmF0Y2hTaXplQnl0ZXMgPSBtYXhCYXRjaFNpemVLQiAqIDEwMjQ7XG4gICAgY29uc3QgYmlucyA9IHRoaXMucGFja0tleWNoYWluc0ZGRChrZXljaGFpbnMsIHYyS2V5Y2hhaW5zLCBtYXhCYXRjaFNpemVCeXRlcyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdjFCYXRjaCwgdjJCYXRjaCB9ID0gYmluc1tpXTtcblxuICAgICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuICAgICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKHJldHJ5Q291bnQgPCBtYXhSZXRyaWVzICYmICFzdWNjZXNzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnB1dCh0aGlzLnVybCgnL3VzZXIva2V5Y2hhaW5zJywgMikpXG4gICAgICAgICAgICAuc2VuZCh7XG4gICAgICAgICAgICAgIGtleWNoYWluczogdjFCYXRjaCxcbiAgICAgICAgICAgICAgdjJfa2V5Y2hhaW5zOiB2MkJhdGNoLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXN1bHQoKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgZmFpbGVkIGtleWNoYWlucyBpbiB0aGUgcmVzcG9uc2VcbiAgICAgICAgICBjb25zdCBoYXNGYWlsZWQgPVxuICAgICAgICAgICAgKHJlc3BvbnNlLmZhaWxlZD8udjEgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UuZmFpbGVkLnYxKS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgKHJlc3BvbnNlLmZhaWxlZD8udjIgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UuZmFpbGVkLnYyKS5sZW5ndGggPiAwKTtcblxuICAgICAgICAgIGlmIChoYXNGYWlsZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmF0Y2ggJHtpICsgMX0gaGFkIGZhaWxlZCBrZXljaGFpbnM6ICR7SlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZmFpbGVkKX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXRyeUNvdW50Kys7XG5cbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhdGNoICR7aSArIDF9IGZhaWxlZCBhZnRlciAke21heFJldHJpZXN9IHJldHJpZXM6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|